rol-websocket-channel 1.6.2 → 1.6.3

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.
@@ -1,2191 +0,0 @@
1
- # OpenClaw MQTT API 文档 (版本查看)
2
-
3
- ## 消息格式
4
-
5
- 所有 MQTT 消息使用以下格式:
6
-
7
- **请求消息**
8
- ```json
9
- {
10
- "type": "消息类型",
11
- "trace_id": "唯一追踪ID",
12
- "data": { /* 请求参数 */ }
13
- }
14
- ```
15
-
16
- **响应消息**
17
- ```json
18
- {
19
- "type": "receiver",
20
- "trace_id": "对应的请求 trace_id",
21
- "source": "system",
22
- "timestamp": 1776331005170,
23
- "success": true,
24
- "data": { /* 响应数据 */ }
25
- }
26
- ```
27
-
28
- ---
29
-
30
- ## 系统管理 (System)
31
-
32
- ### systemRestart - 重启网关
33
-
34
- **请求**
35
- ```json
36
- {
37
- "type": "systemRestart",
38
- "trace_id": "system-restart-001",
39
- "data": {}
40
- }
41
- ```
42
-
43
- ---
44
-
45
- ### systemStop - 停止网关 *
46
-
47
- **请求**
48
-
49
- ```json
50
- {
51
- "type": "systemStop",
52
- "trace_id": "system-stop-001",
53
- "data": {}
54
- }
55
- ```
56
-
57
- ---
58
-
59
- ### systemDoctorFix - 诊断修复
60
-
61
- **请求**
62
- ```json
63
- {
64
- "type": "systemDoctorFix",
65
- "trace_id": "system-doctor-001",
66
- "data": {}
67
- }
68
- ```
69
-
70
- ---
71
-
72
- ### systemLogs - 查看日志 接!!
73
-
74
- **请求**
75
- ```json
76
- {
77
- "type": "systemLogs",
78
- "trace_id": "system-logs-001",
79
- "data": {}
80
- }
81
- ```
82
- ```
83
- 说明:获取最近 100 条日志。
84
- ```
85
-
86
- ---
87
-
88
- ### openclawUpdate - 升级 OpenClaw
89
-
90
- **说明**
91
- - 固定执行 `npm install -g @openclaw/core@2026.5.6`。
92
- - 安装后依次执行 `openclaw --version` 和 `openclaw doctor --deep` 做校验。
93
- - 用于 App 上的“升级 OpenClaw”按钮。
94
- - 返回 `stdout` / `stderr`,失败时外层 `ok` 为 `false`。
95
-
96
- **请求**
97
- ```json
98
- {
99
- "type": "openclawUpdate",
100
- "trace_id": "openclaw-update-001",
101
- "data": {}
102
- }
103
- ```
104
-
105
- **成功返回 data.result 示例**
106
- ```json
107
- {
108
- "ok": true,
109
- "action": "openclawUpdate",
110
- "targetPackage": "@openclaw/core",
111
- "targetVersion": "2026.5.6",
112
- "restartRecommended": true,
113
- "steps": [
114
- {
115
- "name": "installCore",
116
- "command": "npm",
117
- "args": ["install", "-g", "@openclaw/core@2026.5.6"],
118
- "cwd": "/home/user/.openclaw",
119
- "stdout": "",
120
- "stderr": ""
121
- },
122
- {
123
- "name": "version",
124
- "command": "openclaw",
125
- "args": ["--version"],
126
- "cwd": "/home/user/.openclaw",
127
- "stdout": "OpenClaw 2026.5.6 ...",
128
- "stderr": ""
129
- },
130
- {
131
- "name": "doctorDeep",
132
- "command": "openclaw",
133
- "args": ["doctor", "--deep"],
134
- "cwd": "/home/user/.openclaw",
135
- "stdout": "",
136
- "stderr": ""
137
- }
138
- ]
139
- }
140
- ```
141
-
142
- ---
143
-
144
- ### pluginSelfUpdate - 升级 rol-websocket-channel 插件
145
-
146
- **说明**
147
- - 固定执行 `openclaw plugins install clawhub:rol-websocket-channel`。
148
- - 用于 App 上的“升级插件”按钮。
149
- - 命令执行成功后,新的插件代码通常需要 OpenClaw/插件进程重新加载后才会生效。
150
-
151
- **请求**
152
- ```json
153
- {
154
- "type": "pluginSelfUpdate",
155
- "trace_id": "plugin-self-update-001",
156
- "data": {}
157
- }
158
- ```
159
-
160
- ---
161
-
162
- ### systemCurrentVersion - 查询当前版本
163
-
164
- **说明**
165
- - 查询本机 OpenClaw 版本和 channel 插件版本,与期望版本比对。
166
- - openclaw 期望版本:插件内硬编码常量(当前 `2026.5.6`)。
167
- - channel 期望版本:`npm view rol-websocket-channel --json` 从 npm registry 获取最新发布版本。
168
- - `npm view` 失败时回退到硬编码 `1.5.9`,不阻塞接口。
169
- - `currentVersion !== latestVersion` `status: "outdated"`,相等 `status: "current"`。
170
- - 前端只需看 `targets` 里的 `status`,哪个 `"outdated"` 就调对应的升级接口。
171
-
172
- **前端升级流程**
173
- 1. 调 `systemCurrentVersion`
174
- 2. `channel` 是 `outdated` 调 `pluginSelfUpdate`
175
- 3. `openclaw` 是 `outdated` 调 `openclawUpdate`
176
- 4. 升完重启
177
-
178
- **请求**
179
- ```json
180
- {
181
- "type": "systemCurrentVersion",
182
- "trace_id": "system-current-version-001",
183
- "data": {}
184
- }
185
- ```
186
-
187
- ---
188
-
189
- ## 代理管理 (Agents)
190
-
191
- ## 代理管理 (Agents)
192
-
193
- ### agentsGet - 获取代理配置
194
-
195
- **说明**
196
-
197
- - `agentsGet` 偏向配置视角,返回默认代理配置、命名代理配置和当前工具配置。
198
- - 如果前端是做代理列表页,优先使用 `agentsList`。
199
-
200
- **请求**
201
- ```json
202
- {
203
- "type": "agentsGet",
204
- "trace_id": "agents-get-001",
205
- "data": {}
206
- }
207
- ```
208
-
209
- ---
210
-
211
- ### agentsList - 列出所有代理
212
-
213
- **说明**
214
- - `agentsList` 偏向管理列表视角,返回可直接用于列表渲染的 `items`。
215
- - 返回中通常包含 `defaults` 和所有命名代理。
216
-
217
- **请求**
218
- ```json
219
- {
220
- "type": "agentsList",
221
- "trace_id": "agents-list-001",
222
- "data": {}
223
- }
224
- ```
225
-
226
- ---
227
-
228
- ### agentsCreate - 创建代理
229
-
230
- **说明**
231
- - `agentId` 是代理唯一标识,建议前端统一使用这个字段。
232
- - `workspace` 表示代理实际工作的目录。
233
- - `agentDir` 表示代理自己的运行/状态目录。
234
- - 不传 `workspace` / `agentDir` 时,后端会自动生成默认路径。
235
-
236
- **请求**
237
- ```json
238
- {
239
- "type": "agentsCreate",
240
- "trace_id": "agents-create-001",
241
- "data": {
242
- "agentId": "my-agent",
243
- "name": "My Agent",
244
- "workspace": "/home/woowonjae/.openclaw/workspace/my-agent",
245
- "agentDir": "/home/woowonjae/.openclaw/agents/my-agent/agent",
246
- "modelPrimary": "custom-dashscope-aliyuncs-com/qwen-plus",
247
- "modelProvider": "custom-dashscope-aliyuncs-com",
248
- "toolsProfile": "coding"
249
- }
250
- }
251
- ```
252
-
253
- **模型字段说明**
254
- - `modelPrimary` 使用完整的 `providerId/modelName`。
255
- - `modelProvider` 只做兼容校验;如果传入,必须与 `modelPrimary` 的 provider 部分一致。
256
- - 创建后只保存 `model.primary`,不会把 `modelProvider` 写成 `model.provider`。
257
-
258
- ---
259
-
260
- ### agentsUpdate - 更新代理
261
-
262
- **说明**
263
- - 使用 `agentId` 指定要修改的代理。
264
- - 不传 `agentId` 时,默认更新 `defaults`。
265
- - `updates` 目前只支持这些字段:
266
- - `name`
267
- - `workspace`
268
- - `agentDir`
269
- - `model.primary`
270
- - `skills`
271
- - `tools.profile`
272
- - `behavior`
273
- - `model.provider` 不能通过 `agentsUpdate` 写入;provider 从 `model.primary` 派生。
274
- - 切换 agent 模型时只写 `model.primary`,值必须是完整的 `providerId/modelName`。
275
-
276
- **请求**
277
-
278
- ```json
279
- {
280
- "type": "agentsUpdate",
281
- "trace_id": "agents-update-001",
282
- "data": {
283
- "agentId": "my-agent",
284
- "updates": {
285
- "model.primary": "custom-dashscope-aliyuncs-com/qwen-plus",
286
- "tools.profile": "coding"
287
- }
288
- }
289
- }
290
- ```
291
-
292
- **更新默认代理示例**
293
-
294
- ```json
295
- {
296
- "type": "agentsUpdate",
297
- "trace_id": "agents-update-defaults-001",
298
- "data": {
299
- "updates": {
300
- "model.primary": "custom-dashscope-aliyuncs-com/qwen-plus"
301
- }
302
- }
303
- }
304
- ```
305
-
306
- ---
307
-
308
- ### agentsDelete - 删除代理
309
-
310
- **请求**
311
-
312
- ```json
313
- {
314
- "type": "agentsDelete",
315
- "trace_id": "agent-delete-001",
316
- "data": {
317
- "agentId": "coder2",
318
- "purgeFiles": false
319
- }
320
- }
321
- ```
322
-
323
- ---
324
-
325
- ## 配置管理 (Config)
326
-
327
- ### configGet - 获取配置
328
-
329
- **请求**
330
-
331
- ```json
332
- {
333
- "type": "configGet",
334
- "trace_id": "config-get-001",
335
- "data": {}
336
- }
337
- ```
338
-
339
- ---
340
-
341
- ## 会话管理 (Sessions)
342
-
343
- ### sessionsList - 列出所有会话
344
-
345
- **请求**
346
-
347
- ```json
348
- {
349
- "type": "sessionsList",
350
- "trace_id": "sessions-list-001",
351
- "data": {}
352
- }
353
- ```
354
-
355
- ---
356
-
357
- ### sessionsGet - 获取会话详情
358
-
359
- **说明**
360
-
361
- - 支持分页参数 `limit` 和 `offset`。
362
- - 后端单次最多返回 `100` 条消息。
363
-
364
- **请求**
365
-
366
- ```json
367
- {
368
- "type": "sessionsGet",
369
- "trace_id": "sessions-get-001",
370
- "data": {
371
- "sessionId": "session-123",
372
- "limit": 50,
373
- "offset": 0
374
- }
375
- }
376
- ```
377
-
378
- ---
379
-
380
- ### sessionsPrepareMessage - 准备消息 *
381
-
382
- **请求**
383
-
384
- ```json
385
- {
386
- "type": "sessionsPrepareMessage",
387
- "trace_id": "sessions-prepare-001",
388
- "data": {
389
- "sessionId": "session-123",
390
- "message": "Hello, how are you?"
391
- }
392
- }
393
- ```
394
-
395
- ---
396
-
397
- ### sessionsAttachSkill - 附加技能 *
398
-
399
- **请求**
400
-
401
- ```json
402
- {
403
- "type": "sessionsAttachSkill",
404
- "trace_id": "sessions-attach-001",
405
- "data": {
406
- "sessionId": "session-123",
407
- "skillSlug": "letsping",
408
- "message": "按这个 skill 处理"
409
- }
410
- }
411
- ```
412
-
413
- ---
414
-
415
- ## 模型管理 (Models)
416
-
417
- ### 核心规则
418
-
419
- 调整:模型配置统一收口到 `primary` 和 `models.providers`。
420
-
421
- - 当前默认模型只看 `agents.defaults.model.primary`。
422
- - `primary` 必须传完整 ref:`providerId/modelId`,例如 `custom-dashscope-aliyuncs-com/qwen3.6-flash`。
423
- - 不再写 `agents.defaults.model.provider`;provider 从 `primary` 的 `/` 前半段派生。
424
- - custom provider 必须维护在 `models.providers.<providerId>`,否则 `primary` 前缀无法解析到真实接口。
425
- - `agents.defaults.models` 是可选模型池 / allowlist / alias 表,前端可以用它生成模型下拉。
426
- - 前端提交完整 ref;展示可以用 alias、`modelOptions[].label`、`modelOptions[].model`,或者只展示 `/` 后半段。
427
-
428
- ### modelsGet - 获取模型列表
429
-
430
- 调整:只负责读取当前模型和下拉数据,不写配置。
431
-
432
- **什么时候用**
433
-
434
- - 页面初始化时获取当前默认模型、模型下拉选项和 provider 配置视图。
435
- - 前端下拉框优先使用 `data.modelOptions`。
436
-
437
- **请求**
438
- ```json
439
- {
440
- "type": "modelsGet",
441
- "trace_id": "models-get-001",
442
- "data": {}
443
- }
444
- ```
445
-
446
- **前端取值**
447
- - 当前默认模型:`data.defaults.model.primary`
448
- - 下拉提交值:`data.modelOptions[].value`
449
- - 下拉展示名:优先 `data.modelOptions[].label`
450
- - 只展示模型名:`data.modelOptions[].model`,例如 `qwen3.6-flash`
451
- - provider 展示:`data.modelOptions[].providerLabel` 或 `data.modelOptions[].provider`
452
- - `data.defaults.model.provider` 即使返回,也只当派生展示值,不写回配置。
453
-
454
- ### modelsSet - 只切换默认模型
455
-
456
- 调整:只写 `agents.defaults.model.primary即可`,`provider` 只做校验 可以不传。
457
-
458
- **什么时候用**
459
- - 用户只是在已有模型列表里切换默认模型。
460
- - 这是前端模型选择器最常用的切换接口。
461
-
462
- **请求**
463
- ```json
464
- {
465
- "type": "modelsSet",
466
- "trace_id": "models-set-001",
467
- "data": {
468
- "primary": "custom-dashscope-aliyuncs-com/qwen3.6-flash"
469
- }
470
- }
471
- ```
472
-
473
- **可选 provider 校验** 可以忽略不管
474
- ```json
475
- {
476
- "type": "modelsSet",
477
- "trace_id": "models-set-with-provider-001",
478
- "data": {
479
- "primary": "custom-dashscope-aliyuncs-com/qwen3.6-flash",
480
- "provider": "custom-dashscope-aliyuncs-com"
481
- }
482
- }
483
- ```
484
-
485
- **行为**
486
- - 写入:`agents.defaults.model.primary`
487
- - 不写入:`agents.defaults.model.provider`
488
- - 如果传了 `provider`,只校验它必须等于 `primary` 的前缀。
489
- - 如果 `primary` 不在 `agents.defaults.models` allowlist 中,会返回 `MODEL_NOT_ALLOWED`。
490
-
491
- ### modelsUpdate - 更新 custom provider,可选同时切默认模型
492
-
493
- 新增 custom provider
494
- 修改 custom provider 的 baseUrl / apiKey / api
495
- 更新 custom provider 的 models[]
496
- 更新 provider 后顺手用 primaryModel 切到这个模型
497
-
498
- 暂时不要custom provider 就不需要管这个接口
499
-
500
-
501
- 调整:主要维护 `models.providers`,需要切模型时传 `primaryModel`。
502
-
503
- **什么时候用**
504
- - 新增或更新 custom provider。
505
- - 更新 provider 的 base URL、API key、协议类型或模型列表。
506
- - 需要在更新 provider 后同时切到某个模型。
507
-
508
- **只更新 provider**
509
- ```json
510
- {
511
- "type": "modelsUpdate",
512
- "trace_id": "models-update-provider-001",
513
- "data": {
514
- "provider": "custom-dashscope-aliyuncs-com",
515
- "providerConfig": {
516
- "baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1",
517
- "api": "openai-completions",
518
- "apiKey": "YOUR_API_KEY",
519
- "models": [
520
- {
521
- "id": "qwen3.6-flash",
522
- "name": "qwen3.6-flash (Custom Provider)"
523
- }
524
- ]
525
- }
526
- }
527
- }
528
- ```
529
-
530
- **更新 provider 并切默认模型**
531
- ```json
532
- {
533
- "type": "modelsUpdate",
534
- "trace_id": "models-update-and-switch-001",
535
- "data": {
536
- "primaryModel": "custom-dashscope-aliyuncs-com/qwen3.6-flash",
537
- "provider": "custom-dashscope-aliyuncs-com",
538
- "providerConfig": {
539
- "baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1",
540
- "api": "openai-completions",
541
- "apiKey": "YOUR_API_KEY",
542
- "models": [
543
- {
544
- "id": "qwen3.6-flash",
545
- "name": "qwen3.6-flash (Custom Provider)"
546
- }
547
- ]
548
- }
549
- }
550
- }
551
- ```
552
-
553
- **带 modelProvider 的兼容校验**
554
- ```json
555
- {
556
- "type": "modelsUpdate",
557
- "trace_id": "models-update-with-model-provider-001",
558
- "data": {
559
- "primaryModel": "custom-dashscope-aliyuncs-com/qwen3.6-flash",
560
- "modelProvider": "custom-dashscope-aliyuncs-com"
561
- }
562
- }
563
- ```
564
-
565
- **行为**
566
- - `provider + providerConfig` 写入并合并到 `models.providers[provider]`。
567
- - `primaryModel` 写入 `agents.defaults.model.primary`。
568
- - `modelProvider` 不能单独传;它只在同时传 `primaryModel` 时做兼容校验。
569
- - 不写入 `agents.defaults.model.provider`。
570
-
571
- **providerConfig 允许字段**
572
- - `apiKey`
573
- - `api`
574
- - `baseUrl`
575
- - `models`
576
- - `name`
577
- - `label`
578
- - `model`
579
- - `temperature`
580
- - `maxTokens`
581
- - `topP`
582
- - `frequencyPenalty`
583
- - `presencePenalty`
584
-
585
- ### agentsUpdate - 切换指定 agent 模型
586
-
587
- 调整:只允许写 agent 的 `model.primary`,不再写 `model.provider`。
588
-
589
- **什么时候用**
590
- - 只切某个命名 agent 的模型,而不是默认模型。
591
-
592
- **请求**
593
- ```json
594
- {
595
- "type": "agentsUpdate",
596
- "trace_id": "agent-switch-model-001",
597
- "data": {
598
- "agentId": "my-agent",
599
- "updates": {
600
- "model.primary": "custom-dashscope-aliyuncs-com/qwen3.6-flash"
601
- }
602
- }
603
- }
604
- ```
605
-
606
- **行为**
607
- - 只能写 `model.primary`。
608
- - 不能写 `model.provider`。
609
-
610
- ---
611
-
612
- ## Mem9 管理 (Mem9)
613
-
614
- ### mem9Install - 安装并配置 Mem9
615
-
616
- **说明**
617
- - 调用 `openclaw plugins install @mem9/mem9` 安装 Mem9 插件。
618
- - 调用 `POST https://api.mem9.ai/v1alpha1/mem9s` 创建新的云端 key。
619
- - 将 `plugins.entries.mem9` 和 `plugins.slots.memory` 写入 `openclaw.json`。
620
- - 尝试重启 `openclaw-gateway.service`。
621
- - 已经存在有效的 mem9 key 时,不会重复创建新 key,而是复用现有配置。
622
-
623
- **请求**
624
- ```json
625
- {
626
- "type": "mem9Install",
627
- "trace_id": "mem9-install-001",
628
- "data": {}
629
- }
630
- ```
631
-
632
- **成功响应 data**
633
- ```json
634
- {
635
- "ok": true,
636
- "installed": true,
637
- "alreadyInstalled": true,
638
- "alreadyConfigured": true,
639
- "createdNewKey": false,
640
- "reusedExistingKey": true,
641
- "plugin": "mem9",
642
- "apiUrl": "https://api.mem9.ai",
643
- "apiKey": "generated-or-existing-id",
644
- "updated": [
645
- "plugins.entries.mem9",
646
- "plugins.slots.memory"
647
- ],
648
- "restart": {
649
- "attempted": true,
650
- "success": true
651
- }
652
- }
653
- ```
654
-
655
- **幂等行为**
656
- - 如果 Mem9 已安装且 `plugins.entries.mem9.config.apiKey` 已存在,则直接复用当前 key。
657
- - 如果 Mem9 已安装但没有 key,则创建新 key 并补齐配置。
658
- - 如果 Mem9 未安装,则执行完整安装流程。
659
-
660
- **错误码**
661
- - `MEM9_OPENCLAW_NOT_FOUND`
662
- - `MEM9_NODE_NOT_FOUND`
663
- - `MEM9_CONFIG_NOT_FOUND`
664
- - `MEM9_PLUGIN_INSTALL_FAILED`
665
- - `MEM9_KEY_CREATE_FAILED`
666
-
667
- ---
668
-
669
- ### mem9GetConfig - 获取 Mem9 配置
670
-
671
- **说明**
672
- - 返回当前 Mem9 的安装状态、启用状态、`apiUrl`、`apiKey` 和 memory slot。
673
- - 当前返回 `apiKey` 明文,适合前端直接使用。
674
-
675
- **请求**
676
- ```json
677
- {
678
- "type": "mem9GetConfig",
679
- "trace_id": "mem9-get-config-001",
680
- "data": {}
681
- }
682
- ```
683
-
684
- **成功响应 data**
685
- ```json
686
- {
687
- "ok": true,
688
- "installed": true,
689
- "configured": true,
690
- "plugin": "mem9",
691
- "enabled": true,
692
- "apiUrl": "https://api.mem9.ai",
693
- "apiKey": "4dc48913-d74e-4677-8fed-c2ee41de8d1d",
694
- "slot": "mem9"
695
- }
696
- ```
697
-
698
- ---
699
-
700
- ### mem9Reconnect - 替换 Mem9 Key
701
-
702
- **说明**
703
- - 只替换 `plugins.entries.mem9.config.apiKey`。
704
- - 同时确保 `plugins.entries.mem9.enabled = true` 和 `plugins.slots.memory = "mem9"`。
705
- - 尝试重启 `openclaw-gateway.service`。
706
- - 不重新安装 mem9 插件。
707
-
708
- **请求**
709
- ```json
710
- {
711
- "type": "mem9Reconnect",
712
- "trace_id": "mem9-reconnect-001",
713
- "data": {
714
- "key": "new-mem9-key"
715
- }
716
- }
717
- ```
718
-
719
- **成功响应 data**
720
- ```json
721
- {
722
- "ok": true,
723
- "reconnected": true,
724
- "replacedExistingKey": true,
725
- "plugin": "mem9",
726
- "apiUrl": "https://api.mem9.ai",
727
- "apiKey": "new-mem9-key",
728
- "updated": [
729
- "plugins.entries.mem9.config.apiKey"
730
- ],
731
- "restart": {
732
- "attempted": true,
733
- "success": true
734
- }
735
- }
736
- ```
737
-
738
- **错误码**
739
- - `MEM9_KEY_REQUIRED`
740
- - `MEM9_CONFIG_NOT_FOUND`
741
- - `MEM9_RESTART_FAILED`
742
-
743
- ---
744
-
745
- ## 使用统计 (Usage)
746
-
747
- ### usageSummary - 获取使用统计摘要
748
-
749
- **请求**
750
- ```json
751
- {
752
- "type": "usageSummary",
753
- "trace_id": "usage-summary-001",
754
- "data": {}
755
- }
756
- ```
757
-
758
- ---
759
-
760
- ### usagePageSummary - 获取页面使用统计
761
-
762
- **说明**
763
- - 用途:获取一个完整的使用统计概览页面,包含多个维度的汇总数据。
764
- - 返回内容:
765
- - `totals` - 总体统计指标(token、成本、消息数等)
766
- - `topModels` - 使用最多的前 10 个模型排行
767
- - `topProviders` - 使用最多的前 10 个提供商排行
768
- - `topTools` - 使用最多的前 10 个工具排行
769
- - `topAgents` - 使用最多的前 10 个代理排行
770
- - `topChannels` - 使用最多的前 10 个渠道排行
771
- - `sessions` - 会话列表
772
- - `meta` - 元数据(扫描的会话数、数据源等)
773
-
774
- **请求**
775
- ```json
776
- {
777
- "type": "usagePageSummary",
778
- "trace_id": "usage-page-001",
779
- "data": {}
780
- }
781
- ```
782
-
783
- ---
784
-
785
- ### usageTimeseries - 获取时间序列数据
786
-
787
- **说明**
788
- - 用途:获取按时间分组的使用数据,用于绘制趋势图表。
789
- - 参数:
790
- - `granularity` - 时间粒度(`day` / `hour` / `week` 等)
791
- - 返回内容:
792
- - `series` - 时间序列数组,每个元素表示一个时间桶
793
- - `ts` - 当前时间桶的起始时间
794
- - `messages` - 当前时间桶内的消息数
795
- - `sessions` - 当前时间桶内涉及的会话数
796
- - `inputTokens` - 当前时间桶内输入 token 总数
797
- - `outputTokens` - 当前时间桶内输出 token 总数
798
- - `cacheReadTokens` - 当前时间桶内缓存读取 token 总数
799
- - `cacheWriteTokens` - 当前时间桶内缓存写入 token 总数
800
- - `totalTokens` - 当前时间桶内总 token 数
801
- - `totalCostUsd` - 当前时间桶内总成本
802
- - `toolCalls` - 当前时间桶内工具调用次数
803
- - `errors` - 当前时间桶内错误次数
804
- - `avgTokensPerMessage` - 当前时间桶内平均每条消息的 token 数
805
- - `throughputTokPerMin` - 当前时间桶内折算的 token 吞吐量(token/分钟)
806
-
807
- **请求**
808
- ```json
809
- {
810
- "type": "usageTimeseries",
811
- "trace_id": "usage-timeseries-001",
812
- "data": {
813
- "granularity": "day"
814
- }
815
- }
816
- ```
817
-
818
- ---
819
-
820
- ### usageBreakdown - 获取使用明细
821
-
822
- **说明**
823
- - 参数:
824
- - `dimension` - 分组维度(`model` / `provider` / `agent` / `channel` / `tool`)
825
- - `limit` - 返回前 N 条记录(默认 20)
826
- - `sortBy` - 排序字段(`totalTokens` / `totalCostUsd` 等)
827
- - `order` - 排序方向(`asc` / `desc`)
828
- - 返回内容:
829
- - `rows` - 按维度分组的统计行,每行包含:
830
- - 维度值(例如具体的模型名)
831
- - 该维度的使用统计(token、成本、消息数等)
832
- - 占总量的百分比
833
-
834
- **请求**
835
- ```json
836
- {
837
- "type": "usageBreakdown",
838
- "trace_id": "usage-breakdown-001",
839
- "data": {
840
- "dimension": "model"
841
- }
842
- }
843
- ```
844
-
845
- ---
846
-
847
- ## 技能管理 (Skills)
848
-
849
- **说明**
850
- - 所有技能相关操作统一使用 `slug`,不要使用 `skillId`。
851
-
852
- ### skillsListInstalled - 列出已安装技能
853
-
854
- **请求**
855
- ```json
856
- {
857
- "type": "skillsListInstalled",
858
- "trace_id": "skills-list-001",
859
- "data": {}
860
- }
861
- ```
862
-
863
- ---
864
-
865
- ### skillsInstallFromNpm - 从 NPM 安装技能
866
-
867
- **请求**
868
-
869
- ```json
870
- {
871
- "type": "skillsInstallFromNpm",
872
- "trace_id": "skills-install-001",
873
- "data": {
874
- "package": "@openclaw/skill-example",
875
- "scope": "global"
876
- }
877
- }
878
- ```
879
-
880
- ---
881
-
882
- ### skillsSearchClawHub - 搜索 ClawHub 技能
883
-
884
- **说明**
885
- - 调用 OpenClaw CLI 执行 `openclaw skills search`。
886
- - `query` 可选;不传时返回默认搜索结果,具体结果取决于 OpenClaw CLI。
887
-
888
- **请求**
889
-
890
- ```json
891
- {
892
- "type": "skillsSearchClawHub",
893
- "trace_id": "skills-search-clawhub-001",
894
- "data": {
895
- "query": "browser"
896
- }
897
- }
898
- ```
899
-
900
- ---
901
-
902
- ### skillsInstallFromClawHub - 从 ClawHub 安装技能
903
-
904
- **说明**
905
- - 调用 OpenClaw CLI 执行 `openclaw skills install <slug>`。
906
- - 安装后如需启用,继续调用 `skillsToggle`。
907
-
908
- **请求**
909
- ```json
910
- {
911
- "type": "skillsInstallFromClawHub",
912
- "trace_id": "skills-install-clawhub-001",
913
- "data": {
914
- "slug": "browser"
915
- }
916
- }
917
- ```
918
-
919
- ---
920
-
921
- ### skillsUpdateFromClawHub - 更新 ClawHub 技能
922
-
923
- **说明**
924
- - 调用 OpenClaw CLI 执行 `openclaw skills update <slug>`。
925
-
926
- **请求**
927
- ```json
928
- {
929
- "type": "skillsUpdateFromClawHub",
930
- "trace_id": "skills-update-clawhub-001",
931
- "data": {
932
- "slug": "browser"
933
- }
934
- }
935
- ```
936
-
937
- ---
938
-
939
- ### skillsGetInstalled - 获取已安装技能详情
940
-
941
- **请求**
942
- ```json
943
- {
944
- "type": "skillsGetInstalled",
945
- "trace_id": "skills-get-001",
946
- "data": {
947
- "slug": "letsping"
948
- }
949
- }
950
- ```
951
-
952
- ---
953
-
954
- ### skillsUninstall - 卸载技能 *
955
-
956
- **请求**
957
- ```json
958
- {
959
- "type": "skillsUninstall",
960
- "trace_id": "skills-uninstall-001",
961
- "data": {
962
- "slug": "letsping",
963
- "scope": "global"
964
- }
965
- }
966
- ```
967
-
968
- ---
969
-
970
- ### skillsToggle - 启用/停用技能
971
-
972
- **请求**
973
-
974
- ```json
975
- {
976
- "type": "skillsToggle",
977
- "trace_id": "skills-toggle-001",
978
- "data": {
979
- "slug": "letsping",
980
- "enabled": true
981
- }
982
- }
983
- ```
984
-
985
- ---
986
-
987
- ## 记忆管理 (Memory)
988
-
989
- **说明**
990
- - 当前备份/恢复白名单固定为:
991
- - `openclaw.json`
992
- - `workspace/AGENTS.md`
993
- - `workspace/HEARTBEAT.md`
994
- - `workspace/IDENTITY.md`
995
- - `workspace/MEMORY.md`
996
- - `workspace/SoUL.md`
997
- - `workspace/TooLS.md`
998
- - `workspace/USER.md`
999
- - `credentials/*`
1000
- - 不在上述范围内的文件不会进入备份,也不会参与恢复。
1001
-
1002
- ### memoryListFiles - 列出记忆文件
1003
-
1004
- **请求**
1005
- ```json
1006
- {
1007
- "type": "memoryListFiles",
1008
- "trace_id": "memory-list-001",
1009
- "data": {}
1010
- }
1011
- ```
1012
-
1013
- ---
1014
-
1015
- ### memoryGetFile - 获取记忆文件
1016
-
1017
- **请求**
1018
- ```json
1019
- {
1020
- "type": "memoryGetFile",
1021
- "trace_id": "memory-get-001",
1022
- "data": {
1023
- "path": "workspace/MEMORY.md"
1024
- }
1025
- }
1026
- ```
1027
-
1028
- ---
1029
-
1030
- ### memoryBackup - 创建备份快照 *
1031
-
1032
- **请求**
1033
- ```json
1034
- {
1035
- "type": "memoryBackup",
1036
- "trace_id": "memory-backup-001",
1037
- "data": {}
1038
- }
1039
- ```
1040
-
1041
- ---
1042
-
1043
- ### memoryExportZip - 导出 ZIP
1044
-
1045
- **请求**
1046
-
1047
- ```json
1048
- {
1049
- "type": "memoryExportZip",
1050
- "trace_id": "memory-export-001",
1051
- "data": {}
1052
- }
1053
- ```
1054
-
1055
- ---
1056
-
1057
- ### memoryGetPresignedPost - 获取预签名上传参数
1058
-
1059
- **请求**
1060
- ```json
1061
- {
1062
- "type": "memoryGetPresignedPost",
1063
- "trace_id": "memory-presigned-001",
1064
- "data": {
1065
- "body": {
1066
- "file_name": "memory-backup-2026-04-17.zip",
1067
- "dir": "memory/2026/04/17/"
1068
- }
1069
- }
1070
- }
1071
- ```
1072
-
1073
- ---
1074
-
1075
- ### memoryCreateBackupRecord - 创建备份记录
1076
-
1077
- **请求**
1078
-
1079
- ```json
1080
- {
1081
- "type": "memoryCreateBackupRecord",
1082
- "trace_id": "memory-backup-record-001",
1083
- "data": {
1084
- "body": {
1085
- "user_id": 1,
1086
- "source_file_key": "memory/2026/04/17/memory-backup-2026-04-17.zip",
1087
- "source_file_name": "memory-backup-2026-04-17.zip",
1088
- "source_file_url": "https://example-bucket.s3.amazonaws.com/memory/2026/04/17/memory-backup-2026-04-17.zip",
1089
- "backup_location": "s3",
1090
- "remark": "OpenClaw memory backup",
1091
- "extend_json": {
1092
- "upload_dir": "memory/2026/04/17/"
1093
- }
1094
- }
1095
- }
1096
- }
1097
- ```
1098
-
1099
- ---
1100
-
1101
- ### memoryImportZip - 导入 ZIP
1102
-
1103
- **说明**
1104
- - 同一个 `type` 同时支持:
1105
- - 全量恢复:不传 `includePaths`
1106
- - 指定文件恢复:传 `includePaths`
1107
-
1108
- **请求**
1109
-
1110
- ```json
1111
- {
1112
- "type": "memoryImportZip",
1113
- "trace_id": "memory-import-001",
1114
- "data": {
1115
- "zipPath": "path/to/backup.zip",
1116
- "createBackup": true,
1117
- "includePaths": [
1118
- "openclaw.json",
1119
- "workspace/MEMORY.md",
1120
- "credentials/"
1121
- ]
1122
- }
1123
- }
1124
- ```
1125
-
1126
- ---
1127
-
1128
- ## 其他消息类型
1129
-
1130
- **说明**
1131
- - `ping`、`status`、`echo` 是基础调试类消息。
1132
- - `systemRestart`、`systemStop`、`systemDoctorFix`、`systemLogs` 这类系统运维命令联调前建议先实际调用确认一次。
1133
-
1134
- ### ping - 健康检查
1135
-
1136
- **请求**
1137
-
1138
- ```json
1139
- {
1140
- "type": "ping",
1141
- "trace_id": "ping-001",
1142
- "data": {}
1143
- }
1144
- ```
1145
-
1146
- ---
1147
-
1148
- ### status - 获取状态
1149
-
1150
- **请求**
1151
- ```json
1152
- {
1153
- "type": "status",
1154
- "trace_id": "status-001",
1155
- "data": {}
1156
- }
1157
- ```
1158
-
1159
- ---
1160
-
1161
- ### echo - 回显测试
1162
-
1163
- **请求**
1164
- ```json
1165
- {
1166
- "type": "echo",
1167
- "trace_id": "echo-001",
1168
- "data": {
1169
- "message": "test"
1170
- }
1171
- }
1172
- ```
1173
-
1174
- ---
1175
-
1176
- ## 消息类型快速索引
1177
-
1178
- ### 系统管理
1179
- - `systemRestart`
1180
- - `systemStop`
1181
- - `systemDoctorFix`
1182
- - `systemLogs`
1183
- - `openclawUpdate`
1184
- - `pluginSelfUpdate`
1185
- - `systemCurrentVersion`
1186
- - `ping`
1187
- - `status`
1188
- - `echo`
1189
-
1190
- ### 代理管理
1191
- - `agentsGet`
1192
- - `agentsList`
1193
- - `agentsCreate`
1194
- - `agentsUpdate`
1195
- - `agentsDelete`
1196
-
1197
- ### 配置管理
1198
- - `configGet`
1199
-
1200
- ### 会话管理
1201
- - `sessionsList`
1202
- - `sessionsGet`
1203
- - `sessionsPrepareMessage`
1204
- - `sessionsAttachSkill`
1205
-
1206
- ### 模型管理
1207
- - `modelsGet`
1208
- - `modelsSet`
1209
- - `modelsUpdate`
1210
-
1211
- ### Mem9 管理
1212
- - `mem9Install`
1213
- - `mem9GetConfig`
1214
- - `mem9Reconnect`
1215
-
1216
- ### 使用统计
1217
- - `usageSummary`
1218
- - `usagePageSummary`
1219
- - `usageTimeseries`
1220
- - `usageBreakdown`
1221
-
1222
- ### 技能管理
1223
- - `skillsListInstalled`
1224
- - `skillsInstallFromNpm`
1225
- - `skillsSearchClawHub`
1226
- - `skillsInstallFromClawHub`
1227
- - `skillsUpdateFromClawHub`
1228
- - `skillsGetInstalled`
1229
- - `skillsUninstall`
1230
- - `skillsToggle`
1231
-
1232
- ### 记忆管理
1233
- - `memoryListFiles`
1234
- - `memoryGetFile`
1235
- - `memoryBackup`
1236
- - `memoryExportZip`
1237
- - `memoryGetPresignedPost`
1238
- - `memoryCreateBackupRecord`
1239
- - `memoryImportZip`
1240
-
1241
- ---
1242
-
1243
- ## Cron
1244
-
1245
- ### cronList
1246
-
1247
- 列出 cron 任务列表。
1248
-
1249
- **请求**
1250
- ```json
1251
- {
1252
- "type": "cronList",
1253
- "trace_id": "cron-list-001",
1254
- "data": {}
1255
- }
1256
- ```
1257
-
1258
- **响应 data**
1259
- ```json
1260
- {
1261
- "ok": true,
1262
- "command": "openclaw",
1263
- "args": ["cron", "list"],
1264
- "stdout": "",
1265
- "stderr": "",
1266
- "parsed": null
1267
- }
1268
- ```
1269
-
1270
- ---
1271
-
1272
- ### cronStatus
1273
-
1274
- 获取 cron 服务状态。
1275
-
1276
- **请求**
1277
- ```json
1278
- {
1279
- "type": "cronStatus",
1280
- "trace_id": "cron-status-001",
1281
- "data": {}
1282
- }
1283
- ```
1284
-
1285
- **响应 data**
1286
- ```json
1287
- {
1288
- "ok": true,
1289
- "command": "openclaw",
1290
- "args": ["cron", "status"],
1291
- "stdout": "",
1292
- "stderr": "",
1293
- "parsed": null
1294
- }
1295
- ```
1296
-
1297
- ---
1298
-
1299
- ### cronRuns
1300
-
1301
- 获取指定 cron 任务的运行记录。
1302
-
1303
- **请求**
1304
- ```json
1305
- {
1306
- "type": "cronRuns",
1307
- "trace_id": "cron-runs-001",
1308
- "data": {
1309
- "id": "cron-id",
1310
- "limit": 10
1311
- }
1312
- }
1313
- ```
1314
-
1315
- **响应 data**
1316
- ```json
1317
- {
1318
- "ok": true,
1319
- "command": "openclaw",
1320
- "args": ["cron", "runs", "--id", "cron-id", "--limit", "10"],
1321
- "stdout": "",
1322
- "stderr": "",
1323
- "parsed": null
1324
- }
1325
- ```
1326
-
1327
- ---
1328
-
1329
- ### cronAdd
1330
-
1331
- 新增 cron 任务。
1332
-
1333
- **请求 isolated**
1334
- ```json
1335
- {
1336
- "type": "cronAdd",
1337
- "trace_id": "cron-add-001",
1338
- "data": {
1339
- "name": "test isolated message",
1340
- "every": "5m",
1341
- "session": "isolated",
1342
- "message": "帮我检查一下当前状态"
1343
- }
1344
- }
1345
- ```
1346
-
1347
- **请求 main**
1348
- ```json
1349
- {
1350
- "type": "cronAdd",
1351
- "trace_id": "cron-add-002",
1352
- "data": {
1353
- "name": "test main event",
1354
- "cron": "*/10 * * * *",
1355
- "session": "main",
1356
- "systemEvent": "cron_tick"
1357
- }
1358
- }
1359
- ```
1360
-
1361
- **响应 data**
1362
- ```json
1363
- {
1364
- "ok": true,
1365
- "command": "openclaw",
1366
- "args": ["cron", "add", "--name", "test isolated message", "--every", "5m", "--session", "isolated", "--message", "帮我检查一下当前状态"],
1367
- "stdout": "",
1368
- "stderr": "",
1369
- "parsed": null
1370
- }
1371
- ```
1372
-
1373
- ---
1374
-
1375
- ### cronRename
1376
-
1377
- 修改 cron 任务名称或描述。
1378
-
1379
- **请求**
1380
- ```json
1381
- {
1382
- "type": "cronRename",
1383
- "trace_id": "cron-rename-001",
1384
- "data": {
1385
- "id": "cron-id",
1386
- "name": "new cron name",
1387
- "description": "new description"
1388
- }
1389
- }
1390
- ```
1391
-
1392
- **响应 data**
1393
- ```json
1394
- {
1395
- "ok": true,
1396
- "command": "openclaw",
1397
- "args": ["cron", "edit", "cron-id", "--name", "new cron name", "--description", "new description"],
1398
- "stdout": "",
1399
- "stderr": "",
1400
- "parsed": null
1401
- }
1402
- ```
1403
-
1404
- ---
1405
-
1406
- ### cronReschedule
1407
-
1408
- 修改 cron 任务调度时间。
1409
-
1410
- **请求**
1411
- ```json
1412
- {
1413
- "type": "cronReschedule",
1414
- "trace_id": "cron-reschedule-001",
1415
- "data": {
1416
- "id": "cron-id",
1417
- "every": "10m"
1418
- }
1419
- }
1420
- ```
1421
-
1422
- **响应 data**
1423
- ```json
1424
- {
1425
- "ok": true,
1426
- "command": "openclaw",
1427
- "args": ["cron", "edit", "cron-id", "--every", "10m"],
1428
- "stdout": "",
1429
- "stderr": "",
1430
- "parsed": null
1431
- }
1432
- ```
1433
-
1434
- ---
1435
-
1436
- ### cronUpdateMessage (isolate)
1437
-
1438
- 修改独立(isolate)任务内容。
1439
-
1440
- **请求**
1441
- ```json
1442
- {
1443
- "type": "cronUpdateMessage",
1444
- "trace_id": "cron-message-001",
1445
- "data": {
1446
- "id": "cron-id",
1447
- "message": "新的任务内容"
1448
- }
1449
- }
1450
- ```
1451
-
1452
- **响应 data**
1453
- ```json
1454
- {
1455
- "ok": true,
1456
- "command": "openclaw",
1457
- "args": ["cron", "edit", "cron-id", "--session", "isolated", "--message", "新的任务内容"],
1458
- "stdout": "",
1459
- "stderr": "",
1460
- "parsed": null
1461
- }
1462
- ```
1463
-
1464
- ---
1465
-
1466
- ### cronUpdateSystemEvent (main)
1467
-
1468
- 修改主会话系统事件。(main)在main里执行定时任务
1469
-
1470
- **请求**
1471
- ```json
1472
- {
1473
- "type": "cronUpdateSystemEvent",
1474
- "trace_id": "cron-event-001",
1475
- "data": {
1476
- "id": "cron-id",
1477
- "systemEvent": "cron_tick_updated"
1478
- }
1479
- }
1480
- ```
1481
-
1482
- **响应 data**
1483
- ```json
1484
- {
1485
- "ok": true,
1486
- "command": "openclaw",
1487
- "args": ["cron", "edit", "cron-id", "--session", "main", "--system-event", "cron_tick_updated"],
1488
- "stdout": "",
1489
- "stderr": "",
1490
- "parsed": null
1491
- }
1492
- ```
1493
-
1494
- ---
1495
-
1496
- ### cronSetContent
1497
-
1498
- 按 session 修改任务内容。isolated 定时任务的结果会单开一个聊天框(没有上下文 )
1499
-
1500
- **请求**
1501
- ```json
1502
- {
1503
- "type": "cronSetContent",
1504
- "trace_id": "cron-content-001",
1505
- "data": {
1506
- "id": "cron-id",
1507
- "session": "isolated",
1508
- "message": "新的任务内容"
1509
- }
1510
- }
1511
- ```
1512
-
1513
- **响应 data**
1514
-
1515
- ```json
1516
- {
1517
- "ok": true,
1518
- "command": "openclaw",
1519
- "args": ["cron", "edit", "cron-id", "--session", "isolated", "--message", "新的任务内容"],
1520
- "stdout": "",
1521
- "stderr": "",
1522
- "parsed": null
1523
- }
1524
- ```
1525
-
1526
- ---
1527
-
1528
- ### cronEnable
1529
-
1530
- 启用 cron 任务。
1531
-
1532
- **请求**
1533
- ```json
1534
- {
1535
- "type": "cronEnable",
1536
- "trace_id": "cron-enable-001",
1537
- "data": {
1538
- "id": "cron-id"
1539
- }
1540
- }
1541
- ```
1542
-
1543
- **响应 data**
1544
- ```json
1545
- {
1546
- "ok": true,
1547
- "command": "openclaw",
1548
- "args": ["cron", "enable", "cron-id"],
1549
- "stdout": "",
1550
- "stderr": "",
1551
- "parsed": null
1552
- }
1553
- ```
1554
-
1555
- ---
1556
-
1557
- ### cronDisable
1558
-
1559
- 停用 cron 任务。
1560
-
1561
- **请求**
1562
- ```json
1563
- {
1564
- "type": "cronDisable",
1565
- "trace_id": "cron-disable-001",
1566
- "data": {
1567
- "id": "cron-id"
1568
- }
1569
- }
1570
- ```
1571
-
1572
- **响应 data**
1573
- ```json
1574
- {
1575
- "ok": true,
1576
- "command": "openclaw",
1577
- "args": ["cron", "disable", "cron-id"],
1578
- "stdout": "",
1579
- "stderr": "",
1580
- "parsed": null
1581
- }
1582
- ```
1583
-
1584
- ---
1585
-
1586
- ### cronRun
1587
-
1588
- 立即运行 cron 任务。
1589
-
1590
- **请求**
1591
- ```json
1592
- {
1593
- "type": "cronRun",
1594
- "trace_id": "cron-run-001",
1595
- "data": {
1596
- "id": "cron-id"
1597
- }
1598
- }
1599
- ```
1600
-
1601
- **响应 data**
1602
- ```json
1603
- {
1604
- "ok": true,
1605
- "command": "openclaw",
1606
- "args": ["cron", "run", "cron-id"],
1607
- "stdout": "",
1608
- "stderr": "",
1609
- "parsed": null
1610
- }
1611
- ```
1612
-
1613
- ---
1614
-
1615
- ### cronRemove
1616
-
1617
- 删除 cron 任务。
1618
-
1619
- **请求**
1620
- ```json
1621
- {
1622
- "type": "cronRemove",
1623
- "trace_id": "cron-remove-001",
1624
- "data": {
1625
- "id": "cron-id"
1626
- }
1627
- }
1628
- ```
1629
-
1630
- **响应 data**
1631
- ```json
1632
- {
1633
- "ok": true,
1634
- "command": "openclaw",
1635
- "args": ["cron", "rm", "cron-id"],
1636
- "stdout": "",
1637
- "stderr": "",
1638
- "parsed": null
1639
- }
1640
- ```
1641
-
1642
- ---
1643
-
1644
- **错误响应** 表示当前运行环境里找不到 `openclaw` 这个可执行文件
1645
-
1646
- ```json
1647
- {
1648
- "type": "receiver",
1649
- "trace_id": "cron-add-001",
1650
- "source": "system",
1651
- "timestamp": 1776331005170,
1652
- "success": false,
1653
- "error": "OpenClaw cron command failed: spawn openclaw ENOENT"
1654
- }
1655
- ```
1656
-
1657
- ## Pairing Endpoint 线上/线下切换
1658
-
1659
- ### 实际操作区别
1660
-
1661
- **线上用户安装/配对**
1662
-
1663
- 插件不再读取 `DEOTALAND_API_BASE_URL` 环境变量。用户正常安装后,只要发起配对,不传任何 endpoint,就固定走生产接口:
1664
-
1665
- ```txt
1666
- https://api.deotaland.ai/api-core-bot/front/agent/agent/key/query
1667
- ```
1668
-
1669
- 线上用户不需要设置环境变量,也不会因为 `process.env` 读取被新版 OpenClaw 安全扫描拦截。
1670
-
1671
- **本地/测试环境配对**
1672
-
1673
- 不要再用环境变量切换:
1674
-
1675
- ```bash
1676
- DEOTALAND_API_BASE_URL=https://api.deotaland.ai
1677
- ```
1678
-
1679
- 改成显式传参:
1680
-
1681
- ```bash
1682
- openclaw admin-bridge pair <key> --endpoint https://api.deotaland.ai
1683
- ```
1684
-
1685
- 实际请求会变成:
1686
-
1687
- ```txt
1688
- https://api.deotaland.ai/api-core-bot/front/agent/agent/key/query
1689
- ```
1690
-
1691
- 如果传完整接口 URL,插件会直接使用该 URL:
1692
-
1693
- ```bash
1694
- openclaw admin-bridge pair <key> --endpoint https://api.deotaland.ai/api-core-bot/front/agent/agent/key/query
1695
- ```
1696
-
1697
- **长期固定测试环境** (尽量 用--endpoint的方式)
1698
-
1699
- 如果不想每次都传 `--endpoint`,可以在 `openclaw.json` 里配置:
1700
-
1701
- ```json
1702
- {
1703
- "plugins": {
1704
- "entries": {
1705
- "rol-websocket-channel": {
1706
- "config": {
1707
- "pairingEndpoint": "https://api.deotaland.ai"
1708
- }
1709
- }
1710
- }
1711
- }
1712
- }
1713
- ```
1714
-
1715
- 之后配对时不传 `--endpoint`,就会走 `pairingEndpoint`。
1716
-
1717
- **临时覆盖**
1718
-
1719
- 如果 `openclaw.json` 里配置了 staging,但某次想临时走线上,可以传:
1720
-
1721
- ```bash
1722
- openclaw admin-bridge pair <key> --endpoint https://api.deotaland.ai
1723
- ```
1724
-
1725
- 当前优先级是:
1726
-
1727
- ```txt
1728
- --endpoint 参数 > openclaw.json pairingEndpoint > 默认生产地址
1729
- ```
1730
-
1731
- 命令参数永远是调用最高优先级。
1732
- ```
1733
-
1734
- 如果要走测试环境,可以在 `data` 里带 endpoint:
1735
-
1736
-
1737
- 实际效果是:线上默认更安全,线下切环境更显式,安装器不再因为环境变量读取拦截 pairing 文件。
1738
-
1739
- ---
1740
-
1741
- ```
1742
- ```
1743
-
1744
- ## Artifacts 文件下载(按需上传对象存储)
1745
-
1746
- 如果文件之前已经上传过,则不会重复上传,而是直接复用已有 `fileUrl`。
1747
-
1748
- ### Markdown 文件规则
1749
-
1750
- - 第一次扫描时,已有 `.md` 文件会作为基线记录,不会展示在 artifacts 列表里。
1751
- - 后续新生成的 `.md` 文件会进入 artifacts 列表。
1752
- - `MEMORY.md`、`SoUL.md`、`AGENTS.md`、`HEARTBEAT.md`、`IDENTITY.md`、`TooLS.md`、`USER.md` 等记忆/身份文件永远不会展示。
1753
-
1754
-
1755
-
1756
-
1757
- ### 下载前先获取列表
1758
-
1759
- 建议前端不要直接拿路径去调下载,而是先调用一次 `artifactsList`,确认当前可下载文件的 `artifactId`、`relativePath`、`storageStatus`。
1760
-
1761
- MQTT 请求示例:
1762
-
1763
- ​```json
1764
- {
1765
- "type": "artifactsList",
1766
- "trace_id": "artifact-list-before-download-001",
1767
- "data": {}
1768
- }
1769
- ```
1770
-
1771
- 典型顺序:
1772
-
1773
- 1. `artifactsList`
1774
-
1775
- {
1776
- "type": "artifactsList",
1777
- "trace_id": "artifact-list-before-download-001",
1778
- "data": {}
1779
- }
1780
-
1781
- 2. 用户选择某个文件
1782
-
1783
- 3. `artifactsEnsureUploaded`
1784
-
1785
- 4. 使用返回的 `downloadUrl`
1786
-
1787
-
1788
-
1789
- ### MQTT 请求示例
1790
-
1791
- ```json
1792
- {
1793
- "type": "artifactsEnsureUploaded",
1794
- "trace_id": "artifact-download-006",
1795
- "data": {
1796
- "baseUrl": "http://api.deotaland.local",
1797
- "authToken": "123",
1798
- "relativePath": "me.pdf",
1799
- "presignedPostBody": {
1800
- "dir": "artifacts/"
1801
- }
1802
- }
1803
- }
1804
- ```
1805
-
1806
- ### 成功返回示例
1807
-
1808
- ```json
1809
- {
1810
- "type": "receiver",
1811
- "trace_id": "artifact-download-006",
1812
- "source": "system",
1813
- "timestamp": 1777364603366,
1814
- "success": true,
1815
- "data": {
1816
- "ok": true,
1817
- "scope": "workspace",
1818
- "uploaded": true,
1819
- "artifactId": "art_fe4672f1badd",
1820
- "objectKey": "uploads/666ff786-9d01-4159-b4ae-338f385d6ae2.pdf",
1821
- "downloadUrl": "https://draft-user.s3.us-east-2.amazonaws.com/uploads/666ff786-9d01-4159-b4ae-338f385d6ae2.pdf"
1822
- }
1823
- }
1824
- ```
1825
-
1826
- ### 前端使用方式
1827
-
1828
- 1. 调 `artifactsList` 获取文件列表
1829
- 2. 用户点击下载时,调 `artifactsEnsureUploaded`
1830
- 3. 直接使用返回的 `data.downloadUrl`
1831
- 4. 如果返回 `uploaded: false`,表示这次没有重新上传,而是复用了历史上传结果
1832
-
1833
- 展示建议:
1834
-
1835
- - `category === "image"` 时,可以作为图片预览/展示。
1836
- - `category === "document"` 时,可以作为文档展示或下载。
1837
- - `storageStatus === "local_only"` 时,先调 `artifactsEnsureUploaded` 获取可访问的 `downloadUrl`。
1838
- - `storageStatus === "uploaded"` 且 `fileUrl` 存在时,可以直接使用 `fileUrl` 展示或下载。
1839
-
1840
- ---
1841
-
1842
- ## System 更新接口
1843
-
1844
- 这两个接口用于 App 按钮触发本机 OpenClaw 或当前插件更新。请求通过 MQTT 发送到当前已配对设备,插件会在本机执行对应的 `openclaw` 命令。
1845
-
1846
- ### openclawUpdate
1847
-
1848
- 作用:升级本机 OpenClaw。
1849
-
1850
- 实际执行命令:
1851
-
1852
- ```bash
1853
- npm install -g @openclaw/core@2026.5.6
1854
- openclaw --version
1855
- openclaw doctor --deep
1856
- ```
1857
-
1858
- MQTT 请求示例:
1859
-
1860
- ```json
1861
- {
1862
- "type": "openclawUpdate",
1863
- "trace_id": "openclaw-update-001",
1864
- "data": {}
1865
- }
1866
- ```
1867
-
1868
- 成功返回示例:
1869
-
1870
- ```json
1871
- {
1872
- "type": "receiver",
1873
- "trace_id": "openclaw-update-001",
1874
- "source": "system",
1875
- "success": true,
1876
- "data": {
1877
- "ok": true,
1878
- "action": "openclawUpdate",
1879
- "targetPackage": "@openclaw/core",
1880
- "targetVersion": "2026.5.6",
1881
- "restartRecommended": true,
1882
- "steps": [
1883
- {
1884
- "name": "installCore",
1885
- "command": "npm",
1886
- "args": ["install", "-g", "@openclaw/core@2026.5.6"],
1887
- "cwd": "/home/woowonjae/.openclaw",
1888
- "stdout": "...",
1889
- "stderr": ""
1890
- },
1891
- {
1892
- "name": "version",
1893
- "command": "openclaw",
1894
- "args": ["--version"],
1895
- "cwd": "/home/woowonjae/.openclaw",
1896
- "stdout": "OpenClaw 2026.5.6 ...",
1897
- "stderr": ""
1898
- },
1899
- {
1900
- "name": "doctorDeep",
1901
- "command": "openclaw",
1902
- "args": ["doctor", "--deep"],
1903
- "cwd": "/home/woowonjae/.openclaw",
1904
- "stdout": "...",
1905
- "stderr": ""
1906
- }
1907
- ]
1908
- }
1909
- }
1910
- ```
1911
-
1912
- ### pluginSelfUpdate
1913
-
1914
- 作用:升级当前 `rol-websocket-channel` 插件。
1915
-
1916
- 实际执行命令:
1917
-
1918
- ```bash
1919
- openclaw plugins update rol-websocket-channel
1920
- ```
1921
-
1922
- MQTT 请求示例:
1923
-
1924
- ```json
1925
- {
1926
- "type": "pluginSelfUpdate",
1927
- "trace_id": "plugin-self-update-001",
1928
- "data": {}
1929
- }
1930
- ```
1931
-
1932
- 成功返回示例:
1933
-
1934
- ```json
1935
- {
1936
- "type": "receiver",
1937
- "trace_id": "plugin-self-update-001",
1938
- "source": "system",
1939
- "success": true,
1940
- "data": {
1941
- "ok": true,
1942
- "action": "pluginSelfUpdate",
1943
- "plugin": "rol-websocket-channel",
1944
- "restartRecommended": true,
1945
- "command": "openclaw",
1946
- "args": ["plugins", "update", "rol-websocket-channel"],
1947
- "cwd": "/home/woowonjae/.openclaw",
1948
- "stdout": "...",
1949
- "stderr": ""
1950
- }
1951
- }
1952
- ```
1953
-
1954
- ### 失败返回
1955
-
1956
- 如果本机命令执行失败,`success` 会是 `false`,错误信息里会带上实际执行的命令、参数、工作目录、`stdout` 和 `stderr`,前端可以直接展示 `error.message` 或 `error.stderr`。
1957
-
1958
- ```json
1959
- {
1960
- "type": "receiver",
1961
- "trace_id": "plugin-self-update-001",
1962
- "source": "system",
1963
- "success": false,
1964
- "error": {
1965
- "message": "OpenClaw system command failed: Command failed: openclaw plugins update rol-websocket-channel",
1966
- "action": "pluginSelfUpdate",
1967
- "command": "openclaw",
1968
- "args": ["plugins", "update", "rol-websocket-channel"],
1969
- "cwd": "/home/woowonjae/.openclaw",
1970
- "stdout": "...",
1971
- "stderr": "..."
1972
- }
1973
- }
1974
- ```
1975
-
1976
- ---
1977
-
1978
- ## apiCoreBot 配置与 Artifact 发布(新增 configSetApiCoreBot;上传链接可返回会话)
1979
-
1980
- ### configSetApiCoreBot
1981
-
1982
- 作用:前端在需要开启文件上传/下载链接能力时主动调用,写入当前插件的 `apiCoreBot` 配置。这个配置不是配对时写入,只有收到该 MQTT 消息后才会更新 `openclaw.json`。
1983
-
1984
- 写入位置:
1985
-
1986
- ```json
1987
- {
1988
- "plugins": {
1989
- "entries": {
1990
- "rol-websocket-channel": {
1991
- "config": {
1992
- "apiCoreBot": {
1993
- "baseUrl": "http://192.168.1.23:9092",
1994
- "authToken": "123"
1995
- }
1996
- }
1997
- }
1998
- }
1999
- }
2000
- }
2001
- ```
2002
-
2003
- 默认值:
2004
-
2005
- - `baseUrl`: `http://192.168.1.23:9092`
2006
- - `authToken`: `123`
2007
-
2008
- MQTT 请求示例:
2009
-
2010
- ```json
2011
- {
2012
- "type": "configSetApiCoreBot",
2013
- "trace_id": "config-api-core-bot-001",
2014
- "data": {}
2015
- }
2016
- ```
2017
-
2018
- 如果前端需要覆盖默认值,也可以显式传入:
2019
-
2020
- ```json
2021
- {
2022
- "type": "configSetApiCoreBot",
2023
- "trace_id": "config-api-core-bot-002",
2024
- "data": {
2025
- "baseUrl": "http://192.168.1.23:9092",
2026
- "authToken": "123"
2027
- }
2028
- }
2029
- ```
2030
-
2031
- 成功返回示例:
2032
-
2033
- ```json
2034
- {
2035
- "type": "receiver",
2036
- "trace_id": "config-api-core-bot-001",
2037
- "source": "system",
2038
- "success": true,
2039
- "data": {
2040
- "ok": true,
2041
- "configFile": "/home/woowonjae/.openclaw/openclaw.json",
2042
- "updated": [
2043
- "plugins.entries.rol-websocket-channel.config.apiCoreBot.baseUrl",
2044
- "plugins.entries.rol-websocket-channel.config.apiCoreBot.authToken"
2045
- ],
2046
- "apiCoreBot": {
2047
- "baseUrl": "http://192.168.1.23:9092",
2048
- "authToken": "********"
2049
- }
2050
- }
2051
- }
2052
- ```
2053
-
2054
- ### Artifact 发布链路
2055
-
2056
- `configSetApiCoreBot` 写入成功后,Artifact 发布方法会从 `openclaw.json` 读取 `apiCoreBot.baseUrl` 和 `apiCoreBot.authToken`,再调用上传接口。小龙虾会话如果调用插件工具 `rol_artifacts_publish`,成功后会拿到可返回给用户的下载链接。
2057
-
2058
- 成功返回中的核心字段:
2059
-
2060
- ```json
2061
- {
2062
- "ok": true,
2063
- "uploaded": true,
2064
- "artifactId": "art_91f6d03e144c",
2065
- "objectKey": "uploads/91a78677-5e79-4259-a28d-fa01f24d4848.svg",
2066
- "downloadUrl": "https://draft-user.s3.us-east-2.amazonaws.com/uploads/91a78677-5e79-4259-a28d-fa01f24d4848.svg"
2067
- }
2068
- ```
2069
-
2070
- 注意:
2071
-
2072
- - 如果没有先调用 `configSetApiCoreBot`,发布时可能返回 `apiCoreBot.baseUrl is not configured`。
2073
- - `authToken` 在返回值中会脱敏显示,实际写入 `openclaw.json` 的值是 `123` 或前端传入的值。
2074
- - 生成文件本身仍然在 `.openclaw/workspace` 下,上传只在发布/下载链路触发时执行。
2075
- ---
2076
-
2077
- ## Version Management
2078
-
2079
- 查询本机版本并与期望版本比对,告知前端哪些组件需要升级。
2080
-
2081
- ### systemCurrentVersion
2082
-
2083
- **说明**
2084
- - 查询本机 OpenClaw 版本和 channel 插件版本,与期望版本比对。
2085
- - openclaw 期望版本:插件内硬编码常量(当前 `2026.5.6`)。
2086
- - channel 期望版本:`npm view rol-websocket-channel --json` 从 npm registry 获取最新发布版本。
2087
- - `npm view` 失败时回退到硬编码 `1.5.9`,不阻塞接口。
2088
- - `currentVersion !== latestVersion` → `status: "outdated"`,相等 → `status: "current"`。
2089
- - 前端只需看 `targets` 里的 `status`,哪个 `"outdated"` 就调对应的升级接口。
2090
-
2091
- **前端升级流程**
2092
- 1. 调 `systemCurrentVersion`
2093
- 2. `channel` 是 `outdated` → 调 `pluginSelfUpdate`
2094
- 3. `openclaw` 是 `outdated` → 调 `openclawUpdate`
2095
- 4. 升完重启
2096
-
2097
- **请求**
2098
- ```json
2099
- {
2100
- "type": "systemCurrentVersion",
2101
- "trace_id": "system-current-version-001",
2102
- "data": {}
2103
- }
2104
- ```
2105
-
2106
- **成功返回示例(需要升级)**
2107
- ```json
2108
- {
2109
- "type": "receiver",
2110
- "trace_id": "system-current-version-001",
2111
- "source": "system",
2112
- "success": true,
2113
- "data": {
2114
- "ok": true,
2115
- "action": "currentVersion",
2116
- "checkOnly": true,
2117
- "targets": [
2118
- {
2119
- "name": "openclaw",
2120
- "packageName": "openclaw",
2121
- "currentVersion": "2026.5.5",
2122
- "latestVersion": "2026.5.6",
2123
- "status": "outdated"
2124
- },
2125
- {
2126
- "name": "channel",
2127
- "packageName": "rol-websocket-channel",
2128
- "currentVersion": "1.4.8",
2129
- "latestVersion": "1.5.9",
2130
- "status": "outdated"
2131
- }
2132
- ],
2133
- "upgradeOrder": ["openclaw", "channel"],
2134
- "restartRecommended": true
2135
- }
2136
- }
2137
- ```
2138
-
2139
- **成功返回示例(全部最新)**
2140
- ```json
2141
- {
2142
- "type": "receiver",
2143
- "trace_id": "system-current-version-001",
2144
- "source": "system",
2145
- "success": true,
2146
- "data": {
2147
- "ok": true,
2148
- "action": "currentVersion",
2149
- "checkOnly": true,
2150
- "targets": [
2151
- {
2152
- "name": "openclaw",
2153
- "packageName": "openclaw",
2154
- "currentVersion": "2026.5.6",
2155
- "latestVersion": "2026.5.6",
2156
- "status": "current"
2157
- },
2158
- {
2159
- "name": "channel",
2160
- "packageName": "rol-websocket-channel",
2161
- "currentVersion": "1.5.9",
2162
- "latestVersion": "1.5.9",
2163
- "status": "current"
2164
- }
2165
- ],
2166
- "upgradeOrder": [],
2167
- "restartRecommended": false
2168
- }
2169
- }
2170
- ```
2171
-
2172
- **失败返回**
2173
- ```json
2174
- {
2175
- "type": "receiver",
2176
- "trace_id": "system-current-version-001",
2177
- "source": "system",
2178
- "success": false,
2179
- "error": {
2180
- "message": "OpenClaw system command failed: spawn openclaw ENOENT",
2181
- "action": "currentVersion.openclaw",
2182
- "command": "openclaw",
2183
- "args": ["--version"],
2184
- "cwd": "/home/woowonjae/.openclaw",
2185
- "stdout": "",
2186
- "stderr": ""
2187
- }
2188
- }
2189
- ```
2190
-
2191
- JSON-RPC method name: `system.currentVersion`