浏览代码

feat(api): use `json_repair` to fix invalid json while generating structured output (#18977)

When generating JSON schema using an LLM in the structured output feature,
models may occasionally return invalid JSON, which prevents clients from correctly 
parsing the response and can lead to UI breakage.

This commit addresses the issue by introducing `json_repair` to automatically 
fix invalid JSON strings returned by the LLM, ensuring smoother functionality 
and better client-side handling of structured outputs.


Co-authored-by: lizb <lizb@sugon.com>
tags/1.4.0
Ganondorf 6 个月前
父节点
当前提交
a147d2a200
没有帐户链接到提交者的电子邮件
共有 1 个文件被更改,包括 16 次插入1 次删除
  1. 16
    1
      api/core/llm_generator/llm_generator.py

+ 16
- 1
api/core/llm_generator/llm_generator.py 查看文件

import re import re
from typing import Optional, cast from typing import Optional, cast


import json_repair

from core.llm_generator.output_parser.rule_config_generator import RuleConfigGeneratorOutputParser from core.llm_generator.output_parser.rule_config_generator import RuleConfigGeneratorOutputParser
from core.llm_generator.output_parser.suggested_questions_after_answer import SuggestedQuestionsAfterAnswerOutputParser from core.llm_generator.output_parser.suggested_questions_after_answer import SuggestedQuestionsAfterAnswerOutputParser
from core.llm_generator.prompts import ( from core.llm_generator.prompts import (
), ),
) )


generated_json_schema = cast(str, response.message.content)
raw_content = response.message.content

if not isinstance(raw_content, str):
raise ValueError(f"LLM response content must be a string, got: {type(raw_content)}")

try:
parsed_content = json.loads(raw_content)
except json.JSONDecodeError:
parsed_content = json_repair.loads(raw_content)

if not isinstance(parsed_content, dict | list):
raise ValueError(f"Failed to parse structured output from llm: {raw_content}")

generated_json_schema = json.dumps(parsed_content, indent=2, ensure_ascii=False)
return {"output": generated_json_schema, "error": ""} return {"output": generated_json_schema, "error": ""}


except InvokeError as e: except InvokeError as e:

正在加载...
取消
保存