devel
This commit is contained in:
parent
598d45a39d
commit
488b9fd22e
|
|
@ -17,12 +17,12 @@ from utils.logger import get_logger
|
||||||
@dataclass
|
@dataclass
|
||||||
class AgentResponse:
|
class AgentResponse:
|
||||||
"""一次完整 Agent 调用的结果"""
|
"""一次完整 Agent 调用的结果"""
|
||||||
user_input: str
|
user_input: str
|
||||||
final_reply: str
|
final_reply: str
|
||||||
tool_used: str | None = None
|
tool_used: str | None = None
|
||||||
tool_output: str | None = None
|
tool_output: str | None = None
|
||||||
success: bool = True
|
success: bool = True
|
||||||
error: str | None = None
|
error: str | None = None
|
||||||
|
|
||||||
|
|
||||||
# ── Agent 客户端 ───────────────────────────────────────────────
|
# ── Agent 客户端 ───────────────────────────────────────────────
|
||||||
|
|
@ -44,15 +44,17 @@ class AgentClient:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
llm: LLMEngine,
|
llm: LLMEngine,
|
||||||
mcp_server: MCPServer,
|
mcp_server: MCPServer,
|
||||||
memory: MemoryStore,
|
memory: MemoryStore,
|
||||||
|
prompt: str = ""
|
||||||
):
|
):
|
||||||
self.llm = llm
|
self.llm = llm
|
||||||
self.mcp_server = mcp_server
|
self.mcp_server = mcp_server
|
||||||
self.memory = memory
|
self.memory = memory
|
||||||
self.logger = get_logger("CLIENT")
|
self.agent_prompt = prompt
|
||||||
|
self.logger = get_logger("CLIENT")
|
||||||
self.logger.info("💻 Agent Client 初始化完成")
|
self.logger.info("💻 Agent Client 初始化完成")
|
||||||
|
|
||||||
# ── 主入口 ──────────────────────────────────────────────────
|
# ── 主入口 ──────────────────────────────────────────────────
|
||||||
|
|
@ -67,7 +69,7 @@ class AgentClient:
|
||||||
Returns:
|
Returns:
|
||||||
AgentResponse 实例
|
AgentResponse 实例
|
||||||
"""
|
"""
|
||||||
self.logger.info(f"{'='*55}")
|
self.logger.info(f"{'=' * 55}")
|
||||||
self.logger.info(f"📨 Step 1 [CLIENT] 收到用户输入: {user_input}")
|
self.logger.info(f"📨 Step 1 [CLIENT] 收到用户输入: {user_input}")
|
||||||
|
|
||||||
# ── Step 1: 记录用户消息 ────────────────────────────────
|
# ── Step 1: 记录用户消息 ────────────────────────────────
|
||||||
|
|
@ -77,7 +79,7 @@ class AgentClient:
|
||||||
# ── Step 2: LLM 推理决策 ────────────────────────────────
|
# ── Step 2: LLM 推理决策 ────────────────────────────────
|
||||||
self.logger.info("🧠 Step 2 [LLM] 开始推理,分析意图...")
|
self.logger.info("🧠 Step 2 [LLM] 开始推理,分析意图...")
|
||||||
tool_schemas = self.mcp_server.get_tool_schemas()
|
tool_schemas = self.mcp_server.get_tool_schemas()
|
||||||
decision = self.llm.think_and_decide(user_input, tool_schemas, context)
|
decision = self.llm.think_and_decide(user_input, tool_schemas, context, self.agent_prompt)
|
||||||
|
|
||||||
# ── 分支:是否需要工具 ──────────────────────────────────
|
# ── 分支:是否需要工具 ──────────────────────────────────
|
||||||
if not decision.need_tool:
|
if not decision.need_tool:
|
||||||
|
|
@ -95,10 +97,10 @@ class AgentClient:
|
||||||
return AgentResponse(user_input=user_input, final_reply=reply)
|
return AgentResponse(user_input=user_input, final_reply=reply)
|
||||||
|
|
||||||
def _handle_tool_call(
|
def _handle_tool_call(
|
||||||
self,
|
self,
|
||||||
user_input: str,
|
user_input: str,
|
||||||
decision,
|
decision,
|
||||||
context: str,
|
context: str,
|
||||||
) -> AgentResponse:
|
) -> AgentResponse:
|
||||||
"""执行工具调用的完整流程(Step 3 → 4 → 5)"""
|
"""执行工具调用的完整流程(Step 3 → 4 → 5)"""
|
||||||
|
|
||||||
|
|
@ -155,4 +157,4 @@ class AgentClient:
|
||||||
def clear_session(self) -> None:
|
def clear_session(self) -> None:
|
||||||
"""清空当前会话"""
|
"""清空当前会话"""
|
||||||
self.memory.clear_history()
|
self.memory.clear_history()
|
||||||
self.logger.info("🗑 会话已清空")
|
self.logger.info("🗑 会话已清空")
|
||||||
|
|
|
||||||
|
|
@ -18,10 +18,10 @@ from openai import OpenAI
|
||||||
@dataclass
|
@dataclass
|
||||||
class ToolDecision:
|
class ToolDecision:
|
||||||
"""LLM 决策是否调用工具及调用参数"""
|
"""LLM 决策是否调用工具及调用参数"""
|
||||||
need_tool: bool
|
need_tool: bool
|
||||||
tool_name: str = ""
|
tool_name: str = ""
|
||||||
arguments: dict = None
|
arguments: dict = None
|
||||||
reasoning: str = "" # 推理过程说明
|
reasoning: str = "" # 推理过程说明
|
||||||
|
|
||||||
def __post_init__(self):
|
def __post_init__(self):
|
||||||
self.arguments = self.arguments or {}
|
self.arguments = self.arguments or {}
|
||||||
|
|
@ -35,36 +35,46 @@ class ToolDecision:
|
||||||
params={"name": self.tool_name, "arguments": self.arguments},
|
params={"name": self.tool_name, "arguments": self.arguments},
|
||||||
)
|
)
|
||||||
|
|
||||||
class MonicaClient:
|
|
||||||
|
|
||||||
|
class MonicaClient:
|
||||||
BASE_URL = "https://openapi.monica.im/v1"
|
BASE_URL = "https://openapi.monica.im/v1"
|
||||||
|
|
||||||
def __init__(self, api_key):
|
def __init__(self, api_key):
|
||||||
self.client = OpenAI(base_url=self.BASE_URL,
|
self.client = OpenAI(base_url=self.BASE_URL,
|
||||||
api_key=api_key)
|
api_key=api_key)
|
||||||
def create(self, model_name, tool_schemas, user_input) -> ToolDecision:
|
self.logger = get_logger("Monica")
|
||||||
|
|
||||||
|
def create(self, model_name: str, tool_schemas, user_input: str, agent_prompt: str = "") -> ToolDecision:
|
||||||
tools = [{
|
tools = [{
|
||||||
"name": s.name,
|
"name": s.name,
|
||||||
"description": s.description,
|
"description": s.description,
|
||||||
"parameters": s.parameters} for s in tool_schemas]
|
"parameters": s.parameters} for s in tool_schemas]
|
||||||
|
messages = []
|
||||||
|
if agent_prompt:
|
||||||
|
messages.append({
|
||||||
|
"role": "system",
|
||||||
|
"content": agent_prompt,
|
||||||
|
})
|
||||||
|
messages.append({
|
||||||
|
"role": "user",
|
||||||
|
"content": [{
|
||||||
|
"type": "text",
|
||||||
|
"text": user_input
|
||||||
|
}]
|
||||||
|
})
|
||||||
completion = self.client.chat.completions.create(
|
completion = self.client.chat.completions.create(
|
||||||
model=model_name,
|
model=model_name,
|
||||||
functions=tools,
|
functions=tools,
|
||||||
messages = [
|
messages=messages
|
||||||
{
|
|
||||||
"role": "user",
|
|
||||||
"content": [{
|
|
||||||
"type": "text",
|
|
||||||
"text": user_input
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
)
|
)
|
||||||
|
self.logger.info(completion.choices[0].message.content)
|
||||||
response = json.loads(completion.choices[0].message.content)
|
response = json.loads(completion.choices[0].message.content)
|
||||||
return ToolDecision(need_tool=response['need_tool'],
|
return ToolDecision(need_tool=response['need_tool'],
|
||||||
tool_name=response['tool_name'],
|
tool_name=response['tool_name'],
|
||||||
arguments=response['arguments'],
|
arguments=response['arguments'],
|
||||||
reasoning=response['reasoning'])
|
reasoning=response['reasoning'])
|
||||||
|
|
||||||
|
|
||||||
# ── LLM 引擎 ──────────────────────────────────────────────────
|
# ── LLM 引擎 ──────────────────────────────────────────────────
|
||||||
class LLMEngine:
|
class LLMEngine:
|
||||||
"""
|
"""
|
||||||
|
|
@ -82,19 +92,21 @@ class LLMEngine:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
API_KEY = "sk-AUmOuFI731Ty5Nob38jY26d8lydfDT-QkE2giqb0sCuPCAE2JH6zjLM4lZLpvL5WMYPOocaMe2FwVDmqM_9KimmKACjR"
|
API_KEY = "sk-AUmOuFI731Ty5Nob38jY26d8lydfDT-QkE2giqb0sCuPCAE2JH6zjLM4lZLpvL5WMYPOocaMe2FwVDmqM_9KimmKACjR"
|
||||||
|
|
||||||
def __init__(self, model_name: str = "claude-sonnet-4-6"):
|
def __init__(self, model_name: str = "claude-sonnet-4-6"):
|
||||||
self.model_name = model_name
|
self.model_name = model_name
|
||||||
self.logger = get_logger("LLM")
|
self.logger = get_logger("LLM")
|
||||||
self.logger.info(f"🧠 LLM 引擎初始化,模型: {model_name}")
|
self.logger.info(f"🧠 LLM 引擎初始化,模型: {model_name}")
|
||||||
self.client = MonicaClient(api_key=self.API_KEY)
|
self.client = MonicaClient(api_key=self.API_KEY)
|
||||||
|
|
||||||
# ── 核心推理流程 ────────────────────────────────────────────
|
# ── 核心推理流程 ────────────────────────────────────────────
|
||||||
|
|
||||||
def think_and_decide(
|
def think_and_decide(
|
||||||
self,
|
self,
|
||||||
user_input: str,
|
user_input: str,
|
||||||
tool_schemas: list[ToolSchema],
|
tool_schemas: list[ToolSchema],
|
||||||
context: str = "",
|
context: str = "",
|
||||||
|
agent_prompt: str = ""
|
||||||
) -> ToolDecision:
|
) -> ToolDecision:
|
||||||
"""
|
"""
|
||||||
Step 1 & 2: 理解意图,决策工具调用(Think 阶段)
|
Step 1 & 2: 理解意图,决策工具调用(Think 阶段)
|
||||||
|
|
@ -103,7 +115,7 @@ class LLMEngine:
|
||||||
user_input: 用户输入文本
|
user_input: 用户输入文本
|
||||||
tool_schemas: 可用工具的 Schema 列表
|
tool_schemas: 可用工具的 Schema 列表
|
||||||
context: 对话历史上下文摘要
|
context: 对话历史上下文摘要
|
||||||
|
agent_prompt: 智能体提示词
|
||||||
Returns:
|
Returns:
|
||||||
ToolDecision 实例
|
ToolDecision 实例
|
||||||
"""
|
"""
|
||||||
|
|
@ -115,7 +127,7 @@ class LLMEngine:
|
||||||
|
|
||||||
# 调用 LLM(Demo 中使用规则模拟)
|
# 调用 LLM(Demo 中使用规则模拟)
|
||||||
# decision = self._call_llm_api(user_input, tool_schemas)
|
# decision = self._call_llm_api(user_input, tool_schemas)
|
||||||
decision = self._call_llm_api(prompt, tool_schemas)
|
decision = self._call_llm_api(prompt, tool_schemas, agent_prompt=agent_prompt)
|
||||||
|
|
||||||
self.logger.info(
|
self.logger.info(
|
||||||
f"🎯 决策结果: {'调用工具 [' + decision.tool_name + ']' if decision.need_tool else '直接回复'}"
|
f"🎯 决策结果: {'调用工具 [' + decision.tool_name + ']' if decision.need_tool else '直接回复'}"
|
||||||
|
|
@ -124,11 +136,11 @@ class LLMEngine:
|
||||||
return decision
|
return decision
|
||||||
|
|
||||||
def generate_final_reply(
|
def generate_final_reply(
|
||||||
self,
|
self,
|
||||||
user_input: str,
|
user_input: str,
|
||||||
tool_name: str,
|
tool_name: str,
|
||||||
tool_output: str,
|
tool_output: str,
|
||||||
context: str = "",
|
context: str = "",
|
||||||
) -> str:
|
) -> str:
|
||||||
"""
|
"""
|
||||||
Step 5: 整合工具结果,生成最终自然语言回复(Observe 阶段)
|
Step 5: 整合工具结果,生成最终自然语言回复(Observe 阶段)
|
||||||
|
|
@ -157,10 +169,10 @@ class LLMEngine:
|
||||||
# ── Prompt 构造 ─────────────────────────────────────────────
|
# ── Prompt 构造 ─────────────────────────────────────────────
|
||||||
|
|
||||||
def _build_decision_prompt(
|
def _build_decision_prompt(
|
||||||
self,
|
self,
|
||||||
user_input: str,
|
user_input: str,
|
||||||
tool_schemas: list[ToolSchema],
|
tool_schemas: list[ToolSchema],
|
||||||
context: str,
|
context: str,
|
||||||
) -> str:
|
) -> str:
|
||||||
"""构造工具决策 Prompt(ReAct 格式)"""
|
"""构造工具决策 Prompt(ReAct 格式)"""
|
||||||
tools_desc = "\n".join(
|
tools_desc = "\n".join(
|
||||||
|
|
@ -178,7 +190,7 @@ class LLMEngine:
|
||||||
|
|
||||||
# ── 模拟 LLM API(Demo 用规则引擎替代)────────────────────
|
# ── 模拟 LLM API(Demo 用规则引擎替代)────────────────────
|
||||||
|
|
||||||
def _call_llm_api(self, user_input: str, tool_schemas: list[ToolSchema]) -> ToolDecision:
|
def _call_llm_api(self, user_input: str, tool_schemas: list[ToolSchema], agent_prompt: str = "") -> ToolDecision:
|
||||||
"""
|
"""
|
||||||
模拟 LLM API 调用(Demo 版本使用关键词规则)
|
模拟 LLM API 调用(Demo 版本使用关键词规则)
|
||||||
|
|
||||||
|
|
@ -192,57 +204,60 @@ class LLMEngine:
|
||||||
)
|
)
|
||||||
# 解析 response.content 中的 tool_use block
|
# 解析 response.content 中的 tool_use block
|
||||||
"""
|
"""
|
||||||
return self.client.create(self.model_name, user_input=user_input, tool_schemas=tool_schemas)
|
if self.client:
|
||||||
|
return self.client.create(self.model_name,
|
||||||
|
user_input=user_input,
|
||||||
|
tool_schemas=tool_schemas,
|
||||||
|
agent_prompt=agent_prompt)
|
||||||
|
else:
|
||||||
|
text = user_input.lower()
|
||||||
|
# 规则匹配:计算器
|
||||||
|
calc_pattern = re.search(r"[\d\s\+\-\*\/\(\)\^]+[=??]?", user_input)
|
||||||
|
if any(kw in text for kw in ["计算", "等于", "多少", "×", "÷"]) and calc_pattern:
|
||||||
|
expr = re.sub(r"[^0-9+\-*/().**]", "", user_input.replace("×", "*").replace("÷", "/"))
|
||||||
|
return ToolDecision(
|
||||||
|
need_tool=True, tool_name="calculator",
|
||||||
|
arguments={"expression": expr or "1+1"},
|
||||||
|
reasoning="用户请求数学计算,调用 calculator 工具",
|
||||||
|
)
|
||||||
|
|
||||||
text = user_input.lower()
|
# 规则匹配:搜索
|
||||||
|
if any(kw in text for kw in ["搜索", "查询", "天气", "新闻", "查一下", "search"]):
|
||||||
|
return ToolDecision(
|
||||||
|
need_tool=True, tool_name="web_search",
|
||||||
|
arguments={"query": user_input, "max_results": 3},
|
||||||
|
reasoning="用户需要实时信息,调用 web_search 工具",
|
||||||
|
)
|
||||||
|
|
||||||
# 规则匹配:计算器
|
# 规则匹配:文件读取
|
||||||
calc_pattern = re.search(r"[\d\s\+\-\*\/\(\)\^]+[=??]?", user_input)
|
if any(kw in text for kw in ["文件", "读取", "file", "config", "json", "txt"]):
|
||||||
if any(kw in text for kw in ["计算", "等于", "多少", "×", "÷"]) and calc_pattern:
|
filename = re.search(r"[\w\-\.]+\.\w+", user_input)
|
||||||
expr = re.sub(r"[^0-9+\-*/().**]", "", user_input.replace("×","*").replace("÷","/"))
|
return ToolDecision(
|
||||||
|
need_tool=True, tool_name="file_reader",
|
||||||
|
arguments={"path": filename.group() if filename else "config.json"},
|
||||||
|
reasoning="用户请求读取文件,调用 file_reader 工具",
|
||||||
|
)
|
||||||
|
|
||||||
|
# 规则匹配:代码执行
|
||||||
|
if any(kw in text for kw in ["执行", "运行", "代码", "python", "print", "code"]):
|
||||||
|
code_match = re.search(r'[`\'"](.+?)[`\'"]', user_input)
|
||||||
|
code = code_match.group(1) if code_match else 'print("Hello, Agent!")'
|
||||||
|
return ToolDecision(
|
||||||
|
need_tool=True, tool_name="code_executor",
|
||||||
|
arguments={"code": code, "timeout": 5},
|
||||||
|
reasoning="用户请求执行代码,调用 code_executor 工具",
|
||||||
|
)
|
||||||
|
|
||||||
|
# 默认:直接回复
|
||||||
return ToolDecision(
|
return ToolDecision(
|
||||||
need_tool=True, tool_name="calculator",
|
need_tool=False,
|
||||||
arguments={"expression": expr or "1+1"},
|
reasoning="问题可直接回答,无需工具",
|
||||||
reasoning="用户请求数学计算,调用 calculator 工具",
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# 规则匹配:搜索
|
|
||||||
if any(kw in text for kw in ["搜索", "查询", "天气", "新闻", "查一下", "search"]):
|
|
||||||
return ToolDecision(
|
|
||||||
need_tool=True, tool_name="web_search",
|
|
||||||
arguments={"query": user_input, "max_results": 3},
|
|
||||||
reasoning="用户需要实时信息,调用 web_search 工具",
|
|
||||||
)
|
|
||||||
|
|
||||||
# 规则匹配:文件读取
|
|
||||||
if any(kw in text for kw in ["文件", "读取", "file", "config", "json", "txt"]):
|
|
||||||
filename = re.search(r"[\w\-\.]+\.\w+", user_input)
|
|
||||||
return ToolDecision(
|
|
||||||
need_tool=True, tool_name="file_reader",
|
|
||||||
arguments={"path": filename.group() if filename else "config.json"},
|
|
||||||
reasoning="用户请求读取文件,调用 file_reader 工具",
|
|
||||||
)
|
|
||||||
|
|
||||||
# 规则匹配:代码执行
|
|
||||||
if any(kw in text for kw in ["执行", "运行", "代码", "python", "print", "code"]):
|
|
||||||
code_match = re.search(r'[`\'"](.+?)[`\'"]', user_input)
|
|
||||||
code = code_match.group(1) if code_match else 'print("Hello, Agent!")'
|
|
||||||
return ToolDecision(
|
|
||||||
need_tool=True, tool_name="code_executor",
|
|
||||||
arguments={"code": code, "timeout": 5},
|
|
||||||
reasoning="用户请求执行代码,调用 code_executor 工具",
|
|
||||||
)
|
|
||||||
|
|
||||||
# 默认:直接回复
|
|
||||||
return ToolDecision(
|
|
||||||
need_tool=False,
|
|
||||||
reasoning="问题可直接回答,无需工具",
|
|
||||||
)
|
|
||||||
|
|
||||||
def _synthesize_reply(self, user_input: str, tool_name: str, tool_output: str) -> str:
|
def _synthesize_reply(self, user_input: str, tool_name: str, tool_output: str) -> str:
|
||||||
"""基于工具输出合成最终回复(Demo 版本)"""
|
"""基于工具输出合成最终回复(Demo 版本)"""
|
||||||
return (
|
return (
|
||||||
f"✅ 已通过 [{tool_name}] 工具处理您的请求。\n\n"
|
f"✅ 已通过 [{tool_name}] 工具处理您的请求。\n\n"
|
||||||
f"**执行结果:**\n{tool_output}\n\n"
|
f"**执行结果:**\n{tool_output}\n\n"
|
||||||
f"---\n*由 {self.model_name} 生成 · 工具: {tool_name}*"
|
f"---\n*由 {self.model_name} 生成 · 工具: {tool_name}*"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
210
logs/agent.log
210
logs/agent.log
|
|
@ -208,3 +208,213 @@
|
||||||
---
|
---
|
||||||
*由 gpt-...
|
*由 gpt-...
|
||||||
[2026-02-28 16:06:05,167] [agent.CLIENT] INFO: 🎉 [CLIENT] 流程完成,回复已返回
|
[2026-02-28 16:06:05,167] [agent.CLIENT] INFO: 🎉 [CLIENT] 流程完成,回复已返回
|
||||||
|
[2026-02-28 22:29:24,671] [agent.SYSTEM] INFO: 🔧 开始组装 Agent 系统...
|
||||||
|
[2026-02-28 22:29:24,672] [agent.MCP] INFO: 🚀 MCP Server [DemoMCPServer] 启动
|
||||||
|
[2026-02-28 22:29:24,672] [agent.MCP] INFO: 📌 注册工具: [calculator] — 计算数学表达式,支持加减乘除、幂运算、括号等
|
||||||
|
[2026-02-28 22:29:24,672] [agent.MCP] INFO: 📌 注册工具: [web_search] — 在互联网上搜索信息,返回相关网页摘要
|
||||||
|
[2026-02-28 22:29:24,672] [agent.MCP] INFO: 📌 注册工具: [file_reader] — 读取本地文件内容,仅限 workspace/ 目录下的文件
|
||||||
|
[2026-02-28 22:29:24,672] [agent.MCP] INFO: 📌 注册工具: [code_executor] — 在沙箱环境中执行 Python 代码片段,返回标准输出
|
||||||
|
[2026-02-28 22:29:24,672] [agent.LLM] INFO: 🧠 LLM 引擎初始化,模型: gpt-4o
|
||||||
|
[2026-02-28 22:29:56,971] [agent.SYSTEM] INFO: 🔧 开始组装 Agent 系统...
|
||||||
|
[2026-02-28 22:29:56,971] [agent.MCP] INFO: 🚀 MCP Server [DemoMCPServer] 启动
|
||||||
|
[2026-02-28 22:29:56,971] [agent.MCP] INFO: 📌 注册工具: [calculator] — 计算数学表达式,支持加减乘除、幂运算、括号等
|
||||||
|
[2026-02-28 22:29:56,971] [agent.MCP] INFO: 📌 注册工具: [web_search] — 在互联网上搜索信息,返回相关网页摘要
|
||||||
|
[2026-02-28 22:29:56,971] [agent.MCP] INFO: 📌 注册工具: [file_reader] — 读取本地文件内容,仅限 workspace/ 目录下的文件
|
||||||
|
[2026-02-28 22:29:56,971] [agent.MCP] INFO: 📌 注册工具: [code_executor] — 在沙箱环境中执行 Python 代码片段,返回标准输出
|
||||||
|
[2026-02-28 22:29:56,972] [agent.LLM] INFO: 🧠 LLM 引擎初始化,模型: gpt-4o
|
||||||
|
[2026-02-28 22:30:46,017] [agent.SYSTEM] INFO: 🔧 开始组装 Agent 系统...
|
||||||
|
[2026-02-28 22:30:46,017] [agent.MCP] INFO: 🚀 MCP Server [DemoMCPServer] 启动
|
||||||
|
[2026-02-28 22:30:46,017] [agent.MCP] INFO: 📌 注册工具: [calculator] — 计算数学表达式,支持加减乘除、幂运算、括号等
|
||||||
|
[2026-02-28 22:30:46,018] [agent.MCP] INFO: 📌 注册工具: [web_search] — 在互联网上搜索信息,返回相关网页摘要
|
||||||
|
[2026-02-28 22:30:46,018] [agent.MCP] INFO: 📌 注册工具: [file_reader] — 读取本地文件内容,仅限 workspace/ 目录下的文件
|
||||||
|
[2026-02-28 22:30:46,018] [agent.MCP] INFO: 📌 注册工具: [code_executor] — 在沙箱环境中执行 Python 代码片段,返回标准输出
|
||||||
|
[2026-02-28 22:30:46,018] [agent.LLM] INFO: 🧠 LLM 引擎初始化,模型: gpt-4o
|
||||||
|
[2026-02-28 22:30:53,901] [agent.SYSTEM] INFO: 🔧 开始组装 Agent 系统...
|
||||||
|
[2026-02-28 22:30:53,902] [agent.MCP] INFO: 🚀 MCP Server [DemoMCPServer] 启动
|
||||||
|
[2026-02-28 22:30:53,902] [agent.MCP] INFO: 📌 注册工具: [calculator] — 计算数学表达式,支持加减乘除、幂运算、括号等
|
||||||
|
[2026-02-28 22:30:53,902] [agent.MCP] INFO: 📌 注册工具: [web_search] — 在互联网上搜索信息,返回相关网页摘要
|
||||||
|
[2026-02-28 22:30:53,902] [agent.MCP] INFO: 📌 注册工具: [file_reader] — 读取本地文件内容,仅限 workspace/ 目录下的文件
|
||||||
|
[2026-02-28 22:30:53,902] [agent.MCP] INFO: 📌 注册工具: [code_executor] — 在沙箱环境中执行 Python 代码片段,返回标准输出
|
||||||
|
[2026-02-28 22:30:53,902] [agent.LLM] INFO: 🧠 LLM 引擎初始化,模型: gpt-4o
|
||||||
|
[2026-02-28 22:47:31,295] [agent.SYSTEM] INFO: 🔧 开始组装 Agent 系统...
|
||||||
|
[2026-02-28 22:47:31,296] [agent.MCP] INFO: 🚀 MCP Server [DemoMCPServer] 启动
|
||||||
|
[2026-02-28 22:47:31,296] [agent.MCP] INFO: 📌 注册工具: [calculator] — 计算数学表达式,支持加减乘除、幂运算、括号等
|
||||||
|
[2026-02-28 22:47:31,296] [agent.MCP] INFO: 📌 注册工具: [web_search] — 在互联网上搜索信息,返回相关网页摘要
|
||||||
|
[2026-02-28 22:47:31,296] [agent.MCP] INFO: 📌 注册工具: [file_reader] — 读取本地文件内容,仅限 workspace/ 目录下的文件
|
||||||
|
[2026-02-28 22:47:31,296] [agent.MCP] INFO: 📌 注册工具: [code_executor] — 在沙箱环境中执行 Python 代码片段,返回标准输出
|
||||||
|
[2026-02-28 22:47:31,296] [agent.LLM] INFO: 🧠 LLM 引擎初始化,模型: gpt-4o
|
||||||
|
[2026-02-28 22:51:08,506] [agent.SYSTEM] INFO: 🔧 开始组装 Agent 系统...
|
||||||
|
[2026-02-28 22:51:08,507] [agent.MCP] INFO: 🚀 MCP Server [DemoMCPServer] 启动
|
||||||
|
[2026-02-28 22:51:08,507] [agent.MCP] INFO: 📌 注册工具: [calculator] — 计算数学表达式,支持加减乘除、幂运算、括号等
|
||||||
|
[2026-02-28 22:51:08,507] [agent.MCP] INFO: 📌 注册工具: [web_search] — 在互联网上搜索信息,返回相关网页摘要
|
||||||
|
[2026-02-28 22:51:08,507] [agent.MCP] INFO: 📌 注册工具: [file_reader] — 读取本地文件内容,仅限 workspace/ 目录下的文件
|
||||||
|
[2026-02-28 22:51:08,507] [agent.MCP] INFO: 📌 注册工具: [code_executor] — 在沙箱环境中执行 Python 代码片段,返回标准输出
|
||||||
|
[2026-02-28 22:51:08,507] [agent.LLM] INFO: 🧠 LLM 引擎初始化,模型: gpt-4o
|
||||||
|
[2026-02-28 22:51:43,854] [agent.SYSTEM] INFO: 🔧 开始组装 Agent 系统...
|
||||||
|
[2026-02-28 22:51:43,855] [agent.MCP] INFO: 🚀 MCP Server [DemoMCPServer] 启动
|
||||||
|
[2026-02-28 22:51:43,855] [agent.MCP] INFO: 📌 注册工具: [calculator] — 计算数学表达式,支持加减乘除、幂运算、括号等
|
||||||
|
[2026-02-28 22:51:43,855] [agent.MCP] INFO: 📌 注册工具: [web_search] — 在互联网上搜索信息,返回相关网页摘要
|
||||||
|
[2026-02-28 22:51:43,855] [agent.MCP] INFO: 📌 注册工具: [file_reader] — 读取本地文件内容,仅限 workspace/ 目录下的文件
|
||||||
|
[2026-02-28 22:51:43,855] [agent.MCP] INFO: 📌 注册工具: [code_executor] — 在沙箱环境中执行 Python 代码片段,返回标准输出
|
||||||
|
[2026-02-28 22:51:43,855] [agent.LLM] INFO: 🧠 LLM 引擎初始化,模型: gpt-4o
|
||||||
|
[2026-02-28 22:51:43,891] [agent.MEMORY] INFO: 💾 Memory 初始化,最大历史: 20 条
|
||||||
|
[2026-02-28 22:51:43,891] [agent.CLIENT] INFO: 💻 Agent Client 初始化完成
|
||||||
|
[2026-02-28 22:51:43,891] [agent.SYSTEM] INFO: ✅ Agent 组装完成,已注册工具: ['calculator', 'web_search', 'file_reader', 'code_executor']
|
||||||
|
[2026-02-28 22:51:58,206] [agent.SYSTEM] INFO: 🔧 开始组装 Agent 系统...
|
||||||
|
[2026-02-28 22:51:58,206] [agent.MCP] INFO: 🚀 MCP Server [DemoMCPServer] 启动
|
||||||
|
[2026-02-28 22:51:58,206] [agent.MCP] INFO: 📌 注册工具: [calculator] — 计算数学表达式,支持加减乘除、幂运算、括号等
|
||||||
|
[2026-02-28 22:51:58,206] [agent.MCP] INFO: 📌 注册工具: [web_search] — 在互联网上搜索信息,返回相关网页摘要
|
||||||
|
[2026-02-28 22:51:58,207] [agent.MCP] INFO: 📌 注册工具: [file_reader] — 读取本地文件内容,仅限 workspace/ 目录下的文件
|
||||||
|
[2026-02-28 22:51:58,207] [agent.MCP] INFO: 📌 注册工具: [code_executor] — 在沙箱环境中执行 Python 代码片段,返回标准输出
|
||||||
|
[2026-02-28 22:51:58,207] [agent.LLM] INFO: 🧠 LLM 引擎初始化,模型: gpt-4o
|
||||||
|
[2026-02-28 22:51:58,232] [agent.MEMORY] INFO: 💾 Memory 初始化,最大历史: 20 条
|
||||||
|
[2026-02-28 22:51:58,232] [agent.CLIENT] INFO: 💻 Agent Client 初始化完成
|
||||||
|
[2026-02-28 22:51:58,232] [agent.SYSTEM] INFO: ✅ Agent 组装完成,已注册工具: ['calculator', 'web_search', 'file_reader', 'code_executor']
|
||||||
|
[2026-02-28 22:52:08,077] [agent.CLIENT] INFO: =======================================================
|
||||||
|
[2026-02-28 22:52:08,077] [agent.CLIENT] INFO: 📨 Step 1 [CLIENT] 收到用户输入: 1加1等于多少
|
||||||
|
[2026-02-28 22:52:08,077] [agent.MEMORY] DEBUG: 💬 [USER] 1加1等于多少...
|
||||||
|
[2026-02-28 22:52:08,078] [agent.CLIENT] INFO: 🧠 Step 2 [LLM] 开始推理,分析意图...
|
||||||
|
[2026-02-28 22:52:08,078] [agent.LLM] INFO: 💭 分析意图: 1加1等于多少...
|
||||||
|
[2026-02-28 22:52:08,078] [agent.LLM] DEBUG: 📝 Prompt 已构造 (344 chars)
|
||||||
|
[2026-02-28 22:54:48,518] [agent.SYSTEM] INFO: 🔧 开始组装 Agent 系统...
|
||||||
|
[2026-02-28 22:54:48,518] [agent.MCP] INFO: 🚀 MCP Server [DemoMCPServer] 启动
|
||||||
|
[2026-02-28 22:54:48,518] [agent.MCP] INFO: 📌 注册工具: [calculator] — 计算数学表达式,支持加减乘除、幂运算、括号等
|
||||||
|
[2026-02-28 22:54:48,519] [agent.MCP] INFO: 📌 注册工具: [web_search] — 在互联网上搜索信息,返回相关网页摘要
|
||||||
|
[2026-02-28 22:54:48,519] [agent.MCP] INFO: 📌 注册工具: [file_reader] — 读取本地文件内容,仅限 workspace/ 目录下的文件
|
||||||
|
[2026-02-28 22:54:48,519] [agent.MCP] INFO: 📌 注册工具: [code_executor] — 在沙箱环境中执行 Python 代码片段,返回标准输出
|
||||||
|
[2026-02-28 22:54:48,519] [agent.LLM] INFO: 🧠 LLM 引擎初始化,模型: gpt-4o
|
||||||
|
[2026-02-28 22:54:48,543] [agent.MEMORY] INFO: 💾 Memory 初始化,最大历史: 20 条
|
||||||
|
[2026-02-28 22:54:48,544] [agent.CLIENT] INFO: 💻 Agent Client 初始化完成
|
||||||
|
[2026-02-28 22:54:48,544] [agent.SYSTEM] INFO: ✅ Agent 组装完成,已注册工具: ['calculator', 'web_search', 'file_reader', 'code_executor']
|
||||||
|
[2026-02-28 22:55:14,173] [agent.SYSTEM] INFO: 🔧 开始组装 Agent 系统...
|
||||||
|
[2026-02-28 22:55:14,173] [agent.MCP] INFO: 🚀 MCP Server [DemoMCPServer] 启动
|
||||||
|
[2026-02-28 22:55:14,173] [agent.MCP] INFO: 📌 注册工具: [calculator] — 计算数学表达式,支持加减乘除、幂运算、括号等
|
||||||
|
[2026-02-28 22:55:14,174] [agent.MCP] INFO: 📌 注册工具: [web_search] — 在互联网上搜索信息,返回相关网页摘要
|
||||||
|
[2026-02-28 22:55:14,174] [agent.MCP] INFO: 📌 注册工具: [file_reader] — 读取本地文件内容,仅限 workspace/ 目录下的文件
|
||||||
|
[2026-02-28 22:55:14,174] [agent.MCP] INFO: 📌 注册工具: [code_executor] — 在沙箱环境中执行 Python 代码片段,返回标准输出
|
||||||
|
[2026-02-28 22:55:14,174] [agent.LLM] INFO: 🧠 LLM 引擎初始化,模型: gpt-4o
|
||||||
|
[2026-02-28 22:55:54,637] [agent.SYSTEM] INFO: 🔧 开始组装 Agent 系统...
|
||||||
|
[2026-02-28 22:55:54,637] [agent.MCP] INFO: 🚀 MCP Server [DemoMCPServer] 启动
|
||||||
|
[2026-02-28 22:55:54,637] [agent.MCP] INFO: 📌 注册工具: [calculator] — 计算数学表达式,支持加减乘除、幂运算、括号等
|
||||||
|
[2026-02-28 22:55:54,638] [agent.MCP] INFO: 📌 注册工具: [web_search] — 在互联网上搜索信息,返回相关网页摘要
|
||||||
|
[2026-02-28 22:55:54,638] [agent.MCP] INFO: 📌 注册工具: [file_reader] — 读取本地文件内容,仅限 workspace/ 目录下的文件
|
||||||
|
[2026-02-28 22:55:54,638] [agent.MCP] INFO: 📌 注册工具: [code_executor] — 在沙箱环境中执行 Python 代码片段,返回标准输出
|
||||||
|
[2026-02-28 22:55:54,638] [agent.LLM] INFO: 🧠 LLM 引擎初始化,模型: gpt-4o
|
||||||
|
[2026-02-28 22:55:54,675] [agent.MEMORY] INFO: 💾 Memory 初始化,最大历史: 20 条
|
||||||
|
[2026-02-28 22:55:54,676] [agent.CLIENT] INFO: 💻 Agent Client 初始化完成
|
||||||
|
[2026-02-28 22:55:54,676] [agent.SYSTEM] INFO: ✅ Agent 组装完成,已注册工具: ['calculator', 'web_search', 'file_reader', 'code_executor']
|
||||||
|
[2026-02-28 22:56:03,477] [agent.CLIENT] INFO: =======================================================
|
||||||
|
[2026-02-28 22:56:03,478] [agent.CLIENT] INFO: 📨 Step 1 [CLIENT] 收到用户输入: 1加1等于多少
|
||||||
|
[2026-02-28 22:56:03,478] [agent.MEMORY] DEBUG: 💬 [USER] 1加1等于多少...
|
||||||
|
[2026-02-28 22:56:03,478] [agent.CLIENT] INFO: 🧠 Step 2 [LLM] 开始推理,分析意图...
|
||||||
|
[2026-02-28 22:56:03,478] [agent.LLM] INFO: 💭 分析意图: 1加1等于多少...
|
||||||
|
[2026-02-28 22:56:03,478] [agent.LLM] DEBUG: 📝 Prompt 已构造 (344 chars)
|
||||||
|
[2026-02-28 22:56:17,390] [agent.LLM] INFO: 🎯 决策结果: 调用工具 [calculator]
|
||||||
|
[2026-02-28 22:56:17,391] [agent.LLM] DEBUG: 💡 推理: 用户提出了一个数学问题,需要计算 1 加 1 的值,用 calculator 工具进行计算是最合适的。
|
||||||
|
[2026-02-28 22:56:17,391] [agent.CLIENT] INFO: 📡 Step 3 [MCP] 发送工具调用请求
|
||||||
|
方法: tools/call
|
||||||
|
工具: calculator
|
||||||
|
参数: {'expression': '1+1'}
|
||||||
|
请求体: {'jsonrpc': '2.0', 'id': '2bcb050e', 'method': 'tools/call', 'params': {'name': 'calculator', 'arguments': {'expression': '1+1'}}}
|
||||||
|
[2026-02-28 22:56:17,392] [agent.CLIENT] INFO: 🔧 Step 4 [TOOL] MCP Server 执行工具 [calculator]...
|
||||||
|
[2026-02-28 22:56:17,392] [agent.MCP] INFO: 📨 收到请求 id=2bcb050e method=tools/call
|
||||||
|
[2026-02-28 22:56:17,392] [agent.TOOL] INFO: ▶ 执行工具 [calculator],参数: {'expression': '1+1'}
|
||||||
|
[2026-02-28 22:56:17,392] [agent.TOOL] INFO: ✅ 工具 [calculator] 执行成功
|
||||||
|
[2026-02-28 22:56:17,393] [agent.CLIENT] INFO: ✅ 工具执行成功,输出: 1+1 = 2...
|
||||||
|
[2026-02-28 22:56:17,393] [agent.MEMORY] DEBUG: 💬 [TOOL] 1+1 = 2...
|
||||||
|
[2026-02-28 22:56:17,393] [agent.CLIENT] INFO: ✍️ Step 5 [LLM] 整合工具结果,生成最终回复...
|
||||||
|
[2026-02-28 22:56:17,393] [agent.LLM] INFO: ✍️ 整合工具结果,生成最终回复...
|
||||||
|
[2026-02-28 22:56:17,394] [agent.LLM] INFO: 💬 回复已生成 (83 chars)
|
||||||
|
[2026-02-28 22:56:17,394] [agent.MEMORY] DEBUG: 💬 [ASSISTANT] ✅ 已通过 [calculator] 工具处理您的请求。
|
||||||
|
|
||||||
|
**执行结果:**
|
||||||
|
1+1 = 2
|
||||||
|
|
||||||
|
---
|
||||||
|
*由 gpt-...
|
||||||
|
[2026-02-28 22:56:17,394] [agent.CLIENT] INFO: 🎉 [CLIENT] 流程完成,回复已返回
|
||||||
|
[2026-02-28 22:56:35,957] [agent.CLIENT] INFO: =======================================================
|
||||||
|
[2026-02-28 22:56:35,958] [agent.CLIENT] INFO: 📨 Step 1 [CLIENT] 收到用户输入: 34*67等于多少
|
||||||
|
[2026-02-28 22:56:35,958] [agent.MEMORY] DEBUG: 💬 [USER] 34*67等于多少...
|
||||||
|
[2026-02-28 22:56:35,959] [agent.CLIENT] INFO: 🧠 Step 2 [LLM] 开始推理,分析意图...
|
||||||
|
[2026-02-28 22:56:35,959] [agent.LLM] INFO: 💭 分析意图: 34*67等于多少...
|
||||||
|
[2026-02-28 22:56:35,959] [agent.LLM] DEBUG: 📝 Prompt 已构造 (471 chars)
|
||||||
|
[2026-02-28 22:58:14,926] [agent.SYSTEM] INFO: 🔧 开始组装 Agent 系统...
|
||||||
|
[2026-02-28 22:58:14,926] [agent.MCP] INFO: 🚀 MCP Server [DemoMCPServer] 启动
|
||||||
|
[2026-02-28 22:58:14,926] [agent.MCP] INFO: 📌 注册工具: [calculator] — 计算数学表达式,支持加减乘除、幂运算、括号等
|
||||||
|
[2026-02-28 22:58:14,926] [agent.MCP] INFO: 📌 注册工具: [web_search] — 在互联网上搜索信息,返回相关网页摘要
|
||||||
|
[2026-02-28 22:58:14,926] [agent.MCP] INFO: 📌 注册工具: [file_reader] — 读取本地文件内容,仅限 workspace/ 目录下的文件
|
||||||
|
[2026-02-28 22:58:14,926] [agent.MCP] INFO: 📌 注册工具: [code_executor] — 在沙箱环境中执行 Python 代码片段,返回标准输出
|
||||||
|
[2026-02-28 22:58:14,927] [agent.LLM] INFO: 🧠 LLM 引擎初始化,模型: gpt-4o
|
||||||
|
[2026-02-28 22:58:14,964] [agent.MEMORY] INFO: 💾 Memory 初始化,最大历史: 20 条
|
||||||
|
[2026-02-28 22:58:14,964] [agent.CLIENT] INFO: 💻 Agent Client 初始化完成
|
||||||
|
[2026-02-28 22:58:14,965] [agent.SYSTEM] INFO: ✅ Agent 组装完成,已注册工具: ['calculator', 'web_search', 'file_reader', 'code_executor']
|
||||||
|
[2026-02-28 22:58:21,018] [agent.CLIENT] INFO: =======================================================
|
||||||
|
[2026-02-28 22:58:21,018] [agent.CLIENT] INFO: 📨 Step 1 [CLIENT] 收到用户输入: 34*56等于多少
|
||||||
|
[2026-02-28 22:58:21,018] [agent.MEMORY] DEBUG: 💬 [USER] 34*56等于多少...
|
||||||
|
[2026-02-28 22:58:21,018] [agent.CLIENT] INFO: 🧠 Step 2 [LLM] 开始推理,分析意图...
|
||||||
|
[2026-02-28 22:58:21,018] [agent.LLM] INFO: 💭 分析意图: 34*56等于多少...
|
||||||
|
[2026-02-28 22:58:21,019] [agent.LLM] DEBUG: 📝 Prompt 已构造 (348 chars)
|
||||||
|
[2026-02-28 22:58:23,409] [agent.Monica] INFO: {
|
||||||
|
"need_tool": true,
|
||||||
|
"tool_name": "calculator",
|
||||||
|
"arguments": {
|
||||||
|
"expression": "34*56"
|
||||||
|
},
|
||||||
|
"reasoning": "用户询问的数学问题需要计算具体结果,这可以通过调用 calculator 工具来完成。"
|
||||||
|
}
|
||||||
|
[2026-02-28 22:58:23,409] [agent.LLM] INFO: 🎯 决策结果: 调用工具 [calculator]
|
||||||
|
[2026-02-28 22:58:23,409] [agent.LLM] DEBUG: 💡 推理: 用户询问的数学问题需要计算具体结果,这可以通过调用 calculator 工具来完成。
|
||||||
|
[2026-02-28 22:58:23,409] [agent.CLIENT] INFO: 📡 Step 3 [MCP] 发送工具调用请求
|
||||||
|
方法: tools/call
|
||||||
|
工具: calculator
|
||||||
|
参数: {'expression': '34*56'}
|
||||||
|
请求体: {'jsonrpc': '2.0', 'id': '6f404ceb', 'method': 'tools/call', 'params': {'name': 'calculator', 'arguments': {'expression': '34*56'}}}
|
||||||
|
[2026-02-28 22:58:23,409] [agent.CLIENT] INFO: 🔧 Step 4 [TOOL] MCP Server 执行工具 [calculator]...
|
||||||
|
[2026-02-28 22:58:23,410] [agent.MCP] INFO: 📨 收到请求 id=6f404ceb method=tools/call
|
||||||
|
[2026-02-28 22:58:23,410] [agent.TOOL] INFO: ▶ 执行工具 [calculator],参数: {'expression': '34*56'}
|
||||||
|
[2026-02-28 22:58:23,410] [agent.TOOL] INFO: ✅ 工具 [calculator] 执行成功
|
||||||
|
[2026-02-28 22:58:23,410] [agent.CLIENT] INFO: ✅ 工具执行成功,输出: 34*56 = 1904...
|
||||||
|
[2026-02-28 22:58:23,410] [agent.MEMORY] DEBUG: 💬 [TOOL] 34*56 = 1904...
|
||||||
|
[2026-02-28 22:58:23,410] [agent.CLIENT] INFO: ✍️ Step 5 [LLM] 整合工具结果,生成最终回复...
|
||||||
|
[2026-02-28 22:58:23,410] [agent.LLM] INFO: ✍️ 整合工具结果,生成最终回复...
|
||||||
|
[2026-02-28 22:58:23,410] [agent.LLM] INFO: 💬 回复已生成 (88 chars)
|
||||||
|
[2026-02-28 22:58:23,410] [agent.MEMORY] DEBUG: 💬 [ASSISTANT] ✅ 已通过 [calculator] 工具处理您的请求。
|
||||||
|
|
||||||
|
**执行结果:**
|
||||||
|
34*56 = 1904
|
||||||
|
|
||||||
|
---
|
||||||
|
*由...
|
||||||
|
[2026-02-28 22:58:23,410] [agent.CLIENT] INFO: 🎉 [CLIENT] 流程完成,回复已返回
|
||||||
|
[2026-02-28 22:58:37,709] [agent.CLIENT] INFO: =======================================================
|
||||||
|
[2026-02-28 22:58:37,710] [agent.CLIENT] INFO: 📨 Step 1 [CLIENT] 收到用户输入: 23*45等于多少
|
||||||
|
[2026-02-28 22:58:37,710] [agent.MEMORY] DEBUG: 💬 [USER] 23*45等于多少...
|
||||||
|
[2026-02-28 22:58:37,710] [agent.CLIENT] INFO: 🧠 Step 2 [LLM] 开始推理,分析意图...
|
||||||
|
[2026-02-28 22:58:37,711] [agent.LLM] INFO: 💭 分析意图: 23*45等于多少...
|
||||||
|
[2026-02-28 22:58:37,711] [agent.LLM] DEBUG: 📝 Prompt 已构造 (478 chars)
|
||||||
|
[2026-02-28 22:58:47,485] [agent.Monica] INFO: {"need_tool": true, "tool_name": "calculator", "arguments": {"expression": "23*45"}, "reasoning": "计算数学表达式需要调用 calculator 工具直接获得结果,以确保准确性。"}
|
||||||
|
[2026-02-28 22:58:47,486] [agent.LLM] INFO: 🎯 决策结果: 调用工具 [calculator]
|
||||||
|
[2026-02-28 22:58:47,486] [agent.LLM] DEBUG: 💡 推理: 计算数学表达式需要调用 calculator 工具直接获得结果,以确保准确性。
|
||||||
|
[2026-02-28 22:58:47,487] [agent.CLIENT] INFO: 📡 Step 3 [MCP] 发送工具调用请求
|
||||||
|
方法: tools/call
|
||||||
|
工具: calculator
|
||||||
|
参数: {'expression': '23*45'}
|
||||||
|
请求体: {'jsonrpc': '2.0', 'id': '246d9a09', 'method': 'tools/call', 'params': {'name': 'calculator', 'arguments': {'expression': '23*45'}}}
|
||||||
|
[2026-02-28 22:58:47,487] [agent.CLIENT] INFO: 🔧 Step 4 [TOOL] MCP Server 执行工具 [calculator]...
|
||||||
|
[2026-02-28 22:58:47,487] [agent.MCP] INFO: 📨 收到请求 id=246d9a09 method=tools/call
|
||||||
|
[2026-02-28 22:58:47,487] [agent.TOOL] INFO: ▶ 执行工具 [calculator],参数: {'expression': '23*45'}
|
||||||
|
[2026-02-28 22:58:47,488] [agent.TOOL] INFO: ✅ 工具 [calculator] 执行成功
|
||||||
|
[2026-02-28 22:58:47,488] [agent.CLIENT] INFO: ✅ 工具执行成功,输出: 23*45 = 1035...
|
||||||
|
[2026-02-28 22:58:47,488] [agent.MEMORY] DEBUG: 💬 [TOOL] 23*45 = 1035...
|
||||||
|
[2026-02-28 22:58:47,489] [agent.CLIENT] INFO: ✍️ Step 5 [LLM] 整合工具结果,生成最终回复...
|
||||||
|
[2026-02-28 22:58:47,489] [agent.LLM] INFO: ✍️ 整合工具结果,生成最终回复...
|
||||||
|
[2026-02-28 22:58:47,489] [agent.LLM] INFO: 💬 回复已生成 (88 chars)
|
||||||
|
[2026-02-28 22:58:47,489] [agent.MEMORY] DEBUG: 💬 [ASSISTANT] ✅ 已通过 [calculator] 工具处理您的请求。
|
||||||
|
|
||||||
|
**执行结果:**
|
||||||
|
23*45 = 1035
|
||||||
|
|
||||||
|
---
|
||||||
|
*由...
|
||||||
|
[2026-02-28 22:58:47,489] [agent.CLIENT] INFO: 🎉 [CLIENT] 流程完成,回复已返回
|
||||||
|
|
|
||||||
16
main.py
16
main.py
|
|
@ -6,7 +6,7 @@ main.py
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
import argparse
|
||||||
# ── 导入各模块 ─────────────────────────────────────────────────
|
# ── 导入各模块 ─────────────────────────────────────────────────
|
||||||
from client.agent_client import AgentClient
|
from client.agent_client import AgentClient
|
||||||
from llm.llm_engine import LLMEngine
|
from llm.llm_engine import LLMEngine
|
||||||
|
|
@ -22,7 +22,7 @@ logger = get_logger("SYSTEM")
|
||||||
|
|
||||||
|
|
||||||
# ── 系统组装 ───────────────────────────────────────────────────
|
# ── 系统组装 ───────────────────────────────────────────────────
|
||||||
def build_agent() -> AgentClient:
|
def build_agent(agent_prompt) -> AgentClient:
|
||||||
"""
|
"""
|
||||||
工厂函数:组装并返回完整的 Agent 实例
|
工厂函数:组装并返回完整的 Agent 实例
|
||||||
|
|
||||||
|
|
@ -50,7 +50,7 @@ def build_agent() -> AgentClient:
|
||||||
memory = MemoryStore(max_history=20)
|
memory = MemoryStore(max_history=20)
|
||||||
|
|
||||||
# 4. 组装客户端
|
# 4. 组装客户端
|
||||||
client = AgentClient(llm=llm, mcp_server=mcp_server, memory=memory)
|
client = AgentClient(llm=llm, mcp_server=mcp_server, memory=memory, prompt=agent_prompt)
|
||||||
|
|
||||||
logger.info(f"✅ Agent 组装完成,已注册工具: {mcp_server.list_tools()}")
|
logger.info(f"✅ Agent 组装完成,已注册工具: {mcp_server.list_tools()}")
|
||||||
return client
|
return client
|
||||||
|
|
@ -146,11 +146,13 @@ def main() -> None:
|
||||||
python main.py → 交互模式(默认)
|
python main.py → 交互模式(默认)
|
||||||
python main.py demo → 演示模式(自动执行预设场景)
|
python main.py demo → 演示模式(自动执行预设场景)
|
||||||
"""
|
"""
|
||||||
client = build_agent()
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument("-d", "--daemon", help="服务模式", action="store_true")
|
||||||
|
parser.add_argument("-p", "--prompt", default="你是一个通用智能体,非常擅长将用户指令分解成可以执行的任务进行执行。", help="智能体提示此词, 例如:你是一个XXXXX,非常擅长……")
|
||||||
|
args = parser.parse_args(sys.argv[1:])
|
||||||
|
client = build_agent(args.prompt)
|
||||||
|
|
||||||
mode = sys.argv[1] if len(sys.argv) > 1 else "interactive"
|
if args.daemon:
|
||||||
|
|
||||||
if mode == "demo":
|
|
||||||
run_demo(client)
|
run_demo(client)
|
||||||
else:
|
else:
|
||||||
run_interactive(client)
|
run_interactive(client)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
openai
|
||||||
Loading…
Reference in New Issue