fix(model-server): deadline de warmup configurable pour le cold-start llama.cpp (#55)

Corrige la régression high « Error on loading local model » : le premier chargement
du serveur modèle local (cold-start llama.cpp) dépassait la fenêtre de readiness et
échouait. Le warmup dispose désormais d'un deadline par défaut de 600 s, surchargable
par config optionnelle `warmup_deadline_secs` (validée dans [30, 1800]).

- domain: champ `warmup_deadline_secs: Option<u64>` + validation de borne
- application: policy de readiness effective (défaut 600 s, override par config)
- app-tauri: DTO `warmupDeadlineSecs`
- infrastructure: application de la deadline effective au warmup

Verdict QA (vert) : domain 252, application 81 + 22 model_server, app-tauri
dto_model_servers 6, infrastructure model_server 2, build OK. Contrat readiness
couvert sur ports mockés.
Caveat : le cold-start end-to-end réel (llama-server) sort du sandbox de test ->
vérification manuelle utilisateur restante, non couverte par les tests unitaires.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-15 08:41:44 +02:00
parent ce5aa2811c
commit f7cae4c0a8
7 changed files with 200 additions and 7 deletions

View File

@ -435,6 +435,43 @@ fn progress(downloaded: Option<u64>, total: Option<u64>) -> ModelArtifactProgres
}
}
#[test]
fn readiness_policy_default_warmup_deadline_is_ten_minutes() {
assert_eq!(
ModelServerReadinessPolicy::default().warmup_deadline,
Duration::from_secs(600)
);
}
#[test]
fn effective_readiness_policy_uses_configured_warmup_deadline_when_present() {
let configured = config(sid(23), 8103, "/models/qwen.gguf", true)
.with_warmup_deadline_secs(Some(900))
.unwrap();
let unconfigured = config(sid(24), 8104, "/models/qwen.gguf", true);
let usecase = EnsureLocalModelServer::new(
Arc::new(FakeRegistry::default()),
Arc::new(FakeProbe::new(Vec::new())),
Arc::new(FakeProcess::default()),
Arc::new(FakeRuntime),
Arc::new(FakeFs::default()),
Arc::new(FakeEvents::default()),
);
assert_eq!(
usecase
.effective_readiness_policy(&configured)
.warmup_deadline,
Duration::from_secs(900)
);
assert_eq!(
usecase
.effective_readiness_policy(&unconfigured)
.warmup_deadline,
Duration::from_secs(600)
);
}
#[tokio::test]
async fn reachable_server_is_reused_without_spawn() {
let registry = Arc::new(FakeRegistry::default());