UniterRouter
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?