Skip to content

fix: agent maxBudgetUsd/maxTurns 回退到 config.claude 而非硬编码 $5 - #239

Merged
lishuceo merged 2 commits into
mainfrom
feat/claude-session-1e5ebe
May 19, 2026
Merged

fix: agent maxBudgetUsd/maxTurns 回退到 config.claude 而非硬编码 $5#239
lishuceo merged 2 commits into
mainfrom
feat/claude-session-1e5ebe

Conversation

@lishuceo

Copy link
Copy Markdown
Owner

背景

土豆儿在 p2p 跟 pm agent 对话时遇到 Reached maximum budget ($5),但部署 env CLAUDE_MAX_BUDGET_USD=50

根因

src/agent/config-loader.ts:95-96mergeAgentConfig 中,agent 未配置 maxBudgetUsd 时回退顺序为:
input → 文件 defaults → BUILTIN_DEFAULTS (硬编码 5)

config.claude.maxBudgetUsd(即 env CLAUDE_MAX_BUDGET_USD仅在完全没有 agents.json 的 fallback 分支(第 141 行)使用,正常加载流程被忽略。

dev agent 在 config/agents.json 里显式配了 maxBudgetUsd: 50,所以没踩坑;pm 没配 → 命中硬编码 $5。maxTurns 同理。

修改

mergeAgentConfig 的最终 fallback 从 BUILTIN_DEFAULTS 改为 config.claude,让 env 真正生效。

回退顺序变为:agent 显式 → 文件 defaults → config.claude(env) → BUILTIN_DEFAULTS(最后一档实际触不到)

测试

新增 4 个回归测试覆盖:

  • 缺省时回退到 config.claude.maxBudgetUsd / maxTurns
  • 文件 defaults 优先于 config.claude
  • agent 级值优先于两者
Test Files  1 passed (1)
Tests       19 passed (19)

npm run typecheck 通过。

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

Claude finished @lishuceo's task in 1m 14s —— View job


Code Review

  • Check previous review comments and resolve fixed ones
  • Read CLAUDE.md and understand context
  • Review src/agent/config-loader.ts changes
  • Review src/agent/__tests__/config-loader.test.ts changes
  • Trace fallback logic to verify correctness
  • Post final review summary

Verdict: ✅ Approved

修复精准、改动小、回归测试覆盖到位。

分析

根因诊断准确。 src/agent/config-loader.ts:95-96 原本回退到 BUILTIN_DEFAULTS(5 / 100),导致 CLAUDE_MAX_BUDGET_USD=50 env 对没有显式配置 maxBudgetUsd 的 agent 完全无效。同模块第 141-142 行的 fallback 分支已经在用 config.claude.maxBudgetUsd / maxTurns,这次改动让两个代码路径行为一致。

类型安全。

  • AgentConfig.maxBudgetUsd: number (src/agent/types.ts:51)
  • config.claude.maxBudgetUsd = parseFloat(process.env.CLAUDE_MAX_BUDGET_USD || '50')number

类型对齐,无 undefined 风险。

回退链清晰。 新链路:agent 显式 → 文件 defaults → config.claude (env) → BUILTIN_DEFAULTS,最后一档对这两个字段实际不可达,但保留无害。

测试覆盖完备。 4 个新增 case 覆盖三层优先级 + maxBudgetUsd/maxTurns 两个字段。

备注(非阻塞)

  • 留下的 BUILTIN_DEFAULTS.maxBudgetUsd: 5maxTurns: 100 现在对 merge 路径来说是死代码(仅 BUILTIN_DEFAULTS 类型签名仍需该字段)。可考虑后续清理或加注释说明。不影响合并。
  • parseFloat/parseInt 对非法 env 值会得到 NaN — 这是 src/config.ts:78-80 的预存在问题,不在本 PR 范围。
    · Branch: feat/claude-session-1e5ebe

lishuceo and others added 2 commits May 19, 2026 23:44
未配置 maxBudgetUsd 的 agent(如 pm)原先回退到硬编码 $5,导致 CLAUDE_MAX_BUDGET_USD env
完全失效。修复后回退顺序:agent 显式 > 文件 defaults > config.claude(env)。
maxTurns 同步修复。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
覆盖:
- 缺省时回退到 config.claude.maxBudgetUsd / maxTurns
- 文件级 defaults 优先于 config.claude
- agent 级显式值优先于 defaults 和 config.claude

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@lishuceo
lishuceo force-pushed the feat/claude-session-1e5ebe branch from 62d721b to 018683b Compare May 19, 2026 15:44
@github-actions

github-actions Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

Claude finished @lishuceo's task in 1m 2s —— View job


Code Review

  • Check previous review comments and resolve fixed ones
  • Read CLAUDE.md and understand context
  • Review src/agent/config-loader.ts changes
  • Review src/agent/__tests__/config-loader.test.ts changes
  • Trace fallback logic to verify correctness
  • Post final review summary

Verdict: ✅ Approved

修复精准、改动最小、回归测试覆盖到位。同步事件下 diff 范围未变(仍是 +73/-2,2 个文件),与前一次 review 结论一致。

关键验证点

根因诊断准确。 src/agent/config-loader.ts:95-96 原本回退到 BUILTIN_DEFAULTS(5 / 100),导致 CLAUDE_MAX_BUDGET_USD=50 env 对没有显式配置 maxBudgetUsd 的 agent 完全无效。同模块第 141-142 行 fallback dev agent 分支早已使用 config.claude.maxBudgetUsd / maxTurns——本次改动让两条代码路径行为一致。

类型安全。 字段类型对齐,无 undefined 风险:

  • config.claude.maxBudgetUsd = parseFloat(process.env.CLAUDE_MAX_BUDGET_USD || '50')number (src/config.ts:80)
  • config.claude.maxTurns = parseInt(process.env.CLAUDE_MAX_TURNS || '500', 10)number (src/config.ts:78)
  • AgentConfig.maxBudgetUsd / maxTurns: number (src/agent/types.ts:51,53)

回退链清晰。 新链路:agent 显式 → 文件 defaults → config.claude (env) → BUILTIN_DEFAULTS。最后一档对这两个字段实际不可达(config.claude 永远有值),保留无害。

测试覆盖完备。 4 个新增 case 精确覆盖三层优先级 × maxBudgetUsd/maxTurns 两个字段,正负样本齐全。

备注(非阻塞)

  • BUILTIN_DEFAULTS.maxBudgetUsd: 5 / maxTurns: 100 现在对 merge 路径是死代码(仅 AgentDefaults 类型签名要求保留这两个字段为可选)。后续可清理或加注释说明。
  • parseFloat/parseInt 对非法 env 值会得到 NaN——这是 src/config.ts:78-80 的预存在问题,不在本 PR 范围。
    · Branch: feat/claude-session-1e5ebe

@lishuceo
lishuceo merged commit 9065b0e into main May 19, 2026
4 checks passed
@lishuceo
lishuceo deleted the feat/claude-session-1e5ebe branch May 19, 2026 15:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant