Skip to main content

OTURN: Orchestrated Task Unified Reactive Nucleus

Project description

OTURN

OTURN = Orchestrated Task Unified Reactive Nucleus.

OTURN is a small async runtime for turn-based agent systems.

What It Provides

  • Reducer-style stream state machine (agent_stream_state.py)
  • Queue-based multi-subscriber pub/sub (subscribe(queue), unsubscribe(queue))
  • Turn runtime with tool execution and approval/choice callbacks
  • LiteLLM streaming adapter with normalized semantic events
  • Session/history persistence via Context + SessionStore

Installation

cd oturn
uv sync
uv pip install -e .

Build:

uv build

Core Types

  • Oturn: high-level agent runtime
  • OTurnNucleus: generic reducer nucleus for non-LLM state machines
  • Transition: reducer output (state, events, terminal)
  • Context: conversation history + persistence wrapper
  • BaseTool: tool protocol/base class

Oturn Event Stream

Published events include:

  • assistant_delta
  • assistant_reasoning_delta
  • assistant_final
  • tool_call_delta
  • tool_call
  • tool_output
  • tool_exit
  • approval_request
  • choice_request
  • message_sent
  • run_aborted
  • error
  • debug_latency / tool_call_debug (when debug flags are enabled)

Minimal Oturn Example

import asyncio
from pathlib import Path

from oturn import (
    Oturn,
    OturnConfig,
    OturnProviderConfig,
    OturnModelConfig,
    OturnAgentConfig,
    Context,
    WeatherTool,
)


async def main() -> None:
    cfg = OturnConfig(
        model="<provider/model>",
        provider=OturnProviderConfig(api_key="<API_KEY>"),
        model_config=OturnModelConfig(max_output_tokens=4096, temperature=0.7),
        agent_config=OturnAgentConfig(max_steps=50, user_name="User"),
    )

    agent = Oturn(work_dir=Path.cwd(), config=cfg, tools=[WeatherTool])
    ctx = Context(Path.cwd() / ".oturn" / "sessions" / "demo.md", work_dir=Path.cwd())

    q: asyncio.Queue[dict] = asyncio.Queue()
    agent.subscribe(q)

    agent.enqueue_user_input_nowait("What's the weather in Tokyo?")
    task = asyncio.create_task(agent.run_queues(ctx))

    try:
        while True:
            ev = await q.get()
            print(ev)
    finally:
        task.cancel()


asyncio.run(main())

Tool Injection Model

OTURN uses explicit runtime tool injection. Pass tool classes when constructing Oturn:

agent = Oturn(work_dir=work_dir, config=cfg, tools=[WeatherTool])

Example tools in oturn.tools.examples:

  • WeatherTool (get_weather)
  • HostConfigTool (get_host_config)

Usage and Tool-Call Delta Accessors

Usage data is available via context accessors.

  • get_last_usage(ctx) -> dict | None
  • get_last_total_tokens(ctx) -> int | None
  • get_tool_call_deltas() -> list[tool_call_delta]
  • get_tool_call_delta(delta_id) -> tool_call_delta | None

Session/History

  • Session persistence is handled by Context + SessionStore.
  • Records are stored as markdown event/message documents (Chron-based serialization via chronml).
  • Default metadata root name is .oturn (DEFAULT_META_DIRNAME).
  • Session files are created under a date-partitioned global directory:
    • ~/.oturn/global_sessions/YYYYMMDD/<session_id>.md
  • When work_dir is available, SessionStore also creates a local session link:
    • <work_dir>/.oturn/sessions/<session_id>.md -> global session file
  • Persistence is incremental:
    • append_message(...) appends a single serialized record
    • append_compact(...) appends compaction markers the same way
  • Context.restore() loads existing session markdown into in-memory history.
  • Configurable knobs:
    • meta_dirname: rename .oturn namespace for local/global paths
    • global_sessions_root: override ~/.<meta_dirname>/global_sessions
  • You can also import/export session markdown via:
    • Context.export_md_as_config(...)
    • Context.import_md_as_config(...)

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

oturn-0.1.8.tar.gz (31.4 kB view details)

Uploaded Source

Built Distribution

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

oturn-0.1.8-py3-none-any.whl (38.3 kB view details)

Uploaded Python 3

File details

Details for the file oturn-0.1.8.tar.gz.

File metadata

  • Download URL: oturn-0.1.8.tar.gz
  • Upload date:
  • Size: 31.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for oturn-0.1.8.tar.gz
Algorithm Hash digest
SHA256 07cd53c9aa8956b6e7e2b91a0b1d8706e9bdd54fac8a8ee0a2091963d0676537
MD5 903731fc7885949522e51f17f637d1bd
BLAKE2b-256 1c2765a18da44ff3873fb57ed56e28e6506563d6d7d69daa5de9ce8055383eb2

See more details on using hashes here.

Provenance

The following attestation bundles were made for oturn-0.1.8.tar.gz:

Publisher: publish-oturn.yml on draplater/nimbie

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file oturn-0.1.8-py3-none-any.whl.

File metadata

  • Download URL: oturn-0.1.8-py3-none-any.whl
  • Upload date:
  • Size: 38.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for oturn-0.1.8-py3-none-any.whl
Algorithm Hash digest
SHA256 142d8c4fa15db157f55946ead171978378e9a9989cabb3b0d79b3b020d1d7dd0
MD5 5ab1f24e3448a08d6712b5ec1e3a8a13
BLAKE2b-256 f549bfa52a07bda5642e7b4d9ab3ddd559ad1f62bb9351497ea85cb69a838fdb

See more details on using hashes here.

Provenance

The following attestation bundles were made for oturn-0.1.8-py3-none-any.whl:

Publisher: publish-oturn.yml on draplater/nimbie

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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