背景
排查聊天里的 thinking(思考过程)消息块链路时,确认了链路是端到端打通的(ACP agent_thought_chunk → 1acp bridge text_delta type:thought → 后端无损透传 → 前端 foldTextDelta 折叠成思考气泡)。
但进一步查「默认是否开启思考模式」的结论是:没有任何一层显式开或关,完全 fall-through 到 Claude Code SDK / 所选模型的原生默认。
现状(默认 = 既不强制开、也不强制关)
1. maxThinkingTokens(思考 token 上限)—— 从未设置
- claude-agent-acp 只从环境变量
MAX_THINKING_TOKENS 读取;没设就是 undefined,且 undefined 时根本不传给 SDK。
- 全仓库(app / backend / 1acp)grep
MAX_THINKING_TOKENS:一处都没有。
2. effort(思考力度 config option)—— 默认 "default" → 映射成 null(不覆盖)
- effort 选项仅对
supportsEffort 的模型出现,出现时默认 currentValue = "default"。
toSdkEffortLevel("default") 返回 null,即不对 SDK 做任何 effort 覆盖。
3. 上游两层都不插手
- 后端建会话时
sessionOptions 只带 systemPrompt + mcpServers(modules/1acp/bridge-server.js:562),无 thinking/effort。
- 1acp 不注入默认,只在收到名为
thinking 的 config 时翻译成 effort(src/runtime/engine/manager.ts:443),但没人主动发这个 config。
结论:能否看到思考内容,取决于底层模型在 "default" 力度下自身是否产出;我们这侧没做任何拔高,也没做任何抑制。
待决策
回头评估是否要强制开启/统一配置思考模式。如果要,有两个入口:
- env 注入:后端 spawn acpx 子进程时注入
MAX_THINKING_TOKENS(给思考一个 token 预算)。
- config option:前端/后端发一个
effort(或 thinking,1acp 会自动转 effort)的 set,把力度从 default 调到具体档位;同时可考虑在前端把 effort 档位暴露给用户(SessionModePicker)。
需要考虑的点:是否只对支持推理的模型生效、是否让用户可切换、默认档位定多少、思考块默认展开还是折叠。
参考代码位置
- 链路转发(无损透传,不过滤 thought 给浏览器):
backend/internal/agent/acpx_client.go:436
- thought 仅从工单时间线写回中排除(这是对的,别误改):
backend/internal/agent/acpx_client.go:440、backend/internal/agent/runner.go:166
- 前端折叠思考块:
frontend/packages/core/protocol/reducer.ts:150
- thinking 上限 env 读取(adapter):
@agentclientprotocol/claude-agent-acp@0.37.0 dist/acp-agent.js:1467
- effort 默认值 / 映射:同上
:1894 / :1844
背景
排查聊天里的 thinking(思考过程)消息块链路时,确认了链路是端到端打通的(ACP
agent_thought_chunk→ 1acp bridgetext_delta type:thought→ 后端无损透传 → 前端foldTextDelta折叠成思考气泡)。但进一步查「默认是否开启思考模式」的结论是:没有任何一层显式开或关,完全 fall-through 到 Claude Code SDK / 所选模型的原生默认。
现状(默认 = 既不强制开、也不强制关)
1.
maxThinkingTokens(思考 token 上限)—— 从未设置MAX_THINKING_TOKENS读取;没设就是undefined,且undefined时根本不传给 SDK。MAX_THINKING_TOKENS:一处都没有。2.
effort(思考力度 config option)—— 默认"default"→ 映射成null(不覆盖)supportsEffort的模型出现,出现时默认currentValue = "default"。toSdkEffortLevel("default")返回null,即不对 SDK 做任何 effort 覆盖。3. 上游两层都不插手
sessionOptions只带systemPrompt+mcpServers(modules/1acp/bridge-server.js:562),无 thinking/effort。thinking的 config 时翻译成effort(src/runtime/engine/manager.ts:443),但没人主动发这个 config。结论:能否看到思考内容,取决于底层模型在 "default" 力度下自身是否产出;我们这侧没做任何拔高,也没做任何抑制。
待决策
回头评估是否要强制开启/统一配置思考模式。如果要,有两个入口:
MAX_THINKING_TOKENS(给思考一个 token 预算)。effort(或thinking,1acp 会自动转effort)的 set,把力度从default调到具体档位;同时可考虑在前端把 effort 档位暴露给用户(SessionModePicker)。需要考虑的点:是否只对支持推理的模型生效、是否让用户可切换、默认档位定多少、思考块默认展开还是折叠。
参考代码位置
backend/internal/agent/acpx_client.go:436backend/internal/agent/acpx_client.go:440、backend/internal/agent/runner.go:166frontend/packages/core/protocol/reducer.ts:150@agentclientprotocol/claude-agent-acp@0.37.0dist/acp-agent.js:1467:1894/:1844