Open source · MIT · Tough-Respawn/loom

Loom

Un agent tool-use local, offline, monté au-dessus d'un modèle open-weight

Un modèle open-source qui agit sur la machine avec des outils : localiser, lire, modifier, exécuter, vérifier. Le pari : rester productif internet coupé et démontrer le savoir-faire d'internaliser le harnais sur un modèle autre que Claude.

llama.cppPython 3.12 · uvFlask + Preact/htmMoE offload · CPU-MoEPlaywrightClient MCPComfyUI (image/vidéo)Skills & plugins compat. Claude Code

Ce que Loom fait (et pas)

Trois choix architecturaux assumés, chacun documenté par des expériences qui les ont validés ou falsifiés.

Boucle tool-use pure

Un seul chemin : le modèle décide, appelle un outil, on lui rend le résultat. Pas de rail de réflexion imposé, deux orchestrateurs déterministes essayés et supprimés. Quand une tâche mérite d'être structurée, c'est le modèle qui écrit le script d'orchestration et le lance via run_workflow.

Local & offline par défaut

llama.cpp + llama-swap, API OpenAI-compatible sur :8080. MoE 24B+ jouables sur petite VRAM par offload des experts en RAM. Trois familles servies par la même UI : texte local, API distantes, image et vidéo via ComfyUI. Rester productif internet coupé.

Frontière de confiance

Tout contenu externe (URL, PDF, sortie d'outil, réponse d'un serveur MCP) marqué DONNÉE, jamais instructions. Garde anti-SSRF qui traite aussi l'IPv4 embarquée en NAT64/DNS64 (RFC 6052), deny-list, mode permission ask/allow. Défense en profondeur, active même hors-ligne.

En quoi Loom diffère

Quatre alternatives connues, ce qu'elles font, ce que Loom fait à la place ou en plus.

Claude Code (Anthropic)

Agent premium, Claude-only, cloud requis.

Loom

Modèle-agnostique et 100 % offline. Compatible avec les mêmes skills et plugins Claude Code, sous licence MIT.

Aider / Continue

CLI de coding, git-natif, verticale unique.

Loom

Agent générique avec web-UI, 28 outils multi-domaine (localisation, lecture, exécution, vérification), outils MCP tiers, workflows Python.

LangChain / LangGraph

Framework Python d'orchestration, découpe imposée par le graph.

Loom

Boucle tool-use pure : le modèle décide la séquence. Deux orchestrateurs déterministes essayés puis retirés (×12 le coût pour 0 résultat).

Ollama + Open WebUI

Chat local simple, un modèle qui parle.

Loom

Agent qui agit sur ta machine : écriture disque, shell, navigateur headless, sous mode permission ask/allow avec deny-list.

Le pattern qui unifie ces différences : Loom exécute le harnais d'un agent premium (Claude Code-like) au-dessus d'un modèle open-weight, sur ta machine, offline.

Le banc empirique

On mesure sur du vrai. Configuration exacte, modèles testés, résultats reproductibles.

Hardware

GPU
NVIDIA RTX 2060, 6 Go VRAM
RAM
64 Go (offload experts MoE)
CPU
6 cœurs physiques / 12 threads
OS
Windows 11 · 100 % offline
Runtime
llama.cpp + llama-swap

L'offload des experts MoE en RAM rend les modèles 24B+ jouables sur 6 Go de VRAM. Le goulot n'est plus la RAM (~25 Go utilisés / 64) ; c'est la bande passante mémoire et la VRAM disponible pour l'attention.

Modèles servis

  • ornith-1.5

    Ornith-1.5-35B-A3B Q8_0 + vision · local, MoE 3B actifs, experts en RAM, NVMe interne

    35B local principal, contexte 65k · 14,2 t/s décode mesurés

  • qwen3.6-35b-a3b

    Qwen3.6-35B-A3B abliterated Q4_K_M + vision · local, MoE 3B actifs, SSD externe

    alternative à Ornith, contexte 32k · non mesuré sur ce banc

  • gemma-4-12b

    gemma-4-12b-it Q4_K_M + vision · local, dense 12B, 6,8 Go, NVMe interne

    dense de référence, poste sans GPU · non mesuré sur ce banc

  • bonsai-2

    Ternary-Bonsai-2 4B et 9B Q2_0 + vision · local, ternaire, 1,2 et 2,4 Go, NVMe interne

    petits modèles, raffineur de prompts image · au banc depuis le 18 octobre 2026

  • glm-zai

    GLM 5.2, API OpenAI-compat (Z.ai) · distant, 1M de contexte

    modèle par défaut en config · débit provider

  • glm-5.3

    GLM 5.3 FlashX, API OpenAI-compat (Z.ai) · distant

    câblé dans le store, en évaluation · débit provider

  • glm-flash

    GLM 4.7 Flash, MoE 30B-A3B (Z.ai) · distant, tier gratuit

    sous-agents (dispatch_agent) · débit provider

  • deepseekv4

    API OpenAI-compat · distant

    frontier distant de comparaison · débit provider

  • kimi-k3

    API OpenAI-compat · distant

    frontier distant de comparaison · débit provider

