diff --git a/lib/crewai/src/crewai/agents/agent_adapters/openai_agents/openai_agent_tool_adapter.py b/lib/crewai/src/crewai/agents/agent_adapters/openai_agents/openai_agent_tool_adapter.py index 6096ee5d0..b6cda1009 100644 --- a/lib/crewai/src/crewai/agents/agent_adapters/openai_agents/openai_agent_tool_adapter.py +++ b/lib/crewai/src/crewai/agents/agent_adapters/openai_agents/openai_agent_tool_adapter.py @@ -16,6 +16,7 @@ from crewai.agents.agent_adapters.openai_agents.protocols import ( ) from crewai.tools import BaseTool from crewai.utilities.import_utils import require +from crewai.utilities.pydantic_schema_utils import add_key_in_dict_recursively from crewai.utilities.string_utils import sanitize_tool_name @@ -135,7 +136,15 @@ class OpenAIAgentToolAdapter(BaseToolAdapter): for tool in tools: schema: dict[str, Any] = tool.args_schema.model_json_schema() - schema.update({"additionalProperties": False, "type": "object"}) + schema = add_key_in_dict_recursively( + schema, + key="additionalProperties", + value=False, + criteria=lambda d: d.get("type") == "object" + and "additionalProperties" not in d, + ) + + schema.update({"type": "object"}) openai_tool: OpenAIFunctionTool = cast( OpenAIFunctionTool, diff --git a/lib/crewai/src/crewai/utilities/pydantic_schema_utils.py b/lib/crewai/src/crewai/utilities/pydantic_schema_utils.py index 69354742b..9e1982e44 100644 --- a/lib/crewai/src/crewai/utilities/pydantic_schema_utils.py +++ b/lib/crewai/src/crewai/utilities/pydantic_schema_utils.py @@ -378,6 +378,21 @@ def create_model_from_schema( # type: ignore[no-any-unimported] """ effective_root = root_schema or json_schema + json_schema = add_key_in_dict_recursively( + json_schema, + key="additionalProperties", + value=False, + criteria=lambda d: d.get("type") == "object" + and "additionalProperties" not in d, + ) + effective_root = add_key_in_dict_recursively( + effective_root, + key="additionalProperties", + value=False, + criteria=lambda d: d.get("type") == "object" + and "additionalProperties" not in d, + ) + if "allOf" in json_schema: json_schema = _merge_all_of_schemas(json_schema["allOf"], effective_root) if "title" not in json_schema and "title" in (root_schema or {}):