@researai/deepscientist 1.5.14 → 1.5.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +336 -90
- package/assets/branding/logo-raster.png +0 -0
- package/bin/ds.js +816 -131
- package/docs/en/00_QUICK_START.md +36 -15
- package/docs/en/01_SETTINGS_REFERENCE.md +53 -4
- package/docs/en/02_START_RESEARCH_GUIDE.md +7 -0
- package/docs/en/03_QQ_CONNECTOR_GUIDE.md +19 -0
- package/docs/en/05_TUI_GUIDE.md +6 -0
- package/docs/en/06_RUNTIME_AND_CANVAS.md +4 -3
- package/docs/en/09_DOCTOR.md +11 -5
- package/docs/en/10_WEIXIN_CONNECTOR_GUIDE.md +20 -0
- package/docs/en/14_PROMPT_SKILLS_AND_MCP_GUIDE.md +65 -13
- package/docs/en/15_CODEX_PROVIDER_SETUP.md +25 -8
- package/docs/en/16_TELEGRAM_CONNECTOR_GUIDE.md +134 -0
- package/docs/en/17_WHATSAPP_CONNECTOR_GUIDE.md +126 -0
- package/docs/en/18_FEISHU_CONNECTOR_GUIDE.md +136 -0
- package/docs/en/19_EXTERNAL_CONTROLLER_GUIDE.md +226 -0
- package/docs/en/19_LOCAL_BROWSER_AUTH.md +70 -0
- package/docs/en/20_WORKSPACE_MODES_GUIDE.md +250 -0
- package/docs/en/README.md +24 -0
- package/docs/zh/00_QUICK_START.md +36 -15
- package/docs/zh/01_SETTINGS_REFERENCE.md +53 -4
- package/docs/zh/02_START_RESEARCH_GUIDE.md +7 -0
- package/docs/zh/03_QQ_CONNECTOR_GUIDE.md +19 -0
- package/docs/zh/05_TUI_GUIDE.md +6 -0
- package/docs/zh/09_DOCTOR.md +11 -5
- package/docs/zh/10_WEIXIN_CONNECTOR_GUIDE.md +20 -0
- package/docs/zh/14_PROMPT_SKILLS_AND_MCP_GUIDE.md +65 -13
- package/docs/zh/15_CODEX_PROVIDER_SETUP.md +25 -8
- package/docs/zh/16_TELEGRAM_CONNECTOR_GUIDE.md +134 -0
- package/docs/zh/17_WHATSAPP_CONNECTOR_GUIDE.md +126 -0
- package/docs/zh/18_FEISHU_CONNECTOR_GUIDE.md +136 -0
- package/docs/zh/19_EXTERNAL_CONTROLLER_GUIDE.md +226 -0
- package/docs/zh/19_LOCAL_BROWSER_AUTH.md +68 -0
- package/docs/zh/20_WORKSPACE_MODES_GUIDE.md +251 -0
- package/docs/zh/README.md +24 -0
- package/install.sh +2 -0
- package/package.json +1 -1
- package/pyproject.toml +1 -1
- package/src/deepscientist/__init__.py +1 -1
- package/src/deepscientist/acp/envelope.py +6 -0
- package/src/deepscientist/artifact/charts.py +567 -0
- package/src/deepscientist/artifact/guidance.py +50 -10
- package/src/deepscientist/artifact/metrics.py +228 -5
- package/src/deepscientist/artifact/schemas.py +3 -0
- package/src/deepscientist/artifact/service.py +4276 -308
- package/src/deepscientist/bash_exec/models.py +23 -0
- package/src/deepscientist/bash_exec/monitor.py +147 -67
- package/src/deepscientist/bash_exec/runtime.py +218 -156
- package/src/deepscientist/bash_exec/service.py +309 -69
- package/src/deepscientist/bash_exec/shells.py +87 -0
- package/src/deepscientist/bridges/connectors.py +51 -2
- package/src/deepscientist/cli.py +115 -19
- package/src/deepscientist/codex_cli_compat.py +232 -0
- package/src/deepscientist/config/models.py +8 -4
- package/src/deepscientist/config/service.py +38 -11
- package/src/deepscientist/connector/weixin_support.py +122 -1
- package/src/deepscientist/daemon/api/handlers.py +199 -9
- package/src/deepscientist/daemon/api/router.py +5 -0
- package/src/deepscientist/daemon/app.py +1458 -289
- package/src/deepscientist/doctor.py +51 -0
- package/src/deepscientist/file_lock.py +48 -0
- package/src/deepscientist/gitops/__init__.py +10 -1
- package/src/deepscientist/gitops/diff.py +296 -1
- package/src/deepscientist/gitops/service.py +4 -1
- package/src/deepscientist/mcp/server.py +212 -5
- package/src/deepscientist/process_control.py +161 -0
- package/src/deepscientist/prompts/builder.py +501 -453
- package/src/deepscientist/quest/layout.py +15 -2
- package/src/deepscientist/quest/service.py +2539 -195
- package/src/deepscientist/quest/stage_views.py +177 -1
- package/src/deepscientist/runners/base.py +2 -0
- package/src/deepscientist/runners/codex.py +169 -31
- package/src/deepscientist/runners/runtime_overrides.py +17 -1
- package/src/deepscientist/skills/__init__.py +2 -2
- package/src/deepscientist/skills/installer.py +196 -5
- package/src/deepscientist/skills/registry.py +66 -0
- package/src/prompts/connectors/qq.md +18 -8
- package/src/prompts/connectors/weixin.md +16 -6
- package/src/prompts/contracts/shared_interaction.md +24 -4
- package/src/prompts/system.md +921 -72
- package/src/prompts/system_copilot.md +43 -0
- package/src/skills/analysis-campaign/SKILL.md +32 -2
- package/src/skills/analysis-campaign/references/artifact-orchestration.md +1 -1
- package/src/skills/analysis-campaign/references/writing-facing-slice-examples.md +65 -0
- package/src/skills/baseline/SKILL.md +10 -0
- package/src/skills/decision/SKILL.md +27 -2
- package/src/skills/experiment/SKILL.md +16 -2
- package/src/skills/figure-polish/SKILL.md +1 -0
- package/src/skills/finalize/SKILL.md +19 -0
- package/src/skills/idea/SKILL.md +79 -0
- package/src/skills/idea/references/idea-generation-playbook.md +100 -0
- package/src/skills/idea/references/outline-seeding-example.md +60 -0
- package/src/skills/intake-audit/SKILL.md +9 -1
- package/src/skills/mentor/SKILL.md +217 -0
- package/src/skills/mentor/references/correction-rules.md +210 -0
- package/src/skills/mentor/references/knowledge-profile.md +91 -0
- package/src/skills/mentor/references/persona-profile.md +138 -0
- package/src/skills/mentor/references/taste-profile.md +128 -0
- package/src/skills/mentor/references/thought-style-profile.md +138 -0
- package/src/skills/mentor/references/work-profile.md +289 -0
- package/src/skills/mentor/references/workflow-profile.md +240 -0
- package/src/skills/optimize/SKILL.md +1645 -0
- package/src/skills/rebuttal/SKILL.md +3 -1
- package/src/skills/review/SKILL.md +3 -1
- package/src/skills/scout/SKILL.md +8 -0
- package/src/skills/write/SKILL.md +81 -12
- package/src/skills/write/references/outline-evidence-contract-example.md +107 -0
- package/src/tui/dist/app/AppContainer.js +22 -11
- package/src/tui/dist/index.js +4 -1
- package/src/tui/dist/lib/api.js +33 -3
- package/src/tui/package.json +1 -1
- package/src/ui/dist/assets/AiManusChatView-COFACy7V.js +204 -0
- package/src/ui/dist/assets/AnalysisPlugin-DnSm0GZn.js +1 -0
- package/src/ui/dist/assets/CliPlugin-CvwCmDQ5.js +109 -0
- package/src/ui/dist/assets/CodeEditorPlugin-cOqSa0xq.js +2 -0
- package/src/ui/dist/assets/CodeViewerPlugin-itb0tltR.js +270 -0
- package/src/ui/dist/assets/DocViewerPlugin-DqKkiCI6.js +7 -0
- package/src/ui/dist/assets/GitCommitViewerPlugin-DVgNHBCS.js +1 -0
- package/src/ui/dist/assets/GitDiffViewerPlugin-DxL2ezFG.js +6 -0
- package/src/ui/dist/assets/GitSnapshotViewer-B_RQm1YZ.js +30 -0
- package/src/ui/dist/assets/ImageViewerPlugin-tHqlXY3n.js +26 -0
- package/src/ui/dist/assets/LabCopilotPanel-ClMbq5Yu.js +14 -0
- package/src/ui/dist/assets/LabPlugin-L_SuE8ow.js +22 -0
- package/src/ui/dist/assets/LatexPlugin-B495DTXC.js +25 -0
- package/src/ui/dist/assets/MarkdownViewerPlugin-DG28-61B.js +128 -0
- package/src/ui/dist/assets/MarketplacePlugin-BiOGT-Kj.js +13 -0
- package/src/ui/dist/assets/{NotebookEditor-CccQYZjX.css → NotebookEditor-BHH8rdGj.css} +1 -1
- package/src/ui/dist/assets/NotebookEditor-BOr3x3Ej.css +1 -0
- package/src/ui/dist/assets/NotebookEditor-C-4Kt1p9.js +81 -0
- package/src/ui/dist/assets/NotebookEditor-CVsj8h_T.js +361 -0
- package/src/ui/dist/assets/PdfLoader-CASDQmxJ.js +16 -0
- package/src/ui/dist/assets/PdfLoader-Cy5jtWrr.css +1 -0
- package/src/ui/dist/assets/PdfMarkdownPlugin-BFhwoKsY.js +1 -0
- package/src/ui/dist/assets/PdfViewerPlugin-DcOzU9vd.js +17 -0
- package/src/ui/dist/assets/PdfViewerPlugin-nwwE-fjJ.css +1 -0
- package/src/ui/dist/assets/SearchPlugin-CHj7M58O.js +16 -0
- package/src/ui/dist/assets/SearchPlugin-DA4en4hK.css +1 -0
- package/src/ui/dist/assets/TextViewerPlugin-CB4DYfWO.js +54 -0
- package/src/ui/dist/assets/VNCViewer-CjlbyCB3.js +11 -0
- package/src/ui/dist/assets/bot-CFkZY-JP.js +6 -0
- package/src/ui/dist/assets/browser-CTB2jwNe.js +8 -0
- package/src/ui/dist/assets/chevron-up-Dq5ofbht.js +6 -0
- package/src/ui/dist/assets/code-DLC6G24T.js +6 -0
- package/src/ui/dist/assets/file-content-Dv4LoZec.js +1 -0
- package/src/ui/dist/assets/file-diff-panel-Denq-lC3.js +1 -0
- package/src/ui/dist/assets/file-jump-queue-DA-SdG__.js +1 -0
- package/src/ui/dist/assets/file-socket-Cu4Qln7Y.js +1 -0
- package/src/ui/dist/assets/git-commit-horizontal-BUh6G52n.js +6 -0
- package/src/ui/dist/assets/image-B9HUUddG.js +6 -0
- package/src/ui/dist/assets/index-B2B1sg-M.js +1 -0
- package/src/ui/dist/assets/index-Cgla8biy.css +33 -0
- package/src/ui/dist/assets/index-DRyx7vAc.js +1 -0
- package/src/ui/dist/assets/index-Gbl53BNp.js +2496 -0
- package/src/ui/dist/assets/index-wQ7RIIRd.js +11 -0
- package/src/ui/dist/assets/monaco-CiHMMNH_.js +1 -0
- package/src/ui/dist/assets/pdf-effect-queue-ZtnHFCAi.js +6 -0
- package/src/ui/dist/assets/plugin-monaco-C8UgLomw.js +19 -0
- package/src/ui/dist/assets/plugin-notebook-HbW2K-1c.js +169 -0
- package/src/ui/dist/assets/plugin-pdf-CR8hgQBV.js +357 -0
- package/src/ui/dist/assets/plugin-terminal-MXFIPun8.js +227 -0
- package/src/ui/dist/assets/popover-DL6h35vr.js +1 -0
- package/src/ui/dist/assets/project-sync-CsX08Qno.js +1 -0
- package/src/ui/dist/assets/select-DvmXt1yY.js +11 -0
- package/src/ui/dist/assets/sigma-7jpXazui.js +6 -0
- package/src/ui/dist/assets/trash-xA7kFt8i.js +11 -0
- package/src/ui/dist/assets/useCliAccess-DsMwDjOp.js +1 -0
- package/src/ui/dist/assets/useFileDiffOverlay-FuhcnKiw.js +1 -0
- package/src/ui/dist/assets/wrap-text-CwMn-iqb.js +11 -0
- package/src/ui/dist/assets/zoom-out-R-GWEhzS.js +11 -0
- package/src/ui/dist/index.html +5 -2
- package/src/ui/dist/assets/AiManusChatView-DaF9Nge_.js +0 -26597
- package/src/ui/dist/assets/AnalysisPlugin-BSVx6dXE.js +0 -123
- package/src/ui/dist/assets/CliPlugin-C9gzJX41.js +0 -5905
- package/src/ui/dist/assets/CodeEditorPlugin-DU9G0Tox.js +0 -427
- package/src/ui/dist/assets/CodeViewerPlugin-DoX_fI9l.js +0 -905
- package/src/ui/dist/assets/DocViewerPlugin-C4FWIXuU.js +0 -278
- package/src/ui/dist/assets/GitDiffViewerPlugin-BgfFMgtf.js +0 -2661
- package/src/ui/dist/assets/ImageViewerPlugin-tcPkfY_x.js +0 -500
- package/src/ui/dist/assets/LabCopilotPanel-_dKV60Bf.js +0 -4104
- package/src/ui/dist/assets/LabPlugin-Bje0ayoC.js +0 -2677
- package/src/ui/dist/assets/LatexPlugin-CVsBzAln.js +0 -1792
- package/src/ui/dist/assets/MarkdownViewerPlugin-xjmrqv_8.js +0 -308
- package/src/ui/dist/assets/MarketplacePlugin-mMM2A8wP.js +0 -413
- package/src/ui/dist/assets/NotebookEditor-3kVDSOBo.js +0 -4214
- package/src/ui/dist/assets/NotebookEditor-C3VQ7ylN.css +0 -1405
- package/src/ui/dist/assets/NotebookEditor-SoJ8X-MO.js +0 -84873
- package/src/ui/dist/assets/PdfLoader-C-Y707R3.css +0 -49
- package/src/ui/dist/assets/PdfLoader-DElVuHl9.js +0 -25468
- package/src/ui/dist/assets/PdfMarkdownPlugin-Bq88XT4G.js +0 -409
- package/src/ui/dist/assets/PdfViewerPlugin-CsCXMo9S.js +0 -3095
- package/src/ui/dist/assets/PdfViewerPlugin-DQ11QcSf.css +0 -3627
- package/src/ui/dist/assets/SearchPlugin-DDMrGDkh.css +0 -379
- package/src/ui/dist/assets/SearchPlugin-oUPvy19k.js +0 -741
- package/src/ui/dist/assets/TextViewerPlugin-CRkT9yNy.js +0 -472
- package/src/ui/dist/assets/VNCViewer-BgbuvWhR.js +0 -18821
- package/src/ui/dist/assets/awareness-C0NPR2Dj.js +0 -292
- package/src/ui/dist/assets/bot-v_RASACv.js +0 -21
- package/src/ui/dist/assets/browser-BAcuE0Xj.js +0 -2895
- package/src/ui/dist/assets/code-5hC9d0VH.js +0 -17
- package/src/ui/dist/assets/file-content-D1PxfOrp.js +0 -377
- package/src/ui/dist/assets/file-diff-panel-DG1oT_Hj.js +0 -92
- package/src/ui/dist/assets/file-jump-queue-r5XKgJEV.js +0 -16
- package/src/ui/dist/assets/file-socket-BmdFYQlk.js +0 -58
- package/src/ui/dist/assets/function-B5QZkkHC.js +0 -1895
- package/src/ui/dist/assets/image-Dqe2X2tW.js +0 -18
- package/src/ui/dist/assets/index-BQG-1s2o.css +0 -12553
- package/src/ui/dist/assets/index-DVsMKK_y.js +0 -25
- package/src/ui/dist/assets/index-Duvz8Ip0.js +0 -159
- package/src/ui/dist/assets/index-Nt9hS4ck.js +0 -244829
- package/src/ui/dist/assets/index-RDlNXXx1.js +0 -120
- package/src/ui/dist/assets/monaco-DIXge1CP.js +0 -623
- package/src/ui/dist/assets/pdf-effect-queue-BBTTQaO-.js +0 -47
- package/src/ui/dist/assets/pdf_viewer-e0g1is2C.js +0 -8206
- package/src/ui/dist/assets/popover-BWlolyxo.js +0 -476
- package/src/ui/dist/assets/project-sync-BM5PkFH4.js +0 -297
- package/src/ui/dist/assets/select-D4dAtrA8.js +0 -1690
- package/src/ui/dist/assets/sigma-CKbE5jJT.js +0 -22
- package/src/ui/dist/assets/square-check-big-CZNGMgiB.js +0 -17
- package/src/ui/dist/assets/trash-DaB37xAz.js +0 -32
- package/src/ui/dist/assets/useCliAccess-C2OmAcWe.js +0 -957
- package/src/ui/dist/assets/useFileDiffOverlay-Dowd1Ij4.js +0 -53
- package/src/ui/dist/assets/wrap-text-BGjAhAUq.js +0 -35
- package/src/ui/dist/assets/yjs-DncrqiZ8.js +0 -11243
- package/src/ui/dist/assets/zoom-out-dMZQMXzc.js +0 -34
|
@@ -27,6 +27,7 @@ DeepScientist 已经内置了微信 iLink 运行时,因此你不需要再额
|
|
|
27
27
|
- 把入站附件复制到当前 quest 的 `userfiles/weixin/...`
|
|
28
28
|
- 把文本回复发回同一个微信上下文
|
|
29
29
|
- 在 agent 提供真实本地文件时,发送微信原生图片、视频、文件
|
|
30
|
+
- 当微信绑定到 quest 时,在每次主实验完成后自动发送按指标生成的时间线图片
|
|
30
31
|
|
|
31
32
|
入站媒体不会只留在临时缓存里,而是会被复制进 quest。本地落盘路径形态如下:
|
|
32
33
|
|
|
@@ -94,7 +95,10 @@ DeepScientist 已经内置了微信 iLink 运行时,因此你不需要再额
|
|
|
94
95
|
- 入站图片、视频、文件会被下载并复制进 quest 本地 `userfiles/weixin/...`
|
|
95
96
|
- 纯媒体消息不会再被直接丢弃
|
|
96
97
|
- 出站文本会沿用运行时维护的 `context_token`
|
|
98
|
+
- 如果微信 `context_token` 缺失或过期,低优先级出站更新会先进入排队,而不是直接丢失
|
|
99
|
+
- 下一次新的微信入站刷新会话后,DeepScientist 只会回放最近 `5` 条排队更新,并且每条之间固定间隔 `2` 秒
|
|
97
100
|
- 出站图片、视频、文件在 agent 提供真实本地文件路径时可以正常发送
|
|
101
|
+
- 出站主实验指标图会自动作为微信原生图片发送
|
|
98
102
|
|
|
99
103
|

