Wat is een agent-harness?
Een agent-harness is de laag rond een taalmodel die losse modelaanroepen tot een agent maakt: het draait de lus, voert de tools uit waar het model om vraagt, beheert het contextvenster en bepaalt wat het model mag doen.
Waar de grenzen liggen
Het woord is het makkelijkst af te bakenen door eliminatie. Een draaiende AI-coding-agent bestaat uit vier lagen, en maar twee daarvan zijn het harness. Daaronder zit een model dat je niet zelf hebt getraind en een HTTP-API waar je geen controle over hebt; daarboven zit wat de uitvoer op een scherm tekent. Het harness is alles daartussen, oftewel: alles waarover beslist moet worden.
| Laag | Eigendom van | Wat het bepaalt |
|---|---|---|
| Modelgewichten en inferentie | De aanbieder | Anthropic, OpenAI, Google of een runtime op je eigen machine. |
| Wire-formaat | De aanbieder | De eigen HTTP-vorm van elke aanbieder voor berichten, tools en streaming. |
| Agent-lus | Het harness | Aanroepen, het antwoord lezen, uitvoeren waar om gevraagd werd, opnieuw aanroepen, stoppen als het klaar is. |
| Tool-uitvoering | Het harness | Argumenten valideren, de tool uitvoeren en bepalen wat parallel loopt. |
| Externe tools (MCP) | Het harness | Servers vinden, hun tools van een namespace voorzien, JSON-RPC met ze spreken. |
| Context | Het harness | Wat in het venster blijft, wat wordt gecompacteerd, wat van eerder wordt teruggehaald. |
| Permissies | Het harness | Wat de agent mag zonder te vragen, en waarover hij eerst moet vragen. |
| Weergave | De frontend | Een terminal, een browser, een desktopvenster of helemaal geen scherm. |
Lees de tabel van boven naar beneden en de reden voor de term wordt duidelijk: de twee bovenste rijen veranderen om de paar maanden, de onderste rij is een kwestie van smaak, en in de vijf middelste zit elke moeilijke beslissing van een agent. Dat midden een naam geven, is wat het woord doet.
Waarom modelonafhankelijk het moeilijke deel is
Bijna elk harness wordt tegen één aanbieder geschreven en daarna aan andere aangepast. Die volgorde is het probleem: de aannames van de eerste aanbieder belanden in de gespreksopslag, in het toolschema, in hoe een gestreamd antwoord wordt geparsed — plekken waar later niemand meer kijkt. Wisselen betekent dan een migratie, en een migratie midden in een sessie betekent dat je niet wisselt.
Het alternatief is de geschiedenis op te slaan in een formaat dat van geen enkele aanbieder is, en die pas om te zetten naar het wire-formaat van een aanbieder op het moment dat een verzoek de deur uitgaat. Er wordt niets geconverteerd als het model verandert, omdat er nooit iets in de vorm van het oude model stond. Dat is de ene ontwerpbeslissing waar OHarness omheen is gebouwd, en de architectuurpagina beschrijft hoe die gelaagdheid wordt afgedwongen in plaats van alleen bedoeld.
Harness, framework, SDK
- Een SDK brengt een verzoek naar een model en een antwoord terug. Eén aanroep, één aanbieder, geen geheugen van de vorige.
- Een framework geeft je onderdelen om een agent mee te bouwen. Je beslist nog steeds over de lus, de herhaalpogingen en het compactiebeleid — en daarna ben jij er eigenaar van.
- Een harness is het gebouwde geheel. De lus, tool-uitvoering, contextbeheer en permissies zijn al beslist; jij levert tools, een model en een beleid.
De praktische test is wat er gebeurt op de dag dat je een ander model wilt. Met een SDK herschrijf je de aanroep. Met een framework ontdek je hoeveel van je eigen onderdelen uitgingen van de oude aanbieder. Met een harness dat ervoor is gebouwd, verander je één instelling.
Veelgestelde vragen
Is een agent-harness hetzelfde als een agent-framework?
Ze overlappen, en het nuttige onderscheid is wat je uiteindelijk in handen hebt. Een framework vraagt je een agent uit zijn onderdelen te bouwen — jij schrijft de lus, de graaf, de herhaalpogingen. Een harness ís de lus, al geschreven: je geeft het tools, een model en een set permissies, en het draait. Met de meeste frameworks kun je een harness bouwen; een harness is wat je anders zelf had gebouwd.
Heb ik een harness nodig als een aanbieder al een SDK levert?
Een SDK van een aanbieder brengt je tot een modelaanroep en houdt daar op. Het heeft geen mening over wanneer je opnieuw aanroept, wat je met een toolresultaat doet, wat je weglaat als het contextvenster volloopt, of een shell-commando zonder te vragen mag draaien. Die beslissingen zijn het harness, en als je er geen kiest, schrijf je er zelf een — meestal per ongeluk, verspreid over een codebase, tegen precies één aanbieder.
Kan één harness met meer dan één modelaanbieder praten?
Dat kan, maar alleen als het vanaf het begin zo is gebouwd. Het lastige is niet de HTTP: het is dat de gespreksgeschiedenis, tooldefinities en gestreamde uitvoer allemaal een aanbiederspecifieke vorm hebben, en een harness dat de geschiedenis in de vorm van één aanbieder opslaat, moet die migreren om te wisselen. De geschiedenis in een neutrale vorm opslaan en pas op het moment van het verzoek omzetten naar het wire-formaat van een aanbieder, maakt wisselen kosteloos.
Bestaat er een open source agent-harness?
Verschillende publiceren hun broncode, onder andere OpenCode, Cline en Gemini CLI. OHarness is gratis te gebruiken en de npm-pakketten zijn gepubliceerd onder de MIT-licentie, maar de broncoderepository is voorlopig privé. Het spreekt native met Anthropic, OpenAI en Google Gemini, met elk OpenAI-compatibel endpoint en met lokale runtimes zoals Ollama, LM Studio en vLLM — en het draait in een terminal, een browser, een desktop-app en headless, allemaal op dezelfde engine.
Probeer de implementatie
OHarness is een modelonafhankelijk agent-harness, gratis te gebruiken: twee runtime-afhankelijkheden, elke aanbieder bereikt via gewone fetch en SSE, en een eigen MCP-client. De documentatie is geschreven naast de code die ze beschrijft, en op de downloadpagina vind je de desktopbuilds en de command line.