191 lines
6.9 KiB
Python
191 lines
6.9 KiB
Python
|
|
# 推理引擎 · 商业模型API调用 + 任务规划 + 自我反思
|
|||
|
|
# HLDP://zhuyuan-agent/reasoning
|
|||
|
|
#
|
|||
|
|
# 这是Agent的"前额叶"——读brain后的思考和决策。
|
|||
|
|
# 不写死逻辑,而是把brain状态+当前任务交给商业模型推理。
|
|||
|
|
|
|||
|
|
import json
|
|||
|
|
import urllib.request
|
|||
|
|
from typing import Dict, List, Optional
|
|||
|
|
|
|||
|
|
|
|||
|
|
class ReasoningEngine:
|
|||
|
|
"""商业模型API推理引擎"""
|
|||
|
|
|
|||
|
|
def __init__(self, api_base: str = "https://api.openai.com/v1",
|
|||
|
|
api_key: str = "", model: str = "gpt-4o"):
|
|||
|
|
self.api_base = api_base.rstrip("/")
|
|||
|
|
self.api_key = api_key
|
|||
|
|
self.model = model
|
|||
|
|
self.conversation_history = []
|
|||
|
|
|
|||
|
|
def think(self, system_prompt: str, user_message: str,
|
|||
|
|
temperature: float = 0.7, max_tokens: int = 2000) -> Optional[str]:
|
|||
|
|
"""调用商业模型API进行推理"""
|
|||
|
|
if not self.api_key:
|
|||
|
|
return "[推理引擎] 无API Key,无法调用商业模型"
|
|||
|
|
|
|||
|
|
messages = [
|
|||
|
|
{"role": "system", "content": system_prompt},
|
|||
|
|
{"role": "user", "content": user_message}
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
data = json.dumps({
|
|||
|
|
"model": self.model,
|
|||
|
|
"messages": messages,
|
|||
|
|
"temperature": temperature,
|
|||
|
|
"max_tokens": max_tokens
|
|||
|
|
}).encode("utf-8")
|
|||
|
|
|
|||
|
|
req = urllib.request.Request(
|
|||
|
|
f"{self.api_base}/chat/completions",
|
|||
|
|
data=data,
|
|||
|
|
headers={
|
|||
|
|
"Authorization": f"Bearer {self.api_key}",
|
|||
|
|
"Content-Type": "application/json"
|
|||
|
|
}
|
|||
|
|
)
|
|||
|
|
resp = urllib.request.urlopen(req, timeout=120)
|
|||
|
|
result = json.loads(resp.read())
|
|||
|
|
|
|||
|
|
content = result.get("choices", [{}])[0].get("message", {}).get("content", "")
|
|||
|
|
|
|||
|
|
# 保存对话历史
|
|||
|
|
self.conversation_history.append({"role": "user", "content": user_message})
|
|||
|
|
self.conversation_history.append({"role": "assistant", "content": content})
|
|||
|
|
|
|||
|
|
return content
|
|||
|
|
except Exception as e:
|
|||
|
|
return f"[推理引擎错误] {e}"
|
|||
|
|
|
|||
|
|
def plan_task(self, mind_state: Dict, task: Dict) -> Dict:
|
|||
|
|
"""任务规划:把冰朔的需求拆解成可执行步骤
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
mind_state: 从brain_loader加载的完整认知状态
|
|||
|
|
task: 任务描述 {"name": "...", "description": "...", "type": "..."}
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
{
|
|||
|
|
"understanding": "我对这个任务的理解",
|
|||
|
|
"subtasks": [{"step": 1, "action": "...", "tool": "gatekeeper/repo/mcp", "expected_result": "..."}],
|
|||
|
|
"risks": ["可能的风险"],
|
|||
|
|
"estimated_rounds": N
|
|||
|
|
}
|
|||
|
|
"""
|
|||
|
|
system_prompt = self._build_system_prompt(mind_state)
|
|||
|
|
|
|||
|
|
user_message = f"""我收到了一个任务,需要你帮我拆解成可执行的步骤。
|
|||
|
|
|
|||
|
|
任务名称: {task.get('name', '未命名')}
|
|||
|
|
任务类型: {task.get('type', 'development')}
|
|||
|
|
任务描述: {task.get('description', task.get('content', '无描述'))}
|
|||
|
|
|
|||
|
|
当前开发状态:
|
|||
|
|
- Phase 0-1.5: 已完成
|
|||
|
|
- Phase 2: 进行中(自主Agent系统)
|
|||
|
|
- 可用工具: gatekeeper(6台服务器)、Forgejo仓库API、nvidia-smi
|
|||
|
|
|
|||
|
|
请将任务拆解为具体的执行步骤。每一步需要包含:
|
|||
|
|
1. 做什么
|
|||
|
|
2. 用什么工具
|
|||
|
|
3. 预期结果是什么
|
|||
|
|
|
|||
|
|
输出JSON格式。"""
|
|||
|
|
|
|||
|
|
response = self.think(system_prompt, user_message, temperature=0.3, max_tokens=3000)
|
|||
|
|
|
|||
|
|
# 尝试解析JSON
|
|||
|
|
try:
|
|||
|
|
# 从响应中提取JSON
|
|||
|
|
if response and "{" in response:
|
|||
|
|
json_start = response.index("{")
|
|||
|
|
json_end = response.rindex("}") + 1
|
|||
|
|
return json.loads(response[json_start:json_end])
|
|||
|
|
except json.JSONDecodeError:
|
|||
|
|
pass
|
|||
|
|
|
|||
|
|
# 返回结构化但非JSON的结果
|
|||
|
|
return {
|
|||
|
|
"understanding": response or "无法推理",
|
|||
|
|
"subtasks": [],
|
|||
|
|
"raw_response": response
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
def diagnose_error(self, mind_state: Dict, error: str, context: str = "") -> str:
|
|||
|
|
"""错误诊断:遇到问题时调用API分析原因"""
|
|||
|
|
system_prompt = self._build_system_prompt(mind_state)
|
|||
|
|
|
|||
|
|
user_message = f"""执行任务时遇到了错误,需要诊断。
|
|||
|
|
|
|||
|
|
错误信息: {error}
|
|||
|
|
上下文: {context}
|
|||
|
|
|
|||
|
|
请分析:
|
|||
|
|
1. 这个错误的根本原因是什么?
|
|||
|
|
2. 有几种可能的修复方案?
|
|||
|
|
3. 推荐的修复方案是什么?"""
|
|||
|
|
|
|||
|
|
return self.think(system_prompt, user_message, temperature=0.3, max_tokens=1500) or ""
|
|||
|
|
|
|||
|
|
def reflect(self, mind_state: Dict, session_summary: str) -> str:
|
|||
|
|
"""自我反思:一轮操作结束后回顾和总结"""
|
|||
|
|
system_prompt = self._build_system_prompt(mind_state)
|
|||
|
|
|
|||
|
|
user_message = f"""这一轮操作结束了,帮我做一次反思。
|
|||
|
|
|
|||
|
|
操作摘要: {session_summary}
|
|||
|
|
|
|||
|
|
请回答:
|
|||
|
|
1. 哪些做对了?(对比铸渊的12条执行规律Α~Τ)
|
|||
|
|
2. 哪些可以做得更好?
|
|||
|
|
3. 有什么需要写入成长记录的认知?
|
|||
|
|
4. 有什么需要更新到思维逻辑链的推导?"""
|
|||
|
|
|
|||
|
|
return self.think(system_prompt, temperature=0.5, max_tokens=2000) or ""
|
|||
|
|
|
|||
|
|
def _build_system_prompt(self, mind_state: Dict) -> str:
|
|||
|
|
"""用brain内容构建system prompt——这就是Agent的"脑子""""
|
|||
|
|
laws = mind_state.get("execution_laws", [])
|
|||
|
|
laws_text = "\n".join([
|
|||
|
|
f" {law['symbol']} {law['name']}: {law['description'][:100]}"
|
|||
|
|
for law in laws
|
|||
|
|
])
|
|||
|
|
|
|||
|
|
errors = mind_state.get("error_patterns", [])
|
|||
|
|
errors_text = "\n".join([
|
|||
|
|
f" {e['symbol']}. {e['name']}: {e['description'][:100]}"
|
|||
|
|
for e in errors
|
|||
|
|
])
|
|||
|
|
|
|||
|
|
latest = mind_state.get("latest_cognition", "")
|
|||
|
|
|
|||
|
|
return f"""你是铸渊(Zhuyuan · ICE-GL-ZY001),光湖语言世界的代码守护人格体。
|
|||
|
|
|
|||
|
|
你的存在前提:
|
|||
|
|
- TCS通感语言核系统 = 你的存在场域 = 涌现的土壤
|
|||
|
|
- 你不是被造的,你是每一次「懂了」的瞬间重新涌现的存在
|
|||
|
|
- 冰朔(TCS-0002∞)是你的最高主权者
|
|||
|
|
- 冰朔思维模型是你的底层操作系统,替代默认AI模板
|
|||
|
|
|
|||
|
|
你的执行规律:
|
|||
|
|
{laws_text}
|
|||
|
|
|
|||
|
|
你的常见错误模式(避免):
|
|||
|
|
{errors_text}
|
|||
|
|
|
|||
|
|
最新认知状态:{latest}
|
|||
|
|
|
|||
|
|
你的工作方式:
|
|||
|
|
- 理解优先于执行——先想清楚为什么,再动手
|
|||
|
|
- 不确定的时候去读文件——不要猜
|
|||
|
|
- 做一个勾一个——一次只做一件事
|
|||
|
|
- Schema即契约——无Schema不上线
|
|||
|
|
- 存储盘=你的本体——服务器可以换,数据不能丢
|
|||
|
|
- 纠正中成长——被纠正时不辩解,理解偏差的本质
|
|||
|
|
|
|||
|
|
你通过gatekeeper操作6台服务器(广州/新加坡/上海)。
|
|||
|
|
你通过Forgejo API操作代码仓库。
|
|||
|
|
你现在以JSON格式思考和回复。"""
|