pi-llbot-bridge
Bridge a locally hosted LLBot (OneBot 11, reverse WebSocket) into a running Pi session
Package details
Install pi-llbot-bridge from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:pi-llbot-bridge- Package
pi-llbot-bridge- Version
0.6.1- Published
- Oct 31, 2026
- Downloads
- 1,444/mo · 534/wk
- Author
- xinvxueyuan
- License
- MIT
- Types
- extension
- Size
- 84.1 KB
- Dependencies
- 1 dependency · 2 peers
Pi manifest JSON
{
"extensions": [
"./src/index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-llbot-bridge
把本机 LLBot(OneBot 11,反向 WebSocket)的 QQ 群聊桥进当前 pi 会话的 pi 扩展。
安装与配置
pi install npm:pi-llbot-bridge # 从 npm 安装(也可以 pi install ./ 装本地源码)
mkdir -p ~/.pi/agent/llbot-bridge
cp config.example.json ~/.pi/agent/llbot-bridge/config.json
开发期直接跑源码:pi -e ./src/index.ts。
配置写在 ~/.pi/agent/llbot-bridge/config.json(模板见 config.example.json)。环境变量可覆盖:
| env | 含义 |
|---|---|
PI_LLBOT_HOST / PI_LLBOT_PORT / PI_LLBOT_PATH |
反向 WS 监听地址与路径 |
PI_LLBOT_ACCESS_TOKEN |
与 LLBot 侧一致的 token |
PI_LLBOT_RECENT / PI_LLBOT_QUOTED_BEFORE / PI_LLBOT_QUOTED_AFTER |
上下文窗口 |
PI_LLBOT_FILTER |
off 关闭模型筛选(退回确定性裁剪) |
PI_LLBOT_MEDIA / PI_LLBOT_MEDIA_DIR / PI_LLBOT_MEDIA_TTL_HOURS / PI_LLBOT_ATTACH_IMAGES |
媒体缓存 |
LLBot 侧
在 LLBot 的 OneBot 11 配置里加一条 ws-reverse:
{
"type": "ws-reverse",
"enable": true,
"url": "ws://127.0.0.1:3001/onebot/v11/ws",
"heartInterval": 60000,
"token": "<与 server.accessToken 一致>",
"reportSelfMessage": true,
"reportOfflineMessage": false,
"messageFormat": "array",
"debug": false
}
LLBot 断线每 3 秒重连一次,所以桥和 LLBot 谁先启动都行。
用法(常驻模式)
安装后不需要手动启动:pi 会话一起来(session_start)扩展就自动监听并等 LLBot 连入,消息自动注入当前会话。
想关掉自动连:配置 "autoStart": false,或临时 /link-llbot off。
- 群里:
@机器人 /pi <请求>(trigger.requireMention=false时连 @ 都不用) /link-llbot:手动启动(autoStart 关掉时用)/link-llbot status:查看状态/lls:/link-llbot status的别名;连上时还会在最近一条群消息上打一个 ping 表态(reactions.ping,默认14),用来一眼确认链路活着/link-llbot off:停止
一次请求发生了什么
- 收到
@机器人 /pi ...立刻给该消息打 38 表态; - 组上下文:最近
context.recent条 → 若引用消息更早,以它为中心前后补采quotedBefore/quotedAfter条并按message_id去重; - 图片/群文件/表情包等渲染成紧凑占位,媒体下载进本地缓存;
- 用当前会话模型发一次不写主会话的筛选请求剥噪声;但上下文本身不超过
filter.maxOutputChars时完全不调模型, 原样使用;超过时若模型保留行数低于filter.minKeepRatio(默认 0.6)就判为过度压缩、退回完整上下文(失败/超时同样退回); - 把「筛选后的上下文 + 本地附件路径 + 请求」注入会话;
- pi 调
qq_reply引用回复到群里,表态变 148;异常/超时表态 10060。
触发方式
trigger.requireMention 控制是否必须 @ 机器人(默认 false:消息以命令词开头就触发):
"trigger": { "requireMention": false, "allowSelf": true, "owners": ["1330509996"] }
requireMention: false(默认):/pi 你好就能触发,不要求 @。requireMention: true:必须@机器人 /pi 你好。- 命令词由
command决定(默认/pi),且要求^/pi(\s|$),/pizza不会误命中。
主人号自己发命令(自我触发)
默认桥只处理别人发来的消息;如果 bot 号就是你的主号、你要自己 @ 自己下命令,需要三件事:
- LLBot 的
ws-reverse条目设reportSelfMessage: true(否则 LLBot 不把自我消息上报); - 桥配置加:(或 env:
"trigger": { "allowSelf": true, "owners": ["1330509996"] }PI_LLBOT_ALLOW_SELF=on、PI_LLBOT_OWNERS=1330509996) owners为空数组时只受allowSelf控制;建议始终写死主人号。
防自激:桥会记住自己发出消息的 message_id,同一 id 不会再触发;且触发必须有 @自己 + /pi 前缀,普通答复不会命中。
合并转发(双向)
- 入向:群里有人转发的「合并转发聊天记录」会被
get_forward_msg展开成[合并转发聊天记录 · N 条]+ 逐行昵称: 内容(每条约 50 行上限),展开结果参与筛选与上下文; 展开失败时退回[合并转发]占位,不影响主流程。 - 出向:答复超过
replies.forwardLongText.thresholdChars(默认 600 字)时,自动改发「合并转发聊天记录」, 按nodeChars(默认 400)切块,每条节点署名当前机器人;enabled=false可退回普通长消息。
发送条数与媒体
replies.max:每轮最多发几条消息,取值0..10,-1= 不设上限;默认3。超出后qq_reply/qq_send_media会返回「已达上限」。media.allowUpload:是否允许 pi 主动上传媒体,默认true。- 模型可调
qq_send_media({ path, kind: "image"|"file", name? }):kind=image→ 走图片消息(本地文件转 base64 段);kind=file→ 走upload_group_file(群文件,带显示名);- 受
media.maxFileBytes单文件上限与replies.max条数上限约束。
媒体缓存
- 收到即下载(
media.eagerDownload,默认开):消息一入库就在后台预取附件,不等用户发命令—— QQ 的图片直链带rkey,拖久了会 403;失败会自动重试一次。 - 下载链:本地路径 → 直链 →
file://→get_image/get_file兜底,每一步失败都继续下一步,错误逐条打日志。 - 目录:
media.dir,默认~/.pi/agent/llbot-bridge/cache;sha256 内容寻址,同内容复用。 ttlHours过期删除(0= 不按时间过期),maxTotalBytes超限按最旧删除,maxFileBytes单文件上限(默认 50MB)。attachImages控制随消息附带几张图(0 = 只给路径);模型不支持图片输入时会自动跳过附带,只留路径。
限制
- 不修改会话模型/思考等级(含筛选请求)。
- 单飞:同一时刻只处理一条 QQ 请求,忙碌时回提示。
- 只在群聊生效;私聊不处理。
- 不转码、不 OCR;文件内容由 pi 自己按路径读取。
License
MIT © 2026 新v学员 (xinvxueyuan)