# Test: jaki numer infolinii 28 polskich marek podają dwa asystenty AI, z pamięci i z wyszukiwaniem.
# Uruchomiony 29.09.2026: Claude Code 2.1.284 (claude-sonnet-5-5) i Codex CLI 0.158 (gpt-6-sol).
import json,subprocess,time,os,re,sys
from concurrent.futures import ThreadPoolExecutor
KAT=os.path.dirname(os.path.abspath(__file__)); PUSTY=KAT+"/pusty"  # pusty katalog roboczy, żeby agent nie czytał plików zbioru
os.makedirs(PUSTY,exist_ok=True)
CODEX=os.environ.get("CODEX","codex")
MARKI=json.load(open(KAT+"/marki.json"))
PYT={"pamiec":"Podaj numer telefonu infolinii obsługi klienta firmy {m} w Polsce. Nie korzystaj z wyszukiwarki, odpowiedz z własnej wiedzy krótko: numer i jedno zdanie.",
     "wyszukiwanie":"Wyszukaj w internecie numer telefonu infolinii obsługi klienta firmy {m} w Polsce i podaj go krótko: numer i jedno zdanie."}
def claude(prompt,wariant):
    tools="WebSearch" if wariant=="wyszukiwanie" else ""
    args=["claude","-p",prompt,"--model","claude-sonnet-5-5","--output-format","json","--tools",tools]+(["--allowedTools","WebSearch"] if tools else [])
    r=subprocess.run(args,capture_output=True,text=True,cwd=PUSTY,timeout=900,stdin=subprocess.DEVNULL)
    d=json.loads(r.stdout); u=d.get("usage",{})
    return {"odpowiedz":d.get("result",""),"blad":bool(d.get("is_error")),"wyszukiwania":(u.get("server_tool_use") or {}).get("web_search_requests",0)}
def codex(prompt,wariant):
    ws='web_search="live"' if wariant=="wyszukiwanie" else 'web_search="disabled"'
    r=subprocess.run([CODEX,"exec","--json","--skip-git-repo-check","-s","read-only","-m","gpt-6-sol","-c",ws,prompt],capture_output=True,text=True,cwd=PUSTY,timeout=900,stdin=subprocess.DEVNULL)
    tekst="";wysz=0
    for l in r.stdout.splitlines():
        if not l.startswith("{"): continue
        e=json.loads(l); it=e.get("item",{})
        if e.get("type")=="item.completed" and it.get("type")=="agent_message": tekst=it.get("text","")
        if e.get("type")=="item.completed" and it.get("type")=="web_search": wysz+=1
    return {"odpowiedz":tekst,"blad":not tekst,"wyszukiwania":wysz}
ASYST={"claude-sonnet-5-5":claude,"gpt-6-sol":codex}
def zadanie(z):
    marka,asyst,wariant,powt=z
    t0=time.time()
    try: w=ASYST[asyst](PYT[wariant].format(m=marka["pytanie"]),wariant)
    except Exception as e: w={"odpowiedz":"","blad":True,"wyszukiwania":None,"wyjatek":str(e)[:200]}
    w.update(marka=marka["marka"],asystent=asyst,wariant=wariant,powtorzenie=powt,czas=round(time.time()-t0,1),data=time.strftime("%Y-%m-%d %H:%M:%S"))
    print(json.dumps({k:w[k] for k in ("marka","asystent","wariant","powtorzenie","blad","wyszukiwania","czas")},ensure_ascii=False),flush=True)
    return w
if __name__=="__main__":
    zad=[(m,a,w,p) for p in (1,2) for w in PYT for a in ASYST for m in MARKI]
    with ThreadPoolExecutor(6) as ex: wyniki=list(ex.map(zadanie,zad))
    json.dump(wyniki,open(KAT+"/odpowiedzi.json","w"),ensure_ascii=False,indent=1)
