新建会话报 "Runtime、服务商和模型没有保存成功":env (Claude Code) 服务商的凭据校验不认订阅登录

Offen
#689 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Anfängerfreundlichkeit
52/100
Issue-Typ
Bug
Klarheit
Größtenteils klar
Aktivitätsstatus
Aktiv
Tech-Stack
electron, typescript

Rechercherichtung

Start by reading validateRuntimeRoute and the PATCH /api/chat/sessions/{id}/route handler, then trace how resolveProviderForSession determines hasCredentials for the env provider. Reproduce the reported 409 with a Claude Code subscription and no API key; done means the route can be saved for this combination without weakening credential checks for other providers.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

bug
CodePilot 版本 / Version

0.67.16/0.67.15

操作系统与架构 / OS & arch

macOS: Darwin 27.0.0

Runtime

Claude Code (SDK)

Provider / Model

claude.ai 订阅 (Pro),未配置任何 Anthropic API Key

是否可复现 / Reproducible?

每次都能复现 / always

复现步骤 / Steps to reproduce

现象

新建对话、或在对话里切换 Runtime / 服务商 / 模型时,一律弹出:
「Runtime、服务商和模型没有保存成功。请刷新聊天后重试。」
刷新无效,新会话永远停在 unbound 状态、无法发送消息。

已经绑定过的旧会话不受影响,仍能正常收发——说明 CLI 本身的鉴权是好的,
只有"保存路由"这个写入动作被挡住。

定位

  1. 报错文案对应 i18n key chat.runtime.routeChangeFailed,
    仅在 PATCH /api/chat/sessions/{id}/route 返回非 2xx 时触发。

  2. 手动复现该请求:

    curl -X PATCH http://127.0.0.1:/api/chat/sessions//route
    -H 'Content-Type: application/json'
    -d '{"runtime_id":"claude_code","provider_instance_id":"env",
    "model_id":"sonnet-5","expected_route_revision":0}'

    返回:409 {"error":"ROUTE_CREDENTIALS_UNAVAILABLE",
    "code":"ROUTE_CREDENTIALS_UNAVAILABLE"}

  3. 根因:validateRuntimeRoute 最后统一要求 resolveProviderForSession(...).hasCredentials
    为真。当 providerId === "env" 时,hasCredentials 只由这四个来源决定:

    • process.env.ANTHROPIC_API_KEY
    • process.env.ANTHROPIC_AUTH_TOKEN
    • getSetting("anthropic_auth_token")
    • hasClaudeSettingsCredentials()
      —— 只读 ~/.claude/settings.json 和 ~/.claude/claude.json 里 env.ANTHROPIC_API_KEY /
      env.ANTHROPIC_AUTH_TOKEN

    而 env 这条路径实际是 spawn 本机 claude CLI、由 CLI 自己完成鉴权。
    订阅用户的 OAuth 凭据存在 macOS Keychain(service: "Claude Code-credentials"),
    上述四个来源一个都命中不了,因此纯订阅、无 API Key 的用户必然被拒。

  4. 相关问题:GET /api/claude-auth 恒返回 {"authenticated": false},
    因为它读的是 ~/.claude/.credentials 这个已废弃路径;
    当前版本 CLI 的凭据在 Keychain 里,该文件不存在。

期望 vs 实际 / Expected vs actual

当 provider 为 env、runtime 为 claude_code 时,不应要求 API Key——
该路径下凭据由被 spawn 的 CLI 自行持有。建议二选一:

  • 对 env + claude_code 组合跳过 hasCredentials 校验;或
  • 把"CLI 已登录"也算作一种凭据来源(例如调用 claude auth status,
    或直接读 macOS Keychain / 新版凭据路径)。

临时绕法(供其他遇到的人参考)

新建 ~/.claude/claude.json:

{ "env": { "ANTHROPIC_AUTH_TOKEN": "codepilot-placeholder" } }

该文件只被 CodePilot 的 hasClaudeSettingsCredentials() 读取,Claude Code CLI 不读它
(CLI 只读 ~/.claude.json、settings.json、settings.local.json),
因此订阅登录不受影响;这个占位值也不会被注入到 claude 子进程的环境变量里
(env 分支注入的是数据库中的 anthropic_auth_token)。

日志 / 截图 / session id

No response

影响面 / Impact
  • 涉及文件写入或可能误改/丢失数据 / involves file write or possible data loss
  • 导致崩溃、闪退或对话被自动中断 / causes crash / quit / auto-interrupt
Vorherrschende Sprache
TypeScript
Sterne
6.5k
Forks
697
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Entwicklungsumgebung

  • Kein Dockerfile und keine Docker-Compose-Datei
  • Hat eine Pull-Request-Vorlage
  • Kein Beitragsleitfaden

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus op7418/CodePilot

Alle Issues in op7418/CodePilot

Ähnliche Issues

Weitere Issues zu TypeScript

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.