import asyncio
import json
import re
import requests


# ===============================
# 1) 最小 async LLM 调用（等价 curl）
# ===============================
async def qwen_chat_async(prompt: str) -> str:
    def _call():
        url = "http://192.168.91.253:8003/v1/chat/completions"
        headers = {
            "Content-Type": "application/json",
            "Authorization": "Bearer sk-123456",
        }
        payload = {
            "model": "qwen3-30b",
            "messages": [{"role": "user", "content": prompt}],
        }
        resp = requests.post(url, json=payload, headers=headers, timeout=60)
        resp.raise_for_status()
        return resp.json()["choices"][0]["message"]["content"]

    loop = asyncio.get_running_loop()
    return await loop.run_in_executor(None, _call)


# ===============================
# 2) 相关性判断提示词（只要 true/false）
# ===============================
def build_relevance_prompt(text_a: str, text_b: str) -> str:
    return f"""
你是信息检索与规范审查专家。

任务：
判断【文本B】是否与【文本A】相关（可用于支撑审查引用/解释/依据）。

输出要求（非常重要）：
- 只能输出严格 JSON
- 不要任何解释文字
- JSON 格式必须严格如下：
{{"relevant": true}} 或 {{"relevant": false}}

【文本A】：
{text_a}

【文本B】：
{text_b}
""".strip()


# ===============================
# 3) 对外函数：只返回 True / False
# ===============================
async def is_relevant_async(text_a: str, text_b: str) -> bool:
    prompt = build_relevance_prompt(text_a, text_b)
    out = await qwen_chat_async(prompt)

    if not out:
        return False

    # 尝试解析 JSON
    try:
        obj = json.loads(out)
    except Exception:
        # 尝试从输出中提取 {...}
        m = re.search(r"\{[\s\S]*\}", out)
        if not m:
            return False
        try:
            obj = json.loads(m.group(0))
        except Exception:
            return False

    return bool(obj.get("relevant", False))
