pi-rust README

The project's README from github.com/bigfish1913/pi-rust. As one markdown file: README.md.

rpi — a Rust-native coding-agent runtime

crates.io downloads docs.rs license MSRV CI GitHub stars Latest release

rpi is a library-first coding-agent runtime written in Rust, plus a terminal agent built on top of it. Nine composable crates span provider adapters, a durable crash-resumable agent loop, a terminal UI, and a stable plugin ABI — so the same code works as an embedded SDK or as a ready-to-run rpi command.

Website: https://rpi.laofu.online/ · Docs: https://rpi.laofu.online/docs.html

rpi interactive session

Interactive TUI. See docs/guides/user-guide.md for the full command surface.

rpi SDK demo — an agent loop and a real tool round-trip, offline with the faux provider

The agent loop and a real write tool round-trip, recorded with no API key and no network — the same path the tests take. Source of truth is demo/sdk.tape; regenerate with task demo.

Three ways to use it

You want Depend on Start at
A working terminal coding agent nothing cargo install rpi-cli
Your own agent inside your process rpi-agent (+ rpi-ai, rpi-tools) examples/minimal
A tool/provider that extends every session rpi-plugin-sdk examples/plugin-stub

The three share one implementation. Build your tools once, debug them inside an embedded agent, and ship the same code as a cdylib plugin that the global rpi loads. See docs/agent/project-structure.md for the recommended project layout.

Install

Prebuilt binary (no Rust toolchain needed):

curl -fsSL https://raw.githubusercontent.com/bigfish1913/pi-rust/main/scripts/install.sh | sh

Verifies the published SHA-256 checksum and installs to /usr/local/bin or ~/.local/bin. Preview first with --dry-run.

On Windows (x64), run in PowerShell 5.1 or later:

