Catalog / Cloudflare Developer Platform
Agents, Workers - Run OpenCode 2.0 on Cloudflare with the Agents SDK
The Agents SDK now supports OpenCode 2.0 ↗︎ through the experimental OpenCodeHarness. Run OpenCode inside a plain Durable Object, with sessions stored in SQLite and Lifecycle jobs that wake interrupted work after eviction.
The agents/models/opencode provider connects OpenCode to Workers AI through the AI binding. OpenCode plugins extend the harness with custom tools, remote MCP servers, and skills. Refer to OpenCode's Cloudflare SDK documentation ↗︎ for the embedded host API.
Install Agents SDK 0.28.0 or later with the OpenCode packages:
npmyarnpnpmbunnpm i agents@latest @opencode/sdk@2 @opencode/plugin@2yarn add agents@latest @opencode/sdk@2 @opencode/plugin@2pnpm add agents@latest @opencode/sdk@2 @opencode/plugin@2bun add agents@latest @opencode/sdk@2 @opencode/plugin@2
Create a harness and install a Lifecycle on your Durable Object:
import { DurableObject } from "cloudflare:workers";
import { Lifecycle } from "agents/lifecycle";
import { OpenCodeWorkerd } from "@opencode/sdk/workerd";
import { OpenCodeHarness } from "agents/harness/opencode";
import { createAI } from "agents/models/opencode";
import workerTools from "./worker-tools";
export class Assistant extends DurableObject {
ai = createAI({ binding: this.env.AI });
harness = new OpenCodeHarness({
opencode: ({ storage }) =>
OpenCodeWorkerd.create({
storage,
models: { fetch: false },
plugins: [this.ai.plugin, workerTools],
}),
defaults: {
model: this.ai("@cf/moonshotai/kimi-k2.7-code", {
reasoningEffort: "low",
}),
agent: "build",
},
});
lifecycle = Lifecycle.install(this).use(this.harness);
async ask(prompt) {
const { status, text, reason } = await this.harness.prompt(prompt);
return { status, text, reason };
}
}import { DurableObject } from "cloudflare:workers";
import { Lifecycle } from "agents/lifecycle";
import { OpenCodeWorkerd } from "@opencode/sdk/workerd";
import { OpenCodeHarness } from "agents/harness/opencode";
import { createAI } from "agents/models/opencode";
import workerTools from "./worker-tools";
export class Assistant extends DurableObject<Env> {
ai = createAI({ binding: this.env.AI });
harness = new OpenCodeHarness({
opencode: ({ storage }) =>
OpenCodeWorkerd.create({
storage,
models: { fetch: false },
plugins: [this.ai.plugin, workerTools],
}),
defaults: {
model: this.ai("@cf/moonshotai/kimi-k2.7-code", {
reasoningEffort: "low",
}),
agent: "build",
},
});
lifecycle = Lifecycle.install(this).use(this.harness);
async ask(prompt: string) {
const { status, text, reason } = await this.harness.prompt(prompt);
return { status, text, reason };
}
}
The OpenCode harness guide includes the workerTools plugin, Wrangler configuration, and session APIs. The working example ↗︎ adds a browser UI, WebSocket streaming, and persistent note tools.