已关闭
[Bug-Report|缺陷反馈]: VSCode插件会话报BadRequest/InvalidParameter,伴随模型输出碎片化与空名工具调用 #1
m0_54008281创建于  4 天前关闭于  1 天前
m0_54008281
m0_54008281
4 天前 创建

问题描述 / Describe the current behavior

在使用 CANNBot VSCode 插件进行 agent 会话(开发 skill)过程中,插件侧报错:

type: BadRequest, code: InvalidParameter, A parameter specified in the request is not valid
Request id: 02178874955505301f819c000da0da885d1c1d6a7a97803828463

完整时间线(2026-09-07 10:34–10:52,UTC+8):

  1. 会话正常推进至约 84K prompt tokens
  2. 10:44:08 最后一条成功回复发生输出退化:11841 字符被切分为 412 个单字碎片,并出现大量 undefined(...) 形式的伪工具调用(工具名为空/undefined)
  3. 插件无法解析畸形调用,向对话历史回灌 "Tool not found"(工具名为空)的 tool 结果
  4. 10:44:10–10:52 含畸形历史的请求被网关连续拒绝 10 次(失败请求均 generatedTokens=0),错误信息不指明具体非法参数
  5. 新开会话后立即恢复正常(相同账号、相同凭据),除此之外无其他恢复手段

环境信息 / Environment Information

  • 插件:CANNBot Toolkit for VS Code v1.0.13(cann-pub.cannbot-toolkit-1.0.13-win32-x64)
  • VS Code:1.131.0(Windows x64)
  • 模型:GLM-5.3(cannbot 网关 compatible-mode)
  • 说明:本问题为插件与模型网关交互问题,不涉及昇腾硬件与 CANN 版本

重现步骤 / Steps to reproduce

  1. 使用 CANNBot 插件进行较长的 agent 会话(本次约 84K–89K prompt tokens,开发 ./demo 下的 skill)
  2. 会话中段模型输出出现碎片化(单字输出 + undefined(...) 伪工具调用)
  3. 插件回灌 "Tool not found" 错误后继续请求
  4. 网关返回 BadRequest / InvalidParameter

预期结果 / Expected behavior

  • 网关侧:参数校验失败时应返回明确的错误信息(指明哪个参数非法),便于定位
  • 插件侧:应过滤/修复畸形的工具调用历史(空 function name 的 tool_call/tool 消息对),避免将非法消息结构回传网关;模型输出碎片化时应有保护机制

日志/截图 / Log / Screenshot

1. ~/.cannbot/dev_data/0.2.0/tokensGenerated.jsonl(2026-09-07 全部记录,时间为 UTC,+8 即北京时间;generatedTokens:0 即失败请求):

