"""Run after interactive Grok login; enable the provider only after a real reply.""" import json from pathlib import Path import re import subprocess import sys import time import requests def activate(): root = Path(__file__).resolve().parent config = json.loads((root / "grok-client.json").read_text(encoding="utf-8")) session = requests.Session() session.trust_env = False endpoint = config["public_url"] try: session.get(endpoint + "/health", timeout=3).raise_for_status() except requests.RequestException: pythonw = str(Path(sys.executable).with_name("pythonw.exe")) subprocess.Popen([pythonw, str(root / "launch_local.py")], cwd=root, creationflags=0x08000000 | 0x00000008) for _ in range(20): try: session.get(endpoint + "/health", timeout=1).raise_for_status() break except requests.RequestException: time.sleep(.5) else: raise RuntimeError("本地 Grok 兼容服务未能启动,请查看 grok-bridge.log") print("正在验证 Grok 登录状态和文本回复……") response = session.post(endpoint + "/v1/chat/completions", headers={"Authorization": "Bearer " + config["token"]}, json={"model": "grok-local", "messages": [{"role": "user", "content": "Reply with OK only."}]}, timeout=260) if not response.ok or not response.json().get("choices", [{}])[0].get("message", {}).get("content"): raise RuntimeError("Grok 仍无法生成回复,请完成 Grok CLI 登录后再试;火宝中的 Grok 保持停用。") huobao = Path.home() / "AppData/Roaming/HuobaoDrama" def app_url(): ports = re.findall(r"port=(\d+) userData=", (huobao / "logs/startup.log").read_text(encoding="utf-8")) return "http://127.0.0.1:" + ports[-1] + "/api/v1" try: base = app_url() session.get(base + "/health", timeout=3).raise_for_status() except (requests.RequestException, OSError, IndexError): executable = root.parent / "HuobaoDrama/HuobaoDrama.exe" subprocess.Popen([str(executable)], cwd=executable.parent) for _ in range(30): time.sleep(1) try: base = app_url() session.get(base + "/health", timeout=1).raise_for_status() break except (requests.RequestException, OSError, IndexError): pass else: raise RuntimeError("Grok 已登录,但火宝未启动,请打开火宝后重新运行此脚本") rows = session.get(base + "/ai-configs", timeout=10).json()["data"] row = next((r for r in rows if "grok-local" in r.get("model", []) and r["base_url"].startswith(endpoint)), None) if not row: raise RuntimeError("未找到已准备的 Grok 配置") session.put(base + "/ai-configs/" + str(row["id"]), json={"name": "Grok(本机)", "is_active": True}, timeout=10).raise_for_status() print("Grok 已通过实测并在火宝中启用。DeepSeek 仍是默认模型。") if __name__ == "__main__": try: activate() except Exception as error: print(str(error)) sys.exit(1)