From 127c73e180dbd6a20b87eb3bf4b0ab901b7fc8c8 Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Fri, 31 Oct 2025 14:16:07 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=99=BA=E8=83=BD=E4=BD=93?= =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D=E5=B9=B6=E6=B7=BB=E5=8A=A0=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/agents/common/toolagent.py | 2 +- src/agents/common/tools.py | 2 +- src/agents/mini_agent/__init__.py | 3 ++ src/agents/mini_agent/graph.py | 49 +++++++++++++++++++ .../{multiAgent => multi_agent}/__init__.py | 0 .../{multiAgent => multi_agent}/context.py | 0 .../{multiAgent => multi_agent}/graph.py | 0 .../{multiAgent => multi_agent}/state.py | 0 .../{multiAgent => multi_agent}/tools.py | 2 - src/agents/react/graph.py | 7 ++- src/agents/react/tools.py | 3 -- src/agents/reporter/graph.py | 3 +- src/knowledge/base.py | 1 - 13 files changed, 58 insertions(+), 14 deletions(-) create mode 100644 src/agents/mini_agent/__init__.py create mode 100644 src/agents/mini_agent/graph.py rename src/agents/{multiAgent => multi_agent}/__init__.py (100%) rename src/agents/{multiAgent => multi_agent}/context.py (100%) rename src/agents/{multiAgent => multi_agent}/graph.py (100%) rename src/agents/{multiAgent => multi_agent}/state.py (100%) rename src/agents/{multiAgent => multi_agent}/tools.py (97%) diff --git a/src/agents/common/toolagent.py b/src/agents/common/toolagent.py index 38e6dfe4..c43c988c 100644 --- a/src/agents/common/toolagent.py +++ b/src/agents/common/toolagent.py @@ -84,4 +84,4 @@ class ToolAgent(BaseAgent): # Execute the tool node result = await tool_node.ainvoke(state) - return cast(dict[str, list[ToolMessage]], result) \ No newline at end of file + return cast(dict[str, list[ToolMessage]], result) diff --git a/src/agents/common/tools.py b/src/agents/common/tools.py index 4a681687..81ede3e7 100644 --- a/src/agents/common/tools.py +++ b/src/agents/common/tools.py @@ -31,7 +31,7 @@ def get_approved_user_goal( """ # 构建详细的中断信息 interrupt_info = { - "question": f"是否批准以下操作?", + "question": "是否批准以下操作?", "operation": operation_description, } diff --git a/src/agents/mini_agent/__init__.py b/src/agents/mini_agent/__init__.py new file mode 100644 index 00000000..b3f7b398 --- /dev/null +++ b/src/agents/mini_agent/__init__.py @@ -0,0 +1,3 @@ +from .graph import MiniAgent + +__all__ = ["MiniAgent"] diff --git a/src/agents/mini_agent/graph.py b/src/agents/mini_agent/graph.py new file mode 100644 index 00000000..68f2f02b --- /dev/null +++ b/src/agents/mini_agent/graph.py @@ -0,0 +1,49 @@ + +from langchain.agents import create_agent +from langchain.agents.middleware import ModelRequest, ModelResponse, dynamic_prompt, wrap_model_call + +from src.agents.common.base import BaseAgent +from src.agents.common.models import load_chat_model +from src.agents.common.tools import get_buildin_tools + + +@dynamic_prompt +def context_aware_prompt(request: ModelRequest) -> str: + runtime = request.runtime + return runtime.context.system_prompt + + +@wrap_model_call +async def context_based_model(request: ModelRequest, handler) -> ModelResponse: + # 从 runtime context 读取配置 + model_spec = request.runtime.context.model + model = load_chat_model(model_spec) + + request = request.override(model=model) + return await handler(request) + + +class MiniAgent(BaseAgent): + name = "智能体 Demo" + description = "一个基于内置工具的智能体示例" + + def __init__(self, **kwargs): + super().__init__(**kwargs) + + def get_tools(self): + return get_buildin_tools() + + async def get_graph(self, **kwargs): + if self.graph: + return self.graph + + # 创建 MiniAgent + graph = create_agent( + model=load_chat_model("siliconflow/Qwen/Qwen3-235B-A22B-Instruct-2507"), # 实际会被覆盖 + tools=self.get_tools(), + middleware=[context_aware_prompt, context_based_model], + checkpointer=await self._get_checkpointer(), + ) + + self.graph = graph + return graph diff --git a/src/agents/multiAgent/__init__.py b/src/agents/multi_agent/__init__.py similarity index 100% rename from src/agents/multiAgent/__init__.py rename to src/agents/multi_agent/__init__.py diff --git a/src/agents/multiAgent/context.py b/src/agents/multi_agent/context.py similarity index 100% rename from src/agents/multiAgent/context.py rename to src/agents/multi_agent/context.py diff --git a/src/agents/multiAgent/graph.py b/src/agents/multi_agent/graph.py similarity index 100% rename from src/agents/multiAgent/graph.py rename to src/agents/multi_agent/graph.py diff --git a/src/agents/multiAgent/state.py b/src/agents/multi_agent/state.py similarity index 100% rename from src/agents/multiAgent/state.py rename to src/agents/multi_agent/state.py diff --git a/src/agents/multiAgent/tools.py b/src/agents/multi_agent/tools.py similarity index 97% rename from src/agents/multiAgent/tools.py rename to src/agents/multi_agent/tools.py index 19c4e417..f5dcef34 100644 --- a/src/agents/multiAgent/tools.py +++ b/src/agents/multi_agent/tools.py @@ -1,11 +1,9 @@ -import os from typing import Any from langchain.tools import tool from langchain_core.runnables import RunnableConfig from src.agents import agent_manager -from src.agents.common.toolkits.mysql import get_mysql_tools from src.agents.common.tools import get_buildin_tools from src.utils import logger diff --git a/src/agents/react/graph.py b/src/agents/react/graph.py index b4abb844..f311cdbd 100644 --- a/src/agents/react/graph.py +++ b/src/agents/react/graph.py @@ -1,4 +1,4 @@ -from langgraph.constants import START, END +from langgraph.constants import END from langgraph.graph import StateGraph from src.agents.common.toolagent import ToolAgent @@ -18,10 +18,9 @@ def tools_branch_continue(state: State): class ReActAgent(ToolAgent): - name = "智能体 Demo" - description = "A react agent that can answer questions and help with tasks." + name = "ReActAgent" + description = "符合 ReAct 范式的智能体,可以通过调用工具来完成复杂任务。" - # TODO:[已完成] React智能体 ''' 提示词示例: 你是一个智能体助手 diff --git a/src/agents/react/tools.py b/src/agents/react/tools.py index f3ec28cc..5dd1c766 100644 --- a/src/agents/react/tools.py +++ b/src/agents/react/tools.py @@ -1,12 +1,9 @@ -import os from typing import Any -import requests from langchain.tools import tool from src.agents.common.toolkits.mysql import get_mysql_tools from src.agents.common.tools import get_buildin_tools -from src.storage.minio import upload_image_to_minio from src.utils import logger @tool(name_or_callable="加密计算器", description="可以对给定的2个数字选择进行加减乘除四种加密计算") diff --git a/src/agents/reporter/graph.py b/src/agents/reporter/graph.py index 8402722a..351e17ba 100644 --- a/src/agents/reporter/graph.py +++ b/src/agents/reporter/graph.py @@ -1,5 +1,4 @@ import textwrap -from pathlib import Path from langchain.agents import create_agent from langchain.agents.middleware import ModelRequest, ModelResponse, dynamic_prompt, wrap_model_call @@ -64,4 +63,4 @@ class SqlReporterAgent(BaseAgent): self.graph = graph logger.info("SqlReporterAgent 构建成功") - return graph \ No newline at end of file + return graph diff --git a/src/knowledge/base.py b/src/knowledge/base.py index 2eb643a4..329cb964 100644 --- a/src/knowledge/base.py +++ b/src/knowledge/base.py @@ -136,7 +136,6 @@ class KnowledgeBase(ABC): """ from src.utils import hashstr - from src.utils import hashstr # 从 kwargs 中获取 is_private 配置 is_private = kwargs.get('is_private', False)