Skip to main content

Python SDK for Opencode — the open source AI coding agent

Project description

Opencode Python SDK

PyPI version Python versions License Downloads Tests Hatchling httpx pydantic

Python SDK for Opencode — the open source AI coding agent.

pip install opencode-py

Quick start

One-shot (spawns server, asks, cleans up)

from opencode import opencode

answer = opencode("What is the capital of France?")
print(answer)

Context manager (recommended)

from opencode import Opencode

with Opencode() as ai:
    answer = ai.ask("Explain dependency injection")
    print(answer)

Streaming

with Opencode() as ai:
    for chunk in ai.ask_stream("Write a Python function"):
        print(chunk, end="")

Conversations

with Opencode() as ai:
    session = ai.create_session()
    msg1 = session.prompt("Suggest a project name")
    print(f"AI: {msg1}")
    msg2 = session.prompt("Now write a tagline for it")
    print(f"AI: {msg2}")

Multi-turn (keep mode)

from opencode import opencode

# keep=True — server and session stay alive between calls
r1 = opencode("My name is Alice", keep=True)
r2 = opencode("What's my name?", keep=True)   # remembers the conversation
r3 = opencode("That's all", keep=False)        # keep=False closes the server

Auto-tools (agentic tool execution)

r = opencode("Create a file called hello.txt", auto_tools=True)

Available tools: bash, write, edit, read, glob, grep.

By default, bash asks for permission in the console, all others run without prompting.

Custom permissions via Session.ask():

from opencode import Opencode, ToolExecutor

with Opencode() as ai:
    session = ai.create_session()
    msg = session.ask(
        "Write test.py with print('hello')",
        tool_executor=ToolExecutor(permissions={"write": "allow"}),
    )

Low-level API (any endpoint)

with Opencode() as ai:
    content = ai.client.file_read("src/main.py")
    diff = ai.client.vcs_diff("HEAD~3")
    config = ai.client.config_get()
    session = ai.client.session_create()
    ai.client.v2_session_prompt(session.id, {"text": "Hello"})

All client methods return typed Pydantic models — IDE autocomplete, validation, .model_dump(), .model_dump_json().

Retry & error handling

from opencode import OpencodeClient, RateLimitError, InternalServerError

client = OpencodeClient(max_retries=3)  # exponential backoff with jitter

try:
    health = client.health()
    print(health.version)
except RateLimitError:
    print("too many requests — retried but failed")
except InternalServerError:
    print("server error")

Debug logging

OPENCODE_LOG=debug python my_script.py

Shows all HTTP requests/responses with timing.

Web UI (zero dependencies)

python web/server.py
# → open http://127.0.0.1:3000

Built-in HTTP server + proxy to opencode serve — no extra dependencies.

Interactive dialog

python live.py

Multi-turn dialog with keep=True, server cleaned up on exit via atexit.

Configuration

with Opencode(
    model="claude-sonnet-4-20250514",
    directory="/path/to/project",
    port=4096,
) as ai:
    ...

Async API

import asyncio
from opencode import AsyncOpendcode

async def main():
    async with AsyncOpendcode() as ai:
        answer = await ai.ask("Explain async/await in Python")
        print(answer)

asyncio.run(main())

Async streaming

async with AsyncOpendcode() as ai:
    async for chunk in ai.ask_stream("Write a poem"):
        print(chunk, end="")

Async conversations

async with AsyncOpendcode() as ai:
    session = await ai.create_session()
    msg1 = await session.prompt("Suggest a project name")
    msg2 = await session.prompt("Now write a tagline for it")

Async low-level client

from opencode import AsyncOpendcodeClient

async with AsyncOpendcodeClient() as client:
    health = await client.health()
    print(health.version)  # typed Pydantic model

Development

# Install in editable mode
pip install -e ".[dev]"

# Run tests
pytest

# Build
python -m build --wheel

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

opencode_py-0.2.1.tar.gz (52.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

opencode_py-0.2.1-py3-none-any.whl (31.3 kB view details)

Uploaded Python 3

File details

Details for the file opencode_py-0.2.1.tar.gz.

File metadata

  • Download URL: opencode_py-0.2.1.tar.gz
  • Upload date:
  • Size: 52.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.11

File hashes

Hashes for opencode_py-0.2.1.tar.gz
Algorithm Hash digest
SHA256 d66a6d1242b08b56bf5ec881833c8c0cd0ace6b30f0e06def85e054ccbf4a2af
MD5 bb44477bd7fe569106b3ecc82792d1a7
BLAKE2b-256 920a704340b5c0a9f3bdc18ee9f6f2a5bbb76d4f4612f3357f0fd871d6c96398

See more details on using hashes here.

File details

Details for the file opencode_py-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: opencode_py-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 31.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.11

File hashes

Hashes for opencode_py-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 24e4884a2898a53bf99514cf6b3adbf87be85373ff742631171e1d9635605997
MD5 3da06f70e25c32a1ca4c452a76755e92
BLAKE2b-256 ffbaf010553baddc762dc25a58274a91bcbe20b7594d0b448c90d5a06c4ad885

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page