Skip to content

LISTENAI/limb

Repository files navigation

limb

the brain stays home.

limb 是一种故意不智能的联网设备。它把屏幕、扬声器、麦克风和设备上的少量 持久存储,以尽可能低层的接口交给局域网里的主机;功能、模型和会话则留在你 选择的 coding agent 中。

它不是一台内置助手,也不要求某个固定的 AI 运行时。你可以直接用 limb CLI 驱动它,把它接入 OpenClaw,或者让自己的程序通过 liblimb 使用它。

边界先于功能

limb 把输入和输出设计成两种不同的能力:

  • 麦克风等输入只能由设备本地事件限时开启。远程协议中没有“打开麦克风”或 “延长录音”的操作;输入开启时,设备指示灯必须亮起。
  • 屏幕、扬声器和其它输出对已配对的主机开放,并通过带 TTL 的租约解决多个 使用者之间的冲突。
  • 设备可以运行沙箱化的 WebAssembly“反射”,完成秒表、状态灯等低延迟或离线 行为;反射接触不到麦克风、摄像头和固定的主人语音通路。
  • 设备不会直接连接语音云。STT/TTS provider 在主机侧选择,也可以替换为本地 实现。

完整的不变量与设计理由见 AGENTS.md,线上的唯一协议事实源是 PROTOCOL.md

现在可以做什么

  • 发现、配对和描述局域网中的 limb 设备;
  • 向 240×240 屏幕写入裸 RGB565 像素;
  • 播放 16 kHz、单声道 S16LE PCM,或在主机侧合成文字后播放;
  • 在本地物理 gate 开启后采集 PCM,并在主机侧识别语音;
  • 把关于某台设备的配置和记忆写进设备 KV;
  • 构建、安装、检查和停止持久化的 WASM 反射;
  • 把一台设备映射成一路 OpenClaw channel,获得连续对话和流式语音回复。

设备会通过 describe 如实报告实际能力。当前板卡没有确认的 GPIO 扩展口,也 没有声明满足时间戳要求的摄像头,因此客户端不应假定这些能力存在。

快速开始

下面假定设备已经烧录固件、连入与主机相同的网络,并且你已安装 Rust 工具链。 先在仓库根目录构建 CLI:

cargo build --release -p limb
export PATH="$PWD/target/release:$PATH"

发现设备并查看它真实暴露的能力:

limb scan
limb describe limb-a1b2c3

将示例中的 limb-a1b2c3 换成 scan 返回的设备 ID。设备选择器也接受 mDNS 名称、IP 地址和 host:port;成功使用一次后,可以用全局选项 --last 复用 最近的设备。

1. 配对

持续按住设备按键 5 秒,看到 LED 慢速呼吸后,在 60 秒窗口内执行:

limb pair limb-a1b2c3 --label my-laptop

CLI 会把设备只返回一次的长期 token 保存在当前用户的配置目录中。配对要求 物理在场;如果设备还没有联网,先按设备端配网说明 通过 USB 串口添加 Wi-Fi。换网络不需要重新编译固件。

2. 启动本机 I/O broker

安装当前 limb 可执行文件为用户级常驻服务,并查看它发现的设备:

limb daemon install
limb daemon status
limb list

limbd 只监听设备本地 gate 的加密通知并仲裁本机消费者;空闲时不与设备保持 TCP 连接,也不运行模型或保存会话。升级 CLI 后重新执行 limb daemon install 即可更新服务定义和可执行文件路径。

3. 让设备说话

内置的 ListenAI provider 是默认选项,但不是协议绑定。先安全地保存 API key:

limb config set-credential listenai
limb say --device limb-a1b2c3 '你好,我是 limb。'

API key 从终端提示读取,不会进入 shell 历史。provider 的替换、本地语音路径和 配置格式见 cli/providers.md

已有裸 PCM 时可以完全绕过 TTS:

limb say --device limb-a1b2c3 --raw < mono-16k-s16le.pcm

4. 听一次,或持续交谈

先运行 listen 建立本机订阅,再双击设备按键打开有硬截止时间的语音 gate:

limb listen --device limb-a1b2c3

设备会发出只有已配对主机才能验证的短 UDP 通知;limbd 接受该 gate,并把设备 在握手期间缓存的开头音频交给 STT。默认的 listen 在第一个 final 后退出; limb listen --follow 会跨多个物理 gate 保持同一个本机订阅。

要形成连续循环,把最终 speech NDJSON 交给一个从 stdin 读取请求、从 stdout 输出回答的命令:

limb watch --device limb-a1b2c3 --on-speech 'your-agent --once'

