Skip to content

Commit 4626cc1

Browse files
committed
Fix MCP prefix tool build
1 parent 6f20bf9 commit 4626cc1

3 files changed

Lines changed: 10 additions & 14 deletions

File tree

chat_runtime.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from ag_ui.core import RunAgentInput, RunErrorEvent
55
from pydantic_ai import Agent, AgentRunResult, BinaryImage, ModelRequest, ModelResponse, TextPart, UserPromptPart
66
from pydantic_ai.builtin_tools import AbstractBuiltinTool, CodeExecutionTool, ImageGenerationTool
7-
from pydantic_ai.capabilities import AbstractCapability, BuiltinTool, Thinking, Toolset
7+
from pydantic_ai.capabilities import AbstractCapability, BuiltinTool, Thinking
88
from pydantic_core import to_jsonable_python
99
from sqlalchemy.ext.asyncio import AsyncSession
1010
from starlette.responses import StreamingResponse
@@ -94,9 +94,7 @@ async def build_agent_tools_capabilities(
9494
if 'thinking' in forwarded_props.model_fields_set and forwarded_props.thinking is not None:
9595
capabilities.append(Thinking(forwarded_props.thinking))
9696
if forwarded_props.mcp_ids:
97-
capabilities.extend(
98-
Toolset(toolset) for toolset in await mcp_service.get_toolsets(db=db, mcp_ids=forwarded_props.mcp_ids)
99-
)
97+
capabilities.extend(await mcp_service.get_capabilities(db=db, mcp_ids=forwarded_props.mcp_ids))
10098

10199
tools, search_capabilities = build_chat_search_tools(
102100
web_search=forwarded_props.web_search,

plugin.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[plugin]
22
summary = 'AI'
3-
version = '0.1.0'
3+
version = '0.1.1'
44
description = '为系统提供 AI 赋能'
55
author = 'wu-clan'
66
tags = ['ai', 'mcp', 'agent']

service/mcp_service.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,18 @@
33
from collections.abc import Sequence
44
from typing import Any
55

6+
from pydantic_ai.capabilities import AbstractCapability, PrefixTools, Toolset
67
from pydantic_ai.mcp import MCPServerSSE, MCPServerStdio, MCPServerStreamableHTTP
7-
from pydantic_ai.toolsets import AbstractToolset, PrefixedToolset
88
from sqlalchemy.ext.asyncio import AsyncSession
99

1010
from backend.common.exception import errors
1111
from backend.common.pagination import paging_data
1212
from backend.plugin.ai.crud.crud_mcp import mcp_dao
13+
from backend.plugin.ai.dataclasses import ChatAgentDeps
1314
from backend.plugin.ai.enums import McpType
1415
from backend.plugin.ai.model import Mcp
1516
from backend.plugin.ai.schema.mcp import CreateMcpParam, UpdateMcpParam
1617

17-
McpToolset = AbstractToolset[Any]
18-
1918

2019
class McpService:
2120
"""MCP 服务类"""
@@ -45,16 +44,16 @@ async def get_all(*, db: AsyncSession) -> Sequence[Mcp]:
4544
return await mcp_dao.get_all(db)
4645

4746
@staticmethod
48-
async def get_toolsets(*, db: AsyncSession, mcp_ids: list[int]) -> list[McpToolset]:
47+
async def get_capabilities(*, db: AsyncSession, mcp_ids: list[int]) -> list[AbstractCapability[ChatAgentDeps]]:
4948
"""
50-
获取 MCP 工具集
49+
获取 MCP 能力
5150
5251
:param db: 数据库会话
5352
:param mcp_ids: MCP ID 列表
5453
:return:
5554
"""
5655
mcps = await mcp_dao.get_by_ids(db, mcp_ids)
57-
toolsets: list[McpToolset] = []
56+
capabilities: list[AbstractCapability[ChatAgentDeps]] = []
5857
for mcp in mcps:
5958
headers = json.loads(mcp.headers) if isinstance(mcp.headers, str) else (mcp.headers or {})
6059
if not isinstance(headers, dict):
@@ -91,9 +90,8 @@ async def get_toolsets(*, db: AsyncSession, mcp_ids: list[int]) -> list[McpTools
9190
timeout=mcp.timeout,
9291
read_timeout=mcp.read_timeout,
9392
)
94-
# 此举是为了为避免 MCP 工具名称冲突
95-
toolsets.append(PrefixedToolset(toolset, prefix=f'mcp_{mcp.id}'))
96-
return toolsets
93+
capabilities.append(PrefixTools(Toolset(toolset), prefix=f'mcp_{mcp.id}'))
94+
return capabilities
9795

9896
@staticmethod
9997
async def get_list(*, db: AsyncSession, name: str | None, type: int | None) -> dict[str, Any]:

0 commit comments

Comments
 (0)