@researai/deepscientist 1.5.11 → 1.5.12

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 (102) hide show
  1. package/README.md +8 -8
  2. package/bin/ds.js +358 -61
  3. package/docs/en/00_QUICK_START.md +35 -3
  4. package/docs/en/01_SETTINGS_REFERENCE.md +11 -0
  5. package/docs/en/02_START_RESEARCH_GUIDE.md +68 -4
  6. package/docs/en/09_DOCTOR.md +28 -3
  7. package/docs/en/12_GUIDED_WORKFLOW_TOUR.md +21 -2
  8. package/docs/en/15_CODEX_PROVIDER_SETUP.md +284 -0
  9. package/docs/en/README.md +4 -0
  10. package/docs/zh/00_QUICK_START.md +34 -2
  11. package/docs/zh/01_SETTINGS_REFERENCE.md +11 -0
  12. package/docs/zh/02_START_RESEARCH_GUIDE.md +69 -3
  13. package/docs/zh/09_DOCTOR.md +28 -1
  14. package/docs/zh/12_GUIDED_WORKFLOW_TOUR.md +21 -2
  15. package/docs/zh/15_CODEX_PROVIDER_SETUP.md +285 -0
  16. package/docs/zh/README.md +4 -1
  17. package/package.json +1 -1
  18. package/pyproject.toml +1 -1
  19. package/src/deepscientist/__init__.py +1 -1
  20. package/src/deepscientist/bash_exec/monitor.py +7 -5
  21. package/src/deepscientist/bash_exec/service.py +84 -21
  22. package/src/deepscientist/channels/local.py +3 -3
  23. package/src/deepscientist/channels/qq.py +7 -7
  24. package/src/deepscientist/channels/relay.py +7 -7
  25. package/src/deepscientist/channels/weixin_ilink.py +90 -19
  26. package/src/deepscientist/config/models.py +1 -0
  27. package/src/deepscientist/config/service.py +121 -20
  28. package/src/deepscientist/daemon/app.py +314 -6
  29. package/src/deepscientist/doctor.py +1 -5
  30. package/src/deepscientist/mcp/server.py +124 -3
  31. package/src/deepscientist/prompts/builder.py +113 -11
  32. package/src/deepscientist/quest/service.py +247 -31
  33. package/src/deepscientist/runners/codex.py +121 -22
  34. package/src/deepscientist/runners/runtime_overrides.py +6 -0
  35. package/src/deepscientist/shared.py +33 -14
  36. package/src/prompts/connectors/qq.md +2 -1
  37. package/src/prompts/connectors/weixin.md +2 -1
  38. package/src/prompts/contracts/shared_interaction.md +4 -1
  39. package/src/prompts/system.md +59 -9
  40. package/src/skills/analysis-campaign/SKILL.md +46 -6
  41. package/src/skills/analysis-campaign/references/campaign-plan-template.md +21 -8
  42. package/src/skills/baseline/SKILL.md +1 -1
  43. package/src/skills/decision/SKILL.md +1 -1
  44. package/src/skills/experiment/SKILL.md +1 -1
  45. package/src/skills/finalize/SKILL.md +1 -1
  46. package/src/skills/idea/SKILL.md +1 -1
  47. package/src/skills/intake-audit/SKILL.md +1 -1
  48. package/src/skills/rebuttal/SKILL.md +74 -1
  49. package/src/skills/rebuttal/references/response-letter-template.md +55 -11
  50. package/src/skills/review/SKILL.md +118 -1
  51. package/src/skills/review/references/experiment-todo-template.md +23 -0
  52. package/src/skills/review/references/review-report-template.md +16 -0
  53. package/src/skills/review/references/revision-log-template.md +4 -0
  54. package/src/skills/scout/SKILL.md +1 -1
  55. package/src/skills/write/SKILL.md +168 -7
  56. package/src/skills/write/references/paper-experiment-matrix-template.md +131 -0
  57. package/src/tui/package.json +1 -1
  58. package/src/ui/dist/assets/{AiManusChatView-D0mTXG4-.js → AiManusChatView-CnJcXynW.js} +12 -12
  59. package/src/ui/dist/assets/{AnalysisPlugin-Db0cTXxm.js → AnalysisPlugin-DeyzPEhV.js} +1 -1
  60. package/src/ui/dist/assets/{CliPlugin-DrV8je02.js → CliPlugin-CB1YODQn.js} +9 -9
  61. package/src/ui/dist/assets/{CodeEditorPlugin-QXMSCH71.js → CodeEditorPlugin-B-xicq1e.js} +8 -8
  62. package/src/ui/dist/assets/{CodeViewerPlugin-7hhtWj_E.js → CodeViewerPlugin-DT54ysXa.js} +5 -5
  63. package/src/ui/dist/assets/{DocViewerPlugin-BWMSnRJe.js → DocViewerPlugin-DQtKT-VD.js} +3 -3
  64. package/src/ui/dist/assets/{GitDiffViewerPlugin-7J9h9Vy_.js → GitDiffViewerPlugin-hqHbCfnv.js} +20 -20
  65. package/src/ui/dist/assets/{ImageViewerPlugin-CHJl_0lr.js → ImageViewerPlugin-OcVo33jV.js} +5 -5
  66. package/src/ui/dist/assets/{LabCopilotPanel-1qSow1es.js → LabCopilotPanel-DdGwhEUV.js} +11 -11
  67. package/src/ui/dist/assets/{LabPlugin-eQpPPCEp.js → LabPlugin-Ciz1gDaX.js} +2 -2
  68. package/src/ui/dist/assets/{LatexPlugin-BwRfi89Z.js → LatexPlugin-BhmjNQRC.js} +37 -11
  69. package/src/ui/dist/assets/{MarkdownViewerPlugin-836PVQWV.js → MarkdownViewerPlugin-BzdVH9Bx.js} +4 -4
  70. package/src/ui/dist/assets/{MarketplacePlugin-C2y_556i.js → MarketplacePlugin-DmyHspXt.js} +3 -3
  71. package/src/ui/dist/assets/{NotebookEditor-DIX7Mlzu.js → NotebookEditor-BMXKrDRk.js} +1 -1
  72. package/src/ui/dist/assets/{NotebookEditor-BRzJbGsn.js → NotebookEditor-BTVYRGkm.js} +11 -11
  73. package/src/ui/dist/assets/{PdfLoader-DzRaTAlq.js → PdfLoader-CvcjJHXv.js} +1 -1
  74. package/src/ui/dist/assets/{PdfMarkdownPlugin-DZUfIUnp.js → PdfMarkdownPlugin-DW2ej8Vk.js} +2 -2
  75. package/src/ui/dist/assets/{PdfViewerPlugin-BwtICzue.js → PdfViewerPlugin-CmlDxbhU.js} +10 -10
  76. package/src/ui/dist/assets/{SearchPlugin-DHeIAMsx.js → SearchPlugin-DAjQZPSv.js} +1 -1
  77. package/src/ui/dist/assets/{TextViewerPlugin-C3tCmFox.js → TextViewerPlugin-C-nVAZb_.js} +5 -5
  78. package/src/ui/dist/assets/{VNCViewer-CQsKVm3t.js → VNCViewer-D7-dIYon.js} +10 -10
  79. package/src/ui/dist/assets/{bot-BEA2vWuK.js → bot-C_G4WtNI.js} +1 -1
  80. package/src/ui/dist/assets/{code-XfbSR8K2.js → code-Cd7WfiWq.js} +1 -1
  81. package/src/ui/dist/assets/{file-content-BjxNaIfy.js → file-content-B57zsL9y.js} +1 -1
  82. package/src/ui/dist/assets/{file-diff-panel-D_lLVQk0.js → file-diff-panel-DVoheLFq.js} +1 -1
  83. package/src/ui/dist/assets/{file-socket-D9x_5vlY.js → file-socket-B5kXFxZP.js} +1 -1
  84. package/src/ui/dist/assets/{image-BhWT33W1.js → image-LLOjkMHF.js} +1 -1
  85. package/src/ui/dist/assets/{index-Dqj-Mjb4.css → index-BQG-1s2o.css} +40 -2
  86. package/src/ui/dist/assets/{index--c4iXtuy.js → index-C3r2iGrp.js} +12 -12
  87. package/src/ui/dist/assets/{index-DZTZ8mWP.js → index-CLQauncb.js} +911 -120
  88. package/src/ui/dist/assets/{index-PJbSbPTy.js → index-Dxa2eYMY.js} +1 -1
  89. package/src/ui/dist/assets/{index-BDxipwrC.js → index-hOUOWbW2.js} +2 -2
  90. package/src/ui/dist/assets/{monaco-K8izTGgo.js → monaco-BGGAEii3.js} +1 -1
  91. package/src/ui/dist/assets/{pdf-effect-queue-DfBors6y.js → pdf-effect-queue-DlEr1_y5.js} +1 -1
  92. package/src/ui/dist/assets/{popover-yFK1J4fL.js → popover-CWJbJuYY.js} +1 -1
  93. package/src/ui/dist/assets/{project-sync-PENr2zcz.js → project-sync-CRJiucYO.js} +18 -4
  94. package/src/ui/dist/assets/{select-CAbJDfYv.js → select-CoHB7pvH.js} +2 -2
  95. package/src/ui/dist/assets/{sigma-DEuYJqTl.js → sigma-D5aJWR8J.js} +1 -1
  96. package/src/ui/dist/assets/{square-check-big-omoSUmcd.js → square-check-big-DUK_mnkS.js} +1 -1
  97. package/src/ui/dist/assets/{trash--F119N47.js → trash-ChU3SEE3.js} +1 -1
  98. package/src/ui/dist/assets/{useCliAccess-D31UR23I.js → useCliAccess-BrJBV3tY.js} +1 -1
  99. package/src/ui/dist/assets/{useFileDiffOverlay-BH6KcMzq.js → useFileDiffOverlay-C2OQaVWc.js} +1 -1
  100. package/src/ui/dist/assets/{wrap-text-CZ613PM5.js → wrap-text-C7Qqh-om.js} +1 -1
  101. package/src/ui/dist/assets/{zoom-out-BgDLAv3z.js → zoom-out-rtX0FKya.js} +1 -1
  102. package/src/ui/dist/index.html +2 -2
