指南

使用 OneBot 扩展

通过 OneBot v11 协议端调用群管理、文件、表情回应等协议特有动作

OneBot 扩展(koishi-plugin-ishiki-onebot-actions)把 NapCat、SnowLuma 与 LLBot 的 OneBot v11 动作目录带进对话,让 Agent 能查询并调用核心工具没有覆盖的协议能力:群管理、群文件与群相册、表情回应、历史消息、好友与资料管理。

普通发言仍用 send_message;这些工具只补足协议特有的操作。

动作从哪来

目录由 packages/onebot-actions/scripts/generate-catalog.mjs 从三边的 OpenAPI 文档生成,产物 packages/onebot-actions/src/catalog/generated.ts 提交进仓库,运行时不依赖参考仓库:

node packages/onebot-actions/scripts/generate-catalog.mjs          # 重新生成
node packages/onebot-actions/scripts/generate-catalog.mjs --check  # 只校验

脚本读取 NAPCAT_DOCS、SNOWLUMA_DOCS 与 LLBOT_DOCS 指向的仓库,默认 D:/Codespace/references/NapCatDocs、D:/Codespace/references/SnowLumaDocs 与 D:/Codespace/references/LLBotDocs。LLBot 的数据来自导出的 openapi.json,脚本按 tag 只取 OneBot 11 部分(同一份导出里还有 Milky),并跳过接收事件的 _events。

各后端的动作集合不同:89 个三边都有,71 个 NapCat 与 SnowLuma 共有,3 个 SnowLuma 与 LLBot 共有,2 个 NapCat 与 LLBot 共有;NapCat 有 174 个,SnowLuma 有 191 个,LLBot 有 108 个。83 个动作的参数形状或必填项不一致。目录保留这些差异:公共参数放顶层,单后端独有的参数进对应后端的变体,同一个规范名在不同后端可以对应不同的线上名(例如 share_peer 在 NapCat 上是 ArkSharePeer,send_packet 在 LLBot 上是 send_pb)。

启用

在 Koishi 插件市场安装 koishi-plugin-ishiki-onebot-actions,再到「插件配置」启用:

plugins:
  ishiki-onebot-actions: {}

然后在 profile 中声明:

extends:
  onebot-actions:
    config:
      backend: napcat   # 可选:napcat | snowluma | llbot,默认取插件配置
      mode: read        # docs | read | write,默认 read
字段默认说明
backend插件配置动作集合、参数形状、只读判定都按它选择
modereaddocs 只查目录;read 加只读执行;write 加全部执行
maxInlineBytes8 MiB资源转 base64:// 的字节上限
resourceBaseUrlKoishi 的 selfUrl协议端访问 Koishi HTTP 服务的 origin,用于需要 URL 的参数
denyActions[]额外禁用的动作名或别名

工具

工具模式说明
list_actions全部按分类列出轻量索引
get_action全部单个动作的参数表、必填项、后端差异、别名
search_actions全部按名称、摘要、别名、分类、参数名搜索
list_categories全部分类与动作数量
query_actionread / write只执行标记为只读的动作
invoke_actionwrite执行任意动作,包含有副作用的

模式之外还有一层执行期校验:query_action 永远拒绝写动作,invoke_action 在非 write 模式直接报错,denyActions 与内置禁用表在两条路径上都生效。

完整目录也是资源:onebot://actions 是分类索引,onebot://actions/<name> 是单动作详情,可以用 read 工具翻。

后端差异

同一个动作在不同后端上的参数不一定相同。目录会把当前后端的参数放在「参数」一节,把其他后端独有的参数各自放在单独一节,方便对照:

动作NapCatSnowLumaLLBot
get_group_msg_historymessage_seq、reverseOrder、reverse_ordermessage_id、reverse_ordermessage_seq、reverseOrder
mark_group_msg_as_readgroup_idmessage_id 必填无此动作
upload_group_file另有 folder另有 folder、upload_file无 folder、upload_file
move_group_filecurrent_parent_directory、target_parent_directoryparent_directory、target_directoryparent_directory、target_directory
ocr_image路径、URL、base64只接受 http(s) URL 或已缓存的 file_id路径、URL、base64

LLBot 的必填项整体更严格:set_group_admin 要 enable,set_group_ban 要 duration,set_group_kick 要 reject_add_request,get_group_files_by_folder 要 folder_id。这些只影响 LLBot 的变体,不会放宽另外两个后端。

LLBot 还有一批独有动作:闪传文件(upload_flash_file、download_flash_file、get_flash_file_info、reshare_flash_file)、群相册创建与删除、批量踢人、群消息遮蔽、二维码扫描、资料卡点赞、推荐表情、群文件永久保存。

只存在于部分后端的动作不会出现在其他后端的目录里;调用它会被拒绝,并提示查看当前后端的目录。

媒体参数

动作参数里的资源 URL 按参数类型处理:

  • 默认可内联的参数转成 base64://。
  • 标记为需要 URL 的参数(ocr_image.image、send_tuwen_ark.preview_url、get_mini_app_ark 的图片地址、download_file.url)发布到 Koishi 的 HTTP 服务,返回临时 URL 交给协议端拉取。
  • http(s)://、base64://、data:、file:// 和宿主路径原样保留。
  • 文本资源、超过 maxInlineBytes 的字节都直接报错,不截断。

临时 URL 的路由挂在 Koishi 自己的 HTTP 服务上(@koishijs/plugin-server),每个 profile 一条,条目十分钟过期,最多 8 条、总计 32 MiB。协议端与 Koishi 不在同一网络命名空间时,用 resourceBaseUrl 指向协议端能访问的地址:

extends:
  onebot-actions:
    config:
      backend: snowluma
      mode: read
      resourceBaseUrl: http://host.docker.internal:5140

安全边界

  • bot_exit、set_restart、send_packet、get_cookies、get_credentials、get_csrf_token 默认禁用,denyActions 可以再加。
  • query_action 只接受当前后端标记为只读的动作;写操作必须走 invoke_action,且 profile 必须是 write 模式。
  • 跨频道模式(mode: cross)必须显式给 account,取值是 profile 已认领的账号;频道模式固定用该频道的账号。
  • OneBot 的业务失败(retcode !== 0)作为正常结果返回,模型自己读 message;只有传输失败才抛错。

On this page