A shell OPENAI_API_KEY overrides the profile key; its 401s retry as 5xx
维护者通常 1 天内回复
还没有人认领这个 Issue。
评估
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 新手友好度
- 68/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 活跃
- 技术栈
- go
- 领域
- api, authentication, cli
调研方向
Start with internal/config/apikey.go at the cited key-selection lines, then inspect internal/seniordev/app/solo.go:405-425 for retry classification. Reproduce the isolated-profile flow with codeaf doctor and senior-dev --json using the listed dev build. Done means the saved OpenRouter key is selected or an override warning is shown, and a 401 stops immediately without retries.
由索引模型根据 Issue 内容生成。
描述
Seen on: dev 837b2b0.
Behaviour
With OPENAI_API_KEY set in the shell, a headless senior-dev run used it over the profile's saved OpenRouter key (codeaf doctor: key set · OPENAI_API_KEY). Every call failed API error (401): Missing Authentication header and was retried as provider-5xx. Two problems: a key for another service silently wins over the profile's own key, and an auth failure is retried as a server error instead of stopping with a plain line.
Replication
- Build dev 837b2b0 (
git checkout 837b2b0 && make build, binarybin/codeaf), or install the dev build withcurl -fsSL https://agentfield.ai/get/devaf | bash. - Use an isolated profile:
export HOME=$(mktemp -d), exportOPENROUTER_API_KEY, and keep the default model (~deepseek/deepseek-v4-flash-latest, crew on auto). - On a busy machine set
task.max_loadto0(/settings, Tasks) so the busy-machine gate does not hold tasks. - Save an OpenRouter key in the profile (first-run setup), then
unset OPENROUTER_API_KEY; export OPENAI_API_KEY=sk-not-for-openrouter. codeaf doctor(see which key is used), thencodeaf senior-dev --json "add a README.md with one line"in a small git repo.
Evidence
codeaf doctor:key set · OPENAI_API_KEY; calls failAPI error (401): Missing Authentication header, retry classprovider-5xx(quoted from the screen).internal/config/apikey.go:53and:61:firstNonEmpty(os.Getenv(APIKeyEnv), os.Getenv("OPENAI_API_KEY"), persistedAPIKey…)puts the shell's OPENAI key before the saved key.internal/seniordev/app/solo.go:405-425: the retry classifier; the 401 reached theprovider-5xxclass, probably through a path where the status code was not set.
Guessed cause
A guess from reading the code, not a confirmed diagnosis. The key order prefers any OPENAI_API_KEY in the environment over the profile's key, and the retry classifier does not treat a 401 without a parsed status as permanent.
Acceptance
- e2e: with the setup above, the run uses the saved OpenRouter key (or
codeaf doctorwarns that a shell key overrides it), and a 401 ends the run at once with a key message, no retries.
Found while writing the public docs; manual text differences are in #1545.
🤖 Generated with Claude Code
- 主要语言
- Go
- 星标
- 115
- 派生
- 14
- 平均合并
- 9 小时 35 分钟
- 30 天内合并 PR
- 752
环境准备
我们还没有检查这个项目的环境配置文件。先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
Agent-Field/CodeAF 的其他 Issue
-
area:chat bug sev:papercut
难度 2/5 1-3 小时 新手友好度 86/100
Agent-Field/CodeAF#1592 ·
维护者通常 1 天内回复
-
area:headless bug sev:critical
难度 2/5 1-3 小时 新手友好度 88/100
Agent-Field/CodeAF#1566 ·
维护者通常 1 天内回复
-
area:chat bug sev:critical
难度 2/5 1-3 小时 新手友好度 82/100
Agent-Field/CodeAF#1548 · 1 条评论 ·
维护者通常 1 天内回复
-
area:chat feature
难度 2/5 1-3 小时 新手友好度 88/100
Agent-Field/CodeAF#1510 ·
维护者通常 1 天内回复
-
area:tests bug
难度 2/5 1-3 小时 新手友好度 82/100
Agent-Field/CodeAF#1489 ·
维护者通常 1 天内回复
查看 Agent-Field/CodeAF 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 78/100
-
难度 1/5 1 小时以内 新手友好度 65/100
521xueweihan/HelloGitHub#3789 ·
-
难度 2/5 1-3 小时 新手友好度 88/100
维护者通常 12 天内回复
-
stage-fail
难度 2/5 1-3 小时 新手友好度 78/100
siyuan-note/bazaar#2282 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 78/100
openshift/kube-compare#307 ·
维护者通常 1 天内回复