#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""逐题补生成缺失相似问法（单题成功率更高），写回 相似问法分片/sim-missing.json"""
import json, os, subprocess, re, uuid

BASE = "/home/zyw/Downloads/dl-hub/01-AI课程设计项目/知识库问答库"
ALL = json.load(open(os.path.join(BASE,"题目全集.json"), encoding='utf-8'))
S = os.path.expanduser("~/.dsh/skills/grok-run/scripts/grok-run.sh")
missing = json.load(open(os.path.join(BASE,"仍缺清单.json"), encoding='utf-8'))

def gen_one(nid):
    it = ALL[nid]
    q = re.sub(r'```python.*?```','【代码见原题】',it["q"],flags=re.S)
    if len(q) > 120: q = q[:117] + "…"
    prompt = ("你是AI课程问答库编辑。标准问题：「"+q+"」。请为它生成 3 条相似问法"
              "（等价问法：换措辞/换句式/口语化均可，不能改变答案语义，不能变反义）。"
              "只输出一个 JSON 数组，含 3 个字符串，每条 ≤80 字。除JSON数组外不要任何内容。")
    tmp = f"/tmp/simone-{uuid.uuid4().hex[:8]}.json"
    for attempt in range(3):
        subprocess.run(["bash",S,prompt,"--out",tmp,"--max-turns","20"],capture_output=True,text=True,timeout=600)
        txt = ""
        for c in (tmp, tmp+".final-text.txt"):
            try:
                if os.path.exists(c) and open(c,encoding='utf-8').read().strip():
                    txt = open(c,encoding='utf-8').read(); break
            except: pass
        m = re.search(r'\[.*?\]', txt, re.S)
        if m:
            vals = re.findall(r'"((?:[^"\\]|\\.)*)"', m.group(0))
            vals = [v.replace('\\"','"') for v in vals[:3]]
            if len(vals) >= 2:
                return vals
        prompt += "\n注意：上次未输出合法JSON数组，请只输出 JSON 数组。"
    return None

out = {}
for i, nid in enumerate(missing):
    r = gen_one(nid)
    if r:
        out[str(nid)] = r
        print(f"[{i+1}/{len(missing)}] {nid}: OK {len(r)}条", flush=True)
    else:
        print(f"[{i+1}/{len(missing)}] {nid}: 失败", flush=True)
json.dump(out, open(os.path.join(BASE,"相似问法分片","sim-missing.json"),"w",encoding='utf-8'), ensure_ascii=False, indent=1)
print("补题完成，成功:", len(out), "/", len(missing))
