根本原因是请求体结构未对齐jev的类型契约;必须严格匹配字段名、类型及嵌套层级,questions中key须为合法标识符,value必须含小写type("noul"/"choice"/"score"),state仅支持string/object/array,禁止传入响应字段如confidence。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

结构化输出错乱,根本原因不是指令写得不够“用力”,而是请求体结构本身没对齐 Jev 的类型契约。它不靠 prompt 工程生效,只认字段名、字段类型、嵌套层级这三样——写再多“请严格返回 JSON”都没用。
确保 questions 字段完全合规
每个问题 key 必须是合法标识符(字母/数字/下划线,不能以数字开头),且 value 必须含 type 字段,值只能是小写 "noul"、"choice" 或 "score"(拼错、大小写错、加后缀都会被静默跳过):
- ✅ 正确:
"is_refund_request": {"type": "noul"} - ❌ 失效:
"is-refund-request": {...}(含连字符)、"type": "Noul"(大写)、"type": "bool"(拼错) - ⚠️ 若用了
"choice",必须带options: ["A", "B"];若用了"score",必须带scores: ["low", "medium", "high"]
state 字段类型不能越界
state 只能是 string、object 或 array —— 不能是 null、number、boolean 或 undefined。常见翻车点:
- JS 中直接传
{userInput: undefined},序列化后变成{"userInput": null}→ 触发 400 - 前端传了空字符串
""或纯空格字符串,Jev 虽不报错,但输出置信度会整体偏低(因缺乏有效信号) - 建议在发送前做简单校验:
JSON.stringify(state) !== 'null' && typeof state !== 'number'
避免把响应字段误当请求字段
像 confidence、probabilities、truth_value 这些,是 Jev 返回的字段,绝不能出现在请求中。加了就会 400:
- ❌ 错误示例:
{"state": "...", "questions": {...}, "confidence": 0.95} - ✅ 正确做法:只保留
state和questions两个顶层字段,其余全删 - 调试时可用
console.log(JSON.stringify(req, null, 2))看原始 JSON,确认无多余键或非法值
解析响应时必须按 type 分支取值
响应里的 results 是数组,每个元素对应一个问题,但字段名不统一:
-
type: "noul"→ 取truth_value(float,不是 boolean) -
type: "choice"→ 取selected(string)和probabilities(数组,顺序与请求中options一致) -
type: "score"→ 取score(string,是你定义的 scale 中的某个 label) - 别一上来就
res.choice或res.score,否则 KeyError 或 NoneType 报错











