@draht/rlm

中文文档
2026.11.5发布于 2026/11/06TypeScriptES Module近 30 天下载 2380

递归语言模型——根-LLM-出品-代码-/REPL-executes-structed-stdout scolfold

中文使用文档
文档目录8 节
  1. 何时选择 RLM 而不是普通代理
  2. 费用封套
  3. 可观察性:轨迹日志和重放
  4. 工作实例
  5. 沙盒要求
  6. 发展
  7. 软件包布局
  8. 一般事务人员(其他职等)

@draht/rlm (英语)

递归语言模型 (RLM)——张作霖的推论-时间脚手架,,, 克拉斯卡、克塔布(2026年), 递归语言模型 (arXiv:2512.24601) (中文(简体) ) root-LLM-出品-代码-REPL-执行-截取-出品-历史-附录- 最后检查。 让根模型解答关于输入量的问题远远大于 通过写 Python 来检查、块和搜索它自己的上下文窗口 从沙盒中的 REPL 内容,可选择重现为 次级llm_query 电话,而不是呼叫者 永远装入原始内容 进入一个提示.

何时选择 RLM 而不是普通代理

当输入真的不符合模型的背景时, 联系 RLM 窗口,或仅通过切换可能很重要的内容来适应:

  • 日志文件,数据集堆放,或输出为 10 个或 数百兆字节——从任何模型的窗口过后的数量级.
  • 源文件的目录/ glob 太大, 无法完整读取而不驱逐 之前的对话背景 .
  • 任何你不得不猜测哪个前缀/后缀/样本的情况 要切入的输入,错误的猜测意味着缺少答案.

当输入在模型中已经舒适地匹配时,不要到达 RLM 上下文窗口 — 普通读取速度快, 费用更低, 并且更容易调试 。 RLM 语言 将一个直接读作若干次额外的模拟往返(见下文) 贸易只有在替代品为短线引起的信息时才有回报 损失,不只是"这个文件有点长"

费用封套

一个正常的读取是一通呼叫:整个输入进入了即时,模型 答过一次 RLM为 没有 普罗万象比那便宜.. 不同贸易:

  • 根模型每个REPL步骤发出一个呼叫(一小到几十个) 每个步骤的 Python 本身可能叫做 llm_query(...),这是 第二届 型号调用(一般改为较小) “rlm-sub”角色——见 router-session.ts是因为 RlmRole费用,包括 钱.
  • RLM的总成本是 sum(root-step costs) + sum(sub-call costs) 对 一个基线的单调。 RLM在基线单调时获胜 否则要求要么彻底失败(投入根本不适合),要么 支付大得多的上下文窗口/ 重新读取输入复数 为了补偿短篇小说——而不是在 一般情况.
  • 别猜了 量度. src/cost-comparison.ts是因为 compareCost() 计算一个轨迹的两个数字: rlmCostUsd 从轨道上 自己登录的费用条目(readCostLog编号 :getSessionCosts 从 @draht/router过滤 trajectoryId),以及 baselineCostUsd 作为 估计费用 @draht/router是因为 estimateCost只有一个呼叫 将相同的内容切入目标模型的上下文窗口 (第一——N——特征——那——适合——一个简单,命名的策略,而不是声称 这是最聪明的短跑。 对照真实的轨道ID运行 假设 RLM 是您更便宜(或更昂贵)的选择 具体投入/模式配对; .draht/rlm/cost-comparison-report.json 实值 比较时写报告.

可观察性:轨迹日志和重放

每个 createRouterBackedSession 运行写入新线限制的 JSON 轨迹日志到 .draht/rlm/<trajectoryId>.jsonl (单位:千美元)src/trajectory.ts(b) —— 一个 TrajectoryStepEntry 每个 REPL 步骤( 其代码、 已截断的 stdout, 错误, 如果 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}加一个航站楼 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}那台台阶的自负 TrajectoryFinalEntry 一旦会议决定. trajectoryId 一样 ID 已经用于标记会话的 @draht/router 成本记录条目,所以 轨迹日志及其成本核算总是与同一键相关.

因为整个运行都在磁盘上,所以可以用 零 LLM 电话数字 :

draht rlm replay <trajectory-id>

读取 JSONL 日志通过 readTrajectory() 并打印最后答案(添加a) 动词旗表示完整的分步跟踪)——没有路由器,没有模型,没有 在那个代码路径上的网络访问。 用于审计什么会话 实际上,调试一个没有达到的跑步 FINAL,或审查费用 没有重新运行任何东西.

这个 test/s-niah.test.ts 在 10x 和 100x a 时召回回归套件 模拟根模型的上下文窗口(合成针入海斯塔克 ~4M和 ~ 40M 字符, 对脚本模拟器 rootLlm ——没有真正的模型呼叫)作为 脚手架上还找到一个规模的针头.

工作实例

说 deploy.log 是一个40 MB 的部署日志,您需要知道是什么原因 埋在其中某处的断气 太大了 无法粘贴成正常的快感. 同样的问题,有三个方法:

交互式 /rlm 命令 (a内) draht 会议:

/rlm deploy.log What caused the outage around the 03:00 UTC deploy?

