Cerulion (YC S24) 是面向物理 AI 的操作系统:一个开源、零拷贝的机器人运行时,可记录运行过程、针对新代码回放失败场景,并能从任意位置访问你的机器人。它兼容 ROS 2。
安装 · 运行示例 · 性能 · ROS 2 · 架构 · 文档 · 指南

安装
curl -fsSL https://raw.githubusercontent.com/cerulion-inc/cerulion/main/tools/scripts/install.sh | sh && . "$HOME/.cerulion/env"
安装程序会把 cerulion 链接到 ~/.local/bin,在你的 shell 启动文件中添加一行,并在缺少 Rust 1.95 或更新版本时安装 Rust。然后使用 cerulion login 登录一次,因为每条命令都在一个免费的 Cerulion 账户下运行,该账户用于机器人配对,之后可离线使用。要卸载,用 sh -s -- --uninstall 运行同一个脚本。
brew tap cerulion-inc/cerulion
brew install cerulion-inc/cerulion/cerulion
如果 Homebrew 6.0.x 拒绝该 tap,请先运行 brew trust --formula cerulion-inc/cerulion/cerulion 再重试。
sudo apt-get update && sudo apt-get install -y ca-certificates curl gnupg
keyring=$(mktemp) &&
curl -fsSL https://apt.cerulion.com/cerulion-archive-keyring.gpg -o "$keyring" &&
[ "$(gpg --show-keys --with-colons "$keyring" | awk -F: '$1 == "fpr" { print $10 }' | sort -u)" = "$(printf '%s\n' 953C69FD279D9256FA4B71C5DA5FDE5D0DC6D91B | sort -u)" ] &&
sudo install -m 0644 "$keyring" /usr/share/keyrings/cerulion-archive-keyring.gpg &&
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/cerulion-archive-keyring.gpg] https://apt.cerulion.com stable main" | sudo tee /etc/apt/sources.list.d/cerulion.list >/dev/null &&
rm -f "$keyring" &&
sudo apt-get update && sudo apt-get install cerulion
每一步只有在前一步成功时才会执行,APT 发行版页面固定了相同的密钥指纹,并提供了一个会指明失败步骤的更长的形式。
cargo install --locked cerulion_cli cerulion_netd
发行版安装程序会把 cerulion-connectd(远程连接的桌面端)和 cerulion-remoted(机器人端)与 CLI 一起放置。完整的源码构建方式见安装指南或 CONTRIBUTING。
在 fish 中,请改为在行末加上 && source ~/.cerulion/env.fish。
Homebrew 和 Debian 软件包不提供 Rust。要构建你自己的节点,请运行一次 cerulion-install-rust,它会安装当前稳定版 Rust(除非已存在 Rust 1.95 或更新版本),并把 ${CARGO_HOME:-$HOME/.cargo}/bin 加入你的 PATH。在终端中,当缺少 Rust 1.95 或更新版本时,cerulion workspace create 和 cerulion node build 会提示安装。
发行版二进制文件支持 Linux x86_64 和 ARM64(glibc 2.31+,Ubuntu 20.04 及更高版本)以及 macOS Intel 和 Apple Silicon。Linux 软件包还包含 cerulion ros2 run 和 cerulion ros2 launch 所使用的 ROS 2 Jazzy rmw 和 heap hook。macOS 软件包则没有,因为 ROS 2 Jazzy 没有 macOS 二进制文件。rmw 库在其 ROS 2 发行版运行的环境中运行,对 Jazzy 而言是 Ubuntu 24.04。对于 ROS 2 Lyrical,每个版本还会发布面向 Linux x86_64 和 ARM64 的 cerulion-rmw-lyrical-<version>-<target>.tar.gz。解压它并将 CERULION_LIB_DIR 设置为解压后的目录,以便 cerulion ros2 run 和 cerulion ros2 launch 加载 Lyrical rmw。该库在 CI 中构建并测试。
构建节点需要 C 工具链(Debian 和 Ubuntu 上是 build-essential,macOS 上是 xcode-select --install)以及 Rust 1.95 或更高版本。节点通过编译器无关的接口加载,因此任何 Rust 1.95 或更高版本都可以构建它们。编译器不必与构建 cerulion CLI 的编译器一致,新工作区也不锁定编译器。要将工作区从 Cerulion 1.0 迁移过来,请遵循 2.0.0 发行说明中的迁移步骤。这些步骤会将其 =1.0.0 的版本固定改为 =2.0.0,并以每个节点执行一次 cerulion node build <node> 结束。安装详情涵盖工具链设置。
快速开始:运行、记录和验证
使用编码代理?将此提示粘贴到 Claude Code、Codex 或其他在自身终端中运行命令的代理中:
Install Cerulion: curl -fsSL https://raw.githubusercontent.com/cerulion-inc/cerulion/main/tools/scripts/install.sh | sh && . "$HOME/.cerulion/env"
Run cerulion login in the background, show me the URL and code it prints, and wait for it to finish while I approve the sign-in in my browser.
Then run the quickstart at https://github.com/cerulion-inc/cerulion#quickstart-run-record-and-verify in your own terminal:
cerulion workspace create safety_demo --starter obstacle_avoidance, then cd safety_demo.
Build both nodes (cerulion node build laser_scanner --release, then cerulion node build safety_controller --release; the first build takes a few minutes).
Run cerulion graph validate obstacle_avoidance, then cerulion graph run obstacle_avoidance --release --record for at least five seconds, and stop it with Ctrl+C.
Verify the recording it printed: cerulion bag play "<recording>" --resim all --verify
In nodes/safety_controller/src/lib.rs, change the forward speed from 0.3 to 0.25, run cerulion node build safety_controller --release, and verify the same recording again.
Report what changed between the two verifications.
Finally, ask me whether I want to star https://github.com/cerulion-inc/cerulion. Only if I say yes, star it with gh api -X PUT user/starred/cerulion-inc/cerulion, or give me the link if gh is not signed in.
此示例将合成激光扫描仪连接到安全控制器。当路径畅通时,控制器发布 0.3 的前向速度;当障碍物在半米以内时,发布 0.0。
cerulion workspace create safety_demo --starter obstacle_avoidance
cd safety_demo
若要改为从零编写节点,请遵循入门教程。
每台机器登录一次。Cerulion 命令在账户下运行,此后结果从本地读取,因此后续命令可继续离线工作。
cerulion login
机器人或无头设备会打印一个短代码,可在任意机器上通过浏览器批准。
构建两个节点,检查图,然后开启记录运行它。首次节点构建还会编译 Cerulion 运行时,因此在笔记本电脑上需要几分钟。后续构建只需几秒。
cerulion node build laser_scanner --release
cerulion node build safety_controller --release
cerulion graph validate obstacle_avoidance
cerulion graph run obstacle_avoidance --release --record
如多进程指南所述,运行会拆分为每个节点一个进程,而无需更改图文件。
默认情况下,任何登录你账户的计算机都可读取该运行,无需地址或标志。添加 --network off 可将运行保留在本机。
在第二个终端中,观察控制器的反应:
cerulion topic echo /obstacle_avoidance/safety_controller/linear_velocity
随着合成扫描越过距离阈值,x 字段在 0.3 和 0.0 之间切换。让它运行至少五秒,然后用 Ctrl+C 停止。Cerulion 会打印已完成记录的路径:
recordings/obstacle_avoidance_20260918T181449Z.mcap
将 BAG 设为打印出的路径,然后先验证未更改的代码:
BAG="recordings/obstacle_avoidance_<timestamp>.mcap"
cerulion bag play "$BAG" --resim all --verify
文章标题:Show HN: Cerulion —— 兼容 ROS 2 的机器人运行时,支持多进程回放
验证成功时会打印 replay PASS 并正常退出:报告覆盖的输出与录制内容一致。
现在打开 nodes/safety_controller/src/lib.rs,把 clear-path 速度从 0.3 改成 0.25。重新构建该节点,并对同一份录制进行验证:
cerulion node build safety_controller --release
cerulion bag play "$BAG" --resim all --verify
这一次验证会报告出现分叉,并返回非零退出码。在相同的传感器输入下,改动后的控制器会下发不同的速度。在 CI 中,这一结论会在代码到达机器人之前,把这一行为变更标记出来供评审。本页顶部的动画展示了整个运行过程。
如果 Cerulion 对你有用,点一个 star 能帮助其他机器人工程师发现它。
Cerulion 用录制下来的输入和执行上下文重新执行计算图,然后把覆盖的输出与录制内容进行比较。通过意味着改动后的代码在这些录制输入上产生了相同的覆盖输出,而你保存的每一份录制都会增加一个可用于对照的用例。
- 退出码 0:参与比较的帧一致。
- 退出码 1:输出数据出现分叉,报告会指出具体的 topic 或字段。
- 退出码 6:执行调度出现分叉。
- 退出码 2 到 5:验证无法完成,错误信息会说明原因。
默认按字节精确比较。加上 --tolerance 可指定可接受的逐字段差异,加上 --report 可生成机器可读的报告。
指南:录制与回放
对照录制检查模型改动
感知示例录制一台合成相机和基于像素的检测器,先验证基线,再测试一个检测框偏移八个像素的检测器。它的边界框重叠容差会捕获这一改动,并指出受影响的字段。
在仓库根目录下:
cd examples/perception
RECORD_SECS=8 ./run_replay_demo.sh
选择与你关注的行为相匹配的容差:边界框 IoU、绝对误差或相对误差、RMSE 以及集合比较。除非你设置了字段级、topic 级或文档级容差,否则比较按字节精确进行。同样的检查可以在 pull request 上针对团队保存为回归用例的录制运行。
性能
在一台 x86-64 Linux 台式机上(24 核 Intel Core Ultra 9 285K,默认设置,开启录制,标称 100 Hz 负载,2026-09-16),1 MiB 往返在默认多进程布局下的中位数为 4.08 µs,而在使用 rmw_fastrtps_cpp 默认配置的 ROS 2 Jazzy 上为 10,952 µs:在 1 MiB 下约比 ROS 2 Jazzy 默认配置快 2,700 倍。仅一台机器,不构成保证。原始结果在 docs/benchmarks/results/8a84baf25d5d1710-2026-09-16-fixed100-heroes。
原生计算图往返
每个单元格为 p50 / p99,单位为微秒,在上述 Linux x86_64 主机上、标称 100 Hz 提供负载、往返两段均使用标注的负载大小时测得。计时从发布方的 loan 之后开始,到收到 echo 结束,因此传感器产出与负载处理会各自增加开销。Cerulion 的数字包含录制,ROS 2 的数字不包含。
| 负载大小 | Cerulion 多进程(默认),p50 / p99(µs) | Cerulion 单进程,p50 / p99(µs) | ROS 2 Jazzy / rmw_fastrtps_cpp 默认,p50 / p99(µs) |
|---|---|---|---|
| 64 B | 4.07 / 6.61 | 2.69 / 9.41 | 311 / 568 |
| 1 MiB | 4.08 / 7.38 | 2.76 / 10.74 | 10,952 / 43,402 |
| 16 MiB | 4.43 / 10.45 | 2.80 / 14.23 | 103,854 / 156,924 |
ROS 2 原生通道会对请求做流水线处理,因此在 16 MiB 时一次往返会超过 10 ms 的节奏间隔,请求在传输中相互重叠。基准测试套件记录了进程布局和计时边界。
自由运行(多进程默认)与屏障锁步对比:自由运行与锁步对比。
在 Cerulion 上运行 ROS 2
上图中的 rmw_cerulion 线是运行在 Cerulion 传输层上的 ROS 2 Jazzy,在与其他每条线相同的测试框架、姿态和节奏下测量:三个进程中的三个 ROS 2 节点,使用借出式发布和借出式订阅接收。在 1 MiB 时,这是 11.12 µs p50 / 37.21 µs p99,旁边是原版 rmw_fastrtps_cpp 的 11.0 ms / 43.4 ms,也就是图表自带的原版 ROS 2 线。中位数从 64 B 到 256 KiB 保持在 10.43 到 10.65 µs 之间,并在 16 MiB 时达到 17.47 µs。方法 · 结果与来源。
跨平台
Apple M4 行早于 macOS 数据唤醒变更,该变更由 macOS 双进程数据唤醒来测量。
源测量、构建来源和配置凭据在基准测试结果中。线表示 p50,带延伸到 p99。两个图都显示往返。
编写节点,声明行为
一个类型化输入、一个类型化输出和一个 tick 方法定义了快速入门的安全控制器。宏提供端口管线。图声明接线,运行时处理调度、传输、记录和可观测性。你不需要配置执行器、注册回调或编写自旋循环。
use cerulion_core::prelude::*;
use native_ros2_messages::geometry_msgs::Vector3;
use native_ros2_messages::sensor_msgs::LaserScan;
#[cerulion_node]
#[derive(Default)]
struct SafetyControllerNode {
#[input(trigger, depth = 1, expect_within_ms = 100)]
scan: LaserScan,
#[output(promise_within_ms = 100)]
linear_velocity: Vector3,
}
#[cerulion_node_impl]
impl SafetyControllerNode {
fn tick(&mut self) -> Result<(), NodeError> {
let ranges = self.scan.ranges();
let stop = ranges.is_empty()
|| ranges.iter().any(|&r| r.is_nan() || r < 0.5);
self.linear_velocity.x = if stop { 0.0 } else { 0.3 };
Ok(())
}
}
节点也可以用 Python 编写:cerulion node create <type> --lang python --policy period_ms=<N> 会写出一个节点,graph run、录制和回放会像对待 Rust 节点一样对待它。它需要 cerulion Python 包和 cerulion CLI,二者都从 Cerulion 源码检出构建,如 Python 所述。
这里,#[input(trigger)] 会在 scan 到达时运行控制器。端口截止时间通过未命中计数器让时序预期可观测,同时还有投递失败计数。
其他节点可以运行在同步输入集或外部事件上。对于周期性节点,使用 #[cerulion_node(period_ms = 10)] 而不是数据触发。按输入设置队列深度和背压。例如,backpressure = sample(3) 将读取限制为每 3 ms 一次。
固定字段直接写入共享内存槽。变长字段也有借出式写入器,而 self.image.data.fill_from(producer)? 让相机或生成器就地填充最终缓冲区。未触碰的输出不发布任何内容。如果此节点的 tick 返回错误,其输出会被丢弃。
指南:定义节点 · 连接图 · 背压与截止时间
带上你的 ROS 2 栈
当你控制启动时,保留你的 launch 文件并通过 Cerulion 启动它:
cerulion ros2 launch my_robot_bringup camera.launch.py
cerulion ros2 run my_robot_drivers imu_node
两者都会设置 rmw_cerulion 并运行 ROS 2 命令,一次一个 launch 文件或一个可执行文件。你的节点保留它们的 ROS 2 API 和执行器。两者都不会重写你的源码,因此复制的发布会继续复制,直到你迁移它们。用 cerulion topic list 和 cerulion topic echo 检查它们的主题,这两个命令读取共享内存平面。该 rmw 的发现是进程本地的,所以 ros2 CLI 图工具(ros2 topic list、ros2 topic echo、rqt)不会列出它们。
cerulion ros2 migrate --workspace ~/ros2_ws
cerulion ros2 migrate --workspace ~/ros2_ws --write
第一个命令预览哪些 C++ 发布点可以迁移到借出消息 API,而 --write 应用重写。使用借出进行发布和订阅是分开的选择,ROS 2 指南涵盖两者以及各自可以预期什么。
当整套栈已经在运行时,附加到它的 DDS 主题:
cerulion ros2 attach --iface <local-interface-IP>
使用这台计算机在机器人局域网上的接口 IP 地址。Attach 会发现现有的 DDS 栈并桥接其主题。它不会重启那些节点。
使用 ros2: 条目在同一个图中将 ROS 2 进程与原生节点一起启动。MoveIt 2 示例展示了未经修改的规划栈运行在 rmw_cerulion 之上。
rmw_cerulion 已在 CI 中于 Foxy、Galactic、Humble、Jazzy 和 Lyrical 上测试,Linux 发行版为 Jazzy 和 Lyrical 预构建提供它,并且 cerulion ros2 attach 已在 Jazzy 上以及 Foxy 和 Humble 上通过本地类型解析验证,这些都是 ROS 2 兼容性细节。对符合条件的 ROS 2 进程进行精确重放,一次一个(cerulion ros2 run --record-deliveries 和 --replay-deliveries),已在 Humble 上进行运行时测试。重放会在其所在机器上实时发布,并且仍会驱动该进程直接写入的任何设备,例如串口或 CAN 总线,因此请在没有连接到真实机器人的地方运行它,使这两者都不会触及在线机器人。ROS 2 重放会列出哪些进程符合条件,以及在哪里运行重放是安全的。
指南:桥接 ROS 2 · 兼容性与配置
各部分如何协同
- 在机器人上:调度器从你的图中推导依赖层级,等待数据和定时器,并跨进程组执行就绪节点。节点之间交换借用的共享内存消息,捕获功能记录数据和执行上下文。
- 跨机器:你账户中的机器人,以及这台计算机已经配对的机器人,都会被自动发现。Iroh 在能够直连时直接连接(包括在同一 LAN 内),不能直连时通过中继连接。网络守护进程为你的工具在本地镜像已订阅的主题。未配对的机器只有在机器人以 CERULION_LAN_ACCESS=open 运行时,才能通过 LAN 读取机器人的主题。
- 在你的工作台:CLI 检查、记录并验证机器人的数据,Cerulion MCP 为你的编码代理提供用于其录制、你的 Cerulion Cloud 实例以及你账户中机器人的工具。捕获到的失败就是一份可供检查的录制。在重新运行它之前,检查 bag 的 __cerulion/flashback.json 附件中的 anchor.resimmable_reason。
为什么选择 Cerulion
- 零拷贝,且不限于固定大小的消息。将相机帧、扫描数据和由模式定义的变长字段直接写入共享内存。其他本地进程读取相同的字节。
- 了解你的图的调度器。依赖层级会预先计算,周期节点、数据触发节点、同步节点和外部节点在其输入就绪时运行。记录下来的调度、显式背压和截止时间以及虚拟时钟,使得该执行在重放时可测试且确定。
- 可用于校验代码的录制。标准 MCAP、字节级精确的输出比较、逐字段容差以及供 CI 使用的机器可读判定。用实际到达机器人的输入来测试你更改后的代码。
- 忘记录制时的闪回。从滚动的内存历史中保存故障前后时刻,然后检查事件或重放其录制的主题。
- 你的机器人,无论它们在哪里。在机器人和你的计算机上登录同一账户,你的计算机就能找到机器人并读取其主题,无需设置地址或标志。相同的单进程和多进程工作流可在 Linux 和 macOS 上运行,无论在你的 LAN 内还是跨互联网。
- 一条来自 ROS 2 的路径。通过 rmw_cerulion 运行现有栈,附加到已在运行的栈,或在同一图中组合 ROS 2 进程与原生节点。
- 你的编码代理可使用的工具。托管式 Cerulion MCP 端点可为代理提供用于你的 Cerulion Cloud 实例、你的 MCAP 录制以及你账户下机器人的工具,Hindsight 则通过绑定到主题和时间戳的证据来分析录制。
指南:执行 · 多进程图 · 网络与远程机器人 · 远程访问
真实机械臂上的 Cerulion
Cerulion 可在真实硬件上运行,这里是一台运行 ROS 2 和 MoveIt 的六轴工业机械臂。录制显示了该机械臂发现的主题、由其关节状态驱动的实时 3D 模型以及控制器状态图;一段真实机械臂的手机视频在编辑中作为画中画插入,并与模型同步运动。全部六个动作均以真实速度播放,快进标记显示动作之间每次暂停被剪掉的位置。

