Skip to main content

Run Anthropic Claude Code as an optio task; local subprocess or remote via SSH; ttyd-served TUI iframe.

Project description

optio-claudecode

Run Anthropic Claude Code as an optio task — either as a local subprocess or on a remote host over SSH — with the interactive TUI embedded in the optio dashboard via an iframe widget served by ttyd.

Install

pip install optio-claudecode

Requires Python 3.11+. Pulls optio-core, optio-host, and asyncssh.

On task start the package auto-installs the host binaries it needs unless told otherwise:

  • claude — via Anthropic's vendor script (https://claude.ai/install.sh)
  • ttyd — static binary from tsl0922/ttyd GitHub Releases

Quick start

from optio_claudecode import (
    ClaudeCodeTaskConfig,
    create_claudecode_task,
)

def get_tasks():
    return [
        create_claudecode_task(
            process_id="example-task",
            name="Example",
            config=ClaudeCodeTaskConfig(
                consumer_instructions="Please write a haiku about MongoDB.",
                credentials_json=load_user_creds_from_db(user_id),
                # Optional: skip interactive permission prompts for autonomous flows.
                permission_mode="bypassPermissions",
            ),
        )
    ]

credentials_json is treated as an opaque payload and written verbatim to <workdir>/home/.claude/.credentials.json (mode 0600) before claude launches. Format follows whatever Anthropic's CLI currently expects.

How it works

Each task gets a workdir tempdir (/tmp/optio-claudecode-<uuid>/). The ttyd process is launched with HOME=<workdir>/home, so claude reads all its state — credentials, settings, session history — strictly from the per-task workdir and never touches the host user's real ~/.claude/. Two tasks on the same host can run concurrently without shared-state races.

The agent is given a <workdir>/CLAUDE.md that includes the optio.log coordination protocol — STATUS: / DELIVERABLE: / DONE / ERROR — verbatim from optio_host.agents. The same protocol is used by optio-opencode, so the same consumer_instructions can be swapped between the two packages.

See docs/2026-05-28-optio-claudecode-design.md for the full design.

Conversation mode

With mode="conversation" the task runs claude headlessly (no ttyd, no iframe) over its bidirectional stream-json stdio protocol, and the launching code receives a live Conversation object — send messages, subscribe to events and answers, gate tool permissions, interrupt, close:

config = ClaudeCodeTaskConfig(
    consumer_instructions=None,   # defaults to a plain conversation prompt
    credentials_json=...,
    mode="conversation",
    host_protocol=False,          # no optio.log keyword channel
    permission_mode="acceptEdits",
)
# ... register the task, then:
conv = await optio.launch_and_await_result("example-task", session_id=None)
conv.on_message(lambda text: print("claude:", text))
await conv.send("hello")
await conv.close()

All new config fields default to existing behavior (mode="iframe", host_protocol=True, permission_gate=False), so existing callers run unchanged. See docs/2026-06-10-claudecode-conversation-gate-design.md.

Dashboard conversation UI

With the opt-in conversation_ui=True (conversation mode only) the task additionally starts a per-task listener that streams the raw conversation events (replay + live) through the optio widget proxy and accepts send / interrupt / permission requests, so the session can be monitored and driven from the browser. The matching React chat widget ships in the engine-neutral optio-conversation-ui package; register it in your host app via registerConversationWidget() (one registration serves both claudecode and opencode — each task self-declares its engine via widgetData.protocol). See docs/2026-06-10-claudecode-conversation-ui-design.md.

config = ClaudeCodeTaskConfig(
    consumer_instructions="",     # defaulted conversation prompt
    credentials_json=...,
    mode="conversation",
    conversation_ui=True,
    permission_gate=True,         # approve/deny tool use in the browser
)

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

optio_claudecode-0.3.1.tar.gz (127.7 kB view details)

Uploaded Source

Built Distribution

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

optio_claudecode-0.3.1-py3-none-any.whl (73.4 kB view details)

Uploaded Python 3

File details

Details for the file optio_claudecode-0.3.1.tar.gz.

File metadata

  • Download URL: optio_claudecode-0.3.1.tar.gz
  • Upload date:
  • Size: 127.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for optio_claudecode-0.3.1.tar.gz
Algorithm Hash digest
SHA256 1b476e974c2d206522ea2d4969f273c92fe0c8b7174b2700f9edeba43dac2322
MD5 80a78400ff7137eae587b8998cec2e1b
BLAKE2b-256 1f614f2e26c556a8982370a5dea611be1437692da1f66d5aeea05aca33a0ebc8

See more details on using hashes here.

File details

Details for the file optio_claudecode-0.3.1-py3-none-any.whl.

File metadata

File hashes

Hashes for optio_claudecode-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 b20edd9c279c23112e7d92b7cd2d12e368ac6d2de9a4aef513231f99b539337d
MD5 995aa5f9249931a2aa72c08cac721134
BLAKE2b-256 aff1cffcdf6f380490a134e15cf1d2332ebe0f5e0bfdb1ad67552e64faf608d8

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