Problem
The OpenAI STT client hardcodes the model:
// internal/stt/openai.go
const (
whisperModel = "whisper-1"
...
)
[openai] model exists in config but is only consumed by the LLM client, so there is no way to select OpenAI's newer transcription models — gpt-4o-transcribe and gpt-4o-mini-transcribe — which are more accurate than whisper-1 and, in the mini case, cheaper. For a voice runtime the transcription model is one of the highest-leverage quality knobs available, and right now it is welded shut.
Proposed change
Add a dedicated STT model setting rather than overloading [openai] model — the same [openai] block feeds both LLM and STT, and a single model key cannot mean gpt-4o-mini for chat and gpt-4o-transcribe for transcription at the same time.
internal/config/config.go — add STTModel string \toml:"stt_model"`toOpenAIConfig, mirroring how DeepgramConfigcarries bothmodelandtts_model`.
- Default it to
whisper-1 in Load() via setDefault, so behaviour is unchanged for existing configs.
internal/stt/openai.go — replace the whisperModel constant with a field on openaiClient, plumbed through NewOpenAIClient.
internal/stt/stt.go — pass cfg.OpenAI.STTModel at the case "openai": call site.
config.toml.example and the README provider table — document the accepted values.
Worth checking while you're in there
gpt-4o-transcribe and whisper-1 are both batch endpoints, so the existing buffer-until-silence approach in this file still applies unchanged. No VAD or streaming work is needed for this issue — keep the scope to model selection.
Acceptance criteria
Pointers
internal/stt/openai.go — whisperModel const ~L16, NewOpenAIClient ~L56
internal/stt/stt.go — NewClient, case "openai":
internal/config/config.go — OpenAIConfig ~L206, Load() defaults ~L300
Problem
The OpenAI STT client hardcodes the model:
[openai] modelexists in config but is only consumed by the LLM client, so there is no way to select OpenAI's newer transcription models —gpt-4o-transcribeandgpt-4o-mini-transcribe— which are more accurate thanwhisper-1and, in the mini case, cheaper. For a voice runtime the transcription model is one of the highest-leverage quality knobs available, and right now it is welded shut.Proposed change
Add a dedicated STT model setting rather than overloading
[openai] model— the same[openai]block feeds both LLM and STT, and a singlemodelkey cannot meangpt-4o-minifor chat andgpt-4o-transcribefor transcription at the same time.internal/config/config.go— addSTTModel string \toml:"stt_model"`toOpenAIConfig, mirroring howDeepgramConfigcarries bothmodelandtts_model`.whisper-1inLoad()viasetDefault, so behaviour is unchanged for existing configs.internal/stt/openai.go— replace thewhisperModelconstant with a field onopenaiClient, plumbed throughNewOpenAIClient.internal/stt/stt.go— passcfg.OpenAI.STTModelat thecase "openai":call site.config.toml.exampleand the README provider table — document the accepted values.Worth checking while you're in there
gpt-4o-transcribeandwhisper-1are both batch endpoints, so the existing buffer-until-silence approach in this file still applies unchanged. No VAD or streaming work is needed for this issue — keep the scope to model selection.Acceptance criteria
[openai] stt_model = "gpt-4o-transcribe"is used for transcription requests.stt_modelstill transcribes withwhisper-1.Pointers
internal/stt/openai.go—whisperModelconst ~L16,NewOpenAIClient~L56internal/stt/stt.go—NewClient,case "openai":internal/config/config.go—OpenAIConfig~L206,Load()defaults ~L300