@@ -115,13 +115,21 @@ type StartResearchTemplate = {
115
115
  baseline_variant_id: string
116
116
  baseline_urls: string
117
117
  paper_urls: string
118
+ review_materials: string
118
119
  runtime_constraints: string
119
120
  objectives: string
120
121
  need_research_paper: boolean
121
122
  research_intensity: 'light' | 'balanced' | 'sprint'
122
123
  decision_policy: 'autonomous' | 'user_gated'
123
124
  launch_mode: 'standard' | 'custom'
124
- custom_profile: 'continue_existing_state' | 'revision_rebuttal' | 'freeform'
125
+ custom_profile: 'continue_existing_state' | 'review_audit' | 'revision_rebuttal' | 'freeform'
126
+ review_followup_policy: 'audit_only' | 'auto_execute_followups' | 'user_gated_followups'
127
+ baseline_execution_policy:
128
+ | 'auto'
129
+ | 'must_reproduce_or_verify'
130
+ | 'reuse_existing_only'
131
+ | 'skip_unless_blocking'
132
+ manuscript_edit_mode: 'none' | 'copy_ready_text' | 'latex_required'
125
133
  entry_state_summary: string
126
134
  review_summary: string
127
135
  custom_brief: string
@@ -187,6 +195,9 @@ type StartResearchContractFields = {
187
195
  decision_policy,
188
196
  launch_mode,
189
197
  custom_profile,
198
+ review_followup_policy,
199
+ baseline_execution_policy,
200
+ manuscript_edit_mode,
190
201
  scope,
191
202
  baseline_mode,
192
203
  resource_policy,
@@ -196,6 +207,7 @@ type StartResearchContractFields = {
196
207
  objectives: string[],
197
208
  baseline_urls: string[],
198
209
  paper_urls: string[],
210
+ review_materials: string[],
199
211
  entry_state_summary,
200
212
  review_summary,
201
213
  custom_brief,
@@ -265,11 +277,19 @@ type StartResearchContractFields = {
265
277
  **`baseline_urls`**
266
278
 
267
279
  - 当没有 registry baseline 时,作为恢复 baseline 的候选来源。
280
+ - 可以填写网络链接,也可以直接填写绝对本地文件 / 文件夹路径。
268
281
  - 提交时转成 `string[]`。
269
282
 
270
283
  **`paper_urls`**
271
284
 
272
- - 论文、代码仓库、benchmark、leaderboard 等参考资料。
285
+ - 论文、代码仓库、benchmark、leaderboard、manuscript 路径等参考资料。
286
+ - 可以填写网络链接,也可以直接填写绝对本地文件 / 文件夹路径。
287
+ - 提交时转成 `string[]`。
288
+
289
+ **`review_materials`**
290
+
291
+ - 主要用于 `review_audit` 或 `revision_rebuttal`。
292
+ - 每行填写一个 URL,或一个绝对本地文件 / 文件夹路径,用于 reviewer comments、decision letter、meta-review 或 revision packet。
273
293
  - 提交时转成 `string[]`。
274
294
 
275
295
  ### 约束与目标
@@ -325,12 +345,49 @@ type StartResearchContractFields = {
325
345
  - `continue_existing_state`
326
346
  - 先审计已有 baseline、结果、草稿或混合资产
327
347
  - prompt builder 会显式引导 agent 优先打开 `intake-audit`
348
+ - `review_audit`
349
+ - 这是一个对现有 draft / paper package 做独立 skeptical 审计的任务
350
+ - prompt builder 会显式引导 agent 优先打开 `review`
328
351
  - `revision_rebuttal`
329
352
  - 这是一个审稿回复、revision、rebuttal 类型任务
330
353
  - prompt builder 会显式引导 agent 优先打开 `rebuttal`
331
354
  - `freeform`
355
+ - 这是“其它”入口
332
356
  - 以自定义 brief 为主,尽量少做额外假设
333
357
 
358
+ **`baseline_execution_policy`**
359
+
360
+ - 仅在 `launch_mode = custom` 时有意义。
361
+ - `auto`
362
+ - 让启动合同和当前证据自己决定
363
+ - `must_reproduce_or_verify`
364
+ - 在 reviewer-linked 的后续工作之前,先验证或恢复 rebuttal 关键依赖的 baseline / comparator
365
+ - `reuse_existing_only`
366
+ - 默认信任当前 baseline / 结果,除非它们明显不一致或不可用
367
+ - `skip_unless_blocking`
368
+ - 默认跳过 baseline 重跑,只有当某个 review / rebuttal 条目明确依赖缺失 comparator 时才补跑
369
+
370
+ **`review_followup_policy`**
371
+
372
+ - 主要用于 `review_audit`。
373
+ - `audit_only`
374
+ - 只完成审计产物和路由建议
375
+ - `auto_execute_followups`
376
+ - 审计后自动继续进入合理的实验和论文修改
377
+ - `user_gated_followups`
378
+ - 先完成审计,再在昂贵后续动作前等待你的批准
379
+
380
+ **`manuscript_edit_mode`**
381
+
382
+ - 主要用于 `review_audit` 和 `revision_rebuttal`。
383
+ - `none`
384
+ - 只输出规划产物
385
+ - `copy_ready_text`
386
+ - 输出 section-level 的可直接粘贴修改文本
387
+ - `latex_required`
388
+ - 优先把提供的 LaTeX 树当作写作表面,并输出 LaTeX-ready 的替换文本
389
+ - 如果选择这个模式,最好同时通过本地路径 / 文件夹输入提供 LaTeX 源目录
390
+
334
391
  **`entry_state_summary`**
335
392
 
336
393
  - 用自然语言概括当前已经存在什么。
@@ -387,6 +444,9 @@ type StartResearchContractFields = {
387
444
  - `custom + continue_existing_state`
388
445
  - 告诉 agent 先整理和信任排序已有资产
389
446
  - 明确优先 `intake-audit`
447
+ - `custom + review_audit`
448
+ - 告诉 agent 当前 draft / paper 状态就是主动合同
449
+ - 明确优先 `review`
390
450
  - `custom + revision_rebuttal`
391
451
  - 告诉 agent 先理解 reviewer comments 和当前论文状态
392
452
  - 明确优先 `rebuttal`
@@ -486,6 +546,9 @@ type StartResearchContractFields = {
486
546
  "decision_policy": "user_gated",
487
547
  "launch_mode": "custom",
488
548
  "custom_profile": "revision_rebuttal",
549
+ "review_followup_policy": "audit_only",
550
+ "baseline_execution_policy": "skip_unless_blocking",
551
+ "manuscript_edit_mode": "latex_required",
489
552
  "scope": "baseline_plus_direction",
490
553
  "baseline_mode": "restore_from_url",
491
554
  "resource_policy": "balanced",
@@ -499,6 +562,9 @@ type StartResearchContractFields = {
499
562
  ],
500
563
  "baseline_urls": [],
501
564
  "paper_urls": [],
565
+ "review_materials": [
566
+ "/absolute/path/to/review-comments.md"
567
+ ],
502
568
  "entry_state_summary": "A draft and previous experiment outputs already exist.",
503
569
  "review_summary": "Reviewers asked for one stronger ablation, one extra baseline, and a clearer limitation paragraph.",
504
570
  "custom_brief": "Treat the current manuscript and review packet as the active contract."
@@ -509,7 +575,7 @@ type StartResearchContractFields = {
509
575
  ## 运行时意义
510
576
 
511
577
  - `startup_contract` 是项目的持久状态,不只是 UI 临时字段。
512
- - 后续 prompt builder 还会继续读取 `launch_mode`、`custom_profile`、`entry_state_summary`、`review_summary`、`custom_brief`。
578
+ - 后续 prompt builder 还会继续读取 `launch_mode`、`custom_profile`、`review_followup_policy`、`baseline_execution_policy`、`manuscript_edit_mode`、`entry_state_summary`、`review_summary`、`review_materials`、`custom_brief`。
513
579
  - 所以 `Start Research` 不只影响第一轮,还会影响后续路由判断。
514
580
 
515
581
  ## 修改检查清单
@@ -10,12 +10,20 @@
10
10
  npm install -g @researai/deepscientist
11
11
  ```
12
12
 
13
- 2. 先确保 Codex 已安装并完成认证:
13
+ 2. 先确保 Codex 自己已经可用:
14
+
15
+ 默认 OpenAI 路径:
14
16
 
15
17
  ```bash
16
18
  codex --login
17
19
  ```
18
20
 
21
+ provider-backed profile 路径:
22
+
23
+ ```bash
24
+ codex --profile minimax
25
+ ```
26
+
19
27
  如果 `codex` 缺失,请显式修复:
20
28
 
21
29
  ```bash
@@ -81,6 +89,23 @@ codex --login
81
89
 
82
90
  先完成一次登录,再重新执行 `ds doctor`。
83
91
 
92
+ ### Codex profile 在终端里可用,但 DeepScientist 还是失败
93
+
94
+ 请显式让 DeepScientist 使用同一个 profile:
95
+
96
+ ```bash
97
+ ds doctor --codex-profile minimax
98
+ ds --codex-profile minimax
99
+ ```
100
+
101
+ 把这里的 `minimax` 换成你的真实 profile 名,例如 `m27`、`glm`、`ark`、`bailian`。
102
+
103
+ 同时检查:
104
+
105
+ - 启动 DeepScientist 的这个 shell 中,provider API key 仍然可见
106
+ - 该 profile 指向的是 provider 的 Coding Plan endpoint,而不是普通通用 API endpoint
107
+ - 如果模型应该由 profile 自己决定,请在 `~/DeepScientist/config/runners.yaml` 中使用 `model: inherit`
108
+
84
109
  ### 当前配置的 Codex 模型不可用
85
110
 
86
111
  DeepScientist 会在启动前强制做一次真实的 Codex hello 探测。当前版本里,这个探测会先使用:
@@ -95,6 +120,8 @@ DeepScientist 会在启动前强制做一次真实的 Codex hello 探测。当
95
120
  ds doctor
96
121
  ```
97
122
 
123
+ 对于 provider-backed 的 Codex profile,通常建议直接使用 `model: inherit`。
124
+
98
125
  ### 没有安装 `uv`
99
126
 
100
127
  正常情况下,第一次运行 `ds` 会自动在本地安装 `uv`。如果自动安装失败,再手动执行:
@@ -118,12 +118,12 @@ DeepScientist 常见有两种使用方式:
118
118
 
119
119
  这两栏的目的,是在第一轮开始前尽量减少歧义。
120
120
 
121
- 把仓库放进 `Baseline links`,适合这些情况:
121
+ 把仓库或绝对本地文件 / 文件夹路径放进 `Baseline links`,适合这些情况:
122
122
 
123
123
  - baseline 必须来自某个特定官方仓库
124
124
  - quest 需要先恢复指定实现
125
125
 
126
- 把论文或关键材料放进 `Reference papers / repos`,适合这些情况:
126
+ 把论文、manuscript 路径或关键材料放进 `Paper / reference sources`,适合这些情况:
127
127
 
128
128
  - 任务由某篇论文定义
129
129
  - 评测协议来自某个明确来源
@@ -131,6 +131,9 @@ DeepScientist 常见有两种使用方式:
131
131
 
132
132
  如果你已经知道 baseline 和论文,不要把它们藏在主请求正文里,应该放进专门字段。
133
133
 
134
+ 这两个参考字段不是只能填网络链接。
135
+ 你也可以直接填写绝对本地文件路径,或者绝对本地文件夹路径。
136
+
134
137
  ### 4.5 Reusable baseline
135
138
 
136
139
  只有当你已经把某个可信 baseline 导入了 registry,才需要选择它。
@@ -177,6 +180,22 @@ DeepScientist 常见有两种使用方式:
177
180
  - `Standard` 让 quest 按普通研究主线启动
178
181
  - `Research paper = On` 可以把分析与写作保持在范围内
179
182
 
183
+ 如果你把 `Launch mode` 切到 `Custom`,要进一步明确自定义任务类型:
184
+
185
+ - `Continue existing state`
186
+ - 适合已有资产很多、希望先复用再决策的任务
187
+ - `Review`
188
+ - 适合已有较完整 draft / paper package,想先做一次独立 skeptical 审计
189
+ - `Rebuttal / revision`
190
+ - 适合 reviewer comments 驱动,需要把评论映射成补实验、改文和 response letter 的任务
191
+ - `Other / freeform`
192
+ - 适合其他不完全属于标准 custom 类型的任务
193
+
194
+ 如果你选择的是 `Review`,还要继续决定:
195
+
196
+ - 审计后是直接停止,还是自动继续补实验和改稿
197
+ - 论文修改输出是普通可直接替换文本,还是 LaTeX-ready 文本
198
+
180
199
  ### 4.8 Runtime constraints
181
200
 
182
201
  这一栏应该写“硬规则”,而不是写愿望。
@@ -0,0 +1,285 @@
1
+ # 15 Codex Provider 配置
2
+
3
+ DeepScientist 不会为 MiniMax、GLM、火山方舟、阿里百炼单独实现一套 provider 适配器。
4
+
5
+ 它复用的是你本机已经能正常工作的 Codex CLI 配置。
6
+
7
+ 推荐顺序始终是:
8
+
9
+ 1. 先让 Codex 自己能工作
10
+ 2. 确认 `codex` 或 `codex --profile <name>` 在终端里可用
11
+ 3. 运行 `ds doctor`
12
+ 4. 再运行 `ds` 或 `ds --codex-profile <name>`
13
+
14
+ ## 三种推荐使用方式
15
+
16
+ ### 1. 默认 OpenAI 登录路径
17
+
18
+ 如果你的 Codex CLI 走的是标准 OpenAI 登录流,就用这一条。
19
+
20
+ ```bash
21
+ codex --login
22
+ ds doctor
23
+ ds
24
+ ```
25
+
26
+ ### 2. 临时使用 provider profile
27
+
28
+ 如果你已经有一个可用的 Codex profile,例如 `minimax`、`glm`、`ark`、`bailian`,最简单的方式就是直接在启动 `ds` 时透传它。
29
+
30
+ ```bash
31
+ codex --profile minimax
32
+ ds doctor --codex-profile minimax
33
+ ds --codex-profile minimax
34
+ ```
35
+
36
+ 这是最简单的路径。只是临时试用某个 provider 时,不需要先改 `runners.yaml`。
37
+
38
+ ### 3. 持久化 provider profile
39
+
40
+ 如果你希望 DeepScientist 之后默认就走这个 profile,可以写进 `runners.yaml`:
41
+
42
+ ```yaml
43
+ codex:
44
+ enabled: true
45
+ binary: codex
46
+ config_dir: ~/.codex
47
+ profile: minimax
48
+ model: inherit
49
+ model_reasoning_effort: xhigh
50
+ approval_policy: on-request
51
+ sandbox_mode: workspace-write
52
+ ```
53
+
54
+ 注意:
55
+
56
+ - 对 provider-backed 的 Codex profile,建议优先使用 `model: inherit`
57
+ - 除非你非常确定该 provider 接受你要显式传入的模型名,否则不要再额外硬写一个模型
58
+ - DeepScientist 会复用你终端里同一个 `~/.codex/config.toml` 与环境变量
59
+
60
+ ## Provider 一览
61
+
62
+ | Provider | 官方文档 | 是否需要 Codex 登录 | DeepScientist 应该怎么用 |
63
+ |---|---|---|---|
64
+ | OpenAI | 正常 Codex 配置即可 | 是 | 不需要 profile,直接 `ds` |
65
+ | MiniMax | [MiniMax Codex CLI](https://platform.minimaxi.com/docs/coding-plan/codex-cli) | 否 | 使用你自己的 Codex profile,例如 `ds --codex-profile minimax` |
66
+ | GLM | [GLM Coding Plan:其他工具](https://docs.bigmodel.cn/cn/coding-plan/tool/others) | 否 | 使用一个指向 GLM coding endpoint 的 Codex profile |
67
+ | 火山方舟 | [Ark Coding Plan 总览](https://www.volcengine.com/docs/82379/1925114?lang=zh) | 否 | 使用一个指向 Ark coding endpoint 的 Codex profile |
68
+ | 阿里百炼 | [百炼 Coding Plan:其他工具](https://help.aliyun.com/zh/model-studio/other-tools-coding-plan) | 否 | 使用一个指向 Bailian coding endpoint 的 Codex profile |
69
+
70
+ ## OpenAI
71
+
72
+ ### 需要准备什么
73
+
74
+ - 正常安装的 Codex CLI
75
+ - 已成功执行过一次 `codex --login`,或者在 `codex` 交互界面里完成首次认证
76
+
77
+ ### DeepScientist 命令
78
+
79
+ ```bash
80
+ ds doctor
81
+ ds
82
+ ```
83
+
84
+ ### 持久化 runner 配置
85
+
86
+ ```yaml
87
+ codex:
88
+ enabled: true
89
+ binary: codex
90
+ config_dir: ~/.codex
91
+ profile: ""
92
+ model: gpt-5.4
93
+ ```
94
+
95
+ ## MiniMax
96
+
97
+ MiniMax 是最典型的 profile 模式。它的官方 Codex CLI 文档直接给了自定义 provider 的配置方式,并明确写了 `requires_openai_auth = false`。
98
+
99
+ 官方文档:
100
+
101
+ - <https://platform.minimaxi.com/docs/coding-plan/codex-cli>
102
+
103
+ ### 需要准备什么
104
+
105
+ - 已安装 Codex CLI
106
+ - 在启动 Codex 和 DeepScientist 的 shell 中可见的 `MINIMAX_API_KEY`
107
+ - `~/.codex/config.toml` 中已经配置好的 Codex profile
108
+
109
+ ### Codex 侧配置
110
+
111
+ MiniMax 官方页面给了真实的 Codex custom provider 示例。profile 名称由你自己决定。下面用 `minimax` 作为示例;如果你已经配置成 `m27`,就继续使用 `m27`。
112
+
113
+ ```toml
114
+ [model_providers.minimax]
115
+ name = "MiniMax Chat Completions API"
116
+ base_url = "https://api.minimaxi.com/v1"
117
+ env_key = "MINIMAX_API_KEY"
118
+ wire_api = "chat"
119
+ requires_openai_auth = false
120
+ request_max_retries = 4
121
+ stream_max_retries = 10
122
+ stream_idle_timeout_ms = 300000
123
+
124
+ [profiles.minimax]
125
+ model = "codex-MiniMax-M2.5"
126
+ model_provider = "minimax"
127
+ ```
128
+
129
+ 然后执行:
130
+
131
+ ```bash
132
+ export MINIMAX_API_KEY="..."
133
+ codex --profile minimax
134
+ ```
135
+
136
+ ### DeepScientist 命令
137
+
138
+ ```bash
139
+ ds doctor --codex-profile minimax
140
+ ds --codex-profile minimax
141
+ ```
142
+
143
+ ### 持久化 runner 配置
144
+
145
+ ```yaml
146
+ codex:
147
+ enabled: true
148
+ binary: codex
149
+ config_dir: ~/.codex
150
+ profile: minimax
151
+ model: inherit
152
+ ```
153
+
154
+ ## GLM
155
+
156
+ GLM 的官方文档把 Coding Plan 描述成 OpenAI-compatible 的 coding endpoint,而不是单独的 Codex 登录流程。
157
+
158
+ 官方文档:
159
+
160
+ - <https://docs.bigmodel.cn/cn/coding-plan/tool/others>
161
+ - <https://docs.bigmodel.cn/cn/coding-plan/faq>
162
+
163
+ ### 官方给出的 provider 关键值
164
+
165
+ - Base URL:`https://open.bigmodel.cn/api/coding/paas/v4`
166
+ - API Key:你的 GLM Coding Plan key
167
+ - Model:文档中明确写了 `GLM-4.7`,部分场景也支持 `GLM-5`
168
+
169
+ ### 推荐做法
170
+
171
+ GLM 当前没有像 MiniMax 那样单独给出一篇 Codex CLI 专页。对 DeepScientist 来说,最稳的做法是:
172
+
173
+ 1. 在 `~/.codex/config.toml` 中创建一个指向上面 GLM coding endpoint 的 Codex profile
174
+ 2. 先确保 `codex --profile glm` 在终端里能工作
175
+ 3. 再让 DeepScientist 复用同一个 profile
176
+
177
+ ### DeepScientist 命令
178
+
179
+ ```bash
180
+ ds doctor --codex-profile glm
181
+ ds --codex-profile glm
182
+ ```
183
+
184
+ ### 持久化 runner 配置
185
+
186
+ ```yaml
187
+ codex:
188
+ enabled: true
189
+ binary: codex
190
+ config_dir: ~/.codex
191
+ profile: glm
192
+ model: inherit
193
+ ```
194
+
195
+ ## 火山方舟
196
+
197
+ 火山方舟的 Coding Plan 官方文档明确列出了 Codex CLI。
198
+
199
+ 官方文档:
200
+
201
+ - <https://www.volcengine.com/docs/82379/1925114?lang=zh>
202
+
203
+ ### 官方给出的 provider 关键值
204
+
205
+ - OpenAI-compatible Base URL:`https://ark.cn-beijing.volces.com/api/coding/v3`
206
+ - 支持的 coding 模型:`doubao-seed-code-preview-latest`、`ark-code-latest`
207
+ - 必须使用 Coding Plan 的 key 和对应的 Coding Plan endpoint
208
+
209
+ ### 推荐做法
210
+
211
+ 先创建一个指向 Ark coding endpoint 的 Codex profile,并先验证:
212
+
213
+ ```bash
214
+ codex --profile ark
215
+ ```
216
+
217
+ 然后再启动 DeepScientist:
218
+
219
+ ```bash
220
+ ds doctor --codex-profile ark
221
+ ds --codex-profile ark
222
+ ```
223
+
224
+ ### 持久化 runner 配置
225
+
226
+ ```yaml
227
+ codex:
228
+ enabled: true
229
+ binary: codex
230
+ config_dir: ~/.codex
231
+ profile: ark
232
+ model: inherit
233
+ ```
234
+
235
+ ## 阿里百炼
236
+
237
+ 阿里百炼的 Coding Plan 官方文档也是 OpenAI-compatible endpoint 路径。它特别强调:必须使用 Coding Plan 专属 key 和 endpoint,而不是普通平台 endpoint。
238
+
239
+ 官方文档:
240
+
241
+ - <https://help.aliyun.com/zh/model-studio/other-tools-coding-plan>
242
+ - <https://help.aliyun.com/zh/model-studio/coding-plan-faq>
243
+
244
+ ### 官方给出的 provider 关键值
245
+
246
+ - OpenAI-compatible Base URL:`https://coding.dashscope.aliyuncs.com/v1`
247
+ - API Key:Coding Plan 专属 key,通常形如 `sk-sp-...`
248
+ - Model:请以当前百炼 Coding Plan 概览页支持的模型为准
249
+
250
+ ### 推荐做法
251
+
252
+ 先创建一个指向 Bailian Coding Plan endpoint 的 Codex profile,并先验证:
253
+
254
+ ```bash
255
+ codex --profile bailian
256
+ ```
257
+
258
+ 然后再启动 DeepScientist:
259
+
260
+ ```bash
261
+ ds doctor --codex-profile bailian
262
+ ds --codex-profile bailian
263
+ ```
264
+
265
+ ### 持久化 runner 配置
266
+
267
+ ```yaml
268
+ codex:
269
+ enabled: true
270
+ binary: codex
271
+ config_dir: ~/.codex
272
+ profile: bailian
273
+ model: inherit
274
+ ```
275
+
276
+ ## 一份统一的排障清单
277
+
278
+ 如果 provider-backed profile 在 DeepScientist 里还是失败:
279
+
280
+ 1. 先手动运行 `codex --profile <name>`
281
+ 2. 确认 provider API key 在同一个 shell 中可见
282
+ 3. 确认 Base URL 使用的是 Coding Plan endpoint,而不是普通通用 API endpoint
283
+ 4. DeepScientist 里优先保持 `model: inherit`
284
+ 5. 运行 `ds doctor --codex-profile <name>`
285
+ 6. 最后再运行 `ds --codex-profile <name>`
package/docs/zh/README.md CHANGED
@@ -39,7 +39,6 @@ DeepScientist 灵活且易于使用,支持:
39
39
  | [Dr. Claw](https://github.com/OpenLAIR/dr-claw) | Open-source | ✓ | | ✓ | | ✓ | |
40
40
  | [FARS](https://analemma.ai/fars/) | Closed-source | ✓ | | | | | |
41
41
  | [EvoScientist](https://github.com/EvoScientist/EvoScientist) | Open-source | ✓ | | ✓ | ✓ | ✓ | |
42
- | [PaperClaw](https://github.com/meowscles69/PaperClaw) | Open-source | | | | | | ✓ |
43
42
  | [ScienceClaw](https://github.com/beita6969/ScienceClaw) | Open-source | | | | ✓ | ✓ | |
44
43
  | [claude-scholar](https://github.com/Galaxy-Dawn/claude-scholar) | Open-source | ✓ | | ✓ | ✓ | | |
45
44
  | [Research-Claw](https://github.com/wentorai/Research-Claw) | Open-source | ✓ | | ✓ | ✓ | ✓ | |
@@ -77,6 +76,8 @@ DeepScientist 灵活且易于使用,支持:
77
76
 
78
77
  - [00 快速开始](./00_QUICK_START.md)
79
78
  从安装、启动,到创建第一个项目,先看这一篇。
79
+ - [15 Codex Provider 配置](./15_CODEX_PROVIDER_SETUP.md)
80
+ 如果你准备通过 MiniMax、GLM、火山方舟、阿里百炼或其他 Codex profile 来运行 DeepScientist,先看这一篇。
80
81
  - [12 引导式工作流教程](./12_GUIDED_WORKFLOW_TOUR.md)
81
82
  按真实产品流程,逐步理解从首页到工作区应该怎么使用。
82
83
  - [02 Start Research 参考](./02_START_RESEARCH_GUIDE.md)
@@ -115,6 +116,8 @@ DeepScientist 灵活且易于使用,支持:
115
116
 
116
117
  - [09 启动诊断](./09_DOCTOR.md)
117
118
  启动诊断、排查常见运行问题,先看这篇。
119
+ - [15 Codex Provider 配置](./15_CODEX_PROVIDER_SETUP.md)
120
+ 如果问题更像出在 Codex profile、provider endpoint、API key 或模型配置上,优先看这篇。
118
121
  - [01 设置参考](./01_SETTINGS_REFERENCE.md)
119
122
  如果问题可能和配置、凭据或 connector 有关,再查这篇。
120
123
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@researai/deepscientist",
3
- "version": "1.5.11",
3
+ "version": "1.5.12",
4
4
  "description": "DeepScientist is not just a fully open-source autonomous scientific discovery system. It is also a research map that keeps growing from every round.",
5
5
  "license": "Apache-2.0",
6
6
  "files": [
package/pyproject.toml CHANGED
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "deepscientist"
7
- version = "1.5.11"
7
+ version = "1.5.12"
8
8
  description = "DeepScientist Core skeleton"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -5,4 +5,4 @@ __all__ = ["__version__"]
5
5
  try:
6
6
  __version__ = _package_version("deepscientist")
7
7
  except PackageNotFoundError: # pragma: no cover - source checkout fallback
8
- __version__ = "1.5.11"
8
+ __version__ = "1.5.12"
@@ -22,7 +22,7 @@ from .service import (
22
22
  _coerce_session_status,
23
23
  _parse_progress_marker,
24
24
  )
25
- from ..shared import append_jsonl, ensure_dir, read_json, read_jsonl, utc_now
25
+ from ..shared import append_jsonl, ensure_dir, iter_jsonl, read_json, read_jsonl, utc_now
26
26
 
27
27
  DEFAULT_STOP_GRACE_SECONDS = 5
28
28
  TERMINAL_IO_POLL_SECONDS = 0.02
@@ -298,7 +298,7 @@ def run_monitor(session_dir: Path) -> int:
298
298
  log_path.touch(exist_ok=True)
299
299
  input_path.touch(exist_ok=True)
300
300
  if not input_cursor_path.exists():
301
- _atomic_write_json(input_cursor_path, {"offset": len(read_jsonl(input_path)), "updated_at": utc_now()})
301
+ _atomic_write_json(input_cursor_path, {"offset": sum(1 for _ in iter_jsonl(input_path)), "updated_at": utc_now()})
302
302
 
303
303
  tool_env = os.environ.pop("DS_BASH_EXEC_TOOL_ENV", "")
304
304
  env_payload = os.environ.copy()
@@ -451,9 +451,11 @@ def run_monitor(session_dir: Path) -> int:
451
451
  if output_fd is not None and process.poll() is None:
452
452
  cursor_payload = read_json(input_cursor_path, {}) or {}
453
453
  offset = int(cursor_payload.get("offset") or 0)
454
- input_entries = read_jsonl(input_path)
455
- if offset < len(input_entries):
456
- for entry in input_entries[offset:]:
454
+ total_input_entries = sum(1 for _ in iter_jsonl(input_path))
455
+ if offset < total_input_entries:
456
+ for index, entry in enumerate(iter_jsonl(input_path)):
457
+ if index < offset:
458
+ continue
457
459
  raw_data = str(entry.get("data") or "")
458
460
  if raw_data:
459
461
  try: