提交前确认 / Pre-submission checklist
类别 / Framework / Severity / Frequency
工具调用 / MCP;ZCode Agent;阻塞当前任务;真实任务中观察到一次,模型输出具有随机性。
问题描述
在 OpenAI-compatible 本地模型返回结构化 invalid_tool_call SSE 错误时,ZCode 日志保留了具体原因,但工具卡片最后显示 Tool call ended without a terminal event.,用户容易把它判断为工具执行器或传输故障。任务没有进行纠错型恢复。
本例的上游原因是模型调用了未提供的 WebSearch。这份报告不要求 ZCode 接受不存在的工具,也不把模型生成错误归因于 ZCode;希望改善根因呈现和仅限未执行调用的受控恢复。
环境
- Windows 11 x64;官方 ZCode Desktop 3.14.4(文件版本 3.14.4.7912),不是自行打包版本。
- ZCode Agent;自定义 OpenAI Chat Completions provider。
- 本地 gfx1151-engine / Qwen3.8-Flash-Next,256K context,medium reasoning,max_tokens=32768。
- 合法的流式文本、工具调用和思考参数测试可成功;此次失败发生在实际研究任务中。
复现步骤
- 配置支持标准 OpenAI-compatible 流和工具调用的本地模型。
- 工具列表不提供
WebSearch,但包含 TodoWrite 和 WebFetch;模型原生联网搜索能力为 false。
- 提交需要资料研究及文档输出的任务。当模型先输出工具输入片段,随后生成未注册的
WebSearch 时,后端拒绝该输出。
- 对照真实上游错误、ZCode 日志和 UI 工具卡片。
为稳定覆盖此条件,可使用 fixture 后端:先发送正常 reasoning/text 和 tool_calls 输入片段,再发送下面的 SSE error payload。此 fixture 是建议的回归方法;本报告中的发生时间和计数来自真实会话,未声称模型每次都会复现。
{"error":{"message":"Unknown tool function: \"WebSearch\"","type":"model_output_error","param":null,"code":"invalid_tool_call"}}
实际结果 / 脱敏证据
2026-10-04 的同一次请求:
request.tools: 53 functions; includes TodoWrite / WebFetch; excludes WebSearch
model.sdk.stream.failed:
durationMs=98542
lastChunkType=tool-input-delta
tool-input-start=1; tool-input-delta=2
toolCallCount=0; retryable=false
statusMessage=Unknown tool function: "WebSearch"
turn.failed cause.context:
exceptionKind=provider_business
providerCode=invalid_tool_call
responseBodySummary.error.type=model_output_error
responseStatus=200; transport=sse
turn_usage:
model_request_count=1; model_retry_count=0
tool_call_count=0; tool_error_count=0
UI:
fault.runtime.toolLifecycleIncomplete
Tool call ended without a terminal event.
HTTP 200 是已建立的 SSE 响应状态;错误在流内返回,并非推理或工具执行成功。
会话的 tool_usage 没有执行记录,不能将流式输入预览解释成 TodoWrite 已执行。
期望表现
- 工具卡片/回合错误保留可操作的真实原因:模型请求了未注册的 WebSearch,相关调用尚未执行。通用 lifecycle 消息不能覆盖已知 provider 诊断。
- 可考虑对明确的
invalid_tool_call / model_output_error 增加有限纠错(例如最多两次):反馈错误和当前合法工具集合,让模型重新生成;区别于原样网络重试。
- 只有确认尚无工具实际执行/提交结果时才能重新生成;若执行状态不明,不自动重放。取消、权限拒绝、网络中断和其他 provider 错误不应统一视为这类可纠错错误。
- 保持服务端工具名和参数校验。不能通过开启并不存在的 native WebSearch 能力或忽略 schema 来规避。
定位线索
未上传真实任务内容、完整日志、截图、个人路径或凭据。我们会在本地验证局部修复,再补充验证结论。
提交前确认 / Pre-submission checklist
类别 / Framework / Severity / Frequency
工具调用 / MCP;ZCode Agent;阻塞当前任务;真实任务中观察到一次,模型输出具有随机性。
问题描述
在 OpenAI-compatible 本地模型返回结构化
invalid_tool_callSSE 错误时,ZCode 日志保留了具体原因,但工具卡片最后显示Tool call ended without a terminal event.,用户容易把它判断为工具执行器或传输故障。任务没有进行纠错型恢复。本例的上游原因是模型调用了未提供的
WebSearch。这份报告不要求 ZCode 接受不存在的工具,也不把模型生成错误归因于 ZCode;希望改善根因呈现和仅限未执行调用的受控恢复。环境
复现步骤
WebSearch,但包含TodoWrite和WebFetch;模型原生联网搜索能力为 false。WebSearch时,后端拒绝该输出。为稳定覆盖此条件,可使用 fixture 后端:先发送正常 reasoning/text 和
tool_calls输入片段,再发送下面的 SSE error payload。此 fixture 是建议的回归方法;本报告中的发生时间和计数来自真实会话,未声称模型每次都会复现。{"error":{"message":"Unknown tool function: \"WebSearch\"","type":"model_output_error","param":null,"code":"invalid_tool_call"}}实际结果 / 脱敏证据
2026-10-04 的同一次请求:
HTTP 200 是已建立的 SSE 响应状态;错误在流内返回,并非推理或工具执行成功。
会话的 tool_usage 没有执行记录,不能将流式输入预览解释成 TodoWrite 已执行。
期望表现
invalid_tool_call/model_output_error增加有限纠错(例如最多两次):反馈错误和当前合法工具集合,让模型重新生成;区别于原样网络重试。定位线索
apps/zcode-cli/packages/bootstrap/src/zcode-protocol-v4/product-projection.ts,closeOpenToolRows会为未终态工具行生成通用fault.runtime.toolLifecycleIncomplete。model.sdk.stream.failed与turn.failed的 cause/context 中。未上传真实任务内容、完整日志、截图、个人路径或凭据。我们会在本地验证局部修复,再补充验证结论。