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 runtimeOTurnNucleus: generic reducer nucleus for non-LLM state machinesTransition: reducer output (state,events,terminal)Context: conversation history + persistence wrapperBaseTool: tool protocol/base class
Oturn Event Stream
Published events include:
assistant_deltaassistant_reasoning_deltaassistant_finaltool_call_deltatool_calltool_outputtool_exitapproval_requestchoice_requestmessage_sentrun_abortederrordebug_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 | Noneget_last_total_tokens(ctx) -> int | Noneget_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_diris available,SessionStorealso creates a local session link:<work_dir>/.oturn/sessions/<session_id>.md-> global session file
- Persistence is incremental:
append_message(...)appends a single serialized recordappend_compact(...)appends compaction markers the same way
Context.restore()loads existing session markdown into in-memory history.- Configurable knobs:
meta_dirname: rename.oturnnamespace for local/global pathsglobal_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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file oturn-0.1.6.tar.gz.
File metadata
- Download URL: oturn-0.1.6.tar.gz
- Upload date:
- Size: 31.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25d961147fed5678b9b448bdb6089ba699215d9c7a242e29fde18409844e1e36
|
|
| MD5 |
7006425e2f731abbd53c3be3ca1e2d6c
|
|
| BLAKE2b-256 |
078219a2cc3a7455b02a00ad4dabd62c3719681dd31e53c8cdb6d8d1c6d7233c
|
File details
Details for the file oturn-0.1.6-py3-none-any.whl.
File metadata
- Download URL: oturn-0.1.6-py3-none-any.whl
- Upload date:
- Size: 38.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
140cfad2edb3dd5938cf858942a7f8a74a564ca51c52d91b8e9626e88a5564e7
|
|
| MD5 |
43fa208ffb3a2d0f076ca847f9633d0d
|
|
| BLAKE2b-256 |
c381dfe47f20f22a72bc58337ad1e5ac90bf33ede4a4e1f16019f9b5257f1313
|