|
|
100
104
|
|
|
@@ -116,6 +120,22 @@ userfiles/...
|
|
|
116
120
|
|
|
117
121
|
而不是默认依赖一个任意的外链。
|
|
118
122
|
|
|
123
|
+
## 5.1 主实验指标图自动推送
|
|
124
|
+
|
|
125
|
+
当微信是当前 quest 的绑定连接器时,DeepScientist 现在会在每次主实验完成后自动发送指标时间线图片。
|
|
126
|
+
|
|
127
|
+
当前行为:
|
|
128
|
+
|
|
129
|
+
- 每个指标生成一张图
|
|
130
|
+
- 如果 baseline 存在该指标,会画一条横向虚线作为 baseline 参考线
|
|
131
|
+
- 系统会自动判断该指标是“越高越好”还是“越低越好”
|
|
132
|
+
- 超过 baseline 的点会额外标星
|
|
133
|
+
- 最新点使用莫兰迪深红色填充
|
|
134
|
+
- 较早的点使用莫兰迪深蓝色填充
|
|
135
|
+
- 如果指标有多个,DeepScientist 会按顺序发送,并在相邻两张图之间间隔约 2 秒
|
|
136
|
+
|
|
137
|
+
这些图来自 quest 本地生成的文件,并会作为微信原生图片自动发送到当前绑定会话。
|
|
138
|
+
|
|
119
139
|
## 6. 常见问题
|
|
120
140
|
|
|
121
141
|
### 二维码一直在等待
|
|
@@ -56,6 +56,14 @@ DeepScientist 不是靠一份静态大 prompt 工作的。
|
|
|
56
56
|
- `SKILL.md`:定义各个阶段的执行纪律
|
|
57
57
|
- `mcp/server.py`:定义内建工具面
|
|
58
58
|
|
|
59
|
+
受管 quest-local prompt 镜像:
|
|
60
|
+
|
|
61
|
+
- DeepScientist 仍然会优先读取 `quest_root/.codex/prompts/` 下存在的 prompt 片段。
|
|
62
|
+
- 但这棵树现在是“自动维护的受管副本”,不再默认视为永久手工 fork。
|
|
63
|
+
- 每次真实 runner turn 开始前,DeepScientist 都会把当前 active quest-local prompt 树与仓库 `src/prompts/` 做比较;只要仓库源变了,或者 quest 本地副本漂移了,就会刷新 active 副本。
|
|
64
|
+
- 刷新之前,旧的 active prompt 树会先备份到 `quest_root/.codex/prompt_versions/<backup_id>/`。
|
|
65
|
+
- 所以默认情况下,旧 quest 也会吃到最新 prompt 合同;如果你需要回放历史 prompt,再显式选择某个备份版本。
|
|
66
|
+
|
|
59
67
|
## 3. 一轮 prompt 是怎么组装的
|
|
60
68
|
|
|
61
69
|
当前运行时大致按下面顺序组装 turn prompt:
|
|
@@ -72,11 +80,12 @@ DeepScientist 不是靠一份静态大 prompt 工作的。
|
|
|
72
80
|
10. research delivery policy
|
|
73
81
|
11. paper and evidence snapshot
|
|
74
82
|
12. 如果是 retry turn,则加入 retry recovery packet
|
|
75
|
-
13.
|
|
76
|
-
14.
|
|
77
|
-
15.
|
|
78
|
-
16.
|
|
79
|
-
17. current
|
|
83
|
+
13. 如果是 auto-continue turn,则加入 resume context spine
|
|
84
|
+
14. interaction style
|
|
85
|
+
15. priority memory for this turn
|
|
86
|
+
16. recent conversation window
|
|
87
|
+
17. current turn attachments
|
|
88
|
+
18. current user message
|
|
80
89
|
|
|
81
90
|
这个顺序不是随便排的。
|
|
82
91
|
|
|
@@ -100,6 +109,7 @@ DeepScientist 不是靠一份静态大 prompt 工作的。
|
|
|
100
109
|
- 不要过早结束 quest
|
|
101
110
|
- Web、TUI、connector 属于同一个 quest
|
|
102
111
|
- 用户可见的汇报风格
|
|
112
|
+
- baseline 提交与确认的纪律:如果源 baseline 暴露了多指标或多 variant,就要保留完整比较面,而不是只留下一个 headline scalar
|
|
103
113
|
|
|
104
114
|
如果你发现 agent 在所有场景里行为都不对,`system.md` 一定是首要检查点之一。
|
|
105
115
|
|
|
@@ -113,6 +123,7 @@ DeepScientist 不是靠一份静态大 prompt 工作的。
|
|
|
113
123
|
- 排队中的用户消息必须优先确认和处理
|
|
114
124
|
- `blocking` 只该用于真实用户决策
|
|
115
125
|
- 进展汇报应该简洁且可读
|
|
126
|
+
- 真正发给用户的交互消息应保持完整;系统会单独生成短预览,所以 agent 不应该自己把 connector 回复截成 `...` / `…`
|
|
116
127
|
|
|
117
128
|
如果模型经常在长任务里“断线”或者不会接住用户后续消息,这个文件非常关键。
|
|
118
129
|
|
|
@@ -208,6 +219,16 @@ builder 会直接把这些 quest 文件读进 prompt:
|
|
|
208
219
|
- `src/deepscientist/prompts/builder.py`
|
|
209
220
|
- 当前 quest 所处的 stage skill
|
|
210
221
|
|
|
222
|
+
它现在还明确承载了 continuation 的模式分叉:
|
|
223
|
+
|
|
224
|
+
- `workspace_mode = copilot`
|
|
225
|
+
- 以当前请求为单位提供帮助
|
|
226
|
+
- 做完这一小段之后,通常停驻,等待下一条用户消息或 `/resume`
|
|
227
|
+
- `workspace_mode = autonomous`
|
|
228
|
+
- 默认继续往前推进
|
|
229
|
+
- 如果真实长任务还没跑起来,就继续用接下来的 turns 做准备、启动或耐久决策
|
|
230
|
+
- 一旦真实长任务已经在跑,后台 auto-continue 就切成低频巡检
|
|
231
|
+
|
|
211
232
|
### 4.8 Interaction style
|
|
212
233
|
|
|
213
234
|
这个 block 决定这轮该怎么“说话”。
|
|
@@ -227,7 +248,27 @@ builder 会直接把这些 quest 文件读进 prompt:
|
|
|
227
248
|
- 写作阶段
|
|
228
249
|
- 等待用户决策的阶段
|
|
229
250
|
|
|
230
|
-
|
|
251
|
+
它现在也编码了 auto-continue 的节奏分叉:
|
|
252
|
+
|
|
253
|
+
- autonomous 下,如果还在准备 / 启动真实长任务,可以较快地连续推进
|
|
254
|
+
- 如果真实外部长任务已经在跑,则默认切成低频检查,默认大约每 `240` 秒一轮
|
|
255
|
+
- copilot 模式则通常在当前请求单元完成后停驻,不继续自动扩展
|
|
256
|
+
|
|
257
|
+
### 4.9 Resume context spine
|
|
258
|
+
|
|
259
|
+
现在在 auto-continue turn 中,prompt 会额外注入一个紧凑的 resume spine,避免模型只凭一个 stage 名称硬续。
|
|
260
|
+
|
|
261
|
+
里面包括:
|
|
262
|
+
|
|
263
|
+
- 最近一条持久化用户消息
|
|
264
|
+
- 最近一条 assistant checkpoint
|
|
265
|
+
- 最近一条 run result 摘要
|
|
266
|
+
- 少量最近 memory cues
|
|
267
|
+
- 当前 `bash_exec` 状态,包括是否有长时间 shell 会话正在运行
|
|
268
|
+
|
|
269
|
+
这也是为什么 auto-continue 能更贴着“最新用户意图 + 最新检查点”继续,而不是漂回泛泛的 stage narration。
|
|
270
|
+
|
|
271
|
+
### 4.10 Priority memory
|
|
231
272
|
|
|
232
273
|
DeepScientist 不是随机往 prompt 里塞 memory 的。
|
|
233
274
|
|
|
@@ -244,22 +285,33 @@ DeepScientist 不是随机往 prompt 里塞 memory 的。
|
|
|
244
285
|
|
|
245
286
|
agent 不应该在每一轮都看到完全同一批 memory。
|
|
246
287
|
|
|
247
|
-
## 5.
|
|
288
|
+
## 5. 本地 active prompt 与历史版本
|
|
248
289
|
|
|
249
|
-
|
|
290
|
+
当前 quest 的 active prompt 树仍在这些路径下:
|
|
250
291
|
|
|
251
292
|
- `.codex/prompts/system.md`
|
|
252
293
|
- `.codex/prompts/contracts/shared_interaction.md`
|
|
253
294
|
- `.codex/prompts/connectors/<connector>.md`
|
|
254
295
|
|
|
255
|
-
|
|
296
|
+
仓库默认 prompt 仍然在 `src/prompts/`。
|
|
297
|
+
|
|
298
|
+
但现在有一个关键变化:
|
|
299
|
+
|
|
300
|
+
- `.codex/prompts/` 不应再理解为长期手工维护的 override 树。
|
|
301
|
+
- 每次真实运行前,DeepScientist 都会把 active quest-local copy 修回当前仓库 prompt 真相。
|
|
302
|
+
- 所以如果你手工改了 active copy,这种改动会在下次运行时被视为漂移:先备份,再替换。
|
|
303
|
+
- 历史 prompt 会保存在 `.codex/prompt_versions/<backup_id>/`。
|
|
304
|
+
|
|
305
|
+
如果你确实想让某个 quest 临时按旧 prompt 跑,启动时优先传正式版本号即可:
|
|
306
|
+
|
|
307
|
+
- `ds daemon --prompt-version <official_version>`
|
|
308
|
+
- `ds run --prompt-version <official_version> ...`
|
|
256
309
|
|
|
257
|
-
|
|
258
|
-
- quest 私有覆盖在 `.codex/prompts/`
|
|
310
|
+
DeepScientist 会把它解析成“该正式版本号下最新的一份 prompt 备份”。如果你想精确回放某一次具体备份,而不是该版本下最新的一份,也仍然可以直接传备份目录名。
|
|
259
311
|
|
|
260
|
-
|
|
312
|
+
如果只是想继续使用当前受管 active prompt,就用 `latest`。
|
|
261
313
|
|
|
262
|
-
|
|
314
|
+
如果这个改动应该影响正常未来行为,就不该只改 quest-local active copy,而应该直接改仓库默认 prompt。
|
|
263
315
|
|
|
264
316
|
## 6. Skills 是怎么分层的
|
|
265
317
|
|
|
@@ -62,7 +62,7 @@ codex:
|
|
|
62
62
|
|
|
63
63
|
- 对 provider-backed 的 Codex profile,建议优先使用 `model: inherit`
|
|
64
64
|
- 除非你非常确定该 provider 接受你要显式传入的模型名,否则不要再额外硬写一个模型
|
|
65
|
-
- DeepScientist
|
|
65
|
+
- DeepScientist 现在会在 `.ds/codex-home` 下启动一个隔离的运行时 home,但会先继承你配置的 `~/.codex` 里的 auth、config、skills、agents 与 prompts
|
|
66
66
|
|
|
67
67
|
## Provider 一览
|
|
68
68
|
|
|
@@ -109,13 +109,13 @@ MiniMax 是最典型的 profile 模式。它的官方 Codex CLI 文档直接给
|
|
|
109
109
|
|
|
110
110
|
### 已验证的兼容性说明
|
|
111
111
|
|
|
112
|
-
按 2026-
|
|
112
|
+
按 2026-04-04 对 MiniMax 官方 Codex CLI 页面和本地兼容性测试的核对结果:
|
|
113
113
|
|
|
114
114
|
- MiniMax 官方 Codex CLI 页面当前建议使用 `@openai/codex@0.57.0`
|
|
115
115
|
- MiniMax 当前应使用的 Coding Plan endpoint 是 `https://api.minimaxi.com/v1`
|
|
116
116
|
- MiniMax 官方页面示例 profile 名是 `m21`,但 profile 名本身只是本地别名;本仓库统一用 `m27` 作为示例名
|
|
117
117
|
- MiniMax 官方页面当前给出的 `codex-MiniMax-*` 模型名,在本地使用你提供的 key 实测并不能稳定通过 Codex CLI
|
|
118
|
-
-
|
|
118
|
+
- 本地实测 DeepScientist 可稳定跑通的组合包括 `MiniMax-M2.7` + `m27` + Codex CLI `0.57.0`,以及 `MiniMax-M2.5` + `m25` + Codex CLI `0.57.0`
|
|
119
119
|
- 当前最新版 `@openai/codex` 和 MiniMax 官方文档并不能稳定直接对齐
|
|
120
120
|
|
|
121
121
|
如果你现在要走最稳的 DeepScientist + MiniMax 路径,建议直接使用 Codex CLI `0.57.0`。
|
|
@@ -125,7 +125,7 @@ MiniMax 是最典型的 profile 模式。它的官方 Codex CLI 文档直接给
|
|
|
125
125
|
- 已安装 Codex CLI `0.57.0`
|
|
126
126
|
- 已创建 MiniMax `Coding Plan Key`
|
|
127
127
|
- 在启动 Codex 和 DeepScientist 的 shell 中可见的 `MINIMAX_API_KEY`
|
|
128
|
-
-
|
|
128
|
+
- 如果你要单独在终端里验证 `codex --profile <name>`,当前 shell 需要先清理 `OPENAI_API_KEY` 和 `OPENAI_BASE_URL`
|
|
129
129
|
- `~/.codex/config.toml` 中已经配置好的 Codex profile
|
|
130
130
|
|
|
131
131
|
### 安装 Codex CLI `0.57.0`
|
|
@@ -145,6 +145,8 @@ codex-cli 0.57.0
|
|
|
145
145
|
|
|
146
146
|
如果你还想保留另一个 Codex 版本,也可以单独写一个 wrapper 脚本,再把 `runners.codex.binary` 指向那个绝对路径。
|
|
147
147
|
|
|
148
|
+
现在如果 DeepScientist 在启动时检测到 MiniMax profile,但当前 `codex` 版本不是 `0.57.0`,在交互式终端里会主动提示是否自动安装 `@openai/codex@0.57.0`。
|
|
149
|
+
|
|
148
150
|
### Codex 侧配置
|
|
149
151
|
|
|
150
152
|
请使用 `https://api.minimaxi.com/v1`,不要用 `https://api.minimax.io/v1`。
|
|
@@ -157,15 +159,19 @@ unset OPENAI_BASE_URL
|
|
|
157
159
|
export MINIMAX_API_KEY="..."
|
|
158
160
|
```
|
|
159
161
|
|
|
162
|
+
如果你是在终端里单独验证 `codex --profile <name>`,就按上面的方式处理。
|
|
163
|
+
如果你走的是 DeepScientist 路径,那么当所选 provider 明确写了 `requires_openai_auth = false` 时,DeepScientist 现在会在 startup probe 和真实 runner 执行时自动剥离 `OPENAI_API_KEY` 和 `OPENAI_BASE_URL`。
|
|
164
|
+
|
|
160
165
|
MiniMax 官方页面示例 profile 名是 `m21`。由于 profile 名只是本地别名,本仓库统一改写成 `m27`。
|
|
161
166
|
|
|
162
167
|
先说明差异:
|
|
163
168
|
|
|
164
169
|
- 官方页面当前展示的是 `codex-MiniMax-M2.5`
|
|
165
|
-
- 但本地实测里,直接请求 MiniMax API 能稳定跑通的是 `MiniMax-M2.7`
|
|
166
|
-
-
|
|
170
|
+
- 但本地实测里,直接请求 MiniMax API 能稳定跑通的是 `MiniMax-M2.7` 和 `MiniMax-M2.5`
|
|
171
|
+
- 可复现的 DeepScientist 路径是:`MiniMax-M2.7` 配 `m27`,以及 `MiniMax-M2.5` 配 `m25`
|
|
172
|
+
- 对 `m25` 这条路径,请使用 `MiniMax-M2.5`,不要写成 `codex-MiniMax-M2.5`
|
|
167
173
|
|
|
168
|
-
因此,下面给的是当前 DeepScientist
|
|
174
|
+
因此,下面给的是当前 DeepScientist 推荐配置:
|
|
169
175
|
|
|
170
176
|
```toml
|
|
171
177
|
[model_providers.minimax]
|
|
@@ -183,9 +189,19 @@ model = "MiniMax-M2.7"
|
|
|
183
189
|
model_provider = "minimax"
|
|
184
190
|
```
|
|
185
191
|
|
|
192
|
+
如果你想走同样的 DeepScientist 路径但使用 `m25`,保持上面的 provider 配置不变,再把 profile 写成:
|
|
193
|
+
|
|
194
|
+
```toml
|
|
195
|
+
[profiles.m25]
|
|
196
|
+
model = "MiniMax-M2.5"
|
|
197
|
+
model_provider = "minimax"
|
|
198
|
+
```
|
|
199
|
+
|
|
186
200
|
DeepScientist 现在对它的支持方式是:
|
|
187
201
|
|
|
188
|
-
- 如果你使用的是这类 profile-only MiniMax 配置,再配合 Codex CLI `0.57.0`,DeepScientist 会在自己的 probe / 运行时临时
|
|
202
|
+
- 如果你使用的是这类 profile-only MiniMax 配置,再配合 Codex CLI `0.57.0`,DeepScientist 会在自己的 probe / 运行时临时 `config.toml` 副本里,把所选 profile 的 `model_provider` 和 `model` 自动提升到顶层
|
|
203
|
+
- 对 provider-backed 的 MiniMax profile,DeepScientist 会强制使用 `model: inherit`,避免再被硬编码的 OpenAI 模型覆盖
|
|
204
|
+
- 当 `requires_openai_auth = false` 时,DeepScientist 会自动移除冲突的 `OPENAI_API_KEY` 和 `OPENAI_BASE_URL`
|
|
189
205
|
- 这意味着即使终端里原样执行 `codex --profile m27` 还会失败,DeepScientist 也可以先兼容跑起来
|
|
190
206
|
|
|
191
207
|
如果你还希望终端里的 `codex --profile <name>` 也直接可用,请使用显式顶层兼容写法:
|
|
@@ -248,6 +264,7 @@ DeepScientist 现在会为 MiniMax 的 `0.57.0` 路径额外做两层兼容:
|
|
|
248
264
|
|
|
249
265
|
- 当检测到旧版 Codex CLI 不支持 `xhigh` 时,自动把 `xhigh` 降级成 `high`
|
|
250
266
|
- 当检测到 MiniMax 使用 profile-only 的 `model_provider` / `model` 配置形态时,在临时 DeepScientist Codex home 里自动补齐顶层字段
|
|
267
|
+
- 当 provider 明确声明 `requires_openai_auth = false` 时,自动移除冲突的 `OPENAI_*` 认证环境变量
|
|
251
268
|
|
|
252
269
|
## GLM
|
|
253
270
|
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# 16 Telegram Connector 指南
|
|
2
|
+
|
|
3
|
+
当你希望通过 Telegram 继续推进 DeepScientist quest 时,请阅读这份指南。
|
|
4
|
+
|
|
5
|
+
当前开源版本中的 Telegram 连接方式使用内置 polling 路径:
|
|
6
|
+
|
|
7
|
+
- 不需要公网 webhook
|
|
8
|
+
- 核心凭据是 BotFather token
|
|
9
|
+
- 如果启用自动绑定,私聊可以自动跟随最新活跃 quest
|
|
10
|
+
|
|
11
|
+
## 1. Telegram 支持包含什么
|
|
12
|
+
|
|
13
|
+
当前 Telegram connector 由以下部分组成:
|
|
14
|
+
|
|
15
|
+
- `TelegramPollingService`:负责入站轮询
|
|
16
|
+
- `GenericRelayChannel`:负责绑定、inbox/outbox、target 与运行时状态
|
|
17
|
+
- `TelegramConnectorBridge`:负责通过 Bot API 直接出站发送
|
|
18
|
+
|
|
19
|
+
这意味着 Telegram 已经接入了和其他 connector 一致的 quest 绑定模型。
|
|
20
|
+
|
|
21
|
+
## 2. 推荐配置路径
|
|
22
|
+
|
|
23
|
+
1. 打开 BotFather。
|
|
24
|
+
2. 执行 `/newbot`。
|
|
25
|
+
3. 保存生成的 bot token。
|
|
26
|
+
4. 打开 `Settings > Connectors > Telegram`。
|
|
27
|
+
5. 启用 Telegram。
|
|
28
|
+
6. 保持 `transport: polling`。
|
|
29
|
+
7. 填写 `bot_token`。
|
|
30
|
+
8. 保存连接器配置。
|
|
31
|
+
9. 从 Telegram 给 bot 发送一条真实私聊,例如 `/start` 或 `/help`。
|
|
32
|
+
10. 回到 DeepScientist,确认运行时已经发现这个 target conversation。
|
|
33
|
+
|
|
34
|
+
## 3. 关键配置字段
|
|
35
|
+
|
|
36
|
+
主要字段包括:
|
|
37
|
+
|
|
38
|
+
- `enabled`
|
|
39
|
+
- `transport`
|
|
40
|
+
- `bot_name`
|
|
41
|
+
- `bot_token`
|
|
42
|
+
- `command_prefix`
|
|
43
|
+
- `require_mention_in_groups`
|
|
44
|
+
- `dm_policy`
|
|
45
|
+
- `allow_from`
|
|
46
|
+
- `group_policy`
|
|
47
|
+
- `group_allow_from`
|
|
48
|
+
- `groups`
|
|
49
|
+
- `auto_bind_dm_to_active_quest`
|
|
50
|
+
|
|
51
|
+
完整字段说明请参考 [01 设置参考](./01_SETTINGS_REFERENCE.md)。
|
|
52
|
+
|
|
53
|
+
## 4. 绑定模型
|
|
54
|
+
|
|
55
|
+
Telegram 会话会被规范化成 quest-aware connector id,例如:
|
|
56
|
+
|
|
57
|
+
- `telegram:direct:<chat_id>`
|
|
58
|
+
- `telegram:group:<chat_id>`
|
|
59
|
+
|
|
60
|
+
DeepScientist 绑定的是这个规范化后的 conversation id,而不是临时 webhook 状态。
|
|
61
|
+
|
|
62
|
+
重要规则:
|
|
63
|
+
|
|
64
|
+
- 一个 quest 会保留本地访问,并且最多只绑定 1 个外部 connector target
|
|
65
|
+
- 如果启用了自动绑定,Telegram 私聊可以自动跟随最新活跃 quest
|
|
66
|
+
- 之后也可以在项目设置页修改绑定
|
|
67
|
+
|
|
68
|
+
## 5. 群聊行为
|
|
69
|
+
|
|
70
|
+
默认情况下:
|
|
71
|
+
|
|
72
|
+
- Telegram 私聊允许直接触发
|
|
73
|
+
- 群聊行为由 `group_policy` 控制
|
|
74
|
+
- 如果 `require_mention_in_groups` 为 `true`,机器人只有在被明确 mention,或收到命令时才会响应
|
|
75
|
+
|
|
76
|
+
这也是更适合多人群聊的推荐默认值。
|
|
77
|
+
|
|
78
|
+
## 6. 出站投递
|
|
79
|
+
|
|
80
|
+
当前 Telegram connector 主要聚焦于 text-first 的 quest 更新:
|
|
81
|
+
|
|
82
|
+
- 进度
|
|
83
|
+
- 里程碑摘要
|
|
84
|
+
- 绑定通知
|
|
85
|
+
- 结构化 quest 回复
|
|
86
|
+
|
|
87
|
+
当前 bridge 使用 Telegram Bot API 的 `sendMessage` 发送。
|
|
88
|
+
|
|
89
|
+
## 7. 常见问题排查
|
|
90
|
+
|
|
91
|
+
### 设置页里看不到 Telegram
|
|
92
|
+
|
|
93
|
+
Telegram 可能被 system connector gate 隐藏了。请确认:
|
|
94
|
+
|
|
95
|
+
- `config.connectors.system_enabled.telegram` 为 `true`
|
|
96
|
+
|
|
97
|
+
### 校验提示缺少凭据
|
|
98
|
+
|
|
99
|
+
请检查:
|
|
100
|
+
|
|
101
|
+
- `bot_token` 是否已填写
|
|
102
|
+
- 或 `bot_token_env` 是否指向真实存在的环境变量
|
|
103
|
+
|
|
104
|
+
### 机器人收不到消息
|
|
105
|
+
|
|
106
|
+
请检查:
|
|
107
|
+
|
|
108
|
+
- bot token 是否正确
|
|
109
|
+
- 是否至少从 Telegram 端先和 bot 交互过一次
|
|
110
|
+
- `transport` 是否仍然是 `polling`
|
|
111
|
+
- 是否存在旧的 webhook 抢占了更新流
|
|
112
|
+
|
|
113
|
+
### 群聊里 bot 不响应
|
|
114
|
+
|
|
115
|
+
请检查:
|
|
116
|
+
|
|
117
|
+
- `group_policy`
|
|
118
|
+
- `groups`
|
|
119
|
+
- `group_allow_from`
|
|
120
|
+
- `require_mention_in_groups`
|
|
121
|
+
|
|
122
|
+
### Telegram 里无法继续已有 quest
|
|
123
|
+
|
|
124
|
+
请检查:
|
|
125
|
+
|
|
126
|
+
- 当前会话是否已经绑定到目标 quest
|
|
127
|
+
- 或 `auto_bind_dm_to_active_quest` 是否已经启用
|
|
128
|
+
|
|
129
|
+
## 8. 相关文档
|
|
130
|
+
|
|
131
|
+
- [01 设置参考](./01_SETTINGS_REFERENCE.md)
|
|
132
|
+
- [02 Start Research 参考](./02_START_RESEARCH_GUIDE.md)
|
|
133
|
+
- [09 启动诊断](./09_DOCTOR.md)
|
|
134
|
+
- [13 核心架构说明](./13_CORE_ARCHITECTURE_GUIDE.md)
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# 17 WhatsApp Connector 指南
|
|
2
|
+
|
|
3
|
+
当你希望通过 WhatsApp 继续推进 DeepScientist quest 时,请阅读这份指南。
|
|
4
|
+
|
|
5
|
+
当前开源版本里的 WhatsApp 推荐路径使用本地 local-session 方案:
|
|
6
|
+
|
|
7
|
+
- 不需要公网 webhook
|
|
8
|
+
- 本地认证 / 会话状态保存在你自己的机器上
|
|
9
|
+
- 如果启用自动绑定,私聊可以自动跟随最新活跃 quest
|
|
10
|
+
|
|
11
|
+
## 1. WhatsApp 支持包含什么
|
|
12
|
+
|
|
13
|
+
当前 WhatsApp connector 由以下部分组成:
|
|
14
|
+
|
|
15
|
+
- `WhatsAppLocalSessionService`:负责本地会话同步与入站接入
|
|
16
|
+
- `GenericRelayChannel`:负责 bindings、inbox/outbox、targets 与运行时状态
|
|
17
|
+
- `WhatsAppConnectorBridge`:负责出站投递
|
|
18
|
+
|
|
19
|
+
在推荐路径下,出站消息会先写入 local-session outbox,再由本地 session / sidecar 处理。
|
|
20
|
+
|
|
21
|
+
## 2. 推荐配置路径
|
|
22
|
+
|
|
23
|
+
1. 打开 `Settings > Connectors > WhatsApp`。
|
|
24
|
+
2. 启用 WhatsApp。
|
|
25
|
+
3. 保持 `transport: local_session`。
|
|
26
|
+
4. 保持默认或指定一个可写的 `session_dir`。
|
|
27
|
+
5. 保存连接器配置。
|
|
28
|
+
6. 完成本地 WhatsApp 会话登录流程。
|
|
29
|
+
7. 从 WhatsApp 发送一条真实消息。
|
|
30
|
+
8. 回到 DeepScientist,确认目标会话已经被自动发现。
|
|
31
|
+
|
|
32
|
+
## 3. 关键配置字段
|
|
33
|
+
|
|
34
|
+
主要字段包括:
|
|
35
|
+
|
|
36
|
+
- `enabled`
|
|
37
|
+
- `transport`
|
|
38
|
+
- `bot_name`
|
|
39
|
+
- `auth_method`
|
|
40
|
+
- `session_dir`
|
|
41
|
+
- `command_prefix`
|
|
42
|
+
- `dm_policy`
|
|
43
|
+
- `allow_from`
|
|
44
|
+
- `group_policy`
|
|
45
|
+
- `group_allow_from`
|
|
46
|
+
- `groups`
|
|
47
|
+
- `auto_bind_dm_to_active_quest`
|
|
48
|
+
|
|
49
|
+
完整字段说明请参考 [01 设置参考](./01_SETTINGS_REFERENCE.md)。
|
|
50
|
+
|
|
51
|
+
## 4. 绑定模型
|
|
52
|
+
|
|
53
|
+
WhatsApp 会话会被规范化成 quest-aware connector id,例如:
|
|
54
|
+
|
|
55
|
+
- `whatsapp:direct:<jid>`
|
|
56
|
+
- `whatsapp:group:<jid>`
|
|
57
|
+
|
|
58
|
+
DeepScientist 绑定的是这个规范化后的 conversation id,而不是临时浏览器状态或短期 session 状态。
|
|
59
|
+
|
|
60
|
+
重要规则:
|
|
61
|
+
|
|
62
|
+
- 一个 quest 会保留本地访问,并且最多只绑定 1 个外部 connector target
|
|
63
|
+
- 如果启用了自动绑定,WhatsApp 私聊可以自动跟随最新活跃 quest
|
|
64
|
+
- 之后也可以在项目设置页修改绑定
|
|
65
|
+
|
|
66
|
+
## 5. local-session 运行方式
|
|
67
|
+
|
|
68
|
+
当前开源版本里的 WhatsApp 路径是 local-session 导向的:
|
|
69
|
+
|
|
70
|
+
- 运行时状态会镜像写入 DeepScientist 的 connector 日志目录
|
|
71
|
+
- 入站消息会从本地 session inbox 中被消费
|
|
72
|
+
- 出站消息会被写入本地 session outbox
|
|
73
|
+
|
|
74
|
+
这也符合 DeepScientist 的本地优先设计。
|
|
75
|
+
|
|
76
|
+
## 6. 群聊行为
|
|
77
|
+
|
|
78
|
+
默认情况下:
|
|
79
|
+
|
|
80
|
+
- 私聊可以和活跃 quest 自动配对
|
|
81
|
+
- 群聊行为由 `group_policy` 控制
|
|
82
|
+
- 也可以通过 `groups` 与 `group_allow_from` 强制使用白名单
|
|
83
|
+
|
|
84
|
+
## 7. 常见问题排查
|
|
85
|
+
|
|
86
|
+
### 设置页里看不到 WhatsApp
|
|
87
|
+
|
|
88
|
+
WhatsApp 可能被 system connector gate 隐藏了。请确认:
|
|
89
|
+
|
|
90
|
+
- `config.connectors.system_enabled.whatsapp` 为 `true`
|
|
91
|
+
|
|
92
|
+
### 校验提示连接器未就绪
|
|
93
|
+
|
|
94
|
+
请检查:
|
|
95
|
+
|
|
96
|
+
- `transport` 是否为 `local_session`
|
|
97
|
+
- `session_dir` 是否指向可写目录
|
|
98
|
+
|
|
99
|
+
### 没有自动发现目标会话
|
|
100
|
+
|
|
101
|
+
请检查:
|
|
102
|
+
|
|
103
|
+
- 本地登录 / 配对流程是否已经完成
|
|
104
|
+
- 是否至少有一条真实入站消息进入 local session inbox
|
|
105
|
+
|
|
106
|
+
### 无法从 WhatsApp 继续已有 quest
|
|
107
|
+
|
|
108
|
+
请检查:
|
|
109
|
+
|
|
110
|
+
- 当前会话是否已经绑定到目标 quest
|
|
111
|
+
- 或 `auto_bind_dm_to_active_quest` 是否已经启用
|
|
112
|
+
|
|
113
|
+
### 出站消息没有送达
|
|
114
|
+
|
|
115
|
+
请检查:
|
|
116
|
+
|
|
117
|
+
- 本地 session sidecar / processor 是否正在运行
|
|
118
|
+
- 本地 session outbox 是否正在被消费
|
|
119
|
+
- 目标 JID 是否正确
|
|
120
|
+
|
|
121
|
+
## 8. 相关文档
|
|
122
|
+
|
|
123
|
+
- [01 设置参考](./01_SETTINGS_REFERENCE.md)
|
|
124
|
+
- [02 Start Research 参考](./02_START_RESEARCH_GUIDE.md)
|
|
125
|
+
- [09 启动诊断](./09_DOCTOR.md)
|
|
126
|
+
- [13 核心架构说明](./13_CORE_ARCHITECTURE_GUIDE.md)
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# 18 Feishu Connector 指南
|
|
2
|
+
|
|
3
|
+
当你希望通过 Feishu / Lark 继续推进 DeepScientist quest 时,请阅读这份指南。
|
|
4
|
+
|
|
5
|
+
当前开源版本中的 Feishu 推荐路径使用内置 long-connection 方案:
|
|
6
|
+
|
|
7
|
+
- 不需要公网 event callback
|
|
8
|
+
- 核心凭据是 `app_id` 和 `app_secret`
|
|
9
|
+
- 如果启用自动绑定,私聊可以自动跟随最新活跃 quest
|
|
10
|
+
|
|
11
|
+
## 1. Feishu 支持包含什么
|
|
12
|
+
|
|
13
|
+
当前 Feishu connector 由以下部分组成:
|
|
14
|
+
|
|
15
|
+
- `FeishuLongConnectionService`:负责 long-connection 入站接收
|
|
16
|
+
- `GenericRelayChannel`:负责 bindings、inbox/outbox、targets 与运行时状态
|
|
17
|
+
- `FeishuConnectorBridge`:负责直接出站发送
|
|
18
|
+
|
|
19
|
+
这意味着 Feishu 已经接入了和其他 connector 一致的 quest 绑定模型。
|
|
20
|
+
|
|
21
|
+
## 2. 推荐配置路径
|
|
22
|
+
|
|
23
|
+
1. 打开 Feishu / Lark 开发者平台。
|
|
24
|
+
2. 创建应用。
|
|
25
|
+
3. 保存 `app_id` 和 `app_secret`。
|
|
26
|
+
4. 打开 `Settings > Connectors > Feishu`。
|
|
27
|
+
5. 启用 Feishu。
|
|
28
|
+
6. 保持 `transport: long_connection`。
|
|
29
|
+
7. 填写 `app_id` 与 `app_secret`。
|
|
30
|
+
8. 保存连接器配置。
|
|
31
|
+
9. 给 bot 发送一条真实消息。
|
|
32
|
+
10. 回到 DeepScientist,确认目标会话已经被自动发现。
|
|
33
|
+
|
|
34
|
+
## 3. 关键配置字段
|
|
35
|
+
|
|
36
|
+
主要字段包括:
|
|
37
|
+
|
|
38
|
+
- `enabled`
|
|
39
|
+
- `transport`
|
|
40
|
+
- `bot_name`
|
|
41
|
+
- `app_id`
|
|
42
|
+
- `app_secret`
|
|
43
|
+
- `api_base_url`
|
|
44
|
+
- `command_prefix`
|
|
45
|
+
- `dm_policy`
|
|
46
|
+
- `allow_from`
|
|
47
|
+
- `group_policy`
|
|
48
|
+
- `group_allow_from`
|
|
49
|
+
- `groups`
|
|
50
|
+
- `require_mention_in_groups`
|
|
51
|
+
- `auto_bind_dm_to_active_quest`
|
|
52
|
+
|
|
53
|
+
完整字段说明请参考 [01 设置参考](./01_SETTINGS_REFERENCE.md)。
|
|
54
|
+
|
|
55
|
+
## 4. 绑定模型
|
|
56
|
+
|
|
57
|
+
Feishu 会话会被规范化成 quest-aware connector id,例如:
|
|
58
|
+
|
|
59
|
+
- `feishu:direct:<chat_id>`
|
|
60
|
+
- `feishu:group:<chat_id>`
|
|
61
|
+
|
|
62
|
+
DeepScientist 绑定的是这个规范化后的 conversation id,而不是临时 callback payload。
|
|
63
|
+
|
|
64
|
+
重要规则:
|
|
65
|
+
|
|
66
|
+
- 一个 quest 会保留本地访问,并且最多只绑定 1 个外部 connector target
|
|
67
|
+
- 如果启用了自动绑定,Feishu 私聊可以自动跟随最新活跃 quest
|
|
68
|
+
- 之后也可以在项目设置页修改绑定
|
|
69
|
+
|
|
70
|
+
## 5. 群聊行为
|
|
71
|
+
|
|
72
|
+
默认情况下:
|
|
73
|
+
|
|
74
|
+
- 私聊允许直接触发
|
|
75
|
+
- 群聊行为由 `group_policy` 控制
|
|
76
|
+
- 如果 `require_mention_in_groups` 为 `true`,机器人只有在被明确 mention,或收到命令时才会响应
|
|
77
|
+
|
|
78
|
+
这也是更适合多人协作群的推荐默认值。
|
|
79
|
+
|
|
80
|
+
## 6. 出站投递
|
|
81
|
+
|
|
82
|
+
当前 Feishu connector 主要聚焦于 text-first 的 quest 更新:
|
|
83
|
+
|
|
84
|
+
- 进度
|
|
85
|
+
- 里程碑摘要
|
|
86
|
+
- 绑定通知
|
|
87
|
+
- 结构化 quest 回复
|
|
88
|
+
|
|
89
|
+
当前 bridge 使用 Feishu Open Platform 的消息接口发送。
|
|
90
|
+
|
|
91
|
+
## 7. 常见问题排查
|
|
92
|
+
|
|
93
|
+
### 设置页里看不到 Feishu
|
|
94
|
+
|
|
95
|
+
Feishu 可能被 system connector gate 隐藏了。请确认:
|
|
96
|
+
|
|
97
|
+
- `config.connectors.system_enabled.feishu` 为 `true`
|
|
98
|
+
|
|
99
|
+
### 校验提示缺少凭据
|
|
100
|
+
|
|
101
|
+
请检查:
|
|
102
|
+
|
|
103
|
+
- `app_id` 是否已填写
|
|
104
|
+
- `app_secret` 是否已填写
|
|
105
|
+
- 或 `app_secret_env` 是否指向真实存在的环境变量
|
|
106
|
+
|
|
107
|
+
### 没有自动发现目标会话
|
|
108
|
+
|
|
109
|
+
请检查:
|
|
110
|
+
|
|
111
|
+
- 应用凭据是否正确
|
|
112
|
+
- bot 是否已经收到至少一条真实入站消息
|
|
113
|
+
- `transport` 是否仍然是 `long_connection`
|
|
114
|
+
|
|
115
|
+
### 群聊里 bot 不响应
|
|
116
|
+
|
|
117
|
+
请检查:
|
|
118
|
+
|
|
119
|
+
- `group_policy`
|
|
120
|
+
- `groups`
|
|
121
|
+
- `group_allow_from`
|
|
122
|
+
- `require_mention_in_groups`
|
|
123
|
+
|
|
124
|
+
### 无法从 Feishu 继续已有 quest
|
|
125
|
+
|
|
126
|
+
请检查:
|
|
127
|
+
|
|
128
|
+
- 当前会话是否已经绑定到目标 quest
|
|
129
|
+
- 或 `auto_bind_dm_to_active_quest` 是否已经启用
|
|
130
|
+
|
|
131
|
+
## 8. 相关文档
|
|
132
|
+
|
|
133
|
+
- [01 设置参考](./01_SETTINGS_REFERENCE.md)
|
|
134
|
+
- [02 Start Research 参考](./02_START_RESEARCH_GUIDE.md)
|
|
135
|
+
- [09 启动诊断](./09_DOCTOR.md)
|
|
136
|
+
- [13 核心架构说明](./13_CORE_ARCHITECTURE_GUIDE.md)
|