From 1e5f9fc661377abf7b35d9291033d8a7626b8b4e Mon Sep 17 00:00:00 2001 From: qbc Date: Tue, 12 May 2026 17:28:18 +0800 Subject: [PATCH] fix(mcp): remove title in $defs (#1594) --- src/agentscope/_utils/_common.py | 9 +++++++++ tests/toolkit_basic_test.py | 4 ---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/agentscope/_utils/_common.py b/src/agentscope/_utils/_common.py index 4c8d83cc66..8a13a1b7e8 100644 --- a/src/agentscope/_utils/_common.py +++ b/src/agentscope/_utils/_common.py @@ -257,6 +257,15 @@ def _remove_title_field(schema: dict) -> None: schema["additionalProperties"], ) + # $defs — referenced sub-schemas, e.g. Pydantic models used as parameter + # types generate "$defs": {"SubModel": {"title": "SubModel", ...}}. + # These titles are auto-generated noise just like property titles, and + # should be removed for the same reason. + if "$defs" in schema and isinstance(schema["$defs"], dict): + for def_schema in schema["$defs"].values(): + if isinstance(def_schema, dict): + _remove_title_field(def_schema) + def _create_tool_from_base_model( structured_model: Type[BaseModel], diff --git a/tests/toolkit_basic_test.py b/tests/toolkit_basic_test.py index ea079e8bb4..4028632b8b 100644 --- a/tests/toolkit_basic_test.py +++ b/tests/toolkit_basic_test.py @@ -472,12 +472,10 @@ def func_with_nested_model(a: MyBaseModel2) -> ToolResponse: "properties": { "c": { "description": "Field c", - "title": "C", "type": "integer", }, }, "required": ["c"], - "title": "MyBaseModel1", "type": "object", }, "MyBaseModel2": { @@ -490,12 +488,10 @@ def func_with_nested_model(a: MyBaseModel2) -> ToolResponse: "items": { "$ref": "#/$defs/MyBaseModel1", }, - "title": "B", "type": "array", }, }, "required": ["b"], - "title": "MyBaseModel2", "type": "object", }, },