Features
响应修复
自动修复 LLM JSON 错误 - 自动修复 GPT-4、Claude、Gemini 的格式错误 JSON。确保生产 AI 应用的有效结构化输出。
响应修复
响应修复是一个插件,可以自动验证和修复 AI 模型生成的格式错误的 JSON 响应。启用后,即使模型的格式不完美,UniterRouter 也能确保 API 响应符合你指定的模式。
为什么需要响应修复?
大语言模型偶尔会生成无效的 JSON,特别是在复杂场景中:
- Markdown 包装:模型经常将 JSON 包装在代码块中,如 ```json...```
- 混合内容:JSON 前后可能有解释性文本
- 语法错误:尾随逗号、未加引号的键或使用单引号而不是双引号
- 截断输出:Token 限制可能在 JSON 中间截断响应
响应修复自动检测并修复这些问题,省去你为每种可能的格式错误响应实现错误处理的工作。
启用响应修复
要启用响应修复,在请求的 plugins 数组中添加 response-healing:
curl -X POST "https://api.uniterouter.ai/v1/chat/completions" \
-H "Authorization: Bearer $UNITEROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [{"role": "user", "content": "返回一个包含 name 和 age 的 JSON 对象"}],
"response_format": {"type": "json_object"},
"plugins": [{"id": "response-healing"}]
}'响应修复仅在 response_format 设置为 json_object 或 json_schema 时激活。对于普通文本响应,该插件不起作用。
工作原理
启用响应修复后,UniterRouter 对格式错误的 JSON 响应应用一系列修复策略:
1. Markdown 提取
从 markdown 代码块中提取 JSON:
这是数据:
\`\`\`json
{"name": "Alice", "age": 30}
\`\`\`变成:
{ "name": "Alice", "age": 30 }2. 混合内容提取
从周围文本中分离 JSON:
好的!这是你请求的 JSON:{"name": "Alice", "age": 30} 如果需要其他帮助请告诉我。变成:
{ "name": "Alice", "age": 30 }3. 语法修复
修复常见的 JSON 语法错误:
| 问题 | 修复前 | 修复后 |
|---|---|---|
| 尾随逗号 | {"a": 1,} | {"a": 1} |
| 未加引号的键 | {name: "Alice"} | {"name": "Alice"} |
| 单引号 | {'name': 'Alice'} | {"name": "Alice"} |
4. 截断补全
为截断的响应添加缺失的闭合括号:
{"name": "Alice", "data": {"nested": true变成:
{ "name": "Alice", "data": { "nested": true } }使用示例
使用 JSON 对象格式
请求带自动修复的结构化响应:
const response = await fetch("https://api.uniterouter.ai/v1/chat/completions", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.UNITEROUTER_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "gpt-4o",
messages: [
{
role: "user",
content:
"返回一个包含字段的 JSON 对象:name(字符串)和 age(数字)",
},
],
response_format: { type: "json_object" },
plugins: [{ id: "response-healing" }],
}),
});
const result = await response.json();
// 响应保证是有效的 JSON
const data = JSON.parse(result.choices[0].message.content);使用 JSON Schema
为了更严格的验证,结合 json_schema 使用:
const response = await fetch("https://api.uniterouter.ai/v1/chat/completions", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.UNITEROUTER_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "gpt-4o",
messages: [
{
role: "user",
content: "生成一个用户档案",
},
],
response_format: {
type: "json_schema",
json_schema: {
name: "user_profile",
schema: {
type: "object",
required: ["name", "email"],
properties: {
name: { type: "string" },
email: { type: "string" },
age: { type: "number" },
},
},
},
},
plugins: [{ id: "response-healing" }],
}),
});
const result = await response.json();修复元数据
当响应被修复时,修复方法会被记录以供调试。可能应用的修复方法包括:
| 方法 | 描述 |
|---|---|
markdown_extraction | 从 markdown 代码块中提取 JSON |
mixed_content_extraction | 从周围文本中提取 JSON |
syntax_fix | 修复了尾随逗号、引号或键 |
truncation_completion | 添加了缺失的闭合括号 |
combined_strategies | 应用了多种策略 |
限制
响应修复仅适用于非流式请求。流式响应按原样返回,不进行修复。
响应修复最适合:
- 简单到中等复杂的 JSON 结构
- LLM 常见的格式问题
它可能无法修复:
- 严重损坏或无意义的输出
- 有多个问题的复杂嵌套结构
- 不包含任何可识别 JSON 的响应
最佳实践
结合结构化提示使用
将响应修复与清晰的指令结合使用以获得最佳结果:
const response = await fetch("https://api.uniterouter.ai/v1/chat/completions", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.UNITEROUTER_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "gpt-4o",
messages: [
{
role: "system",
content: "始终用有效的 JSON 响应。不要解释。",
},
{
role: "user",
content: "将三种颜色列为 JSON 数组",
},
],
response_format: { type: "json_object" },
plugins: [{ id: "response-healing" }],
}),
});
const result = await response.json();验证关键数据
对于关键应用,在代码中验证修复后的 JSON:
const result = await response.json();
const content = result.choices[0].message.content;
const data = JSON.parse(content);
// 添加你自己的验证
if (!data.name || typeof data.name !== "string") {
throw new Error("无效响应:缺少 name");
}监控修复率
如果你注意到日志中频繁的修复,考虑:
- 改进提示以请求更干净的 JSON
- 使用 JSON 输出更好的模型(如 GPT-4o、Claude 3.5)
- 在提示中添加明确的 JSON 示例
How is this guide?