@researai/deepscientist 1.5.15 → 1.5.17
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 +385 -104
- package/bin/ds.js +1241 -110
- package/docs/en/00_QUICK_START.md +100 -19
- package/docs/en/01_SETTINGS_REFERENCE.md +34 -1
- package/docs/en/02_START_RESEARCH_GUIDE.md +7 -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 +25 -8
- package/docs/en/14_PROMPT_SKILLS_AND_MCP_GUIDE.md +63 -13
- package/docs/en/15_CODEX_PROVIDER_SETUP.md +37 -11
- 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/21_LOCAL_MODEL_BACKENDS_GUIDE.md +283 -0
- package/docs/en/91_DEVELOPMENT.md +237 -0
- package/docs/en/README.md +24 -2
- package/docs/zh/00_QUICK_START.md +89 -19
- package/docs/zh/01_SETTINGS_REFERENCE.md +34 -1
- package/docs/zh/02_START_RESEARCH_GUIDE.md +7 -0
- package/docs/zh/05_TUI_GUIDE.md +6 -0
- package/docs/zh/09_DOCTOR.md +26 -9
- package/docs/zh/14_PROMPT_SKILLS_AND_MCP_GUIDE.md +63 -13
- package/docs/zh/15_CODEX_PROVIDER_SETUP.md +37 -11
- 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/21_LOCAL_MODEL_BACKENDS_GUIDE.md +281 -0
- package/docs/zh/README.md +24 -2
- package/install.sh +46 -4
- package/package.json +2 -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/service.py +647 -22
- package/src/deepscientist/bash_exec/service.py +234 -9
- package/src/deepscientist/bridges/connectors.py +8 -2
- package/src/deepscientist/cli.py +115 -19
- package/src/deepscientist/codex_cli_compat.py +367 -22
- package/src/deepscientist/config/models.py +2 -1
- package/src/deepscientist/config/service.py +183 -13
- package/src/deepscientist/daemon/api/handlers.py +255 -31
- package/src/deepscientist/daemon/api/router.py +9 -0
- package/src/deepscientist/daemon/app.py +1146 -105
- package/src/deepscientist/diagnostics/__init__.py +6 -0
- package/src/deepscientist/diagnostics/runner_failures.py +130 -0
- package/src/deepscientist/doctor.py +207 -3
- package/src/deepscientist/gitops/__init__.py +10 -1
- package/src/deepscientist/gitops/diff.py +129 -0
- package/src/deepscientist/gitops/service.py +4 -1
- package/src/deepscientist/mcp/server.py +39 -0
- package/src/deepscientist/prompts/builder.py +275 -34
- package/src/deepscientist/quest/layout.py +15 -2
- package/src/deepscientist/quest/service.py +707 -55
- package/src/deepscientist/quest/stage_views.py +6 -1
- package/src/deepscientist/runners/codex.py +143 -43
- package/src/deepscientist/shared.py +19 -0
- 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 +14 -2
- package/src/prompts/system.md +23 -5
- package/src/prompts/system_copilot.md +56 -0
- package/src/skills/analysis-campaign/SKILL.md +1 -0
- package/src/skills/baseline/SKILL.md +8 -0
- package/src/skills/decision/SKILL.md +8 -0
- package/src/skills/experiment/SKILL.md +8 -0
- package/src/skills/figure-polish/SKILL.md +1 -0
- package/src/skills/finalize/SKILL.md +1 -0
- package/src/skills/idea/SKILL.md +1 -0
- package/src/skills/intake-audit/SKILL.md +8 -0
- 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 +1 -0
- package/src/skills/rebuttal/SKILL.md +1 -0
- package/src/skills/review/SKILL.md +1 -0
- package/src/skills/scout/SKILL.md +8 -0
- package/src/skills/write/SKILL.md +1 -0
- package/src/tui/dist/app/AppContainer.js +19 -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-Bv-Z8YpU.js +204 -0
- package/src/ui/dist/assets/AnalysisPlugin-BCKAfjba.js +1 -0
- package/src/ui/dist/assets/CliPlugin-BCKcpc35.js +109 -0
- package/src/ui/dist/assets/CodeEditorPlugin-DbOfSJ8K.js +2 -0
- package/src/ui/dist/assets/CodeViewerPlugin-CbaFRrUU.js +270 -0
- package/src/ui/dist/assets/DocViewerPlugin-DAjLVeQD.js +7 -0
- package/src/ui/dist/assets/GitCommitViewerPlugin-CIUqbUDO.js +1 -0
- package/src/ui/dist/assets/GitDiffViewerPlugin-CQACjoAA.js +6 -0
- package/src/ui/dist/assets/GitSnapshotViewer-0r4nLPke.js +30 -0
- package/src/ui/dist/assets/ImageViewerPlugin-nBOmI2v_.js +26 -0
- package/src/ui/dist/assets/LabCopilotPanel-BHxOxF4z.js +14 -0
- package/src/ui/dist/assets/LabPlugin-BKoZGs95.js +22 -0
- package/src/ui/dist/assets/LatexPlugin-ZwtV8pIp.js +25 -0
- package/src/ui/dist/assets/MarkdownViewerPlugin-DKqVfKyW.js +128 -0
- package/src/ui/dist/assets/MarketplacePlugin-BwxStZ9D.js +13 -0
- package/src/ui/dist/assets/NotebookEditor-BEQhaQbt.js +81 -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-DB9N_T9q.js +361 -0
- package/src/ui/dist/assets/PdfLoader-Cy5jtWrr.css +1 -0
- package/src/ui/dist/assets/PdfLoader-eWBONbQP.js +16 -0
- package/src/ui/dist/assets/PdfMarkdownPlugin-D22YOZL3.js +1 -0
- package/src/ui/dist/assets/PdfViewerPlugin-c-RK9DLM.js +17 -0
- package/src/ui/dist/assets/PdfViewerPlugin-nwwE-fjJ.css +1 -0
- package/src/ui/dist/assets/SearchPlugin-CxF9ytAx.js +16 -0
- package/src/ui/dist/assets/SearchPlugin-DA4en4hK.css +1 -0
- package/src/ui/dist/assets/TextViewerPlugin-C5xqeeUH.js +54 -0
- package/src/ui/dist/assets/VNCViewer-BoLGLnHz.js +11 -0
- package/src/ui/dist/assets/bot-DREQOxzP.js +6 -0
- package/src/ui/dist/assets/browser-CTB2jwNe.js +8 -0
- package/src/ui/dist/assets/chevron-up-C9Qpx4DE.js +6 -0
- package/src/ui/dist/assets/code-WlFHE7z_.js +6 -0
- package/src/ui/dist/assets/file-content-BZMz3RYp.js +1 -0
- package/src/ui/dist/assets/file-diff-panel-CQhw0jS2.js +1 -0
- package/src/ui/dist/assets/file-jump-queue-DA-SdG__.js +1 -0
- package/src/ui/dist/assets/file-socket-CfQPKQKj.js +1 -0
- package/src/ui/dist/assets/git-commit-horizontal-DxZ8DCZh.js +6 -0
- package/src/ui/dist/assets/image-Bgl4VIyx.js +6 -0
- package/src/ui/dist/assets/index-BpV6lusQ.css +33 -0
- package/src/ui/dist/assets/index-CBNVuWcP.js +2496 -0
- package/src/ui/dist/assets/index-CwNu1aH4.js +11 -0
- package/src/ui/dist/assets/index-DrUnlf6K.js +1 -0
- package/src/ui/dist/assets/index-NW-h8VzN.js +1 -0
- package/src/ui/dist/assets/monaco-CiHMMNH_.js +1 -0
- package/src/ui/dist/assets/pdf-effect-queue-J8OnM0jE.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-CLc0pPP8.js +1 -0
- package/src/ui/dist/assets/project-sync-C9IdzdZW.js +1 -0
- package/src/ui/dist/assets/select-Cs2PmzwL.js +11 -0
- package/src/ui/dist/assets/sigma-ClKcHAXm.js +6 -0
- package/src/ui/dist/assets/trash-DwpbFr3w.js +11 -0
- package/src/ui/dist/assets/useCliAccess-NQ8m0Let.js +1 -0
- package/src/ui/dist/assets/useFileDiffOverlay-FuhcnKiw.js +1 -0
- package/src/ui/dist/assets/wrap-text-BC-Hltpd.js +11 -0
- package/src/ui/dist/assets/zoom-out-E_gaeAxL.js +11 -0
- package/src/ui/dist/index.html +5 -2
- package/src/ui/dist/assets/AiManusChatView-DDjbFnbt.js +0 -26597
- package/src/ui/dist/assets/AnalysisPlugin-Yb5IdmaU.js +0 -123
- package/src/ui/dist/assets/CliPlugin-e64sreyu.js +0 -31037
- package/src/ui/dist/assets/CodeEditorPlugin-C4D2TIkU.js +0 -427
- package/src/ui/dist/assets/CodeViewerPlugin-BVoNZIvC.js +0 -905
- package/src/ui/dist/assets/DocViewerPlugin-CLChbllo.js +0 -278
- package/src/ui/dist/assets/GitDiffViewerPlugin-C4xeFyFQ.js +0 -2661
- package/src/ui/dist/assets/ImageViewerPlugin-OiMUAcLi.js +0 -500
- package/src/ui/dist/assets/LabCopilotPanel-BjD2ThQF.js +0 -4104
- package/src/ui/dist/assets/LabPlugin-DQPg-NrB.js +0 -2677
- package/src/ui/dist/assets/LatexPlugin-CI05XAV9.js +0 -1792
- package/src/ui/dist/assets/MarkdownViewerPlugin-DpeBLYZf.js +0 -308
- package/src/ui/dist/assets/MarketplacePlugin-DolE58Q2.js +0 -413
- package/src/ui/dist/assets/NotebookEditor-7Qm2rSWD.js +0 -4214
- package/src/ui/dist/assets/NotebookEditor-C1kWaxKi.js +0 -84873
- package/src/ui/dist/assets/NotebookEditor-C3VQ7ylN.css +0 -1405
- package/src/ui/dist/assets/PdfLoader-BfOHw8Zw.js +0 -25468
- package/src/ui/dist/assets/PdfLoader-C-Y707R3.css +0 -49
- package/src/ui/dist/assets/PdfMarkdownPlugin-BulDREv1.js +0 -409
- package/src/ui/dist/assets/PdfViewerPlugin-C-daaOaL.js +0 -3095
- package/src/ui/dist/assets/PdfViewerPlugin-DQ11QcSf.css +0 -3627
- package/src/ui/dist/assets/SearchPlugin-CjpaiJ3A.js +0 -741
- package/src/ui/dist/assets/SearchPlugin-DDMrGDkh.css +0 -379
- package/src/ui/dist/assets/TextViewerPlugin-BxIyqPQC.js +0 -472
- package/src/ui/dist/assets/VNCViewer-HAg9mF7M.js +0 -18821
- package/src/ui/dist/assets/awareness-C0NPR2Dj.js +0 -292
- package/src/ui/dist/assets/bot-0DYntytV.js +0 -21
- package/src/ui/dist/assets/browser-BAcuE0Xj.js +0 -2895
- package/src/ui/dist/assets/code-B20Slj_w.js +0 -17
- package/src/ui/dist/assets/file-content-DT24KFma.js +0 -377
- package/src/ui/dist/assets/file-diff-panel-DK13YPql.js +0 -92
- package/src/ui/dist/assets/file-jump-queue-r5XKgJEV.js +0 -16
- package/src/ui/dist/assets/file-socket-B4T2o4nR.js +0 -58
- package/src/ui/dist/assets/function-B5QZkkHC.js +0 -1895
- package/src/ui/dist/assets/image-DSeR_sDS.js +0 -18
- package/src/ui/dist/assets/index-BrFje2Uk.js +0 -120
- package/src/ui/dist/assets/index-BwRJaoTl.js +0 -25
- package/src/ui/dist/assets/index-D_E4281X.js +0 -221322
- package/src/ui/dist/assets/index-DnYB3xb1.js +0 -159
- package/src/ui/dist/assets/index-G7AcWcMu.css +0 -12594
- package/src/ui/dist/assets/monaco-LExaAN3Y.js +0 -623
- package/src/ui/dist/assets/pdf-effect-queue-BJk5okWJ.js +0 -47
- package/src/ui/dist/assets/pdf_viewer-e0g1is2C.js +0 -8206
- package/src/ui/dist/assets/popover-D3Gg_FoV.js +0 -476
- package/src/ui/dist/assets/project-sync-C_ygLlVU.js +0 -297
- package/src/ui/dist/assets/select-CpAK6uWm.js +0 -1690
- package/src/ui/dist/assets/sigma-DEccaSgk.js +0 -22
- package/src/ui/dist/assets/square-check-big-uUfyVsbD.js +0 -17
- package/src/ui/dist/assets/trash-CXvwwSe8.js +0 -32
- package/src/ui/dist/assets/useCliAccess-Bnop4mgR.js +0 -957
- package/src/ui/dist/assets/useFileDiffOverlay-B8eUAX0I.js +0 -53
- package/src/ui/dist/assets/wrap-text-9vbOBpkW.js +0 -35
- package/src/ui/dist/assets/yjs-DncrqiZ8.js +0 -11243
- package/src/ui/dist/assets/zoom-out-BgVMmOW4.js +0 -34
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
# 21 本地模型后端指南:vLLM、Ollama 与 SGLang
|
|
2
|
+
|
|
3
|
+
这篇文档说明如何通过 Codex,把 DeepScientist 接到本地 OpenAI-compatible 模型后端。
|
|
4
|
+
|
|
5
|
+
最关键的一点只有一句话:
|
|
6
|
+
|
|
7
|
+
- 当前 Codex CLI 要求 `wire_api = "responses"`
|
|
8
|
+
- 只有 `/v1/chat/completions` 能工作还不够
|
|
9
|
+
- 在期待 `ds` 或 `ds doctor` 成功之前,必须先验证 `/v1/responses`
|
|
10
|
+
|
|
11
|
+
同时还有一个现实 fallback:
|
|
12
|
+
|
|
13
|
+
- 如果你的后端只有 chat 接口,仍然有机会通过 **Codex CLI `0.57.0`** 跑通
|
|
14
|
+
- 这条旧路径通常需要使用顶层 `model_provider` / `model`,并把 `wire_api` 设为 `chat`
|
|
15
|
+
- DeepScientist 现在会在 Codex 启动探测阶段自动检查这一点;只要发现当前生效 provider 使用的是 `wire_api = "chat"`,就会要求 `codex-cli 0.57.0` 才继续
|
|
16
|
+
|
|
17
|
+
## 1. DeepScientist 实际依赖的是什么
|
|
18
|
+
|
|
19
|
+
DeepScientist 并不会直接和 vLLM、Ollama、SGLang 通信。
|
|
20
|
+
|
|
21
|
+
它真正依赖的是:
|
|
22
|
+
|
|
23
|
+
- `codex`
|
|
24
|
+
- 然后由 `codex` 去调用你在 `~/.codex/config.toml` 里配置的 provider profile
|
|
25
|
+
|
|
26
|
+
所以真实兼容链路是:
|
|
27
|
+
|
|
28
|
+
1. 你的本地模型后端
|
|
29
|
+
2. Codex profile
|
|
30
|
+
3. Codex 启动探测
|
|
31
|
+
4. DeepScientist runner
|
|
32
|
+
|
|
33
|
+
如果第 2 步或第 3 步过不了,DeepScientist 就无法正常启动 Codex runner。
|
|
34
|
+
|
|
35
|
+
## 2. 当前 Codex 必须知道的限制
|
|
36
|
+
|
|
37
|
+
在当前 Codex CLI 中:
|
|
38
|
+
|
|
39
|
+
- 支持 `wire_api = "responses"`
|
|
40
|
+
- 不再接受 `wire_api = "chat"`
|
|
41
|
+
|
|
42
|
+
这意味着:
|
|
43
|
+
|
|
44
|
+
- `vLLM`:如果 OpenAI-compatible server 暴露了 `/v1/responses`,这是当前最推荐的路径
|
|
45
|
+
- `Ollama`:只有在你的版本真的支持 `/v1/responses` 时才建议使用
|
|
46
|
+
- `SGLang`:如果你的部署只有 `/v1/chat/completions` 能工作,那么它和最新版 Codex runner 不兼容
|
|
47
|
+
|
|
48
|
+
## 2.1 支持程度总览
|
|
49
|
+
|
|
50
|
+
| 后端 | `/v1/chat/completions` | `/v1/responses` | 最新版 Codex | `0.57.0` 回退路径 |
|
|
51
|
+
|---|---|---|---|---|
|
|
52
|
+
| vLLM | 支持 | 支持 | 支持 | 通常不需要 |
|
|
53
|
+
| Ollama | 支持 | 取决于版本 | 只有 `/v1/responses` 正常时才支持 | 如果只有 chat,可以尝试 |
|
|
54
|
+
| SGLang | 支持 | 经常缺失或不完整 | chat-only 时不支持 | 可以尝试回退到 `0.57.0` |
|
|
55
|
+
|
|
56
|
+
## 3. 先直接测试后端
|
|
57
|
+
|
|
58
|
+
在动 DeepScientist 之前,先直接验证后端。
|
|
59
|
+
|
|
60
|
+
### 第一步:列模型
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
curl http://127.0.0.1:8004/v1/models \
|
|
64
|
+
-H "Authorization: Bearer 1234"
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
你需要从这里拿到一个真实模型名,例如:
|
|
68
|
+
|
|
69
|
+
```text
|
|
70
|
+
/model/gpt-oss-120b
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 第二步:测试 chat completions
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
curl http://127.0.0.1:8004/v1/chat/completions \
|
|
77
|
+
-H "Content-Type: application/json" \
|
|
78
|
+
-H "Authorization: Bearer 1234" \
|
|
79
|
+
-d '{
|
|
80
|
+
"model": "/model/gpt-oss-120b",
|
|
81
|
+
"messages": [
|
|
82
|
+
{ "role": "user", "content": "Reply with exactly HELLO." }
|
|
83
|
+
]
|
|
84
|
+
}'
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
如果这一步成功,说明后端至少具备 OpenAI chat-compatible 能力。
|
|
88
|
+
|
|
89
|
+
### 第三步:测试 Responses API
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
curl http://127.0.0.1:8004/v1/responses \
|
|
93
|
+
-H "Content-Type: application/json" \
|
|
94
|
+
-H "Authorization: Bearer 1234" \
|
|
95
|
+
-d '{
|
|
96
|
+
"model": "/model/gpt-oss-120b",
|
|
97
|
+
"input": "Reply with exactly HELLO."
|
|
98
|
+
}'
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
这一步才是决定性检查。
|
|
102
|
+
|
|
103
|
+
如果 `/v1/responses` 失败,最新版 Codex CLI 就不能正常使用这个后端 profile。
|
|
104
|
+
|
|
105
|
+
## 4. 我们在这台服务器上的实际观察
|
|
106
|
+
|
|
107
|
+
我们已经测试了本机的 `http://127.0.0.1:8004/v1`。
|
|
108
|
+
|
|
109
|
+
结果是:
|
|
110
|
+
|
|
111
|
+
- `GET /v1/models` 成功
|
|
112
|
+
- `POST /v1/chat/completions` 成功
|
|
113
|
+
- `POST /v1/responses` 返回 `500 Internal Server Error`
|
|
114
|
+
- `/v1/models` 返回里显示 `owned_by: "sglang"`
|
|
115
|
+
|
|
116
|
+
所以这条 `8004` 服务当前更像一个 chat-compatible 的 SGLang 风格后端,而不是一个对最新版 Codex 友好的 Responses 后端。
|
|
117
|
+
|
|
118
|
+
这意味着:
|
|
119
|
+
|
|
120
|
+
- 它可以响应原始 chat 请求
|
|
121
|
+
- 但它目前不能直接给最新版 Codex runner 使用
|
|
122
|
+
- 因而 DeepScientist 也不能通过正常 Codex 路径使用它
|
|
123
|
+
|
|
124
|
+
我们还额外做了旧版 Codex 对照测试:
|
|
125
|
+
|
|
126
|
+
- 最新版 Codex + `wire_api = "responses"`:失败
|
|
127
|
+
- Codex `0.57.0` + 顶层 `model_provider` / `model` + `wire_api = "chat"`:成功
|
|
128
|
+
|
|
129
|
+
所以对这台机器上的 `8004` 来说:
|
|
130
|
+
|
|
131
|
+
- **最新版 Codex 路径**:不通
|
|
132
|
+
- **Codex `0.57.0` 回退路径**:可行
|
|
133
|
+
|
|
134
|
+
## 5. 给本地 Responses 后端配置 Codex profile
|
|
135
|
+
|
|
136
|
+
如果你的后端真的支持 `/v1/responses`,可以写成这样:
|
|
137
|
+
|
|
138
|
+
```toml
|
|
139
|
+
[model_providers.local_vllm]
|
|
140
|
+
name = "local_vllm"
|
|
141
|
+
base_url = "http://127.0.0.1:8004/v1"
|
|
142
|
+
env_key = "LOCAL_API_KEY"
|
|
143
|
+
wire_api = "responses"
|
|
144
|
+
requires_openai_auth = false
|
|
145
|
+
|
|
146
|
+
[profiles.local_vllm]
|
|
147
|
+
model = "/model/gpt-oss-120b"
|
|
148
|
+
model_provider = "local_vllm"
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
然后先直接测试 Codex:
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
export LOCAL_API_KEY=1234
|
|
155
|
+
codex exec --profile local_vllm --json --cd /tmp --skip-git-repo-check - <<'EOF'
|
|
156
|
+
Reply with exactly HELLO.
|
|
157
|
+
EOF
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
如果这一步过不了,就先不要继续尝试 DeepScientist。
|
|
161
|
+
|
|
162
|
+
## 5.1 只支持 chat 时,回退到 Codex `0.57.0`
|
|
163
|
+
|
|
164
|
+
如果你的后端只有 `/v1/chat/completions`,可以尝试这条回退路径:
|
|
165
|
+
|
|
166
|
+
1. 安装 Codex `0.57.0`
|
|
167
|
+
2. 使用 `wire_api = "chat"`
|
|
168
|
+
3. 把 `model_provider` 和 `model` 写到顶层
|
|
169
|
+
|
|
170
|
+
示例:
|
|
171
|
+
|
|
172
|
+
```toml
|
|
173
|
+
model = "/model/gpt-oss-120b"
|
|
174
|
+
model_provider = "localchat"
|
|
175
|
+
approval_policy = "never"
|
|
176
|
+
sandbox_mode = "workspace-write"
|
|
177
|
+
|
|
178
|
+
[model_providers.localchat]
|
|
179
|
+
name = "localchat"
|
|
180
|
+
base_url = "http://127.0.0.1:8004/v1"
|
|
181
|
+
env_key = "LOCAL_API_KEY"
|
|
182
|
+
wire_api = "chat"
|
|
183
|
+
requires_openai_auth = false
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
然后直接测试:
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
export LOCAL_API_KEY=1234
|
|
190
|
+
codex exec --json --cd /tmp --skip-git-repo-check - <<'EOF'
|
|
191
|
+
Reply with exactly HELLO.
|
|
192
|
+
EOF
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
如果这条旧版 Codex 路径能通过,DeepScientist 通常也可以沿用同样的 runner binary 和 provider 思路。
|
|
196
|
+
|
|
197
|
+
## 6. Codex 成功后,再测试 DeepScientist
|
|
198
|
+
|
|
199
|
+
只有当上面的 `codex exec` 能通过时,再继续:
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
ds doctor --codex-profile local_vllm
|
|
203
|
+
ds --codex-profile local_vllm
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
这里推荐使用 `ds doctor`。
|
|
207
|
+
|
|
208
|
+
`ds docker` 只是 `ds doctor` 的历史别名,不是 Docker 部署命令。
|
|
209
|
+
|
|
210
|
+
如果你想持久化配置:
|
|
211
|
+
|
|
212
|
+
```yaml
|
|
213
|
+
codex:
|
|
214
|
+
enabled: true
|
|
215
|
+
binary: codex
|
|
216
|
+
config_dir: ~/.codex
|
|
217
|
+
profile: local_vllm
|
|
218
|
+
model: inherit
|
|
219
|
+
model_reasoning_effort: high
|
|
220
|
+
approval_policy: never
|
|
221
|
+
sandbox_mode: danger-full-access
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## 7. 后端兼容性结论
|
|
225
|
+
|
|
226
|
+
### vLLM
|
|
227
|
+
|
|
228
|
+
推荐。
|
|
229
|
+
|
|
230
|
+
满足下面三个条件时,是当前最稳妥的本地路径:
|
|
231
|
+
|
|
232
|
+
- `/v1/models` 正常
|
|
233
|
+
- `/v1/responses` 正常
|
|
234
|
+
- 模型名稳定可见
|
|
235
|
+
|
|
236
|
+
### Ollama
|
|
237
|
+
|
|
238
|
+
条件支持。
|
|
239
|
+
|
|
240
|
+
只有在下面条件满足时才建议使用:
|
|
241
|
+
|
|
242
|
+
- 当前 Ollama 版本真的暴露了 `/v1/responses`
|
|
243
|
+
- 目标模型可以通过该接口稳定工作
|
|
244
|
+
|
|
245
|
+
如果只有 chat-completions 兼容,不足以支持最新版 Codex,但仍然可以尝试 `0.57.0` 这条旧版 Codex 路径。
|
|
246
|
+
|
|
247
|
+
### SGLang
|
|
248
|
+
|
|
249
|
+
要特别小心。
|
|
250
|
+
|
|
251
|
+
如果你的 SGLang 部署表现是:
|
|
252
|
+
|
|
253
|
+
- `/v1/chat/completions` 正常
|
|
254
|
+
- `/v1/responses` 失败
|
|
255
|
+
|
|
256
|
+
那么它当前就和最新版 Codex runner 不兼容。
|
|
257
|
+
|
|
258
|
+
如果你必须使用这类后端,现实可行的 fallback 就是回退到 Codex `0.57.0` 并使用 `wire_api = "chat"`。
|
|
259
|
+
|
|
260
|
+
## 8. 如果你现在只有 chat-completions
|
|
261
|
+
|
|
262
|
+
如果你的后端只有 `/v1/chat/completions`,当前有三种现实选择:
|
|
263
|
+
|
|
264
|
+
1. 切到支持 Responses 的 vLLM
|
|
265
|
+
2. 升级到真正支持 `/v1/responses` 的 Ollama
|
|
266
|
+
3. 回退到 Codex `0.57.0` 并使用 `wire_api = "chat"`
|
|
267
|
+
4. 在后端前面加一层 Responses-compatible 代理
|
|
268
|
+
|
|
269
|
+
这里的问题本质上是 Codex CLI 的当前要求,不是 DeepScientist 单独某个配置写错了。
|
|
270
|
+
|
|
271
|
+
## 9. 推荐的实际顺序
|
|
272
|
+
|
|
273
|
+
每次都按这个顺序来:
|
|
274
|
+
|
|
275
|
+
1. 先测 `/v1/models`
|
|
276
|
+
2. 再测 `/v1/responses`
|
|
277
|
+
3. 再测 `codex exec --profile <name>`
|
|
278
|
+
4. 再测 `ds doctor --codex-profile <name>`
|
|
279
|
+
5. 最后再启动 `ds --codex-profile <name>`
|
|
280
|
+
|
|
281
|
+
如果第 2 步失败,就先停在那里。不要期待最新版 Codex 路径下的 DeepScientist 可以正常工作。
|
package/docs/zh/README.md
CHANGED
|
@@ -4,6 +4,8 @@ DeepScientist 不仅仅是一个可长期运行的自动化科学发现系统,
|
|
|
4
4
|
|
|
5
5
|
2 分钟安装,2 分钟配置微信,2 分钟启动。极快、方便、易用。
|
|
6
6
|
|
|
7
|
+
现在本地 Web 默认不启用浏览器访问密码。如果你希望某次启动启用 16 位本地访问密码,可以使用 `ds --auth true`;启用后,`ds` 会在终端里打印这次启动的密码,第一次成功进入后浏览器会持久化这次本地登录。
|
|
8
|
+
|
|
7
9
|
它也是一种工作坊式协作环境:可以长期自主推进,也允许你随时接管、协作、改代码、自己跑终端,亦或者用 Notion 式方式记录笔记、计划与协作内容。
|
|
8
10
|
|
|
9
11
|
DeepScientist 灵活且易于使用,支持:
|
|
@@ -76,10 +78,16 @@ DeepScientist 灵活且易于使用,支持:
|
|
|
76
78
|
|
|
77
79
|
- [00 快速开始](./00_QUICK_START.md)
|
|
78
80
|
从安装、启动,到创建第一个项目,先看这一篇。
|
|
81
|
+
- [20 工作区模式指南](./20_WORKSPACE_MODES_GUIDE.md)
|
|
82
|
+
如果你最纠结的是“应该选 Copilot 还是全自动”,先看这篇。
|
|
83
|
+
- [19 本地浏览器密码说明](./19_LOCAL_BROWSER_AUTH.md)
|
|
84
|
+
如果你想弄清楚密码弹窗是什么、密码去哪里看、怎样关闭这一层本地保护,先看这篇。
|
|
79
85
|
- [05 TUI 端到端指南](./05_TUI_GUIDE.md)
|
|
80
86
|
如果你主要在服务器或终端里工作,这篇会带你从 `ds --tui` 一路走到 quest、connector 和跨端协作跑通。
|
|
81
87
|
- [15 Codex Provider 配置](./15_CODEX_PROVIDER_SETUP.md)
|
|
82
|
-
如果你准备通过 MiniMax、GLM
|
|
88
|
+
如果你准备通过 MiniMax、GLM、火山方舟、阿里百炼 Coding Plan 或其他 Codex profile 来运行 DeepScientist,先看这一篇。
|
|
89
|
+
- [21 本地模型后端指南](./21_LOCAL_MODEL_BACKENDS_GUIDE.md)
|
|
90
|
+
如果你想通过 vLLM、Ollama、SGLang 等本地 OpenAI-compatible 后端运行 DeepScientist,先看这一篇。
|
|
83
91
|
- [12 引导式工作流教程](./12_GUIDED_WORKFLOW_TOUR.md)
|
|
84
92
|
按真实产品流程,逐步理解从首页到工作区应该怎么使用。
|
|
85
93
|
- [02 Start Research 参考](./02_START_RESEARCH_GUIDE.md)
|
|
@@ -89,6 +97,8 @@ DeepScientist 灵活且易于使用,支持:
|
|
|
89
97
|
|
|
90
98
|
- [02 Start Research 参考](./02_START_RESEARCH_GUIDE.md)
|
|
91
99
|
解释当前前端字段、自动推导合同字段,以及实际可照抄的例子。
|
|
100
|
+
- [20 工作区模式指南](./20_WORKSPACE_MODES_GUIDE.md)
|
|
101
|
+
如果你已经知道怎么填表,但还不确定项目应该从 Copilot 还是全自动启动,先看这篇。
|
|
92
102
|
- [01 设置参考](./01_SETTINGS_REFERENCE.md)
|
|
93
103
|
当你需要配置 runner、connector、运行时默认值或主目录路径时,看这一篇。
|
|
94
104
|
- [11 协议与风险说明](./11_LICENSE_AND_RISK.md)
|
|
@@ -119,6 +129,8 @@ DeepScientist 灵活且易于使用,支持:
|
|
|
119
129
|
说明 daemon、工作区、canvas 和 connector 视图之间的关系。
|
|
120
130
|
- [07 Memory 与 MCP](./07_MEMORY_AND_MCP.md)
|
|
121
131
|
说明 memory、artifact 和内置 MCP 的行为。
|
|
132
|
+
- [19 External Controller 指南](./19_EXTERNAL_CONTROLLER_GUIDE.md)
|
|
133
|
+
说明如何在不改 core runtime 的前提下,基于 mailbox 和 `quest_control` 构建可选的外层治理控制器。
|
|
122
134
|
|
|
123
135
|
## 如果你遇到了问题
|
|
124
136
|
|
|
@@ -126,6 +138,8 @@ DeepScientist 灵活且易于使用,支持:
|
|
|
126
138
|
启动诊断、排查常见运行问题,先看这篇。
|
|
127
139
|
- [15 Codex Provider 配置](./15_CODEX_PROVIDER_SETUP.md)
|
|
128
140
|
如果问题更像出在 Codex profile、provider endpoint、API key 或模型配置上,优先看这篇。
|
|
141
|
+
- [21 本地模型后端指南](./21_LOCAL_MODEL_BACKENDS_GUIDE.md)
|
|
142
|
+
如果问题具体出在本地 OpenAI-compatible 后端以及 `/v1/responses` 支持上,优先看这篇。
|
|
129
143
|
- [01 设置参考](./01_SETTINGS_REFERENCE.md)
|
|
130
144
|
如果问题可能和配置、凭据或 connector 有关,再查这篇。
|
|
131
145
|
|
|
@@ -134,4 +148,12 @@ DeepScientist 灵活且易于使用,支持:
|
|
|
134
148
|
- [90 Architecture](../en/90_ARCHITECTURE.md)
|
|
135
149
|
说明系统级约束、核心契约和仓库结构。
|
|
136
150
|
- [91 Development](../en/91_DEVELOPMENT.md)
|
|
137
|
-
|
|
151
|
+
面向维护者的开发工作流、实现说明,以及新增 MCP 工具、skills、connector 的具体清单。
|
|
152
|
+
|
|
153
|
+
## 社群交流
|
|
154
|
+
|
|
155
|
+
欢迎加群讨论。
|
|
156
|
+
|
|
157
|
+
<p align="center">
|
|
158
|
+
<img src="../../assets/readme/wechat4.jpg" alt="DeepScientist 微信群" width="360" />
|
|
159
|
+
</p>
|
package/install.sh
CHANGED
|
@@ -112,10 +112,6 @@ else
|
|
|
112
112
|
INSTALL_DIR="$BASE_DIR/cli"
|
|
113
113
|
fi
|
|
114
114
|
|
|
115
|
-
if [ "$DIR_SET" -eq 1 ] && [ "$BIN_DIR_SET" -eq 0 ] && [ -z "$ENV_BIN_DIR" ]; then
|
|
116
|
-
BIN_DIR="$BASE_DIR/bin"
|
|
117
|
-
fi
|
|
118
|
-
|
|
119
115
|
print_step() {
|
|
120
116
|
printf '[install] %s\n' "$1"
|
|
121
117
|
}
|
|
@@ -431,6 +427,47 @@ EOF
|
|
|
431
427
|
chmod +x "$target_path"
|
|
432
428
|
}
|
|
433
429
|
|
|
430
|
+
record_install_index() {
|
|
431
|
+
node - "$BASE_DIR" "$INSTALL_DIR" "$BIN_DIR" <<'NODE'
|
|
432
|
+
const fs = require('node:fs');
|
|
433
|
+
const os = require('node:os');
|
|
434
|
+
const path = require('node:path');
|
|
435
|
+
|
|
436
|
+
const home = path.resolve(process.argv[2] || '');
|
|
437
|
+
const installDir = path.resolve(process.argv[3] || '');
|
|
438
|
+
const binDir = path.resolve(process.argv[4] || '');
|
|
439
|
+
const indexPath = path.join(os.homedir(), '.deepscientist', 'install-index.json');
|
|
440
|
+
const wrapperPaths = ['ds', 'ds-cli', 'research', 'resear'].map((name) => path.join(binDir, name));
|
|
441
|
+
const entry = {
|
|
442
|
+
home,
|
|
443
|
+
install_mode: 'install-local',
|
|
444
|
+
install_dir: installDir,
|
|
445
|
+
package_root: installDir,
|
|
446
|
+
launcher_path: path.join(installDir, 'bin', 'ds.js'),
|
|
447
|
+
wrapper_paths: wrapperPaths,
|
|
448
|
+
updated_at: new Date().toISOString(),
|
|
449
|
+
created_at: new Date().toISOString(),
|
|
450
|
+
};
|
|
451
|
+
let installs = [];
|
|
452
|
+
try {
|
|
453
|
+
const payload = JSON.parse(fs.readFileSync(indexPath, 'utf8'));
|
|
454
|
+
installs = Array.isArray(payload?.installs) ? payload.installs : [];
|
|
455
|
+
} catch {}
|
|
456
|
+
const sameEntry = (item) =>
|
|
457
|
+
String(item?.home || '') === home
|
|
458
|
+
&& String(item?.install_dir || '') === installDir
|
|
459
|
+
&& String(item?.install_mode || '') === 'install-local';
|
|
460
|
+
const existing = installs.find((item) => sameEntry(item));
|
|
461
|
+
if (existing && existing.created_at) {
|
|
462
|
+
entry.created_at = existing.created_at;
|
|
463
|
+
}
|
|
464
|
+
installs = installs.filter((item) => !sameEntry(item));
|
|
465
|
+
installs.push(entry);
|
|
466
|
+
fs.mkdirSync(path.dirname(indexPath), { recursive: true });
|
|
467
|
+
fs.writeFileSync(indexPath, `${JSON.stringify({ installs }, null, 2)}\n`, 'utf8');
|
|
468
|
+
NODE
|
|
469
|
+
}
|
|
470
|
+
|
|
434
471
|
require_command node
|
|
435
472
|
require_command npm
|
|
436
473
|
|
|
@@ -466,6 +503,7 @@ write_global_wrapper "$BIN_DIR/ds" "ds"
|
|
|
466
503
|
write_global_wrapper "$BIN_DIR/ds-cli" "ds-cli"
|
|
467
504
|
write_global_wrapper "$BIN_DIR/research" "research"
|
|
468
505
|
write_global_wrapper "$BIN_DIR/resear" "resear"
|
|
506
|
+
record_install_index
|
|
469
507
|
|
|
470
508
|
print_step "Install complete"
|
|
471
509
|
printf 'Install dir: %s\n' "$INSTALL_DIR"
|
|
@@ -475,6 +513,10 @@ printf 'Start web workspace: %s\n' "$BIN_DIR/ds --web"
|
|
|
475
513
|
printf 'Default start: %s\n' "$BIN_DIR/ds"
|
|
476
514
|
printf 'When `ds` starts, it prints the local Web URL and opens it automatically when supported.\n'
|
|
477
515
|
printf 'If `uv` is missing, the first `ds` start will bootstrap a local copy automatically under the DeepScientist home.\n'
|
|
516
|
+
if [ "$DIR_SET" -eq 1 ] && [ "$BIN_DIR_SET" -eq 0 ] && [ -z "$ENV_BIN_DIR" ]; then
|
|
517
|
+
printf 'Custom install dir detected; launcher wrappers were still refreshed in the default global bin dir: %s\n' "$BIN_DIR"
|
|
518
|
+
printf 'If you prefer install-local wrappers instead, rerun with: --bin-dir %s/bin\n' "$BASE_DIR"
|
|
519
|
+
fi
|
|
478
520
|
if [ "$WITH_TINYTEX" -eq 1 ]; then
|
|
479
521
|
print_step "Installing TinyTeX pdflatex runtime"
|
|
480
522
|
"$INSTALL_DIR/bin/ds" latex install-runtime
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@researai/deepscientist",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.17",
|
|
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": [
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"ds": "node ./bin/ds.js",
|
|
48
48
|
"start": "node ./bin/ds.js daemon",
|
|
49
49
|
"install:local": "bash ./install.sh",
|
|
50
|
+
"preuninstall": "node ./bin/ds.js uninstall --yes --origin npm",
|
|
50
51
|
"ui:install": "npm --prefix src/ui install",
|
|
51
52
|
"ui:dev": "npm --prefix src/ui run dev",
|
|
52
53
|
"ui:build": "npm --prefix src/ui run build",
|
package/pyproject.toml
CHANGED
|
@@ -182,6 +182,8 @@ def build_session_update(
|
|
|
182
182
|
"content": event.get("text"),
|
|
183
183
|
"run_id": event.get("run_id"),
|
|
184
184
|
"skill_id": event.get("skill_id"),
|
|
185
|
+
"stream_id": event.get("stream_id"),
|
|
186
|
+
"message_id": event.get("message_id"),
|
|
185
187
|
"stream": True,
|
|
186
188
|
}
|
|
187
189
|
elif event_type == "runner.agent_message":
|
|
@@ -192,6 +194,8 @@ def build_session_update(
|
|
|
192
194
|
"content": event.get("text"),
|
|
193
195
|
"run_id": event.get("run_id"),
|
|
194
196
|
"skill_id": event.get("skill_id"),
|
|
197
|
+
"stream_id": event.get("stream_id"),
|
|
198
|
+
"message_id": event.get("message_id"),
|
|
195
199
|
"stream": False,
|
|
196
200
|
}
|
|
197
201
|
elif event_type == "runner.reasoning":
|
|
@@ -202,6 +206,8 @@ def build_session_update(
|
|
|
202
206
|
"content": event.get("text"),
|
|
203
207
|
"run_id": event.get("run_id"),
|
|
204
208
|
"skill_id": event.get("skill_id"),
|
|
209
|
+
"stream_id": event.get("stream_id"),
|
|
210
|
+
"message_id": event.get("message_id"),
|
|
205
211
|
"stream": False,
|
|
206
212
|
}
|
|
207
213
|
elif event_type == "runner.turn_start":
|