From 68dd65cd5a27c7b70564b10b778b0853b8d2af74 Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Fri, 16 Oct 2026 14:59:17 +0200 Subject: [PATCH] =?UTF-8?q?Fa=C3=A7ade=20:=20motifs=20de=20relance=20vides?= =?UTF-8?q?=20=C3=A9cart=C3=A9s,=20comme=20le=20Go?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Un motif vide (ou blanc) dans retry_patterns donnait (?mi), qui correspond à tout : chaque tour était relancé une fois (OpenFox 8e9b4869). Sans un seul motif utilisable, la façade retombe sur les motifs embarqués, comme compileRetryPatterns côté Go. Co-Authored-By: Claude Opus 5.5 --- rust/loki-rs/src/chat/stream.rs | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/rust/loki-rs/src/chat/stream.rs b/rust/loki-rs/src/chat/stream.rs index 69614fb..259c3f1 100644 --- a/rust/loki-rs/src/chat/stream.rs +++ b/rust/loki-rs/src/chat/stream.rs @@ -922,11 +922,19 @@ impl RetryPatterns { if over.is_empty() { return None; } - let pats = over + // Un motif vide (ou blanc) est écarté : `(?mi)` correspond à TOUT, et + // chaque tour était relancé une fois (OpenFox 8e9b4869). Sans un seul + // motif utilisable, les motifs embarqués, comme le Go + // (compileRetryPatterns). + let pats: Vec> = over .iter() + .filter(|p| !p.trim().is_empty()) .filter_map(|p| compile_go_regex(&format!("(?mi){p}"))) .map(|r| Box::new(GoRegex(r)) as Box) .collect(); + if pats.is_empty() { + return None; + } Some(RetryPatterns::custom(pats)) } @@ -2907,10 +2915,19 @@ mod tests { /// en `(?mi)`, sémantique du Go (classes et limites de mot ASCII). #[test] fn surcharge_retry_patterns() { - for raw in ["", "null", "[]", "[\"a\", 1]", "\"x\"", "[\"a\"] x"] { + for raw in [ + "", + "null", + "[]", + "[\"a\", 1]", + "\"x\"", + "[\"a\"] x", + "[\"\"]", + "[\" \", \"(\"]", + ] { assert!(RetryPatterns::from_override(raw).is_none(), "{raw}"); } - let p = RetryPatterns::from_override(r#"["^oups", "[", "\\bdo_\\w+\\("]"#).unwrap(); + let p = RetryPatterns::from_override(r#"["^oups", "[", "", "\\bdo_\\w+\\("]"#).unwrap(); assert!(p.is_custom()); assert_eq!(p.len(), 2, "la regex illisible est sautée"); assert!(p.textual_tool_call("Bonjour\nOUPS !"));