Lot 14 : ligne de commande du moteur composée en Rust (LOKI_SERVE=rust)

loki-rs engine serve fait ce que faisait loki serve : lire la
configuration (par l'API interne du Go), sonder le monde (aide du moteur,
--version, --list-devices, GGUF, RAM, VRAM, cgroup, cpuset, variables
LLAMA_ARG_*/GGML_*), composer la ligne de llama-server, vérifier le port,
garder la commande pour l'interface, puis exec. Le superviseur le lance à
la place de loki serve quand LOKI_SERVE=rust (expérimental ; le Go reste
le défaut).

serve/ porte backend_serve*.go fonction par fonction (couches GPU, --fit
et sa marge, threads, files CUDA, second slot, mode tensor, cache de
prompts, points de reprise, décodage spéculatif, fidélité, LOAD_GUARD,
SLOT_PERSIST), toute la décision restant pure. Strata, l'essai de
l'optimiseur et un lancement sans API interne passent toujours par
loki serve (Go). La façade donne au Go l'adresse de son API interne
(LOKI_GO_ADDR), héritée par le superviseur.

Parité : parity_serve_test.go tire du Go 1 872 lancements (12 machines ×
112 presets × 3 aides de moteur × 13 jeux de variables) et les sondes
pures, rejoués argument par argument par tests/serve.rs ; deux essais de
bout en bout lancent le vrai binaire contre un faux Go et un faux moteur.

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-15 17:58:24 +00:00
1 parent 1e5f0904f2
commit 13bcbc74fe
22 files changed
+66931 -5

No files matched your search

+7 -2
View File
@@ -41,6 +41,10 @@ impl Paths {
pub struct Opts {
/// Binaire Go à lancer en `serve`.
pub go_bin: PathBuf,
/// Commande qui compose la ligne du moteur puis lui cède la place :
/// `loki serve` (Go) par défaut, `loki-rs engine serve` quand
/// `LOKI_SERVE=rust` (lot 14).
pub serve: (PathBuf, Vec<String>),
/// Délai avant de juger que le démarrage a tenu (2 s comme le Go).
pub check_delay: Duration,
/// SIGTERM → SIGKILL (4 s comme le Go).
@@ -52,6 +56,7 @@ pub struct Opts {
impl Opts {
pub fn new(go_bin: PathBuf) -> Self {
Opts {
serve: (go_bin.clone(), vec!["serve".into()]),
go_bin,
check_delay: Duration::from_secs(2),
grace: Duration::from_secs(4),
@@ -124,8 +129,8 @@ mod imp {
.open(paths.log())
.map_err(|e| format!("ouverture du log {}: {e}", paths.log().display()))?;
let log2 = log.try_clone().map_err(|e| e.to_string())?;
let mut cmd = Command::new(&opts.go_bin);
cmd.arg("serve")
let mut cmd = Command::new(&opts.serve.0);
cmd.args(&opts.serve.1)
.stdin(Stdio::null())
.stdout(log)
.stderr(log2)