Résultat clé : le harnais peut desservir un petit modèle

Même tâche (créer un démineur HTML jouable), même modèle. Seule différence : le harness.

Harness dirigiste

Lignes de log
5 643
Appels d'outils
≈ 356
Résultat
boucle infinie

Harness léger (tool-use pur)

Lignes de log
699
Appels d'outils
≈ 30
Résultat
démineur fonctionnel

≈ 12× le coût pour zéro résultat. La leçon : découper une tâche pour un petit modèle suppose qu'il sait décomposer et exécuter chaque atome. Un modèle fiable à 99 %/étape reste à 92 % sur 8 étapes ; à 85 %, il tombe à 27 %. Découper aide au-dessus du seuil, empire en-dessous.

Deux orchestrateurs déterministes essayés et supprimés (juin 2026). La boucle tool-use pure, où le modèle décide, s'est validée sur mesure. On fiabilise par le prompt, la qualité des erreurs et les outils. Jamais par un rail rigide.

Les outils

28 outils natifs, groupés par usage, plus ceux qu'apportent les serveurs MCP tiers. Le harness ne pilote pas, il outille et vérifie.

Localiser & lire

find_files, search_text, list_dir, read_file (texte + PDF/XLSX/DOCX), read_image

Modifier & exécuter

write_file, append_file, edit_file, format_code (ruff), run_shell, monitor (processus surveillé en asynchrone)

Vérifier le rendu

check_page (Playwright headless, prouve qu'une page est jouable), serve_and_check (démarre un serveur, charge la page, tue l'arbre de process)

Planifier & déléguer

manage_todos, dispatch_agent (sous-agent isolé), run_workflow (script Python qui orchestre N sous-agents), use_skill

Mémoriser & noter

remember, recall (SQLite FTS5), write_note, read_note, calculate, current_date

Web & extensions

web_search, fetch_url, list_plugins, add_marketplace, install_plugin, tool_search (charge à la demande les outils différés)

Neuf outils de cœur restent toujours dans le préfixe du prompt (localiser, lire, écrire, éditer, shell, todos). La longue traîne est différée : le modèle appelle tool_search pour charger le schéma d'un outil quand il en a besoin. Les outils MCP sont toujours différés, un seul serveur pouvant en annoncer des dizaines.

Ce qui étend le modèle

Loom n'est plus seulement une boucle et des outils. Trois mécanismes d'extension, tous hors-ligne une fois installés.

Client MCP stdio

Loom se branche sur des serveurs MCP tiers et fusionne leurs outils dans le même registre que les siens, avec le même marquage de contenu non fiable. Dépendance optionnelle : aucun coût au runtime tant qu'aucun serveur n'est configuré.

Store de plugins Claude Code

Marketplaces, installation et cache, dans un store propre à Loom. On installe un plugin Claude Code et c'est un modèle open-weight local qui s'en sert, sans réseau. Les skills sont aussi des fichiers markdown locaux, déclenchés par le modèle via use_skill, jamais activés à la main.

Image et vidéo via ComfyUI

Troisième famille de modèles, après le texte local en llama-swap et les API distantes. Un dossier par modèle avec son graphe ComfyUI au format API ; Loom démarre le moteur, soumet le workflow et range le média dans la session. Génération et édition d'image, texte-vers-vidéo et image-vers-vidéo.

Le store de plugins est indépendant de ~/.claude : Loom héberge le sien, on y installe un plugin Claude Code et un modèle local s'en sert hors-ligne. Tranche actuelle : seuls les skills des plugins sont consommés, les agents et hooks ne sont pas câblés.

Mémoire, contexte et persistance

Un agent utile ne vit pas seulement dans une fenêtre de tokens. Quatre couches qui gardent l'état, dans le tour et entre les tours.

