Files
Loki/backend/app/agent_config.py
T
MichaelandClaude Opus 4.8 2db6beea5c Phase 6 : configuration de l'agent fonctionnelle
Backend :
- agent_config.py : profil persisté (invite système, génération, outils actifs)
  avec valeurs par défaut et fusion robuste
- routes/config.py : GET/PUT /api/config
- db.py : table config clé/valeur (get/set JSON)
- agent.py : run_agent filtre les outils selon enabled_tools
- routes/chat.py : utilise l'invite système, les options de génération et les
  outils actifs issus de la config sauvegardée

Frontend :
- api/client.ts + store : getConfig/saveConfig, état config
- SettingsView : sliders interactifs (température, top-p, top-k, jetons max),
  toggles d'outils réels, éditeur d'invite système, bouton Enregistrer
- ChatPanel : la barre de contexte reflète température et outils actifs réels

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
2026-06-29 21:03:14 +00:00

67 lines
2.1 KiB
Python

"""Profil de configuration de l'agent : invite système, génération, outils.
Persisté en base sous la clé `agent`. Fournit les valeurs par défaut et la
fusion avec ce qui est stocké, pour rester robuste aux montées de version.
"""
from __future__ import annotations
from . import db
CONFIG_KEY = "agent"
DEFAULT_SYSTEM_PROMPT = (
"Tu es Loki, un assistant de développement local agentique. Tu disposes "
"d'outils pour lire, écrire et lister des fichiers dans le workspace. "
"Utilise-les pour accomplir les tâches concrètement, puis réponds de façon "
"concise en français. Après avoir écrit un fichier, propose un aperçu."
)
# Outils réellement disponibles (les sensibles arrivent en phase 7).
AVAILABLE_TOOLS = ["read_file", "write_file", "list_dir"]
DEFAULT_CONFIG: dict = {
"system_prompt": DEFAULT_SYSTEM_PROMPT,
"temperature": 0.7,
"top_p": 0.9,
"top_k": 40,
"max_tokens": 2048,
"tools": {name: True for name in AVAILABLE_TOOLS},
}
def get_config() -> dict:
"""Config courante = défauts fusionnés avec le stockage."""
stored = db.get_config_value(CONFIG_KEY) or {}
cfg = {**DEFAULT_CONFIG, **stored}
cfg["tools"] = {
name: bool(stored.get("tools", {}).get(name, True))
for name in AVAILABLE_TOOLS
}
return cfg
def save_config(patch: dict) -> dict:
"""Applique une mise à jour partielle et renvoie la config complète."""
cfg = {**get_config(), **{k: v for k, v in patch.items() if v is not None}}
if "tools" in patch and patch["tools"]:
cfg["tools"] = {
name: bool(patch["tools"].get(name, cfg["tools"].get(name, True)))
for name in AVAILABLE_TOOLS
}
db.set_config_value(CONFIG_KEY, cfg)
return get_config()
def ollama_options(cfg: dict) -> dict:
"""Traduit la config en options de génération Ollama."""
return {
"temperature": cfg["temperature"],
"top_p": cfg["top_p"],
"top_k": cfg["top_k"],
"num_predict": cfg["max_tokens"],
}
def enabled_tool_names(cfg: dict) -> list[str]:
return [name for name, on in cfg["tools"].items() if on]