{"timestamp":"2026-09-07T02:44:07.053Z","userId":"","userAgent":"Visual Studio Code/1.131.0 (Continue/1.0.13)","selectedProfileId":"local","eventName":"tokensGenerated","schema":"0.2.0","model":"glm-5.3","provider":"cannbot","promptTokens":84289,"generatedTokens":240}
{"timestamp":"2026-09-07T02:44:08.957Z","userId":"","userAgent":"Visual Studio Code/1.131.0 (Continue/1.0.13)","selectedProfileId":"local","eventName":"tokensGenerated","schema":"0.2.0","model":"glm-5.3","provider":"cannbot","promptTokens":84324,"generatedTokens":5141}
{"timestamp":"2026-09-07T02:44:10.711Z","userId":"","userAgent":"Visual Studio Code/1.131.0 (Continue/1.0.13)","selectedProfileId":"local","eventName":"tokensGenerated","schema":"0.2.0","model":"glm-5.3","provider":"cannbot","promptTokens":85515,"generatedTokens":0}
{"timestamp":"2026-09-07T02:44:10.906Z","userId":"","userAgent":"Visual Studio Code/1.131.0 (Continue/1.0.13)","selectedProfileId":"local","eventName":"tokensGenerated","schema":"0.2.0","model":"glm-5.3","provider":"cannbot","promptTokens":85195,"generatedTokens":0}
{"timestamp":"2026-09-07T02:45:37.515Z","userId":"","userAgent":"Visual Studio Code/1.131.0 (Continue/1.0.13)","selectedProfileId":"local","eventName":"tokensGenerated","schema":"0.2.0","model":"glm-5.3","provider":"cannbot","promptTokens":85527,"generatedTokens":0}
{"timestamp":"2026-09-07T02:46:12.438Z","userId":"","userAgent":"Visual Studio Code/1.131.0 (Continue/1.0.13)","selectedProfileId":"local","eventName":"tokensGenerated","schema":"0.2.0","model":"glm-5.3","provider":"cannbot","promptTokens":85529,"generatedTokens":137}
{"timestamp":"2026-09-07T02:46:14.216Z","userId":"","userAgent":"Visual Studio Code/1.131.0 (Continue/1.0.13)","selectedProfileId":"local","eventName":"tokensGenerated","schema":"0.2.0","model":"glm-5.3","provider":"cannbot","promptTokens":89012,"generatedTokens":0}
{"timestamp":"2026-09-07T02:48:15.645Z","userId":"","userAgent":"Visual Studio Code/1.131.0 (Continue/1.0.13)","selectedProfileId":"local","eventName":"tokensGenerated","schema":"0.2.0","model":"glm-5.3","provider":"cannbot","promptTokens":89036,"generatedTokens":0}
{"timestamp":"2026-09-07T02:50:24.734Z","userId":"","userAgent":"Visual Studio Code/1.131.0 (Continue/1.0.13)","selectedProfileId":"local","eventName":"tokensGenerated","schema":"0.2.0","model":"glm-5.3","provider":"cannbot","promptTokens":89036,"generatedTokens":0}
{"timestamp":"2026-09-07T02:50:29.250Z","userId":"","userAgent":"Visual Studio Code/1.131.0 (Continue/1.0.13)","selectedProfileId":"local","eventName":"tokensGenerated","schema":"0.2.0","model":"glm-5.3","provider":"cannbot","promptTokens":89036,"generatedTokens":0}
{"timestamp":"2026-09-07T02:51:15.658Z","userId":"","userAgent":"Visual Studio Code/1.131.0 (Continue/1.0.13)","selectedProfileId":"local","eventName":"tokensGenerated","schema":"0.2.0","model":"glm-5.3","provider":"cannbot","promptTokens":89012,"generatedTokens":0}
{"timestamp":"2026-09-07T02:52:36.686Z","userId":"","userAgent":"Visual Studio Code/1.131.0 (Continue/1.0.13)","selectedProfileId":"local","eventName":"tokensGenerated","schema":"0.2.0","model":"glm-5.3","provider":"cannbot","promptTokens":89036,"generatedTokens":0}
{"timestamp":"2026-09-07T02:58:54.927Z","userId":"","userAgent":"Visual Studio Code/1.131.0 (Continue/1.0.13)","selectedProfileId":"local","eventName":"tokensGenerated","schema":"0.2.0","model":"glm-5.3","provider":"cannbot","promptTokens":2384,"generatedTokens":215}
{"timestamp":"2026-09-07T02:59:12.281Z","userId":"","userAgent":"Visual Studio Code/1.131.0 (Continue/1.0.13)","selectedProfileId":"local","eventName":"tokensGenerated","schema":"0.2.0","model":"glm-5.3","provider":"cannbot","promptTokens":2824,"generatedTokens":498}
{"timestamp":"2026-09-07T02:59:36.423Z","userId":"","userAgent":"Visual Studio Code/1.131.0 (Continue/1.0.13)","selectedProfileId":"local","eventName":"tokensGenerated","schema":"0.2.0","model":"glm-5.3","provider":"cannbot","promptTokens":9742,"generatedTokens":4562}

2. 模型退化输出完整原文(~/.cannbot/dev_data/0.2.0/chatInteraction.jsonl 最后一条成功 completion,2026-09-07T02:44:08Z,共 11841 字符 / 412 个 <assistant> 片段,逐字未删减):

<assistant>
改

<assistant>
用

<assistant>
精确

<assistant>
替换

<assistant>
方式

<assistant>
修复

<assistant>
:

<assistant>

