opencode-sdk
Rust SDK for OpenCode HTTP API with SSE streaming support. Provides ergonomic async client, 15 REST API modules, 40+ event types, and managed server lifecycle.
Requirements
- Platform: Unix only (Linux/macOS). Windows compilation fails with
compile_error!. - Rust Edition: 2024 (requires Rust 1.85+)
- Runtime: Tokio
Installation
Add to your Cargo.toml:
[]
= "0.1"
# Or with all features:
= { = "0.1", = ["full"] }
Features
| Feature | Default | Description |
|---|---|---|
http |
✓ | HTTP API client and modules |
sse |
✓ | SSE streaming support |
server |
✗ | Managed server process |
cli |
✗ | CLI wrapper |
full |
✗ | All features enabled |
Quick Start
use Client;
use Duration;
async
Streaming Events
use Event;
// Subscribe to session events
let mut subscription = client.subscribe_session.await?;
while let Some = subscription.recv.await
API Overview
Sessions API
let sessions = client.sessions;
// Create session
let session = sessions.create.await?;
// Create with title
let session = sessions.create_with.await?;
// List, get, delete
let all_sessions = sessions.list.await?;
let session = sessions.get.await?;
sessions.delete.await?;
// Fork, share, revert
let forked = sessions.fork.await?;
sessions.share.await?;
sessions.revert.await?;
Messages API
let messages = client.messages;
// Send prompt
let response = messages.prompt.await?;
// Send async (use with SSE)
messages.send_text_async.await?;
// List and get messages
let message_list = messages.list.await?;
let message = messages.get.await?;
SSE Subscriptions
// All events for directory
let sub = client.subscribe.await?;
// Filtered to specific session
let sub = client.subscribe_session.await?;
// Global events (all directories)
let sub = client.subscribe_global.await?;
// Raw JSON frames
let raw = client.subscribe_raw.await?;
Managed Server (requires server feature)
use ;
// Start managed server
let server = start.await?;
// Create client connected to managed server
let client = builder
.base_url
.build?;
// Server auto-stops when dropped
server.stop.await?;
CLI Runner (requires cli feature)
use ;
let mut runner = start.await?;
// Stream events
while let Some = runner.recv.await
// Or collect all text
let text = runner.collect_text.await;
Event Types
The SDK supports 40+ SSE event types organized by category:
- Server/Instance:
ServerConnected,ServerHeartbeat,ServerInstanceDisposed,GlobalDisposed - Session:
SessionCreated,SessionUpdated,SessionDeleted,SessionDiff,SessionError,SessionCompacted,SessionStatus,SessionIdle - Messages:
MessageUpdated,MessageRemoved,MessagePartUpdated,MessagePartRemoved - Questions:
QuestionCreated,QuestionUpdated,QuestionRemoved - Files:
FileChanged,FileSynced - MCP:
MCPServerConnected,MCPServerDisconnected,MCPError,MCPLog - Tool:
ToolCallCreated,ToolCallUpdated - And more...
Project Structure
src/
├── lib.rs # Crate root and re-exports
├── client.rs # Client, ClientBuilder
├── error.rs # OpencodeError, Result
├── sse.rs # SSE streaming and subscriptions
├── server.rs # ManagedServer (server feature)
├── cli.rs # CliRunner (cli feature)
├── runtime.rs # ManagedRuntime
├── http/ # HTTP API modules
│ ├── sessions.rs
│ ├── messages.rs
│ └── ...
└── types/ # Data models
├── session.rs
├── message.rs
└── event.rs
Error Handling
match result
Common Pitfalls
- Subscribe before sending - Create SSE subscription before async prompts to avoid missing early events
- Check feature flags -
serverandclirequire explicit enabling - Keep server alive -
ManagedServerkills on drop; hold reference while using - Handle platform - Unix only; use WSL or Docker on Windows
License
Apache-2.0
Resources
Version 0.1.3