mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-23 23:18:13 +02:00
Mémoire en notes Markdown + presets de configuration (repris d'AJEAN)
Les deux dernières idées d'AJEAN (github.com/nathaninline/jean). 1. Mémoire en notes Markdown ($DATA_DIR/MEMORY), écrites par l'agent via deux outils (memory_search / memory_save). Trois modes : off, ondemand (défaut) et always. Face au RAG vectoriel : aucun modèle d'embedding requis, notes lisibles et éditables à la main, et rien de mémorisé à l'insu — la recherche par mots-clés ne rappelle que du pertinent, là où le RAG ressortait une demande sans rapport. Le RAG disparaît de l'UI : un seul concept de mémoire. En mode Plan, seule la consultation est proposée, pas l'écriture. 2. Presets : jeux de réglages nommés, enregistrés et rappelés en un clic (sélecteur + « + Preset » dans l'en-tête des Réglages). Au passage, un vrai bug : ConfigPatch ne déclarait ni keep_alive, ni skills_enabled, ni ponytail — Pydantic ignore les champs non déclarés, donc ces trois réglages ne se sauvegardaient JAMAIS. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
This commit is contained in:
7 files changed
+463
-5
No files matched your search
@@ -5,6 +5,8 @@ fusion avec ce qui est stocké, pour rester robuste aux montées de version.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import re
|
||||
|
||||
from . import db
|
||||
|
||||
CONFIG_KEY = "agent"
|
||||
@@ -71,6 +73,7 @@ PROFILE_FIELDS = {
|
||||
"self_review",
|
||||
"rag_enabled",
|
||||
"embed_model",
|
||||
"memory_mode",
|
||||
"skills_enabled",
|
||||
"ponytail",
|
||||
"keep_alive",
|
||||
@@ -124,6 +127,11 @@ DEFAULT_CONFIG: dict = {
|
||||
# d'échecs ») et embrouille les petits modèles. Réactivable dans Réglages.
|
||||
"rag_enabled": False,
|
||||
"embed_model": "auto",
|
||||
# Mémoire en notes Markdown écrites par l'agent (voir memory_notes.py).
|
||||
# "ondemand" : les outils existent, mais rien n'est injecté sans que le
|
||||
# modèle le demande — aucun risque de voir ressurgir une demande sans
|
||||
# rapport, contrairement à l'ancien RAG vectoriel.
|
||||
"memory_mode": "ondemand",
|
||||
# Skills : méthodes expertes injectées automatiquement selon la tâche.
|
||||
"skills_enabled": True,
|
||||
# Ponytail : méthode « code minimal » (anti sur-ingénierie) injectée pour
|
||||
@@ -247,6 +255,42 @@ def ollama_options(cfg: dict) -> dict:
|
||||
}
|
||||
|
||||
|
||||
# ── Presets : jeux de réglages nommés ────────────────────────────────────
|
||||
PRESETS_KEY = "config_presets"
|
||||
_PRESET_NAME = re.compile(r"^[\w \-]{1,40}$")
|
||||
|
||||
|
||||
def list_presets() -> list[str]:
|
||||
return sorted((db.get_config_value(PRESETS_KEY) or {}).keys())
|
||||
|
||||
|
||||
def save_preset(name: str, model: str | None = None) -> list[str]:
|
||||
"""Fige la configuration courante sous ce nom (écrase si déjà pris)."""
|
||||
name = (name or "").strip()
|
||||
if not _PRESET_NAME.match(name):
|
||||
raise ValueError("nom de preset invalide (lettres, chiffres, espaces, -)")
|
||||
presets = db.get_config_value(PRESETS_KEY) or {}
|
||||
cfg = get_config(model)
|
||||
presets[name] = {field: cfg[field] for field in PROFILE_FIELDS if field in cfg}
|
||||
db.set_config_value(PRESETS_KEY, presets)
|
||||
return sorted(presets)
|
||||
|
||||
|
||||
def apply_preset(name: str, model: str | None = None) -> dict | None:
|
||||
"""Applique un preset ; None s'il n'existe pas."""
|
||||
preset = (db.get_config_value(PRESETS_KEY) or {}).get((name or "").strip())
|
||||
if preset is None:
|
||||
return None
|
||||
return save_config(dict(preset), model)
|
||||
|
||||
|
||||
def delete_preset(name: str) -> list[str]:
|
||||
presets = db.get_config_value(PRESETS_KEY) or {}
|
||||
presets.pop((name or "").strip(), None)
|
||||
db.set_config_value(PRESETS_KEY, presets)
|
||||
return sorted(presets)
|
||||
|
||||
|
||||
def enabled_tool_names(cfg: dict) -> list[str]:
|
||||
"""Outils réellement proposables au modèle.
|
||||
|
||||
|
||||
Reference in new issue
Block a user