single_find_and_replace({")

<assistant>

undefined(filepath)

<assistant>

undefined(":")

<assistant>

undefined(demo)

<assistant>

undefined(/)

<assistant>

undefined(asc)

<assistant>

undefined(end)

<assistant>

undefined(c)

<assistant>

undefined(-debug)

<assistant>

undefined(/scripts)

<assistant>

undefined(/class)

<assistant>

undefined(ify)

<assistant>

undefined(_sym)

<assistant>

undefined(ptom)

<assistant>

undefined(.py)

<assistant>

undefined(")

<assistant>

undefined(,")

<assistant>

undefined(new)

<assistant>

undefined(_string)

<assistant>

undefined(":")

<assistant>

undefined(RUN)

<assistant>

undefined(TIME)

<assistant>

undefined(_RULE)

<assistant>

undefined(S)

<assistant>

undefined( =)

<assistant>

undefined( {\n)

<assistant>

undefined(   )

<assistant>

undefined( \")

<assistant>

undefined(category)

<assistant>

undefined(\":)

<assistant>

undefined( \")

<assistant>

undefined(runtime)

<assistant>

undefined(\",\n)

<assistant>

undefined(   )

<assistant>

undefined( \")

<assistant>

undefined(name)

<assistant>

undefined(\":)

<assistant>

undefined( \")

<assistant>

undefined(运行)

<assistant>

undefined(时)

<assistant>

undefined(错误)

<assistant>

undefined(\",\n)

<assistant>

undefined(   )

<assistant>

undefined( \")

<assistant>

undefined(skill)

<assistant>

undefined(\":)

<assistant>

undefined( \")

<assistant>

undefined(asc)

<assistant>

undefined(end)

<assistant>

undefined(c)

<assistant>

undefined(-runtime)

<assistant>

undefined(-debug)

<assistant>

undefined(\",\n)

<assistant>

undefined(   )

<assistant>

undefined( \")

<assistant>

undefined(first)

<assistant>

undefined(_action)

<assistant>

undefined(\":)

<assistant>

undefined( \")

<assistant>

undefined(调用)

<assistant>

undefined( acl)

<assistant>

undefined(Get)

<assistant>

undefined(Recent)

<assistant>

undefined(ErrMsg)

<assistant>

undefined(())

<assistant>

undefined( )

<assistant>

undefined(获取)

<assistant>

undefined(错误)

<assistant>

undefined(详情)

<assistant>

undefined(,)

<assistant>

undefined(再)

<assistant>

undefined(按)

<assistant>

undefined(错误)

<assistant>

undefined(码)

<assistant>

undefined(范围)

<assistant>

undefined(定位)

<assistant>

undefined(\",\n)

<assistant>

undefined(   )

<assistant>

undefined( #)

<assistant>

undefined( 注意)

<assistant>

undefined(:)

<assistant>

undefined(不)

<assistant>

undefined(使用)

<assistant>

undefined(宽)

<assistant>

undefined(泛)

<assistant>

undefined(的)

<assistant>

undefined(\")

<assistant>

undefined(返回)

<assistant>

undefined(码)

<assistant>

undefined(\")

<assistant>

undefined(——)

<assistant>

undefined(\")

<assistant>

undefined(返回)

<assistant>

undefined(码)

<assistant>

undefined( )

<assistant>

undefined(0)

<assistant>

undefined(\")

<assistant>

undefined(表示)

<assistant>

undefined(程序)

<assistant>

undefined(正常)

<assistant>

undefined(结束)

<assistant>

undefined(()

<assistant>

undefined(精度)

<assistant>

undefined(类)

<assistant>

undefined(信号)

<assistant>

undefined())

<assistant>

undefined(,\n)

<assistant>

undefined(   )

<assistant>

undefined( #)

<assistant>

undefined( 仅)

<assistant>

undefined(匹配)

<assistant>

undefined(明确)

<assistant>

undefined(报)

<assistant>

undefined(错)

<assistant>

undefined(的表达)

<assistant>

undefined(()

<assistant>

undefined(\")

<assistant>

undefined(返回)

<assistant>

undefined(码)

<assistant>

undefined(非)

<assistant>

undefined( )

<assistant>

undefined(0)

<assistant>

undefined(\")

<assistant>

undefined( /)

<assistant>

undefined( \")

<assistant>

undefined(返回)

<assistant>

undefined(码)

<assistant>

undefined(不为)

<assistant>

undefined( )

<assistant>

undefined(0)

<assistant>

undefined(\")

<assistant>

undefined( 等)

<assistant>

undefined()\n)

<assistant>

undefined(   )

<assistant>

undefined( \")

<assistant>

undefined(keywords)

<assistant>

undefined(\":)

<assistant>

undefined( [\n)

<assistant>

undefined(       )

<assistant>

undefined( \")

<assistant>

undefined(返回)

<assistant>

undefined(码)

<assistant>

undefined(非)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(返回)

<assistant>

undefined(码)

<assistant>

undefined(不为)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(返回)

<assistant>

undefined(错误)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(错误)

<assistant>

undefined(码)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(报)

<assistant>

undefined(错)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(报)

<assistant>

undefined(错误)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(执行)

<assistant>

undefined(失败)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(调用)

<assistant>

undefined(失败)

<assistant>

undefined(\",\n)

<assistant>

undefined(       )

<assistant>

undefined( \")

<assistant>

undefined(til)

<assistant>

undefined(ing)

<assistant>

undefined( )

<assistant>

undefined(错)

<assistant>

undefined(误)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(til)

<assistant>

undefined(ing)

<assistant>

undefined(异常)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(til)

<assistant>

undefined(ing)

<assistant>

undefined( 异)

<assistant>

undefined(常)

<assistant>

undefined(\",\n)

<assistant>

undefined(       )

<assistant>

undefined( \")

<assistant>

undefined(kernel)

<assistant>

undefined( )

<assistant>

undefined(查)

<assistant>

undefined(找)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(kernel)

<assistant>

undefined( 未)

<assistant>

undefined(找到)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(找不到)

<assistant>

undefined( kernel)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(未)

<assistant>

undefined(找到)

<assistant>

undefined(算)

<assistant>

undefined(子)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(算)

<assistant>

undefined(子)

<assistant>

undefined(未)

<assistant>

undefined(安装)

<assistant>

undefined(\",\n)

<assistant>

undefined(       )

<assistant>

undefined( \")

<assistant>

undefined(环境)

<assistant>

undefined(变量)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(安装)

<assistant>

undefined(目录)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(vendor)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(workspace)

<assistant>

undefined( invalid)

<assistant>

undefined(\",\n)

<assistant>

undefined(   )

<assistant>

undefined( ],\n)

<assistant>

undefined(})

<assistant>

undefined(")

<assistant>

undefined(,")

<assistant>

undefined(old)

<assistant>

undefined(_string)

<assistant>

undefined(":")

<assistant>

undefined(RUN)

<assistant>

undefined(TIME)

<assistant>

undefined(_RULE)

<assistant>

undefined(S)

<assistant>

undefined( =)

<assistant>

undefined( {\n)

<assistant>

undefined(   )

<assistant>

undefined( \")

<assistant>

undefined(category)

<assistant>

undefined(\":)

<assistant>

undefined( \")

<assistant>

undefined(runtime)

<assistant>

undefined(\",\n)

<assistant>

undefined(   )

<assistant>

undefined( \")

<assistant>

undefined(name)

<assistant>

undefined(\":)

<assistant>

undefined( \")

<assistant>

undefined(运行)

<assistant>

undefined(时)

<assistant>

undefined(错误)

<assistant>

undefined(\",\n)

<assistant>

undefined(   )

<assistant>

undefined( \")

<assistant>

undefined(skill)

<assistant>

undefined(\":)

<assistant>

undefined( \")

<assistant>

undefined(asc)

<assistant>

undefined(end)

<assistant>

undefined(c)

<assistant>

undefined(-runtime)

<assistant>

undefined(-debug)

<assistant>

undefined(\",\n)

<assistant>

undefined(   )

<assistant>

undefined( \")

<assistant>

undefined(first)

<assistant>

undefined(_action)

<assistant>

undefined(\":)

<assistant>

undefined( \")

<assistant>

undefined(调用)

<assistant>

undefined( acl)

<assistant>

undefined(Get)

<assistant>

undefined(Recent)

<assistant>

undefined(ErrMsg)

<assistant>

undefined(())

<assistant>

undefined( )

<assistant>

undefined(获取)

<assistant>

undefined(错误)

<assistant>

undefined(详情)

<assistant>

undefined(,)

<assistant>

undefined(再)

<assistant>

undefined(按)

<assistant>

undefined(错误)

<assistant>

undefined(码)

<assistant>

undefined(范围)

<assistant>

undefined(定位)

<assistant>

undefined(\",\n)

<assistant>

undefined(   )

<assistant>

undefined( \")

<assistant>

undefined(keywords)

<assistant>

undefined(\":)

<assistant>

undefined( [\n)

<assistant>

undefined(       )

<assistant>

undefined( \")

<assistant>

undefined(返回)

<assistant>

undefined(码)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(错误)

<assistant>

undefined(码)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(报)

<assistant>

undefined(错)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(报)

<assistant>

undefined(错误)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(执行)

<assistant>

undefined(失败)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(调用)

<assistant>

undefined(失败)

<assistant>

undefined(\",\n)

<assistant>

undefined(       )

<assistant>

undefined( \")

<assistant>

undefined(til)

<assistant>

undefined(ing)

<assistant>

undefined( )

<assistant>

undefined(错)

<assistant>

undefined(误)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(til)

<assistant>

undefined(ing)

<assistant>

undefined(异常)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(til)

<assistant>

undefined(ing)

<assistant>

undefined( 异)

<assistant>

undefined(常)

<assistant>

undefined(\",\n)

<assistant>

undefined(       )

<assistant>

undefined( \")

<assistant>

undefined(kernel)

<assistant>

undefined( )

<assistant>

undefined(查)

<assistant>

undefined(找)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(kernel)

<assistant>

undefined( 未)

<assistant>

undefined(找到)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(找不到)

<assistant>

undefined( kernel)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(未)

<assistant>

undefined(找到)

<assistant>

undefined(算)

<assistant>

undefined(子)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(算)

<assistant>

undefined(子)

<assistant>

undefined(未)

<assistant>

undefined(安装)

<assistant>

undefined(\",\n)

<assistant>

undefined(       )

<assistant>

undefined( \")

<assistant>

undefined(环境)

<assistant>

undefined(变量)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(安装)

<assistant>

undefined(目录)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(vendor)

<assistant>

undefined(\",)

<assistant>

undefined( \")

<assistant>

undefined(workspace)

<assistant>

undefined( invalid)

<assistant>

undefined(\",\n)

<assistant>

undefined(   )

<assistant>

undefined( ],\n)

<assistant>

undefined(})

<assistant>

undefined(")

<assistant>

undefined(,")

<assistant>

undefined(replace)

<assistant>

undefined(_all)

<assistant>

undefined(":)

<assistant>

undefined(false)

<assistant>

undefined()

<assistant>

undefined(})

3. 会话历史中被回灌的 Tool not found 记录(~/.cannbot/sessions/0b2682f6-a77e-4bcb-bfa6-858a5f5516d2.json 历史尾部,注意报错中工具名为空):

[83] assistant: 重新读取文件后精确编辑:
[84] tool: " failed because the arguments were invalid, with the following message: Tool  not found
       Please try something else or request further instructions."
[85] assistant: (空)
[86] tool: " failed because the arguments were invalid, with the following message: Tool  not found
       Please try something else or request further instructions."
[87] user: 换个工具重试
[88] assistant: (空)
[89] thinking: 用户让我换个工具重试。我需要先重新读取文件,然后使用 single_find_and_replace 工具修复 classify_symptom.py 中的关键词误判问题。...
[90] assistant: 好的,先重新读取脚本文件获取最新内容:

备注 / Additional Notes

已排除的原因:

  • 鉴权失效:新会话同凭据立即恢复
  • 上下文超限:GLM-5.3 contextLength=1048576,存在 40 万 token 请求成功记录,本次最大仅 89K
  • 用户文件内容异常:相关文件无控制字符/非法代理对

初步分析(推测,供参考):模型输出退化为碎片 + 空名工具调用 → 插件将其转为非法 OpenAI 协议消息结构回传 → 网关校验拒绝。属插件-网关协议适配问题,非用户环境问题。

另:2026-09-04 06:32 UTC 亦出现过 2 次小请求(3100 tokens)失败后自愈的记录,可一并排查。

likedislike
m0_54008281m0_54008281
4 天前 添加了label:bug-report
songkai111成员
1 天前 评论:

你好,已收到问题,我来试一下能否复现。

likedislike
朱征
朱征
1 天前 评论:

新版本优化了agent框架,已经和用户确认该问题已解决,关闭issue。

likedislike
Ssongkai111成员
1 天前 issue状态由 进行中 改变为 已完成
Ssongkai111成员
1 天前 关闭了 issue