RULITH 规据 运行独立智能体

运行独立智能体(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)。

端口缺省 7799RULITH_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_KEYRULITH_MODEL_KEY(前者优先)。思考型模型缺省关闭思考输出(省 token),RULITH_MODEL_THINKING=enabled 打开。

配置全表

变量缺省作用
RULITH_TOKEN(必填)控制台「接入与凭证」页生成的令牌
ANTHROPIC_API_KEY / RULITH_MODEL_KEY(必填其一)你的模型服务 key,不出本机
RULITH_URLhttps://api.rulith.com云端地址
RULITH_MODELclaude-sonnet-5模型名
RULITH_MODEL_URLAnthropic 官方模型服务地址;/chat/completions 结尾自动按 OpenAI 风格
RULITH_MODEL_THINKINGenabled 打开思考输出
RULITH_MAX_ROUNDS12单段最多几轮——防跑飞,到顶如实说明并停
RULITH_UI_PORT7788--ui 页面端口(只监听回环)
RULITH_UI_OPENoff = 只起界面服务不弹浏览器(无头/嵌入/自动化)
RULITH_AUTO_ARCHIVEoff 关闭段尾自动归档(单板长跑形态)
RULITH_SHADOW_URL/KEY/MODEL同主配置影子批评者的独立模型(可用更小的)
RULITH_CASE_BOARDSon = 一单一板(等价于 --case-boards
RULITH_RECIPE配方文件路径(等价于 --recipe;只在案板形态生效)
RULITH_CASE_PREFIX智能体名案号前缀
RULITH_AUTO_SEALoff = 案板形态下段尾不封板,案卷留在「在办」
RULITH_SERVEon = 接单脑(等价于 --serve
RULITH_SERVE_PORT7799收单口端口(只监听回环)

旗标:--agent <名字> 选智能体 · --ui 开本机页面 · --shadow 启用影子批评者 · --case-boards 一单一板 · --recipe <文件> 指定配方 · --serve 接单脑。

影子批评者(--shadow)

每段收尾时,第二个人格以对抗立场读板与本段经过,专挑坐实的缺陷。它有牙齿:有异议的段不自动归档(案板形态下同一条纪律的形状是不封板),异议落板(人与主人格都看得见);但它只能落异议,改不了主人格写的任何东西——审的不是改的。完整编制的设计见一个智能体的编制

段尾自动归档

办结且验收通过的任务树,段尾自动从工作视图收起(历史进冷层,不是删除)——板上事实不无界累积,处理能力不随历史退化。没通过验收的收不掉:垃圾清不掉,恰好说明活没干完。RULITH_AUTO_ARCHIVE=off 关闭。

这是单板长跑形态的清台面方式;开了一单一板之后,段尾的动作不是归档而是封板(整块案卷定稿只读,见上)。

嵌入别的界面(可插拔的脸)

--ui 加开本机页面(http://127.0.0.1:7788,只监听回环)。启动时终端会打印带界面钥的地址,这把钥每次启动随机生成。嵌入合同三条:

  • GET /events?k=<钥> —— 输出(SSE,晚接入也能补看全史)
  • POST /saycontent-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)——改了实现而忘了改文档,校验会自己发现。