diff --git a/cmd/tapir/uploads.go b/cmd/tapir/uploads.go index fedc375..13f7d02 100644 --- a/cmd/tapir/uploads.go +++ b/cmd/tapir/uploads.go @@ -108,7 +108,12 @@ func buildTranscriber(cfg config.Config) uploads.Transcriber { // No overall client timeout: a 90 minute recording takes minutes. The deadline is // the worker's per-job context. client := &http.Client{} - primary := transcribe.NewGateway(cfg.GatewayURL, cfg.GatewayKey, cfg.TranscribeModel, client) + // Each LOCAL engine call gets its own deadline: a wedged engine does not answer, and + // without one it used the whole job before the fallback could run. + local := func(model string) transcribe.Backend { + return transcribe.WithTimeout(transcribe.NewGateway(cfg.GatewayURL, cfg.GatewayKey, model, client), cfg.TranscribeEngineTimeout) + } + primary := local(cfg.TranscribeModel) var fallback transcribe.Backend if cfg.TranscribeFallbackModel != "" && cfg.TranscribeFallbackModel != cfg.TranscribeModel { fallback = transcribe.NewGateway(cfg.GatewayURL, cfg.GatewayKey, cfg.TranscribeFallbackModel, client) @@ -117,7 +122,7 @@ func buildTranscriber(cfg config.Config) uploads.Transcriber { return transcribe.NewChain(primary, fallback) } - base := transcribe.NewGateway(cfg.GatewayURL, cfg.GatewayKey, cfg.ReconcileBaseModel, client) + base := local(cfg.ReconcileBaseModel) // Temperature 0 and a short reply: the adjudicator's accuracy was measured that way. chat := llm.New(cfg.GatewayURL, cfg.GatewayKey, cfg.ReconcileModel, adjudicatorTimeout, llm.WithTemperature(0), llm.WithMaxTokens(200))