Capability 系统
什么是 Capability
Capability 是注册在 C 层的可调用工具,LLM 通过 tool-use API 以 function-call 方式直接调用。每个 Capability 具有唯一的字符串 id、JSON 输入 Schema 和执行函数。除 LLM 调用外,还支持以下方式触发:
AT 命令:
AT+CLAW=cap,<id>[,<json_args>]Lua 脚本:通过
capLua 模块使用cap.call("id", json_string)内部 C 代码:
claw_cap_call()C API
Capability 组与门控
所有 Capability 按功能划分到对应的 cap_group。大多数组始终对 LLM 可见;部分组默认隐藏,需激活对应 Skill 后才解锁。这一机制确保 LLM 在调用硬件相关或资源密集型工具前获得必要的上下文。
组名 |
门控 Skill |
包含的 Capability |
|---|---|---|
|
(始终可见) |
|
|
(始终可见) |
|
|
(始终可见) |
|
|
(始终可见) |
|
|
(始终可见) |
|
|
(始终可见) |
|
|
(始终可见) |
|
|
(始终可见) |
|
|
(始终可见) |
|
|
(始终可见) |
|
|
(始终可见) |
|
|
board_hardware_info (需先激活) |
|
|
camera_capture (需先激活) |
|
Capability 速查表
文件管理
Capability |
说明 |
|---|---|
|
从 |
|
写入或追加文件内容 |
|
删除文件(会先停止使用该路径的 Lua 任务) |
|
列出指定路径下的文件和子目录 |
|
移动或重命名文件 |
|
将文件复制到新路径 |
|
获取文件元数据(大小、类型、修改时间) |
Skill 管理
Capability |
说明 |
|---|---|
|
列出所有可用 Skill(内置 + 用户) |
|
在当前会话中激活 Skill;注入其 SKILL.md 上下文并解锁对应 cap_groups |
|
保存新的用户 Skill(SKILL.md + 可选 scripts/main.lua) |
|
删除用户创建的 Skill 目录 |
|
从会话激活列表中停用 Skill |
Lua 执行
Capability |
说明 |
|---|---|
|
同步执行 Lua 脚本;返回 |
|
以后台任务方式启动 Lua 脚本;立即返回 |
|
获取后台任务状态及增量日志输出(通过 since_seq 参数) |
|
列出所有后台 Lua 任务及其状态 |
|
协作式停止正在运行的后台任务 |
调度器
Capability |
说明 |
|---|---|
|
添加或更新调度任务(支持 event_type、delay_sec、interval_sec、cron) |
|
列出所有已注册的调度任务 |
|
按 ID 删除调度任务 |
|
启用之前已禁用的任务 |
|
禁用任务而不删除 |
板级硬件 (需先激活 board_hardware_info )
Capability |
说明 |
|---|---|
|
列出板上所有已注册的硬件设备(传感器、显示屏等) |
|
获取设备完整信息:芯片、接口引脚分配、驱动参数 |
|
查询某类外设是否可用及哪些引脚/实例空闲 |
|
获取板级硬件描述 Schema(芯片定义、约束条件) |
|
从 VFS 重新加载 board.json 配置 |
系统信息
Capability |
说明 |
|---|---|
|
获取空闲堆内存及历史最小值 |
|
列出所有 FreeRTOS 任务的状态、优先级和栈水位 |
|
获取芯片型号、固件版本、运行时间 |
|
获取 Wi-Fi SSID、信道、RSSI 及 IP 地址 |
|
获取当前 IP 地址 |
|
短暂延迟后软复位设备 |
时间
Capability |
说明 |
|---|---|
|
获取当前挂钟时间(UTC+8)及 Unix 时间戳 |
|
触发 SNTP 时间同步并将结果写入系统时钟和 RTC |
网络
Capability |
说明 |
|---|---|
|
发起 HTTP/HTTPS 请求(GET/POST/PUT/PATCH/DELETE/HEAD);返回状态码和响应体 |
|
启动持续的 UDP 广播/监听对端发现;在对端出现/消失时触发回调 |
|
停止对端发现后台服务 |
|
一次性对端发现(阻塞直至找到或超时) |
音频流 (需先激活 camera_capture )
Capability |
说明 |
|---|---|
|
一次性同时启动 RX(UDP→扬声器)和 TX(DMIC→UDP)流 |
|
启动 DMIC 到 UDP 的发送流(C 层控制推送开关) |
|
启动 UDP 到扬声器的接收流;应在 TX 之前调用 |
|
停止 TX 和 RX 流任务 |
|
暂停音频流 |
|
获取 TX/RX 运行状态及 UDP 包计数 |
视觉
Capability |
说明 |
|---|---|
|
对摄像头图像进行视觉描述 |
网络搜索
Capability |
说明 |
|---|---|
|
执行网络搜索并返回摘要结果 |
即时通讯
Capability |
说明 |
|---|---|
|
向本地 WebUI 发送文本消息 |
|
通过 Telegram Bot 发送文本消息 |
|
通过飞书发送消息 |
|
通过微信发送文本消息 |
|
通过 QQ 发送消息 |
|
向 IM 平台发送媒体文件 |
AT 命令接口
列出所有已注册的 Capability:
AT+CLAW=cap
列出所有已安装的 Skill(调用 skill_list Capability):
AT+CLAW=cap,skill_list
调用 Capability 并传入 JSON 参数:
AT+CLAW=cap,<capability_id>,<json_args>
示例:
AT+CLAW=cap,get_info
AT+CLAW=cap,file_list,{"path":"vfs:/skills/"}
AT+CLAW=cap,lua_run,{"path":"vfs:/tmp/test.lua","args":{}}
AT+CLAW=cap,skill_activate,{"name":"board_hardware_info"}
指定会话 ID(用于控制每会话 cap_groups 可见性):
AT+CLAW=cap,<capability_id>,<json_args>,sid,<session_id>
在 Lua 脚本中调用 Capability
在 Skill 脚本中使用 cap Lua 模块。cap.call 始终返回 两个 值:
local cap = require("cap")
local cjson = require("cjson")
-- 正确:同时接收 ok(布尔值)和 result_json(字符串)
local ok, result_json = cap.call("get_current_time", "{}")
if not ok then
return '{"error":' .. (result_json or '"cap call failed"') .. '}'
end
local t = cjson.decode(result_json)
-- 使用 t.timestamp、t.datetime 等字段
-- 错误:只接收一个返回值时,变量得到的是布尔值 ok,JSON payload 被丢弃
-- local result = cap.call("get_current_time", "{}") -- 请勿这样写