Skip to content

Commit 886b9fc

Browse files
authored
fix: #1916 openai_chatcompletions.Converter.extract_all_content does not support input_audio type items (#1918)
1 parent 630cd37 commit 886b9fc

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

src/agents/models/chatcmpl_converter.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from openai.types.chat import (
99
ChatCompletionAssistantMessageParam,
1010
ChatCompletionContentPartImageParam,
11+
ChatCompletionContentPartInputAudioParam,
1112
ChatCompletionContentPartParam,
1213
ChatCompletionContentPartTextParam,
1314
ChatCompletionDeveloperMessageParam,
@@ -27,6 +28,7 @@
2728
ResponseFileSearchToolCallParam,
2829
ResponseFunctionToolCall,
2930
ResponseFunctionToolCallParam,
31+
ResponseInputAudioParam,
3032
ResponseInputContentParam,
3133
ResponseInputFileParam,
3234
ResponseInputImageParam,
@@ -287,6 +289,32 @@ def extract_all_content(
287289
},
288290
)
289291
)
292+
elif isinstance(c, dict) and c.get("type") == "input_audio":
293+
casted_audio_param = cast(ResponseInputAudioParam, c)
294+
audio_payload = casted_audio_param.get("input_audio")
295+
if not audio_payload:
296+
raise UserError(
297+
f"Only audio data is supported for input_audio {casted_audio_param}"
298+
)
299+
if not isinstance(audio_payload, dict):
300+
raise UserError(
301+
f"input_audio must provide audio data and format {casted_audio_param}"
302+
)
303+
audio_data = audio_payload.get("data")
304+
audio_format = audio_payload.get("format")
305+
if not audio_data or not audio_format:
306+
raise UserError(
307+
f"input_audio requires both data and format {casted_audio_param}"
308+
)
309+
out.append(
310+
ChatCompletionContentPartInputAudioParam(
311+
type="input_audio",
312+
input_audio={
313+
"data": audio_data,
314+
"format": audio_format,
315+
},
316+
)
317+
)
290318
elif isinstance(c, dict) and c.get("type") == "input_file":
291319
casted_file_param = cast(ResponseInputFileParam, c)
292320
if "file_data" not in casted_file_param or not casted_file_param["file_data"]:

tests/test_openai_chatcompletions_converter.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
from openai.types.responses import (
3333
ResponseFunctionToolCall,
3434
ResponseFunctionToolCallParam,
35+
ResponseInputAudioParam,
3536
ResponseInputTextParam,
3637
ResponseOutputMessage,
3738
ResponseOutputRefusal,
@@ -280,6 +281,36 @@ def test_extract_all_and_text_content_for_strings_and_lists():
280281
assert [p["text"] for p in text_parts] == ["one", "two"]
281282

282283

284+
def test_extract_all_content_handles_input_audio():
285+
"""
286+
input_audio entries should translate into ChatCompletion input_audio parts.
287+
"""
288+
audio: ResponseInputAudioParam = {
289+
"type": "input_audio",
290+
"input_audio": {"data": "AAA=", "format": "wav"},
291+
}
292+
parts = Converter.extract_all_content([audio])
293+
assert isinstance(parts, list)
294+
assert parts == [
295+
{
296+
"type": "input_audio",
297+
"input_audio": {"data": "AAA=", "format": "wav"},
298+
}
299+
]
300+
301+
302+
def test_extract_all_content_rejects_invalid_input_audio():
303+
"""
304+
input_audio requires both data and format fields to be present.
305+
"""
306+
audio_missing_data = cast(ResponseInputAudioParam, {
307+
"type": "input_audio",
308+
"input_audio": {"format": "wav"},
309+
})
310+
with pytest.raises(UserError):
311+
Converter.extract_all_content([audio_missing_data])
312+
313+
283314
def test_items_to_messages_handles_system_and_developer_roles():
284315
"""
285316
Roles other than `user` (e.g. `system` and `developer`) need to be

0 commit comments

Comments
 (0)