1. Agent 思维链落地时,配置文件到底在配什么
如果你最近在本地跑 Claude Code、Gemini CLI 或者 Deepseek 的 Agent 工具链,大概率会遇到一个很具体的困惑:模型明明支持思维链,但接进自己的工具后,多轮工具调用越跑越飘,第三步就开始忘记第一步为什么调那个工具。这不是模型不行,而是思维链内容没有在 Agent loop 里正确传递。
Agent 的思维链,说白了就是模型在每次决定调用哪个工具之前,先输出一段“我为什么调它、下一步打算干什么”的推理内容。Chatbot 场景下这段内容用完就丢,因为单轮对话不需要它。但 Agent 不一样,一个复杂任务可能要走十几轮工具调用,如果每轮都把上一轮的思考丢掉,模型每次都要从零重新推理,偏移几乎必然发生。Claude 把这个机制叫 Interleaved Thinking,Gemini 叫 Thought Signature,Deepseek 在工具调用场景下写的是 Thinking in Tool-Use,名字不同,本质是同一件事:把思考内容带回上下文,并且用签名或加密字段防止被篡改。
这篇要解决的就是落地问题。我会用 Claude、Gemini、Deepseek 三个对象,分别给出 settings.json 和 config.toml 的骨架写法,再接入 TaoToken 的统一 Key 通道,让你不用分别管理三家平台的密钥。配置文件可以直接复制,每一步都有对应的验证动作,跑完你能确认思维链参数是真的生效了,而不是写了个摆设。
适合谁看:已经在用本地 Agent 工具链、需要多模型切换、被思维链传递问题卡过的开发者。如果你还没配过任何 Agent 工具,跟着走也能跑通,但建议先把基础的工具调用流程跑一遍再回来调思维链参数。
2. 前置准备:TaoToken 统一 Key 与 API 通道
在写配置文件之前,先把通道打通。三家模型的思维链字段格式不一样,如果每个都单独申请 Key、单独配 base_url,配置文件会变得很难维护。用 TaoToken 做统一入口的好处是:一个 Key 走所有模型,base_url 只写一次,切换模型只改 model 字段。
先拿 Key。打开 https://taotoken.net/api-keys ,登录后创建一个 API Key,复制出来。这个 Key 后面会同时用在 Claude、Gemini、Deepseek 三个配置里。
然后确认 API 地址。TaoToken 的 API 端点是 https://taotoken.net/api ,注意这里不加任何查询参数,直接作为 base_url 使用。如果你用的是 OpenAI 兼容格式的客户端,base_url 填这个;如果是 Anthropic 原生格式,路径会略有不同,下面配置文件里会分别标注。
注意:API Key 不要写进会提交到 Git 的配置文件里。建议用环境变量注入,下面所有配置示例都假设你已经设置了
TAOTOKEN_API_KEY这个环境变量。设置方式:Linux/macOS 下export TAOTOKEN_API_KEY="你的key",Windows PowerShell 下$env:TAOTOKEN_API_KEY="你的key"。
验证 Key 是否可用,先用一条最简单的 curl 请求探一下:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-chat", "messages": [{"role": "user", "content": "回复 ok"}] }'返回里有choices字段且内容正常,说明通道没问题。如果返回 401,检查 Key 是否复制完整;返回 404,检查 base_url 是不是多写了斜杠或路径。
3. settings.json 骨架:Claude 与 Gemini 的思维链配置
Claude Code 和 Gemini CLI 都用 JSON 格式的配置文件,但字段结构差别不小。先看 Claude。
3.1 Claude settings.json 完整骨架
Claude 的思维链在工具调用场景下是强制带签名的,配置里最关键的是开启 extended thinking 并设置 budget。骨架如下:
{ "model": "claude-sonnet-4-20250514", "apiKey": "${TAOTOKEN_API_KEY}", "baseURL": "https://taotoken.net/api", "thinking": { "type": "enabled", "budget_tokens": 8000 }, "tools": [ { "name": "read_file", "description": "读取本地文件内容", "input_schema": { "type": "object", "properties": { "path": { "type": "string" } }, "required": ["path"] } } ], "max_tokens": 16000, "temperature": 1 }逐项说明。thinking.type设为enabled才会输出思考内容,budget_tokens是思考预算,8000 是个保守值,复杂任务可以拉到 16000 甚至更高,但注意budget_tokens必须小于max_tokens。temperature在开启 thinking 时建议保持 1,Claude 官方文档明确说过 thinking 模式下改 temperature 会影响推理质量。
baseURL指向 TaoToken 的 API 地址,这样 Claude 的请求会走统一通道。如果你用的是 Anthropic 原生 SDK,base_url 同样填https://taotoken.net/api,SDK 会自动拼接/v1/messages路径。
3.2 Gemini settings.json 骨架
Gemini 的思维链字段叫 thought_signature,配置结构和 Claude 不同,它是在 generationConfig 里控制:
{ "model": "gemini-2.5-pro", "apiKey": "${TAOTOKEN_API_KEY}", "baseURL": "https://taotoken.net/api", "generationConfig": { "thinkingConfig": { "includeThoughts": true, "thinkingBudget": 8192 }, "maxOutputTokens": 16384, "temperature": 1 }, "tools": [ { "functionDeclarations": [ { "name": "read_file", "description": "读取本地文件内容", "parameters": { "type": "object", "properties": { "path": { "type": "string" } }, "required": ["path"] } } ] } ] }includeThoughts设为 true 后,Gemini 会在响应里返回 thought_signature 字段,这是一串加密数据,不是明文思考内容。你不需要解析它,只需要在下一轮请求时原样带回即可。thinkingBudget控制思考 token 上限,Gemini 2.5 Pro 支持到 32768,但实际用 8192 起步就够。
注意:Gemini 的 thought_signature 必须原样回传,任何修改都会导致签名校验失败,模型会拒绝继续推理。这也是为什么工程上手动拼接思考内容不可靠的原因之一。
4. config.toml 骨架:Deepseek 的思维链配置
Deepseek 在工具调用场景下用的是 TOML 格式配置,字段命名和 JSON 系不太一样。骨架如下:
[model] name = "deepseek-reasoner" api_key = "${TAOTOKEN_API_KEY}" base_url = "https://taotoken.net/api" [thinking] enabled = true budget_tokens = 8192 carry_over = true [generation] max_tokens = 16384 temperature = 1.0 [[tools]] name = "read_file" description = "读取本地文件内容" [tools.parameters] type = "object" [tools.parameters.properties.path] type = "string" [tools.parameters.required] paths = ["path"]关键字段是thinking.carry_over,设为 true 后,Deepseek 会把上一轮的思考内容带入下一轮上下文。Deepseek 目前没有像 Claude 和 Gemini 那样加签名校验,所以思考内容是明文传递的,这也意味着你可以手动检查上下文里思考内容是否正确保留。
model.name填deepseek-reasoner走推理模型,如果你用的是deepseek-chat,thinking 字段可能不生效,因为 chat 模型默认不输出思考内容。
5. 验证请求:确认思维链参数真的生效
配置文件写完不代表生效,必须发一条实际请求验证。下面分三家给出验证方法。
5.1 Claude 验证
发一条带工具调用的请求,观察响应里是否有thinking字段:
curl https://taotoken.net/api/v1/messages \ -H "x-api-key: $TAOTOKEN_API_KEY" \ -H "anthropic-version: 2023-06-01" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "max_tokens": 16000, "thinking": {"type": "enabled", "budget_tokens": 8000}, "messages": [{"role": "user", "content": "读取 /tmp/test.txt 的内容"}], "tools": [{"name": "read_file", "description": "读取文件", "input_schema": {"type": "object", "properties": {"path": {"type": "string"}}, "required": ["path"]}}] }'成功的话,响应 content 数组里会先出现一个type: "thinking"的块,里面是思考文本,然后才是type: "tool_use"的块。如果只有 tool_use 没有 thinking,说明 budget_tokens 没生效或者模型不支持。
5.2 Gemini 验证
Gemini 的验证看响应里有没有thought_signature:
curl https://taotoken.net/api/v1beta/models/gemini-2.5-pro:generateContent \ -H "x-goog-api-key: $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "contents": [{"role": "user", "parts": [{"text": "读取 /tmp/test.txt"}]}], "generationConfig": {"thinkingConfig": {"includeThoughts": true, "thinkingBudget": 8192}}, "tools": [{"functionDeclarations": [{"name": "read_file", "description": "读取文件", "parameters": {"type": "object", "properties": {"path": {"type": "string"}}, "required": ["path"]}}]}] }'响应里 functionCall 部分会带一个thought_signature字段,是一长串 base64 字符串。拿到它之后,下一轮请求必须把这个字段原样放回去,否则会报签名错误。
5.3 Deepseek 验证
Deepseek 的验证最直接,看响应里有没有reasoning_content字段:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-reasoner", "messages": [{"role": "user", "content": "读取 /tmp/test.txt"}], "tools": [{"type": "function", "function": {"name": "read_file", "description": "读取文件", "parameters": {"type": "object", "properties": {"path": {"type": "string"}}, "required": ["path"]}}}] }'返回的 message 里如果有reasoning_content,说明思考内容在输出。然后发第二轮请求时,把上一轮的reasoning_content和 tool_calls 一起放进 messages,观察模型是否能正确接续推理。
6. 本篇常见错排查
配思维链最容易踩的坑集中在几个地方,我按出现频率排一下。
第一个是budget_tokens大于max_tokens。Claude 会直接报 400 错误,提示 budget 不能超过 max。解决方法是把 max_tokens 设成 budget 的两倍左右,留出正文输出的空间。
第二个是 Gemini 的 thought_signature 丢失。如果你在代码里手动构造下一轮请求,很容易忘记把上一轮的 signature 带回去。表现是模型返回 400 或者直接不输出 functionCall。检查方法:打印上一轮响应的完整 JSON,确认 signature 字段存在,然后在下一轮请求的对应位置原样放入。
第三个是 Deepseek 用了 chat 模型却配了 thinking。deepseek-chat不支持 reasoning_content,配了也不输出。换成deepseek-reasoner即可。
第四个是 base_url 写错。TaoToken 的 API 地址是https://taotoken.net/api,不要在后面加/v1,SDK 会自己拼。如果你手动 curl,路径要写全,比如/api/v1/chat/completions。多写或少写斜杠都会 404。
第五个是环境变量没生效。配置文件里写${TAOTOKEN_API_KEY}的,要确认运行环境里这个变量真的存在。用echo $TAOTOKEN_API_KEY检查一下,输出为空就是没设上。
如果排查完还是不通,直接去看接入文档 https://taotoken.net/doc ,里面有各语言 SDK 的完整示例。Key 的问题去 https://taotoken.net/api-keys 重新生成一个试试。想先验证模型本身能不能跑通思维链,可以用模型对话页面 https://taotoken.net/chat 发一条带工具调用的消息,看返回结构对不对。
7. 长期跑 Agent 任务,配置怎么管
单次验证通过之后,真正麻烦的是长期跑。Agent 任务动辄几十轮工具调用,思维链内容会持续累积,上下文很快膨胀。几个实操建议。
Claude 的 thinking budget 不要一上来就拉满。8000 起步,观察任务复杂度再调。budget 越大,单轮延迟越高,token 消耗也越猛。如果你的任务大部分在 5 轮以内完成,8000 足够;超过 20 轮的复杂规划任务,可以到 16000。
Gemini 的 thought_signature 是加密数据,体积比明文思考内容小,但也不能无限累积。建议在 Agent loop 里设置一个上下文窗口上限,超过之后丢弃最早的几轮 signature,只保留最近的。丢弃时注意不要破坏 tool_call 和 signature 的配对关系,否则签名校验会失败。
Deepseek 的 reasoning_content 是明文,累积起来很快。如果你发现上下文里思考内容占比超过 60%,就该考虑压缩了。一个做法是只保留最近 5 轮的完整思考内容,更早的只保留工具调用结果。
多模型切换的场景,建议把三家的配置拆成独立文件,用环境变量控制加载哪个。比如AGENT_PROVIDER=claude时加载settings.claude.json,AGENT_PROVIDER=deepseek时加载config.deepseek.toml。这样切换模型不用改代码,只改一个环境变量。
如果你需要长期跑编码类 Agent 任务,Coding Plan 页面 https://taotoken.net/coding-plan 里有针对性的额度方案,比按量计费更适合高频调用场景。配置骨架和验证方法就是上面这些,跑通之后思维链的稳定性会有明显提升,尤其是多轮工具调用任务,偏移问题基本能压住。