Skip to content

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

Description

@albisjee25

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions