Implement API URL resolution in OpenAICompatibleASRService to ensure correct endpoint handling for transcription requests.

This commit is contained in:
Xin Wang
2026-02-26 12:04:59 +08:00
parent 37b646186d
commit cfc8db3fe7

View File

@@ -9,6 +9,7 @@ import io
import os import os
import wave import wave
from typing import AsyncIterator, Optional, Callable, Awaitable from typing import AsyncIterator, Optional, Callable, Awaitable
from urllib.parse import urlparse, urlunparse
from loguru import logger from loguru import logger
try: try:
@@ -75,7 +76,8 @@ class OpenAICompatibleASRService(BaseASRService):
raise RuntimeError("aiohttp is required for OpenAICompatibleASRService") raise RuntimeError("aiohttp is required for OpenAICompatibleASRService")
self.api_key = api_key or os.getenv("ASR_API_KEY") or os.getenv("SILICONFLOW_API_KEY") self.api_key = api_key or os.getenv("ASR_API_KEY") or os.getenv("SILICONFLOW_API_KEY")
self.api_url = api_url or os.getenv("ASR_API_URL") or self.API_URL raw_api_url = api_url or os.getenv("ASR_API_URL") or self.API_URL
self.api_url = self._resolve_transcriptions_endpoint(raw_api_url)
self.model = self.MODELS.get(model.lower(), model) self.model = self.MODELS.get(model.lower(), model)
self.interim_interval_ms = interim_interval_ms self.interim_interval_ms = interim_interval_ms
self.min_audio_for_interim_ms = min_audio_for_interim_ms self.min_audio_for_interim_ms = min_audio_for_interim_ms
@@ -98,6 +100,30 @@ class OpenAICompatibleASRService(BaseASRService):
logger.info(f"OpenAICompatibleASRService initialized with model: {self.model}") logger.info(f"OpenAICompatibleASRService initialized with model: {self.model}")
@staticmethod
def _resolve_transcriptions_endpoint(api_url: str) -> str:
"""
Accept either:
- base URL: https://host/v1
- full endpoint: https://host/v1/audio/transcriptions
and always return the final transcriptions endpoint URL.
"""
raw = str(api_url or "").strip()
if not raw:
return OpenAICompatibleASRService.API_URL
parsed = urlparse(raw)
path = (parsed.path or "").rstrip("/")
if path.endswith("/audio/transcriptions"):
return raw
if not path:
new_path = "/audio/transcriptions"
else:
new_path = f"{path}/audio/transcriptions"
return urlunparse(parsed._replace(path=new_path))
async def connect(self) -> None: async def connect(self) -> None:
"""Connect to the service.""" """Connect to the service."""
if not self.api_key: if not self.api_key: