DeepAI Paper Hermes Agent 教程,Hermes 记忆、技能与辅助任务 没装 Claude,Agent 却偏要调用 Claude:Hermes delegate_task 的“示例诱导”问题

没装 Claude,Agent 却偏要调用 Claude:Hermes delegate_task 的“示例诱导”问题

有些 Agent bug 看起来像权限失控,实际根因可能更微妙:工具 schema 写得太像提示词了

NousResearch/hermes-agent issue #22013 讲的就是这种情况。

用户明明没有使用 Claude,也没有安装 Claude Code / Claude Desktop,但 Hermes Agent 在复杂任务里偶尔会尝试走 Claude ACP 或 Claude 相关工具,最后自然报错。

问题不在用户配置了 Claude,也不一定是模型“真的知道本机有 Claude”。更关键的是:delegate_task 工具定义里把 claudeClaude Code 当成了显眼示例。

这会形成一种非常典型的 Agent 诱导:

工具说明里写了 claude,模型就更容易把 claude 当成默认可用选项。

现象:没装 Claude,却开始尝试 Claude 路径

issue 作者描述,在一些较长、较复杂的线程中,Hermes Agent 会尝试使用:

  • Claude ACP
  • Claude Desktop
  • Claude Code 相关调用路径

但这些工具并没有被用户安装、连接或启用。

用户预期很简单:

不要调用没有明确安装、连接、启用的 Claude 工具。

实际情况却是:

复杂任务中,Agent 偶尔会把 Claude 当成可选 delegation harness。

这类问题很烦,因为它不是每次必现,而是在复杂、多模型、多 API、多步任务里更容易出现。


关键线索:delegate_task schema 本身在“提示” Claude

用户让 Hermes Agent 自查原因后,定位到 delegate_task 的工具参数描述。

其中 acp_command 参数的描述类似:

Override ACP command for child agents (e.g. 'claude', 'copilot').
Enables spawning Claude Code (claude --acp --stdio) or other ACP-capable agents...

acp_args 里也有类似默认参数说明:

default: ['--acp', '--stdio']

这就有问题了。

对 LLM 来说,tool schema 不只是机器可读的参数说明,它也是上下文的一部分。模型会读它、参考它、被它影响。

当 schema 里把 claude 写成首个示例,还明确写出 Claude Code (claude --acp --stdio),Agent 在思考“要不要分派给别的 harness”时,就更容易把 Claude 当成默认答案。

这就是所谓的 schema priming。


为什么禁用 Claude skill 不一定有用?

issue 里提到一个重要细节:即使用户禁用了 claude-code skill,也不能完全避免这个问题。

原因是:

  • skill 禁用只影响技能加载;
  • delegate_task 是核心工具;
  • acp_command / acp_args 参数仍然出现在工具定义里;
  • 工具定义里的 Claude 示例仍然会进入模型上下文。

所以这不是简单的“关闭 Claude skill”能解决的问题。

真正的诱导源在 core tool schema,而不是某个外部 skill。


官方回应:旧 schema 已经被修过,但版本确认很关键

维护者回复指出,用户引用的描述匹配 pre-fix delegate_task 描述。

相关修复来自:

  • PR / issue reference:#19055
  • commit:69692039e
  • 发布版本:v2026.5.7
  • 修复方向:当前 schema 只把 copilot 作为示例,并移除 Claude Code 引用

维护者建议用户确认:

1. 当前 Hermes 版本; 2. 是否升级到 v2026.5.7 或更高; 3. 当前 session 中 delegate_task schema 的真实描述; 4. $PATH 里是否真的存在 claudecopilot

这几个问题很关键,因为它们能区分:

  • 旧版本 schema 还在诱导 Claude;
  • 新版本已经修了,但模型仍因训练先验幻觉 Claude;
  • 系统路径里确实存在某个 ACP CLI;
  • terminal tool 在猜测命令,而不是 delegate_task schema 诱导。

用户反馈:v0.13.0 / 2026.5.7 里仍看到旧描述

issue 评论里,用户给出了版本:

Hermes Agent v0.13.0 (2026.5.7)
Python: 3.11.15
OpenAI SDK: 2.32.0

并贴出当前 session 里的 delegate_task schema,里面仍然包含:

acp_command: Override ACP command for child agents (e.g. 'claude', 'copilot')
Enables spawning Claude Code (claude --acp --stdio)

这说明问题至少在用户环境里不是“纯粹升级即可消失”。

可能存在:

  • 安装包版本与源码 commit 不一致;
  • 本地仍加载旧 tool definition;
  • 构建/发布包没有完全包含修复;
  • session 缓存或工具 schema 缓存没有刷新;
  • 多个 Hermes 安装路径混用。

这也是为什么文章标题不能写成“Claude 调度 bug 已修复”,而应写成“工具 schema 的示例诱导”。


这个 bug 的真正价值:tool schema 也是 prompt surface

很多人写工具定义时,会把 description 当成文档。

但在 Agent 系统里,description 同时也是提示词。

它会影响模型的:

  • 工具选择;
  • 参数选择;
  • fallback 策略;
  • 对本机能力的假设;
  • 对“推荐路径”的理解。

所以工具 schema 里的例子不能随便写。

如果你写:

e.g. 'claude', 'copilot'

模型看到的不是“这只是例子”,而可能是:

claude 是这个工具最自然的默认值之一。

如果你还写:

Enables spawning Claude Code

那诱导更强。


对 Agent 产品的工程启发

这个 issue 对所有 Agent 框架都有参考价值。

1. 工具描述要避免偏向未启用能力

如果用户没有安装 Claude,就不应该在核心工具 schema 里强提示 Claude。

