From 48e08eebb8df6bf41b571859d679de506daa5eb6 Mon Sep 17 00:00:00 2001 From: liubiren Date: Wed, 3 Jun 2026 00:36:07 +0800 Subject: [PATCH] =?UTF-8?q?260603=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- parameters.pkl | Bin 18893 -> 0 bytes pyproject.toml | 0 utils/agent.py | 91 +++++++++++++++++++++++++------------------------ 3 files changed, 46 insertions(+), 45 deletions(-) delete mode 100644 parameters.pkl delete mode 100644 pyproject.toml diff --git a/parameters.pkl b/parameters.pkl deleted file mode 100644 index b051368a40426b5145e6fc160ef91701696e0bcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18893 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 BWG?^! diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index e69de29..0000000 diff --git a/utils/agent.py b/utils/agent.py index ee50462..e42a662 100644 --- a/utils/agent.py +++ b/utils/agent.py @@ -6,31 +6,32 @@ # 列举导入模块 from pathlib import Path from sys import path -from typing import List, Optional, cast +from typing import List, Optional, Union, cast +from typing import TypeVar from uuid import uuid4 +from mistralai.client.models import Op from pydantic_ai import Agent as BaseAgent, AgentRunResult -from pydantic_ai.builtin_tools import AbstractBuiltinTool from pydantic_ai.capabilities import AgentCapability from pydantic_ai.models.openai import OpenAIChatModel +from pydantic_ai.native_tools import AbstractNativeTool from pydantic_ai.output import OutputSpec from pydantic_ai.providers.openai import OpenAIProvider -from pydantic_ai.settings import ModelSettings -from pydantic_core.core_schema import is_subclass_schema from starlette.applications import Starlette from starlette.routing import Mount, Route -from typing_extensions import is_protocol - -from memory import Memory path.append(Path(__file__).resolve().parent.as_posix()) +from memory import Memory + +AgentDepsT = TypeVar("AgentDepsT") +OutputDataT = TypeVar("OutputDataT") class Agent: """ 智能体,支持: - 1)实例智能体 - 2)异步运行 + 1 实例智能体 + 2 异步运行 """ def __init__( @@ -108,23 +109,25 @@ class Agent: def create_web_application( self, - builtin_tools: Optional[List[AbstractBuiltinTool]] = None, + native_tools: Optional[List[AbstractNativeTool]] = None, + html_source: Optional[Union[str, Path]] = None, ) -> Starlette: """ 创建 Starlette 应用,为智能体提供交互式对话界面 - :param builtin_tools: 前端可选工具列表 + :param native_tools: 前端可选工具列表 :return: Starlette 实例 """ from starlette.requests import Request from starlette.responses import JSONResponse, HTMLResponse, Response def api( - self, - builtin_tools: Optional[List[AbstractBuiltinTool]] = None, + agent: BaseAgent[AgentDepsT, OutputDataT], + native_tools: Optional[List[AbstractNativeTool]] = None, ) -> Starlette: """ - 创建 API 应用 - :param builtin_tools: 前端可选工具列表 + 创建处理请求应用 + :param agnet: 智能体 + :param native_tools: 前端可选原生工具列表 :return: Starlette 实例 """ from pydantic_ai.models import Model @@ -136,26 +139,25 @@ class Agent: validate_request_options, ) from pydantic_ai.ui.vercel_ai import VercelAIAdapter - from typing import TypeVar + from pydantic_ai.capabilities import NativeTool - agent_model = cast(Model, self.agent.model) + async def options(request: Request) -> Response: + """处理跨域预检请求""" + return Response() - # 前端可选工具列表 - frontend_builtin_tools = [ + agent_model = cast(Model, agent.model) + # 前端可选原生工具列表 + frontend_native_tools = [ t - for t in (builtin_tools or []) + for t in (native_tools or []) if t.unique_id not in { t.unique_id - for t in self.agent._cap_builtin_tools - if isinstance(t, AbstractBuiltinTool) + for t in agent._cap_native_tools + if isinstance(t, AbstractNativeTool) } ] - async def options_chat(request: Request) -> Response: - """处理跨域预检请求""" - return Response() - async def configurations(request: Request) -> Response: """处理前端模型与工具配置请求""" configurations = ConfigureFrontend( @@ -165,14 +167,14 @@ class Agent: name=agent_model.label, builtin_tools=[ t.unique_id - for t in frontend_builtin_tools - if type(t) in agent_model.supported_builtin_tools() + for t in frontend_native_tools + if type(t) in agent_model.profile.supported_native_tools ], ) - ], # 前端仅可选择智能体配置的模型 + ], # 前端仅可选择智能体已配置的模型 builtin_tools=[ BuiltinToolInfo(id=t.unique_id, name=t.label) - for t in frontend_builtin_tools + for t in frontend_native_tools ], ) return JSONResponse(content=configurations.model_dump(by_alias=True)) @@ -184,14 +186,14 @@ class Agent: TypeVar("AgentDepsT"), TypeVar("OutputDataT") ].from_request(request=request, agent=self.agent) - # 解析请求中额外数据,包括前端选择的模型标识、工具标识和其它配置等 + # 解析请求中额外数据,包括前端选择的模型标识、原生工具标识和其它配置等 extra_data = ChatRequestExtra.model_validate( adapter.run_input.__pydantic_extra__ ) if error := validate_request_options( extra_data=extra_data, - model_ids={agent_model.model_id}, # 前端仅可选择智能体配置的模型 - builtin_tool_ids={t.unique_id for t in frontend_builtin_tools}, + model_ids={agent_model.model_id}, # 前端仅可选择智能体已配置的模型 + builtin_tool_ids={t.unique_id for t in frontend_native_tools}, ): return JSONResponse(content={"error": error}, status_code=400) @@ -200,9 +202,9 @@ class Agent: ].dispatch_request( request=request, agent=self.agent, - builtin_tools=[ - t - for t in frontend_builtin_tools + capabilities=[ + NativeTool(t) + for t in frontend_native_tools if t.unique_id in extra_data.builtin_tools ], ) @@ -214,15 +216,17 @@ class Agent: return Starlette( routes=[ + Route("/chat", options, methods=["OPTIONS"]), Route("/configure", configurations, methods=["GET"]), - Route("/chat", options_chat, methods=["OPTIONS"]), Route("/chat", chat, methods=["POST"]), Route("/health", health, methods=["GET"]), ] ) - async def ui(request: Request) -> Response: - """Serve the chat UI from filesystem cache or CDN.""" + async def index(request: Request) -> Response: + """S处理聊天界面请求""" + from pydantic_ai.ui._web.app import _get_ui_html + content = await _get_ui_html(html_source) return HTMLResponse( @@ -236,14 +240,11 @@ class Agent: routes=[ Mount( "/api", - app=api(self, builtin_tools=builtin_tools), + app=api(agent=self.agent, native_tools=native_tools), ) ] ) - - app.router.add_route("/", ui, methods=["GET"]) - app.router.add_route("/{id}", ui, methods=["GET"]) - - exit() + application.router.add_route("/", index, methods=["GET"]) + application.router.add_route("/{id}", index, methods=["GET"]) return application