fix(transcription): harden language parameter validation and tests

- Add ISO-639 pattern validation (2-3 lowercase letters) to schema
- Normalize empty language to None in provider constructors
- Extract shared httpx mock stubs, parameterize provider tests
- Add test for language=None omitting field from multipart body
- Add test for Pydantic pattern validation rejecting invalid codes
This commit is contained in:
chengyongru
2026-04-22 12:41:32 +08:00
committed by Xubin Ren
parent 123d69bfb7
commit f6a417e77d
3 changed files with 73 additions and 21 deletions
+1 -1
View File
@@ -29,7 +29,7 @@ class ChannelsConfig(Base):
send_tool_hints: bool = False # stream tool-call hints (e.g. read_file("…"))
send_max_retries: int = Field(default=3, ge=0, le=10) # Max delivery attempts (initial send included)
transcription_provider: str = "groq" # Voice transcription backend: "groq" or "openai"
transcription_language: str | None = None # Optional ISO-639-1 hint for audio transcription
transcription_language: str | None = Field(default=None, pattern=r"^[a-z]{2,3}$") # Optional ISO-639-1 hint for audio transcription
class DreamConfig(Base):
+2 -2
View File
@@ -22,7 +22,7 @@ class OpenAITranscriptionProvider:
or os.environ.get("OPENAI_TRANSCRIPTION_BASE_URL")
or "https://api.openai.com/v1/audio/transcriptions"
)
self.language = language
self.language = language or None
async def transcribe(self, file_path: str | Path) -> str:
if not self.api_key:
@@ -64,7 +64,7 @@ class GroqTranscriptionProvider:
):
self.api_key = api_key or os.environ.get("GROQ_API_KEY")
self.api_url = api_base or os.environ.get("GROQ_BASE_URL") or "https://api.groq.com/openai/v1/audio/transcriptions"
self.language = language
self.language = language or None
async def transcribe(self, file_path: str | Path) -> str:
"""