jsonio.py 863 B

123456789101112131415161718192021222324
  1. """从 LLM 文本输出里稳健地取出 JSON。各 integration / stage 共用,避免重复。"""
  2. from __future__ import annotations
  3. import json
  4. from typing import Any
  5. from core.text_limits import JSON_ERROR_SNIPPET_MAX_CHARS, clip_text
  6. def extract_json_object(text: str) -> dict:
  7. """取第一个 { 到最后一个 } 的切片解析为 dict。
  8. 天然容忍 ```json fences、前后多余说明文字(它们都在大括号之外)。
  9. """
  10. start, end = text.find("{"), text.rfind("}")
  11. if start == -1 or end == -1 or end < start:
  12. raise ValueError(f"no json object in output: {clip_text(text, JSON_ERROR_SNIPPET_MAX_CHARS)!r}")
  13. return json.loads(text[start : end + 1])
  14. def to_bool(value: Any) -> bool:
  15. if isinstance(value, bool):
  16. return value
  17. return str(value).strip().lower() in ("1", "true", "yes", "是")