OpenCode SDK for Elixir

An unofficial Elixir SDK for OpenCode that mirrors the JS SDK (@opencode-ai/sdk). The client and types are generated from the OpenCode OpenAPI spec.

hex.pm link: https://hex.pm/packages/opencode_sdk/

Installation

Add opencode_sdk to your dependencies in mix.exs:

def deps do
[
{:opencode_sdk, "~> 0.1.1"}
]
end

Quickstart

Start an OpenCode server and get a connected client:

{:ok, %{client: client, server: server}} = OpenCode.create()
{:ok, health} = OpenCode.Generated.Operations.global_health(client)
IO.inspect(health, label: "health")
OpenCode.close(%{server: server})

Connect to an existing server:

client = OpenCode.create_client(base_url: "http://127.0.0.1:4096")
{:ok, projects} = OpenCode.Generated.Operations.project_list(client)

Create API

OpenCode.create/1 options

OpenCode.create/1 forwards to OpenCode.create_server/1 and returns %{client, server}.

OptionTypeDescriptionDefault
:hostnameString.t()Server hostname"127.0.0.1"
:portinteger()Server port4096
:timeoutinteger()Startup timeout in ms5000
:configmap()Config passed via OPENCODE_CONFIG_CONTENT%{}

OpenCode.create_client/1 options

OptionTypeDescriptionDefault
:base_urlString.t()OpenCode server URL"http://127.0.0.1:4096"
:directoryString.t()Project directory sent via x-opencode-directorynil
:headersmap() | keyword()Extra HTTP headers[]
:timeoutinteger() | :infinityRequest timeout:infinity

Common Workflows

Sessions and prompts

{:ok, session} =
OpenCode.Generated.Operations.session_create(%{title: "SDK walkthrough"}, client)
{:ok, reply} =
OpenCode.Generated.Operations.session_prompt(
session.id,
%{
parts: [%{type: "text", text: "Summarize this project in 3 bullets."}]
},
client
)
IO.inspect(reply.info)

Real-time events (SSE)

{:ok, %{stream: stream}} = OpenCode.Generated.Operations.event_subscribe(client)
Enum.each(stream, fn event ->
IO.inspect(event.type, label: "event")
end)

TUI process lifecycle

{:ok, tui} = OpenCode.create_tui(project: "/path/to/project")
OpenCode.Tui.close(tui)

Capability Guide

The generated operations module includes much more than sessions. Key groups:

Examples:

# Permissions
{:ok, pending} = OpenCode.Generated.Operations.permission_list(client)
# Questions
{:ok, questions} = OpenCode.Generated.Operations.question_list(client)
# MCP status
{:ok, mcp} = OpenCode.Generated.Operations.mcp_status(client)
# PTY sessions
{:ok, ptys} = OpenCode.Generated.Operations.pty_list(client)
# Providers
{:ok, providers} = OpenCode.Generated.Operations.provider_list(client)

Types and Docs

All OpenAPI types are generated under OpenCode.Generated.* (for example, OpenCode.Generated.Session).

API functions and types are documented in generated module docs, primarily:

Regenerating

The OpenAPI spec is at priv/opencode_openapi.json. Regenerate the client with:

mix opencode.gen.client --spec priv/opencode_openapi.json

Note

This project is unofficial and is not affiliated with the OpenCode team.