watch 在整个运行期保持一个 daemon 订阅,所以模型调用和播报期间也不会错过 下一次本地通知。模型、上下文与会话生命周期都属于 your-agent;每轮仍需要 在设备上双击或使用本地唤醒词。更完整的 CLI 说明见 cli/README.md,首次真机验收记录见 cli/FIRST-CONTACT.md

裸输出与设备记忆

屏幕接口不解码 PNG/JPEG,也不提供字体或绘图原语。先在主机侧生成紧密排列的 RGB565 数据,再原样发送:

limb blit limb-a1b2c3 frame.rgb565 --preempt

用户 KV 会随设备而不是随主机或 agent 迁移。例如调整扬声器数字增益:

limb kv set limb-a1b2c3 audio.out.digital_gain_db -20
limb kv get limb-a1b2c3 audio.out.digital_gain_db
limb kv del limb-a1b2c3 audio.out.digital_gain_db

数值范围为 -113..30 dB;删除该键会恢复固件构建时的默认值。

在设备上安装反射

反射适合语义已经封闭、需要低延迟或离线常驻的“感知 → 动作”,例如按键秒表。 它不是第二个 agent,也不能接管主人的语音通路。

CLI 可以初始化一个不带业务行为的 C 项目,并用本机 LLVM 构建、审计反射。它 不会自动下载编译器;需要 clangwasm-ld,也可通过 LIMB_CLANGLIMB_WASM_LD 或对应命令行参数指定路径。

mkdir my-reflex && cd my-reflex
limb reflex init --name my-reflex
# 编辑 reflex.c 与 manifest.json
limb reflex build
limb reflex check

工作区布局固定为 reflex.cmanifest.json 和生成的 build/reflex.wasminit 会同时创建或补全忽略 /build/.gitignore。在工作区内无需任何路径参数,从外部执行时只传工作区目录。

build 只在模块通过 ABI、唯一导入、生命周期导出、内存、大小及 manifest 检查后才写入 build/reflex.wasmcheck 完全离线;push 会在连接设备前重复 同一检查。

用同一工具链构建并安装仓库中的秒表示例:

limb reflex build device/examples/reflex/stopwatch
limb push limb-a1b2c3 device/examples/reflex/stopwatch/build/reflex.wasm \
  --manifest device/examples/reflex/stopwatch/manifest.json \
  --preempt
limb reflex status limb-a1b2c3

安装后单击按键控制秒表;长按 1.6 秒可由基座停止当前反射。反射 ABI、资源预算 和更多示例见 device/README.md

接入 OpenClaw

仓库内的 @listenai/openclaw-limb 同时 包含 channel 和设备操作/反射 skills。一台设备对应一个稳定的 OpenClaw 会话; 插件监听物理 gate 产生的语音,在同一设备上流式播出回复,但不会改变任何输入 权限。

从 monorepo 构建并安装:

cd integrations/openclaw-limb
npm ci
npm run check
npm test
npm pack --pack-destination /tmp
openclaw plugins install npm-pack:/tmp/listenai-openclaw-limb-0.1.0.tgz --force
openclaw channels add --channel limb --account limb-a1b2c3
openclaw gateway restart

启用 channel 后,不要同时为同一设备运行另一个 limb listenlimb watchlimbd 会让第二个消费者立即失败,并报告当前所有者。版本要求、多设备配置和 诊断命令见集成文档

固件开发

普通使用和换 Wi-Fi 都不需要重编固件。需要开发或烧录 ARCS Mini / Mini3 固件 时,请从 device/README.md 开始;两种板型共用一套应用代码, 通过 -DBOARD=arcs_mini-DBOARD=arcs_mini3 选择板级适配。

仓库不分发板级 boot image。首次烧录必须从已授权的板卡发布渠道取得匹配的 boot, 不要把 Wi-Fi 凭据或本机 SDK 路径提交进仓库。

仓库结构

cli/                         Rust CLI、liblimb 与 provider 配置
device/                      ARCS Mini / Mini3 基座固件与反射示例
integrations/openclaw-limb/  OpenClaw channel 与 skills
PROTOCOL.md                  limb v0.2 协议事实源
AGENTS.md                    产品宪法、架构决策与协作规则

许可证

除文件或第三方目录另有声明外,本仓库的源码、协议文档、skills 和示例均按 Apache License 2.0 提供。device/third_party/ 等目录中的第三方组件 保留各自的上游许可证与归属声明,其使用和再分发适用对应条款。

当前安全状态

这是面向开发与核心假设验证的版本,不是量产安全方案。当前 demo token 在受信 局域网设备上以明文持久化;TLS、安全存储、旁路监听与重放防护仍需在量产前完成。 请只在你信任的网络中使用,并把物理 gate 指示灯视为输入是否开启的最终事实。

About

A deliberately unintelligent body for your coding agent—raw pixels, PCM, and sandboxed WASM. The brain stays home.

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Contributors