瑟曦
用于构建编码代理的完整Rust SDK。
Cersei为您提供了生产编码代理的每个构建块——工具执行、LLM流、子代理编排、持久内存、技能、MCP集成——作为可组合库函数。构建一个克劳德代码替代品,在你的应用程序中嵌入一个代理,或者创建一些全新的东西。
use cersei::prelude::*;
#[tokio::main]
async fn main() -> anyhow::Result {
let output = Agent::builder()
.provider(Anthropic::from_env()?)
.tools(cersei::tools::coding())
.permission_policy(AllowAll)
.run_with("Fix the failing tests in src/")
.await?;
println!("{}", output.text());
Ok(())
}______________________________________________________________________
为什么选择瑟曦
| 克劳德代码 | OpenCode | Cersei SDK | 抽象CLI | |
|---|---|---|---|---|
| 外形尺寸 | CLI应用程序 | CLI应用 | 图书馆 | CLI应用程序 |
| 可嵌入 | 否 | 否 | 是 | 否(使用SDK) |
| 提供者 | 仅限人类 | 多提供者 | 多供应商 | 多供应商 |
| 语言 | TypeScript | TypeScript | 锈 | 锈 |
| 自定义工具 | 插件 | 插件 | impl Tool / #[derive(Tool)] | 通过SDK |
| 启动 | ~269ms | ~300ms | 不适用(库) | 约34毫秒 |
| 二进制/RSS | 174MB/330MB | -- | N/A | 5.8毫巴/4.9毫巴 |
| 内存 | 基于文件 | SQLite | 文件+图形 | 文件+图形 |
| 技能 | .claude/commands/ | .claude/skills/ | 两种格式 | 两种格式 |
Cersei基于Claude Code(逆向工程Rust端口)的架构构建,旨在让任何人都可以构建一个完整的、可直接替换的Claude Code、OpenCode或任何编码代理——作为库调用。
______________________________________________________________________
摘要——CLI
摘要 是基于Cersei构建的完整CLI编码代理。一个二进制文件,零运行时依赖关系,默认情况下使用图形内存。
# Install
cargo install --path crates/abstract-cli
# Use
abstract # Interactive REPL
abstract "fix the failing tests" # Single-shot
abstract --resume # Resume last session
abstract --model opus --max # Opus with max thinking
abstract --no-permissions --json # CI mode with NDJSON output抽象代码与克劳德代码
所有号码来自 run_tool_bench.sh --full.
| 度量 | 摘要 | 克劳德代码 | 获胜者 |
|---|---|---|---|
| 启动(温) | 32毫秒 | 266毫秒 | 摘要(8.2x) |
| 二进制大小 | 6.0 MB | 174 MB | 摘要(29x) |
| 内存(RSS) | 4.9毫巴 | 333 MB | 摘要(68x) |
| 工具调度 | 0.02至17毫秒 | 5-265毫秒+ | 摘要 |
| 记忆回忆 | 98us (图表) | 7545ms(LLM) | 摘要(77000x) |
| 内存写入 | 30us (图表) | 20687ms(代理) | 摘要(689000x) |
| MEMORY.md加载 | 9.6us | 17.1ms | 摘要(1781x) |
| 顺序吞吐量 | 906ms/请求 | 12079ms/请求 | 摘要(13.3x) |
| 系统提示令牌 | ~2,200 | ~8000+ | 摘要(减少3.6倍) |
| LLM呼吁召回 | 不需要 | 必填(十四行诗) | 摘要 |
Claude Code的记忆回忆每次都会调用Sonnet,根据相关性(测量7.5秒)对前5个文件进行排名。 Abstract的图在98微秒内完成索引查找——同样的功能,无需LLM调用,无需API成本。
完整基准: crates/abstract-cli/benchmarks/REPORT.md
特性
- 34个内置工具(文件、shell、web、规划、编排、调度)
- 多提供商:Anthropic+OpenAI(+Ollama、Azure、vLLM)
- 默认情况下,图形内存(Grafeo)处于打开状态
- 汽车紧凑型、汽车梦想、努力水平(低/中/高/最大)
- MCP服务器支持
- 会话持久性(兼容Claude Code的JSONL)
- 具有会话缓存的交互式权限
- 12个斜线命令(
/help,/commit,/review,/memory,/model,/diff等等) - 带有语法高亮显示的流式markdown渲染
- TOML配置:
~/.abstract/config.toml+.abstract/config.toml - 管道的JSON输出模式(
--json)
______________________________________________________________________
安装
[dependencies]
cersei = { git = "https://github.com/pacifio/cersei" }
tokio = { version = "1", features = ["full"] }
anyhow = "1"对于图形备份内存(可选):
cersei-memory = { git = "https://github.com/pacifio/cersei", features = ["graph"] }______________________________________________________________________
建筑
cersei Facade crate — use cersei::prelude::*;
cersei-types Provider-agnostic messages, errors, stream events
cersei-provider Provider trait + Anthropic/OpenAI implementations
cersei-tools 30+ tools, permissions, bash classifier, skills, git utils
cersei-tools-derive #[derive(Tool)] proc macro
cersei-agent Agent builder, agentic loop, compact, coordinator, effort
cersei-memory Memory trait, memdir, CLAUDE.md, sessions, Grafeo graph
cersei-hooks Hook/middleware system
cersei-mcp MCP client (JSON-RPC 2.0, stdio transport)
abstract-cli CLI coding agent ("abstract") — REPL, commands, config, permissions______________________________________________________________________
核心概念
提供者
任何LLM后端。内置:Anthropic(使用OAuth)、OpenAI(与Ollama、Azure、vLLM兼容)。
Agent::builder().provider(Anthropic::from_env()?) // Anthropic API key
Agent::builder().provider(OpenAi::builder()
.base_url("http://localhost:11434/v1") // Ollama
.model("llama3.1:70b").api_key("ollama").build()?)
Agent::builder().provider(MyCustomProvider) // impl Provider工具(30+)
编码代理所需的每个工具,按组组织:
cersei::tools::all() // 30+ tools
cersei::tools::coding() // filesystem + shell + web
cersei::tools::filesystem() // Read, Write, Edit, Glob, Grep, NotebookEdit
cersei::tools::shell() // Bash, PowerShell
cersei::tools::web() // WebFetch, WebSearch
cersei::tools::planning() // EnterPlanMode, ExitPlanMode, TodoWrite
cersei::tools::scheduling() // CronCreate/List/Delete, Sleep, RemoteTrigger
cersei::tools::orchestration() // SendMessage, Tasks (6 tools), Worktree10行自定义工具:
#[derive(Tool)]
#[tool(name = "search", description = "Search docs", permission = "read_only")]
struct SearchTool;
#[async_trait]
impl ToolExecute for SearchTool {
type Input = SearchInput; // derives Deserialize + JsonSchema
async fn run(&self, input: SearchInput, ctx: &ToolContext) -> ToolResult {
ToolResult::success(format!("Found: {}", input.query))
}
}子代理编排
生成并行工作者,协调任务,在代理之间传递消息:
// AgentTool — model spawns sub-agents autonomously
Agent::builder()
.tool(AgentTool::new(|| Box::new(Anthropic::from_env()?), cersei::tools::coding()))
// Coordinator mode — orchestrate parallel workers
Agent::builder()
.tools(cersei::tools::all()) // includes Agent, Tasks, SendMessage
// Workers get filtered tools (no Agent — prevents recursion)
// Task system
// TaskCreate → TaskUpdate → TaskGet → TaskList → TaskStop → TaskOutput内存(三层)
use cersei::memory::manager::MemoryManager;
let mm = MemoryManager::new(project_root)
.with_graph(Path::new("./memory.grafeo"))?; // optional graph layer
// Tier 1: Flat files (~/.claude/projects//memory/)
let metas = mm.scan(); // scan .md files with frontmatter
let content = mm.build_context(); // build system prompt injection
// Tier 2: CLAUDE.md hierarchy (managed > user > project > local)
// Automatically merged into build_context()
// Tier 3: Graph memory (Grafeo, optional)
let id = mm.store_memory("User prefers Rust", MemoryType::User, 0.9)?;
mm.tag_memory(&id, "preferences");
let results = mm.recall("Rust", 5); // graph query with fallback to text match
// Session persistence (JSONL, append-only, tombstone soft-delete)
mm.write_user_message("session-1", Message::user("Hello"))?;
let messages = mm.load_session_messages("session-1")?;技能(克劳德代码+兼容OpenCode)
// Auto-discovers skills from:
// .claude/commands/*.md (Claude Code format)
// .claude/skills/*/SKILL.md (OpenCode format)
// ~/.claude/commands/*.md (user-level)
// Bundled skills (simplify, debug, commit, verify, stuck, remember, loop)
let skill_tool = SkillTool::new().with_project_root(".");
// skill="list" → lists all available skills
// skill="debug" args="tests are flaky" → expands $ARGUMENTS template实时事件
三种观察机制:
// 1. Callback
Agent::builder().on_event(|e| match e {
AgentEvent::TextDelta(t) => print!("{}", t),
AgentEvent::ToolStart { name, .. } => eprintln!("[{}]", name),
_ => {}
})
// 2. Broadcast (multi-consumer)
let agent = Agent::builder().enable_broadcast(256).build()?;
let mut rx = agent.subscribe().unwrap();
tokio::spawn(async move { while let Ok(e) = rx.recv().await { /* ... */ } });
// 3. Stream (bidirectional control)
let mut stream = agent.run_stream("Deploy");
while let Some(e) = stream.next().await {
if let AgentEvent::PermissionRequired(req) = e {
stream.respond_permission(req.id, PermissionDecision::Allow);
}
}上下文管理
Agent::builder()
.auto_compact(true) // summarize old messages at 90% context usage
.compact_threshold(0.9) // trigger threshold
.tool_result_budget(50_000) // truncate oldest tool results above 50K chars
.thinking_budget(8192) // extended thinking tokens
.effort(EffortLevel::High) // Low/Medium/High/MaxMCP(模型上下文协议)
let mcp = McpManager::connect(&[
McpServerConfig::stdio("db", "npx", &["-y", "@my/db-mcp"]),
McpServerConfig::sse("docs", "https://mcp.example.com"),
]).await?;
Agent::builder().tools(mcp.tool_definitions().await)OAuth(人类原生)
// Opens browser, PKCE flow, token storage, refresh
cargo run --example oauth_login______________________________________________________________________
代理生成器-完整的API
Agent::builder()
// Provider (required)
.provider(Anthropic::from_env()?)
// Tools
.tool(MyTool)
.tools(cersei::tools::coding())
// Model & generation
.model("claude-sonnet-4-6")
.max_turns(10)
.max_tokens(16384)
.temperature(0.7)
.thinking_budget(8192)
// Prompt
.system_prompt("You are a helpful assistant.")
.append_system_prompt("Extra context.")
// Environment
.working_dir("./my-project")
.permission_policy(AllowAll) // or AllowReadOnly, DenyAll, RuleBased, Interactive
// Memory
.memory(JsonlMemory::new("./sessions"))
.session_id("my-session")
// Hooks & events
.hook(CostGuard { max_usd: 5.0 })
.on_event(|e| { /* ... */ })
.enable_broadcast(256)
.reporter(ConsoleReporter { verbose: true })
// Context management
.auto_compact(true)
.compact_threshold(0.9)
.tool_result_budget(50_000)
// Execute
.build()? // -> Agent
.run_with("Fix the tests") // -> AgentOutput (shorthand)______________________________________________________________________
基准测试
在Apple Silicon上测量,发布版本,100次迭代,3次预热运行。
工具输入/输出
| 工具 | 平均值 | 最小值 | 最大值 |
|---|---|---|---|
| 编辑 | 0.04毫秒 | 0.02毫秒 | 0.05毫秒 |
| 球面 | 0.05ms | 0.05ms | 0.07ms |
| 写入 | 0.09毫秒 | 0.07毫秒 | 0.11毫秒 |
| 读取 | 0.09毫秒 | 0.08毫秒 | 0.11毫秒 |
| 恢复时间 | 5.85ms | 5.34ms | 8.51ms |
| Bash | 15.64毫秒 | 14.50毫秒 | 16.19毫秒 |
vs克劳德代码CLI
注: Cersei是一个库——工具调度发生在进程中。Claude Code是一个CLI,其中 每个子代理分支支付全部启动成本。这些是不同的层次;下面的比较 显示了进程内调度和CLI进程开销之间的差距。
| 度量 | Cersei(SDK) | 克劳德代码(CLI) | 注释 |
|---|---|---|---|
| 工具调度(读取) | 0.09ms | ~5-15ms(估计) | 进程中vs Node.js fs |
| CLI启动 | 不适用(库) | 269毫秒 | Claude --version 温暖的avg |
| 子代理生成 | ~1ms(进程内) | ~300ms(分叉) | 代理工具开销 |
有关苹果对苹果CLI的比较,请参阅 抽象CLI基准测试.
内存I/O
| 操作 | 摘要(Cersei) | 克劳德代码(测量) | 比率 |
|---|---|---|---|
| 扫描100个文件 | 1.2毫秒 | 26.6ms(find) | 22x |
| 加载内存.md | 9.6μs | 17.1毫秒 | 1781x |
| 记忆回忆(图表) | 98μs | 7545ms(LLM调用) | 77000x |
| 记忆回忆(文本) | 1.3毫秒 | 17.5毫秒(grep)13倍 | |
| 会话写入 | 27μs/入口 | N/A | -- |
| 会话负载(100) | 268μs | N/A | -- |
| 图形存储 | 30μs/节点 | N/A(无图表) | -- |
| 主题查询 | 77μs | N/A(无图表) | -- |
基准套房
每个工作台都位于自己的独立目录中,有自己的运行器和结果模式。添加新的长椅作为兄弟姐妹。
| 套件 | 路径 | 测量内容 | 跑步者 |
|---|---|---|---|
| 总代理框架 | bench/general-agents/ | 每个代理的内存、实例化时间、最大并发代理数——Cersei与Agno/PydanticAI/LangGraph/CrewAI的比较。 | ./bench/general-agents/run.sh |
| 终端工作台2.0 | bench/term-bench/ | Daytona沙盒中的端到端编码任务使用完整的 abstract CLI(Linux x86_64/arm64二进制文件以树形结构提供)。 | ./bench/term-bench/run.sh |
| LongMemEval(长期记忆) | bench/long-mem/ | 在ICLR-25 LongMemEval 500问题基准上的回忆准确性——以相同的提示和LLM作为评判标准,与Mastra/Zep/Supernemory进行正面交锋。Cersei的四种配置:全上下文基线、使用HNSW语义、涂鸦图子字符串、混合w/LLM事实提取+RRF融合。 | cargo run --release -p longmem-bench -- --dataset s --config all |
| 压缩(真实LLM) | crates/cersei-agent/tests/e2e_openai_compression.rs | 输入代币节省 cersei-compression 关于OpenAI(gpt-4o-mini)双子座(gemini-2.5-flash). #[ignore],使用真正的API密钥运行。 | cargo test -p cersei-agent --test e2e_openai_compression -- --ignored --nocapture |
| SDK工具I/O | examples/benchmark_io.rs | 读/写/编辑/Grep/Bash/Glob的进程中工具调度延迟。 | cargo run --example benchmark_io --release |
| SDK内存I/O | crates/abstract-cli/examples/memory_bench.rs | 图内存vs文件系统vs克劳德代码风格路径。 | cargo run -p abstract-cli --example memory_bench --release |
| vs克劳德代码CLI | run_tool_bench_claude.sh · run_tool_bench_codex.sh | CLI与CLI启动、内存和调度开销。 | ./run_tool_bench.sh --iterations 20 --full |
运行基准测试
# Rust-side SDK benches (no external services)
cargo run --example benchmark_io --release
cargo run --release -p abstract-cli --example memory_bench
# vs Claude Code / Codex CLIs
./run_tool_bench.sh --iterations 20 --full
# Python-harness benches (uv-managed; each dir self-contained)
./bench/general-agents/run.sh # Cersei vs Agno / PydanticAI / LangGraph / CrewAI
./bench/term-bench/run.sh # Terminal Bench 2.0 via Daytona
# LongMemEval memory benchmark (head-to-head vs Mastra / Zep / Supermemory)
./bench/long-mem/setup.sh # downloads oracle + s datasets
OPENAI_API_KEY=sk-… cargo run --release -p longmem-bench -- \
--dataset s --config all --concurrency 8
# Real-LLM compression savings (requires API keys)
OPENAI_API_KEY=sk-… cargo test -p cersei-agent \
--test e2e_openai_compression -- --ignored --nocapture______________________________________________________________________
压力测试
cargo run --example stress_core_infrastructure --release # system prompt, compact, context, bash classifier
cargo run --example stress_tools --release # all 30+ tools, registry, performance
cargo run --example stress_orchestration --release # sub-agents, coordinator, tasks, messaging
cargo run --example stress_skills --release # bundled + disk skills, Claude Code + OpenCode format
cargo run --example stress_memory --release # memdir, CLAUDE.md, sessions, extraction, auto-dream______________________________________________________________________
示例
| 示例 | 说明 |
|---|---|
simple_agent | 3行中的最小代理 |
custom_tools | 定义和注册自定义工具 |
streaming_events | 实时 run_stream() 带彩色输出 |
multi_listener | 拥有多个消费者的广播频道 |
resumable_session | 坚持并继续 JsonlMemory |
custom_provider | Echo提供者+OpenAI兼容端点 |
hooks_middleware | 成本保护+审计记录器+工具拦截器 |
benchmark_io | 完整的I/O基准测试套件 |
usage_report | 令牌/成本跟踪和计费估算 |
coding_agent | 构建Python todo CLI(端到端) |
oauth_login | Anthropic OAuth PKCE登录流程 |
cargo run --example simple_agent --release______________________________________________________________________
测试套件
# Run all 160 unit tests
cargo test --workspace
# Run with graph memory (requires grafeo)
cargo test --workspace --features graph
# Run specific crate
cargo test -p cersei-tools
cargo test -p cersei-agent
cargo test -p cersei-memory
cargo test -p cersei-mcp160个单元测试 | 262次压力检查 | 0次失败 | 零I/O回归
______________________________________________________________________
扩展点
| 什么 | 如何 | 示例 |
|---|---|---|
| 自定义提供者 | impl Provider | 本地法学硕士,Azure,基岩 |
| 自定义工具 | #[derive(Tool)] 或 impl Tool | 数据库查询、部署、搜索 |
| 自定义权限 | impl PermissionPolicy | RBAC,OAuth范围 |
| 自定义内存 | impl Memory | PostgreSQL、Redis、S3 |
| 定制挂钩 | impl Hook | 成本门控、审计记录 |
| 定制记者 | impl Reporter | 仪表板、WebSocket中继 |
| MCP服务器 | McpServerConfig 通过构建器 | 任何兼容MCP的服务器 |
| 技能 | .claude/commands/*.md | 自定义提示模板 |
| 图形存储器 | features = ["graph"] | Grafeo关系跟踪 |
______________________________________________________________________
文档
cersei.pacifio.dev/docs -提供API参考、架构、食谱、基准测试和llms.txt支持的完整文档。
| 第节 | 内容 |
|---|---|
| 快速开始 | 10行中的第一个代理 |
| API 参考 | 代理、提供者、工具、内存、挂钩、MCP |
| 建筑 | 板条箱图、数据流、设计原则 |
| 食谱 | 自定义工具、部署、嵌入 |
| 抽象CLI | 基于Cersei构建的参考CLI |
| 基准测试 | vs克劳德法典vs法典 |
______________________________________________________________________
许可证
MIT许可证
版权所有(c)2025 Adib Mohsin
特此免费授予任何获得本软件和相关文档文件(“软件”)副本的人在不受限制的情况下处理软件的权限,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,以及允许获得软件的人这样做,但须符合以下条件:
上述版权声明和本许可声明应包含在软件的所有副本或实质部分中。
软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性的保证。在任何情况下,作者或版权持有人均不对因软件或软件的使用或其他交易而产生或与之相关的任何索赔、损害赔偿或其他责任承担责任,无论是在合同、侵权或其他诉讼中。
