mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-20 05:28:15 +02:00
Lot 15 : presets tenus par la façade (LOKI_PRESETS=rust)
La façade sert la liste des presets (pastilles, mesures du bench quand elles correspondent à la configuration), leur ordre, l'éditeur (lecture, graine d'un preset neuf, enregistrement avec nom de fichier unique, prompt système), la suppression (refusée pour l'actif, modèle compris sur demande), les aperçus de l'éditeur (cache de prompts, second slot, avis MoE et de chargement, réutilisant le port de loki serve), la copie en placement auto, les presets externes (la clé n'est jamais rendue, test par un vrai appel de complétion) et la bascule, quand LOKI_PRESETS=rust (expérimental ; le Go reste le défaut). Ce qui touche au moteur reste au Go jusqu'à son lot : facade_presets.go expose /internal/v1/preset/apply (bascule avec état du slot gardé et moteur relancé ou arrêté, preset en service réappliqué) et /internal/v1/tune/guard (verrou de l'optimiseur), et remet les routes du tunnel à la façade. Parité : parity_presets_test.go tire du Go les fonctions pures et 70 appels de route avec presets/, models/ et la base après chacun, rejoués par tests/presets_api.rs ; bascule et application vérifiées de bout en bout contre le faux Go, presetApply 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:
19 files changed
+4805
-3
No files matched your search
@@ -40,6 +40,8 @@ pub struct Ctx {
|
||||
pub push: Option<std::sync::Arc<crate::push::Push>>,
|
||||
/// Mémoire tenue par la façade (`LOKI_MEM=rust`).
|
||||
pub mem: Option<std::sync::Arc<crate::memory::Memory>>,
|
||||
/// Presets tenus par la façade (`LOKI_PRESETS=rust`).
|
||||
pub presets: bool,
|
||||
/// Jeton de l'API interne : une requête qui le porte vient du Go.
|
||||
pub internal_token: String,
|
||||
}
|
||||
@@ -55,6 +57,7 @@ impl Ctx {
|
||||
|| self.files.is_some()
|
||||
|| self.push.is_some()
|
||||
|| self.mem.is_some()
|
||||
|| self.presets
|
||||
}
|
||||
|
||||
/// La requête vient du Go (jeton interne valide) : déjà authentifiée par
|
||||
|
||||
@@ -28,6 +28,7 @@ pub mod models;
|
||||
pub mod oai;
|
||||
pub mod paths;
|
||||
pub mod presets;
|
||||
pub mod presets_api;
|
||||
pub mod proxy;
|
||||
pub mod push;
|
||||
pub mod serve;
|
||||
|
||||
@@ -145,6 +145,9 @@ fn serve() -> ExitCode {
|
||||
// LOKI_MEM=rust : la mémoire (pages, index, trackers, mode mémoire,
|
||||
// interrupteurs du mode agent).
|
||||
let mem_rust = held_by_facade("LOKI_MEM");
|
||||
// LOKI_PRESETS=rust : les presets (liste, éditeur, aperçus, externes,
|
||||
// bascule ; l'application au moteur reste au Go).
|
||||
let presets_rust = held_by_facade("LOKI_PRESETS");
|
||||
let mut env = vec![
|
||||
(auth::INTERNAL_ENV.to_string(), token.clone()),
|
||||
// Adresse de l'API interne du Go, héritée par ses enfants :
|
||||
@@ -159,6 +162,7 @@ fn serve() -> ExitCode {
|
||||
("LOKI_FILES", files_rust),
|
||||
("LOKI_PUSH", push_rust),
|
||||
("LOKI_MEM", mem_rust),
|
||||
("LOKI_PRESETS", presets_rust),
|
||||
];
|
||||
for (var, on) in held {
|
||||
if on {
|
||||
@@ -238,6 +242,7 @@ fn serve() -> ExitCode {
|
||||
files,
|
||||
push: push_rust.then(|| std::sync::Arc::new(loki_rs::push::Push::new())),
|
||||
mem: mem_rust.then(|| std::sync::Arc::new(loki_rs::memory::Memory::new(mem_home))),
|
||||
presets: presets_rust,
|
||||
};
|
||||
let res = proxy::serve(listener, cfg, shutdown_signal()).await;
|
||||
eprintln!("[loki-rs] arrêt demandé — arrêt du serveur Go");
|
||||
|
||||
@@ -244,7 +244,7 @@ impl ModelRefs {
|
||||
}
|
||||
|
||||
/// `modelUsers` : pour UN modèle (nom de fichier ou chemin).
|
||||
fn users(&self, dirs: &ModelDirs, name: &str) -> (Vec<String>, bool) {
|
||||
pub(crate) fn users(&self, dirs: &ModelDirs, name: &str) -> (Vec<String>, bool) {
|
||||
let k = dirs.ref_key(name);
|
||||
if k.is_empty() {
|
||||
return (Vec::new(), false);
|
||||
@@ -400,7 +400,11 @@ pub fn delete_model(
|
||||
}
|
||||
|
||||
/// `deleteModelFile` : rend les octets libérés.
|
||||
fn delete_model_file(dirs: &ModelDirs, refs: &ModelRefs, name: &str) -> Result<i64, String> {
|
||||
pub(crate) fn delete_model_file(
|
||||
dirs: &ModelDirs,
|
||||
refs: &ModelRefs,
|
||||
name: &str,
|
||||
) -> Result<i64, String> {
|
||||
let p = gguf::resolve_model_path(name, &dirs.home, &dirs.stored, dirs.env.as_deref())?
|
||||
.to_string_lossy()
|
||||
.into_owned();
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -77,6 +77,8 @@ pub struct Config {
|
||||
pub push: Option<Arc<crate::push::Push>>,
|
||||
/// Mémoire (pages, trackers, mode) tenue par la façade (`LOKI_MEM=rust`).
|
||||
pub mem: Option<Arc<crate::memory::Memory>>,
|
||||
/// Presets tenus par la façade (`LOKI_PRESETS=rust`).
|
||||
pub presets: bool,
|
||||
}
|
||||
|
||||
struct Proxy {
|
||||
@@ -110,6 +112,7 @@ pub async fn serve(
|
||||
files: cfg.files,
|
||||
push: cfg.push,
|
||||
mem: cfg.mem,
|
||||
presets: cfg.presets,
|
||||
internal_token: cfg.internal_token.clone(),
|
||||
},
|
||||
});
|
||||
@@ -197,6 +200,9 @@ impl Proxy {
|
||||
{
|
||||
return chatapi::serve(&self.ctx, chat, req, from_go).await;
|
||||
}
|
||||
if self.ctx.presets && crate::presets_api::handles(path) {
|
||||
return crate::presets_api::serve(&self.ctx, req, from_go).await;
|
||||
}
|
||||
if let Some(m) = &self.ctx.mem
|
||||
&& crate::memory::handles(path)
|
||||
{
|
||||
|
||||
@@ -384,7 +384,7 @@ fn probe_serve_gpus(env: &Env, cfg: &Cfg, extra: &[String], si: &mut SysInfo) {
|
||||
}
|
||||
|
||||
/// `probeCacheRAM`.
|
||||
fn probe_cache_ram(env: &Env, cfg: &Cfg, extra: &[String], si: &mut SysInfo) {
|
||||
pub(crate) fn probe_cache_ram(env: &Env, cfg: &Cfg, extra: &[String], si: &mut SysInfo) {
|
||||
probe_env(env, si, CACHE_ARG_ENV, true);
|
||||
if !si.model.is_empty() {
|
||||
let mp = Path::new(&si.model);
|
||||
|
||||
Reference in new issue
Block a user