Skip to content

[Bug] OpenAI-compatible invalid_tool_call 被显示为工具生命周期缺失,且未提供受控纠错 #933

Description

@jerrydong1988

提交前确认 / 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。
  • 合法的流式文本、工具调用和思考参数测试可成功;此次失败发生在实际研究任务中。

复现步骤

  1. 配置支持标准 OpenAI-compatible 流和工具调用的本地模型。
  2. 工具列表不提供 WebSearch,但包含 TodoWrite 和 WebFetch;模型原生联网搜索能力为 false。
  3. 提交需要资料研究及文档输出的任务。当模型先输出工具输入片段,随后生成未注册的 WebSearch 时,后端拒绝该输出。
  4. 对照真实上游错误、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 已执行。

期望表现

  1. 工具卡片/回合错误保留可操作的真实原因:模型请求了未注册的 WebSearch,相关调用尚未执行。通用 lifecycle 消息不能覆盖已知 provider 诊断。
  2. 可考虑对明确的 invalid_tool_call / model_output_error 增加有限纠错(例如最多两次):反馈错误和当前合法工具集合,让模型重新生成;区别于原样网络重试。
  3. 只有确认尚无工具实际执行/提交结果时才能重新生成;若执行状态不明,不自动重放。取消、权限拒绝、网络中断和其他 provider 错误不应统一视为这类可纠错错误。
  4. 保持服务端工具名和参数校验。不能通过开启并不存在的 native WebSearch 能力或忽略 schema 来规避。

定位线索

未上传真实任务内容、完整日志、截图、个人路径或凭据。我们会在本地验证局部修复,再补充验证结论。

Activity

  1. github-actions commented on Oct 5, 2026

    @github-actions

    👋 感谢你的反馈,我们已经收到。

    • 维护者看到后会尽快回复你。
    • 状态保持为 status: 待评估,你可以随时补充信息。
    • 信息不全时我们会打上 needs: 更多信息 标签并 @ 你。

    👋 Thanks — we've received your issue.

    • A maintainer will get back to you as soon as we can.
    • Status stays at status: 待评估 (Triage); feel free to add context.
    • If we need more details, we'll add needs: 更多信息 and ping you.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions