1. 为什么我要用 Responses API 重新搭一遍 Agent 调用链
deepseek-v4-flash 正式版上线后,我第一时间把它接进了自己的 Agent 工作流。原因很简单:这个模型在 Agent 场景下的表现,和它的参数规模完全不成正比。13B 激活参数,却在长程软件工程、终端操作、工具调用这些任务上跑出了接近旗舰模型的成绩。但评测数据是一回事,能不能稳定跑在自己的调用链里是另一回事。
Responses API 是这次接入的关键入口。它和传统的 Chat Completions 接口最大的区别在于:原生支持工具调用、流式事件、多轮状态管理,这些恰好是 Agent 场景最需要的。你不需要再自己拼 function call 的 JSON,也不需要手动维护对话历史的状态机。Responses API 把这些都收敛到了统一的请求结构里。
这篇文章要解决的问题很具体:给你一套可复现的最小调用链,包含 config.toml 和 settings.json 的骨架、统一 Key 接入的配置片段,以及三步验证动作。跑完这三步,你就能判断 deepseek-v4-flash 是否适合你自己的 Agent 工作流。适合谁?做自动化流水线、编码 Agent、终端运维 Agent 的开发者。如果你只是想找个聊天模型,这篇可以直接跳过。
2. 前置准备:统一 Key 接入与模型入口
在开始写配置之前,先把接入层理清楚。我用的方式是统一 Key 管理,所有模型请求走同一个入口,这样切换模型时不需要改代码,只改配置。
TaoToken 的 API 入口是https://taotoken.net/api,这个地址不加任何 UTM 参数,直接作为 base_url 使用。你需要先在控制台创建一个 API Key,然后把它写进环境变量或配置文件里。
创建 Key 的路径在控制台的 API Keys 页面,生成后复制保存,后面配置里会用到。模型对话的调试入口可以用来先验证 Key 是否可用,地址是https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=model_chat。
如果你打算长期跑编码 Agent,建议同时看一下 Coding Plan 的说明,地址是https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding_plan。接入文档在https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc,配置过程中遇到字段不明确的地方可以对照查。
这里要强调一点:Responses API 的请求格式和 Chat Completions 不同,base_url 后面要接/v1/responses这个路径。很多人第一次接入时直接把 Chat Completions 的配置搬过来,结果报 404,问题就出在路径上。
3. 可复制配置:config.toml 与 settings.json 骨架
先给 config.toml 的骨架。这个文件我用来管理模型参数和请求行为,放在项目根目录下。
[api] base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" timeout_seconds = 120 max_retries = 3 [model] name = "deepseek-v4-flash" temperature = 1.0 top_p = 0.95 max_output_tokens = 8192 stream = true [agent] tool_call_mode = "auto" max_tool_rounds = 8 parallel_tool_calls = true [logging] level = "info" log_request_body = false log_response_body = true几个参数需要解释。temperature和top_p我按官方评测用的档位设置,这样跑出来的行为和 benchmark 环境更接近。max_tool_rounds控制工具调用的最大轮数,Agent 场景下建议设 8 以上,否则长程任务容易中途断掉。parallel_tool_calls打开后,模型可以在一轮里发起多个工具调用,对多工具编排的场景能明显减少往返次数。
然后是 settings.json,这个文件我用来管理工具定义和运行时行为。
{ "tools": [ { "type": "function", "name": "read_file", "description": "读取指定路径的文件内容", "parameters": { "type": "object", "properties": { "path": { "type": "string", "description": "文件绝对路径" } }, "required": ["path"] } }, { "type": "function", "name": "run_command", "description": "在终端执行一条命令并返回输出", "parameters": { "type": "object", "properties": { "command": { "type": "string", "description": "要执行的命令" }, "timeout": { "type": "integer", "default": 30 } }, "required": ["command"] } } ], "response_format": { "type": "text" }, "store": true }store设为 true 时,Responses API 会保留这次请求的状态,后续可以用 response_id 继续对话,不用把完整历史重新传一遍。这对多轮 Agent 任务很关键,能省掉大量重复 token。
环境变量这样设置:
export TAOTOKEN_API_KEY="你的Key" export OPENAI_BASE_URL="https://taotoken.net/api" export OPENAI_MODEL="deepseek-v4-flash"如果你用的是 Codex CLI 或类似的工具,把 base_url 指向https://taotoken.net/api,模型名填deepseek-v4-flash,就能直接跑。Codex 相关的接入说明在https://taotoken.net/claude-code?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=claude_code有更细的配置示例。
4. 三步验证:流式请求、工具调用、返回结构核对
配置写完后,不要急着上生产,先跑这三步验证。每一步都有明确的成功标准,跑通了再往下走。
4.1 第一步:发一条流式请求
用 curl 发一条最简单的流式请求,确认 Key 和路径都对。
curl -N https://taotoken.net/api/v1/responses \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-v4-flash", "input": "用一句话说明什么是 Responses API", "stream": true }'成功的话你会看到一串 SSE 事件,格式类似:
event: response.created data: {"type":"response.created","response":{"id":"resp_xxx","status":"in_progress"}} event: response.output_text.delta data: {"type":"response.output_text.delta","delta":"Responses"} event: response.output_text.delta data: {"type":"response.output_text.delta","delta":" API 是"} event: response.completed data: {"type":"response.completed","response":{"id":"resp_xxx","status":"completed"}}关键看两个事件:response.created表示请求被接受,response.completed表示生成结束。如果卡在 created 不动,多半是网络或 Key 的问题;如果直接返回 404,检查路径是不是漏了/v1/responses。
4.2 第二步:跑一次工具调用
这一步验证模型能不能正确发起工具调用。把 settings.json 里的工具定义带上,发一条需要调用工具的请求。
curl https://taotoken.net/api/v1/responses \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-v4-flash", "input": "读取 /tmp/test.txt 的内容", "tools": [ { "type": "function", "name": "read_file", "description": "读取指定路径的文件内容", "parameters": { "type": "object", "properties": { "path": {"type": "string"} }, "required": ["path"] } } ], "tool_choice": "auto" }'成功的返回里会包含一个function_call类型的输出项:
{ "output": [ { "type": "function_call", "name": "read_file", "arguments": "{\"path\":\"/tmp/test.txt\"}", "call_id": "call_xxx" } ] }拿到 call_id 后,你需要把工具执行结果回传,格式是:
{ "model": "deepseek-v4-flash", "input": [ { "type": "function_call_output", "call_id": "call_xxx", "output": "文件内容..." } ] }如果模型没有发起工具调用,而是直接编了一段回答,说明tool_choice或工具描述有问题。把 description 写得更明确,或者把tool_choice设成required强制调用。
4.3 第三步:核对返回结构
这一步最容易被忽略,但很重要。Responses API 的返回结构和 Chat Completions 完全不同,你需要确认几个字段。
| 字段 | 含义 | 检查点 |
|---|---|---|
id | 响应 ID | 以resp_开头,用于后续续接 |
status | 状态 | 应为completed |
output | 输出数组 | 包含 message 或 function_call |
usage.input_tokens | 输入 token 数 | 用于成本核算 |
usage.output_tokens | 输出 token 数 | 用于成本核算 |
usage.total_tokens | 总 token 数 | 核对是否与输入输出一致 |
特别要注意output数组的结构。文本回复是{"type":"message","content":[{"type":"output_text","text":"..."}]},工具调用是{"type":"function_call",...}。解析时不要假设 output[0] 一定是文本,Agent 场景下经常第一个就是 function_call。
5. 本篇常见错排查
接入过程中我踩过几个坑,列出来帮你省时间。
报 404 Not Found。九成是路径问题。base_url 填https://taotoken.net/api,请求路径要补/v1/responses。如果你用的是 SDK,确认 SDK 版本支持 Responses API,老版本可能还在拼/v1/chat/completions。
报 401 Unauthorized。检查 Authorization 头是不是Bearer开头,Key 有没有多余空格。环境变量没生效也会导致这个错,用echo $TAOTOKEN_API_KEY确认一下。
流式请求没有输出。检查stream参数是不是 true,以及客户端有没有正确处理 SSE。用 curl 加-N参数关闭缓冲,否则可能一直等到请求结束才看到内容。
工具调用返回空 arguments。通常是工具定义的 parameters schema 写错了。required字段里的属性名必须和properties里的一致,类型也要对。建议先用最简单的单参数工具测试,跑通再加复杂度。
多轮对话时上下文丢失。Responses API 用previous_response_id续接,不是把历史消息重新传。如果你手动拼历史,注意 input 数组里不要重复包含已经处理过的 function_call_output。
token 消耗比预期高。检查store是不是设成了 true,以及有没有复用 response_id。每次重新传完整历史会显著增加 input token。另外max_output_tokens设太大也会让模型生成更长的内容。
6. 下一步:把调用链接进你的工作流
三步验证跑通后,你手里就有了一条可复现的 Agent 调用链。接下来可以做的事:把工具集扩展到你自己的业务函数,把max_tool_rounds调大跑长程任务,或者把 response_id 存下来做多轮状态管理。
如果你要长期跑编码 Agent,建议看一下 Coding Plan 的额度方案,地址是https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding_plan。需要管理多个 Key 或查看用量,控制台在https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=console。API Keys 的创建和管理页面是https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=api_keys。
我自己的做法是先把 read_file 和 run_command 两个工具跑稳,确认模型在真实文件系统和终端里的行为符合预期,再往上加更复杂的工具。deepseek-v4-flash 在工具调用上的表现比我预期的稳,多轮编排很少出现参数格式错误,这一点在 13B 激活参数的模型里确实少见。你可以先按上面的三步跑一遍,看看它在你自己场景下的实际表现。