rol-websocket-channel 1.0.7 → 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1656 @@
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
+ ## 代理管理 (Agents)
89
+
90
+ ### agentsGet - 获取代理配置
91
+
92
+ **说明**
93
+
94
+ - `agentsGet` 偏向配置视角,返回默认代理配置、命名代理配置和当前工具配置。
95
+ - 如果前端是做代理列表页,优先使用 `agentsList`。
96
+
97
+ **请求**
98
+ ```json
99
+ {
100
+ "type": "agentsGet",
101
+ "trace_id": "agents-get-001",
102
+ "data": {}
103
+ }
104
+ ```
105
+
106
+ ---
107
+
108
+ ### agentsList - 列出所有代理
109
+
110
+ **说明**
111
+ - `agentsList` 偏向管理列表视角,返回可直接用于列表渲染的 `items`。
112
+ - 返回中通常包含 `defaults` 和所有命名代理。
113
+
114
+ **请求**
115
+ ```json
116
+ {
117
+ "type": "agentsList",
118
+ "trace_id": "agents-list-001",
119
+ "data": {}
120
+ }
121
+ ```
122
+
123
+ ---
124
+
125
+ ### agentsCreate - 创建代理
126
+
127
+ **说明**
128
+ - `agentId` 是代理唯一标识,建议前端统一使用这个字段。
129
+ - `workspace` 表示代理实际工作的目录。
130
+ - `agentDir` 表示代理自己的运行/状态目录。
131
+ - 不传 `workspace` / `agentDir` 时,后端会自动生成默认路径。
132
+
133
+ **请求**
134
+ ```json
135
+ {
136
+ "type": "agentsCreate",
137
+ "trace_id": "agents-create-001",
138
+ "data": {
139
+ "agentId": "my-agent",
140
+ "name": "My Agent",
141
+ "workspace": "/home/woowonjae/.openclaw/workspace/my-agent",
142
+ "agentDir": "/home/woowonjae/.openclaw/agents/my-agent/agent",
143
+ "modelPrimary": "custom-dashscope-aliyuncs-com/qwen-plus",
144
+ "modelProvider": "custom-dashscope-aliyuncs-com",
145
+ "toolsProfile": "coding"
146
+ }
147
+ }
148
+ ```
149
+
150
+ ---
151
+
152
+ ### agentsUpdate - 更新代理
153
+
154
+ **说明**
155
+ - 使用 `agentId` 指定要修改的代理。
156
+ - 不传 `agentId` 时,默认更新 `defaults`。
157
+ - `updates` 目前只支持这些字段:
158
+ - `name`
159
+ - `workspace`
160
+ - `agentDir`
161
+ - `model.primary`
162
+ - `model.provider`
163
+ - `skills`
164
+ - `tools.profile`
165
+ - `behavior`
166
+
167
+ **请求**
168
+
169
+ ```json
170
+ {
171
+ "type": "agentsUpdate",
172
+ "trace_id": "agents-update-001",
173
+ "data": {
174
+ "agentId": "my-agent",
175
+ "updates": {
176
+ "model.primary": "custom-dashscope-aliyuncs-com/qwen-plus",
177
+ "tools.profile": "coding"
178
+ }
179
+ }
180
+ }
181
+ ```
182
+
183
+ **更新默认代理示例**
184
+
185
+ ```json
186
+ {
187
+ "type": "agentsUpdate",
188
+ "trace_id": "agents-update-defaults-001",
189
+ "data": {
190
+ "updates": {
191
+ "model.primary": "custom-dashscope-aliyuncs-com/qwen-plus"
192
+ }
193
+ }
194
+ }
195
+ ```
196
+
197
+ ---
198
+
199
+ ### agentsDelete - 删除代理
200
+
201
+ **请求**
202
+
203
+ ```json
204
+ {
205
+ "type": "agentsDelete",
206
+ "trace_id": "agent-delete-001",
207
+ "data": {
208
+ "agentId": "coder2",
209
+ "purgeFiles": false
210
+ }
211
+ }
212
+ ```
213
+
214
+ ---
215
+
216
+ ## 配置管理 (Config)
217
+
218
+ ### configGet - 获取配置
219
+
220
+ **请求**
221
+
222
+ ```json
223
+ {
224
+ "type": "configGet",
225
+ "trace_id": "config-get-001",
226
+ "data": {}
227
+ }
228
+ ```
229
+
230
+ ---
231
+
232
+ ## 会话管理 (Sessions)
233
+
234
+ ### sessionsList - 列出所有会话
235
+
236
+ **请求**
237
+
238
+ ```json
239
+ {
240
+ "type": "sessionsList",
241
+ "trace_id": "sessions-list-001",
242
+ "data": {}
243
+ }
244
+ ```
245
+
246
+ ---
247
+
248
+ ### sessionsGet - 获取会话详情
249
+
250
+ **说明**
251
+
252
+ - 支持分页参数 `limit` 和 `offset`。
253
+ - 后端单次最多返回 `100` 条消息。
254
+
255
+ **请求**
256
+
257
+ ```json
258
+ {
259
+ "type": "sessionsGet",
260
+ "trace_id": "sessions-get-001",
261
+ "data": {
262
+ "sessionId": "session-123",
263
+ "limit": 50,
264
+ "offset": 0
265
+ }
266
+ }
267
+ ```
268
+
269
+ ---
270
+
271
+ ### sessionsPrepareMessage - 准备消息 *
272
+
273
+ **请求**
274
+
275
+ ```json
276
+ {
277
+ "type": "sessionsPrepareMessage",
278
+ "trace_id": "sessions-prepare-001",
279
+ "data": {
280
+ "sessionId": "session-123",
281
+ "message": "Hello, how are you?"
282
+ }
283
+ }
284
+ ```
285
+
286
+ ---
287
+
288
+ ### sessionsAttachSkill - 附加技能 *
289
+
290
+ **请求**
291
+
292
+ ```json
293
+ {
294
+ "type": "sessionsAttachSkill",
295
+ "trace_id": "sessions-attach-001",
296
+ "data": {
297
+ "sessionId": "session-123",
298
+ "skillSlug": "letsping",
299
+ "message": "按这个 skill 处理"
300
+ }
301
+ }
302
+ ```
303
+
304
+ ---
305
+
306
+ ## 模型管理 (Models)
307
+
308
+ ### modelsGet - 获取模型列表
309
+
310
+ **说明**
311
+ - 返回默认模型、所有 agent 的模型配置视图、模型下拉选项、模型配置模式,以及脱敏后的 provider 配置。
312
+ - 前端模型选择器使用 `modelOptions[]`。展示 `label`,提交 `value` 和 `provider`。
313
+ - `modelOptions[]` 优先从 `agents.defaults.models` 生成;如果没有配置,会从 `agents.defaults.model` 和 `agents.list[].model` 中收集当前已使用的模型作为兜底选项。
314
+ - `configuredProviders` 是脱敏后的 provider 原始配置,普通模型选择器不需要使用它。
315
+
316
+ **请求**
317
+ ```json
318
+ {
319
+ "type": "modelsGet",
320
+ "trace_id": "models-get-001",
321
+ "data": {}
322
+ }
323
+ ```
324
+
325
+ **响应**
326
+ ```json
327
+ {
328
+ "sourceConfigFile": "/home/woowonjae/.openclaw/openclaw.json",
329
+ "defaults": {
330
+ "model": {
331
+ "primary": "custom-dashscope-aliyuncs-com/qwen-plus",
332
+ "provider": "custom-dashscope-aliyuncs-com"
333
+ },
334
+ "models": {
335
+ "custom-dashscope-aliyuncs-com/qwen-plus": {
336
+ "alias": "Qwen Plus"
337
+ }
338
+ }
339
+ },
340
+ "agents": [
341
+ {
342
+ "id": "defaults",
343
+ "name": "defaults",
344
+ "model": {
345
+ "primary": "custom-dashscope-aliyuncs-com/qwen-plus",
346
+ "provider": "custom-dashscope-aliyuncs-com"
347
+ }
348
+ }
349
+ ],
350
+ "modelOptions": [
351
+ {
352
+ "label": "Qwen Plus",
353
+ "value": "custom-dashscope-aliyuncs-com/qwen-plus",
354
+ "provider": "custom-dashscope-aliyuncs-com",
355
+ "providerLabel": "Dashscope Aliyuncs Com",
356
+ "model": "qwen-plus"
357
+ }
358
+ ],
359
+ "modelConfigMode": "merge",
360
+ "configuredProviders": {}
361
+ }
362
+ ```
363
+
364
+ **前端使用方式**
365
+ - 默认模型:读取 `data.defaults.model.primary`。
366
+ - 默认 provider:读取 `data.defaults.model.provider`;如果为空,可以从选中的 `modelOptions[].provider` 获取。
367
+ - 模型下拉框:使用 `data.modelOptions`。
368
+ - agent 模型列表:使用 `data.agents[]`。
369
+
370
+ ---
371
+
372
+ ### modelsSet - 切换默认模型
373
+
374
+ **说明**
375
+ - 前端模型选择器切换默认模型时使用这个接口。
376
+ - `primary` 是唯一主字段,必须是完整的 `providerId/modelName`。
377
+ - `provider` 是可选字段,只用于校验;如果传入,必须与 `primary` 的 provider 部分一致。
378
+ - 后端写入 `agents.defaults.model.primary`,并从 `primary` 派生写入 `agents.defaults.model.provider`。
379
+ - `primary` 必须存在于 `agents.defaults.models` 白名单中;如果没有配置白名单,则只允许设置当前已使用过的模型。
380
+
381
+ **推荐配置**
382
+ ```json
383
+ {
384
+ "models": {
385
+ "mode": "merge",
386
+ "providers": {
387
+ "custom-dashscope-aliyuncs-com": {
388
+ "label": "通义千问 DashScope",
389
+ "apiKey": "YOUR_DASHSCOPE_API_KEY",
390
+ "baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1"
391
+ },
392
+ "custom-openai": {
393
+ "label": "OpenAI",
394
+ "apiKey": "YOUR_OPENAI_API_KEY",
395
+ "baseUrl": "https://api.openai.com/v1"
396
+ }
397
+ }
398
+ },
399
+ "agents": {
400
+ "defaults": {
401
+ "model": {
402
+ "primary": "custom-dashscope-aliyuncs-com/qwen-plus",
403
+ "provider": "custom-dashscope-aliyuncs-com"
404
+ },
405
+ "models": {
406
+ "custom-dashscope-aliyuncs-com/qwen-plus": {
407
+ "alias": "Qwen Plus"
408
+ },
409
+ "custom-dashscope-aliyuncs-com/qwen-max": {
410
+ "alias": "Qwen Max"
411
+ },
412
+ "custom-openai/gpt-4.1": {
413
+ "alias": "GPT-4.1"
414
+ }
415
+ }
416
+ },
417
+ "list": [
418
+ {
419
+ "id": "openai-agent",
420
+ "name": "OpenAI Agent",
421
+ "model": {
422
+ "primary": "custom-openai/gpt-4.1",
423
+ "provider": "custom-openai"
424
+ }
425
+ }
426
+ ]
427
+ }
428
+ }
429
+ ```
430
+
431
+ **请求**
432
+ ```json
433
+ {
434
+ "type": "modelsSet",
435
+ "trace_id": "models-set-001",
436
+ "data": {
437
+ "primary": "custom-dashscope-aliyuncs-com/qwen-plus"
438
+ }
439
+ }
440
+ ```
441
+
442
+ **带 provider 校验的请求** 测试
443
+ ```json
444
+ {
445
+ "type": "modelsSet",
446
+ "trace_id": "models-set-with-provider-001",
447
+ "data": {
448
+ "primary": "custom-dashscope-aliyuncs-com/qwen-plus",
449
+ "provider": "custom-dashscope-aliyuncs-com"
450
+ }
451
+ }
452
+ ```
453
+
454
+ **成功响应 data**
455
+ ```json
456
+ {
457
+ "ok": true,
458
+ "model": {
459
+ "primary": "custom-dashscope-aliyuncs-com/qwen-plus",
460
+ "provider": "custom-dashscope-aliyuncs-com"
461
+ },
462
+ "defaults": {
463
+ "model": {
464
+ "primary": "custom-dashscope-aliyuncs-com/qwen-plus",
465
+ "provider": "custom-dashscope-aliyuncs-com"
466
+ }
467
+ }
468
+ }
469
+ ```
470
+
471
+ **错误规则**
472
+ - `MODEL_PRIMARY_REQUIRED`:缺少 `primary`。
473
+ - `MODEL_PRIMARY_INVALID`:`primary` 不是 `provider/model` 格式。
474
+ - `MODEL_NOT_ALLOWED`:`primary` 不在允许的模型选项中。
475
+ - `MODEL_PROVIDER_MISMATCH`:传入的 `provider` 与 `primary` 不一致。
476
+
477
+ ---
478
+
479
+ ### modelsUpdate - 更新 provider 配置
480
+
481
+ **说明**
482
+ - 用于更新 `models.providers[provider]`。
483
+ - 不建议用它做前端模型下拉切换;默认模型切换请使用 `modelsSet`。
484
+ - `providerConfig` 会合并到已有 provider 配置中。
485
+
486
+ **请求**
487
+ ```json
488
+ {
489
+ "type": "modelsUpdate",
490
+ "trace_id": "models-update-provider-001",
491
+ "data": {
492
+ "provider": "custom-dashscope-aliyuncs-com",
493
+ "providerConfig": {
494
+ "apiKey": "YOUR_API_KEY",
495
+ "baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1"
496
+ }
497
+ }
498
+ }
499
+ ```
500
+
501
+ **切换指定 agent 模型**
502
+ ```json
503
+ {
504
+ "type": "agentsUpdate",
505
+ "trace_id": "agent-switch-model-001",
506
+ "data": {
507
+ "agentId": "my-agent",
508
+ "updates": {
509
+ "model.primary": "custom-dashscope-aliyuncs-com/qwen-plus",
510
+ "model.provider": "custom-dashscope-aliyuncs-com"
511
+ }
512
+ }
513
+ }
514
+ ```
515
+
516
+ **参数说明**
517
+ - `provider`:要更新配置的 provider ID,写入 `models.providers[provider]`。
518
+ - `providerConfig`:provider 配置增量,会合并到已有 provider 配置中。
519
+
520
+ **允许更新的 providerConfig 字段**
521
+ - `apiKey`
522
+ - `baseUrl`
523
+ - `model`
524
+ - `temperature`
525
+ - `maxTokens`
526
+ - `topP`
527
+ - `frequencyPenalty`
528
+ - `presencePenalty`
529
+
530
+ ---
531
+
532
+ ## Mem9 管理 (Mem9)
533
+
534
+ ### mem9Install - 安装并配置 Mem9
535
+
536
+ **说明**
537
+ - 调用 `openclaw plugins install @mem9/mem9` 安装 Mem9 插件。
538
+ - 调用 `POST https://api.mem9.ai/v1alpha1/mem9s` 创建新的云端 key。
539
+ - 将 `plugins.entries.mem9` 和 `plugins.slots.memory` 写入 `openclaw.json`。
540
+ - 尝试重启 `openclaw-gateway.service`。
541
+ - 已经存在有效的 mem9 key 时,不会重复创建新 key,而是复用现有配置。
542
+
543
+ **请求**
544
+ ```json
545
+ {
546
+ "type": "mem9Install",
547
+ "trace_id": "mem9-install-001",
548
+ "data": {}
549
+ }
550
+ ```
551
+
552
+ **成功响应 data**
553
+ ```json
554
+ {
555
+ "ok": true,
556
+ "installed": true,
557
+ "alreadyInstalled": true,
558
+ "alreadyConfigured": true,
559
+ "createdNewKey": false,
560
+ "reusedExistingKey": true,
561
+ "plugin": "mem9",
562
+ "apiUrl": "https://api.mem9.ai",
563
+ "apiKey": "generated-or-existing-id",
564
+ "updated": [
565
+ "plugins.entries.mem9",
566
+ "plugins.slots.memory"
567
+ ],
568
+ "restart": {
569
+ "attempted": true,
570
+ "success": true
571
+ }
572
+ }
573
+ ```
574
+
575
+ **幂等行为**
576
+ - 如果 Mem9 已安装且 `plugins.entries.mem9.config.apiKey` 已存在,则直接复用当前 key。
577
+ - 如果 Mem9 已安装但没有 key,则创建新 key 并补齐配置。
578
+ - 如果 Mem9 未安装,则执行完整安装流程。
579
+
580
+ **错误码**
581
+ - `MEM9_OPENCLAW_NOT_FOUND`
582
+ - `MEM9_NODE_NOT_FOUND`
583
+ - `MEM9_CONFIG_NOT_FOUND`
584
+ - `MEM9_PLUGIN_INSTALL_FAILED`
585
+ - `MEM9_KEY_CREATE_FAILED`
586
+
587
+ ---
588
+
589
+ ### mem9GetConfig - 获取 Mem9 配置
590
+
591
+ **说明**
592
+ - 返回当前 Mem9 的安装状态、启用状态、`apiUrl`、`apiKey` 和 memory slot。
593
+ - 当前返回 `apiKey` 明文,适合前端直接使用。
594
+
595
+ **请求**
596
+ ```json
597
+ {
598
+ "type": "mem9GetConfig",
599
+ "trace_id": "mem9-get-config-001",
600
+ "data": {}
601
+ }
602
+ ```
603
+
604
+ **成功响应 data**
605
+ ```json
606
+ {
607
+ "ok": true,
608
+ "installed": true,
609
+ "configured": true,
610
+ "plugin": "mem9",
611
+ "enabled": true,
612
+ "apiUrl": "https://api.mem9.ai",
613
+ "apiKey": "4dc48913-d74e-4677-8fed-c2ee41de8d1d",
614
+ "slot": "mem9"
615
+ }
616
+ ```
617
+
618
+ ---
619
+
620
+ ### mem9Reconnect - 替换 Mem9 Key
621
+
622
+ **说明**
623
+ - 只替换 `plugins.entries.mem9.config.apiKey`。
624
+ - 同时确保 `plugins.entries.mem9.enabled = true` 和 `plugins.slots.memory = "mem9"`。
625
+ - 尝试重启 `openclaw-gateway.service`。
626
+ - 不重新安装 mem9 插件。
627
+
628
+ **请求**
629
+ ```json
630
+ {
631
+ "type": "mem9Reconnect",
632
+ "trace_id": "mem9-reconnect-001",
633
+ "data": {
634
+ "key": "new-mem9-key"
635
+ }
636
+ }
637
+ ```
638
+
639
+ **成功响应 data**
640
+ ```json
641
+ {
642
+ "ok": true,
643
+ "reconnected": true,
644
+ "replacedExistingKey": true,
645
+ "plugin": "mem9",
646
+ "apiUrl": "https://api.mem9.ai",
647
+ "apiKey": "new-mem9-key",
648
+ "updated": [
649
+ "plugins.entries.mem9.config.apiKey"
650
+ ],
651
+ "restart": {
652
+ "attempted": true,
653
+ "success": true
654
+ }
655
+ }
656
+ ```
657
+
658
+ **错误码**
659
+ - `MEM9_KEY_REQUIRED`
660
+ - `MEM9_CONFIG_NOT_FOUND`
661
+ - `MEM9_RESTART_FAILED`
662
+
663
+ ---
664
+
665
+ ## 使用统计 (Usage)
666
+
667
+ ### usageSummary - 获取使用统计摘要
668
+
669
+ **请求**
670
+ ```json
671
+ {
672
+ "type": "usageSummary",
673
+ "trace_id": "usage-summary-001",
674
+ "data": {}
675
+ }
676
+ ```
677
+
678
+ ---
679
+
680
+ ### usagePageSummary - 获取页面使用统计
681
+
682
+ **说明**
683
+ - 用途:获取一个完整的使用统计概览页面,包含多个维度的汇总数据。
684
+ - 返回内容:
685
+ - `totals` - 总体统计指标(token、成本、消息数等)
686
+ - `topModels` - 使用最多的前 10 个模型排行
687
+ - `topProviders` - 使用最多的前 10 个提供商排行
688
+ - `topTools` - 使用最多的前 10 个工具排行
689
+ - `topAgents` - 使用最多的前 10 个代理排行
690
+ - `topChannels` - 使用最多的前 10 个渠道排行
691
+ - `sessions` - 会话列表
692
+ - `meta` - 元数据(扫描的会话数、数据源等)
693
+
694
+ **请求**
695
+ ```json
696
+ {
697
+ "type": "usagePageSummary",
698
+ "trace_id": "usage-page-001",
699
+ "data": {}
700
+ }
701
+ ```
702
+
703
+ ---
704
+
705
+ ### usageTimeseries - 获取时间序列数据
706
+
707
+ **说明**
708
+ - 用途:获取按时间分组的使用数据,用于绘制趋势图表。
709
+ - 参数:
710
+ - `granularity` - 时间粒度(`day` / `hour` / `week` 等)
711
+ - 返回内容:
712
+ - `series` - 时间序列数组,每个元素表示一个时间桶
713
+ - `ts` - 当前时间桶的起始时间
714
+ - `messages` - 当前时间桶内的消息数
715
+ - `sessions` - 当前时间桶内涉及的会话数
716
+ - `inputTokens` - 当前时间桶内输入 token 总数
717
+ - `outputTokens` - 当前时间桶内输出 token 总数
718
+ - `cacheReadTokens` - 当前时间桶内缓存读取 token 总数
719
+ - `cacheWriteTokens` - 当前时间桶内缓存写入 token 总数
720
+ - `totalTokens` - 当前时间桶内总 token 数
721
+ - `totalCostUsd` - 当前时间桶内总成本
722
+ - `toolCalls` - 当前时间桶内工具调用次数
723
+ - `errors` - 当前时间桶内错误次数
724
+ - `avgTokensPerMessage` - 当前时间桶内平均每条消息的 token 数
725
+ - `throughputTokPerMin` - 当前时间桶内折算的 token 吞吐量(token/分钟)
726
+
727
+ **请求**
728
+ ```json
729
+ {
730
+ "type": "usageTimeseries",
731
+ "trace_id": "usage-timeseries-001",
732
+ "data": {
733
+ "granularity": "day"
734
+ }
735
+ }
736
+ ```
737
+
738
+ ---
739
+
740
+ ### usageBreakdown - 获取使用明细
741
+
742
+ **说明**
743
+ - 参数:
744
+ - `dimension` - 分组维度(`model` / `provider` / `agent` / `channel` / `tool`)
745
+ - `limit` - 返回前 N 条记录(默认 20)
746
+ - `sortBy` - 排序字段(`totalTokens` / `totalCostUsd` 等)
747
+ - `order` - 排序方向(`asc` / `desc`)
748
+ - 返回内容:
749
+ - `rows` - 按维度分组的统计行,每行包含:
750
+ - 维度值(例如具体的模型名)
751
+ - 该维度的使用统计(token、成本、消息数等)
752
+ - 占总量的百分比
753
+
754
+ **请求**
755
+ ```json
756
+ {
757
+ "type": "usageBreakdown",
758
+ "trace_id": "usage-breakdown-001",
759
+ "data": {
760
+ "dimension": "model"
761
+ }
762
+ }
763
+ ```
764
+
765
+ ---
766
+
767
+ ## 技能管理 (Skills)
768
+
769
+ **说明**
770
+ - 所有技能相关操作统一使用 `slug`,不要使用 `skillId`。
771
+
772
+ ### skillsListInstalled - 列出已安装技能
773
+
774
+ **请求**
775
+ ```json
776
+ {
777
+ "type": "skillsListInstalled",
778
+ "trace_id": "skills-list-001",
779
+ "data": {}
780
+ }
781
+ ```
782
+
783
+ ---
784
+
785
+ ### skillsInstallFromNpm - 从 NPM 安装技能
786
+
787
+ **请求**
788
+
789
+ ```json
790
+ {
791
+ "type": "skillsInstallFromNpm",
792
+ "trace_id": "skills-install-001",
793
+ "data": {
794
+ "package": "@openclaw/skill-example",
795
+ "scope": "global"
796
+ }
797
+ }
798
+ ```
799
+
800
+ ---
801
+
802
+ ### skillsSearchClawHub - 搜索 ClawHub 技能
803
+
804
+ **说明**
805
+ - 调用 OpenClaw CLI 执行 `openclaw skills search`。
806
+ - `query` 可选;不传时返回默认搜索结果,具体结果取决于 OpenClaw CLI。
807
+
808
+ **请求**
809
+
810
+ ```json
811
+ {
812
+ "type": "skillsSearchClawHub",
813
+ "trace_id": "skills-search-clawhub-001",
814
+ "data": {
815
+ "query": "browser"
816
+ }
817
+ }
818
+ ```
819
+
820
+ ---
821
+
822
+ ### skillsInstallFromClawHub - 从 ClawHub 安装技能
823
+
824
+ **说明**
825
+ - 调用 OpenClaw CLI 执行 `openclaw skills install <slug>`。
826
+ - 安装后如需启用,继续调用 `skillsToggle`。
827
+
828
+ **请求**
829
+ ```json
830
+ {
831
+ "type": "skillsInstallFromClawHub",
832
+ "trace_id": "skills-install-clawhub-001",
833
+ "data": {
834
+ "slug": "browser"
835
+ }
836
+ }
837
+ ```
838
+
839
+ ---
840
+
841
+ ### skillsUpdateFromClawHub - 更新 ClawHub 技能
842
+
843
+ **说明**
844
+ - 调用 OpenClaw CLI 执行 `openclaw skills update <slug>`。
845
+
846
+ **请求**
847
+ ```json
848
+ {
849
+ "type": "skillsUpdateFromClawHub",
850
+ "trace_id": "skills-update-clawhub-001",
851
+ "data": {
852
+ "slug": "browser"
853
+ }
854
+ }
855
+ ```
856
+
857
+ ---
858
+
859
+ ### skillsGetInstalled - 获取已安装技能详情
860
+
861
+ **请求**
862
+ ```json
863
+ {
864
+ "type": "skillsGetInstalled",
865
+ "trace_id": "skills-get-001",
866
+ "data": {
867
+ "slug": "letsping"
868
+ }
869
+ }
870
+ ```
871
+
872
+ ---
873
+
874
+ ### skillsUninstall - 卸载技能 *
875
+
876
+ **请求**
877
+ ```json
878
+ {
879
+ "type": "skillsUninstall",
880
+ "trace_id": "skills-uninstall-001",
881
+ "data": {
882
+ "slug": "letsping",
883
+ "scope": "global"
884
+ }
885
+ }
886
+ ```
887
+
888
+ ---
889
+
890
+ ### skillsToggle - 启用/停用技能
891
+
892
+ **请求**
893
+
894
+ ```json
895
+ {
896
+ "type": "skillsToggle",
897
+ "trace_id": "skills-toggle-001",
898
+ "data": {
899
+ "slug": "letsping",
900
+ "enabled": true
901
+ }
902
+ }
903
+ ```
904
+
905
+ ---
906
+
907
+ ## 记忆管理 (Memory)
908
+
909
+ **说明**
910
+ - 当前备份/恢复白名单固定为:
911
+ - `openclaw.json`
912
+ - `workspace/AGENTS.md`
913
+ - `workspace/HEARTBEAT.md`
914
+ - `workspace/IDENTITY.md`
915
+ - `workspace/MEMORY.md`
916
+ - `workspace/SoUL.md`
917
+ - `workspace/TooLS.md`
918
+ - `workspace/USER.md`
919
+ - `credentials/*`
920
+ - 不在上述范围内的文件不会进入备份,也不会参与恢复。
921
+
922
+ ### memoryListFiles - 列出记忆文件
923
+
924
+ **请求**
925
+ ```json
926
+ {
927
+ "type": "memoryListFiles",
928
+ "trace_id": "memory-list-001",
929
+ "data": {}
930
+ }
931
+ ```
932
+
933
+ ---
934
+
935
+ ### memoryGetFile - 获取记忆文件
936
+
937
+ **请求**
938
+ ```json
939
+ {
940
+ "type": "memoryGetFile",
941
+ "trace_id": "memory-get-001",
942
+ "data": {
943
+ "path": "workspace/MEMORY.md"
944
+ }
945
+ }
946
+ ```
947
+
948
+ ---
949
+
950
+ ### memoryBackup - 创建备份快照 *
951
+
952
+ **请求**
953
+ ```json
954
+ {
955
+ "type": "memoryBackup",
956
+ "trace_id": "memory-backup-001",
957
+ "data": {}
958
+ }
959
+ ```
960
+
961
+ ---
962
+
963
+ ### memoryExportZip - 导出 ZIP
964
+
965
+ **请求**
966
+
967
+ ```json
968
+ {
969
+ "type": "memoryExportZip",
970
+ "trace_id": "memory-export-001",
971
+ "data": {}
972
+ }
973
+ ```
974
+
975
+ ---
976
+
977
+ ### memoryGetPresignedPost - 获取预签名上传参数
978
+
979
+ **请求**
980
+ ```json
981
+ {
982
+ "type": "memoryGetPresignedPost",
983
+ "trace_id": "memory-presigned-001",
984
+ "data": {
985
+ "body": {
986
+ "file_name": "memory-backup-2026-04-17.zip",
987
+ "dir": "memory/2026/04/17/"
988
+ }
989
+ }
990
+ }
991
+ ```
992
+
993
+ ---
994
+
995
+ ### memoryCreateBackupRecord - 创建备份记录
996
+
997
+ **请求**
998
+
999
+ ```json
1000
+ {
1001
+ "type": "memoryCreateBackupRecord",
1002
+ "trace_id": "memory-backup-record-001",
1003
+ "data": {
1004
+ "body": {
1005
+ "user_id": 1,
1006
+ "source_file_key": "memory/2026/04/17/memory-backup-2026-04-17.zip",
1007
+ "source_file_name": "memory-backup-2026-04-17.zip",
1008
+ "source_file_url": "https://example-bucket.s3.amazonaws.com/memory/2026/04/17/memory-backup-2026-04-17.zip",
1009
+ "backup_location": "s3",
1010
+ "remark": "OpenClaw memory backup",
1011
+ "extend_json": {
1012
+ "upload_dir": "memory/2026/04/17/"
1013
+ }
1014
+ }
1015
+ }
1016
+ }
1017
+ ```
1018
+
1019
+ ---
1020
+
1021
+ ### memoryImportZip - 导入 ZIP
1022
+
1023
+ **说明**
1024
+ - 同一个 `type` 同时支持:
1025
+ - 全量恢复:不传 `includePaths`
1026
+ - 指定文件恢复:传 `includePaths`
1027
+
1028
+ **请求**
1029
+
1030
+ ```json
1031
+ {
1032
+ "type": "memoryImportZip",
1033
+ "trace_id": "memory-import-001",
1034
+ "data": {
1035
+ "zipPath": "path/to/backup.zip",
1036
+ "createBackup": true,
1037
+ "includePaths": [
1038
+ "openclaw.json",
1039
+ "workspace/MEMORY.md",
1040
+ "credentials/"
1041
+ ]
1042
+ }
1043
+ }
1044
+ ```
1045
+
1046
+ ---
1047
+
1048
+ ## 其他消息类型
1049
+
1050
+ **说明**
1051
+ - `ping`、`status`、`echo` 是基础调试类消息。
1052
+ - `systemRestart`、`systemStop`、`systemDoctorFix`、`systemLogs` 这类系统运维命令联调前建议先实际调用确认一次。
1053
+
1054
+ ### ping - 健康检查
1055
+
1056
+ **请求**
1057
+
1058
+ ```json
1059
+ {
1060
+ "type": "ping",
1061
+ "trace_id": "ping-001",
1062
+ "data": {}
1063
+ }
1064
+ ```
1065
+
1066
+ ---
1067
+
1068
+ ### status - 获取状态
1069
+
1070
+ **请求**
1071
+ ```json
1072
+ {
1073
+ "type": "status",
1074
+ "trace_id": "status-001",
1075
+ "data": {}
1076
+ }
1077
+ ```
1078
+
1079
+ ---
1080
+
1081
+ ### echo - 回显测试
1082
+
1083
+ **请求**
1084
+ ```json
1085
+ {
1086
+ "type": "echo",
1087
+ "trace_id": "echo-001",
1088
+ "data": {
1089
+ "message": "test"
1090
+ }
1091
+ }
1092
+ ```
1093
+
1094
+ ---
1095
+
1096
+ ## 消息类型快速索引
1097
+
1098
+ ### 系统管理
1099
+ - `systemRestart`
1100
+ - `systemStop`
1101
+ - `systemDoctorFix`
1102
+ - `systemLogs`
1103
+ - `ping`
1104
+ - `status`
1105
+ - `echo`
1106
+
1107
+ ### 代理管理
1108
+ - `agentsGet`
1109
+ - `agentsList`
1110
+ - `agentsCreate`
1111
+ - `agentsUpdate`
1112
+ - `agentsDelete`
1113
+
1114
+ ### 配置管理
1115
+ - `configGet`
1116
+
1117
+ ### 会话管理
1118
+ - `sessionsList`
1119
+ - `sessionsGet`
1120
+ - `sessionsPrepareMessage`
1121
+ - `sessionsAttachSkill`
1122
+
1123
+ ### 模型管理
1124
+ - `modelsGet`
1125
+ - `modelsSet`
1126
+ - `modelsUpdate`
1127
+
1128
+ ### Mem9 管理
1129
+ - `mem9Install`
1130
+ - `mem9GetConfig`
1131
+ - `mem9Reconnect`
1132
+
1133
+ ### 使用统计
1134
+ - `usageSummary`
1135
+ - `usagePageSummary`
1136
+ - `usageTimeseries`
1137
+ - `usageBreakdown`
1138
+
1139
+ ### 技能管理
1140
+ - `skillsListInstalled`
1141
+ - `skillsInstallFromNpm`
1142
+ - `skillsSearchClawHub`
1143
+ - `skillsInstallFromClawHub`
1144
+ - `skillsUpdateFromClawHub`
1145
+ - `skillsGetInstalled`
1146
+ - `skillsUninstall`
1147
+ - `skillsToggle`
1148
+
1149
+ ### 记忆管理
1150
+ - `memoryListFiles`
1151
+ - `memoryGetFile`
1152
+ - `memoryBackup`
1153
+ - `memoryExportZip`
1154
+ - `memoryGetPresignedPost`
1155
+ - `memoryCreateBackupRecord`
1156
+ - `memoryImportZip`
1157
+
1158
+ ---
1159
+
1160
+ ## Cron
1161
+
1162
+ ### cronList
1163
+
1164
+ 列出 cron 任务列表。
1165
+
1166
+ **请求**
1167
+ ```json
1168
+ {
1169
+ "type": "cronList",
1170
+ "trace_id": "cron-list-001",
1171
+ "data": {}
1172
+ }
1173
+ ```
1174
+
1175
+ **响应 data**
1176
+ ```json
1177
+ {
1178
+ "ok": true,
1179
+ "command": "openclaw",
1180
+ "args": ["cron", "list"],
1181
+ "stdout": "",
1182
+ "stderr": "",
1183
+ "parsed": null
1184
+ }
1185
+ ```
1186
+
1187
+ ---
1188
+
1189
+ ### cronStatus
1190
+
1191
+ 获取 cron 服务状态。
1192
+
1193
+ **请求**
1194
+ ```json
1195
+ {
1196
+ "type": "cronStatus",
1197
+ "trace_id": "cron-status-001",
1198
+ "data": {}
1199
+ }
1200
+ ```
1201
+
1202
+ **响应 data**
1203
+ ```json
1204
+ {
1205
+ "ok": true,
1206
+ "command": "openclaw",
1207
+ "args": ["cron", "status"],
1208
+ "stdout": "",
1209
+ "stderr": "",
1210
+ "parsed": null
1211
+ }
1212
+ ```
1213
+
1214
+ ---
1215
+
1216
+ ### cronRuns
1217
+
1218
+ 获取指定 cron 任务的运行记录。
1219
+
1220
+ **请求**
1221
+ ```json
1222
+ {
1223
+ "type": "cronRuns",
1224
+ "trace_id": "cron-runs-001",
1225
+ "data": {
1226
+ "id": "cron-id",
1227
+ "limit": 10
1228
+ }
1229
+ }
1230
+ ```
1231
+
1232
+ **响应 data**
1233
+ ```json
1234
+ {
1235
+ "ok": true,
1236
+ "command": "openclaw",
1237
+ "args": ["cron", "runs", "--id", "cron-id", "--limit", "10"],
1238
+ "stdout": "",
1239
+ "stderr": "",
1240
+ "parsed": null
1241
+ }
1242
+ ```
1243
+
1244
+ ---
1245
+
1246
+ ### cronAdd
1247
+
1248
+ 新增 cron 任务。
1249
+
1250
+ **请求 isolated**
1251
+ ```json
1252
+ {
1253
+ "type": "cronAdd",
1254
+ "trace_id": "cron-add-001",
1255
+ "data": {
1256
+ "name": "test isolated message",
1257
+ "every": "5m",
1258
+ "session": "isolated",
1259
+ "message": "帮我检查一下当前状态"
1260
+ }
1261
+ }
1262
+ ```
1263
+
1264
+ **请求 main**
1265
+ ```json
1266
+ {
1267
+ "type": "cronAdd",
1268
+ "trace_id": "cron-add-002",
1269
+ "data": {
1270
+ "name": "test main event",
1271
+ "cron": "*/10 * * * *",
1272
+ "session": "main",
1273
+ "systemEvent": "cron_tick"
1274
+ }
1275
+ }
1276
+ ```
1277
+
1278
+ **响应 data**
1279
+ ```json
1280
+ {
1281
+ "ok": true,
1282
+ "command": "openclaw",
1283
+ "args": ["cron", "add", "--name", "test isolated message", "--every", "5m", "--session", "isolated", "--message", "帮我检查一下当前状态"],
1284
+ "stdout": "",
1285
+ "stderr": "",
1286
+ "parsed": null
1287
+ }
1288
+ ```
1289
+
1290
+ ---
1291
+
1292
+ ### cronRename
1293
+
1294
+ 修改 cron 任务名称或描述。
1295
+
1296
+ **请求**
1297
+ ```json
1298
+ {
1299
+ "type": "cronRename",
1300
+ "trace_id": "cron-rename-001",
1301
+ "data": {
1302
+ "id": "cron-id",
1303
+ "name": "new cron name",
1304
+ "description": "new description"
1305
+ }
1306
+ }
1307
+ ```
1308
+
1309
+ **响应 data**
1310
+ ```json
1311
+ {
1312
+ "ok": true,
1313
+ "command": "openclaw",
1314
+ "args": ["cron", "edit", "cron-id", "--name", "new cron name", "--description", "new description"],
1315
+ "stdout": "",
1316
+ "stderr": "",
1317
+ "parsed": null
1318
+ }
1319
+ ```
1320
+
1321
+ ---
1322
+
1323
+ ### cronReschedule
1324
+
1325
+ 修改 cron 任务调度时间。
1326
+
1327
+ **请求**
1328
+ ```json
1329
+ {
1330
+ "type": "cronReschedule",
1331
+ "trace_id": "cron-reschedule-001",
1332
+ "data": {
1333
+ "id": "cron-id",
1334
+ "every": "10m"
1335
+ }
1336
+ }
1337
+ ```
1338
+
1339
+ **响应 data**
1340
+ ```json
1341
+ {
1342
+ "ok": true,
1343
+ "command": "openclaw",
1344
+ "args": ["cron", "edit", "cron-id", "--every", "10m"],
1345
+ "stdout": "",
1346
+ "stderr": "",
1347
+ "parsed": null
1348
+ }
1349
+ ```
1350
+
1351
+ ---
1352
+
1353
+ ### cronUpdateMessage (isolate)
1354
+
1355
+ 修改独立(isolate)任务内容。
1356
+
1357
+ **请求**
1358
+ ```json
1359
+ {
1360
+ "type": "cronUpdateMessage",
1361
+ "trace_id": "cron-message-001",
1362
+ "data": {
1363
+ "id": "cron-id",
1364
+ "message": "新的任务内容"
1365
+ }
1366
+ }
1367
+ ```
1368
+
1369
+ **响应 data**
1370
+ ```json
1371
+ {
1372
+ "ok": true,
1373
+ "command": "openclaw",
1374
+ "args": ["cron", "edit", "cron-id", "--session", "isolated", "--message", "新的任务内容"],
1375
+ "stdout": "",
1376
+ "stderr": "",
1377
+ "parsed": null
1378
+ }
1379
+ ```
1380
+
1381
+ ---
1382
+
1383
+ ### cronUpdateSystemEvent (main)
1384
+
1385
+ 修改主会话系统事件。(main)在main里执行定时任务
1386
+
1387
+ **请求**
1388
+ ```json
1389
+ {
1390
+ "type": "cronUpdateSystemEvent",
1391
+ "trace_id": "cron-event-001",
1392
+ "data": {
1393
+ "id": "cron-id",
1394
+ "systemEvent": "cron_tick_updated"
1395
+ }
1396
+ }
1397
+ ```
1398
+
1399
+ **响应 data**
1400
+ ```json
1401
+ {
1402
+ "ok": true,
1403
+ "command": "openclaw",
1404
+ "args": ["cron", "edit", "cron-id", "--session", "main", "--system-event", "cron_tick_updated"],
1405
+ "stdout": "",
1406
+ "stderr": "",
1407
+ "parsed": null
1408
+ }
1409
+ ```
1410
+
1411
+ ---
1412
+
1413
+ ### cronSetContent
1414
+
1415
+ 按 session 修改任务内容。isolated 定时任务的结果会单开一个聊天框(没有上下文 )
1416
+
1417
+ **请求**
1418
+ ```json
1419
+ {
1420
+ "type": "cronSetContent",
1421
+ "trace_id": "cron-content-001",
1422
+ "data": {
1423
+ "id": "cron-id",
1424
+ "session": "isolated",
1425
+ "message": "新的任务内容"
1426
+ }
1427
+ }
1428
+ ```
1429
+
1430
+ **响应 data**
1431
+
1432
+ ```json
1433
+ {
1434
+ "ok": true,
1435
+ "command": "openclaw",
1436
+ "args": ["cron", "edit", "cron-id", "--session", "isolated", "--message", "新的任务内容"],
1437
+ "stdout": "",
1438
+ "stderr": "",
1439
+ "parsed": null
1440
+ }
1441
+ ```
1442
+
1443
+ ---
1444
+
1445
+ ### cronEnable
1446
+
1447
+ 启用 cron 任务。
1448
+
1449
+ **请求**
1450
+ ```json
1451
+ {
1452
+ "type": "cronEnable",
1453
+ "trace_id": "cron-enable-001",
1454
+ "data": {
1455
+ "id": "cron-id"
1456
+ }
1457
+ }
1458
+ ```
1459
+
1460
+ **响应 data**
1461
+ ```json
1462
+ {
1463
+ "ok": true,
1464
+ "command": "openclaw",
1465
+ "args": ["cron", "enable", "cron-id"],
1466
+ "stdout": "",
1467
+ "stderr": "",
1468
+ "parsed": null
1469
+ }
1470
+ ```
1471
+
1472
+ ---
1473
+
1474
+ ### cronDisable
1475
+
1476
+ 停用 cron 任务。
1477
+
1478
+ **请求**
1479
+ ```json
1480
+ {
1481
+ "type": "cronDisable",
1482
+ "trace_id": "cron-disable-001",
1483
+ "data": {
1484
+ "id": "cron-id"
1485
+ }
1486
+ }
1487
+ ```
1488
+
1489
+ **响应 data**
1490
+ ```json
1491
+ {
1492
+ "ok": true,
1493
+ "command": "openclaw",
1494
+ "args": ["cron", "disable", "cron-id"],
1495
+ "stdout": "",
1496
+ "stderr": "",
1497
+ "parsed": null
1498
+ }
1499
+ ```
1500
+
1501
+ ---
1502
+
1503
+ ### cronRun
1504
+
1505
+ 立即运行 cron 任务。
1506
+
1507
+ **请求**
1508
+ ```json
1509
+ {
1510
+ "type": "cronRun",
1511
+ "trace_id": "cron-run-001",
1512
+ "data": {
1513
+ "id": "cron-id"
1514
+ }
1515
+ }
1516
+ ```
1517
+
1518
+ **响应 data**
1519
+ ```json
1520
+ {
1521
+ "ok": true,
1522
+ "command": "openclaw",
1523
+ "args": ["cron", "run", "cron-id"],
1524
+ "stdout": "",
1525
+ "stderr": "",
1526
+ "parsed": null
1527
+ }
1528
+ ```
1529
+
1530
+ ---
1531
+
1532
+ ### cronRemove
1533
+
1534
+ 删除 cron 任务。
1535
+
1536
+ **请求**
1537
+ ```json
1538
+ {
1539
+ "type": "cronRemove",
1540
+ "trace_id": "cron-remove-001",
1541
+ "data": {
1542
+ "id": "cron-id"
1543
+ }
1544
+ }
1545
+ ```
1546
+
1547
+ **响应 data**
1548
+ ```json
1549
+ {
1550
+ "ok": true,
1551
+ "command": "openclaw",
1552
+ "args": ["cron", "rm", "cron-id"],
1553
+ "stdout": "",
1554
+ "stderr": "",
1555
+ "parsed": null
1556
+ }
1557
+ ```
1558
+
1559
+ ---
1560
+
1561
+ **错误响应** 表示当前运行环境里找不到 `openclaw` 这个可执行文件
1562
+
1563
+ ```json
1564
+ {
1565
+ "type": "receiver",
1566
+ "trace_id": "cron-add-001",
1567
+ "source": "system",
1568
+ "timestamp": 1776331005170,
1569
+ "success": false,
1570
+ "error": "OpenClaw cron command failed: spawn openclaw ENOENT"
1571
+ }
1572
+ ```
1573
+
1574
+ ## Pairing Endpoint 线上/线下切换
1575
+
1576
+ ### 实际操作区别
1577
+
1578
+ **线上用户安装/配对**
1579
+
1580
+ 插件不再读取 `DEOTALAND_API_BASE_URL` 环境变量。用户正常安装后,只要发起配对,不传任何 endpoint,就固定走生产接口:
1581
+
1582
+ ```txt
1583
+ https://api.deotaland.ai/api-core-bot/front/agent/agent/key/query
1584
+ ```
1585
+
1586
+ 线上用户不需要设置环境变量,也不会因为 `process.env` 读取被新版 OpenClaw 安全扫描拦截。
1587
+
1588
+ **本地/测试环境配对**
1589
+
1590
+ 不要再用环境变量切换:
1591
+
1592
+ ```bash
1593
+ DEOTALAND_API_BASE_URL=https://api.deotaland.ai
1594
+ ```
1595
+
1596
+ 改成显式传参:
1597
+
1598
+ ```bash
1599
+ openclaw admin-bridge pair <key> --endpoint https://api.deotaland.ai
1600
+ ```
1601
+
1602
+ 实际请求会变成:
1603
+
1604
+ ```txt
1605
+ https://api.deotaland.ai/api-core-bot/front/agent/agent/key/query
1606
+ ```
1607
+
1608
+ 如果传完整接口 URL,插件会直接使用该 URL:
1609
+
1610
+ ```bash
1611
+ openclaw admin-bridge pair <key> --endpoint https://api.deotaland.ai/api-core-bot/front/agent/agent/key/query
1612
+ ```
1613
+
1614
+ **长期固定测试环境** (尽量 用--endpoint的方式)
1615
+
1616
+ 如果不想每次都传 `--endpoint`,可以在 `openclaw.json` 里配置:
1617
+
1618
+ ```json
1619
+ {
1620
+ "plugins": {
1621
+ "entries": {
1622
+ "rol-websocket-channel": {
1623
+ "config": {
1624
+ "pairingEndpoint": "https://api.deotaland.ai"
1625
+ }
1626
+ }
1627
+ }
1628
+ }
1629
+ }
1630
+ ```
1631
+
1632
+ 之后配对时不传 `--endpoint`,就会走 `pairingEndpoint`。
1633
+
1634
+ **临时覆盖**
1635
+
1636
+ 如果 `openclaw.json` 里配置了 staging,但某次想临时走线上,可以传:
1637
+
1638
+ ```bash
1639
+ openclaw admin-bridge pair <key> --endpoint https://api.deotaland.ai
1640
+ ```
1641
+
1642
+ 当前优先级是:
1643
+
1644
+ ```txt
1645
+ --endpoint 参数 > openclaw.json pairingEndpoint > 默认生产地址
1646
+ ```
1647
+
1648
+ 命令参数永远是调用最高优先级。
1649
+ ```
1650
+
1651
+ 如果要走测试环境,可以在 `data` 里带 endpoint:
1652
+
1653
+
1654
+ 实际效果是:线上默认更安全,线下切环境更显式,安装器不再因为环境变量读取拦截 pairing 文件。
1655
+
1656
+ ---