""" Hermes Agent 桥接层 — 将苏格拉底 prompt 发送给 Hermes 获取引导回复 """ import os import subprocess import json def call_hermes(prompt: str, model: str = None) -> str: """ 调用 Hermes CLI 获取苏格拉底式引导回复。 优先使用环境变量配置的 provider/model,否则走轻量 deepseek。 """ provider = os.environ.get("HERMES_PROVIDER", "deepseek") model_name = model or os.environ.get("HERMES_MODEL", "deepseek-chat") # 方式1: Hermes CLI(首选 — 如果已安装) try: result = subprocess.run( ["hermes", "ask", prompt, "--provider", provider, "--model", model_name, "--max-tokens", "300", "--temperature", "0.7"], capture_output=True, text=True, timeout=10, cwd=os.path.expanduser("~/.hermes/hermes-agent") ) if result.returncode == 0 and result.stdout.strip(): return result.stdout.strip() except (FileNotFoundError, subprocess.TimeoutExpired): pass # 方式2: 直接用 OpenAI 兼容 API(如有 key) try: import openai api_key = os.environ.get("DEEPSEEK_API_KEY") or os.environ.get("OPENAI_API_KEY") if not api_key: raise ValueError("no key") base_url = os.environ.get("DEEPSEEK_BASE_URL", "https://api.deepseek.com/v1") client = openai.OpenAI(api_key=api_key, base_url=base_url) resp = client.chat.completions.create( model=model_name, messages=[{"role": "user", "content": prompt}], max_tokens=300, temperature=0.7, timeout=10 ) return resp.choices[0].message.content except Exception: # 降级:返回预设引导 return _fallback_response(prompt) def _fallback_response(prompt: str) -> str: """无 LLM 时的预设引导回复""" if "分数" in prompt or "几分" in prompt: return "我们来分一块披萨吧!🍕 如果你把披萨切成4块,拿1块——那是几分之几呢?试试在画板上画一下?" elif "乘" in prompt or "×" in prompt: return "乘法其实就是「几个几相加」。比如3×4,就是3个4加起来。你能用小圆点画出来吗?🎨" elif "面积" in prompt or "周长" in prompt: return "想象一块地板,铺满了小瓷砖。数一数有多少块瓷砖,那就是面积!在画板上画一下你的图形吧。" else: return "好问题!我们一起来探索。你能先告诉我:你已经知道了什么?🤔"