diff --git a/internal/transcriber/transcriber.go b/internal/transcriber/transcriber.go index 56a9783..a99b6e9 100644 --- a/internal/transcriber/transcriber.go +++ b/internal/transcriber/transcriber.go @@ -95,12 +95,23 @@ func NewTranscriber(config Config) (Transcriber, error) { return nil, fmt.Errorf("model %s is not a transcription model", config.Model) } - // streaming models not supported yet + // streaming models use StreamingTranscriber if model.Streaming { - return nil, fmt.Errorf("streaming model %s not supported yet (coming soon)", config.Model) + var streamingAdapter StreamingAdapter + switch model.AdapterType { + case "elevenlabs-streaming": + streamingAdapter = NewElevenLabsStreamingAdapter(model.Endpoint, config.APIKey, model.ID, config.Language) + case "deepgram": + streamingAdapter = NewDeepgramAdapter(model.Endpoint, config.APIKey, model.ID, config.Language) + case "openai-realtime": + streamingAdapter = NewOpenAIRealtimeAdapter(model.Endpoint, config.APIKey, model.ID, config.Language) + default: + return nil, fmt.Errorf("unsupported streaming adapter type: %s", model.AdapterType) + } + return NewStreamingTranscriber(streamingAdapter, config.Language), nil } - // create adapter based on model.AdapterType + // batch models use SimpleTranscriber var adapter BatchAdapter switch model.AdapterType { case "openai": diff --git a/internal/transcriber/transcriber_test.go b/internal/transcriber/transcriber_test.go index bac667a..76e374e 100644 --- a/internal/transcriber/transcriber_test.go +++ b/internal/transcriber/transcriber_test.go @@ -155,14 +155,34 @@ func TestNewTranscriber(t *testing.T) { wantErr: false, // uses default model when empty }, { - name: "streaming model returns error", + name: "elevenlabs streaming model creates StreamingTranscriber", config: Config{ Provider: "elevenlabs", APIKey: "test-key", Language: "en", Model: "scribe_v1-streaming", }, - wantErr: true, // streaming not yet supported + wantErr: false, // streaming is now supported + }, + { + name: "deepgram streaming model creates StreamingTranscriber", + config: Config{ + Provider: "deepgram", + APIKey: "test-key", + Language: "en", + Model: "nova-3", + }, + wantErr: false, + }, + { + name: "openai realtime streaming model creates StreamingTranscriber", + config: Config{ + Provider: "openai", + APIKey: "test-key", + Language: "en", + Model: "gpt-4o-realtime-preview", + }, + wantErr: false, }, { name: "unknown model returns error", diff --git a/progress.txt b/progress.txt index d1d5872..8482a49 100644 --- a/progress.txt +++ b/progress.txt @@ -405,4 +405,16 @@ Started: Sun Feb 1 12:22:47 AM CET 2026 - Sends notification error to resultsCh on successful reconnect - Context cancellation stops reconnection attempts (checked in reconnect loop) - TestOpenAIRealtimeAdapter_Reconnection verifies behavior +- All tests passing with -race flag, typecheck passes + +### Task 39: Update factory to create streaming transcribers +- Updated `NewTranscriber()` in internal/transcriber/transcriber.go +- Added streaming model check: `if model.Streaming {...}` +- For streaming models, creates appropriate StreamingAdapter based on AdapterType: + - `elevenlabs-streaming` -> `NewElevenLabsStreamingAdapter()` + - `deepgram` -> `NewDeepgramAdapter()` + - `openai-realtime` -> `NewOpenAIRealtimeAdapter()` +- Wraps streaming adapter in `NewStreamingTranscriber(adapter, config.Language)` +- Updated tests: streaming models now succeed (not error) +- Added tests for deepgram and openai-realtime streaming models - All tests passing with -race flag, typecheck passes \ No newline at end of file diff --git a/tasks/prd.jsonc b/tasks/prd.jsonc index 578fe6a..9e01932 100644 --- a/tasks/prd.jsonc +++ b/tasks/prd.jsonc @@ -911,7 +911,7 @@ "Factory creates SimpleTranscriber for whisper-1", "Typecheck passes" ], - "passes": false + "passes": true }, { "title": "Write tests for streaming adapters",