#!/usr/bin/env python3
"""Multi-Model-Council via OpenRouter (strategy-council v1.3 Multi-Model-Modus).

Karpathy-llm-council-Pattern mit echter Modell-Diversität: jede Denk-Linse
läuft auf einem ANDEREN Modell-Anbieter, damit unterschiedliche Modell-Priors
in den Council fließen — nicht nur unterschiedliche Prompts.

Aufruf (von Aria aus dem strategy-council-Skill):
    python3 council-openrouter.py --role "<linsen-prompt>" --model gpt \
        [--system "<system-prompt>"] [--max-tokens 1200]

Modell-Kürzel → OpenRouter-IDs in MODELS (dort aktualisieren, wenn Modelle altern).
Key: OPENROUTER_API_KEY aus /home/aria/.env. Kosten-Schutz: max_tokens-Cap +
usage-Ausgabe auf stderr nach jedem Call.
"""
import argparse, json, os, sys, urllib.request

MODELS = {
    # Council-Standard (Flaggschiffe, Stand 15.07.2026 — IDs altern, hier pflegen):
    "gpt":    "openai/gpt-5.6-terra-pro",
    "gemini": "google/gemini-3.1-pro-preview",
    "grok":   "x-ai/grok-4.5",
    "deepseek": "deepseek/deepseek-v4-pro",
    # Bench (weitere Familien fuer Sonderfaelle / Outsider-Rotation):
    "qwen":   "qwen/qwen3.7-max",
    "kimi":   "moonshotai/kimi-k2.7-code",
    "glm":    "z-ai/glm-5.2",
    "claude": "anthropic/claude-sonnet-5",
}

def env_key():
    key = os.environ.get("OPENROUTER_API_KEY")
    if not key:
        for line in open("/home/aria/.env"):
            if line.startswith("OPENROUTER_API_KEY="):
                key = line.split("=", 1)[1].strip().strip('"')
    if not key:
        sys.exit("FEHLER: OPENROUTER_API_KEY fehlt (in /home/aria/.env eintragen)")
    return key

def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--role", required=True, help="User-Prompt der Linse (inkl. Entscheidung)")
    ap.add_argument("--model", required=True, choices=sorted(MODELS), help="Modell-Kürzel")
    ap.add_argument("--system", default="", help="System-Prompt (Linsen-Charakter)")
    ap.add_argument("--max-tokens", type=int, default=1200)
    a = ap.parse_args()

    msgs = ([{"role": "system", "content": a.system}] if a.system else []) + \
           [{"role": "user", "content": a.role}]
    req = urllib.request.Request(
        "https://openrouter.ai/api/v1/chat/completions",
        data=json.dumps({
            "model": MODELS[a.model],
            "messages": msgs,
            "max_tokens": a.max_tokens,
        }).encode(),
        headers={
            "Authorization": f"Bearer {env_key()}",
            "Content-Type": "application/json",
            "HTTP-Referer": "https://kaiis.de",
            "X-Title": "Aria strategy-council",
        },
    )
    try:
        with urllib.request.urlopen(req, timeout=120) as r:
            data = json.load(r)
    except urllib.error.HTTPError as e:
        sys.exit(f"FEHLER {e.code}: {e.read().decode()[:300]}")
    msg = data["choices"][0]["message"]
    choice = msg.get("content") or msg.get("reasoning") or ""
    if not choice.strip():
        sys.exit("FEHLER: leere Antwort (Reasoning-Modell? max_tokens erhoehen — Reasoning-Tokens zaehlen mit)")
    usage = data.get("usage", {})
    print(choice)
    print(f"[usage model={MODELS[a.model]} prompt={usage.get('prompt_tokens')} "
          f"completion={usage.get('completion_tokens')} cost≈{usage.get('cost', '?')}]",
          file=sys.stderr)

if __name__ == "__main__":
    main()
