From 62ff48a129ab6aada8e1773ce3bba16eb80802f8 Mon Sep 17 00:00:00 2001 From: kamilbenkirane Date: Sat, 29 Aug 2026 21:07:13 +0200 Subject: [PATCH] feat(openai): add GPT Transcribe audio model --- .../audio/providers/openai/models.py | 8 +++++++ .../providers/openai/audio/parameters.py | 3 ++- .../test_openai_audio_transcribe.py | 22 ++++++++++++++++--- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/celeste/modalities/audio/providers/openai/models.py b/src/celeste/modalities/audio/providers/openai/models.py index f6a40b1f..fce97caa 100644 --- a/src/celeste/modalities/audio/providers/openai/models.py +++ b/src/celeste/modalities/audio/providers/openai/models.py @@ -82,6 +82,14 @@ AudioParameter.OUTPUT_FORMAT: Choice(options=_RESPONSE_FORMAT_OPTIONS), }, ), + Model( + id="gpt-transcribe", + provider=Provider.OPENAI, + display_name="GPT Transcribe", + streaming=False, + operations={Modality.AUDIO: {Operation.TRANSCRIBE}}, + parameter_constraints=_TRANSCRIBE_CONSTRAINTS, + ), Model( id="gpt-4o-mini-transcribe", provider=Provider.OPENAI, diff --git a/src/celeste/providers/openai/audio/parameters.py b/src/celeste/providers/openai/audio/parameters.py index 944e8077..fde6a54f 100644 --- a/src/celeste/providers/openai/audio/parameters.py +++ b/src/celeste/providers/openai/audio/parameters.py @@ -91,7 +91,8 @@ def map( validated_value = self._validate_value(value, model) if validated_value is None: return request - request["language"] = validated_value + field = "languages[]" if model.id == "gpt-transcribe" else "language" + request[field] = validated_value return request diff --git a/tests/unit_tests/test_openai_audio_transcribe.py b/tests/unit_tests/test_openai_audio_transcribe.py index 880c9835..67a657f4 100644 --- a/tests/unit_tests/test_openai_audio_transcribe.py +++ b/tests/unit_tests/test_openai_audio_transcribe.py @@ -8,15 +8,16 @@ from celeste.mime_types import AudioMimeType from celeste.modalities.audio.io import AudioInput from celeste.modalities.audio.providers.openai.client import OpenAIAudioClient +from celeste.modalities.audio.providers.openai.models import MODELS from celeste.models import Model -def _client() -> OpenAIAudioClient: +def _client(model_id: str = "gpt-4o-mini-transcribe") -> OpenAIAudioClient: return OpenAIAudioClient( model=Model( - id="gpt-4o-mini-transcribe", + id=model_id, provider=Provider.OPENAI, - display_name="GPT-4o Mini Transcribe", + display_name=model_id, operations={Modality.AUDIO: {Operation.TRANSCRIBE}}, ), auth=AuthHeader(secret=SecretStr("test")), @@ -40,6 +41,21 @@ def test_build_request_adds_model_and_default_response_format() -> None: assert request["language"] == "en" +def test_gpt_transcribe_uses_plural_language_field() -> None: + audio = AudioArtifact(data=b"fake-audio", mime_type=AudioMimeType.WAV) + request = _client("gpt-transcribe")._build_request( + AudioInput(audio=audio), language="en" + ) + assert request["languages[]"] == "en" + assert "language" not in request + + +def test_gpt_transcribe_is_registered_for_file_transcription() -> None: + model = next(model for model in MODELS if model.id == "gpt-transcribe") + assert model.operations == {Modality.AUDIO: {Operation.TRANSCRIBE}} + assert model.streaming is False + + def test_parse_content_returns_transcript_text() -> None: assert _client()._parse_content({"text": "hello world"}) == "hello world"