#!/usr/bin/env python3
import json, time, uuid, sys, threading, queue
import requests
import websocket

BASE = "http://10.168.3.36:8081"

def login():
    r = requests.post(f"{BASE}/api/login", json={"username": "cxbsoft", "password": "cf5584aca177a811ffda8f4789e2e143"}, timeout=10)
    r.raise_for_status()
    data = r.json()
    token = data.get("access_token") or data.get("data", {}).get("access_token") or data.get("token")
    if not token:
        for k, v in data.items():
            if isinstance(v, dict):
                token = v.get("access_token") or v.get("token")
                if token:
                    break
    if not token:
        print("LOGIN_PAYLOAD:", json.dumps(data)[:500])
        sys.exit(1)
    return token

def main():
    token = login()
    url = f"ws://10.168.3.36:8081/api/user/friend-agent/ws?access_token={token}"
    ws = websocket.create_connection(url, timeout=30)
    pending = {}
    stop = False
    def read_loop():
        while not stop:
            try:
                msg = ws.recv()
            except Exception:
                return
            try:
                obj = json.loads(msg)
            except Exception:
                continue
            if obj.get("type") == "res" and obj.get("request_id") in pending:
                pending[obj["request_id"]].put(obj)
            else:
                print("  [push]", json.dumps(obj, ensure_ascii=False)[:200])
    t = threading.Thread(target=read_loop, daemon=True)
    t.start()
    time.sleep(1)
    for method, params in [
        ("llm.channels.list", {}),
        ("llm.model.probe", {"model_id": 1}),
    ]:
        rid = f"q-{uuid.uuid4().hex[:8]}"
        q = queue.Queue()
        pending[rid] = q
        ws.send(json.dumps({"type": "req", "request_id": rid, "method": method, "params": params}))
        try:
            resp = q.get(timeout=25)
            body = json.dumps(resp, ensure_ascii=False)
            print(f"[{method}] {body[:400]}")
        except queue.Empty:
            print(f"[{method}] TIMEOUT")
    stop = True
    ws.close()

if __name__ == "__main__":
    main()
