From 488b9fd22e820f80c18da771e0525d0b941e2afb Mon Sep 17 00:00:00 2001 From: sonto Date: Sat, 28 Feb 2026 22:59:41 +0800 Subject: [PATCH] devel --- client/agent_client.py | 42 +++++---- llm/llm_engine.py | 171 ++++++++++++++++++--------------- logs/agent.log | 210 +++++++++++++++++++++++++++++++++++++++++ main.py | 16 ++-- requirements.txt | 1 + 5 files changed, 335 insertions(+), 105 deletions(-) create mode 100644 requirements.txt diff --git a/client/agent_client.py b/client/agent_client.py index 802f889..c58dd37 100644 --- a/client/agent_client.py +++ b/client/agent_client.py @@ -17,12 +17,12 @@ from utils.logger import get_logger @dataclass class AgentResponse: """一次完整 Agent 调用的结果""" - user_input: str - final_reply: str - tool_used: str | None = None - tool_output: str | None = None - success: bool = True - error: str | None = None + user_input: str + final_reply: str + tool_used: str | None = None + tool_output: str | None = None + success: bool = True + error: str | None = None # ── Agent 客户端 ─────────────────────────────────────────────── @@ -44,15 +44,17 @@ class AgentClient: """ def __init__( - self, - llm: LLMEngine, - mcp_server: MCPServer, - memory: MemoryStore, + self, + llm: LLMEngine, + mcp_server: MCPServer, + memory: MemoryStore, + prompt: str = "" ): - self.llm = llm + self.llm = llm self.mcp_server = mcp_server - self.memory = memory - self.logger = get_logger("CLIENT") + self.memory = memory + self.agent_prompt = prompt + self.logger = get_logger("CLIENT") self.logger.info("💻 Agent Client 初始化完成") # ── 主入口 ────────────────────────────────────────────────── @@ -67,7 +69,7 @@ class AgentClient: Returns: AgentResponse 实例 """ - self.logger.info(f"{'='*55}") + self.logger.info(f"{'=' * 55}") self.logger.info(f"📨 Step 1 [CLIENT] 收到用户输入: {user_input}") # ── Step 1: 记录用户消息 ──────────────────────────────── @@ -77,7 +79,7 @@ class AgentClient: # ── Step 2: LLM 推理决策 ──────────────────────────────── self.logger.info("🧠 Step 2 [LLM] 开始推理,分析意图...") 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: @@ -95,10 +97,10 @@ class AgentClient: return AgentResponse(user_input=user_input, final_reply=reply) def _handle_tool_call( - self, - user_input: str, - decision, - context: str, + self, + user_input: str, + decision, + context: str, ) -> AgentResponse: """执行工具调用的完整流程(Step 3 → 4 → 5)""" @@ -155,4 +157,4 @@ class AgentClient: def clear_session(self) -> None: """清空当前会话""" self.memory.clear_history() - self.logger.info("🗑 会话已清空") \ No newline at end of file + self.logger.info("🗑 会话已清空") diff --git a/llm/llm_engine.py b/llm/llm_engine.py index 843fc85..1407a13 100644 --- a/llm/llm_engine.py +++ b/llm/llm_engine.py @@ -18,10 +18,10 @@ from openai import OpenAI @dataclass class ToolDecision: """LLM 决策是否调用工具及调用参数""" - need_tool: bool - tool_name: str = "" - arguments: dict = None - reasoning: str = "" # 推理过程说明 + need_tool: bool + tool_name: str = "" + arguments: dict = None + reasoning: str = "" # 推理过程说明 def __post_init__(self): self.arguments = self.arguments or {} @@ -35,36 +35,46 @@ class ToolDecision: params={"name": self.tool_name, "arguments": self.arguments}, ) -class MonicaClient: +class MonicaClient: BASE_URL = "https://openapi.monica.im/v1" + def __init__(self, api_key): self.client = OpenAI(base_url=self.BASE_URL, 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 = [{ - "name": s.name, - "description": s.description, - "parameters": s.parameters} for s in tool_schemas] + "name": s.name, + "description": s.description, + "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( model=model_name, functions=tools, - messages = [ - { - "role": "user", - "content": [{ - "type": "text", - "text": user_input - }] - } - ] + messages=messages ) + self.logger.info(completion.choices[0].message.content) response = json.loads(completion.choices[0].message.content) return ToolDecision(need_tool=response['need_tool'], tool_name=response['tool_name'], arguments=response['arguments'], reasoning=response['reasoning']) + # ── LLM 引擎 ────────────────────────────────────────────────── class LLMEngine: """ @@ -82,19 +92,21 @@ class LLMEngine: """ API_KEY = "sk-AUmOuFI731Ty5Nob38jY26d8lydfDT-QkE2giqb0sCuPCAE2JH6zjLM4lZLpvL5WMYPOocaMe2FwVDmqM_9KimmKACjR" + def __init__(self, model_name: str = "claude-sonnet-4-6"): self.model_name = model_name - self.logger = get_logger("LLM") + self.logger = get_logger("LLM") self.logger.info(f"🧠 LLM 引擎初始化,模型: {model_name}") self.client = MonicaClient(api_key=self.API_KEY) # ── 核心推理流程 ──────────────────────────────────────────── def think_and_decide( - self, - user_input: str, - tool_schemas: list[ToolSchema], - context: str = "", + self, + user_input: str, + tool_schemas: list[ToolSchema], + context: str = "", + agent_prompt: str = "" ) -> ToolDecision: """ Step 1 & 2: 理解意图,决策工具调用(Think 阶段) @@ -103,7 +115,7 @@ class LLMEngine: user_input: 用户输入文本 tool_schemas: 可用工具的 Schema 列表 context: 对话历史上下文摘要 - + agent_prompt: 智能体提示词 Returns: ToolDecision 实例 """ @@ -115,7 +127,7 @@ class LLMEngine: # 调用 LLM(Demo 中使用规则模拟) # 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( f"🎯 决策结果: {'调用工具 [' + decision.tool_name + ']' if decision.need_tool else '直接回复'}" @@ -124,11 +136,11 @@ class LLMEngine: return decision def generate_final_reply( - self, - user_input: str, - tool_name: str, - tool_output: str, - context: str = "", + self, + user_input: str, + tool_name: str, + tool_output: str, + context: str = "", ) -> str: """ Step 5: 整合工具结果,生成最终自然语言回复(Observe 阶段) @@ -157,10 +169,10 @@ class LLMEngine: # ── Prompt 构造 ───────────────────────────────────────────── def _build_decision_prompt( - self, - user_input: str, - tool_schemas: list[ToolSchema], - context: str, + self, + user_input: str, + tool_schemas: list[ToolSchema], + context: str, ) -> str: """构造工具决策 Prompt(ReAct 格式)""" tools_desc = "\n".join( @@ -178,7 +190,7 @@ class LLMEngine: # ── 模拟 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 版本使用关键词规则) @@ -192,57 +204,60 @@ class LLMEngine: ) # 解析 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 ["计算", "等于", "多少", "×", "÷"]) and calc_pattern: - expr = re.sub(r"[^0-9+\-*/().**]", "", user_input.replace("×","*").replace("÷","/")) + # 规则匹配:文件读取 + 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=True, tool_name="calculator", - arguments={"expression": expr or "1+1"}, - reasoning="用户请求数学计算,调用 calculator 工具", + need_tool=False, + reasoning="问题可直接回答,无需工具", ) - # 规则匹配:搜索 - 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: """基于工具输出合成最终回复(Demo 版本)""" return ( f"✅ 已通过 [{tool_name}] 工具处理您的请求。\n\n" f"**执行结果:**\n{tool_output}\n\n" f"---\n*由 {self.model_name} 生成 · 工具: {tool_name}*" - ) \ No newline at end of file + ) diff --git a/logs/agent.log b/logs/agent.log index 00ba484..1561f7a 100644 --- a/logs/agent.log +++ b/logs/agent.log @@ -208,3 +208,213 @@ --- *由 gpt-... [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] 流程完成,回复已返回 diff --git a/main.py b/main.py index 48a7a60..b9c8902 100644 --- a/main.py +++ b/main.py @@ -6,7 +6,7 @@ main.py """ import sys - +import argparse # ── 导入各模块 ───────────────────────────────────────────────── from client.agent_client import AgentClient 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 实例 @@ -50,7 +50,7 @@ def build_agent() -> AgentClient: memory = MemoryStore(max_history=20) # 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()}") return client @@ -146,11 +146,13 @@ def main() -> None: python main.py → 交互模式(默认) 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 mode == "demo": + if args.daemon: run_demo(client) else: run_interactive(client) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f0dd0ae --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +openai \ No newline at end of file