@researai/deepscientist 1.5.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/AGENTS.md +26 -0
  2. package/README.md +19 -179
  3. package/assets/connectors/lingzhu/openclaw-bridge/README.md +124 -0
  4. package/assets/connectors/lingzhu/openclaw-bridge/index.ts +162 -0
  5. package/assets/connectors/lingzhu/openclaw-bridge/openclaw.plugin.json +145 -0
  6. package/assets/connectors/lingzhu/openclaw-bridge/package.json +35 -0
  7. package/assets/connectors/lingzhu/openclaw-bridge/src/cli.ts +180 -0
  8. package/assets/connectors/lingzhu/openclaw-bridge/src/config.ts +196 -0
  9. package/assets/connectors/lingzhu/openclaw-bridge/src/debug-log.ts +111 -0
  10. package/assets/connectors/lingzhu/openclaw-bridge/src/events.ts +4 -0
  11. package/assets/connectors/lingzhu/openclaw-bridge/src/http-handler.ts +1133 -0
  12. package/assets/connectors/lingzhu/openclaw-bridge/src/image-cache.ts +75 -0
  13. package/assets/connectors/lingzhu/openclaw-bridge/src/lingzhu-tools.ts +246 -0
  14. package/assets/connectors/lingzhu/openclaw-bridge/src/transform.ts +541 -0
  15. package/assets/connectors/lingzhu/openclaw-bridge/src/types.ts +131 -0
  16. package/assets/connectors/lingzhu/openclaw-bridge/tsconfig.json +14 -0
  17. package/assets/connectors/lingzhu/openclaw.lingzhu.config.template.json +39 -0
  18. package/bin/ds.js +233 -53
  19. package/docs/en/00_QUICK_START.md +134 -0
  20. package/docs/en/01_SETTINGS_REFERENCE.md +1104 -0
  21. package/docs/en/02_START_RESEARCH_GUIDE.md +404 -0
  22. package/docs/en/03_QQ_CONNECTOR_GUIDE.md +325 -0
  23. package/docs/en/04_LINGZHU_CONNECTOR_GUIDE.md +216 -0
  24. package/docs/en/05_TUI_GUIDE.md +141 -0
  25. package/docs/en/06_RUNTIME_AND_CANVAS.md +679 -0
  26. package/docs/en/07_MEMORY_AND_MCP.md +253 -0
  27. package/docs/en/08_FIGURE_STYLE_GUIDE.md +97 -0
  28. package/docs/en/09_DOCTOR.md +108 -0
  29. package/docs/en/90_ARCHITECTURE.md +245 -0
  30. package/docs/en/91_DEVELOPMENT.md +195 -0
  31. package/docs/en/99_ACKNOWLEDGEMENTS.md +29 -0
  32. package/docs/zh/00_QUICK_START.md +134 -0
  33. package/docs/zh/01_SETTINGS_REFERENCE.md +1137 -0
  34. package/docs/zh/02_START_RESEARCH_GUIDE.md +414 -0
  35. package/docs/zh/03_QQ_CONNECTOR_GUIDE.md +324 -0
  36. package/docs/zh/04_LINGZHU_CONNECTOR_GUIDE.md +230 -0
  37. package/docs/zh/05_TUI_GUIDE.md +128 -0
  38. package/docs/zh/06_RUNTIME_AND_CANVAS.md +271 -0
  39. package/docs/zh/07_MEMORY_AND_MCP.md +235 -0
  40. package/docs/zh/08_FIGURE_STYLE_GUIDE.md +97 -0
  41. package/docs/zh/09_DOCTOR.md +112 -0
  42. package/docs/zh/99_ACKNOWLEDGEMENTS.md +29 -0
  43. package/install.sh +32 -8
  44. package/package.json +4 -2
  45. package/pyproject.toml +1 -1
  46. package/src/deepscientist/artifact/guidance.py +9 -2
  47. package/src/deepscientist/artifact/service.py +482 -22
  48. package/src/deepscientist/bash_exec/monitor.py +27 -5
  49. package/src/deepscientist/bash_exec/runtime.py +639 -0
  50. package/src/deepscientist/bash_exec/service.py +99 -16
  51. package/src/deepscientist/bridges/base.py +3 -0
  52. package/src/deepscientist/bridges/connectors.py +292 -13
  53. package/src/deepscientist/channels/qq.py +19 -2
  54. package/src/deepscientist/channels/relay.py +1 -0
  55. package/src/deepscientist/cli.py +32 -25
  56. package/src/deepscientist/config/models.py +28 -2
  57. package/src/deepscientist/config/service.py +201 -6
  58. package/src/deepscientist/connector_runtime.py +2 -0
  59. package/src/deepscientist/daemon/api/handlers.py +50 -5
  60. package/src/deepscientist/daemon/api/router.py +1 -0
  61. package/src/deepscientist/daemon/app.py +442 -15
  62. package/src/deepscientist/doctor.py +444 -0
  63. package/src/deepscientist/home.py +1 -0
  64. package/src/deepscientist/latex_runtime.py +17 -4
  65. package/src/deepscientist/lingzhu_support.py +182 -0
  66. package/src/deepscientist/mcp/server.py +49 -2
  67. package/src/deepscientist/prompts/builder.py +181 -58
  68. package/src/deepscientist/quest/layout.py +1 -0
  69. package/src/deepscientist/quest/service.py +63 -2
  70. package/src/deepscientist/quest/stage_views.py +19 -1
  71. package/src/deepscientist/runtime_tools/__init__.py +16 -0
  72. package/src/deepscientist/runtime_tools/builtins.py +19 -0
  73. package/src/deepscientist/runtime_tools/models.py +29 -0
  74. package/src/deepscientist/runtime_tools/registry.py +40 -0
  75. package/src/deepscientist/runtime_tools/service.py +59 -0
  76. package/src/deepscientist/runtime_tools/tinytex.py +25 -0
  77. package/src/deepscientist/tinytex.py +276 -0
  78. package/src/prompts/connectors/lingzhu.md +12 -0
  79. package/src/prompts/connectors/qq.md +121 -0
  80. package/src/prompts/system.md +177 -33
  81. package/src/skills/analysis-campaign/SKILL.md +22 -6
  82. package/src/skills/baseline/SKILL.md +5 -4
  83. package/src/skills/decision/SKILL.md +4 -3
  84. package/src/skills/experiment/SKILL.md +5 -4
  85. package/src/skills/finalize/SKILL.md +5 -4
  86. package/src/skills/idea/SKILL.md +5 -4
  87. package/src/skills/intake-audit/SKILL.md +277 -0
  88. package/src/skills/intake-audit/references/state-audit-template.md +41 -0
  89. package/src/skills/rebuttal/SKILL.md +407 -0
  90. package/src/skills/rebuttal/references/action-plan-template.md +63 -0
  91. package/src/skills/rebuttal/references/evidence-update-template.md +30 -0
  92. package/src/skills/rebuttal/references/response-letter-template.md +113 -0
  93. package/src/skills/rebuttal/references/review-matrix-template.md +55 -0
  94. package/src/skills/review/SKILL.md +293 -0
  95. package/src/skills/review/references/experiment-todo-template.md +29 -0
  96. package/src/skills/review/references/review-report-template.md +83 -0
  97. package/src/skills/review/references/revision-log-template.md +40 -0
  98. package/src/skills/scout/SKILL.md +5 -4
  99. package/src/skills/write/SKILL.md +7 -3
  100. package/src/tui/dist/components/WelcomePanel.js +17 -43
  101. package/src/tui/dist/components/messages/BashExecOperationMessage.js +3 -2
  102. package/src/tui/package.json +1 -1
  103. package/src/ui/dist/assets/{AiManusChatView-7v-dHngU.js → AiManusChatView-w5lF2Ttt.js} +109 -575
  104. package/src/ui/dist/assets/{AnalysisPlugin-B_Xmz-KE.js → AnalysisPlugin-DJOED79I.js} +1 -1
  105. package/src/ui/dist/assets/{AutoFigurePlugin-Cko-0tm1.js → AutoFigurePlugin-DaG61Y0M.js} +63 -8
  106. package/src/ui/dist/assets/{CliPlugin-BsU0ht7q.js → CliPlugin-CV4LqUB_.js} +43 -609
  107. package/src/ui/dist/assets/{CodeEditorPlugin-DcMMP0Rt.js → CodeEditorPlugin-DylfAea4.js} +8 -8
  108. package/src/ui/dist/assets/{CodeViewerPlugin-BqoQ5QyY.js → CodeViewerPlugin-F7saY0LM.js} +5 -5
  109. package/src/ui/dist/assets/{DocViewerPlugin-D7eHNhU6.js → DocViewerPlugin-COP0c7jf.js} +3 -3
  110. package/src/ui/dist/assets/{GitDiffViewerPlugin-DLJN42T5.js → GitDiffViewerPlugin-CAS05pT9.js} +1 -1
  111. package/src/ui/dist/assets/{ImageViewerPlugin-gJMV7MOu.js → ImageViewerPlugin-Bco1CN_w.js} +5 -6
  112. package/src/ui/dist/assets/{LabCopilotPanel-B857sfxP.js → LabCopilotPanel-CvMlCD99.js} +12 -15
  113. package/src/ui/dist/assets/LabPlugin-BYankkE4.js +2676 -0
  114. package/src/ui/dist/assets/LabPlugin-D9jVIo0A.css +2698 -0
  115. package/src/ui/dist/assets/{LatexPlugin-DWKEo-Wj.js → LatexPlugin-LDSMR-t-.js} +16 -16
  116. package/src/ui/dist/assets/{MarkdownViewerPlugin-DBzoEmhv.js → MarkdownViewerPlugin-B7o80jgm.js} +4 -4
  117. package/src/ui/dist/assets/{MarketplacePlugin-DoHc-8vo.js → MarketplacePlugin-CM6ZOcpC.js} +3 -3
  118. package/src/ui/dist/assets/{NotebookEditor-CKjKH-yS.js → NotebookEditor-Dc61cXmK.js} +3 -3
  119. package/src/ui/dist/assets/{PdfLoader-zFoL0VPo.js → PdfLoader-DWowuQwx.js} +1 -1
  120. package/src/ui/dist/assets/{PdfMarkdownPlugin-DXPaL9Nt.js → PdfMarkdownPlugin-BsJM1q_a.js} +3 -3
  121. package/src/ui/dist/assets/{PdfViewerPlugin-DhK8qCFp.js → PdfViewerPlugin-DB2eEEFQ.js} +10 -10
  122. package/src/ui/dist/assets/{SearchPlugin-CdSi6krf.js → SearchPlugin-CraThSvt.js} +1 -1
  123. package/src/ui/dist/assets/{Stepper-V-WiDQJl.js → Stepper-CgocRTPq.js} +1 -1
  124. package/src/ui/dist/assets/{TextViewerPlugin-hIs1Efiu.js → TextViewerPlugin-B1JGhKtd.js} +4 -4
  125. package/src/ui/dist/assets/{VNCViewer-DG8b0q2X.js → VNCViewer-CclFC7FM.js} +9 -10
  126. package/src/ui/dist/assets/{bibtex-HDac6fVW.js → bibtex-D3IKsMl7.js} +1 -1
  127. package/src/ui/dist/assets/{code-BnBeNxBc.js → code-BP37Xx0p.js} +1 -1
  128. package/src/ui/dist/assets/{file-content-IRQ3jHb8.js → file-content-BAJSu-9r.js} +1 -1
  129. package/src/ui/dist/assets/{file-diff-panel-DZoQ9I6r.js → file-diff-panel-DUGeCTuy.js} +1 -1
  130. package/src/ui/dist/assets/{file-socket-BMCdLc-P.js → file-socket-CXc1Ojf7.js} +1 -1
  131. package/src/ui/dist/assets/{file-utils-CltILB3w.js → file-utils-2J21jt7M.js} +1 -1
  132. package/src/ui/dist/assets/{image-Boe6ffhu.js → image-CMMmgvcn.js} +1 -1
  133. package/src/ui/dist/assets/{index-BlplpvE1.js → index-BaVumsQT.js} +2 -2
  134. package/src/ui/dist/assets/{index-DZqJ-qAM.js → index-CWgMgpow.js} +60 -2154
  135. package/src/ui/dist/assets/{index-DO43pFZP.js → index-DmwmJmbW.js} +6372 -8434
  136. package/src/ui/dist/assets/{index-Bq2bvfkl.css → index-KGt-z-dD.css} +225 -2920
  137. package/src/ui/dist/assets/{index-2Zf65FZt.js → index-s7aHnNQ4.js} +1 -1
  138. package/src/ui/dist/assets/{message-square-mUHn_Ssb.js → message-square-CQRfX0Am.js} +1 -1
  139. package/src/ui/dist/assets/{monaco-fe0arNEU.js → monaco-B4TbdsrF.js} +1 -1
  140. package/src/ui/dist/assets/{popover-D_7i19qU.js → popover-B8Rokodk.js} +1 -1
  141. package/src/ui/dist/assets/{project-sync-DyVGrU7H.js → project-sync-D_i96KH4.js} +2 -8
  142. package/src/ui/dist/assets/{sigma-BzazRyxQ.js → sigma-D12PnzCN.js} +1 -1
  143. package/src/ui/dist/assets/{tooltip-DN_yjHFH.js → tooltip-B6YrI4aJ.js} +1 -1
  144. package/src/ui/dist/assets/trash-Bc8jGp0V.js +32 -0
  145. package/src/ui/dist/assets/{useCliAccess-DV2L2Qxy.js → useCliAccess-mXVCYSZ-.js} +12 -42
  146. package/src/ui/dist/assets/{useFileDiffOverlay-DyTj-p_V.js → useFileDiffOverlay-Bg6b9H9K.js} +1 -1
  147. package/src/ui/dist/assets/{wrap-text-ozYHtUwq.js → wrap-text-Drh5GEnL.js} +1 -1
  148. package/src/ui/dist/assets/{zoom-out-BN9MUyCQ.js → zoom-out-CJj9DZLn.js} +1 -1
  149. package/src/ui/dist/index.html +2 -2
  150. package/assets/fonts/Inter-Variable.ttf +0 -0
  151. package/assets/fonts/NotoSerifSC-Regular-C94HN_ZN.ttf +0 -0
  152. package/assets/fonts/NunitoSans-Variable.ttf +0 -0
  153. package/assets/fonts/Satoshi-Medium-ByP-Zb-9.woff2 +0 -0
  154. package/assets/fonts/SourceSans3-Variable.ttf +0 -0
  155. package/assets/fonts/ds-fonts.css +0 -83
  156. package/src/ui/dist/assets/Inter-Variable-VF2RPR_K.ttf +0 -0
  157. package/src/ui/dist/assets/LabPlugin-bL7rpic8.js +0 -43
  158. package/src/ui/dist/assets/NotoSerifSC-Regular-C94HN_ZN-C94HN_ZN.ttf +0 -0
  159. package/src/ui/dist/assets/NunitoSans-Variable-B_ZymHAd.ttf +0 -0
  160. package/src/ui/dist/assets/Satoshi-Medium-ByP-Zb-9-GkA34YXu.woff2 +0 -0
  161. package/src/ui/dist/assets/SourceSans3-Variable-CD-WOsSK.ttf +0 -0
  162. package/src/ui/dist/assets/info-CcsK_htA.js +0 -18
  163. package/src/ui/dist/assets/user-plus-BusDx-hF.js +0 -79
