新建会话报 "Runtime、服务商和模型没有保存成功":env (Claude Code) 服务商的凭据校验不认订阅登录
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 52/100
- issue の種類
- バグ
- 明瞭さ
- おおむね明確
- 活発さ
- 活発
- 技術スタック
- electron, typescript
調査の方向性
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.
索引モデルが issue の本文から書いたものです。
説明
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 本身的鉴权是好的,
只有"保存路由"这个写入动作被挡住。
定位
-
报错文案对应 i18n key
chat.runtime.routeChangeFailed,
仅在PATCH /api/chat/sessions/{id}/route返回非 2xx 时触发。 -
手动复现该请求:
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"} -
根因:
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 的用户必然被拒。 -
相关问题:
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
- 主要言語
- TypeScript
- スター
- 6.5k
- フォーク
- 697
- PR マージ指標
- 30日以内にマージされた PR はありません
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドなし
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
op7418/CodePilot のほかの issue
-
发生错误时提醒Error:successオープンbug P0-crash-or-interrupt
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
-
Effort selector dropdown hidden for GLM models — blocks access to GLM-5.2 High/Max effort tiersオープン
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
-
bug P0-crash-or-interrupt
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
op7418/CodePilot の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
backnotprop/plannotator#2914 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
microsoft/vscode-containers#655 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 77/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
dsh-tauri-desk/deepseek-harness-desktop#1477 · コメント 1 件 ·