Skip to content

[Bug] 代理进程挂掉后无恢复/无提示,Science 报 403 错误信息误导 #12

Description

@estelledc

CSSwitch 版本

v0.2.1

macOS 版本 + 芯片

macOS 27.0 (Darwin) / Apple M series (arm64)

用的是哪个 provider

DeepSeek

复现步骤

  1. 打开 CSSwitch,填 DeepSeek key,点「一键越过登录」
  2. 浏览器打开 Claude Science,确认能正常对话
  3. Kill 代理进程:kill $(lsof -t -iTCP:18991 -sTCP:LISTEN)
  4. 返回浏览器,向 Science 发一条消息
  5. 观察报错

(实际场景中代理也不是被手动 kill 的——我在配置权限 bypass 时重启了 Science daemon,代理进程连带退出,用户侧看到的就是下面这个 403)

期望结果 / 实际结果(含完整报错文字)

期望

  • 代理进程挂掉后,CSSwitch 有健康检查机制自动重启
  • 如果无法自动重启,至少给用户明确的错误提示:"代理进程已退出,请重新点击一键启动"

实际

Agent Failed
403 {"type":"error","error":{"type":"permission_error","message":"forbidden"}}

这个 permission_error forbidden 极具误导性——看起来像鉴权失败(API key 不对),实际是代理进程不在,Science 连不上本地 18991 端口。

日志(可选,强烈建议)

Science 侧(server.log):
不产生任何与代理连通性相关的日志——因为 ANTHROPIC_BASE_URL 指向 localhost:18991,连接被拒是 TCP 层面的问题,Science 侧没有区分"代理挂了"和"鉴权失败"的逻辑。

代理侧(proxy.log):
代理进程已退出,无日志输出。

诊断方法

# 1. 检查代理是否在运行
lsof -iTCP:18991 -sTCP:LISTEN
# 如果无输出 → 代理挂了

# 2. 直接 curl 测试代理
curl -s "http://127.0.0.1:18991/health"
# 如果连接被拒 → 代理挂了

# 3. 手动重启
DEEPSEEK_API_KEY="sk-xxx" \
python3 /Applications/CSSwitch.app/Contents/Resources/proxy/csswitch_proxy.py \
  --provider deepseek --port 18991 --auth-token <secret> &

影响范围

不仅手动 kill 会发生。实际遇到的情况:

  1. 用户修改 preferences.json 需要重启 Science daemon
  2. Kill daemon 时 CSSwitch app 可能连带退出代理进程
  3. 重启 daemon 后代理没跟着恢复
  4. 用户看到 403 → 以为是 API key 问题 → 反复检查 key → 浪费时间

建议修复方向

  1. 短期:代理出错时返回更明确的错误信息,如 {"type":"error","error":{"type":"proxy_unavailable","message":"Cannot reach upstream API. Is the proxy running?"}},而不是泛型 permission_error
  2. 中期:CSSwitch GUI 内嵌代理健康指示灯(绿色圆点表示代理运行中)
  3. 长期:用 macOS launchd 做代理进程守护(KeepAlive=true),挂了自动拉起

确认

  • 我已确认贴出的内容里不含 API key、令牌等任何密钥

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions