FEATURED · 精选文章

jcode 提示 Provider 没有凭据时怎么查:用 auth status 确认 OAuth token 与 API key 的真实存放位置

发布时间 / 2026/9/14 19:52:26
来源 / 创域科博编辑部
栏目 / 资讯中心
jcode 提示 Provider 没有凭据时怎么查:用 auth status 确认 OAuth token 与 API key 的真实存放位置 jcode 提示 Provider 没有凭据时怎么查用 auth status 确认 OAuth token 与 API key 的真实存放位置【免费下载链接】jcodeThe most RAM efficient harness项目地址: https://gitcode.com/GitHub_Trending/jcod/jcode当 jcode 报出某个 provider 没有可用凭据credential时先别急着重新登录。这个场景的典型表现是你 grep 了ANTHROPIC_API_KEY/sk-ant-api却什么都没找到或者读到一条写着 expired 的auth-validation.json记录于是误判为凭据不存在。而实际上凭据可能一直存在、只是存放在你搜索没覆盖到的位置。AUTH_CREDENTIAL_SOURCES.md 就是为这类误判写的排查文档它给出的核心工具是jcode auth status --json。先理解为什么会找不到凭据Anthropic/Claude 和 OpenAI 各自支持两条完全独立的凭据路径对外表现为两个不同的登录 provider概念登录 provider id凭据类型凭据实际存放位置ClaudeOAuth/订阅claudeOAuth~/.jcode/auth.json→anthropic_accounts[].accesssk-ant-oat...ClaudeAPI keyanthropic-apiAPI key环境变量ANTHROPIC_API_KEY或~/.config/jcode/anthropic.envOpenAIOAuthopenaiOAuth~/.jcode/openai-auth.jsonCodex/ChatGPT 登录OpenAIAPI keyopenai-apiAPI key环境变量OPENAI_API_KEY或~/.config/jcode/openai.env文档中列出的几个最容易被踩中的点OAuth token 不是 API key。Anthropic 的 OAuth token 前缀是sk-ant-oat01-...refresh token 为sk-ant-ort01-...而直连 API key 是sk-ant-api03-...。只 grepsk-ant-api会漏掉纯 OAuth 配置反过来也一样。API key 通常放在应用配置目录而不是环境变量里。标准存放位置是~/.config/jcode/anthropic.envXDG 路径下为$XDG_CONFIG_HOME/jcode/anthropic.env由jcode login --provider anthropic-api写入。printenv ANTHROPIC_API_KEY返回空不代表没有 key。~/.jcode/auth.json里只有 OAuth 账户从来不会存放 API key。claude和anthropic-api是两个不同的 provider可用性互不相通有 Claude 订阅登录OAuth并不意味着anthropic-api可用反之亦然。用jcode auth status --json做权威检查文档给出的检查方式不是去猜文件而是直接跑# 每个 provider 的诚实、归一化答案 jcode auth status --json该命令是jcode auth子命令之一在 src/cli/args.rs 中定义为AuthCommand::Status描述为 Show configured authentication status for model/tool providers--json用于切换 JSON 输出。每个 provider 条目会报告status当前认证状态auth_kindOAuth还是API keycredential_source凭据来源类别环境变量 / 应用配置文件 / jcode 自管文件精确的method。文档明确说这是 canonical surface优先于 grep 文件。如果你要看程序层面的实现单一事实来源是 crates/jcode-base/src/auth/mod.rs 中的AuthStatus::assessment_for_provider(descriptor)它返回一个ProviderAuthAssessment结构字段定义见 status_types.rs。排查时注意必须读取具体登录 provider id对应的那条条目——claude和anthropic-api是两条不同的记录看错条目是这类问题的常见原因。必须手动检查文件时的对应关系如果你确实需要直接看文件按凭据类型分两条路径OAuth 凭据→~/.jcode/auth.json以及外部导入来源API key→ 环境变量ANTHROPIC_API_KEY对应 OpenAI 则是OPENAI_API_KEY或~/.config/jcode/provider.env。为什么 expired 的结论可能是过时的~/.jcode/auth-validation.json缓存的是上一次运行时 auth-test 的结果属于历史记录不是当前凭据状态。一个已经自动刷新过的 OAuth token在这个文件里可能还留着几天前的 validation failed / expired 条目。为防止把陈旧记录当成当前事实format_record_labelcrates/jcode-base/src/auth/validation.rs会把超过doctor::VALIDATION_STALE_AFTER_MS7 天的记录标记为stale, ... re-validate。文档的处理原则是把 stale 记录当作 unknown, re-check永远不要当作 ground truth然后用下面命令重新验证jcode auth-test --provider id其中id替换为你要验证的登录 provider id例如claude、anthropic-api。README 中还提供了jcode auth-test --all-configured的形式用于验证所有已配置的 provider。决策树provider X 到底有没有认证综合以上文档给出的排查顺序是运行jcode auth status --json读取具体登录 provider id 的条目claude与anthropic-api不是同一个如果必须检查文件OAuth 看~/.jcode/auth.json和外部导入来源API key 看ANTHROPIC_API_KEY环境变量或~/.config/jcode/provider.env忽略auth-validation.json中超过 7 天的判定会显示为stale改跑jcode auth-test。可选分支确认默认 provider 配置如果你同时持有 OAuth 订阅和直连 API key注意~/.jcode/config.toml中的默认路由[provider] default_provider claude # Claude 订阅OAuth # default_provider anthropic-api # 直连 Anthropic API key 走 Claude default_model claude-opus-4-8 anthropic_reasoning_effort xhighdefault_provider claude走 OAuth/订阅凭据default_provider anthropic-api走直连 API key这种模式下运行时不会回退到 OAuth如果没配置 API key请求直接失败。此时要确认~/.config/jcode/anthropic.env或ANTHROPIC_API_KEY存在。完整的路由词汇表映射运行时 env、route stable-id、CLI--provider、模型前缀集中在 crates/jcode-provider-core/src/auth_mode.rs 的AuthRoute中文档提醒不要手工重新解析这些字符串应走AuthRoute。可选分支从其他 agent 工具导入凭据全新安装的 jcode 可以复用其他编码 agent 遗留的登录OAuth token 和 API key 都支持检测是 consent 受控的jcode 先列出发现的来源只在你逐条批准后才读取实现在 crates/jcode-base/src/auth/external.rs。凭据不会被拷贝进 jcode 自己的存储外部文件是原地读取的。文档列出的auth.json风格共享来源包括工具凭据文件路径磁盘形态OpenCode~/.local/share/opencode/auth.json扁平{ provider: { type: oauth, access, refresh, expires } \| { type: api, key } }pi~/.pi/agent/auth.json扁平{ provider: { type: oauth, ... } \| { type: api_key, key } }key 可以是$ENV引用OpenClaw~/.openclaw/agent/auth.json、~/.openclaw/agents/id/agent/auth-profiles.json、~/.openclaw/agents/id/agent/auth.json、~/.openclaw/credentials/oauth.json旧版扁平 pi 形态或新版{ profiles: { provider:name: ... } }存储第一个存在的路径生效mainagent 和:defaultprofile 优先Hermes~/.hermes/auth.json嵌套{ credential_pool: { provider: [ { auth_type, access_token, refresh_token, expires_at_ms } ] }, providers: {...} }几点限制pi/OpenClaw 中形如$ENV_VAR的 API key 值会对照环境变量解析以!开头的值shell 命令永远不会被执行会被跳过。Hermes 把字面 API key 存在api_key凭据池条目的access_token字段里其很多 provider 只存环境变量的名字所以除非对应 env var 已设置否则导入不到任何内容。另外还有 Claude Code、Codex、Gemini CLI、GitHub Copilot、Cursor 的工具专属导入器对应auth/claude.rs、auth/codex.rs、auth/gemini.rs、auth/copilot.rs、auth/cursor.rs。排查结果怎么落地按上面的路径走完结果只有两种jcode auth status --json中目标 provider 条目显示已认证、且credential_source指认了你找过但没搜到的那个位置——说明凭据一直存在问题出在检索方式或看错了 provider id此时无需重新登录条目确实显示无凭据——按credential_source的指向补齐OAuth 走jcode login --provider idheadless/SSH 场景可加--no-browserAPI key 则确保~/.config/jcode/provider.env或对应环境变量存在。如果显示stale先用jcode auth-test --provider id重验再决定是否处理。以上路径均出自 docs/AUTH_CREDENTIAL_SOURCES.md该文档开头也写明了适用边界当你在排查 does provider X have a credential? 时先读它而不是去 grep 密钥前缀或相信缓存判定。【免费下载链接】jcodeThe most RAM efficient harness项目地址: https://gitcode.com/GitHub_Trending/jcod/jcode创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