& ([scriptblock]::Create((Invoke-WebRequest -UseBasicParsing https://raw.githubusercontent.com/bigfish1913/pi-rust/main/scripts/install.ps1).Content))

Verifies the published SHA-256 checksum and installs to $env:LOCALAPPDATA\Programs\rpi. Follow the printed instructions to add it to PATH, then run rpi --version. Append -DryRun to preview, or use -Version 0.3.22 and -Dir 'C:\Tools\rpi' to select a version and directory.

From crates.io (requires Rust 1.78+):

cargo install rpi-cli
rpi --version

Package managers:

brew tap bigfish1913/tap && brew install rpi          # macOS (Apple silicon), Linux
scoop bucket add bigfish1913 https://github.com/bigfish1913/scoop-bucket
scoop install rpi                                     # Windows

The Homebrew formula currently supports Apple silicon on macOS. Intel Macs can use the prebuilt installer for releases with an x86_64-apple-darwin asset, or cargo install rpi-cli. A winget manifest is open for review.

From source:

git clone https://github.com/bigfish1913/pi-rust.git
cd pi-rust && cargo run -p minimal   # offline agent, no API key required

Real output of the two offline examples — no credentials, no network, identical bytes every run. Regenerate with task demo-transcript:

$ cargo run -q -p minimal
minimal example: 2 messages after run
  - user
  - assistant
assistant reply: Hello from the faux provider!
AgentEnd observed.

$ cargo run -q -p tools-example
tools example: 4 messages after run
wrote out.txt (28 bytes): "hello from the tools example"
AgentEnd observed; tool ran against OsExecutionEnv.

Quick start

The CLI

export ANTHROPIC_API_KEY=...          # or OPENAI_API_KEY, or ~/.rpi/agent/models.json
rpi                                   # interactive TUI
rpi -p "summarize the README"         # one-shot
rpi --mode json -p "list the crates"  # machine-readable event stream

Sessions persist as JSONL and survive a crash mid-run; rpi resumes from the last committed frame rather than replaying the turn. Custom Anthropic or OpenAI-compatible gateways are declared in ~/.rpi/agent/models.json and selected with --model <provider>/<model>.

The SDK

Build an agent against a deterministic in-process provider — no API key, no network, no flakiness:

use rpi_agent::AgentBuilder;
use rpi_ai::providers::faux::{FauxProvider, FauxScript};
use rpi_ai::Provider;

#[tokio::main]
async fn main() {
    // `FauxProvider::new` already returns an `Arc<Self>`.
    let provider = FauxProvider::new(FauxScript::new().with_text("Hello from the faux provider!"));
    let model = provider.default_model().clone();

    let agent = AgentBuilder::new()
        .model(model)
        .system_prompt("You are a helpful assistant.")
        .stream_fn(make_stream_fn(provider))
        .build()
        .expect("agent builds");

    let mut events = agent.subscribe();
    agent.prompt("hi").await.expect("prompt completes");

    while let Ok(ev) = events.try_recv() {
        let _ = ev; // AgentEvent::{MessageUpdate, ToolEnd, AgentEnd, …}
    }
    println!("{} messages after the run", agent.state().messages.len());
}

make_stream_fn bridges the synchronous StreamFn contract to the async provider — the full version is in examples/minimal/src/main.rs (cargo run -p minimal).

Crates

Nine crates, one version, published together. Dependency direction is one-way and enforced in review:

rpi-telemetry → rpi-ai → rpi-agent → rpi-tools → rpi-harness

Three crates sit outside that chain:

Crate What it is
rpi-telemetry Span/event contracts with a no-op default — instrumentation is opt-in, and pulls in no tracing or OpenTelemetry backend
rpi-ai Provider-agnostic message, streaming and tool-schema types; Anthropic + OpenAI-compatible + faux providers
rpi-agent The agent loop: AgentTool, events, hooks, queues, cancellation
rpi-tools read/write/edit/bash (+ grep, find, ls, powershell) and the ExecutionEnv seam
rpi-harness Session tree, JSONL persistence, compaction, crash recovery, the run loop
rpi-tui Terminal UI primitives: components, layout, editor, transcript rendering
rpi-cli The rpi binary: TUI, one-shot and JSON modes, config, plugin loading
rpi-plugin-sdk The stable #[repr(C)] ABI contract for plugins. No rpi-* deps; only serde_json, behind a default json feature that can be turned off
rpi-extensions Host-side plugin loader and the async-across-ABI tool bridge

Every crate has its own README and docs.rs page. The crates/rpi-* directories and the published crate names use the same rpi- prefix.

Why rpi

Most coding agents are CLIs. rpi is a runtime with a CLI attached, which changes what you can build with it:

How it compares

Structural differences against other terminal coding agents. Facts about other tools are as of 2026-09 and change often — check their documentation; only the rpi column is maintained here.

rpi Claude Code Codex CLI opencode aider
Language Rust TypeScript Rust TypeScript/Go Python
Source available ✅ MIT ❌ ✅ ✅ ✅
Usable as an embedded library ✅ ❌ ❌ ⚠️ ⚠️
First-class plugin ABI ✅ hooks/MCP ❌ plugin API ❌
Headless server + remote client ✅ ⚠️ ✅ ✅ ⚠️
Provider-agnostic gateways ✅ ❌ ❌ ✅ ✅

If you want the most polished single-vendor experience, use the vendor's tool. rpi is for people who want to own the loop.

Performance

Measured on Windows 11 (x86_64), rustc 1.97.1, --release. Both scripts rebuild and re-measure on your own machine.

sh scripts/bench.sh — standalone numbers:

Metric Value
Release binary size 21.8 MiB
rpi --version wall time ~17 ms median
RSS once the agent is ready 12.0 MiB

node scripts/bench-vs-pi.mjs --pi <path-to-pi> — against native Pi on the same machine, both offline, each with a fresh isolated config directory:

Metric rpi (Rust) pi (TypeScript) Difference
--version 17.5 ms 169.5 ms 9.7× faster
Cold start 17.7 ms 189.5 ms 10.7× faster
RSS at ready 12.0 MiB 91.5 MiB 7.6× smaller
Install footprint 21.8 MiB (one binary) ~385 MiB (+ ~91 MiB Node) ~18–22× smaller

Cold start is spawn → the agent answering its first command: process creation plus full initialisation, excluding teardown and any LLM work. rpi's --version (17.5 ms) and cold start (17.7 ms) are effectively equal, so startup is process creation, not initialisation; Pi is dominated by Node boot.

Isolation caveat: rpi reads RPI_CODING_AGENT_DIR / RPI_OFFLINE, native Pi reads PI_CODING_AGENT_DIR / PI_OFFLINE. Set the matching pair for each, or rpi silently loads the machine's global plugins.

Method, raw per-run numbers, and what is not measured (LLM latency, tool-loop throughput, long sessions, TUI frame cost) are in docs/performance/benchmark-vs-pi.md.

Plugins

Plugins are Rust cdylib libraries behind a stable #[repr(C)] ABI. A plugin can register tools, providers, slash commands, event handlers, markdown renderers and discovered resources.

rpi install rpi-todo                    # build from crates.io and install
rpi install my-ext --path ../my-ext     # local, for development
rpi dev                                 # build + watch + live reload

The host loads project .rpi/extensions, then global ~/.rpi/agent/extensions, then any --extensions-dir.

Ready-to-install extensions live in the companion pi-rust/rpi-package repository, with an online catalog.

use rpi_plugin_sdk::{export_plugin, StbStringRef};

export_plugin!(|api| {
    if let Some(declare) = api.declare {
        declare(StbStringRef::from_str(r#"{"priority":60,"platforms":["linux"]}"#));
    }
    // register tools / handlers through `api`
    0
});

Start from examples/plugin-stub — a complete plugin with the full execute→poll→cancel→destroy lifecycle — and read docs/extensions/authoring.md for the safety rules, which are load-bearing rather than stylistic.

Remote mode

rpi --server                        # headless agent over TCP, prints an auth token
rpi --connect host:port --token T   # TUI client with zero local agent resources

The client holds no provider, tools, extensions or session files — all agent work happens on the server, so a thin terminal anywhere can drive a beefy machine. See docs/remote/user-guide.md.

Project status

Current release 0.3.22 (nine crates, published together)
Stability rpi-ai, rpi-agent, rpi-tools, rpi-harness, rpi-plugin-sdk are the intended stable surface
MSRV 1.78
Platforms Linux, macOS, Windows (CI runs the suite on Linux)
Binary release targets Linux (x86_64/aarch64), macOS (Intel/Apple silicon), Windows (x86_64)

rpi is a self-contained Rust coding-agent stack. No Node component is required and none is loaded.

Documentation

Start with the documentation index, grouped by feature.

Start with the documentation index, grouped by feature.

Contributing

Issues and PRs are welcome. Start with CONTRIBUTING.md for the build/test commands and the repository layout, and the roadmap for what is already planned. Security problems should go through SECURITY.md, not a public issue.

The whole test suite runs offline: cargo test --workspace --locked.

Community

Questions, ideas and early builds are welcome in either group:

WeChat group QR code
WeChat — 微信交流群
Telegram group QR code
Telegram — t.me/+7YfN4TZPP7Y0M2Q1

Group invite codes expire — WeChat's rotates every few days. If a QR code stops working, open an issue and it will be refreshed.

License

MIT. See LICENSE and NOTICE.

The rpi-* crates are a Rust-native coding-agent stack.

Star history

Star History Chart

pi-rust (bigfish1913/pi-rust)

Searching Database…

这是干什么的?rpi 是一个以 Rust 原生、库优先的方式构建的编码代理运行时,并在其之上提供了一个终端 CLI(rpi)——同一套代码既可以作为内嵌 SDK 集成到你的应用里,也可以作为一个开箱即用的终端代理,或者作为一个插件来运行。
它是命令行工具,还是可以嵌入到我代码里的库?两者都是——它提供九个可组合的 Rust crate(rpi-ai、rpi-agent、rpi-tools 等)可以直接嵌入,同时还用同一批 crate 构建了一个现成的 rpi 终端 CLI,所以你在本地调试的那套流程,和最终以二进制文件或插件形式交付的完全是同一套。
我怎么把它跑起来?下载适合你操作系统的预构建二进制文件(经过 SHA-256 校验,安装程序支持 --dry-run),或者如果你有 Rust 1.78+,运行 `cargo install rpi-cli`;Apple Silicon Mac 用户也可以用 Homebrew formula。安装完成后,`rpi --version` 可以确认安装成功,运行 `rpi` 则会启动终端界面。
只是想试试的话,需要装 Rust 工具链或者 API 密钥吗?不需要——预构建的二进制文件不需要 Rust 工具链,SDK 示例可以直接跑在一个进程内的确定性 'faux' 提供方上,不需要 API 密钥,也完全不需要联网。要真正使用时,你可以通过 ~/.rpi/agent/models.json 把它指向 Anthropic 或兼容 OpenAI 的网关。
安装上有什么坑需要提前知道?Homebrew formula 目前只在 Apple Silicon Mac 上可用——Intel Mac 用户需要改用预构建的 x86_64-apple-darwin 安装程序,或者用 `cargo install rpi-cli`。另外,rpi 和原生的 Pi 读取的环境变量名不同(RPI_* 对应 PI_*),如果没有设置配套的那一组变量,rpi 可能会静默加载机器上的全局插件。
Windows 的支持和 Linux、macOS 一样稳吗?Windows 是官方支持的发布目标,有预构建的 x86_64 二进制文件和 PowerShell 安装程序,但该项目的 CI 只在 Linux 上运行完整测试套件,所以 Windows 和 macOS 的二进制文件没有同等的自动化测试覆盖。
rpi 的插件系统和常见的插件 API 有什么不同?插件是 Rust cdylib 动态库,背后是一套手写的、带版本号的 #[repr(C)] ABI,并支持版本协商,因此即使编译器版本或 crate 版本不一致,编译好的扩展也能继续正常工作,不会每次发版就坏掉。
rpi 比它所基于的原始 TypeScript Pi 快多少?在同一台机器上测试,rpi 的冷启动大约快 10.7 倍(17.7ms 对 189.5ms),内存占用大约少 7.6 倍(12MiB 对 91.5MiB RSS),安装体积大约小 18-22 倍。
如果代理在任务执行到一半时崩溃了会怎样?会话以 JSONL 格式持久保存,并记录每一帧的进度,所以即使在工具调用中途崩溃,也会从最后一个已提交的帧恢复,不会丢失这一轮对话,也不会重复执行工具。
远程模式是什么?在远程模式下,终端客户端不持有任何提供方、工具、扩展或会话文件——所有代理工作都在服务器上进行,这样一台轻量客户端无论在哪里都能驱动一台更强大的远程机器。
What are similar projects?PiG, qwen-code, gitagent, PI-Desktop, evolver, foreman, Baize, harness-sdk
Size
7.5 MB
Stars
112
Age
2mo
Commits · 90 Days