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