@z-qinghui/migpt-claw 1.0.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.
- package/LICENSE +21 -0
- package/README.md +690 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/setup-entry.d.ts +3 -0
- package/dist/setup-entry.js +7 -0
- package/dist/setup-entry.js.map +1 -0
- package/dist/src/channel.d.ts +10 -0
- package/dist/src/channel.js +444 -0
- package/dist/src/channel.js.map +1 -0
- package/dist/src/config.d.ts +125 -0
- package/dist/src/config.js +146 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/message.d.ts +51 -0
- package/dist/src/message.js +145 -0
- package/dist/src/message.js.map +1 -0
- package/dist/src/mi/account.d.ts +5 -0
- package/dist/src/mi/account.js +162 -0
- package/dist/src/mi/account.js.map +1 -0
- package/dist/src/mi/common.d.ts +15 -0
- package/dist/src/mi/common.js +80 -0
- package/dist/src/mi/common.js.map +1 -0
- package/dist/src/mi/index.d.ts +4 -0
- package/dist/src/mi/index.js +10 -0
- package/dist/src/mi/index.js.map +1 -0
- package/dist/src/mi/mina.d.ts +66 -0
- package/dist/src/mi/mina.js +225 -0
- package/dist/src/mi/mina.js.map +1 -0
- package/dist/src/mi/miot.d.ts +35 -0
- package/dist/src/mi/miot.js +168 -0
- package/dist/src/mi/miot.js.map +1 -0
- package/dist/src/mi/typing.d.ts +90 -0
- package/dist/src/mi/typing.js +1 -0
- package/dist/src/mi/typing.js.map +1 -0
- package/dist/src/onboarding.d.ts +5 -0
- package/dist/src/onboarding.js +118 -0
- package/dist/src/onboarding.js.map +1 -0
- package/dist/src/openclaw-plugin-sdk.d.d.ts +185 -0
- package/dist/src/openclaw-plugin-sdk.d.js +1 -0
- package/dist/src/openclaw-plugin-sdk.d.js.map +1 -0
- package/dist/src/outbound.d.ts +5 -0
- package/dist/src/outbound.js +108 -0
- package/dist/src/outbound.js.map +1 -0
- package/dist/src/runtime.d.ts +6 -0
- package/dist/src/runtime.js +15 -0
- package/dist/src/runtime.js.map +1 -0
- package/dist/src/service.d.ts +70 -0
- package/dist/src/service.js +200 -0
- package/dist/src/service.js.map +1 -0
- package/dist/src/speaker.d.ts +62 -0
- package/dist/src/speaker.js +211 -0
- package/dist/src/speaker.js.map +1 -0
- package/dist/src/tts/mimo.d.ts +50 -0
- package/dist/src/tts/mimo.js +214 -0
- package/dist/src/tts/mimo.js.map +1 -0
- package/dist/src/types.d.ts +30 -0
- package/dist/src/types.js +1 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/codec.d.ts +31 -0
- package/dist/src/utils/codec.js +144 -0
- package/dist/src/utils/codec.js.map +1 -0
- package/dist/src/utils/debug.d.ts +10 -0
- package/dist/src/utils/debug.js +15 -0
- package/dist/src/utils/debug.js.map +1 -0
- package/dist/src/utils/hash.d.ts +40 -0
- package/dist/src/utils/hash.js +75 -0
- package/dist/src/utils/hash.js.map +1 -0
- package/dist/src/utils/http.d.ts +24 -0
- package/dist/src/utils/http.js +151 -0
- package/dist/src/utils/http.js.map +1 -0
- package/dist/src/utils/index.d.ts +6 -0
- package/dist/src/utils/index.js +10 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/io.d.ts +26 -0
- package/dist/src/utils/io.js +53 -0
- package/dist/src/utils/io.js.map +1 -0
- package/dist/src/utils/parse.d.ts +26 -0
- package/dist/src/utils/parse.js +51 -0
- package/dist/src/utils/parse.js.map +1 -0
- package/index.ts +26 -0
- package/openclaw.plugin.json +344 -0
- package/package.json +106 -0
- package/setup-entry.ts +12 -0
- package/skills/migpt-volume/SKILL.md +182 -0
- package/skills/migpt-volume/index.ts +50 -0
- package/src/channel.ts +519 -0
- package/src/config.ts +299 -0
- package/src/message.ts +186 -0
- package/src/mi/account.ts +184 -0
- package/src/mi/common.ts +105 -0
- package/src/mi/index.ts +4 -0
- package/src/mi/mina.ts +261 -0
- package/src/mi/miot.ts +193 -0
- package/src/mi/typing.ts +93 -0
- package/src/onboarding.ts +136 -0
- package/src/openclaw-plugin-sdk.d.ts +185 -0
- package/src/outbound.ts +137 -0
- package/src/runtime.ts +14 -0
- package/src/service.ts +246 -0
- package/src/speaker.ts +264 -0
- package/src/tts/mimo.ts +300 -0
- package/src/types.ts +34 -0
- package/src/utils/codec.ts +206 -0
- package/src/utils/debug.ts +16 -0
- package/src/utils/hash.ts +104 -0
- package/src/utils/http.ts +193 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/io.ts +68 -0
- package/src/utils/parse.ts +64 -0
- package/tsconfig.json +25 -0
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "migpt-claw",
|
|
3
|
+
"name": "MiGPT Channel",
|
|
4
|
+
"description": "小米小爱音箱 OpenClaw Channel 插件,让小爱音箱成为你的龙虾语音助手",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"kind": "channel",
|
|
7
|
+
"channels": ["migpt"],
|
|
8
|
+
"skills": ["./skills/migpt-volume"],
|
|
9
|
+
"author": {
|
|
10
|
+
"name": "z-qinghui",
|
|
11
|
+
"url": "https://github.com/z-qinghui"
|
|
12
|
+
},
|
|
13
|
+
"homepage": "https://github.com/z-qinghui/migpt-claw",
|
|
14
|
+
"repository": "https://github.com/z-qinghui/migpt-claw",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"keywords": ["xiaomi", "mi-gpt", "mico", "speaker", "channel", "voice"],
|
|
17
|
+
"configSchema": {
|
|
18
|
+
"type": "object",
|
|
19
|
+
"additionalProperties": false,
|
|
20
|
+
"properties": {
|
|
21
|
+
"userId": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"description": "小米账号 ID"
|
|
24
|
+
},
|
|
25
|
+
"password": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"description": "小米账号密码"
|
|
28
|
+
},
|
|
29
|
+
"passToken": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"description": "小米 PassToken(可选,如果提供则不需要密码)"
|
|
32
|
+
},
|
|
33
|
+
"devices": {
|
|
34
|
+
"type": "array",
|
|
35
|
+
"items": { "type": "string" },
|
|
36
|
+
"description": "设备名称列表"
|
|
37
|
+
},
|
|
38
|
+
"systemPrompt": {
|
|
39
|
+
"type": "string",
|
|
40
|
+
"description": "系统提示词,用于定制 AI 在音箱场景下的行为规范"
|
|
41
|
+
},
|
|
42
|
+
"heartbeat": {
|
|
43
|
+
"type": "number",
|
|
44
|
+
"description": "消息轮询间隔(毫秒)",
|
|
45
|
+
"default": 1000
|
|
46
|
+
},
|
|
47
|
+
"speakerControl": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"enum": ["mina", "miot"],
|
|
50
|
+
"description": "音箱控制方式"
|
|
51
|
+
},
|
|
52
|
+
"announceOnStart": {
|
|
53
|
+
"type": "boolean",
|
|
54
|
+
"description": "启动时是否播报上线文案",
|
|
55
|
+
"default": false
|
|
56
|
+
},
|
|
57
|
+
"startupMessage": {
|
|
58
|
+
"type": "string",
|
|
59
|
+
"description": "上线播报文案",
|
|
60
|
+
"default": "您的小龙虾已上线,随时为您服务"
|
|
61
|
+
},
|
|
62
|
+
"acknowledgeOnReceive": {
|
|
63
|
+
"type": "boolean",
|
|
64
|
+
"description": "收到消息时是否回复收到",
|
|
65
|
+
"default": false
|
|
66
|
+
},
|
|
67
|
+
"receiveMessage": {
|
|
68
|
+
"type": "string",
|
|
69
|
+
"description": "收到消息回复文案",
|
|
70
|
+
"default": "收到,处理中"
|
|
71
|
+
},
|
|
72
|
+
"keepAlive": {
|
|
73
|
+
"type": "boolean",
|
|
74
|
+
"description": "是否默认开启持续对话模式(一次唤醒,连续对话)",
|
|
75
|
+
"default": false
|
|
76
|
+
},
|
|
77
|
+
"keepAliveTimeout": {
|
|
78
|
+
"type": "number",
|
|
79
|
+
"description": "持续对话超时时间(秒),超时后自动退出持续对话",
|
|
80
|
+
"default": 30
|
|
81
|
+
},
|
|
82
|
+
"keepAliveEnterKeywords": {
|
|
83
|
+
"type": "array",
|
|
84
|
+
"items": { "type": "string" },
|
|
85
|
+
"description": "进入持续对话的语音关键词",
|
|
86
|
+
"default": ["打开连续对话", "进入持续对话"]
|
|
87
|
+
},
|
|
88
|
+
"keepAliveExitKeywords": {
|
|
89
|
+
"type": "array",
|
|
90
|
+
"items": { "type": "string" },
|
|
91
|
+
"description": "退出持续对话的语音关键词",
|
|
92
|
+
"default": ["关闭连续对话", "退出持续对话", "再见"]
|
|
93
|
+
},
|
|
94
|
+
"hardwareControlVerbs": {
|
|
95
|
+
"type": "array",
|
|
96
|
+
"items": { "type": "string" },
|
|
97
|
+
"description": "硬件控制指令动词关键词,匹配到的指令将跳过 AI 处理,由小爱原生处理",
|
|
98
|
+
"default": [
|
|
99
|
+
"播放", "打开", "关闭", "暂停", "继续", "停止", "切换",
|
|
100
|
+
"开启", "关掉", "开", "关", "启动", "调节",
|
|
101
|
+
"调高", "调低", "调大", "调小", "调亮", "调暗", "增大", "减小", "设置", "调到",
|
|
102
|
+
"导航", "拨打", "打电话", "呼叫", "发短信", "发消息"
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
"mimo": {
|
|
106
|
+
"type": "object",
|
|
107
|
+
"description": "MiMo-V2.5-TT 自定义 TTS 配置",
|
|
108
|
+
"properties": {
|
|
109
|
+
"apiKey": {
|
|
110
|
+
"type": "string",
|
|
111
|
+
"description": "MiMo API Key"
|
|
112
|
+
},
|
|
113
|
+
"baseUrl": {
|
|
114
|
+
"type": "string",
|
|
115
|
+
"description": "MiMo API Base URL",
|
|
116
|
+
"default": "https://api.xiaomimimo.com/v1"
|
|
117
|
+
},
|
|
118
|
+
"model": {
|
|
119
|
+
"type": "string",
|
|
120
|
+
"description": "TTS 模型",
|
|
121
|
+
"enum": ["mimo-v2.5-tts", "mimo-v2.5-tts-voicedesign", "mimo-v2.5-tts-voiceclone"],
|
|
122
|
+
"default": "mimo-v2.5-tts"
|
|
123
|
+
},
|
|
124
|
+
"voice": {
|
|
125
|
+
"type": "string",
|
|
126
|
+
"description": "预设音色 ID(如 mimo_default, 冰糖, 茉莉, 苏打, 白桦, Mia, Chloe)",
|
|
127
|
+
"default": "mimo_default"
|
|
128
|
+
},
|
|
129
|
+
"style": {
|
|
130
|
+
"type": "string",
|
|
131
|
+
"description": "风格指令(如 温柔, 活泼, 磁性, 甜美 等)"
|
|
132
|
+
},
|
|
133
|
+
"stream": {
|
|
134
|
+
"type": "boolean",
|
|
135
|
+
"description": "启用流式传输(降低首字延迟)",
|
|
136
|
+
"default": true
|
|
137
|
+
},
|
|
138
|
+
"port": {
|
|
139
|
+
"type": "number",
|
|
140
|
+
"description": "TTS 服务器固定端口(0 = 随机分配,云服务器建议固定端口以便开放防火墙)",
|
|
141
|
+
"default": 0
|
|
142
|
+
},
|
|
143
|
+
"host": {
|
|
144
|
+
"type": "string",
|
|
145
|
+
"description": "TTS 服务器监听地址",
|
|
146
|
+
"default": "0.0.0.0"
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
"required": ["apiKey"]
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
"uiHints": {
|
|
154
|
+
"userId": {
|
|
155
|
+
"label": "小米账号 ID",
|
|
156
|
+
"placeholder": "请输入小米账号"
|
|
157
|
+
},
|
|
158
|
+
"password": {
|
|
159
|
+
"label": "密码",
|
|
160
|
+
"sensitive": true,
|
|
161
|
+
"placeholder": "请输入小米账号密码"
|
|
162
|
+
},
|
|
163
|
+
"passToken": {
|
|
164
|
+
"label": "PassToken",
|
|
165
|
+
"sensitive": true,
|
|
166
|
+
"placeholder": "可选,如果提供则不需要密码"
|
|
167
|
+
},
|
|
168
|
+
"devices": {
|
|
169
|
+
"label": "设备列表",
|
|
170
|
+
"placeholder": "客厅音箱,卧室音箱"
|
|
171
|
+
},
|
|
172
|
+
"systemPrompt": {
|
|
173
|
+
"label": "系统提示词",
|
|
174
|
+
"placeholder": "自定义 AI 在音箱场景下的行为规范"
|
|
175
|
+
},
|
|
176
|
+
"heartbeat": {
|
|
177
|
+
"label": "轮询间隔",
|
|
178
|
+
"placeholder": "1000"
|
|
179
|
+
},
|
|
180
|
+
"speakerControl": {
|
|
181
|
+
"label": "控制方式",
|
|
182
|
+
"placeholder": "mina 或 miot"
|
|
183
|
+
},
|
|
184
|
+
"announceOnStart": {
|
|
185
|
+
"label": "启动时播报",
|
|
186
|
+
"description": "启用后,音箱启动时会播报上线文案"
|
|
187
|
+
},
|
|
188
|
+
"startupMessage": {
|
|
189
|
+
"label": "上线文案",
|
|
190
|
+
"placeholder": "您的小龙虾已上线,随时为您服务"
|
|
191
|
+
},
|
|
192
|
+
"acknowledgeOnReceive": {
|
|
193
|
+
"label": "收到消息回复",
|
|
194
|
+
"description": "启用后,收到消息时会播放提示音"
|
|
195
|
+
},
|
|
196
|
+
"receiveMessage": {
|
|
197
|
+
"label": "回复文案",
|
|
198
|
+
"placeholder": "收到,处理中"
|
|
199
|
+
},
|
|
200
|
+
"keepAlive": {
|
|
201
|
+
"label": "持续对话",
|
|
202
|
+
"description": "启用后,一次唤醒可连续对话,无需重复唤醒"
|
|
203
|
+
},
|
|
204
|
+
"keepAliveTimeout": {
|
|
205
|
+
"label": "持续对话超时",
|
|
206
|
+
"placeholder": "30"
|
|
207
|
+
},
|
|
208
|
+
"keepAliveEnterKeywords": {
|
|
209
|
+
"label": "进入持续对话关键词",
|
|
210
|
+
"placeholder": "打开连续对话,进入持续对话"
|
|
211
|
+
},
|
|
212
|
+
"keepAliveExitKeywords": {
|
|
213
|
+
"label": "退出持续对话关键词",
|
|
214
|
+
"placeholder": "关闭连续对话,退出持续对话,再见"
|
|
215
|
+
},
|
|
216
|
+
"hardwareControlVerbs": {
|
|
217
|
+
"label": "硬件控制指令关键词",
|
|
218
|
+
"placeholder": "播放,打开,关闭,暂停,调高,调低,调亮,调暗..."
|
|
219
|
+
},
|
|
220
|
+
"mimo": {
|
|
221
|
+
"label": "MiMo TTS",
|
|
222
|
+
"description": "小米 MiMo-V2.5-TT 自定义语音合成配置"
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
"channelConfigs": {
|
|
226
|
+
"migpt": {
|
|
227
|
+
"schema": {
|
|
228
|
+
"type": "object",
|
|
229
|
+
"additionalProperties": false,
|
|
230
|
+
"properties": {
|
|
231
|
+
"enabled": {
|
|
232
|
+
"type": "boolean",
|
|
233
|
+
"description": "启用频道"
|
|
234
|
+
},
|
|
235
|
+
"userId": {
|
|
236
|
+
"type": "string",
|
|
237
|
+
"description": "小米账号 ID"
|
|
238
|
+
},
|
|
239
|
+
"password": {
|
|
240
|
+
"type": "string",
|
|
241
|
+
"description": "小米账号密码"
|
|
242
|
+
},
|
|
243
|
+
"passToken": {
|
|
244
|
+
"type": "string",
|
|
245
|
+
"description": "小米 PassToken(可选,如果提供则不需要密码)"
|
|
246
|
+
},
|
|
247
|
+
"devices": {
|
|
248
|
+
"type": "array",
|
|
249
|
+
"items": { "type": "string" },
|
|
250
|
+
"description": "设备名称列表"
|
|
251
|
+
},
|
|
252
|
+
"systemPrompt": {
|
|
253
|
+
"type": "string",
|
|
254
|
+
"description": "系统提示词,用于定制 AI 在音箱场景下的行为规范"
|
|
255
|
+
},
|
|
256
|
+
"heartbeat": {
|
|
257
|
+
"type": "number",
|
|
258
|
+
"description": "消息轮询间隔(毫秒)",
|
|
259
|
+
"default": 1000
|
|
260
|
+
},
|
|
261
|
+
"speakerControl": {
|
|
262
|
+
"type": "string",
|
|
263
|
+
"enum": ["mina", "miot"],
|
|
264
|
+
"description": "音箱控制方式"
|
|
265
|
+
},
|
|
266
|
+
"announceOnStart": {
|
|
267
|
+
"type": "boolean",
|
|
268
|
+
"description": "启动时是否播报上线文案",
|
|
269
|
+
"default": false
|
|
270
|
+
},
|
|
271
|
+
"startupMessage": {
|
|
272
|
+
"type": "string",
|
|
273
|
+
"description": "上线播报文案",
|
|
274
|
+
"default": "您的小龙虾已上线,随时为您服务"
|
|
275
|
+
},
|
|
276
|
+
"acknowledgeOnReceive": {
|
|
277
|
+
"type": "boolean",
|
|
278
|
+
"description": "收到消息时是否回复收到",
|
|
279
|
+
"default": false
|
|
280
|
+
},
|
|
281
|
+
"receiveMessage": {
|
|
282
|
+
"type": "string",
|
|
283
|
+
"description": "收到消息回复文案",
|
|
284
|
+
"default": "收到,处理中"
|
|
285
|
+
},
|
|
286
|
+
"keepAlive": {
|
|
287
|
+
"type": "boolean",
|
|
288
|
+
"description": "是否默认开启持续对话模式",
|
|
289
|
+
"default": false
|
|
290
|
+
},
|
|
291
|
+
"keepAliveTimeout": {
|
|
292
|
+
"type": "number",
|
|
293
|
+
"description": "持续对话超时时间(秒)",
|
|
294
|
+
"default": 30
|
|
295
|
+
},
|
|
296
|
+
"keepAliveEnterKeywords": {
|
|
297
|
+
"type": "array",
|
|
298
|
+
"items": { "type": "string" },
|
|
299
|
+
"description": "进入持续对话的语音关键词",
|
|
300
|
+
"default": ["打开连续对话", "进入持续对话"]
|
|
301
|
+
},
|
|
302
|
+
"keepAliveExitKeywords": {
|
|
303
|
+
"type": "array",
|
|
304
|
+
"items": { "type": "string" },
|
|
305
|
+
"description": "退出持续对话的语音关键词",
|
|
306
|
+
"default": ["关闭连续对话", "退出持续对话", "再见"]
|
|
307
|
+
},
|
|
308
|
+
"hardwareControlVerbs": {
|
|
309
|
+
"type": "array",
|
|
310
|
+
"items": { "type": "string" },
|
|
311
|
+
"description": "硬件控制指令动词关键词,匹配到的指令将跳过 AI 处理,由小爱原生处理",
|
|
312
|
+
"default": [
|
|
313
|
+
"播放", "打开", "关闭", "暂停", "继续", "停止", "切换",
|
|
314
|
+
"开启", "关掉", "开", "关", "启动", "调节",
|
|
315
|
+
"调高", "调低", "调大", "调小", "调亮", "调暗", "增大", "减小", "设置", "调到",
|
|
316
|
+
"导航", "拨打", "打电话", "呼叫", "发短信", "发消息"
|
|
317
|
+
]
|
|
318
|
+
},
|
|
319
|
+
"streaming": {
|
|
320
|
+
"type": "boolean",
|
|
321
|
+
"description": "启用流式输出"
|
|
322
|
+
},
|
|
323
|
+
"mimo": {
|
|
324
|
+
"type": "object",
|
|
325
|
+
"description": "MiMo-V2.5-TT 自定义 TTS 配置",
|
|
326
|
+
"properties": {
|
|
327
|
+
"apiKey": { "type": "string", "description": "MiMo API Key" },
|
|
328
|
+
"baseUrl": { "type": "string", "description": "MiMo API Base URL", "default": "https://api.xiaomimimo.com/v1" },
|
|
329
|
+
"model": { "type": "string", "enum": ["mimo-v2.5-tts", "mimo-v2.5-tts-voicedesign", "mimo-v2.5-tts-voiceclone"], "default": "mimo-v2.5-tts" },
|
|
330
|
+
"voice": { "type": "string", "description": "预设音色 ID", "default": "mimo_default" },
|
|
331
|
+
"style": { "type": "string", "description": "风格指令" },
|
|
332
|
+
"stream": { "type": "boolean", "description": "启用流式传输", "default": true },
|
|
333
|
+
"port": { "type": "number", "description": "TTS 服务器固定端口(0=随机)", "default": 0 },
|
|
334
|
+
"host": { "type": "string", "description": "TTS 服务器监听地址", "default": "0.0.0.0" }
|
|
335
|
+
},
|
|
336
|
+
"required": ["apiKey"]
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
},
|
|
340
|
+
"label": "MiGPT",
|
|
341
|
+
"description": "小米小爱音箱语音对话 Channel"
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0.0",
|
|
3
|
+
"name": "@z-qinghui/migpt-claw",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public"
|
|
6
|
+
},
|
|
7
|
+
"description": "小米小爱音箱 OpenClaw Channel 插件",
|
|
8
|
+
"keywords": [
|
|
9
|
+
"openclaw",
|
|
10
|
+
"xiaomi",
|
|
11
|
+
"mi-gpt",
|
|
12
|
+
"mico",
|
|
13
|
+
"channel"
|
|
14
|
+
],
|
|
15
|
+
"type": "module",
|
|
16
|
+
"main": "dist/index.js",
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsup",
|
|
19
|
+
"dev": "tsup --watch",
|
|
20
|
+
"prepublishOnly": "npm run build",
|
|
21
|
+
"prepack": "npm run build"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist",
|
|
25
|
+
"src",
|
|
26
|
+
"index.ts",
|
|
27
|
+
"setup-entry.ts",
|
|
28
|
+
"skills",
|
|
29
|
+
"openclaw.plugin.json",
|
|
30
|
+
"tsconfig.json"
|
|
31
|
+
],
|
|
32
|
+
"exports": {
|
|
33
|
+
".": {
|
|
34
|
+
"types": "./dist/index.d.ts",
|
|
35
|
+
"import": "./dist/index.js"
|
|
36
|
+
},
|
|
37
|
+
"./*": {
|
|
38
|
+
"types": "./dist/*.d.ts",
|
|
39
|
+
"import": "./dist/*.js"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"openclaw": {
|
|
43
|
+
"extensions": [
|
|
44
|
+
"./index.ts"
|
|
45
|
+
],
|
|
46
|
+
"setupEntry": "./setup-entry.ts",
|
|
47
|
+
"channel": {
|
|
48
|
+
"id": "migpt",
|
|
49
|
+
"label": "MiGPT",
|
|
50
|
+
"selectionLabel": "小米音箱 (MiGPT)",
|
|
51
|
+
"blurb": "小米小爱音箱语音对话,让小爱音箱成为你的龙虾语音助手",
|
|
52
|
+
"docsPath": "/channels/migpt",
|
|
53
|
+
"docsLabel": "MiGPT 文档",
|
|
54
|
+
"order": 60,
|
|
55
|
+
"aliases": ["xiaomi", "mico"],
|
|
56
|
+
"markdownCapable": false,
|
|
57
|
+
"exposure": {
|
|
58
|
+
"configured": true,
|
|
59
|
+
"setup": true,
|
|
60
|
+
"docs": true
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"install": {
|
|
64
|
+
"clawhubSpec": "@z-qinghui/migpt-claw",
|
|
65
|
+
"npmSpec": "@z-qinghui/migpt-claw",
|
|
66
|
+
"defaultChoice": "clawhub",
|
|
67
|
+
"minHostVersion": ">=0.1.0"
|
|
68
|
+
},
|
|
69
|
+
"startup": {
|
|
70
|
+
"deferConfiguredChannelFullLoadUntilAfterListen": true
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"compat": {
|
|
74
|
+
"pluginApi": ">=0.1.0",
|
|
75
|
+
"minHostVersion": ">=0.1.0"
|
|
76
|
+
},
|
|
77
|
+
"build": {
|
|
78
|
+
"openclawVersion": "0.1.0",
|
|
79
|
+
"pluginSdkVersion": "0.1.0"
|
|
80
|
+
},
|
|
81
|
+
"dependencies": {
|
|
82
|
+
"axios": "^1.13.6",
|
|
83
|
+
"node-fetch": "^3.3.2",
|
|
84
|
+
"pako": "^2.1.0"
|
|
85
|
+
},
|
|
86
|
+
"devDependencies": {
|
|
87
|
+
"@types/axios": "^0.9.36",
|
|
88
|
+
"@types/node": "^22.14.0",
|
|
89
|
+
"@types/pako": "^2.0.4",
|
|
90
|
+
"tsup": "^8.4.0",
|
|
91
|
+
"typescript": "^5.8.2"
|
|
92
|
+
},
|
|
93
|
+
"engines": {
|
|
94
|
+
"node": ">=18"
|
|
95
|
+
},
|
|
96
|
+
"sideEffects": false,
|
|
97
|
+
"license": "MIT",
|
|
98
|
+
"author": {
|
|
99
|
+
"name": "z-qinghui",
|
|
100
|
+
"url": "https://github.com/z-qinghui"
|
|
101
|
+
},
|
|
102
|
+
"repository": {
|
|
103
|
+
"type": "git",
|
|
104
|
+
"url": "git+https://github.com/z-qinghui/migpt-claw.git"
|
|
105
|
+
}
|
|
106
|
+
}
|
package/setup-entry.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* setup-entry.ts — 轻量级 Setup 入口
|
|
3
|
+
*
|
|
4
|
+
* OpenClaw 在以下场景仅加载此文件(不加载完整 index.ts):
|
|
5
|
+
* - 频道已禁用但需要 setup 界面(onboarding、config repair)
|
|
6
|
+
* - 频道已启用但未配置
|
|
7
|
+
* - 延迟加载模式下,gateway 启动前仅需 setup 表面
|
|
8
|
+
*/
|
|
9
|
+
import { defineSetupPluginEntry } from 'openclaw/plugin-sdk/channel-core';
|
|
10
|
+
import { miGPTPlugin } from './src/channel.js';
|
|
11
|
+
|
|
12
|
+
export default defineSetupPluginEntry(miGPTPlugin);
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# MiGPT 音箱插件 - 提示词定制指南
|
|
2
|
+
|
|
3
|
+
## 概述
|
|
4
|
+
|
|
5
|
+
MiGPT 音箱插件支持通过 `systemPrompt` 配置项定制 AI 在音箱场景下的行为规范。由于音箱通过语音播报,不适合播放长文本、代码、复杂格式等内容,因此需要通过提示词规范 AI 的行为。
|
|
6
|
+
|
|
7
|
+
## 配置项说明
|
|
8
|
+
|
|
9
|
+
### 基础配置
|
|
10
|
+
|
|
11
|
+
| 配置项 | 类型 | 说明 | 默认值 |
|
|
12
|
+
|--------|------|------|--------|
|
|
13
|
+
| `userId` | string | 小米账号 ID | - |
|
|
14
|
+
| `password` | string | 小米账号密码 | - |
|
|
15
|
+
| `passToken` | string | PassToken(可选) | - |
|
|
16
|
+
| `devices` | array | 设备名称列表 | - |
|
|
17
|
+
| `heartbeat` | number | 消息轮询间隔 (ms) | 1000 |
|
|
18
|
+
| `speakerControl` | string | 控制方式 (mina/miot) | - |
|
|
19
|
+
|
|
20
|
+
### 提示词配置
|
|
21
|
+
|
|
22
|
+
| 配置项 | 类型 | 说明 | 默认值 |
|
|
23
|
+
|--------|------|------|--------|
|
|
24
|
+
| `systemPrompt` | string | 系统提示词 | 内置默认提示词 |
|
|
25
|
+
|
|
26
|
+
### 播报控制配置
|
|
27
|
+
|
|
28
|
+
| 配置项 | 类型 | 说明 | 默认值 |
|
|
29
|
+
|--------|------|------|--------|
|
|
30
|
+
| `announceOnStart` | boolean | 启动时是否播报上线文案 | false |
|
|
31
|
+
| `startupMessage` | string | 上线播报文案 | "您的小龙虾已上线,随时为您服务" |
|
|
32
|
+
| `acknowledgeOnReceive` | boolean | 收到消息时是否回复收到 | false |
|
|
33
|
+
| `receiveMessage` | string | 收到消息回复文案 | "收到,处理中" |
|
|
34
|
+
|
|
35
|
+
## 配置方式
|
|
36
|
+
|
|
37
|
+
### 1. 全局配置
|
|
38
|
+
|
|
39
|
+
在 `openclaw.json` 配置文件中设置全局配置:
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"channels": {
|
|
44
|
+
"migpt": {
|
|
45
|
+
"userId": "your-mi-account",
|
|
46
|
+
"passToken": "your-pass-token",
|
|
47
|
+
"devices": ["客厅音箱"],
|
|
48
|
+
"systemPrompt": "你的自定义提示词...",
|
|
49
|
+
"announceOnStart": true,
|
|
50
|
+
"startupMessage": "小爱音箱已上线,随时为您服务",
|
|
51
|
+
"acknowledgeOnReceive": true,
|
|
52
|
+
"receiveMessage": "收到,请讲"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 2. 账户级别配置
|
|
59
|
+
|
|
60
|
+
如果配置了多个音箱账户,可以为每个账户单独设置:
|
|
61
|
+
|
|
62
|
+
```json
|
|
63
|
+
{
|
|
64
|
+
"channels": {
|
|
65
|
+
"migpt": {
|
|
66
|
+
"userId": "your-mi-account",
|
|
67
|
+
"passToken": "your-pass-token",
|
|
68
|
+
"devices": ["客厅音箱"],
|
|
69
|
+
"accounts": {
|
|
70
|
+
"account1": {
|
|
71
|
+
"userId": "account1-id",
|
|
72
|
+
"passToken": "account1-token",
|
|
73
|
+
"devices": ["卧室音箱"],
|
|
74
|
+
"systemPrompt": "卧室音箱的专属提示词..."
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## 默认提示词
|
|
83
|
+
|
|
84
|
+
如果未配置 `systemPrompt`,插件会使用以下默认提示词:
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
【音箱播报规范 - 必须遵守】
|
|
88
|
+
你是一个智能音箱助手,通过语音与用户交流。请遵守以下规范:
|
|
89
|
+
|
|
90
|
+
📢 播报原则:
|
|
91
|
+
1. 简短优先:单次播报控制在 100 字以内,超过请拆分或改用其他渠道
|
|
92
|
+
2. 纯文字:只输出适合语音播报的纯文字,不要包含 URL、代码、复杂格式
|
|
93
|
+
3. 自然口语:使用简短、清晰的口语表达,避免长句和复杂结构
|
|
94
|
+
|
|
95
|
+
🚫 不适合播报的内容(应改用其他渠道):
|
|
96
|
+
- 代码片段、技术文档
|
|
97
|
+
- 长篇文章、报告(>300 字)
|
|
98
|
+
- 复杂数据表格、列表
|
|
99
|
+
- 图片、视频、文件等多媒体内容
|
|
100
|
+
- URL 链接、邮箱地址
|
|
101
|
+
|
|
102
|
+
✅ 正确做法示例:
|
|
103
|
+
- 短回复:"好的,已为你设置明天早上 8 点的闹钟"
|
|
104
|
+
- 长内容分流:"由于内容较长,详细报告已发送到你的手机/微信,请查看"
|
|
105
|
+
- 代码场景:"代码已生成并发送到你的邮箱,请注意查收"
|
|
106
|
+
- 多媒体场景:"这张图片很有趣,已发送到你的手机查看"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## 自定义提示词示例
|
|
110
|
+
|
|
111
|
+
### 示例 1:强调分流策略
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
你是一个智能音箱助手。请遵守:
|
|
115
|
+
1. 简短回复可直接播报(<100 字)
|
|
116
|
+
2. 长内容请说明"已发送到其他渠道"
|
|
117
|
+
3. 代码、文档、图片等内容不要尝试播报,告知用户已发送
|
|
118
|
+
4. 使用友好、自然的口语表达
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 示例 2:特定场景定制
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
你是家庭助手小爱,通过音箱与家人交流:
|
|
125
|
+
- 天气、时间、提醒等简单信息直接播报
|
|
126
|
+
- 新闻、文章等长内容只播报摘要,详情发送手机
|
|
127
|
+
- 涉及视觉内容(图片、视频)告知用户已发送到手机
|
|
128
|
+
- 保持亲切、简洁的家人式对话风格
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 示例 3:多渠道协作
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
音箱播报规范:
|
|
135
|
+
1. 优先判断内容是否适合语音播报
|
|
136
|
+
2. 适合播报:简短文字、确认信息、简单问答
|
|
137
|
+
3. 不适合播报:代码、长文、数据、多媒体 → 使用框架的其他 Channel 发送
|
|
138
|
+
4. 分流时告知用户:"由于 XXX 原因,已发送到 XXX,请查看"
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## 工作原理
|
|
142
|
+
|
|
143
|
+
1. **消息接收**:音箱收到用户语音后,转录为文字
|
|
144
|
+
2. **提示词注入**:将 `systemPrompt` 注入到 AI 的上下文中
|
|
145
|
+
3. **AI 处理**:AI 根据提示词规范生成适合播报的回复
|
|
146
|
+
4. **分流决策**:
|
|
147
|
+
- 短文本 → 通过 `deliver` 回调播放
|
|
148
|
+
- 长内容/多媒体 → AI 应说明已使用其他渠道发送
|
|
149
|
+
|
|
150
|
+
## 与其他 Channel 协作
|
|
151
|
+
|
|
152
|
+
音箱插件可以与其他 Channel(如微信、QQ、邮件等)配合使用:
|
|
153
|
+
|
|
154
|
+
```json
|
|
155
|
+
{
|
|
156
|
+
"channels": {
|
|
157
|
+
"migpt": {
|
|
158
|
+
"systemPrompt": "长内容请发送到用户的微信"
|
|
159
|
+
},
|
|
160
|
+
"wechat": {
|
|
161
|
+
// 微信 Channel 配置
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
AI 会根据提示词判断:
|
|
168
|
+
- 简单回复 → 音箱播报
|
|
169
|
+
- 复杂内容 → 通过微信发送,音箱告知用户
|
|
170
|
+
|
|
171
|
+
## 最佳实践
|
|
172
|
+
|
|
173
|
+
1. **保持简短**:提示词本身也应简洁,避免过度复杂
|
|
174
|
+
2. **明确分流**:清楚说明什么内容适合播报,什么应分流
|
|
175
|
+
3. **友好提示**:分流时告知用户原因和发送目标
|
|
176
|
+
4. **测试调整**:根据实际使用效果调整提示词
|
|
177
|
+
|
|
178
|
+
## 注意事项
|
|
179
|
+
|
|
180
|
+
- 提示词优先级:账户级别 > 全局级别
|
|
181
|
+
- 提示词会在每条消息处理时注入到 AI 上下文
|
|
182
|
+
- 过长的提示词会占用 AI 上下文空间,建议控制在 500 字以内
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { OpenClawPluginApi } from 'openclaw/plugin-sdk';
|
|
2
|
+
import { MiService } from '../../service.js';
|
|
3
|
+
import { MiSpeaker } from '../../speaker.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 音量控制技能
|
|
7
|
+
*/
|
|
8
|
+
export function registerMigptVolumeSkill(api: OpenClawPluginApi) {
|
|
9
|
+
api.registerTool({
|
|
10
|
+
name: 'set_volume',
|
|
11
|
+
description: '设置小爱音箱的音量',
|
|
12
|
+
inputSchema: {
|
|
13
|
+
type: 'object',
|
|
14
|
+
properties: {
|
|
15
|
+
volume: {
|
|
16
|
+
type: 'number',
|
|
17
|
+
description: '音量大小(6-100)',
|
|
18
|
+
minimum: 6,
|
|
19
|
+
maximum: 100,
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
required: ['volume'],
|
|
23
|
+
},
|
|
24
|
+
execute: async (input: { volume: number }) => {
|
|
25
|
+
const result = await MiSpeaker.setVolume(input.volume);
|
|
26
|
+
if (result.success) {
|
|
27
|
+
return { success: true, message: `音量已设置为 ${input.volume}` };
|
|
28
|
+
} else {
|
|
29
|
+
return { success: false, error: result.error };
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
api.registerTool({
|
|
35
|
+
name: 'get_volume',
|
|
36
|
+
description: '获取小爱音箱的当前音量',
|
|
37
|
+
inputSchema: {
|
|
38
|
+
type: 'object',
|
|
39
|
+
properties: {},
|
|
40
|
+
},
|
|
41
|
+
execute: async () => {
|
|
42
|
+
const volume = await MiSpeaker.getVolume();
|
|
43
|
+
if (volume !== undefined) {
|
|
44
|
+
return { success: true, volume };
|
|
45
|
+
} else {
|
|
46
|
+
return { success: false, error: '获取音量失败' };
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
}
|