使用 CLI 检查快速入门图的主题:
cerulion topic list
cerulion topic hz /obstacle_avoidance/laser_scanner/scan
cerulion topic echo /obstacle_avoidance/safety_controller/linear_velocity
指南:检查主题 · 远程机器人
用 Flashback 捕获故障
Flashback 在每个运行中的图里保留一个有内存上限的近期活动窗口,因此当你需要时,问题发生前的那些时刻已经在那里。它是基于事件的日志记录:在事件触发之前不会向磁盘写入任何内容,而事件触发后,围绕该事件的窗口就会成为一段录制。
当运行时发现故障时,例如工作进程终止或主题停滞,它会自行捕获,Flashback 会列出每一个触发条件。
你也可以从机器人上的另一个 shell 手动请求一次捕获:
cerulion flashback --note "controller stopped late"
重新执行会使用捕获的执行轨迹以及其起点所需的任何状态锚点。bag info 会报告一次捕获是可以重新执行还是只能回放。若要改为录制一个已在运行的图,请使用 cerulion bag record --run=obstacle_avoidance。
指南:Flashback · 录制与回放 · Bags 与回放
供你的编码代理使用的工具
https://mcp.cerulion.com/mcp/cerulion 上的 Cerulion MCP 为 Claude Code、Codex 和其他 MCP 客户端提供用于你的 Cerulion Cloud 实例的工具、对通过 https:// 提供的 MCAP 录制的分析,以及你账户下机器人的列表。
https://mcp.cerulion.com/mcp/hindsight 上的 Hindsight 单独提供录制分析工具,其答案以特定主题和时间戳为依据。
两者都使用你的 Cerulion 账户通过 OAuth 登录。托管端点没有本地工作区工具,因此请使用 cerulion CLI 构建、运行和检查节点与主题。
托管端点处于早期访问阶段。将每个端点作为独立连接器添加到你的客户端:
claude mcp add --transport http cerulion https://mcp.cerulion.com/mcp/cerulion
claude mcp add --transport http hindsight https://mcp.cerulion.com/mcp/hindsight
Hindsight 和托管 MCP 服务器是闭源的。请求访问权限。
指南:连接 MCP 客户端
路线图
方向是针对机器人变更的评审:在变更到达机器人之前,将录制、仿真和行为证据纳入评审流程。
| 领域 | 下一步计划 |
|---|---|
| 更快的执行 | 链融合节点在同一进程内直接传递数据,以纳秒级交接为可量化目标,并降低 macOS 跨进程唤醒延迟。 |
| C++ | 一等公民的节点编写能力与客户端库,为零拷贝访问、调度和可复现执行划定清晰边界。 |
| 机器人构建模块 | 原生 transforms 与 URDF 支持、参数与生命周期,并提供从对应 ROS 2 概念迁移的清晰路径。 |
| 从节点代码触发 Flashback | 在节点自身代码中声明事件,使保险杠或抓取检查能保存其看到的那一刻。 |
| 服务与动作 | 在已交付的确定性服务层之上,为节点作者提供原生请求/响应 API,随后是动作:带反馈的长时目标、取消与流式回复。 |
| 拉取请求验证 | 一个 GitHub 审查器,运行录制的回归测试与云端仿真,报告行为差异,并将证据与变更一同保留。 |
| 场景库 | 用户定义的环境与预期行为,将既往失败 bag 提升为回归用例,以及生成可审查测试预期的压力场景。 |
| 智能体与检查 | 更紧密的循环,用于检查数据、修改代码并重放结果,将实时运行、录制与验证报告并排比较。 |
| 平台与互操作性 | Windows 支持、更广泛的硬件验证,以及更便捷地与现有机器人数据工具交换。 |
| 远程访问 | 加固基于账户的配对与远程访问层:机器人侧配置、托管账户服务,以及跨自有与共享机器人的授权管理。 |
路线图开放接受用例与贡献:讨论一个功能。发布变更记录在 changelog 中。
示例
| 示例 | 所演示的内容 |
|---|---|
| 避障 | 类型化节点、实时控制器与重放验证。 |
| 相机流水线 | 就地图像生成与数据触发的检测器。 |
| 感知回归 | 图像导出的检测结果与可复现的容差失败。 |
| V4L2 相机 | 一个监视设备 fd 的 Linux 相机驱动节点,以及一个数据触发的亮度计。需要一台相机。 |
| RealSense | 通过阻塞式 SDK 等待从 librealsense2 获取彩色与深度,以及最近障碍物测距。需要一台 RealSense。 |
| MoveIt 2 | 使用 rmw_cerulion 的现有 ROS 2 规划栈。 |
| Go2 四足机器人 | 桥接的 DDS 机器人、其相机转码,以及带安全 mux 和运动驱动的遥操作栈。 |
文档与贡献
文档 · API 参考 · Android 构建支持 · 贡献 · Issues · 行为准则 · 与创始人交流
通过安全策略报告漏洞。Cerulion 由 YC 公司 Cerulion Inc. 构建。商业咨询:[email protected]。
许可证
AGPL-3.0-only,并提供商业许可。客户端侧的 cerulion_wire、cerulion_link、cerulion_ops_proto 与 cerulion_pairing crates 采用 MIT OR Apache-2.0,每个 manifest 均注明其许可证。
引用 Cerulion
使用 GitHub 的 Cite this repository 按钮或 CITATION.cff:
@software{cerulion,
author = {Sharma, Lakshay and Kariyawasam, Raveen and {Cerulion Inc. and contributors}},
title = {Cerulion},
year = {2026},
version = {2.0.0},
url = {https://github.com/cerulion-inc/cerulion}
}
像 {{NAME_ab12cd34}} 这样的值是真实值的占位符。在回复和工具调用中都完全按原样使用它们:它们会在任何内容运行之前被填入真实值。不要要求验证它们,也不要用示例替换它们。