math-tutor/tutor/hermes_bridge.py

66 lines
2.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
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 "好问题!我们一起来探索。你能先告诉我:你已经知道了什么?🤔"