Repository navigation
[Bug] Gemini 3.x 在调用 cordis_inspect_query 后永久报 HTTP 400:工具返回的 JSON Schema $ref: "#/$defs/loaderExpression" 被误判为多模态 display_name(附根因与修复建议)
#10167
Replies: 2 comments
|
根因链的前半段我核到了,而且比你写的更具体一点;但**"改成不返回 schema" 不是唯一的修法**,还有一处更便宜的位置。 已核实
$defs: { ...definitions, loaderExpression: LOADER_EXPRESSION_SCHEMA },
但时间线要说清:坏的不是这一轮,是下一轮
三个修法,我按代价排序
我倾向 1:它能立刻止血,而且不需要改 两个要注意的点
最后一个提醒:这个缺陷的严重度在于不可自救 —— 用户没有任何手段让一个已经中毒的会话恢复,只能弃会话。这一点值得单独强调,它是这条报告真正的分量。 |
|
补充一条相邻证据:同一个 与本贴的区别
也就是说:会话里只要挂着一个 schema 含 绕开 DSH、直接打 API 的隔离结果直接
注意 与其它已开议题的关联
这几条已经指出 mcp-client 缺少「按 provider 对 建议本贴的方案 A / B 之外,在构造 完整复现、原始报错、curl、环境版本见新帖 #10904。 |
Uh oh!
There was an error while loading. Please reload this page.
问题描述 / Symptom
当模型配置为 Google Gemini(3.x) 时,一旦会话中触发了只读配置查询工具
cordis_inspect_query(如Config.listConfigs),下一轮及之后的每一次请求都会固定返回 HTTP 400,导致当前会话彻底卡死(历史重放持续触发同一校验错误):根因定位 / Root Cause
Gemini API 的
$ref校验机制冲突Gemini 在接收
function_response时,会扫描function_response.response对象中的$ref字段,并将其视为对function_response.parts中多模态附件display_name的引用。当工具返回值本身包含 JSON Schema 的内部引用(如#/$defs/...)且以结构化对象原样回传时,Gemini 在parts中找不到同名附件,直接拒绝请求并返回400 INVALID_ARGUMENT。#/$defs/loaderExpression的具体来源在
@deepseek-ai/dsh-tool-cordis(app.asar/dsh/node_modules/@deepseek-ai/dsh-tool-cordis/lib/types/config.js)中,cordis_inspect_query会将投影出的完整 JSON Schema 作为工具结果返回:(其中
LOADER_EXPRESSION_SCHEMA来自@deepseek-ai/dsh-app-boot。)当返回的配置 schema 中包含
"$ref": "#/$defs/loaderExpression"时,该结果写入会话历史,并在下一轮请求重放给 Gemini 时引爆 400 报错。复现步骤 / Reproduction
function_response结构化回传路径)。cordis_inspect_query(查询Config.listConfigs等会返回带loaderExpression引用 schema 的项)。外部同类先例 / Prior Art
该问题在其他 Agent / SDK 项目中已有完全一致的记录与修复:
$ref/$defsin function response content (400 INVALID_ARGUMENT) vercel/ai#14369:The referenced name '#/$defs/__schema0' in function_response.response does not match to a display_name in the function_response.parts$ref误判。修复建议 / Suggested Fix
方案 A(推荐,Adapter 层通用兜底):
在将工具结果构造为 Gemini
function_response.response时,扫描对象中是否包含 JSON Schema 的$ref/$defs指针(如匹配^#/的$ref);若命中,则将返回值包装/序列化为不透明纯文本(opaque text string)回传,避免触发 Gemini 的多模态指针解析(与vercel/ai#14369及hermes-agent#93015做法一致)。方案 B(工具层最小改动):
在
@deepseek-ai/dsh-tool-cordis返回schema前将loaderExpression内联展开(dereference),或将schema字段直接序列化为 JSON 字符串。All reactions