Skip to content

Commit 4a98633

Browse files
cursoragentbenjibc
andcommitted
Replace SimpleNamespace with Pydantic FunctionLike model for tool definitions
Co-authored-by: bchen <bchen@fireworks.ai>
1 parent ff0b0aa commit 4a98633

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

eval_protocol/mcp/mcp_multi_client.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,15 @@
33
from contextlib import AsyncExitStack
44
from dataclasses import dataclass
55
from typing import Any, Dict, List, Optional, Union
6-
from types import SimpleNamespace
6+
from pydantic import BaseModel
7+
from typing import Optional
8+
9+
10+
class FunctionLike(BaseModel):
11+
name: Optional[str] = None
12+
description: Optional[str] = None
13+
parameters: Any = None
14+
715

816
from dotenv import load_dotenv
917
from mcp import ClientSession, StdioServerParameters
@@ -135,7 +143,7 @@ async def get_available_tools(self) -> List[Dict[str, Any]]:
135143
all_tools.append(
136144
{
137145
"type": "function",
138-
"function": SimpleNamespace(
146+
"function": FunctionLike(
139147
name=tool.name,
140148
description=tool.description,
141149
parameters=tool.inputSchema,

eval_protocol/pytest/default_agent_rollout_processor.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,14 @@
1515
from eval_protocol.models import EvaluationRow, Message
1616
from eval_protocol.pytest.rollout_processor import RolloutProcessor
1717
from eval_protocol.pytest.types import Dataset, RolloutProcessorConfig
18-
from types import SimpleNamespace
18+
from pydantic import BaseModel
19+
from typing import Optional
20+
21+
22+
class FunctionLike(BaseModel):
23+
name: Optional[str] = None
24+
parameters: Any = None
25+
1926

2027
logger = logging.getLogger(__name__)
2128

@@ -53,10 +60,10 @@ async def _get_tools(self) -> Optional[List[dict[str, Any]]]:
5360
f_params = getattr(f, "parameters", None)
5461
if hasattr(f_params, "model_dump"):
5562
f_params = f_params.model_dump()
56-
func_obj = SimpleNamespace(name=f_name, parameters=f_params)
63+
func_obj = FunctionLike(name=f_name, parameters=f_params)
5764
t = {"type": t.get("type", "function"), "function": func_obj}
5865
elif isinstance(f, dict):
59-
func_obj = SimpleNamespace(name=f.get("name"), parameters=f.get("parameters"))
66+
func_obj = FunctionLike(name=f.get("name"), parameters=f.get("parameters"))
6067
t = {"type": t.get("type", "function"), "function": func_obj}
6168
tools_dicts.append(t)
6269
continue
@@ -69,7 +76,7 @@ async def _get_tools(self) -> Optional[List[dict[str, Any]]]:
6976
params_payload = params
7077
else:
7178
params_payload = {}
72-
func_obj = SimpleNamespace(name=name, parameters=params_payload)
79+
func_obj = FunctionLike(name=name, parameters=params_payload)
7380
tools_dicts.append({"type": tool_type or "function", "function": func_obj})
7481
self.evaluation_row.tools = tools_dicts
7582
else:

0 commit comments

Comments
 (0)