内容
<div align="center">
<img src="https://www.reelier.com/avatar.svg" width="72" alt="Reelier" />
# Reelier
### 智能代理生成声明,而 Reelier 编写凭证。
记录成功的运行,确定性地重放 — **0 代币,字节相同,每一步都有凭证** — 而 `reelier diff` 捕获偏移的那一天。
**将其视为 CI + 代理工具调用工作流的快照测试。**
[](https://www.npmjs.com/package/reelier)
[](https://github.com/seldonframe/reelier/actions/workflows/ci.yml)
[](./test)
[](./LICENSE)
[](https://discord.gg/nSp5sd4v)
[](https://github.com/seldonframe/reelier)
**[网站](https://www.reelier.com)** · **[文档](https://www.reelier.com/docs)** · **[SPEC.md](./SPEC.md)**
<img src="https://raw.githubusercontent.com/seldonframe/reelier/main/docs/assets/reelier-demo.gif" width="760" alt="Reelier: 记录成功的运行,确定性地重放,0 代币,偏移检测,每一步都有凭证" />
<sub><a href="https://www.reelier.com/reelier-explainer.mp4">▶ 观看 (22s)</a></sub>
</div>
---
您的智能代理重新推导出相同的流程 — 消耗代币并悄悄 **偏移**。Reelier 编译一个 **成功的运行** 进入 `SKILL.md` 文件,该文件确定性地重放(无需 LLM,0 代币,每一步都有凭证),然后比较运行以检测偏移。**适用于循环生产的智能代理工作流 — “它运行了”并不是证据。**
## 安装 → 60 秒内获得您的第一个凭证
```sh
npm i -g reelier && reelier init
```
`reelier init` **扫描您已经完成的工作** — 跨 Claude Code、Codex、Windsurf 和 OpenClaw — 并提供将过去的真实会话转换为可重放的技能的选项。没有这样的历史记录?它运行一个零设置的演示并关闭一个真实的凭证:
```
您的凭证:
技能: reelier-init-demo
步骤: 2 总计,2 通过,0 未检查,0 失败
重放时间: 44ms [测量]
LLM 代币: 0 [测量]
执行类似任务的智能代理重新推理每次运行(~2.8s,~18k 代币在我们的基准测试中)。您的重放:44ms,0 代币。
```
### 或使用 Docker — 无需安装 Node
```sh
docker run --rm ghcr.io/seldonframe/reelier --help
# 从当前目录重放技能:
docker run --rm -v "$PWD:/work" -w /work ghcr.io/seldonframe/reelier run my.skill.md
# 从您的智能代理历史记录中记录(以只读方式挂载):
docker run --rm -v "$HOME/.claude:/root/.claude:ro" -v "$PWD:/work" -w /work \
ghcr.io/seldonframe/reelier scan
```
## 为什么
- **您的智能代理每次运行都重新学习工作 — 然后悄悄偏移。** 每次运行都重新推导出工作流,并且每次小的“理性”修复都会累积 — 长时间运行的操作员称之为 *疤痕组织*。编译的技能永远不会重新学习,也不会偏移。
- **真正的问题是成本。** “那花费了多少?”是每次长时间智能代理运行得到的第一个回复。Reelier 以 **0 代币** 和凭证重放。
- **这不是脆弱的 RPA。** 重放 *工具调用*(输入/输出的 JSON)而不是像素 — 并且每一步都带有自己的断言,因此失败的步骤 **会大声失败,而不是默默通过**。
- **升级模型?** 重放被固定 — 在新模型上重新记录并与冻结的基线进行 `reelier diff`:**相同或偏移,按步骤**,在到达生产之前。
- **“任何确定性的东西都应该只是代码。”** 同意 — 您的智能代理已经写了它。Reelier 将其实在的、工作的运行捕获到一个测试文件。无需手动编码的确定性。
## 工作原理 — 记录 → 编译 → 重放 → 差异 → 凭证
```sh
reelier init # 60s:记录 → 编译 → 重放 → 您的凭证
reelier run <name>.skill.md # 确定性重放 — 0 代币(默认只读)
reelier diff <name> # 相同或偏移,按步骤 — 偏移时退出 1
reelier push <name>.skill.md # 将凭证同步到您的账本(可选)
```
1. **记录** — 三种方式:`reelier mcp --wrap "<your mcp server>"`(您智能代理工具的前置无损代理),直接从现有会话(`reelier scan` / `reelier from-session`),或引导式 `reelier init`。
2. **编译** — `reelier compile` 将跟踪转换为 `SKILL.md` 确定性地(0 LLM 调用)— 一个带有 **每一步断言** 的配方,以及编译器的诚实间隙打印为 **开放问题**(包括字面日期、UUID 和时间戳,标记为“这应该是一个变量?”)而不是猜测。
3. **重放** — `reelier run` 以 0 级运行:无需 LLM,毫秒级,字节相同。**默认只读** — 写入步骤(`idempotent-write`)在您传递 `--allow-writes` 之前永远不会重新触发。
4. **差异** — `reelier diff` 比较技能的两次运行,并报告 **相同或偏移,按步骤**,以及失败的断言作为 *原因*。偏移时退出代码 1,以便在调度重放时使用。
5. **凭证** — 每次运行都是凭证(每一步的结果、时间、0 代币)。`reelier push` 可选地将它们同步到凭证账本,以获取可共享的永久链接和可嵌入的 **已验证重放徽章**。
### 转换智能代理技能
将指令技能和一次记录的运行转换为确定性重放 — 您的技能,不含模型:
```sh
reelier mcp --wrap "<your mcp server>" # 记录:智能代理执行技能任务一次
reelier compile trace.jsonl --from-skill ./my-skill/SKILL.md
# → my-skill.skill.md — 名称和描述从您的 SKILL.md 继承,
# 步骤仅从记录的运行(从指令文本中从未生成)
```
## 断言值,而不仅仅是形状
技能的断言使重放 *证明*。语法检查状态、结构、**和值**:
```md
- assert: status == 200
- assert: json.results is array
- assert: json.count >= 1 # 数值范围
- assert: json.plan is string # 类型
- assert: json.id matches /^usr_/ # 值模式
- assert: body contains "ok"
```
## 在您的编码智能代理(MCP)中使用它
`reelier serve` 将 Reelier 的命令公开为 MCP 工具,因此 Claude Code / Cursor / Windsurf / Codex 可以在会话中调用它:
```json
{ "mcpServers": { "reelier": { "command": "npx", "args": ["-y", "reelier", "serve"] } } }
```
智能代理获得 `reelier_scan`、`reelier_from_session`、`reelier_replay`、`reelier_diff` 和 `reelier_push` — 带有描述,告诉它 *何时使用* 每个(以及何时不使用)。它记录一个确定性任务一次,然后重放而不是重新推理。
## 工具
- **reelier_scan** — 扫描智能代理会话历史记录(Claude Code、Codex、Windsurf、OpenClaw)以获取可重放的工具调用工作流
- **reelier_from_session** — 将记录的会话编译为可重放的 SKILL.md,带有每一步的断言
- **reelier_replay** — 确定性地重放技能,0 LLM 代币(默认只读;写入受 `--allow-writes` 保护)
- **reelier_diff** — 比较两次运行:相同或偏移,按步骤,具有失败的断言作为原因;偏移时退出 1
- **reelier_push** — 将运行凭证同步到 [账本](https://www.reelier.com/replays) 以获取可共享的永久链接(可选)
## 测量的证明
来自真实的、实时的基准测试(智能代理 vs. Reelier,相同任务,相同数据)— 完整表格 + 方法论在 [`examples/benchmark`](./examples/benchmark) 中:
- **1,000 / 1,000 重放字节相同** (N=1000 尾部方差测试)
- **0 代币每次重放** — 从运行记录中验证,而不是假设
- **~50× 更便宜** ($0.000000/重放 vs. $0.019068/运行,平均智能代理运行)
- **~59× 更快** (48ms vs. 2,842ms 平均延迟)
- 真实的偏移 **自我修复,成本约 $0.001**,一次,然后之后的每次重放都是免费的
> **延迟因网络而异** — 0 级重放(默认)会重执行技能的工具调用,因此时钟时间取决于您的连接。不会变化的是 **0 LLM 代币**,每次运行的相同步骤和凭证。独立证实 — [arXiv 2605.14237](https://arxiv.org/abs/2605.14237) 发现 93.3–99.98% 代币减少,使用相同的记录和重放模式。
## 适用于任何模型(BYOK)
0 级重放(默认)从不调用模型 — 按照构造,0 代币。可选升级( `--max-level 1|2` )是可选的,并通过一个狭窄的 BYOK 接口( `--llm-base-url` + `--llm-model` )进行通信:Anthropic Messages 适配器和 OpenAI 兼容适配器用于其他所有适配器(OpenRouter、Ollama、Gemini 的 OpenAI 端点、Groq、vLLM、LM Studio、Kimi、…)。指向更强大的模型,技能的 *下一次* 自我修复将免费变得更智能。
## 拥有它 — AGPL、BYOK、本地优先
引擎永远不会被封闭。您的技能、跟踪和运行记录是 **您的数据** — 离开只是复制一个文件夹。格式在 [SPEC.md](./SPEC.md) 中指定,这是一个规范的 RFC 风格参考,以便任何人都可以发出或消费它们,而无需阅读源代码。
## 贡献
欢迎提出问题和 PR — 请参阅 [SPEC.md](./SPEC.md) 以获取格式(规范优先于代码;修复代码,而不是规范)。`npm test` 运行完整的套件;`npm run build && npx tsc --noEmit` 在 PR 之前。
```sh
git clone https://github.com/seldonframe/reelier && cd reelier
npm install && npm test
```
## 星历史
[](https://star-history.com/#seldonframe/reelier&Date)
## 许可证
[AGPL-3.0](./LICENSE) — 免费分叉、审计和永久自我托管。
<div align="center">
**如果 Reelier 为您节省了一次重新运行,[点亮它](https://github.com/seldonframe/reelier) ⭐ — 这是其他构建者找到它的方式。**
</div>