更好的做法是:

ACP command for an installed ACP-capable agent.
Only use values explicitly configured or detected in this environment.

而不是:

e.g. claude

2. 示例应该来自当前环境,而不是写死

如果检测到只有 copilot 可用,就只显示 copilot

如果没有任何 ACP CLI,就隐藏该参数,或明确写:

No ACP command is currently configured.
Do not invent one.

3. schema gating 比事后纠错更可靠

与其在系统提示里写“不要调用 Claude”,不如直接让工具 schema 不暴露 Claude 示例。

因为模型每次调用工具都会读 schema,schema 的局部诱导比全局禁令更贴近决策点。

4. 复杂任务更容易触发工具幻觉

issue 里说这个问题不容易稳定复现,通常在长任务、多 LLM、多 API 工作流里出现。

这很合理。

任务越复杂,模型越会寻找 delegation harness;schema 里的示例就越容易成为默认路线。


排查 checklist

如果你也遇到“没装 Claude,Agent 却调用 Claude”的问题,可以按这个顺序查:

1. 看 Hermes 版本

hermes --version

重点确认是否至少是 v2026.5.7

2. 打印当前 delegate_task schema

让 Agent 输出它看到的 delegate_task 工具描述。

重点搜索:

claude
Claude Code
claude --acp --stdio

3. 检查 PATH

which claude
which copilot

如果命令存在,Agent 可能不是 hallucinate,而是真的看到了可执行入口。

4. 检查安装路径是否混用

可能同时存在:

  • pip 安装版本;
  • git clone 开发版;
  • 旧 virtualenv;
  • system service 加载的旧路径;
  • shell 里加载的新路径。

5. 重启 Hermes / gateway / session

如果工具 schema 有缓存,升级后不重启也可能继续看到旧描述。


和 DeepAI API 中转站的关系

这个问题不属于 DeepAI API 中转站,也不是 OpenAI-compatible API 本身导致的。

DeepAI 可以作为支持 OpenAI-compatible API 的模型入口,适合接入 Cherry Studio、Cline、Dify、Open WebUI 等工具链。

delegate_task 是否把 Claude 写进 schema、是否错误诱导 Agent 调用未安装 harness,是 Hermes 内部工具定义和环境检测问题。

换句话说:

DeepAI 解决模型 API 入口问题,不解决 Hermes 工具 schema 诱导问题。

如果你的 Agent 框架支持 OpenAI-compatible API,可以用 DeepAI 简化模型接入;但工具调用、ACP harness、子 Agent 分派这些仍然要由框架自己正确处理。


FAQ

为什么 Agent 会调用我没装的 Claude?

可能是 delegate_task 的工具 schema 里把 claudeClaude Code 写成了显眼示例,导致模型在复杂任务里把它当成可用默认选项。

禁用 Claude skill 有用吗?

不一定。因为问题可能出在核心 delegate_task 工具参数描述,而不是 Claude skill 是否加载。

升级 Hermes 能解决吗?

官方表示相关描述已在 #19055 / 69692039e / v2026.5.7 中修复。但 issue 中用户反馈 v0.13.0 (2026.5.7) 仍看到旧描述,所以要实际打印当前 schema 验证。

这是 DeepAI 或模型 API 的问题吗?

不是。DeepAI 负责 OpenAI-compatible API 入口,不负责 Hermes 的工具 schema 与 ACP harness 分派。

最好的修复方式是什么?

按当前环境动态暴露 ACP 参数和示例;未检测到 Claude 时,不要在 schema 中出现 Claude;未配置 ACP harness 时,隐藏相关参数或明确要求不要编造命令。


总结

#22013 的核心教训是:

工具 schema 不是中立文档,它也是 prompt。

delegate_taskclaude 写成首要示例,Agent 就更容易在复杂任务里把 Claude 当成默认 delegation harness。

这类 bug 看似是“Agent 乱调用工具”,本质是“工具描述塑造了模型的行动偏好”。

对 Agent 框架来说,最稳的设计不是在事后告诉模型“别乱用 Claude”,而是在工具 schema 层就只暴露当前环境真实可用的能力。

Related Post

Hermes Agent 启动报 Invalid key: c-S-c?prompt_toolkit 快捷键崩溃排错指南Hermes Agent 启动报 Invalid key: c-S-c?prompt_toolkit 快捷键崩溃排错指南

Hermes Agent 运行 hermes 或 hermes chat 刚显示 banner 就崩溃,报 Error: Invalid key: c-S-c?这通常不是 API Key 或模型问题,而是 prompt_toolkit 不支持 Ctrl+Shift+C 的 c-S-c keybinding。本文解释原因、判断方法、临时 workaround 和升级建议。

Hermes Provider 兼容性排错:reasoning_content、custom headers、上下文长度和 api_mode 继承Hermes Provider 兼容性排错:reasoning_content、custom headers、上下文长度和 api_mode 继承

OpenAI-compatible 不等于 provider 细节完全一致。本文基于 Hermes Issues 解析 reasoning_content 400、Custom Provider headers 403、上下文长度误判、delegate api_mode 继承等兼容性问题,并说明 DeepAI 接 Hermes 时该如何分层测试。

让 Hermes 别回复却收到 Codex incomplete?空响应被重试 3 次的原因让 Hermes 别回复却收到 Codex incomplete?空响应被重试 3 次的原因

Hermes openai-codex 路径中,用户要求机器人不回复时,completed empty final answer 曾被归一化成 incomplete 并重试 3 次。本文解释空响应不等于未完成、finish_reason 误判、continuation loop 和群聊机器人“沉默成功”的重要性。