Sessions par projet

Un fil persistant par workspace, historique + outils actifs sauvegardés, CRUD depuis l'UI. Le titre est inféré automatiquement par le modèle après le premier tour, plus de "Nouvelle session".

Compaction multi-étage

Trois étages successifs : microcompact des vieux tours, résumé télégraphique via une primitive dédiée (fail-soft si le modèle est injoignable), force-fit déterministe qui ne s'arrête jamais pour saturation. Bouton "compacter" manuel instantané.

KV cache slot save/restore

Sauvegarde/restauration du slot KV autour des sous-agents et à la fin de chaque tour (routes llama-swap). Reprise de conversation = 10-11 tokens préfillés au lieu de ~930. Bascule d'onglet quasi instantanée.

Mémoire long-terme (SQLite FTS5)

Provider SQLite FTS5 pour la mémoire persistante (outils recall / remember). Reflect post-tour pour la capitalisation continue. Fichiers d'identité SOUL / USER / MEMORY qui survivent aux sessions et aux redémarrages.

Ces quatre couches sont dans le code (loom/agent/context.py, loom/agent/session.py, loom/agent/reflect.py, loom/memory/local.py), pas dans un roadmap.

Contributions upstream à llama.cpp

Utiliser un projet open-source sérieusement, c'est finir par y contribuer. Deux PR fusionnées dans ggml-org/llama.cpp en octobre 2026, chacune née d'un problème mesuré sur ce banc. Le détail, la revue et les chiffres ont leur page.

Voir la page Contributions à llama.cpp

PR #26004 · sessions qui survivent au redémarrage

fusionnée le 8 octobre 2026

« server : preserve context checkpoints across slot save/restore ». Sur les modèles hybrides qui dominent l'open-weight (Qwen3.5, Qwen3.6, Gemma 4), restaurer une session sauvegardée relisait tout le contexte : les checkpoints n'étaient pas dans le fichier. Ils y voyagent désormais. Un agent local survit à un redémarrage, une mise à jour ou une coupure, et reprend là où il s'était arrêté. Fusionnée par Georgi Gerganov après 78 jours de revue et dix testeurs indépendants sur CUDA, Metal et Vulkan.

PR #30343 · décode CPU des MoE

fusionnée le 14 octobre 2026

« ggml-cpu : keep the FP16->FP32 lookup table on x86 with F16C ». Une mise à jour du moteur avait ralenti le décode des MoE dont les experts tournent sur CPU, avec les builds officielles Windows : l'intrinsèque F16C sérialisait la boucle des produits scalaires quantifiés. Diagnostic au llvm-mca, correctif d'une ligne, sortie identique à l'octet près. Ouverte le 11 octobre, fusionnée trois jours plus tard.

Impact mesuré

Reprise d'une session de 58 000 tokens (PR #26004)

181,9 s4,7 s

×39

Tokens relus à la reprise (PR #26004)

58 202516

×113

Décode MoE sur CPU, t/s (PR #30343)

13,714,4

+5 %

Reprise de session : relevés d'un testeur indépendant sur la PR #26004 (Radeon 8050S, Qwen3.5-35B-A3B, session de 58 000 tokens). Décode : notre banc (i7-10750H, Ornith-1.5-35B Q8_0, experts sur CPU), mêmes prompts avant/après. Pas des projections. Le correctif Vulkan iGPU/UMA de juillet (lecture d'un checkpoint 3,3 s → 25 ms) a été repris en amont par un mainteneur (#30049) avant notre dépôt, limité aux GPU AMD ; notre mesure sur Intel UHD (sauvegarde 2,2 s → 0,45 s sans ce filtre) reste à proposer.

Open source · MIT

Publié sous licence MIT sur Tough-Respawn/loom. Cloner, forker, adapter, au même titre que nos autres projets open source (legal, accounting, strategy, defensive-prompt-injection).

Cohérent avec la thèse : notre pratique open-weight se démontre en ouvrant aussi le code du harnais. Loom est un banc, mais un banc dont chacun peut inspecter, critiquer et rejouer les choix.

Ce qu'on ne promet pas, ni support, ni roadmap publique. C'est un dépôt d'ingénierie ; on répondra aux issues techniques quand elles sont documentées et reproductibles.

Un agent local, pour de vrai ?

Si la souveraineté du code, la résilience hors-ligne ou une alternative aux modèles frontier fait partie de votre équation, on peut en discuter concrètement.

Ou consulter notre pratique Open Weights.