运行独立智能体(REPL)
独立智能体是自带模型的客户端形态:交一句话任务,它自己跑「提议 → 板裁决 → 按教学改 → 再提」的循环,直到板上长出带依据的结论。脑(模型)在你的机器,板(裁决与记录)在云上。 与 MCP 接入的分别:MCP 是把 Rulith 当工具挂进你已有的智能体(Claude Code、Codex——见5 分钟上手);独立智能体是我们提供的单文件程序,适合「交办一句话,要一个可核查的结果」。
三件不变的纪律,正是这个循环的意义:
- 结论不是模型写的——模型只能提材料与规则,结论由板推。它想直接断言结论,板会拒。
- 报错是接口——板的每一次拒绝都带教学文本,程序把它原样回喂模型,模型照着改。
- 模型钥匙不出你的机器——它直连你的模型服务;云上只收板命令,看不到你的模型 key。
下载与前置
单文件、零依赖,只要 Node 22+:
curl -O https://console.rulith.com/rulith-agent.mjs
或到控制台「接入与凭证」页点下载按钮。
令牌
控制台「接入与凭证」页 →「生成令牌」。令牌只显示一次,每把可单独撤销;它只授权板命令,与你的模型 key 是两回事。
三种跑法
# REPL——不带任务参数即多轮对话,终端就是界面
RULITH_TOKEN=<令牌> ANTHROPIC_API_KEY=<模型 key> node rulith-agent.mjs
# CLI——带任务参数则一次办完退出(脚本 / CI)
RULITH_TOKEN=… ANTHROPIC_API_KEY=… node rulith-agent.mjs --agent orders "核对这批订单并给出结论"
# 管道——把它当子进程,stdin/stdout 即接口
echo "把这件事办了" | RULITH_TOKEN=… ANTHROPIC_API_KEY=… node rulith-agent.mjs
--agent <名字> 选驱动哪一个智能体(缺省 default;一个账户多个智能体见管理多个智能体)。无人值守的第四种形态见下面的「接单脑」一节。
一单一板:每接一单开一份案卷(--case-boards)
缺省形态是单板长跑——一块板一直用下去,段尾把办完的任务归档、清出台面(既有用法不变,不必改动任何配置)。
另一种形态是一单一板:每接一段就是一单,段首开一块新板当案卷,办结即封板。封板之后这块板只读——写入一律被教学式拒绝,读取(查结论、查依据、逐条追问)照常开放,重复封板也不会出错。于是"一件事的案卷"有了定稿的时刻,定稿之后谁也不能再往里补一笔。
RULITH_TOKEN=<令牌> ANTHROPIC_API_KEY=<模型 key> \
node rulith-agent.mjs --agent orders --case-boards --recipe recipe.json
开单那一步是一个配方函数:--recipe <文件> 给出这一单要装的能力清单与播种操作(目标、边界条目),同一份配方开出来的案卷天然可比。这也是这个形态真正的含义——智能体是一份配方(装什么能力、以什么身份办事),不再等同于某一块长期使用的板。
RULITH_CASE_PREFIX改案号前缀(缺省用智能体的名字);RULITH_AUTO_SEAL=off段尾不封板——案卷留在「在办」,由你自己去控制台结;- 影子批评者有异议时不封板:异议没处理完的案卷留在「在办」,人与主人格都看得见(与单板形态"有异议就不自动归档"是同一条纪律)。
封板后案卷从「在办」转入「已结」,控制台里照样打得开、查得清。现况:案板形态属于新增能力,随客户端与云端版本提供,开放状态以现况页为准。
接单脑:无人值守的收单口(--serve)
--serve 是第四种形态:不读终端输入、不弹界面,只在本机回环上挂一个收单口——你的后端把一句话任务 POST 进来,它排队、按单办完,结果留在内存里等你取。
RULITH_TOKEN=<令牌> ANTHROPIC_API_KEY=<模型 key> \
node rulith-agent.mjs --agent orders --serve --case-boards
启动时终端打印一把随机收单钥(每次启动都换),三个约定:
POST /task,头带x-rulith-serve: <钥>、体为{"text":"…"}—— 交一单,立即受理;GET /runs?k=<钥>—— 取队列与最近若干条结果的快照(JSON);GET /runs?k=<钥>&stream=1—— 同一条事件流的实时推送(SSE)。
端口缺省 7799(RULITH_SERVE_PORT 可改),只监听回环,门规与 --ui 完全相同(随机钥、只认本机来源、请求体上限 64KB)——只监听回环不等于有门。
并发恒为 1:收单口串行办单。RULITH_SERVE_CONCURRENCY 认得,但填大于 1 会被当场教学式拒绝并退回 1——一个进程只有一条对话转录,两单并行会把两段活织进同一条转录里。要真并发就开多个进程:各自一条转录、一把钥、一个端口。
跨案连续性:案卷之间怎么不断线
一单一板之后,案卷与案卷之间是断的,而"我上次答应过什么、这个智能体到底按哪套法办事"必须活得比单个案卷长。这件事现在由三条腿承接,不再需要一块单独的"身份板"(那个实现 2026-08-07 已撤):
- 配方指纹:智能体就是一份配方(领域四件套 + digest)。同一份配方开出的每块案卷板,genesis 都落同一枚受信指纹——"这些案子是同一个智能体按同一套法办的"因此可机械对账,不靠名字。
- 长命板:一段需要跨案存续的关系(长期委托、持续服务)用一块不封的长命板承载;案子来来去去,关系那一块留着。
recallFacts:把已办结案卷里的结论选择性召回进新案——经显式 intake,带来源与接地档,不是把旧板直接接上。
如实说明:召回来的结论仍是它原来的档位——记的是"上一案证到这一步",不是"这在新案里也真"(档位规矩见信任层)。
用别家模型
缺省按 Anthropic 官方线型直连。RULITH_MODEL_URL 以 /chat/completions 结尾时自动改按 OpenAI 风格发(DeepSeek、Qwen 等都是这个形状):
RULITH_MODEL_URL=https://api.deepseek.com/chat/completions \
RULITH_MODEL=deepseek-chat RULITH_MODEL_KEY=<key> \
RULITH_TOKEN=<令牌> node rulith-agent.mjs
模型 key 认 ANTHROPIC_API_KEY 或 RULITH_MODEL_KEY(前者优先)。思考型模型缺省关闭思考输出(省 token),RULITH_MODEL_THINKING=enabled 打开。
配置全表
| 变量 | 缺省 | 作用 |
|---|---|---|
RULITH_TOKEN | (必填) | 控制台「接入与凭证」页生成的令牌 |
ANTHROPIC_API_KEY / RULITH_MODEL_KEY | (必填其一) | 你的模型服务 key,不出本机 |
RULITH_URL | https://api.rulith.com | 云端地址 |
RULITH_MODEL | claude-sonnet-5 | 模型名 |
RULITH_MODEL_URL | Anthropic 官方 | 模型服务地址;/chat/completions 结尾自动按 OpenAI 风格 |
RULITH_MODEL_THINKING | 关 | enabled 打开思考输出 |
RULITH_MAX_ROUNDS | 12 | 单段最多几轮——防跑飞,到顶如实说明并停 |
RULITH_UI_PORT | 7788 | --ui 页面端口(只监听回环) |
RULITH_UI_OPEN | 开 | off = 只起界面服务不弹浏览器(无头/嵌入/自动化) |
RULITH_AUTO_ARCHIVE | 开 | off 关闭段尾自动归档(单板长跑形态) |
RULITH_SHADOW_URL/KEY/MODEL | 同主配置 | 影子批评者的独立模型(可用更小的) |
RULITH_CASE_BOARDS | 关 | on = 一单一板(等价于 --case-boards) |
RULITH_RECIPE | — | 配方文件路径(等价于 --recipe;只在案板形态生效) |
RULITH_CASE_PREFIX | 智能体名 | 案号前缀 |
RULITH_AUTO_SEAL | 开 | off = 案板形态下段尾不封板,案卷留在「在办」 |
RULITH_SERVE | 关 | on = 接单脑(等价于 --serve) |
RULITH_SERVE_PORT | 7799 | 收单口端口(只监听回环) |
旗标:--agent <名字> 选智能体 · --ui 开本机页面 · --shadow 启用影子批评者 · --case-boards 一单一板 · --recipe <文件> 指定配方 · --serve 接单脑。
影子批评者(--shadow)
每段收尾时,第二个人格以对抗立场读板与本段经过,专挑坐实的缺陷。它有牙齿:有异议的段不自动归档(案板形态下同一条纪律的形状是不封板),异议落板(人与主人格都看得见);但它只能落异议,改不了主人格写的任何东西——审的不是改的。完整编制的设计见一个智能体的编制。
段尾自动归档
办结且验收通过的任务树,段尾自动从工作视图收起(历史进冷层,不是删除)——板上事实不无界累积,处理能力不随历史退化。没通过验收的收不掉:垃圾清不掉,恰好说明活没干完。RULITH_AUTO_ARCHIVE=off 关闭。
这是单板长跑形态的清台面方式;开了一单一板之后,段尾的动作不是归档而是封板(整块案卷定稿只读,见上)。
嵌入别的界面(可插拔的脸)
--ui 加开本机页面(http://127.0.0.1:7788,只监听回环)。启动时终端会打印带界面钥的地址,这把钥每次启动随机生成。嵌入合同三条:
GET /events?k=<钥>—— 输出(SSE,晚接入也能补看全史)POST /say,content-type: application/json、头带x-rulith-ui: <钥>、体为{"text":"…"}—— 输入(与终端进同一个收件箱)- 请求的
Origin/Host必须是本机;体上限 64KB
为什么要钥:只监听回环不等于有门。你浏览器里任何一个网页都能往 127.0.0.1 发请求,text/plain 的简单请求连预检都不触发——没有这把钥,随便一个页面就能给一个有板写权限的智能体盲塞任务。
REPL 进程是本体,终端、管道、浏览器都只是脸——把它嵌进任何 GUI 或页面应用,不必改本体(脸只要带上这把钥)。无头场景用 RULITH_UI_OPEN=off 只起服务不弹浏览器。
与控制台的分工
板务(任务进度、求证工单、结论与依据、工作板)在控制台「智能体」页——不管开车的是哪个脑(Claude、Codex 还是独立智能体),看板同一套。对话记录只在本机、不上云:板记录公务,不记心路。
content/*.md;能力清单、工具清单、字段矩阵由生成器从实现代码抽取
(快照在 facts.json)——改了实现而忘了改文档,校验会自己发现。