From e659fdaa59975f70dd9259efd97c1daff05b4938 Mon Sep 17 00:00:00 2001 From: sim Date: Fri, 6 Nov 2026 23:22:53 +0100 Subject: [PATCH 1/3] ai-app: WriteTimeout ueber dem Provider-Timeout Der Server kappte Antworten nach 15s, Inferenzaufrufe (Ollama bis 120s) liefen dadurch ins Leere. Real gefunden bei /suggest/title und /suggest/correspondent mit gemma4:26b (leere Antwort, curl-Code 000). Co-Authored-By: Claude Sonnet 5.5 --- ai/cmd/ai-app/main.go | 5 ++++- ai/cmd/ai-app/main_test.go | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/ai/cmd/ai-app/main.go b/ai/cmd/ai-app/main.go index c039e182..cdd4f80d 100644 --- a/ai/cmd/ai-app/main.go +++ b/ai/cmd/ai-app/main.go @@ -49,6 +49,9 @@ import ( const workerPollInterval = 2 * time.Second +// Muss ueber dem Provider-Timeout (120s) liegen, sonst kappt der Server langsame Inferenz-Antworten. +const serverWriteTimeout = 130 * time.Second + const defaultListenAddr = "127.0.0.1:9600" const defaultModel = "default" @@ -226,7 +229,7 @@ func main() { Handler: w.mux, ReadHeaderTimeout: 5 * time.Second, ReadTimeout: 15 * time.Second, - WriteTimeout: 15 * time.Second, + WriteTimeout: serverWriteTimeout, IdleTimeout: 60 * time.Second, } diff --git a/ai/cmd/ai-app/main_test.go b/ai/cmd/ai-app/main_test.go index 84b0dd0f..26367644 100644 --- a/ai/cmd/ai-app/main_test.go +++ b/ai/cmd/ai-app/main_test.go @@ -225,3 +225,9 @@ func TestLoadConfig_PolicyRequiredUnlessDisabled(t *testing.T) { t.Fatalf("mit POLICY_DISABLED=1 darf der Start nicht scheitern: %v", err) } } + +func TestServerWriteTimeoutCoversProviderTimeout(t *testing.T) { + if serverWriteTimeout <= 120*time.Second { + t.Fatalf("serverWriteTimeout = %v, muss ueber dem Provider-Timeout von 120s liegen", serverWriteTimeout) + } +} -- 2.47.3 From 0ef867daba753b2131bbd8ed49e4661b78443690 Mon Sep 17 00:00:00 2001 From: sim Date: Fri, 6 Nov 2026 23:25:40 +0100 Subject: [PATCH 2/3] ai-app: serverWriteTimeout vor main() (vermeidet Konflikt mit Nachbar-PRs) Co-Authored-By: Claude Sonnet 5.5 --- ai/cmd/ai-app/main.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ai/cmd/ai-app/main.go b/ai/cmd/ai-app/main.go index cdd4f80d..94e3a9cc 100644 --- a/ai/cmd/ai-app/main.go +++ b/ai/cmd/ai-app/main.go @@ -49,9 +49,6 @@ import ( const workerPollInterval = 2 * time.Second -// Muss ueber dem Provider-Timeout (120s) liegen, sonst kappt der Server langsame Inferenz-Antworten. -const serverWriteTimeout = 130 * time.Second - const defaultListenAddr = "127.0.0.1:9600" const defaultModel = "default" @@ -205,6 +202,9 @@ func build(pool *pgxpool.Pool, cfg config, prov provider.Provider, workerID stri return wiring{mux: mux, queue: q, worker: worker, quotaStore: quotaStore} } +// Muss ueber dem Provider-Timeout (120s) liegen, sonst kappt der Server langsame Inferenz-Antworten. +const serverWriteTimeout = 130 * time.Second + func main() { cfg, err := loadConfig(os.Getenv) if err != nil { -- 2.47.3 From 0e625c5381fae97bad5c6d2977d347e6e36c31a9 Mon Sep 17 00:00:00 2001 From: sim Date: Fri, 6 Nov 2026 23:28:41 +0100 Subject: [PATCH 3/3] ai-app: Test an unkritische Stelle (Konflikt mit Nachbar-PRs vermeiden) Co-Authored-By: Claude Sonnet 5.5 --- ai/cmd/ai-app/main_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ai/cmd/ai-app/main_test.go b/ai/cmd/ai-app/main_test.go index 26367644..3d80efa4 100644 --- a/ai/cmd/ai-app/main_test.go +++ b/ai/cmd/ai-app/main_test.go @@ -87,6 +87,12 @@ func TestLoadConfig_Defaults(t *testing.T) { } } +func TestServerWriteTimeoutCoversProviderTimeout(t *testing.T) { + if serverWriteTimeout <= 120*time.Second { + t.Fatalf("serverWriteTimeout = %v, muss ueber dem Provider-Timeout von 120s liegen", serverWriteTimeout) + } +} + func newTestPool(t *testing.T) *pgxpool.Pool { t.Helper() dsn := os.Getenv("TEST_TENANT_DSN") @@ -225,9 +231,3 @@ func TestLoadConfig_PolicyRequiredUnlessDisabled(t *testing.T) { t.Fatalf("mit POLICY_DISABLED=1 darf der Start nicht scheitern: %v", err) } } - -func TestServerWriteTimeoutCoversProviderTimeout(t *testing.T) { - if serverWriteTimeout <= 120*time.Second { - t.Fatalf("serverWriteTimeout = %v, muss ueber dem Provider-Timeout von 120s liegen", serverWriteTimeout) - } -} -- 2.47.3