OpenOcta 1.0.7 实测:工具调用偶发 400 报错(assistant tool_calls 未配对)排查记录
OpenOcta 1.0.7 实测:工具调用偶发 400 报错(assistant tool_calls 未配对)排查记录
适用平台:CSDN / 掘金(技术版)> 状态:待发布## 背景OpenOcta(八爪鱼)是国内开源的桌面级 AI 智能体,Go 单二进制,内置 Control UI,定位是"双击即用的个人 Agent"。近期在 1.0.7 版本上实测发现一个会影响工具类任务可用性的 Bug:Agent 调用工具后偶发 400 报错,且出错后会话直接报废。本文记录完整的复现步骤与排查过程。## 环境- OpenOcta 1.0.7(Windows 11 桌面版)- 模型:deepseek-chat(OpenAI 兼容模式,https://api.deepseek.com/v1)- 配置目录:%APPDATA%\openocta\openocta.json## 现象新建会话后,让 Agent 执行需要调用工具的任务(记忆搜索、MCP 调用等),Agent 回复文本并发出 tool_call 后,下一次模型请求报:
[NodeRunError] error, status code: 400, status: 400 Bad Request, message:An assistant message with 'tool_calls' must be followed by tool messages responding to each 'tool_call_id',The following tool_call_ids did not have response messages: call_00_xxxxxxxxxxxxnode path: [node_1, ChatModel]## 复现步骤1. 打开「消息」,新建会话;2. 让 Agent 执行需要调用工具的任务(如"检查你的工具库里有没有 XX 工具",会触发 memory_search / MCP 调用);3. Agent 发出 tool_call 后报 400,对话中断。## 排查发现1. 偶发非必现:有时连续两次工具调用正常(tool_result 正常记录),第三次就出现未配对的 tool_call_id。2. 会话记录缺失:出错时,会话转录(jsonl)中新增的 tool_call 没有对应的 tool_result 条目。3. 会话报废:一旦出过一次 400,该会话之后任何新消息都会先命中同一条 400,只能开新会话恢复。4. 官方修复历史:v1.0.5、v1.0.6 的 changelog 均有相关修复(“keep sequential assistant/tool pairs when normalizing history”),但 1.0.7 上仍可复现,疑似历史规整逻辑存在未覆盖路径(如 assistant 消息混排 a2ui 内容块与 tool_call 时)。## 影响Agent 无法可靠使用任何工具(记忆搜索、MCP、技能),工具类任务随机中断。DeepSeek 对 tool_calls 消息序列要求严格(assistant 含 tool_calls 时,下一条必须是对应全部 tool_call_id 的响应消息),在该模型下问题尤为明显。## 建议1. 排查历史规整逻辑中 tool_call 与 tool_result 的配对完整性,重点覆盖「assistant 消息混排 a2ui + tool_call」场景;2. 工具执行失败/超时/进程未启动时,应写入错误 tool_result 兜底(或回滚该 tool_call),保证消息序列始终成对;3. 建议提供会话自愈机制:检测到历史中存在未配对 tool_call 时自动清理,而不是让会话永久报废。## 附:MCP 配置参考(官方文档确认的格式)json{ "mcp": { "servers": { "my-server": { "command": "node", "args": ["D:\\path\\to\\server.js"], "enabled": true } } }}—(本文为个人实测记录,版本信息以官方发布为准。如有错误欢迎指正。)
更多推荐



所有评论(0)