44
55import sys
66from pathlib import Path
7+ from typing import Any
78
8- from pydantic import BaseModel , ImportString , ValidationError
9+ from pydantic import ImportString , TypeAdapter , ValidationError
910from rich .console import Console
1011
1112from pydantic_ai import Agent
1213from pydantic_ai .builtin_tools import AbstractBuiltinTool , get_builtin_tool_cls
14+ from pydantic_ai .mcp import MCPServerSSE , MCPServerStdio , MCPServerStreamableHTTP , load_mcp_servers
1315from pydantic_ai .models import infer_model
14- from pydantic_ai .ui ._web import create_web_app , load_mcp_server_tools
16+ from pydantic_ai .ui ._web import create_web_app
1517
1618__all__ = ['_run_web_command' ]
1719
18-
19- class _AgentLoader (BaseModel ):
20- """Helper model for loading agents using Pydantic ImportString."""
21-
22- agent : ImportString # type: ignore[valid-type]
20+ _import_string_adapter : TypeAdapter [Any ] = TypeAdapter (ImportString )
2321
2422
2523def _load_agent (agent_path : str ) -> Agent | None :
@@ -33,11 +31,10 @@ def _load_agent(agent_path: str) -> Agent | None:
3331 """
3432 sys .path .insert (0 , str (Path .cwd ()))
3533 try :
36- loader = _AgentLoader (agent = agent_path )
37- agent = loader .agent # pyright: ignore[reportUnknownVariableType,reportUnknownMemberType]
38- if not isinstance (agent , Agent ):
34+ obj = _import_string_adapter .validate_python (agent_path )
35+ if not isinstance (obj , Agent ):
3936 return None
40- return agent # pyright: ignore[reportUnknownVariableType]
37+ return obj # pyright: ignore[reportUnknownVariableType]
4138 except ValidationError :
4239 return None
4340
@@ -70,13 +67,7 @@ def _run_web_command( # noqa: C901
7067 console .print (f'[red]Error: Could not load agent from { agent_path } [/red]' )
7168 return 1
7269 else :
73- agent = Agent ()
74-
75- if instructions :
76-
77- @agent .system_prompt
78- def system_prompt () -> str : # pyright: ignore[reportUnusedFunction]
79- return instructions # pragma: no cover
70+ agent = Agent (instructions = instructions )
8071
8172 if agent .model is None and not models :
8273 console .print ('[red]Error: At least one model (-m) is required when agent has no model[/red]' )
@@ -105,12 +96,12 @@ def system_prompt() -> str: # pyright: ignore[reportUnusedFunction]
10596 continue
10697 all_tool_instances .append (tool_cls ())
10798
108- # Load MCP server tools if specified
99+ # Load MCP servers as toolsets if specified
100+ mcp_servers : list [MCPServerStdio | MCPServerStreamableHTTP | MCPServerSSE ] = []
109101 if mcp :
110102 try :
111- mcp_tools = load_mcp_server_tools (mcp )
112- all_tool_instances .extend (mcp_tools )
113- console .print (f'[dim]Loaded { len (mcp_tools )} MCP server(s) from { mcp } [/dim]' )
103+ mcp_servers = load_mcp_servers (mcp )
104+ console .print (f'[dim]Loaded { len (mcp_servers )} MCP server(s) from { mcp } [/dim]' )
114105 except FileNotFoundError as e :
115106 console .print (f'[red]Error: { e } [/red]' )
116107 return 1
@@ -125,6 +116,7 @@ def system_prompt() -> str: # pyright: ignore[reportUnusedFunction]
125116 agent ,
126117 models = models ,
127118 builtin_tools = all_tool_instances if all_tool_instances else None ,
119+ toolsets = mcp_servers if mcp_servers else None ,
128120 )
129121
130122 agent_desc = agent_path if agent_path else 'generic agent'
0 commit comments