rpi — Rust-native coding-agent runtime
rpi is a Rust-native, library-first coding-agent runtime and terminal CLI.
It provides composable LLM agents with providers, tools, sessions, and plugins —
usable both as embedded SDK crates and as a ready-to-run terminal agent.
Website: https://rpi.laofu.online/
Naming. Published crates use the
rpi-prefix. On-disk directories remaincrates/pi-*for history;package.namein eachCargo.tomlisrpi-*.
Crates
| Crate (crates.io) | On-disk dir | Description |
|---|---|---|
rpi-telemetry |
pi-telemetry/ |
Telemetry span/event contracts (noop default). |
rpi-ai |
pi-ai/ |
Unified multi-provider LLM types + streaming (Anthropic, OpenAI-compatible, faux). |
rpi-agent |
pi-agent/ |
Agent runtime + loop, AgentTool trait, events, hooks, queues. |
rpi-tools |
pi-tools/ |
Coding tools (read/write/edit/bash) + ExecutionEnv. |
rpi-harness |
pi-harness/ |
AgentHarness: session tree, JSONL persistence, compaction, run loop. |
rpi-cli |
pi-cli/ |
Terminal coding-agent CLI (rpi binary). |
rpi-plugin-sdk |
rpi-plugin-sdk/ |
Stable C ABI for Rust-native plugins and extension discovery. |
rpi-extensions |
rpi-extensions/ |
Dynamic plugin loader and AgentTool adapter. |
rpi-tui |
pi-tui/ |
Terminal UI primitives used by the interactive CLI. |
Dependency direction: rpi-telemetry → rpi-ai → rpi-agent → rpi-tools → rpi-harness → rpi-cli.
Registry links
| Package | crates.io | docs.rs |
|---|---|---|
rpi-cli |
crates.io | docs.rs |
rpi-agent |
crates.io | docs.rs |
rpi-plugin-sdk |
crates.io | docs.rs |
rpi-extensions |
crates.io | docs.rs |
Extension package repository
Ready-to-install Rust-native extensions are maintained in the companion
pi-rust/rpi-package repository.
Browse its packages/
directory or the online package catalog.
Quick start — build an agent
use ;
use ;
let provider = new;
let model = provider.default_model.clone;
let agent = new
.model
.system_prompt
.tools
.stream_fn
.build
.unwrap;
let mut events = agent.subscribe;
spawn;
agent.prompt.await.unwrap;
See docs/architecture.md for the full design and docs/agent-project.md for the recommended project structure when you build your own agent.
Plugins
Plugins are Rust cdylib libraries loaded through the stable ABI exposed by
rpi-plugin-sdk. The repository includes a complete echo tool example:
The plugin depends on rpi-plugin-sdk only; the host-side loader lives in
rpi-extensions. See examples/plugin-stub and the
rpi-plugin-sdk API docs for the ABI
contract.
Install from crates.io
The command resolves and builds the crate with Cargo in release mode, then
copies its .dll, .so, or .dylib into ~/.rpi/agent/extensions.
For local development, use rpi install my-extension --path ../my-rpi-extension --force.
Develop with watch mode
From a Rust extension crate ([lib] crate-type contains "cdylib"):
The command detects the Cargo package, performs an initial build, stages a
versioned library under .rpi/extensions/.dev, and watches the crate sources.
Successful source changes trigger a rebuild and live reload.
For a workspace containing multiple extensions, select one explicitly:
See docs/extension-authoring.md for complete
Rust extension templates, safety rules, testing, and release checklists.
Features
- Providers: Anthropic Messages and OpenAI-compatible Chat Completions,
plus a faux provider for tests. Third-party endpoints are configured through
~/.rpi/agent/models.json; Anthropic endpoint overrides also supportANTHROPIC_BASE_URL/ANTHROPIC_AUTH_TOKEN. - Auth (in priority order):
--api-key→~/.rpi/auth.json(set viarpi auth login) →~/.rpi/agent/models.jsonapiKey→ provider environment variables (OPENAI_API_KEY,ANTHROPIC_AUTH_TOKEN,ANTHROPIC_API_KEY). - Tools: the CLI defaults to Pi's
read,write,edit, andbashtools. The former rpi-onlygrep,find,ls,docs, andpowershellimplementations remain library code but are not loaded by default. - Extensions: Rust
cdylibplugins can be installed withrpi installand are discovered from project.rpi/extensions, legacy.pi/extensions, global~/.rpi/agent/extensions, and--extensions-dir. - Project resources: rpi-owned skills, prompts, system instructions, and
extensions use
.rpi/first; the original Pi.pi/layout remains a compatibility fallback. When both contain the same skill or prompt name,.rpi/wins. - Sessions: JSONL v4 durable backend + in-memory ephemeral; compaction + a split-turn two-LLM-call invariant.
- Remote mode:
rpi --serverruns the agent headless over TCP, andrpi --connect <host:port> [--token <t>]attaches a zero-local-resource TUI client (token auth; the token may also come fromRPI_SERVER_TOKEN). Seedocs/remote-mode.md.
Configuration
rpi persists credentials under ~/.rpi/ (override the dir with the
RPI_CODING_AGENT_DIR env var):
~/.rpi/
└── agent/
├── auth.json # set with `rpi auth login` (0o600 on Unix)
└── models.json # optional: custom providers/models
models.json is a hand-edited file for custom Anthropic or OpenAI-compatible gateways:
{
"providers": {
"gateway": {
"api": "anthropic-messages",
"baseUrl": "https://gateway.example.com",
"apiKey": "sk-gateway-secret",
"authHeader": true,
"headers": { "x-portkey-key": "…" },
"models": [
{ "id": "custom-claude", "name": "Custom Claude" }
]
}
}
}
Then rpi --model gateway/custom-claude -p "hi" routes to the gateway.
For an OpenAI-compatible endpoint, set "api": "openai-completions".
See docs/m6-cli-open-questions.md §4–5 for the full auth precedence and default-selection rule.
Star history
License
MIT. See LICENSE.
This is a Rust port of earendil-works/pi
(© Mario Zechner, MIT). The rpi-* crates are a Rust-native reimplementation of
the original MIT-licensed TypeScript SDK.