Skip to content

[Design Discussion] enableToolCall=true 时 AI 文本中的 XML 工具标签是否应被执行 #699

Description

@CATMIAOZHI

背景

#685 报告了 enableToolCall=true 时 AI 文本中的 XML 工具标签被 extractToolInvocations 提取执行的问题。经讨论,owner 确认当前行为是设计如此——XML toolcall 是项目的兼容协议,AI 输出的 XML toolcall 被执行是预期行为。

本 issue 不是 bug report,而是针对上述设计提出一个改进方向,供讨论。

设计问题

当前 enableToolCall 只控制 Provider 原生 tool call 与内部 XML 协议之间的转换,不影响执行层对 XML 的提取。这意味着:

  • enableToolCall=true:Provider 原生 tool call 转成 XML 执行 ✅,AI 文本中的 XML 也被执行 ❌
  • enableToolCall=false:AI 文本中的 XML 执行 ✅(唯一通道,合理)

两个通道并行,缺乏互斥语义。

建议的设计方向

enableToolCall 应作为通道选择开关:

enableToolCall 工具调用通道 AI 文本中的 XML
false XML toolcall(唯一通道) ✅ 执行(预期行为,不变)
true 原生 function calling ❌ 不执行(走原生通道)

用户开启 enableToolCall=true 的意图是"走原生 function calling 通道"。此时 AI 在正文里解释工具格式、写代码示例时输出的 XML 不应被执行。

实测依据

enableToolCall=true 条件下,让 AI 原样重复一段 XML 工具标签文字,结果:系统将正文中的 XML 误识别为工具调用并尝试执行,报错 This tool is only available in...。AI 在 thinking 中正确理解了用户意图("只要我重复文字,不是要我执行工具"),但执行层无法区分 XML 来源。

该问题在分析 Operit 工具调用机制时自然复现——AI 在正文中引用工具格式代码作为说明时触发了误执行。

PR #691 的评论区有实测对比截图(未修复版 vs 修复版)。

不涉及的部分

  • 渲染层不讨论:AI 文本中的 XML 仍可渲染为工具调用卡片,视觉展示不改
  • enableToolCall=false 行为不讨论:现有 XML toolcall 通道作为唯一通道,行为不变
  • 不涉及具体实现方案:本 issue 仅讨论设计方向是否值得推进,实现细节在方向确认后再议

为什么单独开 issue

PR #691#686 尝试在 bugfix 框架下推进修复,owner 正确指出这属于设计变更而非 bugfix。因此本 issue 作为 design discussion 单独提出,与 #685 的 bug 报告框架分开。

Metadata

Metadata

Assignees

No one assigned

    Labels

    low-priority低优先级,暂时不处理Low priority, will not be handled for now

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions