mozi-bot 1.1.1 → 1.2.0

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 (50) hide show
  1. package/README.md +340 -219
  2. package/dist/agents/agent.d.ts.map +1 -1
  3. package/dist/agents/agent.js +28 -22
  4. package/dist/agents/agent.js.map +1 -1
  5. package/dist/channels/index.d.ts +4 -0
  6. package/dist/channels/index.d.ts.map +1 -1
  7. package/dist/channels/index.js +4 -0
  8. package/dist/channels/index.js.map +1 -1
  9. package/dist/channels/qq/api.d.ts +37 -0
  10. package/dist/channels/qq/api.d.ts.map +1 -0
  11. package/dist/channels/qq/api.js +145 -0
  12. package/dist/channels/qq/api.js.map +1 -0
  13. package/dist/channels/qq/index.d.ts +36 -0
  14. package/dist/channels/qq/index.d.ts.map +1 -0
  15. package/dist/channels/qq/index.js +145 -0
  16. package/dist/channels/qq/index.js.map +1 -0
  17. package/dist/channels/qq/websocket.d.ts +67 -0
  18. package/dist/channels/qq/websocket.d.ts.map +1 -0
  19. package/dist/channels/qq/websocket.js +372 -0
  20. package/dist/channels/qq/websocket.js.map +1 -0
  21. package/dist/channels/wecom/api.d.ts +30 -0
  22. package/dist/channels/wecom/api.d.ts.map +1 -0
  23. package/dist/channels/wecom/api.js +98 -0
  24. package/dist/channels/wecom/api.js.map +1 -0
  25. package/dist/channels/wecom/crypto.d.ts +25 -0
  26. package/dist/channels/wecom/crypto.d.ts.map +1 -0
  27. package/dist/channels/wecom/crypto.js +74 -0
  28. package/dist/channels/wecom/crypto.js.map +1 -0
  29. package/dist/channels/wecom/events.d.ts +34 -0
  30. package/dist/channels/wecom/events.d.ts.map +1 -0
  31. package/dist/channels/wecom/events.js +127 -0
  32. package/dist/channels/wecom/events.js.map +1 -0
  33. package/dist/channels/wecom/index.d.ts +39 -0
  34. package/dist/channels/wecom/index.d.ts.map +1 -0
  35. package/dist/channels/wecom/index.js +184 -0
  36. package/dist/channels/wecom/index.js.map +1 -0
  37. package/dist/cli/index.js +21 -6
  38. package/dist/cli/index.js.map +1 -1
  39. package/dist/config/index.d.ts +94 -0
  40. package/dist/config/index.d.ts.map +1 -1
  41. package/dist/config/index.js +49 -2
  42. package/dist/config/index.js.map +1 -1
  43. package/dist/gateway/server.d.ts +2 -0
  44. package/dist/gateway/server.d.ts.map +1 -1
  45. package/dist/gateway/server.js +47 -0
  46. package/dist/gateway/server.js.map +1 -1
  47. package/dist/types/index.d.ts +20 -1
  48. package/dist/types/index.d.ts.map +1 -1
  49. package/dist/types/index.js.map +1 -1
  50. package/package.json +4 -2
package/README.md CHANGED
@@ -2,47 +2,148 @@
2
2
 
3
3
  **支持国产大模型和国产通讯软件的智能助手框架**
4
4
 
5
- Mozi 是一个轻量级的 AI 助手框架,专注于国产生态。它提供统一的接口对接多种国产 AI 模型(DeepSeek、Qwen、Kimi 等),支持 OpenAI Function Calling,并能在飞书、钉钉、WebChat 等平台上运行。
5
+ Mozi 是一个轻量级的 AI 助手框架,专注于国产生态。它提供统一的接口对接多种国产 AI 模型(DeepSeek、Qwen、Kimi 等),支持 OpenAI Function Calling,并能在飞书、钉钉等平台上运行。
6
6
 
7
- ## 与 Moltbot 对比
7
+ ## 核心特性
8
+
9
+ - **多模型支持** — DeepSeek、DashScope (Qwen)、智谱AI、Kimi、阶跃星辰、MiniMax,以及 OpenAI/Anthropic 兼容格式
10
+ - **多平台通道** — 飞书、钉钉、QQ,统一的消息处理接口
11
+ - **Function Calling** — 原生支持 OpenAI tools/tool_choice 参数
12
+ - **17 内置工具** — 文件读写、Bash 执行、代码搜索、网页获取、图像分析、浏览器自动化等
13
+ - **会话管理** — 上下文压缩、会话持久化、多轮对话
14
+ - **可扩展** — 插件系统、Hook 事件、自定义工具、子 Agent
15
+
16
+ ## 为什么选择 Mozi?
8
17
 
9
- Mozi 的架构设计参考了 [Moltbot](https://github.com/moltbot/moltbot),但专注于不同的使用场景。
18
+ Mozi 的架构设计参考了 [Moltbot](https://github.com/moltbot/moltbot),但专注于不同的使用场景:
10
19
 
11
20
  | 特性 | Mozi | Moltbot |
12
21
  |------|------|---------|
13
22
  | **定位** | 国产生态优先的轻量框架 | 全功能个人 AI 助手 |
14
23
  | **代码量** | ~16,000 行 (64 文件) | ~516,000 行 (3,137 文件) |
15
- | **国产模型** | DeepSeek、Qwen、Kimi、阶跃星辰、MiniMax | 仅 Anthropic、OpenAI |
16
- | **国产通讯** | 飞书、钉钉原生支持 | WhatsApp、Telegram、Slack 等海外平台 |
17
- | **Node.js 版本** | 18 | 22 |
18
- | **资源占用** | 轻量 | 较重(菜单栏应用、语音唤醒等) |
24
+ | **国产模型** | DeepSeek、Qwen、Kimi 等 7+ 家 | 仅 Anthropic、OpenAI |
25
+ | **国产通讯** | 飞书、钉钉、QQ 原生支持 | WhatsApp、Telegram、Slack |
26
+ | **Node.js 版本** | >= 18 | >= 22 |
19
27
  | **适用场景** | 企业内部机器人、国内团队协作 | 个人多设备助手、海外平台集成 |
20
28
 
21
29
  > **Mozi 用 3% 的代码量实现了核心功能**,专注简洁高效,易于理解和二次开发。
22
30
 
23
- ### 选择 Mozi 的理由
31
+ ## 学习 Agent 原理
32
+
33
+ 如果你想了解 AI Agent 的工作原理,Mozi 是一个很好的学习项目。相比动辄几十万行代码的大型框架,Mozi 只有约 16,000 行代码,但实现了完整的 Agent 核心功能:
34
+
35
+ - **消息循环** — 用户输入 → LLM 推理 → 工具调用 → 结果反馈
36
+ - **上下文管理** — 会话历史、Token 压缩、多轮对话
37
+ - **工具系统** — 函数定义、参数校验、结果处理
38
+ - **流式输出** — SSE/WebSocket 实时响应
39
+ - **失败重试** — 模型调用失败自动切换备选模型
40
+
41
+ 代码结构清晰,注释完善,适合阅读源码学习 Agent 架构设计。
42
+
43
+ ## 架构设计
44
+
45
+ ```mermaid
46
+ flowchart TB
47
+ subgraph Input["📥 输入层"]
48
+ Feishu["🔵 飞书\nWebSocket 长连接"]
49
+ Dingtalk["🟢 钉钉\nStream 长连接"]
50
+ QQ["🟣 QQ\nWebSocket 长连接"]
51
+ WebChat["🟡 WebChat\nHTTP + WebSocket"]
52
+ end
53
+
54
+ subgraph Server["🚀 服务层"]
55
+ Gateway["Gateway 网关\nHTTP/WebSocket 路由"]
56
+ end
57
+
58
+ subgraph Core["⚙️ 核心层"]
59
+ Agent["Agent 引擎"]
60
+
61
+ subgraph AgentInner[" "]
62
+ MsgLoop["📨 消息循环\nUser → LLM → Tool → Result"]
63
+ CtxMgr["📚 上下文管理\n历史压缩 / Token 控制"]
64
+ Session["💾 会话存储\nMemory / File"]
65
+ end
66
+ end
67
+
68
+ subgraph External["🔗 外部依赖"]
69
+ subgraph Providers["模型提供商"]
70
+ P1["DeepSeek"]
71
+ P2["DashScope"]
72
+ P3["智谱AI"]
73
+ P4["Kimi"]
74
+ P5["OpenAI"]
75
+ P6["Anthropic"]
76
+ end
77
+
78
+ subgraph Tools["工具系统"]
79
+ T1["📁 文件操作\nread/write/edit/glob/grep"]
80
+ T2["⌨️ Bash 执行\n命令行 / 进程管理"]
81
+ T3["🌐 网络请求\nsearch/fetch"]
82
+ T4["🖼️ 多媒体\n图像分析 / 浏览器"]
83
+ T5["🤖 子 Agent\n复杂任务分解"]
84
+ end
85
+ end
86
+
87
+ Feishu --> Gateway
88
+ Dingtalk --> Gateway
89
+ QQ --> Gateway
90
+ WebChat --> Gateway
91
+ Gateway --> Agent
92
+ Agent --> MsgLoop
93
+ MsgLoop <--> CtxMgr
94
+ MsgLoop <--> Session
95
+ MsgLoop <-->|"调用模型"| Providers
96
+ MsgLoop <-->|"执行工具"| Tools
97
+ ```
24
98
 
25
- - **国产模型一站式支持** — 无需翻墙,直接对接 DeepSeek、通义千问等国产大模型
26
- - **飞书/钉钉开箱即用** — 原生支持国内主流办公平台,配置简单
27
- - **轻量快速** — 专注核心功能,无冗余依赖,启动快、资源占用少
28
- - **低门槛** — 一个 API Key + 三行配置即可运行,适合快速验证和部署
29
- - **企业友好** — 适合国内企业内网环境,无外部依赖
99
+ ### 消息处理流程
30
100
 
31
- ### 选择 Moltbot 的理由
101
+ ```mermaid
102
+ flowchart TD
103
+ Start([用户发送消息]) --> Channel[Channel 接收]
104
+ Channel --> Gateway[Gateway 路由]
105
+ Gateway --> LoadCtx[加载会话上下文]
32
106
 
33
- - 需要 WhatsApp、Telegram、Discord 等海外平台支持
34
- - 需要语音唤醒、Live Canvas 等高级交互功能
35
- - 需要多设备同步、macOS/iOS 深度集成
36
- - 个人使用场景,设备控制需求
107
+ LoadCtx --> BuildCtx[构建 LLM 请求]
108
+ BuildCtx --> |系统提示词<br/>历史消息<br/>工具列表| CallLLM[调用 LLM]
37
109
 
38
- ## 核心特性
110
+ CallLLM --> Check{返回类型?}
39
111
 
40
- - **多模型支持** DeepSeek、ModelScope (Qwen)、Kimi、阶跃星辰、MiniMax,以及 OpenAI/Anthropic 兼容格式
41
- - **多平台通道** WebChat、飞书、钉钉,统一的消息处理接口
42
- - **Function Calling** — 原生支持 OpenAI tools/tool_choice 参数
43
- - **15+ 内置工具** — 文件读写、Bash 执行、代码搜索、网页获取等
44
- - **会话管理** 上下文压缩、会话持久化、Memory 向量记忆
45
- - **可扩展** — 插件系统、Hook 事件、自定义工具
112
+ Check --> |纯文本| Response[返回响应]
113
+ Check --> |工具调用| ExecTool[执行工具]
114
+
115
+ ExecTool --> ToolResult[工具返回结果]
116
+ ToolResult --> |加入上下文| CallLLM
117
+
118
+ Response --> SaveCtx[保存会话]
119
+ SaveCtx --> Send[Channel 发送]
120
+ Send --> End([用户收到回复])
121
+
122
+ style Start fill:#e1f5fe
123
+ style End fill:#e8f5e9
124
+ style CallLLM fill:#fff3e0
125
+ style ExecTool fill:#fce4ec
126
+ ```
127
+
128
+ ### 核心模块
129
+
130
+ | 模块 | 目录 | 职责 |
131
+ |------|------|------|
132
+ | **Agent** | `src/agents/` | 核心消息循环、上下文压缩、会话管理、模型失败重试 |
133
+ | **Providers** | `src/providers/` | 统一的模型调用接口,支持 OpenAI/Anthropic 兼容格式 |
134
+ | **Tools** | `src/tools/` | 工具注册、参数校验、执行引擎,支持自定义扩展 |
135
+ | **Channels** | `src/channels/` | 通道适配器,统一消息格式,支持长连接和 Webhook |
136
+ | **Sessions** | `src/sessions/` | 会话持久化,支持内存/文件存储,Transcript 记录 |
137
+ | **Gateway** | `src/gateway/` | HTTP/WebSocket 服务,路由分发 |
138
+
139
+ ### 上下文压缩策略
140
+
141
+ 当对话历史超过 Token 限制时,Mozi 使用智能压缩:
142
+
143
+ 1. **保留策略** — 始终保留系统提示词和最近 N 轮对话
144
+ 2. **摘要压缩** — 将早期对话压缩为摘要,保留关键信息
145
+ 3. **工具结果裁剪** — 截断过长的工具返回结果
146
+ 4. **配对验证** — 确保 tool_call 和 tool_result 成对出现
46
147
 
47
148
  ## 快速开始
48
149
 
@@ -54,7 +155,7 @@ Mozi 的架构设计参考了 [Moltbot](https://github.com/moltbot/moltbot),
54
155
  ### 1. 安装
55
156
 
56
157
  ```bash
57
- # 一键安装(推荐)
158
+ # 全局安装(推荐)
58
159
  npm install -g mozi-bot
59
160
 
60
161
  # 或者克隆项目开发
@@ -70,38 +171,20 @@ cd mozi && npm install && npm run build
70
171
  mozi onboard
71
172
  ```
72
173
 
73
- 向导支持配置:
174
+ 向导会引导你完成以下配置:
74
175
  - **国产模型** — DeepSeek、智谱AI、DashScope、Kimi、阶跃星辰、MiniMax、ModelScope
75
176
  - **自定义 OpenAI 兼容接口** — 支持任意 OpenAI API 格式的服务(如 vLLM、Ollama)
76
177
  - **自定义 Anthropic 兼容接口** — 支持任意 Claude API 格式的服务
77
- - **通讯平台** — 飞书、钉钉
78
-
79
- 自定义接口支持配置 API Endpoint、API Key、模型列表(包含上下文窗口、最大 Token 等参数)。
178
+ - **通讯平台** — 飞书、钉钉、QQ
80
179
 
81
180
  配置文件将保存到 `~/.mozi/config.local.json5`。
82
181
 
83
- 或者使用环境变量(简单场景):
182
+ 也可以直接使用环境变量(快速体验):
84
183
 
85
184
  ```bash
86
185
  export DEEPSEEK_API_KEY=sk-your-key
87
186
  ```
88
187
 
89
- 也可以手动创建配置文件 `~/.mozi/config.local.json5`:
90
-
91
- ```json5
92
- {
93
- providers: {
94
- deepseek: {
95
- apiKey: "sk-your-deepseek-key"
96
- }
97
- },
98
- agent: {
99
- defaultProvider: "deepseek",
100
- defaultModel: "deepseek-chat"
101
- }
102
- }
103
- ```
104
-
105
188
  ### 3. 启动
106
189
 
107
190
  ```bash
@@ -117,14 +200,6 @@ npm start -- start --web-only
117
200
 
118
201
  打开浏览器访问 `http://localhost:3000` 即可开始对话。
119
202
 
120
- ### 4. 连接通讯平台(可选)
121
-
122
- 如需连接飞书或钉钉,在 `mozi onboard` 中配置或手动添加配置后,启动完整服务:
123
-
124
- ```bash
125
- mozi start
126
- ```
127
-
128
203
  ## 支持的模型提供商
129
204
 
130
205
  ### 国产模型
@@ -156,45 +231,13 @@ mozi start
156
231
 
157
232
  ### 自定义接口
158
233
 
159
- 支持配置任意 OpenAI/Anthropic 兼容的 API 接口,详见「模型提供商配置」章节。
160
-
161
- ## 配置说明
162
-
163
- 支持 `config.local.json5`、`config.json5`、`config.yaml` 等格式,优先级从高到低。
164
-
165
- ### 模型提供商配置
166
-
167
- 所有内置提供商都支持自定义模型配置:
234
+ 支持配置任意 OpenAIAnthropic 兼容的 API 接口。通过 `mozi onboard` 向导配置,或手动添加到配置文件:
168
235
 
169
236
  ```json5
170
237
  {
171
238
  providers: {
172
- // 内置提供商 - 直接配置 apiKey 即可使用预设模型
173
- deepseek: {
174
- apiKey: "sk-xxx"
175
- },
176
-
177
- // 内置提供商 + 自定义模型列表
178
- dashscope: {
179
- apiKey: "sk-xxx",
180
- models: [
181
- {
182
- id: "qwen-max-latest",
183
- name: "通义千问 Max",
184
- contextWindow: 32768,
185
- maxTokens: 8192
186
- },
187
- {
188
- id: "qwen-plus-latest",
189
- name: "通义千问 Plus",
190
- contextWindow: 131072,
191
- maxTokens: 8192
192
- }
193
- ]
194
- },
195
-
196
- // 自定义 OpenAI 兼容接口
197
- "custom-provider": {
239
+ // 自定义 OpenAI 兼容接口(如 vLLM、LiteLLM 等)
240
+ "custom-openai": {
198
241
  id: "my-provider",
199
242
  name: "My Provider",
200
243
  baseUrl: "https://api.example.com/v1",
@@ -209,73 +252,230 @@ mozi start
209
252
  supportsTools: true
210
253
  }
211
254
  ]
255
+ },
256
+
257
+ // 自定义 Anthropic 兼容接口
258
+ "custom-anthropic": {
259
+ id: "my-anthropic",
260
+ name: "My Anthropic",
261
+ baseUrl: "https://api.example.com",
262
+ apiKey: "xxx",
263
+ apiVersion: "2023-06-01",
264
+ models: [
265
+ {
266
+ id: "claude-3-5-sonnet",
267
+ name: "Claude 3.5 Sonnet",
268
+ contextWindow: 200000,
269
+ maxTokens: 8192
270
+ }
271
+ ]
212
272
  }
213
273
  }
214
274
  }
215
275
  ```
216
276
 
217
- ### 通讯平台配置
277
+ ## 通讯平台接入
218
278
 
219
- 飞书和钉钉都支持两种连接模式:
279
+ 飞书、钉钉和 QQ 都支持长连接模式:
220
280
 
221
281
  | 模式 | 说明 | 适用场景 |
222
282
  |------|------|----------|
223
283
  | **长连接(默认)** | WebSocket/Stream 主动连接,无需公网 IP | 内网部署、本地开发 |
224
284
  | Webhook | 被动接收回调,需要公网可访问地址 | 公网服务器部署 |
225
285
 
286
+ > **推荐使用长连接模式**:无需公网 IP,无需配置回调地址,启动即可接收消息。
287
+
288
+ ### 飞书
289
+
290
+ #### 1. 创建应用
291
+
292
+ 1. 登录 [飞书开放平台](https://open.feishu.cn/),创建企业自建应用
293
+ 2. 获取 App ID 和 App Secret
294
+ 3. 在应用管理页左侧导航栏,找到「应用能力」,启用「机器人」能力
295
+
296
+ #### 2. 事件配置
297
+
298
+ 1. 在应用管理页左侧导航栏,找到「事件与回调」,点击进入
299
+ 2. 订阅方式选择「长连接」,点击「保存」
300
+ > ⚠️ 如果提示"未建立长连接",需要先完成「Mozi 配置」并启动服务(`mozi start`),再回来保存长连接
301
+ 3. 点击「添加事件」,在弹出列表中选择「消息与群组」分类,勾选「接收消息」(`im.message.receive_v1`),点击「确定」
302
+
303
+ #### 3. 权限配置
304
+
305
+ 1. 在应用管理页左侧导航栏,找到「权限管理」,点击进入
306
+ 2. 点击「批量导入权限」按钮,将以下 JSON 粘贴到输入框中,点击「导入」:
307
+
308
+ ```json
309
+ {
310
+ "scopes": {
311
+ "tenant": [
312
+ "contact:user.base:readonly",
313
+ "im:chat",
314
+ "im:chat:read",
315
+ "im:chat:update",
316
+ "im:message",
317
+ "im:message.group_at_msg:readonly",
318
+ "im:message.p2p_msg:readonly",
319
+ "im:message:send_as_bot",
320
+ "im:resource"
321
+ ],
322
+ "user": []
323
+ }
324
+ }
325
+ ```
326
+
327
+ 3. 页面显示「导入成功」即为完成
328
+
329
+ #### 4. 发布应用
330
+
331
+ 1. 在应用管理页左侧导航栏,找到「版本管理与发布」
332
+ 2. 点击右上角「新建版本」,填写版本号与描述
333
+ 3. 保存并发布,等待审核通过
334
+
335
+ #### 5. Mozi 配置
336
+
226
337
  ```json5
227
338
  {
228
339
  channels: {
229
- // 飞书配置
230
340
  feishu: {
231
341
  appId: "cli_xxx",
232
342
  appSecret: "xxx",
233
- mode: "websocket" // "websocket"(默认)或 "webhook"
234
- },
343
+ mode: "websocket" // 默认值,可省略
344
+ }
345
+ }
346
+ }
347
+ ```
348
+
349
+ > Webhook 模式:将步骤 2 的订阅方式改为 HTTP,配置回调地址为 `http://your-server:3000/webhook/feishu`,并设置 `mode: "webhook"`。
235
350
 
236
- // 钉钉配置
351
+ ### 钉钉
352
+
353
+ 1. 登录 [钉钉开放平台](https://open.dingtalk.com/),创建企业内部应用
354
+ 2. 获取 AppKey 和 AppSecret
355
+ 3. 添加「机器人」能力
356
+ 4. 在机器人配置页面,消息接收模式选择「Stream 模式」
357
+ 5. 配置完成,启动服务即可
358
+
359
+ ```json5
360
+ {
361
+ channels: {
237
362
  dingtalk: {
238
363
  appKey: "xxx",
239
364
  appSecret: "xxx",
240
- mode: "stream" // "stream"(默认)或 "webhook"
365
+ mode: "stream" // 默认值,可省略
241
366
  }
242
367
  }
243
368
  }
244
369
  ```
245
370
 
246
- > **推荐使用长连接模式**:无需公网 IP,无需配置回调地址,启动即可接收消息。
371
+ > Webhook 模式:将步骤 4 改为 HTTP 模式,配置消息接收地址为 `http://your-server:3000/webhook/dingtalk`,并设置 `mode: "webhook"`。
372
+
373
+ ### QQ
374
+
375
+ #### 1. 注册并创建应用
376
+
377
+ 1. 访问 [QQ 开放平台](https://q.qq.com/#/apps) 并完成注册
378
+ 2. 点击「创建机器人」,填写机器人信息
379
+ > 个人使用无需企业资质,可选择「指定用户、指定群聊可访问」
380
+
381
+ #### 2. 获取凭证
382
+
383
+ 1. 点击机器人头像进入管理界面
384
+ 2. 在「开发设置」页面获取 App ID 和 App Secret
385
+ > 管理页面地址:https://q.qq.com/qqbot/#/developer/developer-setting
386
+
387
+ #### 3. 配置 IP 白名单(重要)
247
388
 
248
- ### 完整配置示例
389
+ 1. 在「开发设置」页面找到「IP 白名单」
390
+ 2. 添加服务器的公网 IP 地址
391
+ ```bash
392
+ # 获取服务器公网 IP
393
+ curl -s ip.sb
394
+ ```
395
+ > 未配置白名单会导致连接失败,提示 "接口访问源IP不在白名单"
396
+
397
+ #### 4. 配置沙箱(可选)
398
+
399
+ 正式上线前,机器人只能在沙箱范围内使用:
400
+
401
+ 1. 访问 [沙箱配置页面](https://q.qq.com/qqbot/#/developer/sandbox)
402
+ 2. 添加测试用户或测试群
403
+
404
+ #### 5. Mozi 配置
249
405
 
250
406
  ```json5
251
407
  {
252
- // 模型提供商配置
408
+ channels: {
409
+ qq: {
410
+ appId: "your-app-id",
411
+ clientSecret: "your-app-secret",
412
+ sandbox: false // 沙箱环境设为 true
413
+ }
414
+ }
415
+ }
416
+ ```
417
+
418
+ 环境变量方式:
419
+
420
+ ```bash
421
+ export QQ_APP_ID=your-app-id
422
+ export QQ_CLIENT_SECRET=your-app-secret
423
+ export QQ_SANDBOX=false # 可选,默认 false
424
+ ```
425
+
426
+ #### 6. 添加机器人
427
+
428
+ 1. 在机器人管理页面,扫描「添加成员」旁边的二维码
429
+ 2. 将机器人添加到聊天界面或拉入群聊
430
+
431
+ ## 配置参考
432
+
433
+ 配置文件支持 `config.local.json5`、`config.json5`、`config.yaml` 等格式,优先级从高到低。存放在 `~/.mozi/` 目录下。
434
+
435
+ <details>
436
+ <summary>完整配置示例</summary>
437
+
438
+ ```json5
439
+ {
440
+ // 模型提供商
253
441
  providers: {
254
442
  deepseek: {
255
443
  apiKey: "sk-xxx"
256
444
  },
257
445
  dashscope: {
258
- apiKey: "sk-xxx" // 阿里云灵积 API Key
446
+ apiKey: "sk-xxx",
447
+ // 可选:自定义模型列表(覆盖预设)
448
+ models: [
449
+ {
450
+ id: "qwen-max-latest",
451
+ name: "通义千问 Max",
452
+ contextWindow: 32768,
453
+ maxTokens: 8192
454
+ }
455
+ ]
259
456
  },
260
457
  zhipu: {
261
- apiKey: "xxx" // 智谱 API Key
458
+ apiKey: "xxx"
262
459
  },
263
460
  modelscope: {
264
461
  apiKey: "ms-xxx"
265
462
  }
266
463
  },
267
464
 
268
- // 通讯平台配置(长连接模式,无需公网)
465
+ // 通讯平台(长连接模式,无需公网)
269
466
  channels: {
270
467
  feishu: {
271
468
  appId: "cli_xxx",
272
- appSecret: "xxx",
273
- mode: "websocket" // 默认值,可省略
469
+ appSecret: "xxx"
274
470
  },
275
471
  dingtalk: {
276
472
  appKey: "xxx",
277
- appSecret: "xxx",
278
- mode: "stream" // 默认值,可省略
473
+ appSecret: "xxx"
474
+ },
475
+ qq: {
476
+ appId: "xxx",
477
+ clientSecret: "xxx",
478
+ sandbox: false // 沙箱环境设为 true
279
479
  }
280
480
  },
281
481
 
@@ -301,6 +501,8 @@ mozi start
301
501
  }
302
502
  ```
303
503
 
504
+ </details>
505
+
304
506
  ## 内置工具
305
507
 
306
508
  | 类别 | 工具 | 说明 |
@@ -316,119 +518,34 @@ mozi start
316
518
  | | `process` | 管理后台进程 |
317
519
  | 网络 | `web_search` | 网络搜索 |
318
520
  | | `web_fetch` | 获取网页内容 |
319
- | 其他 | `current_time` | 获取当前时间 |
521
+ | 多媒体 | `image_analyze` | 图像分析(需要视觉模型) |
522
+ | | `browser` | 浏览器自动化(需安装 Playwright) |
523
+ | 系统 | `current_time` | 获取当前时间 |
320
524
  | | `calculator` | 数学计算 |
321
-
322
- ## 平台配置
323
-
324
- ### 飞书
325
-
326
- #### 长连接模式(推荐)
327
-
328
- 无需公网 IP,适合内网部署和本地开发:
329
-
330
- 1. 登录 [飞书开放平台](https://open.feishu.cn/),创建企业自建应用
331
- 2. 获取 App ID 和 App Secret
332
- 3. 启用「机器人」能力
333
- 4. 添加权限:`im:message`、`im:message.group_at_msg`
334
- 5. 进入「事件订阅」,将订阅方式设置为「使用长连接接收事件」
335
- 6. 添加事件:`im.message.receive_v1`(接收消息)
336
- 7. 配置完成,启动服务即可
337
-
338
- ```json5
339
- {
340
- channels: {
341
- feishu: {
342
- appId: "cli_xxx",
343
- appSecret: "xxx"
344
- // mode: "websocket" 是默认值,可省略
345
- }
346
- }
347
- }
348
- ```
349
-
350
- #### Webhook 模式
351
-
352
- 需要公网可访问地址:
353
-
354
- 1. 完成上述步骤 1-4
355
- 2. 配置事件订阅地址:`http://your-server:3000/webhook/feishu`
356
- 3. 订阅事件:`im.message.receive_v1`
357
-
358
- ```json5
359
- {
360
- channels: {
361
- feishu: {
362
- appId: "cli_xxx",
363
- appSecret: "xxx",
364
- mode: "webhook"
365
- }
366
- }
367
- }
368
- ```
369
-
370
- ### 钉钉
371
-
372
- #### 长连接模式(推荐)
373
-
374
- 无需公网 IP,使用官方 Stream SDK:
375
-
376
- 1. 登录 [钉钉开放平台](https://open.dingtalk.com/),创建企业内部应用
377
- 2. 获取 AppKey 和 AppSecret
378
- 3. 添加「机器人」能力
379
- 4. 在机器人配置页面,消息接收模式选择「Stream 模式」
380
- 5. 配置完成,启动服务即可
381
-
382
- ```json5
383
- {
384
- channels: {
385
- dingtalk: {
386
- appKey: "xxx",
387
- appSecret: "xxx"
388
- // mode: "stream" 是默认值,可省略
389
- }
390
- }
391
- }
392
- ```
393
-
394
- #### Webhook 模式
395
-
396
- 需要公网可访问地址:
397
-
398
- 1. 完成上述步骤 1-3
399
- 2. 配置消息接收地址:`http://your-server:3000/webhook/dingtalk`
400
-
401
- ```json5
402
- {
403
- channels: {
404
- dingtalk: {
405
- appKey: "xxx",
406
- appSecret: "xxx",
407
- mode: "webhook"
408
- }
409
- }
410
- }
411
- ```
525
+ | | `delay` | 延时等待 |
526
+ | Agent | `subagent` | 创建子 Agent 执行复杂任务 |
412
527
 
413
528
  ## CLI 命令
414
529
 
415
530
  ```bash
531
+ # 配置
532
+ mozi onboard # 配置向导(支持国产模型/自定义接口)
533
+ mozi check # 检查配置
534
+ mozi models # 列出可用模型
535
+
416
536
  # 启动服务
417
537
  mozi start # 完整服务(含飞书/钉钉)
418
538
  mozi start --web-only # 仅 WebChat
419
539
  mozi start --port 8080 # 指定端口
420
540
 
421
- # 查看日志
541
+ # 聊天
542
+ mozi chat # 命令行聊天
543
+
544
+ # 日志
422
545
  mozi logs # 查看最新日志(默认 50 行)
423
546
  mozi logs -n 100 # 查看最新 100 行
424
547
  mozi logs -f # 实时跟踪日志(类似 tail -f)
425
548
  mozi logs --level error # 只显示错误日志
426
-
427
- # 其他命令
428
- mozi onboard # 配置向导(支持国产模型/自定义接口)
429
- mozi check # 检查配置
430
- mozi models # 列出可用模型
431
- mozi chat # 命令行聊天
432
549
  ```
433
550
 
434
551
  > 日志文件存储在 `~/.mozi/logs/` 目录下,按日期自动轮转。
@@ -437,20 +554,24 @@ mozi chat # 命令行聊天
437
554
 
438
555
  ```
439
556
  src/
440
- ├── agents/ # Agent 核心(会话、上下文压缩)
557
+ ├── agents/ # Agent 核心(消息循环、上下文压缩、会话管理)
441
558
  ├── channels/ # 通道适配器(飞书、钉钉)
442
- ├── providers/ # 模型提供商
443
- ├── tools/ # 内置工具
559
+ ├── providers/ # 模型提供商(统一接口)
560
+ ├── tools/ # 内置工具(文件、Bash、网络等)
561
+ ├── sessions/ # 会话存储(内存、文件)
444
562
  ├── web/ # WebChat 前端
445
563
  ├── config/ # 配置加载
446
- ├── gateway/ # HTTP 网关
447
- └── types/ # 类型定义
564
+ ├── gateway/ # HTTP/WebSocket 网关
565
+ ├── cli/ # CLI 命令行工具
566
+ ├── hooks/ # Hook 事件系统
567
+ ├── utils/ # 工具函数
568
+ └── types/ # TypeScript 类型定义
448
569
  ```
449
570
 
450
571
  ## API 使用
451
572
 
452
573
  ```typescript
453
- import { loadConfig, initializeProviders, getProvider } from "mozi";
574
+ import { loadConfig, initializeProviders, getProvider } from "mozi-bot";
454
575
 
455
576
  const config = loadConfig();
456
577
  initializeProviders(config);
@@ -464,23 +585,23 @@ const response = await provider.chat({
464
585
  console.log(response.content);
465
586
  ```
466
587
 
467
- ## Star History
468
-
469
- [![Star History Chart](https://api.star-history.com/svg?repos=King-Chau/mozi&type=Date)](https://star-history.com/#King-Chau/mozi&Date)
470
-
471
588
  ## 开发
472
589
 
473
590
  ```bash
474
591
  # 开发模式(自动重启)
475
592
  npm run dev -- start --web-only
476
593
 
477
- # 类型检查
478
- npm run typecheck
479
-
480
594
  # 构建
481
595
  npm run build
596
+
597
+ # 测试
598
+ npm test
482
599
  ```
483
600
 
601
+ ## Star History
602
+
603
+ [![Star History Chart](https://api.star-history.com/svg?repos=King-Chau/mozi&type=Date)](https://star-history.com/#King-Chau/mozi&Date)
604
+
484
605
  ## License
485
606
 
486
607
  Apache 2.0