Écrit en RustOpen source

nharnessed

Le harnais, nouvelle génération.

Un seul outil : un REPL Python. Le reste, le modèle l’écrit.

Terminal-Bench 4.0

Un meilleur score, pour moins cher.

Même modèle, autre harnais : avec Claude Opus 5.5, Unharnessed réussit 47 tâches sur 66. Chaque point est un run de Terminal-Bench 4.0 : son score, face à ce qu’a coûté une tâche.

Lire le run, tour par tour

Données provisoires
  • Unharnessed
  • Claude Code et Codex, leurs 5 meilleurs modèles
  • Autres runs
Le pari

Plus le modèle est capable, moins il a besoin de harnais.

Chaque outil codé en dur, c’est une décision prise d’avance, à la place du modèle : ce que renvoie un read, la forme d’un edit, ce qu’il reste de l’output. C’était un bon compromis quand les modèles avaient besoin d’être guidés. À chaque génération, ils en ont un peu moins besoin.

Unharnessed est conçu pour le bout de cette courbe : un seul outil, et plus rien à enlever.

Abonnement

Utilisez l’abonnement que vous payez déjà.

Unharnessed est gratuit. Connectez-vous avec votre navigateur, depuis le panneau, et les requêtes sont décomptées des limites de votre abonnement : pas de clé API à créer, pas de deuxième facture.

  1. ClaudePro / Max
  2. ChatGPTPlus / Pro
  3. GitHub CopilotVotre abonnement Copilot
  4. Google AIPro / Ultra
  5. GrokCompte xAI
Unharnessed Gratuit et open source

Ou avec votre propre clé

Clés API et comptes cloud

  • Anthropic
  • OpenAI
  • Google Gemini
  • Google Vertex AI
  • Amazon Bedrock
  • Azure OpenAI
  • Mistral
  • xAI
  • DeepSeek
  • Groq
  • Cerebras
  • Fireworks
  • Hugging Face
  • OpenRouter
  • Vercel AI Gateway
  • Cloudflare AI Gateway
  • Cloudflare Workers AI
  • Moonshot AI
  • Kimi For Coding
  • MiniMax
  • ZAI
  • Xiaomi MiMo
  • OpenCode Zen
  • OpenCode Go
  • Prime Inference

Ou faites tourner le modèle vous-même

Serveurs de modèles sur votre machine

  • Ollama
  • LM Studio
  • llama.cpp
  • vLLM
  • Tout serveur compatible OpenAI
Un seul outil

Un seul outil : une session Python qui reste ouverte.

  1. 1

    Un seul appel fait le travail de plusieurs.

    Les derniers modèles passent déjà par Python d’eux-mêmes : plutôt que d’utiliser les outils déjà définis dans leur harnais, ils font tout en Python, via Bash. On est partis de ce constat, et on a construit tout le reste autour pour qu’ils exploitent cette puissance à fond : un REPL, des variables, une session qui reste ouverte. Avec une liste d’outils, chaque appel fait une seule chose et coûte un aller-retour : le modèle attend le résultat, le lit, puis lance l’appel suivant. Ici, un appel, c’est un script : lire un fichier, chercher dans le repo, modifier quarante endroits, vérifier le résultat. Moins d’allers-retours, moins de tours.

    Avec une liste d’outils4 allers-retours
    ModèleVotre machineReadSearchEditCheckTerminé
    Unharnessed1 aller-retour
    ModèleVotre machineRead, search, edit, checkTerminé
  2. 2

    Ce qu’il lit reste dans Python, pas dans son contexte.

    Avec des tool calls, chaque résultat est versé dans le contexte et y reste : le modèle lit un long log, et il le traîne jusqu’à la fin de la tâche. Ici, le log arrive dans la session, sous un nom. Le modèle regarde les dix lignes dont il a besoin, et le reste est à portée de main. La session, c’est un kernel, comme dans Jupyter : il reste en vie entre les appels, avec ses variables. Un serveur que le modèle lance continue d’y tourner, lui aussi.

    Votre repoSession PythonContexte du modèle
    Avec une liste d’outils40 000 lignes dans le contexte
    Rien n’est gardéLog du serveur40 000 lignesles 40 000 lignes
    Unharnessed10 lignes dans le contexte
    Log du serveur40 000 lignesLog du serveurgardé, sous un nomles 10 lignes qu’il lui fallait
  3. 3

    Il écrit les fonctions dont il a besoin.

    Pas de nouveaux outils : de simples fonctions Python, gardées comme variables dans la session. Le modèle en rappelle une quand il en a besoin, la réécrit ou la supprime, comme n’importe quelle variable. Sur 200 fichiers, c’est une boucle, dans un seul appel. Avec une liste d’outils figée, il faut 200 appels, et 200 résultats finissent dans le contexte.

    Votre repoSession PythonContexte du modèle
    Avec une liste d’outils200 appels
    Rien n’est gardé200 fichiers200 résultats
    Unharnessed1 appel
    200 fichiersTrouver les tests flakyune variable dans la session3 tests flaky
  4. 4

    Le contexte est compacté. La session, elle, continue.

    Une longue tâche finit par déborder du contexte, et le harnais doit le résumer. Ce qui n’existait que dans la conversation est perdu. Ce qui vit dans la session est toujours là : les données, le serveur qui tourne, les fonctions qu’il a écrites. Reprenez la session un autre jour : les données et les fonctions reviennent.

    Variables PythonContexte du modèle
    Avec une liste d’outilsIl ne reste qu’un résumé
    Rien n’est gardé hors du contexteCompactétout ce qu’il a luun résumé ; le reste est perdu
    UnharnessedTout est encore là
    Log du serveurRésultats des testsServeur de devTrouver les tests flakytoujours làCompactéce qu’il a regardéun résumé
Code mode

Le code mode appelle les outils qu’on lui a donnés. Ici, le modèle écrit les siens.

Droid, Pi, Codex et Reason laissent désormais le modèle écrire un script. Mais ce script ne fait qu’appeler les outils que le harnais a déjà construits : la même liste figée, appelée depuis du code.

Ici, il n’y a aucune liste à appeler. Le modèle écrit le code qui fait le travail, et garde ce qu’il a écrit sous forme de fonctions, pour la prochaine fois.

Code mode8 appels, 4 outils
Construits par le harnaisReadSearchEditRun
Le scriptReadSearchReadEditRunSearchEditRun
Les quatre mêmes outils, dans n’importe quel ordre.
Unharnessed3 fonctions écrites
Écrites par le modèleTrouver les tests flakyRenommer un symboleComparer deux logs
Ce que la tâche demande.
Laissé de côté

Ce qu’on n’a pas construit.

  • Pas de sous-agents

    Pour confier du travail à un sous-agent, le modèle principal doit lui écrire un brief, et un brief, ce n’est jamais la tâche entière. Le sous-agent part de zéro, dépense des tokens à redécouvrir ce que le premier modèle savait déjà, puis renvoie un résumé de ce qu’il a trouvé. À chaque passage de relais, on perd quelque chose.

    Ici, le modèle qui a votre tâche en main fait chaque appel lui-même. Ce qu’il a besoin de savoir, il le lit à la source.

  • Pas de mémoire

    Une mémoire, c’est l’agent qui garde des notes sur vous d’une session à l’autre. Les notes s’accumulent et sont rechargées à chaque fois : elles prennent du contexte, qu’elles servent ou non. Et elles n’expirent pas quand vous changez d’avis : l’ancienne préférence est toujours là, à contredire ce que vous demandez aujourd’hui.

    Ici, une nouvelle session part de votre repo et de votre demande. Ce qui doit toujours rester vrai, vous l’écrivez vous-même dans AGENTS.md, où vous pouvez le relire et le supprimer.

  • Pas de demande de permission

    La plupart des harnais s’arrêtent avant une commande et attendent votre feu vert. Tant que vous n’êtes pas revenu devant l’écran, rien n’avance.

    Unharnessed ne bloque jamais un appel : un goal peut donc tourner tout seul. C’est un pari, pris en avance : les modèles jugent de mieux en mieux ce qu’on peut lancer sans risque, et un harnais construit autour de la demande de permission, il faudrait le démonter plus tard. Aujourd’hui, c’est le choix le plus risqué ; tant que le pari n’est pas gagné, lancez-le dans un container.

Un system prompt minimal

Chaque règle d’un system prompt est une décision prise à la place du modèle, et elle occupe le contexte à chaque tour.

Le nôtre dit ce qu’est l’unique outil et comment s’en servir, une seule fois. Le reste de la place est au modèle.

Async par défaut

Dans la plupart des harnais, une commande bloque le modèle jusqu’à ce qu’elle se termine : un build de dix minutes, c’est dix minutes à attendre.

Ici, chaque commande part en arrière-plan et renvoie un handle. Le modèle continue de travailler, et il est prévenu quand la commande est terminée.

Juste le harnais

Un harnais livré en app à part entière, ou en nouvel IDE, doit refaire ce que votre éditeur fait déjà : Git, les diffs, un terminal. Et pour s’en servir, vous quittez votre setup pour le sien.

Unharnessed est une extension VS Code : un panneau sur le côté, avec vos conversations. Votre Git, vos extensions et vos workflows restent tels quels, et tout notre travail va dans le harnais.

Pourquoi pas un CLI ?

Un terminal n’affiche que du texte : les tool calls s’y noient, le Markdown s’affiche mal, et on se casse la tête pour pas grand-chose.

Une extension, elle, a une vraie interface : on voit clairement chaque tool call, le Markdown s’affiche comme il faut, et on peut glisser une image directement dans le message. C’est plus simple, et c’est plus beau.

Enlevez le harnais.

Donnez un kernel Python au modèle, et laissez-le faire.