Bundle-first AI agents in Rust.
Build agents, package them as portable bundles, and run them through one runtime.
Like this project? Star us on GitHub
Status: Odyssey is under active development and should still be treated as pre-production software.
Odyssey is an open-source, bundle-first agent runtime written in Rust on top of AutoAgents. It lets you define an agent once, package it as a portable bundle, and run it through the same runtime contract across local CLI workflows, the TUI, HTTP server deployments, and embedded Rust applications.
Odyssey supports two practical authoring paths today:
- Prompt agents for fast local scaffolding and straightforward bundle workflows
- Rust-authored custom agents compiled to WASM components and hosted by the Odyssey runtime
For custom agents, Odyssey runs your Rust agent logic as a Wasmtime-hosted WebAssembly component while keeping model credentials, tool execution, approvals, session state, and sandbox policy on the host side. The WASM module owns behavior; Odyssey owns privileged effects.
- Portable bundles: ship the agent spec, skills, resources, README, and runtime policy as one artifact.
- Custom Rust WASM agents: build agent logic with
odyssey-rs-agent-sdkand run it through the same runtime as built-in execution paths. - Runtime-owned security boundary: model access, tool brokering, approvals, and sandbox policy stay outside the agent component.
- One engine, many surfaces: CLI, TUI, HTTP, and embedded Rust all sit on top of the same runtime primitives.
- Operational workflows included: local install, inspect, export/import, and hub push/pull are built in.
- Prompt bundles with ReAct execution
- Rust-authored
kind: wasmagents hosted through Wasmtime - Stable Rust WASM agent SDK via
odyssey-rs-agent-sdk - Automatic
cargo component buildintegration during bundle builds for local WASM agents - Built-in tools:
Read,Write,Edit,LS,Glob,Grep,Bash, andSkill - Bundle manifests, validation, install, inspect, export, import, publish, and pull
- Session persistence, approvals, model resolution, and event streaming
- CLI, HTTP server, and Ratatui-based TUI
- Embeddable runtime via
odyssey-rs-runtime::OdysseyRuntime
| Surface | Purpose |
|---|---|
odyssey-rs run |
Run one prompt against a bundle |
odyssey-rs tui |
Local operator workflow with approvals, sessions, and bundle switching |
odyssey-rs serve |
Shared runtime over HTTP |
OdysseyRuntime |
Embed Odyssey directly into a Rust application |
Bootstrap install:
curl -fsSL https://raw.githubusercontent.com/liquidos-ai/odyssey/main/install.sh | bashCargo install:
cargo install odyssey-rsFrom a source checkout, use:
cargo run -p odyssey-rs --odyssey-rs init ./hello-worldinit currently creates a prompt-based starter bundle so you can get to a runnable project
immediately. It scaffolds:
odyssey.bundle.yamlagents/<bundle-id>/agent.yamlREADME.mdskills/resources/
odyssey-rs build ./hello-worldBuild to a custom output directory instead:
odyssey-rs build ./hello-world --output ./distexport OPENAI_API_KEY="your-key"
odyssey-rs run hello-world@latest --prompt "What can you do?"odyssey-rs inspect hello-world@latest
odyssey-rs bundlesexport OPENAI_API_KEY="your-key"
odyssey-rs tui --bundle hello-world@latestodyssey-rs serve --bind 127.0.0.1:8472Target that runtime remotely:
odyssey-rs --remote http://127.0.0.1:8472 bundles
odyssey-rs --remote http://127.0.0.1:8472 inspect hello-world@latest
odyssey-rs --remote http://127.0.0.1:8472 run hello-world@latest --prompt "Summarize this bundle"
odyssey-rs --remote http://127.0.0.1:8472 sessionsOdyssey already supports custom Rust-authored agents compiled as WebAssembly components.
The current model is:
- your agent logic is compiled into
module.wasm - Odyssey instantiates that component in Wasmtime
- Odyssey provides host bindings for LLM calls, tool calls, and emitted events
- Odyssey still owns credentials, tool execution, session state, approvals, and sandbox policy
That gives you a portable custom-agent artifact without handing the component direct access to host credentials or direct host tool handles.
bundles/hello-world: minimal prompt bundlebundles/odyssey-agent: Rust-authored WASM workspace assistantbundles/code-act: Rust-authored WASM CodeAct example
Typical WASM bundle layout:
<project>/
odyssey.bundle.yaml
README.md
agents/
<agent-id>/
agent.yaml
Cargo.toml
src/
lib.rs
module.wasm
skills/
resources/
use autoagents_derive::{AgentHooks, agent};
#[agent(
name = "my-agent",
description = "Custom Odyssey agent",
tools = [],
)]
#[derive(Default, Clone, AgentHooks)]
pub struct MyAgent;
fn app() -> odyssey_rs_agent_sdk::OdysseyAgentApp<MyAgent, odyssey_rs_agent_sdk::ReactExecutor> {
odyssey_rs_agent_sdk::OdysseyAgentApp::react(MyAgent::default())
.memory_window(20)
.max_turns(12)
}
odyssey_rs_agent_sdk::export_odyssey_agent!("my-agent", app());If you need agent-specific Rust tools, add them in the WASM crate with .tool(...). Built-in
Odyssey tools declared in agent.yaml are injected automatically by the host runtime.
odyssey.bundle.yaml:
apiVersion: odyssey.ai/bundle.v1
kind: AgentBundle
metadata:
name: my-agent
version: 0.1.0
spec:
abiVersion: v3
agents:
- id: my-agent
spec: agents/my-agent/agent.yaml
module: agents/my-agent/module.wasm
default: trueagents/my-agent/agent.yaml:
apiVersion: odyssey.ai/v1
kind: Agent
metadata:
name: my-agent
version: 0.1.0
spec:
kind: wasm
abiVersion: v3
program:
runner_class: wasm-component
entrypoint: agents/my-agent/module.wasm
execution:
executor: react/v1
memory: session-window/v1Install the component tool:
cargo install cargo-componentThen build the bundle normally:
odyssey-rs build ./bundles/odyssey-agentFor local WASM agents, Odyssey detects Cargo.toml next to the agent spec, invokes
cargo component build --release, stages the produced .wasm artifact into the declared
program.entrypoint, validates that the entrypoint is a real WebAssembly component, and then
packages the bundle.
That means a normal bundle build is also the developer loop for Rust-authored custom agents.
Odyssey treats the runtime as the trusted boundary, not the agent component.
- model provider construction and credentials
- host tool execution
- approval gating
- session persistence
- sandbox preparation and policy enforcement
- CLI/TUI/HTTP event streaming
- prompts and behavior
- executor loop decisions inside prompt or WASM agent logic
- optional custom Rust tools compiled into the WASM component
| Mode | Behavior |
|---|---|
read_only |
Confined runtime with read-only app workspace and explicit writable runtime state |
workspace_write |
Confined runtime with writable workspace/state areas |
danger_full_access |
Host execution without confined sandbox restrictions |
Important notes:
- Confined
read_onlyandworkspace_writeexecution is currently Linux-only and usesbubblewrap. - On macOS and Windows, use
--dangerous-sandbox-modefor local development or run Odyssey inside a Linux container if you need confined execution. - Tool permissions are controlled through
tools.require,tools.allow,tools.ask, andtools.deny. - Filesystem and process policy are controlled through manifest sandbox settings such as
mounts.read,mounts.write,filesystem.exec,system_tools_mode, andsystem_tools. sandbox.envis an allowlist-style passthrough for sandboxed commands, not a general process environment dump.
For the full policy reference, see:
Build and install locally:
odyssey-rs build ./bundles/hello-worldExport a portable archive:
odyssey-rs export local/hello-world@0.1.0 --output ./distImport a portable archive:
odyssey-rs import ./dist/hello-world-0.1.0.odysseyPush and pull through a hub are also supported:
odyssey-rs push ./bundles/odyssey-agent --to acme/odyssey-agent@0.1.0
odyssey-rs pull acme/odyssey-agent@0.1.0odyssey-rs initscaffolds a prompt agent today, not a WASM starter crate.- Restricted sandboxes are Linux-only in the current release.
- Rust is the supported path for custom WASM agent authoring today.
- One selected agent is executed per run, even though a bundle may package many agents.
- WASM execution is runtime-owned and in-process; hardening around stronger execution limits and cancellation is still evolving.
crates/odyssey-rs: CLI entrypoint and facade crate, includingrun,serve, andtuicrates/odyssey-rs-agent-sdk: stable Rust SDK for Odyssey WASM agentscrates/odyssey-rs-agent-abi: WIT and ABI types for Odyssey agent host bindingscrates/odyssey-rs-manifest: bundle manifest and agent spec parsing/validationcrates/odyssey-rs-bundle: build, install, inspect, export, import, publish, and pullcrates/odyssey-rs-runtime: sessions, execution, prompt assembly, WASM hosting, tools, and sandbox integrationcrates/odyssey-rs-tools: built-in tools and adaptorscrates/odyssey-rs-sandbox: sandbox runtime and providerscrates/odyssey-rs-server: Axum-based HTTP APIcrates/odyssey-rs-tui: Ratatui-based terminal UI used byodyssey-rs tuibundles/hello-world: minimal prompt bundlebundles/odyssey-agent: WASM workspace assistant examplebundles/code-act: WASM CodeAct exampleexamples/hello-world: Rust embedding example
- Rust toolchain
cargo-componentif you are building Rust-authored WASM agentsrgtokeicargo-tarpaulinif you want local coverage reports- Docker Desktop or another recent Docker engine if you need Linux sandbox workflows on macOS
bubblewrap(bwrap) on Linux for restricted local sandbox execution
Format:
cargo fmt --allClippy:
cargo clippy --workspace --all-targets -- -D warningsWorkspace tests:
cargo test --all-featuresCoverage:
cargo tarpaulin --engine llvm --skip-clean --workspace --all-features --timeout 120 --out HtmlExample WASM component build:
cargo component build \
--manifest-path bundles/odyssey-agent/agents/odyssey-agent/Cargo.toml \
--releaseContributions are welcome. See CONTRIBUTING.md for development workflow, quality expectations, and pull request guidance.
- GitHub Issues: bug reports and feature requests
- Discussions: community Q&A and design discussion
- Discord: discord.gg/zfAF9MkEtK
Odyssey is licensed under Apache 2.0. See APACHE_LICENSE.
