by bigfish1913
Rust-native, library-first coding-agent runtime and terminal CLI inspired by Pi, with composable LLM providers, tools, sessions, and plugin ABI
# Add to your Claude Code skills
git clone https://github.com/bigfish1913/pi-rustLast scanned: 10/26/2026
{
"issues": [
{
"file": "README.md",
"line": 52,
"type": "remote-install",
"message": "Install command (remote install script piped to a shell — review the source before running): \"curl -fsSL https://raw.githubusercontent.com/bigfish1913/pi-rust/main/scripts/in\"",
"severity": "low"
}
],
"status": "PASSED",
"scannedAt": "2026-10-26T09:44:56.563Z",
"npmAuditRan": true,
"pipAuditRan": true,
"promptInjectionRan": true
}See how pi-rust compares with popular alternatives.
pi-rust is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by bigfish1913. Rust-native, library-first coding-agent runtime and terminal CLI inspired by Pi, with composable LLM providers, tools, sessions, and plugin ABI. It has 153 GitHub stars.
Yes. pi-rust passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/bigfish1913/pi-rust" and add it to your Claude Code skills directory (see the Installation section above).
pi-rust is primarily written in Rust. It is open-source under bigfish1913 on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh pi-rust against similar tools.
No comments yet. Be the first to share your thoughts!
30 days in the Featured rail · terms & refunds
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
Automated security scan — not a certification.
rpi is a library-first coding-agent runtime written in Rust, plus a terminal
agent built on top of it. Ten composable crates span provider adapters, a
durable crash-resumable agent loop, a reusable runtime, 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.
rpi began as a Rust reimplementation of the Pi TypeScript SDK by Mario Zechner. It now includes its own Rust-native plugin ABI and execution infrastructure. See Acknowledgements and NOTICE for upstream attribution.
Website: https://rpi.bigfisharc.cn/ · Docs: https://rpi.bigfisharc.cn/docs.html

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

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.
| 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.
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.
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>.
--timeout 600 limits a whole LLM request, including its streamed response.
--stream-idle-timeout 300 independently limits silence between response body
bytes after the response starts. Every non-empty chunk resets the idle timer,
including SSE keepalives and partial frames. A stalled stream produces a
retryable error; the configured retry policy controls whether it is retried.
Healthy streams may run longer than the idle timeout, up to the total deadline.
Use --stream-idle-timeout 0 to disable the idle timer. You can also set
"streamIdleTimeout": 300 (seconds) in ~/.rpi/agent/settings.json; the CLI flag
takes precedence. httpIdleTimeout only expires unused pooled connections and
does not control an active response.
For providers with "api": "openai-completions", put compatibility flags in
each model's compat object in ~/.rpi/agent/models.json, for example:
"compat": {
"thinkingFormat": "deepseek",
"requiresReasoningContent": true
}
requiresReasoningContent replays assistant thinking in reasoning_content,
including an empty string for assistant messages without thinking. The pi name
requiresReasoningContentOnAssistantMessages is accepted as an alias; if both
are present, the rpi spelling wins and conflicting values produce a warning.
thinkingFormat supports "openai" (the default request
shape) and "deepseek" (also sends thinking: { "type": "enabled" | "disabled" }
for reasoning-capable models). supportsReasoningEffort: false suppresses
reasoning_effort if the gateway does not accept it. requiresThinkingAsText
instead places thinking in ordinary text content. Unknown compat fields and
invalid values produce warnings naming the provider and model; invalid compat
objects are ignored. Other pi thinking formats are not currently supported.
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).
Ten workspace crates, one shared version. Dependency direction is one-way and enforced in review:
rpi-telemetry → rpi-ai → rpi-agent → rpi-tools → rpi-harness
↘ rpi-runtime
Five crates sit outside that chain:
rpi-tui depends on no other rpi-* crate.rpi-runtime depends on rpi-ai and provides embeddable model catalogs,
credential resolution and execution bindings. See the
runtime guide.rpi-plugin-sdk is a leaf too (it has no rpi-* deps), but it is not only
the host's plugin contract: rpi-tools also reads its env-var names, so the
host and its plugins cannot disagree about the strings they exchange across
the ABI. That edge is names-only — nothing is linked or called.rpi-extensions is rpi-plugin-sdk plus rpi-ai/rpi-agent, since it hosts
plugins that run tools.rpi-cli depends on all ten of the others, which is how the rpi binary
gets the TUI, the harness and the plugin loader at once.| 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 + |