From 6e83efab8eb455a3c46d3dd2ad6a8bc6880910d2 Mon Sep 17 00:00:00 2001 From: Chris Guidry Date: Tue, 4 Aug 2026 13:20:06 -0400 Subject: [PATCH] Give a reasoning model five minutes to start its reply The response limit bounds the wait for the first bytes of a round's reply, and it was 60 seconds. A reasoning model spends its whole deliberation before any byte reaches the wire, because the provider holds the stream silent while the model thinks, so the high reasoning_effort from d9a7bde made DeepSeek-V4-Flash overrun the limit mid-turn and fail a live character roll with timeout: receive response. Five minutes bounds a dead provider without cutting off a model that is merely thinking, the same reading the 600-second body limit already states for a stream that has started. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01HvctyUUkzw7PcNrjCGG6dF --- src/chat/client.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/chat/client.rs b/src/chat/client.rs index 2a4cf4d..0adf83d 100644 --- a/src/chat/client.rs +++ b/src/chat/client.rs @@ -36,7 +36,13 @@ impl Default for Limits { fn default() -> Self { Self { connect: Duration::from_secs(10), - response: Duration::from_secs(60), + // This waits for the first bytes of the reply, and a + // reasoning model spends its whole deliberation before any + // byte reaches the wire: the provider holds the stream + // silent while the model thinks, so a high reasoning effort + // makes minutes of silence normal. Like `body`, this is a + // bound on a dead provider, not a budget for the model. + response: Duration::from_secs(300), // ureq measures this over the whole body, and the body of a // streamed turn is the whole turn. So this is a bound on a // dead connection, not a budget for the model: a healthy turn -- 2.51.2