Skip to content

[Bug] CLI 0.16.9 单 turn 无 token/退化熔断:占位命令死循环 5 小时、一夜消耗约 3 亿 token #813

Description

@BravoLeeC

提交前确认 · Pre-submission checklist

问题类别 · Category

工具调用 / MCP · Tool use / MCP(伴随计费 / 配额影响)

涉及的 Agent 框架 · Agent framework

ZCode Agent(自研)

严重程度 · Severity

影响体验 · Major(无人值守场景下造成巨额 token 损失,具备计费风险)

复现频率 · Reproducibility

仅一次 · Once(触发面明确:effort=max + 数十 KB 内联工具入参,见根因分析)

问题描述 · Description

GLM-5.3-Flash(effort=max)在提交动态工作流(CreateWorkflow,script 参数内联约 24KB 脚本)时发生「工具发射退化」:模型每轮文本自述"现在调用 CreateWorkflow / 以 path 重新提交",实际发射的工具调用却始终是编号占位 Bash(echo "placeholder-x1" 递增至 x1482+),连续约 5 小时、每 15 秒一轮。框架侧因无单 turn token/时长熔断、无重复调用检测,任由其每轮全量重发持续膨胀的上下文,直至跑满迭代上限(约 149 轮)才停,最终消耗约 3 亿 token,任务本身未完成。

复现步骤 · Steps to reproduce

  1. ZCode CLI 0.16.9,渠道 bigmodel-start-plan,模型 GLM-5.3-Flash,effort=max,无人值守运行长任务;
  2. 任务中需要调用 CreateWorkflow,且 script 参数内联大体积脚本(本例约 24KB 的 .dwf.ts 工作流草案);
  3. 模型进入「公告代替调用」退化状态:连续发出 echo "placeholder-xN" 占位 Bash(N 递增),每 15 秒一轮;
  4. 持续约 5 小时,直至单 turn 迭代上限(约 149 轮)触顶,最后一轮才第一次真正发出 CreateWorkflow 调用。

期望表现 · Expected behavior

  1. 单 turn 有可配置的 token / 时长硬熔断:达到阈值强制收束并向用户汇报,而不是只靠迭代计数兜底;
  2. 有退化检测:连续 N 次近似重复的工具调用(尤其全部成功返回却无实质进展)自动中止该 turn 并提示用户。

实际表现 · Actual behavior

  • 工具调用共 1870 次,其中 ≥1482 次为编号占位 echo;模型请求约 1870 次,节奏稳定在每 15 秒一次,持续约 5 小时;
  • 每轮全量重发持续膨胀的上下文:末期单次请求携带 3977 条消息,请求体 1.19MB(估算约 40 万 token/次);累计 ≈1900 次 × 平均 15–20 万 token ≈ 3 亿 token,与控制台口径一致;
  • 05:45 迭代上限触顶后停止;最后一轮才第一次真正发出 CreateWorkflow 调用,流程停在待确认状态,工作流从未运行(无任何 run 记录);
  • 代码仓库零改动、无副作用;唯一产物是一份 gitignore 的草案文件,任务本身(CR 登记 + 处理意见 Excel)未完成。

ZCode 版本 · ZCode version

0.16.9

设备 / 系统 / 浏览器 · Device / OS / Browser

Windows 11 x64(10.0.26200)/ Git Bash / 渠道:bigmodel-start-plan(zcode-plan/anthropic 端点,SSE 传输)/ 模型:GLM-5.3-Flash(thinking enabled、output_config effort=max、max_tokens=128000、tools=51)

截图 / 录屏 / 日志 · Screenshots / Recordings / Logs

证据均来自本地结构化日志(zcode-2026-09-25.jsonl)与 model-io 请求/响应转录:

  • 不是「调了被拒」:保留窗口内(112 条请求)dynamic-workflows skill 已加载,无任何 CreateWorkflow 拒收回执;整个窗口仅最后一轮出现 1 次 CreateWorkflow tool_use。即模型从未把该调用发射出去,与其文本自述完全脱节;

  • 无 provider 错误、无重试风暴(attempt 均为 1),是稳定的"自说自话"循环;

  • 会话:sess_94e914f2(工作区路径部分打码:E:\…\01_TMS);

  • 最后一轮模型文本自述原文(每轮均为类似表述):

    「现在调用 CreateWorkflow 提交修订后的脚本文件:」「文件内容完好。提交:」「草稿文件在位且修复已落盘。提交:」

    ——随后实际发出的却是:

    {"command": "echo \"placeholder-x1481\"", "description": "占位"}

根因分析与建议

  • 模型侧(直接原因):GLM-5.3-Flash(effort=max)在「内联数十 KB 脚本的大体积工具调用」上发生发射退化——意图正确的文本与实际 tool_use 脱钩,用小占位调用替代,且占位每次成功返回,循环自我强化近 5 小时;
  • 框架侧(放大原因):无 token/时长预算,唯一护栏是约 149 轮的迭代上限;无退化检测,哪怕"连续 N 次调用高度相似即中止"的简单规则都能在十几轮内止损。

希望解决的:

  1. 单 turn token / 时长硬熔断(可配置),达到阈值强制收束并汇报;
  2. 重复/退化工具调用检测:连续 N 次近似重复调用自动中止并提示用户;
  3. 大体积工具调用的防退化引导:对 inline script 类大参数调用,建议/引导使用文件路径引用(如 CreateWorkflow 的 path 模式),缩小退化触发面;
  4. 如模型侧可反馈:GLM-5.3-Flash 在 effort=max + 大 inline 工具入参场景下的"公告代替调用"退化值得排查。

可应要求提供脱敏后的日志片段。

Activity

github-actions commented on Sep 25, 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