import json import os import re import sys from pathlib import Path
from openai import OpenAI
defnumbered(label: str, text: str) -> tuple[str, int]: lines = [line.strip() for line in text.splitlines() if line.strip()] return"\n".join(f"{label}#{i}: {line}"for i, line inenumerate(lines, 1)), len(lines)
defvalidate_result(result: dict, counts: dict[str, int]) -> dict: required = {"summary", "criteria", "unknowns", "recommendation"} ifset(result) != required: raise ValueError("结果字段不完整,或包含未允许的字段") ifnotisinstance(result["summary"], str) ornot result["summary"].strip(): raise ValueError("summary 必须是非空字符串") if result["recommendation"] notin {"A", "B", "tie", "need_more_info"}: raise ValueError("recommendation 不是允许的值") ifnotisinstance(result["criteria"], list) ornot result["criteria"]: raise ValueError("criteria 必须是非空列表") reference_pattern = re.compile(r"^([AB])#([1-9][0-9]*)$") for item in result["criteria"]: ifset(item) != {"name", "winner", "evidence"}: raise ValueError("比较维度字段不正确") if item["winner"] notin {"A", "B", "tie", "unknown"}: raise ValueError("winner 不是允许的值") ifnotisinstance(item["evidence"], list) ornot item["evidence"]: raise ValueError("每个比较维度都必须有证据编号") for reference in item["evidence"]: match = reference_pattern.fullmatch(reference) ifnotmatchorint(match.group(2)) > counts[match.group(1)]: raise ValueError(f"不存在的证据编号:{reference}") ifnotisinstance(result["unknowns"], list) ornotall( isinstance(item, str) for item in result["unknowns"] ): raise ValueError("unknowns 必须是字符串列表") return result