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.2.tar.gz (30.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.2-py3-none-any.whl (37.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: oturn-0.1.2.tar.gz
  • Upload date:
  • Size: 30.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for oturn-0.1.2.tar.gz
Algorithm Hash digest
SHA256 f1f4101c6f7968f3b8403defede431b6fddff431798eaa2bc44e3f860a9fc704
MD5 94509424ffbe994b16e746074b4c0d43
BLAKE2b-256 a58e9a03d1228b7b61b543fd9356c3ec93abde45252b20b448662edb446c22e5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: oturn-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 37.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for oturn-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 b4afe4cc11a7abcbc9c9cc00c3dbc5b9f4cf1e0a229362264e92eac1ee18277f
MD5 e4da1ffe0559f41a7a5f8b8cdb19e8fc
BLAKE2b-256 10c25e7cce193d22b5b228062d17ade5be10328ff5fd9811deabab27286df48a

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