From 7a468fdc0965b4dd7a433c0db1caff1a6f52a2f0 Mon Sep 17 00:00:00 2001 From: Mathias Date: Fri, 2 Oct 2026 16:42:46 +0200 Subject: [PATCH] fix(cmd): every local engine call carries its own deadline (review F4) Co-Authored-By: Claude Sonnet 5.5 --- cmd/tapir/uploads.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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))