agentdev 0.1.7 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/dist/BasicAgent-UWXLSZP2.js +13 -0
  2. package/dist/ExplorerAgent-LCM3JQS4.js +13 -0
  3. package/dist/{chunk-LQTEETML.js → chunk-5T4C2XRT.js} +12 -7
  4. package/dist/chunk-5T4C2XRT.js.map +1 -0
  5. package/dist/{chunk-OBOU27DM.js → chunk-A354ZCZF.js} +6735 -1822
  6. package/dist/chunk-A354ZCZF.js.map +1 -0
  7. package/dist/{chunk-TSASFMRF.js → chunk-BAP2GCYH.js} +1 -1
  8. package/dist/chunk-BAP2GCYH.js.map +1 -0
  9. package/dist/{chunk-3BPSNNK3.js → chunk-EECW6PYP.js} +11 -9
  10. package/dist/chunk-EECW6PYP.js.map +1 -0
  11. package/dist/chunk-G5ECPY4K.js +551 -0
  12. package/dist/chunk-G5ECPY4K.js.map +1 -0
  13. package/dist/{chunk-LLV3W326.js → chunk-NORTAQIL.js} +67 -20
  14. package/dist/chunk-NORTAQIL.js.map +1 -0
  15. package/dist/{chunk-F3PR7UTL.js → chunk-QFHPUAUQ.js} +5 -3
  16. package/dist/{chunk-F3PR7UTL.js.map → chunk-QFHPUAUQ.js.map} +1 -1
  17. package/dist/cli/server.js +2 -2
  18. package/dist/cli/viewer.js +2 -2
  19. package/dist/create-feature-cli.cmd +2 -0
  20. package/dist/create-feature-cli.js +292 -0
  21. package/dist/features/shell/templates/bash.render.d.ts +1 -1
  22. package/dist/features/websearch/templates/web-fetch.render.d.ts +1 -1
  23. package/dist/index.d.ts +1733 -500
  24. package/dist/index.js +30 -8
  25. package/dist/index.js.map +1 -1
  26. package/dist/{notification-3VEAP7YF.js → notification-NWVOS2WR.js} +3 -3
  27. package/dist/tools-LDR3LIJP.js +14 -0
  28. package/dist/tools-LDR3LIJP.js.map +1 -0
  29. package/dist/{types-DUKIIntb.d.ts → types-CF5UsxD9.d.ts} +3 -0
  30. package/node_modules/@sliverp/qqbot/LICENSE +21 -0
  31. package/node_modules/@sliverp/qqbot/README.md +427 -0
  32. package/node_modules/@sliverp/qqbot/README.standalone.zh.md +77 -0
  33. package/node_modules/@sliverp/qqbot/README.zh.md +423 -0
  34. package/node_modules/@sliverp/qqbot/bin/qqbot-cli.js +227 -0
  35. package/node_modules/@sliverp/qqbot/clawdbot.plugin.json +16 -0
  36. package/node_modules/@sliverp/qqbot/dist/index.d.ts +20 -0
  37. package/node_modules/@sliverp/qqbot/dist/index.js +25 -0
  38. package/node_modules/@sliverp/qqbot/dist/src/agent.d.ts +76 -0
  39. package/node_modules/@sliverp/qqbot/dist/src/agent.js +36 -0
  40. package/node_modules/@sliverp/qqbot/dist/src/api.d.ts +138 -0
  41. package/node_modules/@sliverp/qqbot/dist/src/api.js +523 -0
  42. package/node_modules/@sliverp/qqbot/dist/src/channel.d.ts +3 -0
  43. package/node_modules/@sliverp/qqbot/dist/src/channel.js +349 -0
  44. package/node_modules/@sliverp/qqbot/dist/src/config.d.ts +25 -0
  45. package/node_modules/@sliverp/qqbot/dist/src/config.js +156 -0
  46. package/node_modules/@sliverp/qqbot/dist/src/demo-standalone.d.ts +1 -0
  47. package/node_modules/@sliverp/qqbot/dist/src/demo-standalone.js +125 -0
  48. package/node_modules/@sliverp/qqbot/dist/src/gateway.d.ts +20 -0
  49. package/node_modules/@sliverp/qqbot/dist/src/gateway.js +2156 -0
  50. package/node_modules/@sliverp/qqbot/dist/src/image-server.d.ts +62 -0
  51. package/node_modules/@sliverp/qqbot/dist/src/image-server.js +401 -0
  52. package/node_modules/@sliverp/qqbot/dist/src/known-users.d.ts +100 -0
  53. package/node_modules/@sliverp/qqbot/dist/src/known-users.js +263 -0
  54. package/node_modules/@sliverp/qqbot/dist/src/onboarding.d.ts +10 -0
  55. package/node_modules/@sliverp/qqbot/dist/src/onboarding.js +203 -0
  56. package/node_modules/@sliverp/qqbot/dist/src/openclaw-agent-adapter.d.ts +2 -0
  57. package/node_modules/@sliverp/qqbot/dist/src/openclaw-agent-adapter.js +155 -0
  58. package/node_modules/@sliverp/qqbot/dist/src/outbound.d.ts +150 -0
  59. package/node_modules/@sliverp/qqbot/dist/src/outbound.js +1175 -0
  60. package/node_modules/@sliverp/qqbot/dist/src/proactive.d.ts +170 -0
  61. package/node_modules/@sliverp/qqbot/dist/src/proactive.js +399 -0
  62. package/node_modules/@sliverp/qqbot/dist/src/runtime.d.ts +5 -0
  63. package/node_modules/@sliverp/qqbot/dist/src/runtime.js +16 -0
  64. package/node_modules/@sliverp/qqbot/dist/src/session-store.d.ts +52 -0
  65. package/node_modules/@sliverp/qqbot/dist/src/session-store.js +254 -0
  66. package/node_modules/@sliverp/qqbot/dist/src/types.d.ts +145 -0
  67. package/node_modules/@sliverp/qqbot/dist/src/types.js +1 -0
  68. package/node_modules/@sliverp/qqbot/dist/src/utils/audio-convert.d.ts +73 -0
  69. package/node_modules/@sliverp/qqbot/dist/src/utils/audio-convert.js +645 -0
  70. package/node_modules/@sliverp/qqbot/dist/src/utils/file-utils.d.ts +46 -0
  71. package/node_modules/@sliverp/qqbot/dist/src/utils/file-utils.js +107 -0
  72. package/node_modules/@sliverp/qqbot/dist/src/utils/image-size.d.ts +51 -0
  73. package/node_modules/@sliverp/qqbot/dist/src/utils/image-size.js +234 -0
  74. package/node_modules/@sliverp/qqbot/dist/src/utils/media-tags.d.ts +14 -0
  75. package/node_modules/@sliverp/qqbot/dist/src/utils/media-tags.js +120 -0
  76. package/node_modules/@sliverp/qqbot/dist/src/utils/payload.d.ts +112 -0
  77. package/node_modules/@sliverp/qqbot/dist/src/utils/payload.js +186 -0
  78. package/node_modules/@sliverp/qqbot/dist/src/utils/platform.d.ts +126 -0
  79. package/node_modules/@sliverp/qqbot/dist/src/utils/platform.js +358 -0
  80. package/node_modules/@sliverp/qqbot/dist/src/utils/upload-cache.d.ts +34 -0
  81. package/node_modules/@sliverp/qqbot/dist/src/utils/upload-cache.js +93 -0
  82. package/node_modules/@sliverp/qqbot/dist/standalone.d.ts +6 -0
  83. package/node_modules/@sliverp/qqbot/dist/standalone.js +6 -0
  84. package/node_modules/@sliverp/qqbot/index.ts +30 -0
  85. package/node_modules/@sliverp/qqbot/moltbot.plugin.json +16 -0
  86. package/node_modules/@sliverp/qqbot/node_modules/@eshaz/web-worker/LICENSE +201 -0
  87. package/node_modules/@sliverp/qqbot/node_modules/@eshaz/web-worker/README.md +134 -0
  88. package/node_modules/@sliverp/qqbot/node_modules/@eshaz/web-worker/browser.js +17 -0
  89. package/node_modules/@sliverp/qqbot/node_modules/@eshaz/web-worker/cjs/browser.js +16 -0
  90. package/node_modules/@sliverp/qqbot/node_modules/@eshaz/web-worker/cjs/node.js +219 -0
  91. package/node_modules/@sliverp/qqbot/node_modules/@eshaz/web-worker/index.d.ts +4 -0
  92. package/node_modules/@sliverp/qqbot/node_modules/@eshaz/web-worker/node.js +223 -0
  93. package/node_modules/@sliverp/qqbot/node_modules/@eshaz/web-worker/package.json +54 -0
  94. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/index.js +5 -0
  95. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/package.json +36 -0
  96. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/src/WASMAudioDecoderCommon.js +231 -0
  97. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/src/WASMAudioDecoderWorker.js +129 -0
  98. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/src/puff/README +67 -0
  99. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/src/puff/build_puff.js +31 -0
  100. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/src/puff/puff.c +863 -0
  101. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/src/puff/puff.h +35 -0
  102. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/src/utilities.js +3 -0
  103. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/types.d.ts +7 -0
  104. package/node_modules/@sliverp/qqbot/node_modules/mpg123-decoder/README.md +265 -0
  105. package/node_modules/@sliverp/qqbot/node_modules/mpg123-decoder/dist/mpg123-decoder.min.js +185 -0
  106. package/node_modules/@sliverp/qqbot/node_modules/mpg123-decoder/dist/mpg123-decoder.min.js.map +1 -0
  107. package/node_modules/@sliverp/qqbot/node_modules/mpg123-decoder/index.js +8 -0
  108. package/node_modules/@sliverp/qqbot/node_modules/mpg123-decoder/package.json +58 -0
  109. package/node_modules/@sliverp/qqbot/node_modules/mpg123-decoder/src/EmscriptenWasm.js +464 -0
  110. package/node_modules/@sliverp/qqbot/node_modules/mpg123-decoder/src/MPEGDecoder.js +200 -0
  111. package/node_modules/@sliverp/qqbot/node_modules/mpg123-decoder/src/MPEGDecoderWebWorker.js +21 -0
  112. package/node_modules/@sliverp/qqbot/node_modules/mpg123-decoder/types.d.ts +30 -0
  113. package/node_modules/@sliverp/qqbot/node_modules/silk-wasm/LICENSE +21 -0
  114. package/node_modules/@sliverp/qqbot/node_modules/silk-wasm/README.md +85 -0
  115. package/node_modules/@sliverp/qqbot/node_modules/silk-wasm/lib/index.cjs +16 -0
  116. package/node_modules/@sliverp/qqbot/node_modules/silk-wasm/lib/index.d.ts +70 -0
  117. package/node_modules/@sliverp/qqbot/node_modules/silk-wasm/lib/index.mjs +16 -0
  118. package/node_modules/@sliverp/qqbot/node_modules/silk-wasm/lib/silk.wasm +0 -0
  119. package/node_modules/@sliverp/qqbot/node_modules/silk-wasm/lib/utils.d.ts +4 -0
  120. package/node_modules/@sliverp/qqbot/node_modules/silk-wasm/package.json +39 -0
  121. package/node_modules/@sliverp/qqbot/node_modules/simple-yenc/.github/FUNDING.yml +1 -0
  122. package/node_modules/@sliverp/qqbot/node_modules/simple-yenc/.prettierignore +1 -0
  123. package/node_modules/@sliverp/qqbot/node_modules/simple-yenc/LICENSE +7 -0
  124. package/node_modules/@sliverp/qqbot/node_modules/simple-yenc/README.md +163 -0
  125. package/node_modules/@sliverp/qqbot/node_modules/simple-yenc/dist/esm.js +1 -0
  126. package/node_modules/@sliverp/qqbot/node_modules/simple-yenc/dist/index.js +1 -0
  127. package/node_modules/@sliverp/qqbot/node_modules/simple-yenc/package.json +50 -0
  128. package/node_modules/@sliverp/qqbot/node_modules/simple-yenc/rollup.config.js +27 -0
  129. package/node_modules/@sliverp/qqbot/node_modules/simple-yenc/src/simple-yenc.js +302 -0
  130. package/node_modules/@sliverp/qqbot/node_modules/ws/LICENSE +20 -0
  131. package/node_modules/@sliverp/qqbot/node_modules/ws/README.md +548 -0
  132. package/node_modules/@sliverp/qqbot/node_modules/ws/browser.js +8 -0
  133. package/node_modules/@sliverp/qqbot/node_modules/ws/index.js +13 -0
  134. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/buffer-util.js +131 -0
  135. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/constants.js +19 -0
  136. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/event-target.js +292 -0
  137. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/extension.js +203 -0
  138. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/limiter.js +55 -0
  139. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/permessage-deflate.js +528 -0
  140. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/receiver.js +706 -0
  141. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/sender.js +602 -0
  142. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/stream.js +161 -0
  143. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/subprotocol.js +62 -0
  144. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/validation.js +152 -0
  145. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/websocket-server.js +554 -0
  146. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/websocket.js +1393 -0
  147. package/node_modules/@sliverp/qqbot/node_modules/ws/package.json +69 -0
  148. package/node_modules/@sliverp/qqbot/node_modules/ws/wrapper.mjs +8 -0
  149. package/node_modules/@sliverp/qqbot/openclaw.plugin.json +16 -0
  150. package/node_modules/@sliverp/qqbot/package.json +81 -0
  151. package/node_modules/@sliverp/qqbot/skills/qqbot-cron/SKILL.md +513 -0
  152. package/node_modules/@sliverp/qqbot/skills/qqbot-media/SKILL.md +194 -0
  153. package/node_modules/@sliverp/qqbot/src/agent.ts +133 -0
  154. package/node_modules/@sliverp/qqbot/src/api.ts +704 -0
  155. package/node_modules/@sliverp/qqbot/src/channel.ts +380 -0
  156. package/node_modules/@sliverp/qqbot/src/config.ts +182 -0
  157. package/node_modules/@sliverp/qqbot/src/demo-standalone.ts +144 -0
  158. package/node_modules/@sliverp/qqbot/src/gateway.ts +2285 -0
  159. package/node_modules/@sliverp/qqbot/src/image-server.ts +474 -0
  160. package/node_modules/@sliverp/qqbot/src/known-users.ts +353 -0
  161. package/node_modules/@sliverp/qqbot/src/onboarding.ts +274 -0
  162. package/node_modules/@sliverp/qqbot/src/openclaw-agent-adapter.ts +168 -0
  163. package/node_modules/@sliverp/qqbot/src/openclaw-plugin-sdk.d.ts +483 -0
  164. package/node_modules/@sliverp/qqbot/src/outbound.ts +1301 -0
  165. package/node_modules/@sliverp/qqbot/src/proactive.ts +530 -0
  166. package/node_modules/@sliverp/qqbot/src/runtime.ts +22 -0
  167. package/node_modules/@sliverp/qqbot/src/session-store.ts +303 -0
  168. package/node_modules/@sliverp/qqbot/src/types.ts +153 -0
  169. package/node_modules/@sliverp/qqbot/src/utils/audio-convert.ts +738 -0
  170. package/node_modules/@sliverp/qqbot/src/utils/file-utils.ts +122 -0
  171. package/node_modules/@sliverp/qqbot/src/utils/image-size.ts +266 -0
  172. package/node_modules/@sliverp/qqbot/src/utils/media-tags.ts +134 -0
  173. package/node_modules/@sliverp/qqbot/src/utils/payload.ts +265 -0
  174. package/node_modules/@sliverp/qqbot/src/utils/platform.ts +404 -0
  175. package/node_modules/@sliverp/qqbot/src/utils/upload-cache.ts +128 -0
  176. package/node_modules/@sliverp/qqbot/standalone.ts +6 -0
  177. package/node_modules/@sliverp/qqbot/tsconfig.json +16 -0
  178. package/package.json +12 -3
  179. package/dist/BasicAgent-QWEYCLV5.js +0 -12
  180. package/dist/ExplorerAgent-4IT22VB7.js +0 -12
  181. package/dist/chunk-3BPSNNK3.js.map +0 -1
  182. package/dist/chunk-LLV3W326.js.map +0 -1
  183. package/dist/chunk-LQTEETML.js.map +0 -1
  184. package/dist/chunk-OBOU27DM.js.map +0 -1
  185. package/dist/chunk-TSASFMRF.js.map +0 -1
  186. /package/dist/{BasicAgent-QWEYCLV5.js.map → BasicAgent-UWXLSZP2.js.map} +0 -0
  187. /package/dist/{ExplorerAgent-4IT22VB7.js.map → ExplorerAgent-LCM3JQS4.js.map} +0 -0
  188. /package/dist/{notification-3VEAP7YF.js.map → notification-NWVOS2WR.js.map} +0 -0
