# -*- coding: utf-8 -*-
"""diag-cloudpc.py —— 云电脑一键体检：配置 / 启动脚本 / 日志报错 / 直连实测
输出全部贴回来即可。
"""
import glob
import os
import subprocess
import sys
import time
import urllib.request

HOME = os.environ.get("LOCALAPPDATA", "") + r"\hermes"
CAND = [os.path.join(HOME, "config.yaml"), r"D:\soft\hermes\config.yaml",
        r"D:\Program Files\hermes\config.yaml"]
cfg = next((p for p in CAND if os.path.isfile(p)), None)
print("=== 1) 配置文件 ===")
print("找到:", cfg or "❌ 没找到")
model = {}
if cfg:
    try:
        import yaml
        d = yaml.safe_load(open(cfg, encoding="utf-8")) or {}
        m = d.get("model") or {}
        model = m
        print("  provider      :", m.get("provider"))
        print("  model         :", m.get("name") or m.get("model"))
        print("  base_url      :", m.get("base_url"))
        print("  api_key       :", ("有(%d字符)" % len(str(m.get("api_key") or ""))))
        tg = (d.get("telegram") or {})
        print("  telegram.proxy_url:", tg.get("proxy_url") or "(未设置)")
        fb = (d.get("fallback") or m.get("fallback") or d.get("fallback_models") or [])
        if isinstance(fb, list):
            print("  fallback 链 %d 条:" % len(fb))
            for i, e in enumerate(fb[:8], 1):
                if isinstance(e, dict):
                    print("    %d) %s @ %s" % (i, e.get("model") or e.get("name"), e.get("provider")))
                else:
                    print("    %d) %s" % (i, e))
    except Exception as e:
        print("  解析失败:", e)

print("\n=== 2) 启动脚本里的代理/环境 ===")
for bat in glob.glob(r"D:\soft\hermes\*.bat") + glob.glob(r"D:\Program Files\hermes\*.bat"):
    try:
        txt = open(bat, encoding="utf-8", errors="ignore").read().splitlines()
    except Exception:
        continue
    hits = [l.strip() for l in txt if any(k in l.upper() for k in
            ("PROXY", "HERMES_HOME", "PYTHONUTF8", "GATEWAY"))]
    if hits:
        print(" ", os.path.basename(bat) + ":")
        for h in hits:
            print("     ", h)

print("\n=== 3) 代理环境变量（当前进程）===")
for k in ("HTTP_PROXY", "HTTPS_PROXY", "ALL_PROXY", "NO_PROXY", "TELEGRAM_PROXY"):
    print("  %-15s = %s" % (k, os.environ.get(k) or "(空)"))

print("\n=== 4) 直连出口 IP ===")
for url in ("https://ipinfo.io/ip", "https://ifconfig.me/ip"):
    try:
        r = urllib.request.build_opener(urllib.request.ProxyHandler({})).open(url, timeout=10)
        print("  直连:", r.read().decode().strip(), "(via %s)" % url)
        break
    except Exception as e:
        print("  直连探测失败(%s): %s" % (url, str(e)[:60]))

print("\n=== 5) hermes 进程 ===")
try:
    out = subprocess.run(["powershell", "-NoProfile", "-Command",
                          "Get-CimInstance Win32_Process | Where-Object { $_.Name -match 'python|hermes' } | "
                          "Select-Object ProcessId,Name,CreationDate | Format-Table -AutoSize"],
                         capture_output=True, text=True, timeout=60)
    print(out.stdout[:1200] or "(无)")
except Exception as e:
    print("  查询失败:", e)

print("\n=== 6) 日志最近报错 ===")
for lg in (r"D:\soft\hermes\hermes.log",
           os.path.join(HOME, "logs", "gateway.log"),
           os.path.expanduser("~/.hermes/logs/gateway.log")):
    if not os.path.isfile(lg):
        continue
    print(" --", lg)
    try:
        tail = open(lg, encoding="utf-8", errors="ignore").read().splitlines()[-300:]
    except Exception as e:
        print("    读取失败:", e)
        continue
    hits = [l for l in tail if any(k in l for k in ("ERROR", "502", "429", "InternalServer", "failed", "refused", "timed out"))]
    for l in hits[-8:]:
        print("   ", l[:190])
    if not hits:
        print("    (最近 300 行无报错)")

print("\n=== 7) 直连实测（发一次真实对话，模拟真实长度）===")
base = str(model.get("base_url") or "").rstrip("/")
key = str(model.get("api_key") or "")
mname = model.get("name") or model.get("model") or "glm-5.3"
if base and key:
    import json
    body = json.dumps({"model": mname, "max_tokens": 8,
                       "messages": [{"role": "user", "content": "只回复OK。" + "占位文本。" * 150}]}).encode()
    req = urllib.request.Request(base + "/chat/completions", data=body,
                                 headers={"Content-Type": "application/json",
                                          "Authorization": "Bearer " + key})
    op = urllib.request.build_opener(urllib.request.ProxyHandler({}))
    t0 = time.time()
    try:
        r = op.open(req, timeout=120)
        print("  OK %s @ %s -> HTTP %s (%.1fs)" % (mname, base, r.status, time.time() - t0))
    except Exception as e:
        print("  ❌ %s @ %s -> %s: %s" % (mname, base, type(e).__name__, str(e)[:100]))
else:
    print("  跳过（配置里没读到 base_url/api_key）")
print("\n=== 体检结束，把以上全部内容贴回给我 ===")