@@ -0,0 +1,324 @@
1
+ # 03 QQ 连接器指南:如何用 QQ 与 DeepScientist 沟通
2
+
3
+ 本文说明如何通过 QQ 与 DeepScientist 对话,以及如何在 DeepScientist 的 `Settings` 页面完成 QQ connector 配置。
4
+
5
+ 适用范围:
6
+
7
+ - 当前 DeepScientist 内置 QQ 官方 Gateway 直连方案
8
+ - 不需要公网 callback URL
9
+ - 不需要 `relay_url`
10
+ - 不需要额外安装 QQ 插件
11
+
12
+ 如果你此前参考过 OpenClaw / NanoClaw 一类的文章,请特别注意:DeepScientist 的 QQ 接入方式已经内置在运行时里,配置入口是 `Settings > Connectors > QQ`,而不是命令行安装插件。
13
+
14
+ ## 1. 你最终会得到什么
15
+
16
+ 完成本文档后,你应该可以做到:
17
+
18
+ - 用 QQ 私聊 DeepScientist
19
+ - 让 QQ 自动绑定到当前最新 quest
20
+ - 在 QQ 中使用 `/new`、`/use latest`、`/status` 等命令
21
+ - 在 `Settings` 页面看到自动检测到的 `openid`
22
+ - 从 `Settings` 页面执行非破坏性的连接测试
23
+
24
+ ### 部署前检查清单
25
+
26
+ 开始前,建议先确认下面几项:
27
+
28
+ - DeepScientist 已经成功安装,并且 daemon / web UI 正在运行
29
+ - 你可以正常打开 `Settings > Connectors`
30
+ - 你已经准备好 QQ 机器人的 `AppID` 和 `AppSecret`
31
+ - 你有一个真实的 QQ 账号可以主动给机器人发送第一条私聊消息
32
+ - 如果你修改过 QQ 配置,`Restart gateway on config change` 建议保持开启
33
+
34
+ 如果上面任意一项还没有满足,先补齐,再继续下面的配置流程,会省很多排查时间。
35
+
36
+ ## 2. 注册 QQ 机器人
37
+
38
+ 这一部分参考腾讯云开发者社区文章《OpenClaw 接入 QQ 机器人》中的注册流程与截图:
39
+
40
+ - 原文链接:https://cloud.tencent.com/developer/article/2635190
41
+ - QQ Bot 官方平台:https://bot.q.qq.com/
42
+
43
+ 建议以 QQ Bot 官方平台为准进行创建;下面的截图用于帮助你快速识别页面。
44
+
45
+ ### 2.1 打开机器人注册入口
46
+
47
+ 优先使用官方平台:
48
+
49
+ ```text
50
+ https://bot.q.qq.com/
51
+ ```
52
+
53
+ 腾讯云文章中给出的快速入口也可以作为参考:
54
+
55
+ ```text
56
+ https://q.qq.com/qqbot/openclaw/login.html
57
+ ```
58
+
59
+ ![QQ 机器人注册入口](../images/qq/tencent-cloud-qq-register.png)
60
+
61
+ ### 2.2 登录并创建机器人
62
+
63
+ 1. 使用 QQ 扫码登录。
64
+ 2. 创建一个新的 QQ 机器人。
65
+ 3. 按页面提示完成机器人的基础信息配置。
66
+
67
+ ### 2.3 立刻保存 `AppID` 和 `AppSecret`
68
+
69
+ 创建成功后,请立即记录下面两项:
70
+
71
+ | 字段 | 说明 | 是否必填到 DeepScientist |
72
+ | --- | --- | --- |
73
+ | `AppID` | 机器人唯一标识 | 必填 |
74
+ | `AppSecret` | 调用 QQ Bot API 的密钥 | 必填 |
75
+
76
+ 重要易错点:
77
+
78
+ - `AppSecret` 往往只在创建或重置时显示一次。
79
+ - 如果你没有保存 `AppSecret`,后续通常只能去控制台重置。
80
+ - DeepScientist 只需要这两个凭据即可启动 QQ 官方 Gateway 直连。
81
+
82
+ ## 3. 在 DeepScientist 里,不需要做什么
83
+
84
+ 如果你是从 OpenClaw 相关文章迁移过来的,这一节很重要。
85
+
86
+ 在 DeepScientist 中,下面这些步骤都不需要做:
87
+
88
+ - 不需要安装 `@sliverp/qqbot`
89
+ - 不需要执行 `openclaw channels add ...`
90
+ - 不需要配置公网 callback URL
91
+ - 不需要配置 `relay_url`
92
+ - 不需要在第一次联通前手动填写 `openid`
93
+
94
+ DeepScientist 当前的 QQ 路径是:
95
+
96
+ - 固定 `transport: gateway_direct`
97
+ - 直接使用 `app_id + app_secret`
98
+ - 首次私聊后自动检测并保存 `openid`
99
+
100
+ ## 4. 在 Settings 页面配置 QQ
101
+
102
+ 打开:
103
+
104
+ - [Settings > Connectors > QQ](/settings/connectors#connector-qq)
105
+
106
+ 进入后会直接定位到 `QQ` 配置卡片。当前页面按步骤分成:
107
+
108
+ - `#connector-qq-step-credentials`:填写 `App ID` 与 `App Secret`
109
+ - `#connector-qq-step-bind`:保存后,提示你先从 QQ 发送第一条私聊消息
110
+ - `#connector-qq-step-success`:OpenID 自动检测成功后的确认区域
111
+ - `#connector-qq-step-advanced`:高级设置与里程碑投递开关
112
+
113
+ ### 4.1 建议按这个顺序填写
114
+
115
+ | 字段 | 如何填写 | 建议 |
116
+ | --- | --- | --- |
117
+ | `Enabled` | 打开 | 必开 |
118
+ | `Transport` | 保持 `gateway_direct` | 固定值,不需要改 |
119
+ | `App ID` | 填 QQ 机器人后台拿到的 `AppID` | 必填 |
120
+ | `App secret` | 填 QQ 机器人后台拿到的 `AppSecret` | 必填 |
121
+ | `Detected OpenID` | 先留空 | 第一次私聊后自动填充 |
122
+
123
+ 其余高级项例如群内 @ 规则、命令前缀、自动绑定、里程碑投递,都放在 `#connector-qq-step-advanced` 里。当前默认是“里程碑投递全部开启”,只有你想减少外发内容时才需要手动关闭。
124
+
125
+ ### 4.2 推荐保存前先看清楚的几点
126
+
127
+ - QQ 不需要 `public_callback_url`
128
+ - QQ 不需要 `relay_url`
129
+ - `Detected OpenID` 不是一开始就要填的字段
130
+ - 如果你还没有给机器人发过私聊消息,那么 `Detected OpenID` 为空是正常的
131
+
132
+ ## 5. 推荐联通测试流程
133
+
134
+ 这是最稳妥、最少踩坑的一条路径。
135
+
136
+ ### 第一步:保存凭据
137
+
138
+ 先在 `QQ` 配置卡里填好:
139
+
140
+ - `App ID`
141
+ - `App secret`
142
+
143
+ 然后保存。
144
+
145
+ ### 第二步:点击“校验”
146
+
147
+ 在 `Settings` 页面点击:
148
+
149
+ - `校验`
150
+
151
+ 期望结果:
152
+
153
+ - 不再出现缺少 `app_id` 或 `app_secret` 的错误
154
+
155
+ ### 第三步:点击“全部测试”或单独“发送测试消息”
156
+
157
+ 在第一次私聊前,QQ 测试结果很可能出现这类提示:
158
+
159
+ ```text
160
+ QQ readiness is healthy, but no OpenID has been learned yet. Save credentials, then send one private QQ message so DeepScientist can auto-detect and save the `openid`.
161
+ ```
162
+
163
+ 这通常不是致命错误,而是在提醒你:
164
+
165
+ - DeepScientist 已经能做 `access_token` 交换和 `/gateway` 探测
166
+ - 但还没有一个可以主动发消息的目标 `openid`
167
+
168
+ 换句话说:
169
+
170
+ - “就绪性检查成功”不等于“已经知道该把测试消息发给谁”
171
+
172
+ ### 第四步:从你的 QQ 给机器人发第一条私聊消息
173
+
174
+ 推荐先用私聊,不要一开始就用群聊。
175
+
176
+ ![QQ 私聊机器人示意](../images/qq/tencent-cloud-qq-chat.png)
177
+
178
+ 可以发送:
179
+
180
+ ```text
181
+ /help
182
+ ```
183
+
184
+ 或者:
185
+
186
+ ```text
187
+ 你好
188
+ ```
189
+
190
+ 如果接入正常,DeepScientist 会自动检测这次私聊对应的 `openid`,并写回 `main_chat_id`。
191
+
192
+ ### 第五步:回到 Settings 页面确认状态
193
+
194
+ 重新打开或刷新 `Settings > Connectors > QQ`,或者直接回到 [#connector-qq-step-success](/settings/connectors#connector-qq-step-success),重点看:
195
+
196
+ - `Detected OpenID` 是否已经自动出现
197
+ - 右侧 `Snapshot` 中:
198
+ - `Transport` 是否是 `gateway_direct`
199
+ - `Connection` / `Auth` 是否接近 `ready`
200
+ - `Discovered targets` 是否大于 `0`
201
+ - `Bound target` 是否出现你的 `openid`
202
+
203
+ ### 第六步:再次点击“发送测试消息”
204
+
205
+ 这时再点:
206
+
207
+ - `发送测试消息`
208
+
209
+ 如果成功,说明 DeepScientist 已经能够:
210
+
211
+ - 主动向该 QQ 用户发送消息
212
+ - 接收该 QQ 用户的新消息
213
+
214
+ ### 5.1 成功后应该看到什么
215
+
216
+ 如果整个链路正常,通常会同时看到下面这些现象:
217
+
218
+ - QQ 机器人能回复 `/help`、`/status` 之类的命令
219
+ - `Settings > Connectors > QQ` 中的 `Detected OpenID` 不再为空
220
+ - `Snapshot` 里出现已经发现的目标会话,且绑定目标不是空
221
+ - 再次点击“发送测试消息”时,不再提示 target 为空
222
+ - 如果当前已经有最新 quest,普通文本会自动进入该 quest;如果还没有 quest,则优先返回帮助信息
223
+
224
+ ### 5.2 报错提示速查
225
+
226
+ | 提示 | 代表什么 | 应该怎么做 |
227
+ | --- | --- | --- |
228
+ | `app_id is required` / `app_secret is required` | 凭据没填完整 | 回到 Settings 补全后重新保存 |
229
+ | `401` / `invalid credential` / token 获取失败 | `AppID` 或 `AppSecret` 有误,或者 secret 已被重置 | 到 QQ 机器人后台重新核对并保存 |
230
+ | `QQ readiness is healthy, but no OpenID has been learned yet...` | 凭据大概率已经生效,但系统还不知道要给哪个 QQ 用户发主动消息 | 先用你的 QQ 私聊机器人一条消息,让系统自动发现 `openid` |
231
+ | `QQ callback flow usually needs public_callback_url...` | 这是旧式 callback/relay 思路下的提示,不是当前 DeepScientist 推荐路径 | 保持 `transport = gateway_direct`,不要额外配置 callback URL |
232
+ | `QQ relay mode needs relay_url...` | 说明 transport 被错误切到了 relay 模式 | 改回 `gateway_direct` |
233
+ | `Detected OpenID` 一直为空 | 机器人还没收到第一条私聊,或者配置改完后 gateway 没重启成功 | 确认先保存配置,再从 QQ 私聊机器人,必要时重启 gateway |
234
+
235
+ ## 6. 如何在 QQ 中和 DeepScientist 沟通
236
+
237
+ 常用命令:
238
+
239
+ | 命令 | 作用 |
240
+ | --- | --- |
241
+ | `/help` | 查看帮助 |
242
+ | `/projects` 或 `/list` | 查看 quest 列表 |
243
+ | `/use <quest_id>` | 绑定指定 quest |
244
+ | `/use latest` | 绑定最新 quest |
245
+ | `/new <goal>` | 新建 quest 并把当前 QQ 会话绑定过去 |
246
+ | `/status` | 查看当前 quest 状态 |
247
+
248
+ 日常沟通建议:
249
+
250
+ - 如果已经有最新 quest,普通文本通常会继续那个 quest
251
+ - 如果还没有 quest,优先发送 `/new <goal>`
252
+ - 如果你想切换到另一个 quest,显式发送 `/use <quest_id>`
253
+
254
+ ## 7. 最容易踩坑的地方
255
+
256
+ ### 7.1 误以为 QQ 需要公网回调
257
+
258
+ 当前 DeepScientist 的 QQ 方案不需要公网 callback。
259
+
260
+ 看到这些字段时,请注意:
261
+
262
+ - `public_callback_url`:不需要
263
+ - `relay_url`:不需要
264
+
265
+ ### 7.2 误以为测试失败就是凭据错了
266
+
267
+ 如果提示 target 为空,通常只是因为:
268
+
269
+ - 你还没给机器人发第一条私聊
270
+ - 系统还没自动拿到 `openid`
271
+
272
+ 这和 `app_id/app_secret` 是否有效,不是同一类问题。
273
+
274
+ ### 7.3 误以为 `openid` 需要自己去找
275
+
276
+ 在 DeepScientist 里,最简单的方式不是手工查 `openid`,而是:
277
+
278
+ 1. 先保存 `App ID` 和 `App secret`
279
+ 2. 再用 QQ 给机器人发一条私聊消息
280
+ 3. 等系统自动检测并写回 `Detected OpenID`
281
+
282
+ ### 7.4 群聊里机器人没反应
283
+
284
+ 先检查:
285
+
286
+ - 你是不是在群里没有 `@` 机器人
287
+ - `Require @ mention in groups` 是否开启
288
+
289
+ 如果你还没有跑通私聊,先不要直接排查群聊。
290
+
291
+ ### 7.5 切换了另一个 QQ 操作者,但 `main_chat_id` 还是旧的
292
+
293
+ 如果之前已经绑定过一个 `main_chat_id`,新的私聊用户不一定会自动覆盖旧值。
294
+
295
+ 这时建议:
296
+
297
+ - 先确认当前应该由谁作为主操作者
298
+ - 如有必要,手动清空或重新配置 QQ 目标,再重新测试
299
+
300
+ ## 8. 推荐的最小可行部署顺序
301
+
302
+ 如果你只想最快跑通:
303
+
304
+ 1. 创建 QQ 机器人
305
+ 2. 保存 `AppID` 和 `AppSecret`
306
+ 3. 打开 [Settings > Connectors > QQ](/settings/connectors#connector-qq)
307
+ 4. 启用 QQ,并填入 `App ID` / `App secret`
308
+ 5. 保存并点击 `校验`
309
+ 6. 用你的 QQ 私聊机器人,发送 `/help`
310
+ 7. 回到设置页确认 `Detected OpenID` 已自动出现
311
+ 8. 再次点击 `发送测试消息`
312
+ 9. 用 `/new <goal>` 或 `/use latest` 开始正式使用
313
+
314
+ ## 9. 参考资料
315
+
316
+ - 腾讯云开发者社区:《OpenClaw 接入 QQ 机器人》
317
+ - https://cloud.tencent.com/developer/article/2635190
318
+ - QQ Bot 官方平台
319
+ - https://bot.q.qq.com/
320
+
321
+ 说明:
322
+
323
+ - 本文中的“注册 QQ 机器人”流程和截图参考了上面的腾讯云文章
324
+ - 但 DeepScientist 的配置方式以当前 DeepScientist 内置 QQ connector 为准
@@ -0,0 +1,230 @@
1
+ # 04 Lingzhu 连接器指南:如何配置 Lingzhu
2
+
3
+ 本文说明如何在 `Settings > Connectors > Lingzhu` 中完成 Lingzhu 伴生端点配置。
4
+
5
+ 适用范围:
6
+
7
+ - 仅包含配置教程
8
+ - 面向 OpenClaw 兼容的 Lingzhu bridge 参数
9
+ - 本地健康检查与 SSE 冒烟测试
10
+ - 说明需要把哪些值填回 Lingzhu 平台
11
+
12
+ 本文不展开讨论云部署架构。你只需要:
13
+
14
+ - 一个已经跑起来的 OpenClaw gateway
15
+ - 一个眼镜端可访问的公网 IP 或公网域名
16
+
17
+ 参考来源:
18
+
19
+ - Rokid 论坛配置页面:https://forum.rokid.com/post/detail/2831
20
+ - 仓库内置 bridge 目录:`assets/connectors/lingzhu/openclaw-bridge`
21
+ - 仓库内置 OpenClaw 配置模板:`assets/connectors/lingzhu/openclaw.lingzhu.config.template.json`
22
+
23
+ ## 1. DeepScientist 现在会自动提供什么
24
+
25
+ Lingzhu 设置卡会自动生成并校验:
26
+
27
+ - 本地 health URL
28
+ - 本地 SSE URL
29
+ - 公网 SSE URL
30
+ - `auth_ak`
31
+ - OpenClaw 配置片段
32
+ - 本地探测 `curl`
33
+
34
+ 当前随包 bridge 还额外做了三件事:
35
+
36
+ - 在模型真正开始生成前,先自动发送一条可见的“已收到”回执
37
+ - 保留 SSE 注释心跳
38
+ - 在上游长时间静默时补发轻量可见进度心跳
39
+
40
+ 需要明确的是:
41
+
42
+ - Lingzhu 在 DeepScientist 里被视为 companion endpoint
43
+ - 它不是像 QQ 那样的完整双向聊天 connector
44
+
45
+ ## 2. 开始前请先确认
46
+
47
+ 建议先确认下面几项:
48
+
49
+ - DeepScientist 已成功安装并运行
50
+ - 本地 OpenClaw gateway 已启动
51
+ - 你知道 OpenClaw HTTP gateway 的端口,通常是 `18789`
52
+ - 你已经有公网 IP 或公网域名
53
+
54
+ 重要提醒:
55
+
56
+ - `127.0.0.1` 只能用于本地健康检查
57
+ - Lingzhu 设备侧必须访问公网地址
58
+
59
+ ## 3. 打开设置页
60
+
61
+ 打开:
62
+
63
+ - `Settings > Connectors > Lingzhu`
64
+
65
+ 页面会分成几块:
66
+
67
+ - 网关端点
68
+ - 鉴权与身份
69
+ - 自动生成值
70
+ - 探测与校验
71
+ - 高级调试
72
+
73
+ ![Lingzhu 设置概览](../images/lingzhu/lingzhu-settings-overview.svg)
74
+
75
+ ## 4. 先填写端点
76
+
77
+ 推荐值如下:
78
+
79
+ | 字段 | 推荐值 | 说明 |
80
+ | --- | --- | --- |
81
+ | `Enabled` | `true` | 开启 companion 配置 |
82
+ | `Transport` | `openclaw_sse` | 固定值,不要改 |
83
+ | `Local host` | `127.0.0.1` | 只用于本地探测 |
84
+ | `Gateway port` | `18789` | 与 OpenClaw gateway 保持一致 |
85
+ | `Public base URL` | `http://<公网IP>:18789` | 必须是眼镜端真正能访问到的地址 |
86
+
87
+ 如果你不确定本地端点应该怎么填,可以直接点击:
88
+
89
+ - `Use local defaults`
90
+
91
+ ## 5. 生成 AK 和身份值
92
+
93
+ 建议如下:
94
+
95
+ | 字段 | 推荐值 |
96
+ | --- | --- |
97
+ | `Auth AK` | 点击 `Generate AK` 自动生成 |
98
+ | `Agent ID` | `main` |
99
+ | `Lingzhu system prompt` | 可选 |
100
+
101
+ 需要保证下面两处完全一致:
102
+
103
+ - OpenClaw Lingzhu 插件配置
104
+ - Lingzhu 平台配置
105
+
106
+ 也就是:
107
+
108
+ - `auth_ak`
109
+ - `agent_id`
110
+
111
+ ## 6. 使用自动生成值
112
+
113
+ DeepScientist 会直接展示你需要复制的内容:
114
+
115
+ - 本地 health URL
116
+ - 本地 SSE URL
117
+ - 公网 SSE URL
118
+ - OpenClaw 配置片段
119
+ - 探测 curl
120
+
121
+ 其中真正要填回 Lingzhu 平台的是:
122
+
123
+ - 公网 SSE URL
124
+ - AK
125
+
126
+ ![Lingzhu 平台填写值](../images/lingzhu/lingzhu-platform-values.svg)
127
+
128
+ ## 7. 更新 OpenClaw
129
+
130
+ 你可以直接使用:
131
+
132
+ - 设置页里自动生成的配置片段
133
+ - 或仓库内置模板 `assets/connectors/lingzhu/openclaw.lingzhu.config.template.json`
134
+
135
+ 内置 bridge 的安装命令为:
136
+
137
+ ```bash
138
+ openclaw plugins install ./assets/connectors/lingzhu/openclaw-bridge
139
+ ```
140
+
141
+ 至少应确保 OpenClaw 开启:
142
+
143
+ ```json
144
+ {
145
+ "gateway": {
146
+ "port": 18789,
147
+ "http": {
148
+ "endpoints": {
149
+ "chatCompletions": {
150
+ "enabled": true
151
+ }
152
+ }
153
+ }
154
+ }
155
+ }
156
+ ```
157
+
158
+ DeepScientist 也会自动把完整的 Lingzhu 插件配置片段生成出来:
159
+
160
+ ![OpenClaw 配置片段](../images/lingzhu/lingzhu-openclaw-config.svg)
161
+
162
+ ## 8. 执行本地探测
163
+
164
+ 保存参数后,点击:
165
+
166
+ - `Run Lingzhu probe`
167
+
168
+ DeepScientist 会依次执行:
169
+
170
+ 1. `GET /metis/agent/api/health`
171
+ 2. `POST /metis/agent/api/sse`
172
+
173
+ 理想结果:
174
+
175
+ - `Connection = reachable`
176
+ - `Auth = ready`
177
+ - 探测结果没有报错
178
+
179
+ ## 9. 需要填回 Lingzhu 平台的值
180
+
181
+ 只需要填:
182
+
183
+ - `Public SSE URL`
184
+ - `Auth AK`
185
+
186
+ 不要填:
187
+
188
+ - `127.0.0.1`
189
+ - 任意本地机器名
190
+
191
+ ## 10. 常见失败原因
192
+
193
+ ### Health 显示 offline
194
+
195
+ 通常说明:
196
+
197
+ - OpenClaw 没启动
198
+ - `gateway_port` 填错
199
+ - `local_host` 填错
200
+
201
+ ### SSE probe 失败
202
+
203
+ 通常说明:
204
+
205
+ - `auth_ak` 不一致
206
+ - Lingzhu SSE 路径没有暴露出来
207
+ - OpenClaw 的 `chatCompletions.enabled` 还没打开
208
+
209
+ ### 本地探测通过,但设备仍无法接入
210
+
211
+ 通常说明:
212
+
213
+ - `Public base URL` 不是公网可达地址
214
+ - 防火墙或反向代理还没有放行端口
215
+
216
+ ## 11. 说明
217
+
218
+ 这块配置保持 registry-first:
219
+
220
+ - Lingzhu 仍然落在 `connectors.yaml`
221
+ - 自动生成值来自同一份 structured config
222
+ - 校验、测试、前端渲染都消费同一条 connector 记录
223
+
224
+ 对于长任务,更稳妥的实际策略是:
225
+
226
+ - 先由 bridge 自动回执
227
+ - 在上游静默阶段由 bridge 补发可见进度心跳
228
+ - 通过 `per_user` 会话连续保持多轮上下文
229
+
230
+ 这会明显改善兼容性,但仍不能消除 Lingzhu 平台单次请求超时的硬限制。
@@ -0,0 +1,128 @@
1
+ # 05 TUI 使用指南:如何使用终端界面
2
+
3
+ 这份文档是当前 DeepScientist TUI 的**单一权威使用说明**(以本仓库实现为准)。
4
+
5
+ 如果你想了解更完整的运行时控制流、Prompt/Skill 执行模型、MCP 语义、以及 Canvas(Git 图)如何被重建,请同时阅读 `docs/zh/06_RUNTIME_AND_CANVAS.md`。
6
+
7
+ ## 安装与启动
8
+
9
+ 在当前仓库目录中:
10
+
11
+ ```bash
12
+ pip install -e .
13
+ npm install
14
+ ```
15
+
16
+ 常用启动方式:
17
+
18
+ ```bash
19
+ ds
20
+ ds --tui
21
+ ds --both
22
+ ds --status
23
+ ds --stop
24
+ ```
25
+
26
+ 说明:
27
+
28
+ - `ds`:启动守护进程,打印醒目的本地 Web 链接,尝试自动打开浏览器,然后退出。
29
+ - `ds --tui`:启动守护进程,并进入基于 Ink 的终端工作区。
30
+ - `ds --both`:同时打开 Web 工作区,并保持终端工作区附着运行。
31
+ - `ds --stop`:停止**守护进程本身**(不是仅停止某个 quest)。
32
+ - 仍可使用 `python -m deepscientist.cli ...` 做底层操作,但推荐通过 launcher 使用。
33
+ - 在源码仓库里,`node bin/ds.js` 与 `ds` 的行为一致
34
+
35
+ ## TUI 内的核心操作
36
+
37
+ 在 TUI 中:
38
+
39
+ - `/home`:回到“未绑定 quest”的请求模式。
40
+ - `/projects`:打开 quest 列表(浏览/切换)。
41
+ - `/use <quest_id>`:绑定当前 TUI 会话到指定 quest。
42
+ - `/new <goal>`:在 TUI 内创建新 quest。
43
+ - `/new <goal>` 会创建 quest,并通过守护进程自动启动首轮执行。
44
+ - `/delete <quest_id> --yes`:删除 quest(危险操作,需要确认)。
45
+ - 直接输入普通文本:发送到当前绑定的 quest(作为用户消息)。
46
+ - `/status`:查看当前 quest 状态。
47
+ - `/graph`:查看当前 quest 的 Git 图(分支与研究过程)。
48
+ - `/help`:在 TUI 内显示命令列表和控制键说明。
49
+ - `/config`:打开本地配置浏览器。
50
+ - `/pause`:暂停当前 quest(若未绑定 quest,会进入选择面板)。
51
+ - `/resume`:恢复已暂停/停止的 quest(若未绑定 quest,会进入选择面板)。
52
+ - `/stop`:停止当前 quest(若未绑定 quest,会进入选择面板)。
53
+ - `/stop <quest_id>`:停止指定 quest。
54
+ - 在输入框中输入 `/` 会显示实时命令列表;继续输入 `/re`、`/co` 等前缀时,会按前缀过滤命令行
55
+ - 在 home 模式下,`↑/↓` 和 `Tab` 只会切换“当前预览选中的 quest”,不会直接硬切换一个已经绑定中的 quest。
56
+ - 在 home 模式下,普通文本不会再隐式创建 quest,也不会隐式发消息;必须用 `/new <goal>` 创建,用 `/projects` 或 `/use <quest_id>` 绑定后再聊天。
57
+
58
+ 如果你已经在某个 quest 中,`/pause`、`/resume`、`/stop` 默认作用于当前 quest。
59
+
60
+ 页脚和欢迎区也会直接显示主要快捷提示:
61
+
62
+ - `Enter`:发送输入或确认选择
63
+ - `↑/↓`:浏览选择列表
64
+ - `Esc`:关闭当前弹层
65
+ - `Ctrl+O`:打开 Web 工作区
66
+ - `Ctrl+C`:退出 TUI
67
+
68
+ ## 消息投递(Mailbox)模型
69
+
70
+ TUI、Web UI、以及外部 Connector 共用同一套“邮箱”语义:
71
+
72
+ 1. 当 quest 空闲时,用户第一条普通消息会**直接触发一轮 turn**。
73
+ 2. 这条启动消息会被本轮 run 认领,不会在后续“邮箱投递”中被重复投递。
74
+ 3. 当 agent 正在运行时,后续用户消息会进入 `.ds/user_message_queue.json` 队列。
75
+ 4. 这些排队消息只会在 agent 调用 `artifact.interact(...)` 时被投递给 agent。
76
+ 5. 投递发生后,队列消息会从 `pending` 变成已完成的审计记录。
77
+ 6. 如果没有新消息,运行时会明确告诉 agent“用户没有新消息”,便于继续推进而不是卡住等待。
78
+
79
+ 相关持久化文件(均在 quest 内):
80
+
81
+ - `.ds/runtime_state.json`
82
+ - `.ds/user_message_queue.json`
83
+ - `.ds/interaction_journal.jsonl`
84
+ - `.ds/events.jsonl`
85
+
86
+ ## Pause / Stop / Resume
87
+
88
+ Quest 级控制:
89
+
90
+ - `/pause`:中断当前 runner,并将 quest 标记为 `paused`。
91
+ - `/resume`:把 `paused` 或 `stopped` 的 quest 重新置为 `active`。
92
+ - `/stop`:更强的中断;清理 `active_run_id`,把 quest 标记为 `stopped`。
93
+ - `/pause`、`/resume`、`/stop` 会写入一条可见的控制事件到 quest 历史,并按路由策略推送到绑定的 connectors。
94
+
95
+ `/stop` 比 `/pause` 更强:
96
+
97
+ - 未投递的邮箱消息会被取消(但会保留审计记录,如 `cancelled_by_stop`)
98
+ - 当前轮启动消息会记录为 `accepted_by_run`
99
+ - stop 后下一条新用户消息会启动新的一轮,不会静默重放旧队列
100
+ - stop 不会改写 Git:当前分支/工作树/已写文件都保留,便于继续接续
101
+
102
+ 守护进程级 stop:
103
+
104
+ - `ds --stop`:停止守护进程
105
+ - 会尽量先优雅退出;必要时升级到 `SIGTERM`/`SIGKILL`
106
+ - 成功停止后会清理 daemon state,并打印 `DeepScientist daemon stopped.`
107
+
108
+ ## Artifact 交互要求
109
+
110
+ agent 应当把 `artifact.interact(...)` 作为长对话的“脊柱”:
111
+
112
+ - `progress` / `milestone`:线程式进度更新(非阻塞)
113
+ - `decision_request`:阻塞式决策请求(需给出 1~3 个选项、利弊、证据)
114
+
115
+ ## 排错
116
+
117
+ 若你发送消息后 TUI 看起来“没反应”:
118
+
119
+ - 确认是否绑定了 quest
120
+ - 用 `/status` 查看 quest 状态
121
+ - 查看 `.ds/runtime_state.json`(`status`、`active_run_id`、`pending_user_message_count`)
122
+ - 查看 `.ds/events.jsonl` 是否有 `runner.turn_error`、`quest.control`、`artifact.recorded`
123
+
124
+ 若“运行中”时发送的补充消息没有被 agent 看到:
125
+
126
+ - 看 quest 是否仍在运行
127
+ - 看 `.ds/user_message_queue.json`
128
+ - 确认 agent 过程中有调用 `artifact.interact(...)`