Vad är en agent-harness?
En agent-harness är lagret runt en språkmodell som gör enskilda modellanrop till en agent: den kör loopen, utför verktygen som modellen ber om, hanterar kontextfönstret och avgör vad modellen får göra.
Var gränserna går
Ordet är lättast att ringa in genom uteslutning. En körande kodagent är fyra lager djup, och bara två av dem är harnessen. Under den finns en modell du inte har tränat och ett HTTP-API du inte styr över; ovanför den finns det som ritar utdatan på en skärm. Harnessen är allt däremellan, alltså: allt som måste beslutas.
| Lager | Ägs av | Vad det avgör |
|---|---|---|
| Modellvikter och inferens | Leverantören | Anthropic, OpenAI, Google eller en körtid på din egen dator. |
| Trådformat | Leverantören | Varje leverantörs egen HTTP-form för meddelanden, verktyg och strömning. |
| Agentloop | Harnessen | Anropa, läs svaret, kör det den bad om, anropa igen, sluta när den är klar. |
| Verktygskörning | Harnessen | Validera argument, köra verktyget och avgöra vad som körs parallellt. |
| Externa verktyg (MCP) | Harnessen | Upptäcka servrar, ge deras verktyg en namnrymd, tala JSON-RPC med dem. |
| Kontext | Harnessen | Vad som stannar i fönstret, vad som komprimeras, vad som hämtas fram från tidigare. |
| Behörigheter | Harnessen | Vad agenten får göra utan att fråga, och vad den måste fråga om först. |
| Rendering | Gränssnittet | En terminal, en webbläsare, ett skrivbordsfönster eller ingen skärm alls. |
Läs tabellen uppifrån och ned så blir skälet till att termen finns uppenbart: de två översta raderna ändras med några månaders mellanrum, den nedersta raden är en smaksak, och de fem i mitten är där varje svårt beslut i en agent faktiskt bor. Att ge den mitten ett namn är vad ordet gör.
Varför modelloberoende är det svåra
Nästan varje harness skrivs mot en leverantör och anpassas till andra i efterhand. Den ordningen är problemet: den första leverantörens antaganden hamnar i samtalslagret, i verktygsschemat, i hur ett strömmat svar parsas — ställen ingen tänker på att titta på senare. Att byta innebär då en migrering, och en migrering mitt i en session innebär att du inte byter.
Alternativet är att lagra historiken i ett format som inte tillhör någon leverantör och rendera den till leverantörens trådformat i samma ögonblick som ett anrop går ut. Ingenting konverteras när modellen byts, eftersom ingenting någonsin var i den gamla modellens form. Det är det enda designbeslut som OHarness är byggd kring, och arkitektursidan beskriver hur skiktningen upprätthålls snarare än bara är tänkt.
Harness, ramverk, SDK
- Ett SDK skickar ett anrop till en modell och får tillbaka ett svar. Ett anrop, en leverantör, inget minne av det förra.
- Ett ramverk ger dig delar att sätta ihop en agent av. Du bestämmer fortfarande loopen, omförsöken, komprimeringspolicyn — och du äger dem efteråt.
- En harness är den sammansatta helheten. Loopen, verktygskörningen, kontexthanteringen och behörigheterna är redan bestämda; du tillhandahåller verktyg, en modell och en policy.
Det praktiska testet är vad som händer den dag du vill ha en annan modell. Med ett SDK skriver du om anropsstället. Med ett ramverk får du ta reda på hur många av dina egna delar som antog den gamla leverantören. Med en harness byggd för det ändrar du en inställning.
Vanliga frågor
Är en agent-harness samma sak som ett agentramverk?
De överlappar, och den användbara skillnaden är vad du till slut sitter med. Ett ramverk ber dig bygga en agent av dess delar — du skriver loopen, grafen, omförsöken. En harness är loopen, redan skriven: du ger den verktyg, en modell och en uppsättning behörigheter, och den kör. De flesta ramverk kan användas för att bygga en harness; en harness är det du annars skulle ha byggt själv.
Om en leverantör redan levererar ett SDK, behöver jag då en harness?
Ett leverantörs-SDK tar dig till ett modellanrop och stannar där. Det har ingen åsikt om när det ska anropa igen, vad det ska göra med ett verktygsresultat, vad som ska släppas när kontextfönstret blir fullt, eller om ett skalkommando ska köras utan att fråga. De besluten är harnessen, och om du inte väljer en kommer du att skriva en — oftast av misstag, utspridd över en kodbas, mot exakt en leverantör.
Kan en harness tala med mer än en modelleverantör?
Det kan den, men bara om den byggdes så från början. Det svåra är inte HTTP: det är att samtalshistorik, verktygsdefinitioner och strömmad utdata alla har en leverantörsformad form, och en harness som lagrar historiken i en leverantörs form måste migrera den för att byta. Att lagra historiken i en neutral form och rendera den till leverantörens trådformat i samma ögonblick som anropet görs är det som gör bytet gratis.
Finns det en agent-harness med öppen källkod?
Flera publicerar sin källkod, bland dem OpenCode, Cline och Gemini CLI. OHarness är gratis att använda och dess npm-paket publiceras under MIT-licensen, men källkodsrepot är privat tills vidare. Den talar nativt med Anthropic, OpenAI och Google Gemini, med valfri OpenAI-kompatibel endpoint och med lokala körtider som Ollama, LM Studio och vLLM — och den körs i en terminal, en webbläsare, en skrivbordsapp och headless, allt på samma motor.
Prova implementationen
OHarness är en modelloberoende agent-harness, gratis att använda: två körtidsberoenden, varje leverantör nås via vanlig fetch och SSE, och en egen MCP-klient. Dokumentationen är skriven bredvid koden den beskriver, och nedladdningssidan har skrivbordsbyggena och kommandoraden.