OpenCode 2.0
De Service
Vanaf het begin heeft OpenCode een client/server-model gehanteerd. Dit was echter niet iets waar standaard gebruik van werd gemaakt en werd voornamelijk door power-users gebruikt. In versie 2.0 draait deze server nu automatisch als één enkel achtergrondproces op je machine. Wanneer je een TUI (Terminal User Interface), de webinterface of de desktop-app opent, communiceren deze allemaal met hetzelfde centrale proces.
Voor wie de programmatische client @opencode/client gebruikt om eigen scripts te maken: deze zullen de lokale service automatisch ontdekken en direct werken. Dit is bijzonder nuttig voor geplande taken. Je kunt de service ook aanroepen via de CLI door gebruik te maken van opencode api-commando's.
Daarnaast kun je de service openstellen voor andere hosts en /pair of opencode pair gebruiken om verbinding te maken met andere applicaties. Er zijn native apps in ontwikkeling die gebruikmaken van deze workflow.
De API
De oude API groeide haphazardly terwijl wij en de wereld collectief leerden wat agents zijn en zouden moeten zijn. Het was slecht. We zijn daarom vanaf nul opnieuw begonnen en hebben alle vreemde use-cases onderzocht van de miljoenen gebruikers die OpenCode dagelijks gebruiken. De nieuwe API ondersteunt nu vrijwel alles wat je nodig hebt.
OpenCode is nu ook bewust van zijn eigen API en zal deze aanroepen om nuttige zaken te doen, zoals het verplaatsen van de huidige sessie naar een git-werktree bij het starten van nieuw werk.
Voorbeeld van interactie:
- Gebruiker: "Start rate limiting uploads in een nieuwe worktree."
- Systeem:
opencode.worktree_create[name=rate-limit]opencode.session_rename[title=Rate limit uploads]opencode.session_move[directory=~/worktrees/rate-limit]- Gebruiker: "De flaky test sessie loopt vast. Stop deze, quarantine de test en sluit mijn voltooide tabs."
- Systeem:
opencode.session_listopencode.sessioncontext[sessionID=ses7c41e09a]→ "Retrying uploads.test.ts again…"opencode.sessioninterrupt[sessionID=ses7c41e09a]opencode.sessionprompt[sessionID=ses7c41e09a, text=Quarantine uploads.test.ts]opencode.tabclose[sessionID=ses2f9d61b4]- Resultaat: "Gestopt, de test in quarantine geplaatst en de config-tab gesloten."
Daarnaast hebben we een nieuw client-pakket uitgebracht, @opencode/client, dat clients bevat voor vanilla JavaScript en Effect.
import { OpenCode } from "@opencode/client"
import { Service } from "@opencode/client/service"
const endpoint = await Service.ensure()
const client = OpenCode.make({
baseUrl: endpoint.url,
headers: Service.headers(endpoint),
})
const session = await client.session.create({
location: { directory: process.cwd() },
})
await client.session.prompt({
sessionID: session.id,
text: "Review the current changes",
})
Code Mode
Modellen schrijven graag code, en OpenCode 2.0 maakt daar meer gebruik van dan enige andere coding agent. We hebben een minimale JavaScript-interpreter gebouwd in het @opencode/codemode-pakket.
Voorbeeld scenario:
- Gebruiker: "Meld GitHub-bugs aan in Linear."
- Systeem (Code Mode):
return [
search({ query: "list github issues" }),
search({ query: "create linear issue" })
]
const { issues } = await tools.github.list_issues({
owner: "anomalyco",
repo: "opencode",
labels: ["bug"],
state: "OPEN",
})
const filed = await Promise.all(issues.map(({ title }) =>
tools.linear.save_issue({ team: "OC", title })
))
return filed.map(issue => issue.identifier)
(Gebruikte MCP servers: github, linear, sentry)
Dit pakket absorbeert MCP-servers of OpenAPI-endpoints en converteert deze naar functies die de agent in een script kan aanroepen. Het kan deze scripts native uitvoeren zonder de complexiteit van Node.js VM's of het embedden van gecompliceerde oplossingen zoals QuickJS.
Hierdoor kan je agent scripts schrijven die bijvoorbeeld een tool aanroepen, de resultaten mappen en vervolgens een andere tool aanroepen. Dit resulteert in één enkele round-trip in plaats van het één voor één aanroepen van tools. Alle MCP-servers in 2.0 zijn standaard aangemeld voor 'code mode'. Dit betekent dat je er duizenden kunt toevoegen met minimale context-bloat, waarbij je agent ze zelf ontdekt en combineert om taken te voltooien.
Achtergrondtaken
De nieuwste reeks modellen is ongelooflijk goed in orchestratie, en het is belangrijk dat frameworks hen in staat stellen deze volledige capaciteit te benutten.
Ten eerste hebben we achtergrond-subagents toegevoegd. Hierdoor kan de primaire agent werk delegeren aan een andere agent terwijl hijzelf doorgaat. Dit gebeurt automatisch, maar je kunt het ook handmatig triggeren — zelfs met een ander model. Je kunt bijvoorbeeld zeggen: "Spawn een achtergrond fable-subagent om deze code te reviewen", terwijl je ondertussen verder prompts typt.
Ten tweede hebben we achtergrond-shellcommando's toegevoegd. De shell-tool kan asynchroon worden aangeroepen, zodat langdurig werk de primaire agent niet hoeft te blokkeren. De agent krijgt een melding wanneer de taken voltooid zijn. Als een foreground shell-commando of subagent langer duurt dan verwacht, kun je een sneltoets gebruiken om deze naar de achtergrond te verplaatsen, zodat je kunt blijven prompten.
Plugins
Hoewel OpenCode 1.0 een pluginsysteem had, kreeg dit nooit de aandacht die nodig was. Om dit te corrigeren, hebben we onszelf gedwongen om bijna elke OpenCode 2.0-functie te implementeren als een interne plugin; er zijn er nu meer dan 80. Dit garandeert dat de Plugin API goed wordt onderhouden.
We hebben ook TUI-plugins gepromoveerd van experimenteel naar stabiel. Omdat dit volledig wordt aangedreven door OpenTUI, kun je bijna alles bouwen.
Daarnaast hebben we veel tijd besteed aan het garanderen dat alles in OpenCode 2.0 'hot-reloaded' kan worden. Hierdoor kan de agent tijdens een sessie een plugin voor zichzelf schrijven en deze direct gebruiken (het ontwerp hiervan is beschreven in een eerdere blogpost). Je kunt OpenCode vragen om elke gewenste plugin te bouwen en het systeem weet hoe dat moet. Documentatie is beschikbaar via de officiële docs.
De SDK
OpenCode kan nu ook als bibliotheek worden gebruikt met het @opencode/sdk-pakket. Dit is exact dezelfde code die onze CLI aandrijft. Dit betekent dat je het kunt strippen en je eigen variant van OpenCode kunt maken die draait op een server of in gespecialiseerde omgevingen zoals Durable Objects. Je kunt hier vervolgens vanaf elke OpenCode-client verbinding mee maken, aangezien het het standaard OpenCode-serverprotocol spreekt.
Er is ook een optionele Effect-gebaseerde API. Deze is nog in ontwikkeling omdat zaken verschuiven, maar je kunt hem alvast gebruiken.
Upgraden
Om de CLI te upgraden, zorg je dat je op de nieuwste 1.x release zit en voer je vervolgens uit: opencode upgrade --major
Voor de desktop-app kun je de nieuwste versie downloaden via de website.
Let op: er zijn enkele breaking changes:
- Plugins uit versie 1.0 werken niet in 2.0.
- De Server API is volledig gewijzigd.
- De
tui.jsonconfiguratie is verplaatst naarjson.
Er zijn veel andere wijzigingen, maar deze zijn backwards compatibel. Het is raadzaam om OpenCode naar dit document te laten verwijzen, zodat het de migratie voor je kan uitvoeren.
Groetjes,