fix(transcription): normalize chat-style apiBase to audio endpoint (#3637)

This commit is contained in:
04cb
2026-05-23 17:32:59 +08:00
committed by Xubin Ren
parent 5b71f61f55
commit ef2ef4f789
2 changed files with 66 additions and 9 deletions
+39 -1
View File
@@ -8,7 +8,11 @@ from unittest.mock import AsyncMock, patch
import httpx
import pytest
from nanobot.providers.transcription import GroqTranscriptionProvider, OpenAITranscriptionProvider
from nanobot.providers.transcription import (
GroqTranscriptionProvider,
OpenAITranscriptionProvider,
_resolve_transcription_url,
)
@pytest.fixture
@@ -290,3 +294,37 @@ async def test_retries_on_every_advertised_transient_exception(
result = await provider.transcribe(audio_file)
assert result == "recovered"
assert post.await_count == 2
# ---------------------------------------------------------------------------
# apiBase normalization (#3637): a chat-style base must not be POSTed verbatim
# ---------------------------------------------------------------------------
def test_resolve_transcription_url_falls_back_to_default() -> None:
default = "https://api.openai.com/v1/audio/transcriptions"
assert _resolve_transcription_url(None, default) == default
assert _resolve_transcription_url("", default) == default
def test_resolve_transcription_url_appends_path_to_chat_style_base() -> None:
assert (
_resolve_transcription_url("https://api.groq.com/openai/v1", "https://x/audio/transcriptions")
== "https://api.groq.com/openai/v1/audio/transcriptions"
)
# Trailing slash must not produce a doubled separator.
assert (
_resolve_transcription_url("https://api.groq.com/openai/v1/", "https://x/audio/transcriptions")
== "https://api.groq.com/openai/v1/audio/transcriptions"
)
def test_resolve_transcription_url_keeps_full_endpoint() -> None:
full = "https://api.groq.com/openai/v1/audio/transcriptions"
assert _resolve_transcription_url(full, "https://x/audio/transcriptions") == full
def test_groq_provider_normalizes_chat_style_api_base() -> None:
"""Regression for #3637: apiBase set to the v1 base resolves to the audio endpoint."""
provider = GroqTranscriptionProvider(api_key="gsk-test", api_base="https://api.groq.com/openai/v1")
assert provider.api_url == "https://api.groq.com/openai/v1/audio/transcriptions"