Lot 42 : outils web de l'agent exécutés par la façade

Les outils web des tours de la façade (web_search, web_images, web_open,
web_read, web_grep) ne passent plus par /tool/exec du Go : src/webtools.rs
porte chat_internet_tools.go, chat_internet.go et chat_web_images.go. Le
cache des pages (10 min, clé MD5 des options comme le Go) est dans la
façade ; client Crawl4AI au corps près, réponses lues comme json.Unmarshal ;
résultats DuckDuckGo tirés du markdown (uddg, entités, extraits) ;
recherche d'images avec le jeton vqd et les cookies gardés par hôte ;
web_grep sur les regex du Go, erreurs au texte de regexp.

Le moteur intégré lit le HTML avec go-readability et html-to-markdown, que
rien en Rust ne reproduit au caractère près : la conversion d'une page et la
lecture des résultats restent au Go, derrière /internal/v1/web/fetch et
/internal/v1/web/search (sans état). web_screenshot reste au Go.

Le traducteur go_regex refuse la répétition d'une répétition et les comptes
au-delà de 1000, et rend littéral un « { » qui n'ouvre pas de répétition,
comme le Go (motifs retry_patterns compris).

Parité : journal de 74 appels tiré du Go (parity_web_tools_test.go →
tests/parity_web/outils.json : résultats, requêtes reçues par les faux
Crawl4AI et DuckDuckGo, pages demandées au moteur intégré), rejoué par
tests/webtools.rs ; un tour de la façade qui ouvre une page (tests/lot6.rs) ;
TestInternalMoteurWebIntegre côté Go.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016tcGfJWefW5kUGoC2wL8cv
This commit is contained in:
Claude committed 2026-10-16 05:29:35 +00:00
1 parent bed6d07739
commit f66d1b7621
19 files changed
+4561 -7

No files matched your search

+9
View File
@@ -347,6 +347,8 @@ pub struct ChatShared {
/// La mémoire, quand la façade la tient (LOKI_MEM=rust) : les outils
/// `mem_*` et `tracker` du tour s'exécutent ici (lot 40).
pub memory: Option<Arc<crate::memory::Memory>>,
/// Les outils web (lot 42) : cache des pages, Crawl4AI, DuckDuckGo.
pub web: Arc<crate::webtools::Web>,
/// La version du Go, annoncée aux serveurs MCP à une reconnexion ; lue
/// une fois.
pub go_version: tokio::sync::OnceCell<String>,
@@ -698,6 +700,13 @@ impl TurnHost for GoTurnHost {
};
}
}
// Outils web (lot 42) : le cache des pages est ici.
if let Some(result) = self.shared.web.exec(&self.shared.store, name, args).await {
return ToolOutcome {
result,
..Default::default()
};
}
// Outils task_*, quand la façade tient les tâches (lot 37).
if crate::tasks::tools::is_tool(name)
&& let Some(tasks) = &self.shared.tasks