From 1ec2b74120ec54377d7dd4138f88ac87dc41b16f Mon Sep 17 00:00:00 2001 From: MUHAMMAD SALMAN HUSSAIN <160324527+mshsheikh@users.noreply.github.com> Date: Thu, 30 Oct 2025 22:23:20 +0500 Subject: [PATCH 1/2] fix(responses): include text.format when verbosity set for plain-text responses When model_settings.verbosity was set and no output schema was provided, the code previously built response_format = {"verbosity": ...} which is an invalid `text` payload for the Responses API. The Responses API expects a `text` object to include a `format` field (for plain text use "format": "text"). This patch ensures a valid payload is sent by using: {"format": "text", "verbosity": } Impact: - Prevents 400/BadRequest errors when callers use verbosity with plain text responses (no JSON schema). - Backwards compatible for callers that already use output_schema. --- src/agents/models/openai_responses.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/agents/models/openai_responses.py b/src/agents/models/openai_responses.py index 36a981404..1382bbaa4 100644 --- a/src/agents/models/openai_responses.py +++ b/src/agents/models/openai_responses.py @@ -299,7 +299,9 @@ async def _fetch_response( if response_format is not omit: response_format["verbosity"] = model_settings.verbosity # type: ignore [index] else: - response_format = {"verbosity": model_settings.verbosity} + # When no output_schema is present, text needs an explicit format key. + # Use the plain text format with verbosity to produce a valid `text` payload. + response_format = {"format": "text", "verbosity": model_settings.verbosity} stream_param: Literal[True] | Omit = True if stream else omit @@ -501,7 +503,7 @@ def _convert_tool(cls, tool: Tool) -> tuple[ToolParam, ResponseIncludable | None } includes = None else: - raise UserError(f"Unknown tool type: {type(tool)}, tool") + raise UserError(f"Unknown tool type: {type(tool)} for tool {tool!r}") return converted_tool, includes From d61be037ae970d8dbfec39ff858302c2e02eb4b8 Mon Sep 17 00:00:00 2001 From: MUHAMMAD SALMAN HUSSAIN <160324527+mshsheikh@users.noreply.github.com> Date: Thu, 30 Oct 2025 22:39:07 +0500 Subject: [PATCH 2/2] fix(responses): use proper text.format object for plain-text verbosity Mypy reported a typing error because the `text.format` TypedDict expects an object (e.g. {"type": "text"}) not a plain string "text". Previously we set response_format = {"format": "text", "verbosity": ...} which fails type checks. This change uses the correct format object: {"format": {"type": "text"}, "verbosity": } This resolves the mypy failure and keeps the `text` payload valid for the Responses API. --- src/agents/models/openai_responses.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/agents/models/openai_responses.py b/src/agents/models/openai_responses.py index 1382bbaa4..102179e85 100644 --- a/src/agents/models/openai_responses.py +++ b/src/agents/models/openai_responses.py @@ -299,9 +299,12 @@ async def _fetch_response( if response_format is not omit: response_format["verbosity"] = model_settings.verbosity # type: ignore [index] else: - # When no output_schema is present, text needs an explicit format key. - # Use the plain text format with verbosity to produce a valid `text` payload. - response_format = {"format": "text", "verbosity": model_settings.verbosity} + # When no output_schema is present, `text` needs an explicit format object. + # Use the plain text format object with verbosity to produce a valid `text` payload. + response_format = { + "format": {"type": "text"}, + "verbosity": model_settings.verbosity, + } stream_param: Literal[True] | Omit = True if stream else omit