Fusion de main : conversation Rust par défaut, télémétrie du tour

main a reçu en parallèle la télémétrie du tour tenu par la façade
(/internal/v1/turn/perf), les tickets « en vol » du moteur et la
conversation tenue par la façade par défaut (LOKI_CHAT=go pour revenir
au Go). Le lot 29 faisait la même chose par /internal/v1/perf/record :
un seul chemin est gardé, celui de main.

- TurnHost::perf_record (main) remplace TurnHost::perf ; la nature est
  posée par l'hôte (verify pour la passe isolée seulement, main pour les
  corrections du builder, comme le Go).
- Les résumés de compaction passent par le même point d'entrée, nature
  compact : chat/perf.rs ne garde que le relevé de la réponse entière
  (perfRecFromWire) et l'envoi.
- La sonde du gabarit reste à la façade (lot 23) : /internal/v1/turn/perf
  ne la lance plus côté Go.
- facade_perf.go retiré ; ses cas (perte, intercalé, alerte, preset
  externe, incomplète, GET) rejoignent web_internal_turnperf_test.go.
- README : LOKI_CHAT défaut Rust, avec ce que les lots 19, 23, 29 et 30
  y ajoutent.

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 01:53:53 +00:00
commit 89ed527c96
20 files changed
+713 -457

No files matched your search

+31 -6
View File
@@ -123,9 +123,9 @@ fn serve() -> ExitCode {
return ExitCode::FAILURE;
}
};
// LOKI_CHAT=rust : la conversation est tenue par la façade. Le Go le
// sait (il remet alors à la façade le trafic de chat du tunnel) et
// connaît son adresse locale.
// Conversation tenue par la façade (défaut ; LOKI_CHAT=go pour la
// rendre au Go). Le Go le sait (il remet alors à la façade le trafic
// de chat du tunnel) et connaît son adresse locale.
let chat_rust = chat_held_by_facade();
// LOKI_MODELS=rust : les routes des modèles aussi (le Go remet alors
// celles du tunnel et ne vide plus les .part).
@@ -414,9 +414,19 @@ fn serve() -> ExitCode {
})
}
/// `LOKI_CHAT=rust` : conversation tenue par la façade (Go par défaut).
/// Conversation tenue par la façade : c'est le défaut. `LOKI_CHAT=go` (ou
/// 0/off/false/no) la rend au Go — porte de sortie. Le Go la garde de toute
/// façon si un réglage que la façade ne sait pas honorer est posé
/// (`facadeChatBlocker`).
fn chat_held_by_facade() -> bool {
std::env::var("LOKI_CHAT").is_ok_and(|v| v.trim().eq_ignore_ascii_case("rust"))
chat_wanted(std::env::var("LOKI_CHAT").ok().as_deref())
}
fn chat_wanted(v: Option<&str>) -> bool {
!matches!(
v.map(|v| v.trim().to_ascii_lowercase()).as_deref(),
Some("go" | "0" | "off" | "false" | "no")
)
}
/// `LOKI_MODELS=rust` : routes des modèles tenues par la façade.
@@ -512,7 +522,7 @@ async fn start_chat(
s.load().await?;
let mut shared = ChatShared::for_sessions(&s, store.clone(), home.join("chatimg"));
shared.patterns = loki_rs::chat::generate::retry_patterns(&store).await;
eprintln!("[loki-rs] conversation tenue par la façade (LOKI_CHAT=rust)");
eprintln!("[loki-rs] conversation tenue par la façade (LOKI_CHAT=go pour la rendre au Go)");
Ok(ChatService::new(
std::sync::Arc::new(s),
std::sync::Arc::new(shared),
@@ -559,3 +569,18 @@ async fn shutdown_signal() {
let _ = tokio::signal::ctrl_c().await;
}
}
#[cfg(test)]
mod tests {
#[test]
fn conversation_tenue_par_la_facade_par_defaut() {
use super::chat_wanted;
assert!(chat_wanted(None));
assert!(chat_wanted(Some("")));
assert!(chat_wanted(Some("rust")));
assert!(chat_wanted(Some(" RUST ")));
for v in ["go", "GO", "0", "off", "false", "no"] {
assert!(!chat_wanted(Some(v)), "{v}");
}
}
}