Le remaniement précédent avait supprimé le panneau de sessions, et avec
lui le seul bouton pour démarrer une discussion.
- « Demander » devient « Discussion », avec en dessous le bouton
« + Nouvelle discussion » et les 5 discussions les plus récentes,
cliquables (point accent sur celle qui travaille).
- « Fichiers » quitte la barre latérale pour devenir un onglet du
panneau droit, à côté de Code. L'arborescence est extraite en
composant FileTree réutilisable.
- Nettoyage du code devenu mort : LeftPanel, FilesView, WorkspaceTree,
formatSize et la vue « files ».
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
Un modèle dont les couches partent en RAM tombe à quelques jetons par
seconde. Loki subissait la lenteur sans jamais la nommer : l'utilisateur
ne pouvait pas distinguer un blocage de l'application d'un modèle placé
sur le CPU par Ollama.
Au début de chaque réponse, si /api/ps indique que le modèle n'est pas
entièrement en VRAM, une notice donne le pourcentage réellement en VRAM
et le volume resté en RAM.
Le placement appartient à Ollama — Loki le constate, il ne le corrige
pas. Silencieux quand tout est sur GPU, quand le modèle n'est pas encore
chargé, ou quand Ollama ne répond pas.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
Remaniement de la navigation selon « Loki App.dc.html » : le rail
d'icônes de 60 px et le panneau de sessions laissent place à UNE barre
latérale de 264 px — marque, navigation libellée (Demander, Historique,
Fichiers, Outils), section Configuration, état Ollama avec jauge VRAM et
carte de compte. La marque quitte la barre supérieure, qui ne garde que
le contexte de la conversation.
Les sessions restent accessibles par le sélecteur de la barre
supérieure, et les fichiers par la vue Fichiers.
Performance : l'inventaire du workspace n'est plus injecté à CHAQUE
message, seulement quand la demande touche au code ou qu'un travail de
code est en cours. Un simple « bonjour » partait avec des milliers de
jetons de contexte, d'où une longue phase de traitement avant le premier
jeton.
L'attente avant le premier jeton affiche désormais le modèle en cours de
chargement et le temps écoulé, au lieu de rester figée sur « Connexion à
Ollama… » sans distinguer lenteur et blocage.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
Reprend l'état d'accueil du fichier de design : marque, accroche
« Bienvenue dans Loki », paragraphe sur l'exécution 100 % locale, et les
huit pistes cliquables en pastilles arrondies.
Les pistes pré-remplissent le composer au lieu d'être décoratives, et le
compteur de conversations n'apparaît que s'il y en a.
Remplace l'ancien état vide « PRÊT À TRAVAILLER ».
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
Beaucoup de templates (Gemma, Mistral…) contiennent un garde
« {% if role == 'system' and not loop.first %}{{ raise_exception(...) }} » :
tout message système qui n'est pas le premier fait échouer la requête
ENTIÈRE en 400, y compris la génération du parseur d'outils — d'où
« Unable to generate parser for this template […] System message must be
at the beginning », même sur un simple « bonjour ».
Loki en empilait jusqu'à huit : souvenirs, état du workspace, reprise de
code, skill, Ponytail, contraintes web, notes de mémoire, et surtout le
plan, ajouté APRÈS les messages utilisateur.
- Les consignes du tour sont désormais collectées puis fusionnées par
_merge_system dans l'UNIQUE message système en tête, qui absorbe aussi
les systèmes égarés.
- memory.build_convo fusionne le résumé de session dans l'invite système
au lieu d'ajouter un second message système : correct même seul.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
Reprend les jetons de « Loki App.dc.html » : fond gris froid #f7f8fa,
surfaces blanches, accent bleu ardoise #2f4a7a (au lieu de l'orange),
filets 1 px #e3e6eb (au lieu des bordures noires 3 px) et ombres douces
diffuses (au lieu des ombres dures décalées).
- tailwind.config.ts : les NOMS de jetons sont conservés, seules leurs
valeurs basculent — toute l'interface suit sans réécrire les
composants. Les jetons historiquement sombres (card-deep, on-dark…)
deviennent la surface sélectionnée claire et son encre.
- Police unique Inter ; l'ex-« font-pixel » devient le kicker de la
maquette (petites capitales espacées de 0.14em), donc les libellés
existants suivent sans modification.
- Conversion mécanique des filets 3 px / 2 px vers 1 px, séparateurs
épais affinés, logo et avatar refaits selon la maquette (carré teinté
à filet accent), couleurs « papier » de l'aperçu passées en jetons.
- Texte blanc corrigé partout où il reposait sur une surface devenue
claire ; conservé sur les fonds accent/warn où il reste lisible.
Vérifié au rendu : body #f7f8fa, encre #1c2536, surface #ffffff, Inter ;
plus aucune trace d'orange, de noir #18181b ni d'ombre dure.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
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
AJEAN (github.com/nathaninline/jean) n'expose ses outils web que si le
service répond : « le modèle ne peut pas inventer un outil indisponible,
un outil absent n'apparaît pas dans son contexte ». Loki, lui, listait
les outils d'après les seuls interrupteurs de config.
Conséquence : sans Aider installé, code_task était quand même annoncé —
le modèle l'appelait, recevait « moteur code indisponible » et perdait
un tour, au lieu d'employer directement write_file / edit_file.
enabled_tool_names filtre désormais sur la disponibilité réelle.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
Les Réglages exposaient d'un bloc 7 curseurs et 5 interrupteurs
« Intelligence », dont des réglages pointus (Couches GPU, Batch, Top-K)
que l'on ne touche jamais — et Couches GPU est précisément celui qui
avait basculé l'inférence sur le CPU quand on le forçait.
- Génération : ne montre que Température et Contexte ; Top-P, Top-K,
Jetons max, Couches GPU et Batch passent sous « Réglages avancés »,
avec un avertissement explicite sur Couches GPU (laisser auto).
- Intelligence : au premier plan « Code minimal » et « Plan-puis-exécute »
(ce qui change le rendu au quotidien) ; Skills, Auto-critique et
Mémoire entre sessions passent en avancé. Descriptions raccourcies.
- Nouveau repli <details> natif (aucun état à gérer, accessible au
clavier) et ligne ToggleRow réutilisable, qui déduplique le balisage.
Aucune option supprimée : tout reste accessible en un clic.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
À vide, l'app chauffait le CPU en continu : trois sondages navigateur
séparés (5/8/10 s) tournaient en permanence, y compris onglet caché, et
chaque tick relançait un sous-processus nvidia-smi (cache TTL 5 s = la
cadence, donc jamais efficace) plus deux connexions vers Ollama.
- Nouveau /api/system/pulse : statut + ressources + modèles chargés en
UNE requête (appels Ollama en parallèle, dégradation propre si muet),
avec un cache court qui absorbe les rafales multi-onglets.
- Front : un seul sondage, SUSPENDU quand l'onglet est caché, cadence
adaptative (4 s pendant un flux, 20 s au repos) et rafraîchissement
immédiat au retour sur l'onglet.
- Panneau Matériel : 5 s -> 15 s et rien onglet caché.
- Caches serveur alignés sur la cadence : nvidia-smi mis en cache 12 s,
et _all_local_gpus (vue Matériel) n'était pas caché du tout.
Effet au repos : ~25 requêtes/min et ~12 nvidia-smi/min -> ~3 et ~3
onglet visible, et ZÉRO onglet caché. Le serveur n'a aucune boucle de
fond : sans navigateur ouvert, il ne consomme plus rien.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
Un plan « from scratch » (architecture, création des fichiers…) était
régénéré à CHAQUE tâche de code, y compris pour corriger un bug sur une
appli existante — hors-sujet et perturbant (« je n'arrive pas à déplacer
les pièces » → plan de re-création complète).
- want_plan ne se déclenche plus que pour une NOUVELLE construction :
pas de code antérieur dans la session ET workspace vide. Une
modification / correction / suite de travail n'affiche plus de plan.
- Plan de code : l'étape ARCHITECTURE privilégie un seul fichier
autonome (cohérent avec les contraintes appli web), au lieu de
proposer index.html + style.css + app.js.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
Les modèles promettaient des libs qui ne se chargent jamais hors-ligne
(Stockfish, CDN…), éclataient le code en fichiers incohérents, puis
déclaraient « ça marche » sans rien vérifier.
- Contraintes « appli web » injectées pour toute tâche web (agent +
moteur code) : UN seul index.html autonome (CSS/JS inline), AUCUNE
ressource externe (implémenter en JS natif à la place), rendu réel au
chargement, interdiction de « simuler » une lib en la disant réelle.
- check_html signale désormais les scripts/styles externes (CDN/WASM)
qui ne se chargeront pas dans le sandbox hors-ligne, en plus des
références locales cassées.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
L'agent termine son tour pour attendre la validation, donc le streaming
s'arrête aussitôt — or la carte de confirmation n'était affichée que
pendant le streaming, elle disparaissait avant qu'on puisse cliquer.
- La carte de validation shell s'affiche tant que `pendingShell` existe,
indépendamment de l'état de streaming (approbation/refus déjà gérés
hors flux).
- Changer de session efface une validation en attente (elle appartenait
à la session quittée).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
Adapte github.com/DietrichGebert/ponytail (philosophie anti
sur-ingénierie) en méthode transverse de Loki, remède direct aux rendus
trop ambitieux qui cassent (ex. « moteur IA » dans un jeu d'échecs).
- Échelle de décision injectée pour toute tâche de code (YAGNI ->
réutiliser -> natif -> minimum de code), sur les DEUX chemins : dans
le contexte de l'agent ET dans la consigne du moteur code (Aider ne
voit pas convo).
- Nouvel interrupteur « Ponytail (code minimal) » dans Réglages >
Intelligence, activé par défaut (fusionne sans migration).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
- make_plan(code=True) : pour une tâche d'application, produit un plan
d'IMPLÉMENTATION concret (étape 1 = architecture/fichiers, puis une
fonctionnalité testable à la fois), réaliste et sans dépendance
externe — au lieu d'une liste d'objectifs produit (« moteur IA »…)
que les petits modèles n'arrivent pas à livrer.
- run_shell : le garde-fou de confinement ne bloque plus les URLs
(http://localhost:8080 était rejeté à cause du « // »), et autorise
la base du workspace même quand la session cible un projet (ls
/workspace). Les évasions réelles (/etc, /config, ~, ../..) restent
bloquées.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
Le plan s'affichait mais restait figé — on ne voyait pas le modèle
avancer. Désormais :
- Le modèle annonce chaque étape accomplie (« ✅ Étape N terminée »),
demandé dans la consigne de plan.
- L'agent détecte ces annonces dans le flux et émet des événements
plan_step, sans jamais recompter deux fois la même étape.
- Le panneau PLAN coche les étapes en temps réel : ✓ vert + barré pour
les faites, sablier sur l'étape en cours, compteur « n/N validées ».
Chemin agent uniquement (le moteur code tourne de bout en bout). Les
messages passés restent affichés tels quels.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
La mémoire long-terme rappelait des échanges d'AUTRES sessions dans la
discussion en cours : demander « un jeu d'échecs » ressortait une « appli
sport » demandée ailleurs, et déroutait les petits modèles.
- rag_enabled désactivé par défaut : chaque discussion ne se souvient que
d'elle-même (résumé + messages récents, déjà en place).
- Migration v7 : désactive le RAG une fois sur les installs existantes
(la valeur persiste en base /data) ; réactivable dans Réglages.
- Rappel plus strict quand le RAG est activé : seuil de similarité 0.45 -> 0.6.
- Réglages : libellé clarifié (« Mémoire entre sessions »).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
- edit_file : correspondance tolérante (indentation/espaces ignorés,
repli ligne à ligne + réindentation) pour que les petits modèles
éditent sans devoir tout réécrire ; message d'erreur plus utile.
- Prompt système : privilégier edit_file pour modifier, write_file
seulement pour créer ; rappel de rester dans le workspace.
- Suppression de fichiers/dossiers du workspace : route DELETE
/api/files + boutons × dans l'arborescence (fichiers et dossiers).
- Confinement renforcé : garde-fou run_shell (refus des chemins absolus
hors workspace, ~ et remontées ../) et code_task/Aider (fnames
résolus et confinés au workspace).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N
Le chip modèle du composer était décoratif (pastille orange fixe) alors
que le TopBar montrait le vrai état de chargement. Le sélecteur complet
(liste + pastille GPU/CPU/à charger/préchargement) vit maintenant dans
la carte du chat, menu vers le haut.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
La relance après « pensée seule » n'agissait qu'à la fin de la
génération : un modèle thinking pouvait ruminer des minutes (jusqu'à
épuiser num_predict) avant qu'elle n'intervienne — vécu comme « aucune
réponse » en mode plan.
Pensée > 12 000 caractères sans aucun contenu ni appel d'outil : la
génération est interrompue immédiatement et la relance repart.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Les noms MCP à tirets (resolve-library-id) cassaient le tool-calling :
modèles et grammaires mélangent tirets et underscores -> « Tool not
found ». Les noms exposés sont assainis en underscores avec table de
correspondance vers le vrai nom, et l'appel tolère les deux formes.
read_file sur un dossier disait « fichier introuvable » : message
explicite « c'est un dossier — utilise list_dir ».
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Le fallback SPA renvoyait index.html pour /favicon.svg : l'icône
n'apparaissait jamais. Les fichiers statiques racine existants sont
maintenant servis tels quels, le reste retombe sur index.html.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Le déplacement de la préparation (plan, recall RAG) dans le flux SSE
laissait un silence total pendant le chargement d'un gros modèle : le
reverse proxy coupait la connexion (« Connexion interrompue pendant le
chargement du modèle »). Avec la réflexion active, l'appel de plan
laissait en plus le modèle penser — silence encore plus long.
- ping SSE toutes les 10 s pendant la préparation du contexte
- plan / auto-critique / résumé : think=False (repli automatique si le
modèle refuse le paramètre) — un appel utilitaire ne réfléchit jamais
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Avec la réflexion activée sur les longues tâches, le modèle brûlait tout
son budget de génération à penser : done sans contenu ni appel d'outil,
la boucle s'arrêtait et la tâche restait inachevée.
- itération « réflexion seule » : relance avec consigne d'agir ; si ça
recommence, think est coupé pour la fin du tour (+ notice)
- marge num_predict >= 6144 quand la réflexion est active
- la pensée reste affichée dans l'UI mais n'est plus renvoyée au modèle
(elle regonflait le contexte à chaque itération)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Les résultats d'outils dévoraient le contexte du modèle : sortie shell
tronquée aveuglément à 4000 c. (bruit gardé, erreur parfois coupée),
gros fichiers lus en entier.
- run_shell : succès = 12 dernières lignes ; échec = lignes d'erreur
+ fin de sortie, répétitions dédupliquées (« ligne ×N »)
- read_file : fenêtres de 200 lignes avec marche à suivre
(start_line=N pour la suite, grep_search pour cibler)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
« Corrige les bugs » partait à Aider sans contexte (quel fichier ? quel
projet ?) et le chemin agent ignorait quels fichiers existaient — le
modèle collait alors le code en chat au lieu de modifier le fichier.
- moteur code : récap de session (demande initiale + dernières demandes
+ fichiers touchés) préfixé à l'instruction ; fichiers de la session
passés à Aider quand aucun n'est cité
- chemin agent : liste des fichiers du workspace + fichiers de la tâche
injectée chaque tour en système
- directive renforcée : « ne colle JAMAIS le code corrigé dans ta
réponse sans l'avoir écrit dans le fichier »
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sur une reprise (« ajoute un bouton », « continue »), le routeur ne voyait
que le message courant : score trop bas, jamais le moteur code, et le
modèle décrivait les changements sans les appliquer.
- routage contextuel : si le tour précédent était du code (engine ou
outils write_file/edit_file/code_task), les suites courtes partent au
moteur code (is_code_followup)
- chemin agent sur session code : directive système « AGIS avec les
outils, ne décris jamais sans appliquer »
- fichiers cités dans le message et présents au workspace transmis à
Aider (travail direct, sans deviner via la repo map)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sur un long tour, les gros résultats d'outils (MCP 8 Ko, shell 4 Ko)
saturaient num_ctx et Ollama tronquait silencieusement le DÉBUT de la
conversation : le modèle perdait la consigne et « oubliait » sa tâche.
- élagage : les résultats d'outils des itérations passées sont compactés
(350 c. + marqueur), le dernier lot reste intact
- num_ctx 16384 par défaut (migration v6 : les profils restés sur les
anciens défauts 4096/8192 sont montés, les valeurs perso respectées)
- serveur MCP avec paramètre requis manquant (SEARXNG_URL) : refus clair
au démarrage au lieu d'un échec cryptique à chaque appel
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
L'auto-check séparé dans la boucle agent doublonnait _verify_written et
signalait à tort les fichiers écrits par morceaux (mode append).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ollama reloaded the chat model mid-message because plan/summary/router
calls sent divergent runner options (no num_ctx/num_batch) and omitted
keep_alive — the main cause of perceived slowness.
- share one keep-alive httpx.AsyncClient for all Ollama calls
- unify runner options (runner_options) + keep_alive on every model
call, embeddings included
- drop the blocking LLM routing fallback (pure lexical heuristic)
- run RAG recall + plan + code-model pick in parallel inside the SSE
stream, after the start event
- RAG cosine scoring off the event loop; cache /api/tags 30s and
nvidia-smi 5s; frontend polls 2s->5s, warm poll backoff, dedup
config fetch
feat: working session menu in TopBar (switch/create/rename/delete)
feat: workspace file deletion (DELETE /api/files + UI trash buttons)
docs: recommended Ollama env vars (KEEP_ALIVE, MAX_LOADED_MODELS...)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Modes d'exécution (composer) :
- routes/chat : champ mode ; _apply_mode adapte la config —
plan = outils lecture seule + plan forcé ; yolo = confirm_shell off ;
build = comportement normal.
- Frontend : ModeSelector dans le composer, mode dans le store + requête chat.
Panneau Git & Diff (le workspace est un dépôt git, Aider commite) :
- routes/git : /api/git/log (commits), /api/git/diff (commit ou working),
/api/git/revert (git revert --no-edit, confiné au workspace).
- Frontend : onglet Git dans le PreviewPanel — liste des commits, diff
colorisé, bouton Annuler (revert) avec rafraîchissement de l'arbo.
Bonus : le panneau Matériel explique que « GPU déclaré 12 Go » vient de
GPU_VRAM_MB (valeur manuelle) — à corriger en 16000 pour une 16 Go.
Tests : git log/diff/revert, modes plan/yolo/build via la route chat, builds.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SVay7z3y7q2gEe54ByAE6N