OpenCode SDK
SkillWeb & browsing[WHAT] TypeScript SDK for programmatic control of OpenCode AI coding agent. [HOW] Client/server architecture: start embedded server or connect to existing instance. [WHEN] Use when automating OpenCode, building integrations, or controlling sessions programmatically. [WHY] Enables headless coding agent workflows, CI/CD integration, and custom tooling.
Use OpenCode SDK in Claude, ChatGPT or Ahel Desktop
Free. Sign in, add OpenCode SDK and connect your AI. About a minute.
Also: Claude Code · Cursor · Codex
Then ask your AI: use the OpenCode SDK skill
Details
Instructions available. Your AI can read the instructions. Execution depends on the setup they require.
Account requirements not reviewed. Check the skill instructions before use; Ahel provides instructions and does not run this skill.
No other account needed.
Add Ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
What this skill tells your AI
The instructions your AI receives, as published by lev-os/agents in skills-db/_todo/opencode-sdk/SKILL.md and read by Ahel’s review.
TypeScript SDK for the OpenCode AI coding agent. Control sessions, send prompts, and subscribe to events programmatically.
Quick Start
npm install @opencode-ai/sdk
Full Instance (Server + Client)
import { createOpencode } from "@opencode-ai/sdk"
const { client, server } = await createOpencode({
hostname: "127.0.0.1",
port: 4096,
timeout: 5000,
config: {
model: "anthropic/claude-sonnet-4-20250514"
}
})
// Use client...
server.close()
Client Only (Connect to Running Instance)
import { createOpencodeClient } from "@opencode-ai/sdk"
const client = createOpencodeClient({
baseUrl: "http://localhost:4096"
})
Core APIs
Sessions
// Create session
const session = await client.session.create({
body: { title: "My Task" }
})
// Send prompt
const result = await client.session.prompt({
path: { id: session.id },
body: {
model: { providerID: "anthropic", modelID: "claude-sonnet-4-20250514" },
parts: [{ type: "text", text: "Implement a function to..." }]
}
})
// Inject context without AI response
await client.session.prompt({
path: { id: session.id },
body: {
noReply: true,
parts: [{ type: "text", text: "Context: This project uses..." }]
}
})
// List sessions
const sessions = await client.session.list()
// Get session messages
const messages = await client.session.messages({ path: { id: session.id } })
Files & Search
// Search text in files
const textResults = await client.find.text({
query: { pattern: "function.*handler" }
})
// Find files by name
const files = await client.find.files({
query: { query: "*.ts", type: "file", limit: 50 }
})
// Find symbols
const symbols = await client.find.symbols({
query: { query: "handleRequest" }
})
// Read file content
const content = await client.file.read({
query: { path: "src/index.ts" }
})
Events (SSE Stream)
const events = await client.event.subscribe()
for await (const event of events.stream) {
switch (event.type) {
case "message.updated":
console.log("Message:", event.properties.info)
break
case "session.status":
console.log("Status:", event.properties.status)
break
case "permission.updated":
// Handle permission requests
break
}
}
TUI Control
// Append to prompt
await client.tui.appendPrompt({ body: { text: "Add this text" } })
// Submit prompt
await client.tui.submitPrompt()
// Show toast
await client.tui.showToast({
body: { message: "Task complete", variant: "success" }
})
// Execute command
await client.tui.executeCommand({ body: { name: "agent_cycle" } })
Key Types
import type {
Session,
Message,
UserMessage,
AssistantMessage,
Part,
TextPart,
ToolPart,
Permission,
SessionStatus
} from "@opencode-ai/sdk"
Decision Tree
What do you need?
│
├─→ Start OpenCode + control it?
│ └─→ createOpencode() - starts server + returns client
│
├─→ Connect to running OpenCode?
│ └─→ createOpencodeClient({ baseUrl }) - client only
│
├─→ Send prompts programmatically?
│ └─→ client.session.prompt()
│
├─→ Inject context without response?
│ └─→ client.session.prompt({ body: { noReply: true, ... } })
│
├─→ Stream events in real-time?
│ └─→ client.event.subscribe()
│
└─→ Control TUI remotely?
└─→ client.tui.* methods
Integration Patterns
Headless Agent Loop
import { createOpencode } from "@opencode-ai/sdk"
const { client, server } = await createOpencode()
const session = await client.session.create({ body: { title: "Automated" } })
// Subscribe to events for progress
const events = await client.event.subscribe()
// Send task
await client.session.prompt({
path: { id: session.id },
body: {
model: { providerID: "anthropic", modelID: "claude-sonnet-4-20250514" },
parts: [{ type: "text", text: "Fix all TypeScript errors in src/" }]
}
})
// Wait for completion via events
for await (const event of events.stream) {
if (event.type === "session.idle" && event.properties.sessionID === session.id) {
break
}
}
server.close()
Permission Handling
for await (const event of events.stream) {
if (event.type === "permission.updated") {
const perm = event.properties
// Auto-approve file reads, prompt for writes
if (perm.type === "file_read") {
await client.postSessionIdPermissionsPermissionId({
path: { id: perm.sessionID, permissionId: perm.id },
body: { response: "allow" }
})
}
}
}
References
references/api-reference.md- Complete API documentationreferences/types.md- Full TypeScript type definitionsreferences/events.md- All event types and properties
See Also
- Official docs: https://opencode.ai/docs/sdk
- OpenCode CLI:
opencode(TUI) - GitHub: https://github.com/anomalyco/opencode
Signals
- GitHub stars
- 23
- Forks
- 2
- Last commit
- Oct 2026
Ahel review
K1binfo
installs-packages
Automated review, not a security audit. Ruleset v1+k2.
Advanced
- Item type
- skill
- Key
opencode-sdk- Source
- github.com/lev-os/agents
Related picks
Skill · mattpocock
The pick for TypeScripttypescript-pro
Skill · jeffallan
The pick for TypeScriptbrowser-use
Skill · browser-use
More in Web & browsingwebapp-testing
Skill · anthropics
More in Web & browsingplaywright-cli
Skill · microsoft
More in Web & browsingbenchmark
Skill · affaan-m
More in Web & browsing