draht rlm 国 际 (可说明,一发:

draht rlm --input ./deploy.log --query "What caused the outage around the 03:00 UTC deploy?"

rlm_query 工具 (代理人推迟阅读本身,即会中,取而代之) 将日志装入自身上下文中:

{
  "tool": "rlm_query",
  "input": {
    "input": "deploy.log",
    "query": "What caused the outage around the 03:00 UTC deploy?"
  }
}

三者同道同道入盖下: parseInputArg编号 :loadInput 页:1 deploy.log 输入内容, createRouterBackedSession 包装为 反应 context 与问题准备为标题,和根 模型将 Python 写入 grep/ chunk/ search context - 重现为 llm_query 视需要对个别块进行子调用——直至呼叫 FINAL(...)编号 :FINAL_VAR(...) 带着答案. --input编号 :input 还接受 缩略语( o)"src/**/*.ts"页:1 http(s):// URL,或者说 knowledge:<client-slug> 给一个有名的客户知识库.

为了查查这次跑步是否值得 成本上看 trajectoryId 联 合 国 .draht/rlm/<trajectoryId>.jsonl 日志( 或匹配) trajectoryId 输入 .draht/cost-log.jsonl并把它输入 compareCost() (见上文费用封套)而不是假设 向上转.

沙盒要求

Linux RLM 会话需要 unshare 或者说 bwrap,一个64位 x86 或 ARM Python 解释器, seccomp 过滤, 和一个启用的 Landlock ABI 3 或更新 。 这个 python 模块路径的读取权限,系统库 目录( 包括 Nix 商店, 当存在时), 驱动程序, 以及运行时间 支持文件。 常规文件写作仅限于会话工作目录; /dev/null 也可以写。 进程执行、联网和文件系统 拒绝元数据更改。 名称和大小等文件元数据不是 藏起来.

如果这些内核限制无法安装,驱动程序不会运行. macOS 继续使用 sandbox-exec。两个平台运行一个沙盒启动 在接受模型生成的 Python 之前检查.

喜欢的 unshare 路径将 Python 保存在 PID 内存监控 用途。 与 bwrap 倒计时,RSS的民调目前观察包装 进程;会话的RSS上限在该路径上并不可靠.

发展

npm install          # from repo root, resolves this workspace package
cd packages/rlm
npx tsc --noEmit     # typecheck
npm test             # vitest

软件包布局

  • src/session.ts —— 说 RlmSession 根循环(步/跑, FINAL编号 :FINAL_VAR 哨兵,恒大历史.
  • src/router-session.ts —— 说 createRouterBackedSession,生产 @draht/router- 辅助工厂(即时选择、成本记录、, 轨迹记录).
  • src/trajectory.ts ——轨迹 JSONL 附加/读取(此阶段).
  • src/cost-comparison.ts - RLM-vs-基线成本控制(这一阶段).
  • src/loaders.ts —— 说 --input编号 :/rlm <input> 源装入器(文件, glob, URL( URL) , (英语), knowledge:<slug>) (中文(简体) ).
  • src/prompts.ts ——分级系统即时模板,由根选择 模型的上下文窗口.
  • python/repl_driver.py ——沙箱Python RePL驱动.
  • packages/coding-agent/src/rlm-cli.ts —— 说 draht rlm CLI 子命令 .
  • packages/rlm-agent/ —— 说 /rlm 命令 + rlm_query 工具扩展名 正常代理会话.

一般事务人员(其他职等)

RLM是一种交叉编码代理能力,不是任何单一的属性 生成项目堆栈——无 packages/templates/src/*.md是因为 每层模板(Astro、Go/gRPC、SST TypeScript)是用于一个 "何时使用 RLM" 注释,和这个 repo 自己的根 AGENTS.md 是一个 贡献- 工作流程 doc, 不是特征引用 。 这个读取器是 rLM 的主要文档表面; 没有修改模板 .

版本与发布记录

@draht/rlm 共发布 24 个版本,首次发布于 2026/07/13;过去 12 个月发布了 24 个版本。

版本发布日期距今
2026.11.5latest2026/11/067 天前
2026.11.5-12026/11/058 天前
2026.10.312026/11/0112 天前
2026.10.31-12026/10/3113 天前
2026.10.232026/10/2420 天前
2026.10.23-12026/10/2321 天前

关于 @draht/rlm 的常见问题

@draht/rlm 是什么?

递归语言模型——根-LLM-出品-代码-/REPL-executes-structed-stdout scolfold

如何安装 @draht/rlm?

在项目目录运行 npm install @draht/rlm,或使用 pnpm add / yarn add / bun add。

@draht/rlm 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@draht/rlm 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@draht/rlm 可以商用吗?

@draht/rlm 使用 未声明 许可。package.json 没有声明许可证。没有许可证的代码默认保留全部权利,商用前请联系作者或查看仓库中的 LICENSE 文件。以上为概括,不构成法律意见,请以许可原文为准。

@draht/rlm 的下载量有多少?

根据 npm 官方下载统计,@draht/rlm 在 2026/10/13 – 2026/11/11 这 30 天内被下载 2,380 次,日均约 79 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@draht/rlm 还在维护吗?

最新版本 2026.11.5 发布于 2026/11/06(7 天前);至今共发布 24 个版本,其中过去 12 个月发布了 24 个;首次发布于 2026/07/13。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。