@@ -0,0 +1,77 @@
1
+ # QQBot 独立接入说明
2
+
3
+ 这份说明面向“不使用 OpenClaw,只把 qqbot 当作 QQ 接入 SDK 使用”的场景。
4
+
5
+ ## 适合什么场景
6
+
7
+ - 你已经有自己的 TS/Node 项目
8
+ - 你只想复用 QQ Bot 的鉴权、WebSocket 收消息、HTTP 发消息能力
9
+ - 你希望把收到的消息交给自己的 agent 处理
10
+
11
+ ## 推荐入口
12
+
13
+ 在你的项目中使用:
14
+
15
+ ```ts
16
+ import {
17
+ createQQBotAgentAdapter,
18
+ startGateway,
19
+ sendText,
20
+ } from "@sliverp/qqbot/standalone";
21
+ ```
22
+
23
+ 不要用默认入口 `@sliverp/qqbot`,因为默认入口仍然包含 OpenClaw 插件注册逻辑。
24
+
25
+ ## 最小启动代码
26
+
27
+ ```ts
28
+ import {
29
+ createQQBotAgentAdapter,
30
+ startGateway,
31
+ type ResolvedQQBotAccount,
32
+ } from "@sliverp/qqbot/standalone";
33
+
34
+ const account: ResolvedQQBotAccount = {
35
+ accountId: "default",
36
+ enabled: true,
37
+ appId: process.env.QQBOT_APP_ID || "",
38
+ clientSecret: process.env.QQBOT_CLIENT_SECRET || "",
39
+ secretSource: "env",
40
+ markdownSupport: true,
41
+ config: {
42
+ allowFrom: ["*"],
43
+ },
44
+ };
45
+
46
+ const adapter = createQQBotAgentAdapter(async (request) => {
47
+ return `收到:${request.text}`;
48
+ });
49
+
50
+ await startGateway({
51
+ account,
52
+ cfg: {},
53
+ abortSignal: new AbortController().signal,
54
+ agentAdapter: adapter,
55
+ log: console,
56
+ });
57
+ ```
58
+
59
+ ## 入站 / 出站形态
60
+
61
+ - 入站:QQ Gateway WebSocket 长连接
62
+ - 出站:HTTP API 单次请求
63
+
64
+ 所以你的项目形态通常是:
65
+
66
+ 1. 进程启动
67
+ 2. `startGateway(...)` 建立长连接
68
+ 3. 收到消息后回调你的处理函数
69
+ 4. 你的处理函数返回文本或媒体标签
70
+ 5. SDK 自动把消息发回 QQ
71
+
72
+ ## 其他项目接入示例
73
+
74
+ 参考目录:
75
+
76
+ - [examples/use-in-other-project/README.zh.md](/D:/code/qqbot/examples/use-in-other-project/README.zh.md)
77
+ - [examples/use-in-other-project/src/main.ts](/D:/code/qqbot/examples/use-in-other-project/src/main.ts)
@@ -0,0 +1,423 @@
1
+ <div align="center">
2
+
3
+ **简体中文 | [English](README.md)**
4
+
5
+ <img width="120" src="https://img.shields.io/badge/🤖-QQ_Bot-blue?style=for-the-badge" alt="QQ Bot" />
6
+
7
+ # QQ Bot — OpenClaw 渠道插件
8
+
9
+ **让你的 AI 助手接入 QQ — 私聊、群聊、富媒体,一个插件全搞定。**
10
+
11
+ [![npm version](https://img.shields.io/npm/v/@sliverp/qqbot?color=blue&label=npm)](https://www.npmjs.com/package/@sliverp/qqbot)
12
+ [![License](https://img.shields.io/badge/license-MIT-green)](./LICENSE)
13
+ [![QQ Bot](https://img.shields.io/badge/QQ_Bot-API_v2-red)](https://bot.q.qq.com/wiki/)
14
+ [![Platform](https://img.shields.io/badge/platform-OpenClaw-orange)](https://github.com/sliverp/openclaw)
15
+ [![Node.js](https://img.shields.io/badge/Node.js->=18-339933?logo=node.js&logoColor=white)](https://nodejs.org/)
16
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.9-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
17
+
18
+ <br/>
19
+
20
+ 扫描二维码加入群聊,一起交流
21
+
22
+ <img width="316" height="410" alt="QQ 群二维码" src="https://github.com/user-attachments/assets/d079ba89-ecd0-437f-9e66-92319801a325" />
23
+
24
+ </div>
25
+
26
+ ---
27
+
28
+ ## ✨ 功能特性
29
+
30
+ | 功能 | 说明 |
31
+ |------|------|
32
+ | 🔒 **多场景支持** | C2C 私聊、群聊 @消息、频道消息、频道私信 |
33
+ | 🖼️ **富媒体消息** | 支持图片、语音、视频、文件的收发 |
34
+ | 🎙️ **语音能力 (STT/TTS)** | 语音转文字自动转录 & 文字转语音回复 |
35
+ | ⏰ **定时推送** | 支持定时任务触发后主动推送消息 |
36
+ | 🔗 **URL 无限制** | 私聊可直接发送 URL |
37
+ | ⌨️ **输入状态** | 实时显示"Bot 正在输入中…"状态 |
38
+ | 🔄 **热更新** | 支持 npm 方式安装和无缝热更新 |
39
+ | 📝 **Markdown** | 完整支持 Markdown 格式消息 |
40
+ | 🛠️ **原生命令** | 支持 OpenClaw 原生命令 |
41
+
42
+ ---
43
+
44
+ ## 📸 功能展示
45
+
46
+ > **说明:** 本插件仅作为**消息通道**,负责在 QQ 和 OpenClaw 之间传递消息。图片理解、语音转录、AI 画图等能力取决于你配置的 **AI 模型**以及在 OpenClaw 中安装的 **skill**,而非插件本身提供。
47
+
48
+ <details>
49
+ <summary><b>🎙️ 语音消息(STT)</b> — 配置 STT 后,自动将语音转录为文字理解</summary>
50
+
51
+ > **你**:*(发送一段语音)*"明天深圳天气怎么样"
52
+ >
53
+ > **QQBot**:明天(3月7日 周六)深圳的天气预报 🌤️ ...
54
+
55
+ <img width="360" src="docs/images/fc7b2236896cfba3a37c94be5d59ce3e_720.jpg" alt="听语音演示" />
56
+
57
+ </details>
58
+
59
+ <details>
60
+ <summary><b>📄 文件理解</b> — 发文件给 AI,自动识别内容并智能回复</summary>
61
+
62
+ > **你**:*(发送《战争与和平》TXT 文件)*
63
+ >
64
+ > **QQBot**:收到!你上传了列夫·托尔斯泰的《战争与和平》中文版文本。从内容来看,这是第一章的开头……你想让我做什么?
65
+
66
+ <img width="360" src="docs/images/07bff56ab68e03173d2af586eeb3bcee_720.jpg" alt="AI理解用户发送的文件" />
67
+
68
+ </details>
69
+
70
+ <details>
71
+ <summary><b>🖼️ 图片理解</b> — 主模型支持视觉能力时,发图片 AI 也能看懂</summary>
72
+
73
+ > **你**:*(发送一张图片)*
74
+ >
75
+ > **QQBot**:哈哈,好可爱!这是QQ企鹅穿上小龙虾套装吗?🦞🐧 ...
76
+
77
+ <img width="360" src="docs/images/59d421891f813b0d3c0cbe12574b6a72_720.jpg" alt="图片理解演示" />
78
+
79
+ </details>
80
+
81
+ <details>
82
+ <summary><b>🎨 AI 画图</b> — 调用绘图工具生成图片,直接发到对话里</summary>
83
+
84
+ > **你**:画一只猫咪
85
+ >
86
+ > **QQBot**:给你画好了!🐱
87
+
88
+ <img width="360" src="docs/images/4645f2b3a20822b7f8d6664a708529eb_720.jpg" alt="发图片演示" />
89
+
90
+ </details>
91
+
92
+ <details>
93
+ <summary><b>🔊 语音回复(TTS)</b> — AI 把文字变成语音消息发出来</summary>
94
+
95
+ > **你**:用语音讲个笑话
96
+ >
97
+ > **QQBot**:*(发送一条语音消息)*
98
+
99
+ <img width="360" src="docs/images/21dce8bfc553ce23d1bd1b270e9c516c.jpg" alt="发语音演示" />
100
+
101
+ </details>
102
+
103
+ <details>
104
+ <summary><b>📎 文件发送</b> — 生成并发送任意格式文件,最大 20MB</summary>
105
+
106
+ > **你**:战争与和平的第一章截取一下发文件给我
107
+ >
108
+ > **QQBot**:*(发送 .txt 文件)*
109
+
110
+ <img width="360" src="docs/images/17cada70df90185d45a2d6dd36e92f2f_720.jpg" alt="发文件演示" />
111
+
112
+ </details>
113
+
114
+ <details>
115
+ <summary><b>🎬 视频发送</b> — 支持本地文件和公网 URL,大文件自动显示上传进度</summary>
116
+
117
+ > **你**:发一个演示视频给我
118
+ >
119
+ > **QQBot**:*(发送视频)*
120
+
121
+ <img width="360" src="docs/images/85d03b8a216f267ab7b2aee248a18a41_720.jpg" alt="发视频演示" />
122
+
123
+ </details>
124
+
125
+ > 富媒体能力(图片、语音、视频、文件)的完整说明请参阅 [富媒体指南](docs/qqbot-media-guide.md)。
126
+
127
+ ---
128
+
129
+ ## ⭐ Star History
130
+
131
+ <div align="center">
132
+
133
+ [![Star History Chart](https://api.star-history.com/svg?repos=sliverp/qqbot&type=date&legend=top-left)](https://www.star-history.com/#sliverp/qqbot&type=date&legend=top-left)
134
+
135
+ </div>
136
+
137
+ ---
138
+
139
+ ## 🚀 快速开始
140
+
141
+ ### 第一步 — 在 QQ 开放平台创建机器人
142
+
143
+ 1. 前往 [QQ 开放平台](https://q.qq.com/),用**手机 QQ 扫描页面二维码**即可注册/登录。若尚未注册,扫码后系统会自动完成注册并绑定你的 QQ 账号。
144
+
145
+ <img width="3246" height="1886" alt="Clipboard_Screenshot_1772980354" src="https://github.com/user-attachments/assets/d8491859-57e8-47e4-9d39-b21138be54d0" />
146
+
147
+ 2. 手机 QQ 扫码后选择**同意**,即完成注册,进入 QQ 机器人配置页。
148
+ 3. 点击**创建机器人**,即可直接新建一个 QQ 机器人。
149
+
150
+ <img width="1982" height="1316" alt="Clipboard_Screenshot_1772980440" src="https://github.com/user-attachments/assets/3ccb494d-6e4d-462c-9218-b4dfd43a254f" />
151
+
152
+ 4. 在机器人页面中找到 **AppID** 和 **AppSecret**,分别点击右侧**复制**按钮,保存到记事本或备忘录中。**AppSecret 不支持明文保存,离开页面后再查看会强制重置,请务必妥善保存。**
153
+
154
+ <img width="1670" height="1036" alt="Clipboard_Screenshot_1772980413" src="https://github.com/user-attachments/assets/b898d171-5711-4d42-bc07-2de967b119ec" />
155
+
156
+ > 详细图文教程请参阅 [官方指南](https://cloud.tencent.com/developer/article/2626045)。
157
+
158
+ > ⚠️ 机器人创建后会自动出现在你的 QQ 消息列表中,并发送第一条消息。但在完成下面的配置之前,发消息会提示"该机器人去火星了",属于正常现象。
159
+
160
+ ### 第二步 — 安装插件
161
+
162
+ ```bash
163
+ # 通过 OpenClaw CLI 安装(推荐)
164
+ openclaw plugins install @sliverp/qqbot@latest
165
+
166
+ # 或从源码安装
167
+ git clone https://github.com/sliverp/qqbot.git && cd qqbot
168
+ openclaw plugins install .
169
+ ```
170
+
171
+ ### 第三步 — 配置 OpenClaw
172
+
173
+ **方式一:通过 Wizard 配置(推荐)**
174
+
175
+ ```bash
176
+ openclaw channels add --channel qqbot --token "AppID:AppSecret"
177
+ ```
178
+
179
+ **方式二:编辑配置文件**
180
+
181
+ 编辑 `~/.openclaw/openclaw.json`:
182
+
183
+ ```json
184
+ {
185
+ "channels": {
186
+ "qqbot": {
187
+ "enabled": true,
188
+ "appId": "你的 AppID",
189
+ "clientSecret": "你的 AppSecret"
190
+ }
191
+ }
192
+ }
193
+ ```
194
+
195
+ ### 第四步 — 启动与测试
196
+
197
+ ```bash
198
+ openclaw gateway
199
+ ```
200
+
201
+ 打开 QQ,找到你的机器人,发条消息试试!
202
+
203
+ <div align="center">
204
+ <img width="500" alt="聊天演示" src="https://github.com/user-attachments/assets/b2776c8b-de72-4e37-b34d-e8287ce45de1" />
205
+ </div>
206
+
207
+ ---
208
+
209
+ ## 🤖 多账户配置(Multi-Bot)
210
+
211
+ 支持在同一个 OpenClaw 实例下同时运行多个 QQ 机器人。
212
+
213
+ ### 配置方式
214
+
215
+ 编辑 `~/.openclaw/openclaw.json`,在 `channels.qqbot` 下增加 `accounts` 字段:
216
+
217
+ ```json
218
+ {
219
+ "channels": {
220
+ "qqbot": {
221
+ "enabled": true,
222
+ "appId": "111111111",
223
+ "clientSecret": "secret-of-bot-1",
224
+
225
+ "accounts": {
226
+ "bot2": {
227
+ "enabled": true,
228
+ "appId": "222222222",
229
+ "clientSecret": "secret-of-bot-2"
230
+ },
231
+ "bot3": {
232
+ "enabled": true,
233
+ "appId": "333333333",
234
+ "clientSecret": "secret-of-bot-3"
235
+ }
236
+ }
237
+ }
238
+ }
239
+ }
240
+ ```
241
+
242
+ **说明:**
243
+
244
+ - 顶层的 `appId` / `clientSecret` 是**默认账户**(accountId = `"default"`)
245
+ - `accounts` 下的每个 key(如 `bot2`、`bot3`)就是该账户的 `accountId`
246
+ - 每个账户都可以独立配置 `enabled`、`name`、`allowFrom`、`systemPrompt` 等字段
247
+ - 也可以不配顶层默认账户,只在 `accounts` 里配置所有机器人
248
+
249
+ 通过 CLI 添加第二个机器人(如果框架支持 `--account` 参数):
250
+
251
+ ```bash
252
+ openclaw channels add --channel qqbot --account bot2 --token "222222222:secret-of-bot-2"
253
+ ```
254
+
255
+ ### 向指定账户的用户发送消息
256
+
257
+ 使用 `openclaw message send` 发消息时,需要通过 `--account` 参数指定使用哪个机器人发送:
258
+
259
+ ```bash
260
+ # 使用默认机器人发送(不指定 --account 时自动使用 default)
261
+ openclaw message send --channel "qqbot" \
262
+ --target "qqbot:c2c:OPENID" \
263
+ --message "hello from default bot"
264
+
265
+ # 使用 bot2 发送
266
+ openclaw message send --channel "qqbot" \
267
+ --account bot2 \
268
+ --target "qqbot:c2c:OPENID" \
269
+ --message "hello from bot2"
270
+ ```
271
+
272
+ **Target 格式支持:**
273
+
274
+ | 格式 | 说明 |
275
+ |------|------|
276
+ | `qqbot:c2c:OPENID` | 私聊 |
277
+ | `qqbot:group:GROUP_OPENID` | 群聊 |
278
+ | `qqbot:channel:CHANNEL_ID` | 频道 |
279
+
280
+ > ⚠️ **注意**:每个机器人的用户 OpenID 是不同的。机器人 A 收到的用户 OpenID 不能用机器人 B 去发消息,否则会返回 500 错误。必须用对应机器人的 accountId 去给该机器人的用户发消息。
281
+
282
+ ### 工作原理
283
+
284
+ - 启动 `openclaw gateway` 后,所有 `enabled: true` 的账户会同时启动 WebSocket 连接
285
+ - 每个账户独立维护 Token 缓存(基于 `appId` 隔离),互不干扰
286
+ - 接收消息时,日志会带上 `[qqbot:accountId]` 前缀方便排查
287
+
288
+ ---
289
+
290
+ ## 🎙️ 语音能力配置(可选)
291
+
292
+ ### STT(语音转文字)— 自动转录用户发来的语音消息
293
+
294
+ STT 支持两级配置,按优先级查找:
295
+
296
+ | 优先级 | 配置路径 | 作用域 |
297
+ |--------|----------|--------|
298
+ | 1(最高) | `channels.qqbot.stt` | 插件专属 |
299
+ | 2(回退) | `tools.media.audio.models[0]` | 框架级 |
300
+
301
+ ```json
302
+ {
303
+ "channels": {
304
+ "qqbot": {
305
+ "stt": {
306
+ "provider": "your-provider",
307
+ "model": "your-stt-model"
308
+ }
309
+ }
310
+ }
311
+ }
312
+ ```
313
+
314
+ - `provider` — 引用 `models.providers` 中的 key,自动继承 `baseUrl` 和 `apiKey`
315
+ - 设置 `enabled: false` 可禁用
316
+ - 配置后,用户发来的语音消息会自动转换(SILK→WAV)并转录为文字
317
+
318
+ ### TTS(文字转语音)— 机器人发送语音消息
319
+
320
+ | 优先级 | 配置路径 | 作用域 |
321
+ |--------|----------|--------|
322
+ | 1(最高) | `channels.qqbot.tts` | 插件专属 |
323
+ | 2(回退) | `messages.tts` | 框架级 |
324
+
325
+ ```json
326
+ {
327
+ "channels": {
328
+ "qqbot": {
329
+ "tts": {
330
+ "provider": "your-provider",
331
+ "model": "your-tts-model",
332
+ "voice": "your-voice"
333
+ }
334
+ }
335
+ }
336
+ }
337
+ ```
338
+
339
+ - `provider` — 引用 `models.providers` 中的 key,自动继承 `baseUrl` 和 `apiKey`
340
+ - `voice` — 语音音色
341
+ - 设置 `enabled: false` 可禁用(默认:`true`)
342
+ - 配置后,AI 可使用 `<qqvoice>` 标签生成并发送语音消息
343
+
344
+ ---
345
+
346
+ ## 🔄 升级
347
+
348
+ ### 通过 OpenClaw / npm 升级(推荐)
349
+
350
+ > 仅适用于通过 `openclaw plugins install` 安装的场景
351
+
352
+ ```bash
353
+ openclaw plugins upgrade @sliverp/qqbot@latest
354
+ ```
355
+
356
+ ### 通过 npx 升级
357
+
358
+ ```bash
359
+ npx -y @sliverp/qqbot@latest upgrade
360
+ ```
361
+
362
+ ### 通过 upgrade-and-run.sh 一键升级
363
+
364
+ ```bash
365
+ bash ./upgrade-and-run.sh
366
+ ```
367
+
368
+ 不传 `--appid` / `--secret` 参数时,脚本会自动读取 `~/.openclaw/openclaw.json` 中已有的配置。
369
+
370
+ ```bash
371
+ # 首次配置或需要覆盖时
372
+ bash ./upgrade-and-run.sh --appid YOUR_APPID --secret YOUR_SECRET
373
+ ```
374
+
375
+ <details>
376
+ <summary>完整选项</summary>
377
+
378
+ | 选项 | 说明 |
379
+ |------|------|
380
+ | `--appid <id>` | QQ 机器人 AppID |
381
+ | `--secret <secret>` | QQ 机器人 AppSecret |
382
+ | `--markdown <yes\|no>` | 是否启用 Markdown 消息格式(默认: no) |
383
+ | `-h, --help` | 显示帮助 |
384
+
385
+ 也支持环境变量:`QQBOT_APPID`、`QQBOT_SECRET`、`QQBOT_TOKEN`(AppID:Secret)。
386
+
387
+ </details>
388
+
389
+ ### 通过 pull-latest.sh(Git 源码更新)
390
+
391
+ ```bash
392
+ bash ./pull-latest.sh
393
+ ```
394
+
395
+ <details>
396
+ <summary>选项</summary>
397
+
398
+ ```bash
399
+ bash ./pull-latest.sh --branch main # 指定分支(默认 main)
400
+ bash ./pull-latest.sh --force # 跳过交互,强制更新
401
+ bash ./pull-latest.sh --repo <git-url> # 使用其他仓库地址
402
+ ```
403
+
404
+ </details>
405
+
406
+ ### 从源码升级(手动)
407
+
408
+ ```bash
409
+ git clone https://github.com/sliverp/qqbot.git && cd qqbot
410
+ bash ./scripts/upgrade.sh
411
+ openclaw plugins install .
412
+ openclaw channels add --channel qqbot --token "AppID:AppSecret"
413
+ openclaw gateway restart
414
+ ```
415
+
416
+ ---
417
+
418
+ ## 📚 文档
419
+
420
+ - [富媒体指南](docs/qqbot-media-guide.md) — 图片、语音、视频、文件
421
+ - [命令参考](docs/commands.md) — OpenClaw CLI 常用命令
422
+ - [更新日志](docs/changelog/) — 各版本变更记录([最新: 1.5.4](docs/changelog/1.5.4.md))
423
+