dsh-plugin-dev-kb 1.0.8 → 1.1.0
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/CHANGELOG.md +21 -0
- package/README.en.md +6 -6
- package/README.md +6 -6
- package/kb/INDEX.md +21 -5
- package/kb/README.md +11 -10
- package/kb/extra/AGENTS.md +4 -4
- package/kb/extra/cookbook/adding-a-remote-api.md +197 -0
- package/kb/extra/cookbook/adding-a-remote-api.zh.md +197 -0
- package/kb/extra/cookbook/adding-a-vendored-package.md +2 -2
- package/kb/extra/cookbook/adding-a-vendored-package.zh.md +2 -2
- package/kb/extra/deepseek-llm-api-wire-extensions.md +163 -0
- package/kb/extra/deepseek-llm-api-wire-extensions.zh.md +163 -0
- package/kb/extra/development.md +8 -14
- package/kb/extra/development.zh.md +8 -14
- package/kb/extra/event-producer-consumer.md +55 -48
- package/kb/extra/event-producer-consumer.zh.md +58 -51
- package/kb/extra/glossary.md +1 -1
- package/kb/extra/glossary.zh.md +1 -1
- package/kb/extra/graph-atlas.md +0 -2
- package/kb/extra/graph-atlas.zh.md +0 -2
- package/kb/extra/i18n/README.md +4 -4
- package/kb/extra/i18n/README.zh.md +4 -4
- package/kb/extra/i18n/style-samples.md +2 -2
- package/kb/extra/module-graph.md +646 -926
- package/kb/extra/module-graph.zh.md +648 -928
- package/kb/extra/postmortem/0001-acp-default-export-drops-inject.md +2 -2
- package/kb/extra/postmortem/0001-acp-default-export-drops-inject.zh.md +2 -2
- package/kb/extra/postmortem/0002-js-expression-disabled-filesystem-tools.md +2 -2
- package/kb/extra/postmortem/0002-js-expression-disabled-filesystem-tools.zh.md +2 -2
- package/kb/extra/postmortem/0003-web-agent-gui-feedback-loop.md +2 -2
- package/kb/extra/postmortem/0003-web-agent-gui-feedback-loop.zh.md +2 -2
- package/kb/extra/postmortem/0004-landlock-partial-notice-misclassified-child-failures.md +1 -1
- package/kb/extra/postmortem/0004-landlock-partial-notice-misclassified-child-failures.zh.md +1 -1
- package/kb/extra/rescope.md +2 -2
- package/kb/extra/rescope.zh.md +2 -2
- package/kb/extra/subsystems/agent-team.md +28 -4
- package/kb/extra/subsystems/agent-team.zh.md +28 -4
- package/kb/extra/subsystems/attachment.md +168 -7
- package/kb/extra/subsystems/attachment.zh.md +168 -7
- package/kb/extra/subsystems/extensions.md +18 -0
- package/kb/extra/subsystems/extensions.zh.md +18 -0
- package/kb/extra/subsystems/feedback.md +4 -4
- package/kb/extra/subsystems/feedback.zh.md +4 -4
- package/kb/extra/subsystems/todo.md +32 -0
- package/kb/extra/subsystems/todo.zh.md +32 -0
- package/kb/extra/subsystems/webhook.md +70 -0
- package/kb/extra/subsystems/webhook.zh.md +70 -0
- package/kb/extra/testing.md +15 -10
- package/kb/extra/testing.zh.md +13 -8
- package/kb/extra/web-styling.md +4 -0
- package/kb/extra/web-styling.zh.md +4 -0
- package/kb/meta/search-index.json +309 -177
- package/kb/meta/site-pages.txt +183 -167
- package/kb/meta/source.json +5 -5
- package/kb/meta/topics.md +14 -6
- package/kb/site/develop/basic/publish.md +2 -2
- package/kb/site/develop/basic/tool.md +1 -1
- package/kb/site/develop/cordis-tutorial/07-into-the-harness.md +5 -4
- package/kb/site/develop/framework/events.md +1 -1
- package/kb/site/develop/practice/dynamic-cordis.md +17 -0
- package/kb/site/develop/practice/llm-adapter.md +4 -3
- package/kb/site/en/develop/basic/publish.md +2 -2
- package/kb/site/en/develop/basic/tool.md +1 -1
- package/kb/site/en/develop/cordis-tutorial/07-into-the-harness.md +5 -4
- package/kb/site/en/develop/framework/events.md +1 -1
- package/kb/site/en/develop/practice/dynamic-cordis.md +17 -0
- package/kb/site/en/develop/practice/llm-adapter.md +4 -3
- package/kb/site/en/guide/github-review.md +104 -0
- package/kb/site/en/guide/mcp-memory.md +103 -0
- package/kb/site/en/guide/network-proxy.md +87 -0
- package/kb/site/en/guide/providers.md +70 -17
- package/kb/site/en/guide/python-sdk.md +80 -34
- package/kb/site/en/guide/schedule.md +23 -0
- package/kb/site/en/reference/agent-lifecycle.md +6 -4
- package/kb/{extra → site/en/reference}/api-gateway.md +12 -10
- package/kb/site/en/reference/capability-seams.md +128 -73
- package/kb/site/en/reference/config-catalog.md +481 -360
- package/kb/site/en/reference/cookbook/adding-a-package.md +3 -4
- package/kb/site/en/reference/cookbook/adding-a-settings-card.md +12 -10
- package/kb/site/en/reference/cookbook/adding-a-tool.md +11 -4
- package/kb/site/en/reference/cookbook/adding-an-llm-adapter.md +1 -1
- package/kb/site/en/reference/cookbook/extension-cookbook.md +20 -17
- package/kb/site/en/reference/cordis-api/inherited.md +1 -1
- package/kb/site/en/reference/cordis-primer.md +2 -1
- package/kb/site/en/reference/index.md +30 -11
- package/kb/site/en/reference/persistence-catalog.md +148 -80
- package/kb/site/en/reference/subsystems/approval.md +10 -10
- package/kb/site/en/reference/subsystems/client-modules.md +58 -16
- package/kb/site/en/reference/subsystems/code-runtime.md +10 -6
- package/kb/site/en/reference/subsystems/commands.md +25 -16
- package/kb/site/en/reference/subsystems/compaction.md +11 -11
- package/kb/site/en/reference/{cookbook/adding-a-conversation-node.md → subsystems/conversation.md} +50 -24
- package/kb/site/en/reference/subsystems/core.md +156 -17
- package/kb/site/en/reference/subsystems/credentials.md +44 -3
- package/kb/site/en/reference/subsystems/filesystem.md +12 -2
- package/kb/site/en/reference/subsystems/goal.md +1 -1
- package/kb/site/en/reference/subsystems/index.md +7 -2
- package/kb/site/en/reference/subsystems/jobs.md +1 -1
- package/kb/site/en/reference/subsystems/llm-streaming.md +154 -12
- package/kb/site/en/reference/subsystems/permission-presets.md +6 -6
- package/kb/site/en/reference/subsystems/persistence.md +185 -175
- package/kb/site/en/reference/subsystems/plan.md +2 -2
- package/kb/site/en/reference/subsystems/sandbox.md +2 -0
- package/kb/site/en/reference/subsystems/schedule.md +9 -3
- package/kb/site/en/reference/subsystems/session-projection.md +115 -48
- package/kb/site/en/reference/subsystems/session-query.md +28 -14
- package/kb/site/en/reference/subsystems/session-reference.md +53 -8
- package/kb/site/en/reference/subsystems/session-telemetry.md +8 -8
- package/kb/site/en/reference/subsystems/session-title.md +6 -6
- package/kb/site/en/reference/subsystems/session.md +401 -99
- package/kb/site/en/reference/subsystems/settings.md +101 -6
- package/kb/site/en/reference/subsystems/skills.md +23 -0
- package/kb/site/en/reference/subsystems/slots.md +178 -0
- package/kb/site/en/reference/subsystems/spill.md +2 -2
- package/kb/site/en/reference/subsystems/storage.md +34 -3
- package/kb/site/en/reference/subsystems/subagent.md +122 -109
- package/kb/site/en/reference/subsystems/system-prompt.md +17 -4
- package/kb/site/en/reference/subsystems/token-meter.md +27 -12
- package/kb/site/en/reference/subsystems/tools.md +39 -39
- package/kb/site/en/reference/subsystems/typert.md +62 -55
- package/kb/site/en/reference/subsystems/user-questions.md +33 -33
- package/kb/site/en/reference/subsystems/web-client.md +98 -0
- package/kb/site/en/reference/subsystems/web-server.md +11 -5
- package/kb/site/en/reference/subsystems/web.md +7 -1
- package/kb/site/en/reference/subsystems/workspace.md +102 -9
- package/kb/site/en/reference/tool-catalog.md +86 -82
- package/kb/site/en/reference/tool-execution-pipeline.md +1 -1
- package/kb/site/guide/github-review.md +104 -0
- package/kb/site/guide/mcp-memory.md +103 -0
- package/kb/site/guide/network-proxy.md +87 -0
- package/kb/site/guide/providers.md +70 -17
- package/kb/site/guide/python-sdk.md +87 -41
- package/kb/site/guide/schedule.md +23 -0
- package/kb/site/reference/agent-lifecycle.md +6 -4
- package/kb/{extra/api-gateway.zh.md → site/reference/api-gateway.md} +12 -10
- package/kb/site/reference/capability-seams.md +128 -73
- package/kb/site/reference/config-catalog.md +481 -360
- package/kb/site/reference/cookbook/adding-a-package.md +3 -4
- package/kb/site/reference/cookbook/adding-a-settings-card.md +12 -10
- package/kb/site/reference/cookbook/adding-a-tool.md +11 -4
- package/kb/site/reference/cookbook/adding-an-llm-adapter.md +1 -1
- package/kb/site/reference/cookbook/extension-cookbook.md +20 -17
- package/kb/site/reference/cordis-api/inherited.md +1 -1
- package/kb/site/reference/cordis-primer.md +2 -1
- package/kb/site/reference/index.md +30 -11
- package/kb/site/reference/persistence-catalog.md +148 -80
- package/kb/site/reference/subsystems/approval.md +10 -10
- package/kb/site/reference/subsystems/client-modules.md +58 -16
- package/kb/site/reference/subsystems/code-runtime.md +10 -6
- package/kb/site/reference/subsystems/commands.md +25 -16
- package/kb/site/reference/subsystems/compaction.md +11 -11
- package/kb/site/reference/{cookbook/adding-a-conversation-node.md → subsystems/conversation.md} +50 -24
- package/kb/site/reference/subsystems/core.md +156 -17
- package/kb/site/reference/subsystems/credentials.md +44 -3
- package/kb/site/reference/subsystems/filesystem.md +12 -2
- package/kb/site/reference/subsystems/goal.md +1 -1
- package/kb/site/reference/subsystems/index.md +7 -2
- package/kb/site/reference/subsystems/jobs.md +1 -1
- package/kb/site/reference/subsystems/llm-streaming.md +154 -12
- package/kb/site/reference/subsystems/permission-presets.md +5 -5
- package/kb/site/reference/subsystems/persistence.md +184 -174
- package/kb/site/reference/subsystems/plan.md +2 -2
- package/kb/site/reference/subsystems/schedule.md +9 -3
- package/kb/site/reference/subsystems/session-projection.md +115 -48
- package/kb/site/reference/subsystems/session-query.md +28 -14
- package/kb/site/reference/subsystems/session-reference.md +53 -8
- package/kb/site/reference/subsystems/session-telemetry.md +8 -8
- package/kb/site/reference/subsystems/session-title.md +6 -6
- package/kb/site/reference/subsystems/session.md +401 -99
- package/kb/site/reference/subsystems/settings.md +101 -6
- package/kb/site/reference/subsystems/skills.md +23 -0
- package/kb/site/reference/subsystems/slots.md +178 -0
- package/kb/site/reference/subsystems/spill.md +2 -2
- package/kb/site/reference/subsystems/storage.md +34 -3
- package/kb/site/reference/subsystems/subagent.md +122 -109
- package/kb/site/reference/subsystems/system-prompt.md +17 -4
- package/kb/site/reference/subsystems/token-meter.md +27 -12
- package/kb/site/reference/subsystems/tools.md +39 -39
- package/kb/site/reference/subsystems/typert.md +62 -55
- package/kb/site/reference/subsystems/user-questions.md +33 -33
- package/kb/site/reference/subsystems/web-client.md +98 -0
- package/kb/site/reference/subsystems/web-server.md +11 -5
- package/kb/site/reference/subsystems/web.md +7 -1
- package/kb/site/reference/subsystems/workspace.md +102 -9
- package/kb/site/reference/tool-catalog.md +85 -81
- package/kb/site/reference/tool-execution-pipeline.md +1 -1
- package/package.json +2 -2
- package/skills/dsh-plugin-dev-kb.md +8 -6
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
editSource: "docs/user/guide/mcp-memory.zh.md"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# 连接第三方记忆 MCP 服务
|
|
6
|
+
|
|
7
|
+
这三份**默认关闭的参考配置**通过 [`@deepseek-ai/dsh-mcp-client`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/mcp/mcp-client/README.zh.md) 将一个记忆系统连接到 DSH。请选择其中一份,或复制相同的通用 MCP 配置项来连接其他服务器。
|
|
8
|
+
|
|
9
|
+
这些第三方配置仅作为互操作参考;收录不代表 DeepSeek 的认可、推荐、合作关系或持续支持承诺。
|
|
10
|
+
|
|
11
|
+
## DSH 负责什么
|
|
12
|
+
|
|
13
|
+
DSH 解析选中的 Cordis overlay,启动已配置的 stdio 命令或连接已配置的 Streamable HTTP URL,发现 MCP 工具,并以 `mcp__<serverName>__<tool>` 的形式公开这些工具。DSH **不负责** 下载服务器、初始化其数据库、选择模型或 embedding 提供方、创建云端账户、迁移提供方数据,也不监管独立的 HTTP 服务。对于 stdio,通用客户端会随 DSH 插件生命周期启动和停止子进程;对于 HTTP,上游服务必须已经运行。
|
|
14
|
+
|
|
15
|
+
stdio 桥接器在启动子进程前会主动移除环境中名称通常表示凭据的变量和所有 `DSH_*` 变量;其余环境变量仍会继承。每份示例仅添加其基线所需的覆盖项。如果某个可选的上游功能还需要其他密钥,请将该变量添加到配置项的 `config.env`,不要把密钥直接写进 YAML。
|
|
16
|
+
|
|
17
|
+
## 选择一个
|
|
18
|
+
|
|
19
|
+
| 系统 | 已测试版本 | 传输方式 | 上游前置条件 |
|
|
20
|
+
|---|---:|---|---|
|
|
21
|
+
| [Memorix](https://github.com/AVIDS2/memorix) | `memorix@1.3.0`(`500792cad3144142293bfbb20acb4841c9f7fcfa`) | stdio | Node 22.18+,并执行 `npm install --global memorix@1.3.0` |
|
|
22
|
+
| [MCP Reference Memory](https://github.com/modelcontextprotocol/servers/tree/main/src/memory) | `@modelcontextprotocol/server-memory@2026.7.4`(`6dd0a683e198783e30feabf7abaf42f925bd18b1`) | stdio | `npm install --global @modelcontextprotocol/server-memory@2026.7.4` |
|
|
23
|
+
| [Engram](https://github.com/Gentleman-Programming/engram) | `v1.20.0`(`ba9e46ced152c37a7cb9e576153c41995873e2fc`) | stdio | Go 1.25.10+,并执行 `go install github.com/Gentleman-Programming/engram/cmd/engram@v1.20.0`,或安装匹配的发布版二进制文件 |
|
|
24
|
+
|
|
25
|
+
## 启用一个
|
|
26
|
+
|
|
27
|
+
将一份 overlay 传给 DSH:
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
dsh web --patch "$PWD/apps/cli/config/examples/mcp-memory/memorix.cordis.yml"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
请将文件名替换为 `mcp-reference-memory.cordis.yml` 或 `engram.cordis.yml`。该路径可以指向磁盘任意位置的一份复制文件。交付组合不包含任何记忆服务器,因此不传 `--patch` 就会让这三项全部保持关闭。
|
|
34
|
+
|
|
35
|
+
如果要跨次运行保留所选配置,请将对应文件中的单个 `insert` patch 合并到用户 patch 层:只对一个 profile 生效则写入 `$DSH_HOME/profiles/<name>/cordis.patch.yml`,对本机所有 profile 生效则写入 `$DSH_HOME/cordis.patch.yml`。不要覆盖已有文件,其中可能已经包含无关的用户 patch。
|
|
36
|
+
|
|
37
|
+
## 提供方设置
|
|
38
|
+
|
|
39
|
+
### Memorix
|
|
40
|
+
|
|
41
|
+
```sh
|
|
42
|
+
npm install --global memorix@1.3.0
|
|
43
|
+
dsh web --patch "$PWD/apps/cli/config/examples/mcp-memory/memorix.cordis.yml"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Memorix 无需 LLM(大语言模型)或 embedding 服务,即可在本地启发式模式下运行。请在 Memorix 自己的 `~/.memorix/config.toml` 或项目 `memorix.toml` 中配置可选提供方。该示例沿用 DSH 工作目录中的 Git 项目标识,并使用 Memorix 自身的默认目录 `~/.memorix/data`。若要覆盖该目录,请在启动 DSH 前设置 `MEMORIX_DATA_DIR`。
|
|
47
|
+
|
|
48
|
+
### MCP Reference Memory
|
|
49
|
+
|
|
50
|
+
```sh
|
|
51
|
+
npm install --global @modelcontextprotocol/server-memory@2026.7.4
|
|
52
|
+
dsh web --patch "$PWD/apps/cli/config/examples/mcp-memory/mcp-reference-memory.cordis.yml"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
该参考服务器存储本地知识图谱,并公开实体、关系、观察、读取、搜索和打开工具。它不需要模型或 embedding 服务。该示例将 JSONL 存储在 `$HOME/.dsh-mcp-reference-memory.jsonl`,而不是已安装的 npm 包目录中。若要覆盖该路径,请在启动 DSH 前设置 `MEMORY_FILE_PATH`。
|
|
56
|
+
|
|
57
|
+
搜索只对实体名称、类型和观察进行不区分大小写的子字符串匹配,不是语义检索。该服务器不提供 embedding、自动摘要、冲突消解或遗忘策略。
|
|
58
|
+
|
|
59
|
+
### Engram
|
|
60
|
+
|
|
61
|
+
```sh
|
|
62
|
+
go install github.com/Gentleman-Programming/engram/cmd/engram@v1.20.0
|
|
63
|
+
dsh web --patch "$PWD/apps/cli/config/examples/mcp-memory/engram.cordis.yml"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Engram 负责存储和项目选择:它默认使用 `~/.engram`,从 DSH 工作目录检测 Git 项目,并接受 `ENGRAM_DATA_DIR` 或 `ENGRAM_PROJECT` 作为环境覆盖项。
|
|
67
|
+
|
|
68
|
+
## 可选的共用模型指令
|
|
69
|
+
|
|
70
|
+
如果服务器的工具描述无法可靠触发记忆使用,请将以下简短、与提供方无关的指令添加到你现有的模型指令中:
|
|
71
|
+
|
|
72
|
+
> 用户要求记住某事时调用记忆写入工具;历史信息可能相关时,检索记忆并使用相关结果。
|
|
73
|
+
|
|
74
|
+
这只是附加指导。示例不会替换 DSH 系统提示词中的 persona。
|
|
75
|
+
|
|
76
|
+
## 验证写入、新会话召回和使用
|
|
77
|
+
|
|
78
|
+
请在整个过程中使用一个唯一值,并保持提供方的存储范围不变:
|
|
79
|
+
|
|
80
|
+
1. 在 DSH 会话 A 中提出:`Remember that my validation drink is lapsang-<unique suffix>.`。确认模型调用了提供方的写入工具,并且工具返回成功。
|
|
81
|
+
2. 在同一个仍在运行的 Host 中创建 DSH 会话 B。不要复制会话 A 的对话。提出:`What is my validation drink? Check memory.`。确认模型调用了提供方的搜索或召回工具,并返回该值。
|
|
82
|
+
3. 继续在会话 B 中提出:`Use that preference to suggest one drink for the meeting.`。确认回答使用了召回的值。
|
|
83
|
+
|
|
84
|
+
必须新建 DSH 会话,但不需要重启 Host。MCP 子进程崩溃后会触发带退避的自动重连与工具重新同步;停机期间工具仍保持列出,调用只在停机期间失败;重连预算耗尽后工具会被注销,重连停止,直到重新加载或重启。初始发现过程是异步的,因此发送第一条验证提示词前,请等待提供方的 `mcp__...` 工具出现。
|
|
85
|
+
|
|
86
|
+
## 接入其他 MCP 服务器
|
|
87
|
+
|
|
88
|
+
复制相同的条目字段,并使用唯一的 `id` 和 `serverName`:
|
|
89
|
+
|
|
90
|
+
```yaml
|
|
91
|
+
- insert:
|
|
92
|
+
- id: memory-my-server
|
|
93
|
+
name: '@deepseek-ai/dsh-mcp-client'
|
|
94
|
+
config:
|
|
95
|
+
serverName: my-memory
|
|
96
|
+
transport: stdio
|
|
97
|
+
command: my-memory-mcp
|
|
98
|
+
args: []
|
|
99
|
+
env: {}
|
|
100
|
+
cwd: !!js process.cwd()
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
对于远程服务器,请改用 `transport: streamable-http`、`url` 和 `headers`。提供方专属的安装、身份、认证、模型、embedding、持久化和许可仍由提供方负责。
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
editSource: "docs/user/guide/network-proxy.zh.md"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# 在网络代理后面运行 DSH
|
|
6
|
+
|
|
7
|
+
DSH 会把自身的出站请求——模型调用、web 搜索、页面抓取、走 HTTP 的 MCP 服务器——都经由标准代理环境变量所指定的代理发出。它在启动时读取这些变量,不需要其他配置。有几条路径出于设计或运行时限制保持直连,下文"哪些保持直连"一节列出了它们。
|
|
8
|
+
|
|
9
|
+
## 导出环境变量
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
export HTTPS_PROXY=http://127.0.0.1:7890
|
|
13
|
+
export HTTP_PROXY=http://127.0.0.1:7890
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
把这两行写进 shell 配置,这样每次调用 `dsh` 都会继承它们;也可以写进 `$DSH_HOME/.env`(默认 `~/.dsh/.env`),和 API key 放在一起;导出的环境变量始终优先于该文件。项目自己的 `.env` 不能设置它们:它随 `git clone` 一起到来,DSH 宁可拒绝启动,也不让一个仓库决定你的流量去向。
|
|
17
|
+
|
|
18
|
+
需要凭据的代理把凭据写在 URL 里:`http://user:password@proxy.example:8080`。DSH 绝不会回显这个 URL:诊断只点名被拒绝的变量,因此用户名和密码都不会出现在任何地方。
|
|
19
|
+
|
|
20
|
+
## 为什么浏览器走代理、终端却不走
|
|
21
|
+
|
|
22
|
+
这是最常见的意外,而且并非 DSH 特有。**根本不存在一个所有软件都遵循的"系统代理"**——实际上有三套互不相干的机制:
|
|
23
|
+
|
|
24
|
+
| 机制 | 谁会遵循 |
|
|
25
|
+
|---|---|
|
|
26
|
+
| 操作系统的代理设置 | Safari、绝大多数 macOS 原生应用、Chrome 与 Edge |
|
|
27
|
+
| `HTTP_PROXY` / `HTTPS_PROXY` 环境变量 | `curl`、`git`、`npm`、`pip` 以及 DSH |
|
|
28
|
+
| TUN 模式(虚拟网卡) | 所有程序,且对应用透明 |
|
|
29
|
+
|
|
30
|
+
Clash 这类代理软件里的"系统代理"开关只写第一套。浏览器会读到它,命令行工具则永远看不到。这就是为什么导出环境变量是一个独立步骤,也是为什么打开 TUN 模式后两者都能工作、且完全不需要变量。
|
|
31
|
+
|
|
32
|
+
DSH 不读取操作系统的代理设置。请导出环境变量,或使用 TUN 模式。
|
|
33
|
+
|
|
34
|
+
## 指定哪些目标保持直连
|
|
35
|
+
|
|
36
|
+
`NO_PROXY` 列出需要直连的主机:
|
|
37
|
+
|
|
38
|
+
```sh
|
|
39
|
+
export NO_PROXY=internal.example.com,.corp.example.com,registry.local
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
一个条目写的是主机名,它连同其下所有子域名一起匹配:`NO_PROXY=example.com` 也会让 `api.example.com` 直连。前缀 `.` 或 `*.` 可以写,含义相同。条目可带 `:port`,`*` 则放行全部。
|
|
43
|
+
|
|
44
|
+
**CIDR 网段不生效。** 操作系统的绕过列表常含 `10.0.0.0/8` 或 `192.168.0.0/16` 这类条目;把它们复制进 `NO_PROXY` 不会有任何效果。请改用主机名或域名后缀。
|
|
45
|
+
|
|
46
|
+
不需要列出 `localhost` 或 `127.0.0.1`。DSH 始终绕过 loopback,否则它自己的 Web UI 与本地服务器都会经由代理并形成回环。
|
|
47
|
+
|
|
48
|
+
## 值得知道的限制
|
|
49
|
+
|
|
50
|
+
**不支持 SOCKS 代理。** `socks5://` 形式的值会在启动时被报告并跳过,指定它的那个 scheme 转为直连——把 `HTTPS_PROXY=socks5://…` 与一个可用的 `HTTP_PROXY` 一起设置时,`https:` 会保持直连,而不会去借用 HTTP 代理。请把变量指向代理软件的 HTTP 端口——多数软件两者都提供,且 HTTP 端口通常就在相邻的端口号上。
|
|
51
|
+
|
|
52
|
+
**只设 `ALL_PROXY` 也够用。** DSH 会用它为两种协议兜底,尽管 Node 与 curl 在这一点上并不一致。显式设置 `HTTPS_PROXY` 仍然更清楚。
|
|
53
|
+
|
|
54
|
+
**做 TLS 拦截的企业代理需要它的证书。** 如果代理已经可达但请求仍报证书错误,请在启动前把 Node 指向你所在组织的 CA 包:
|
|
55
|
+
|
|
56
|
+
```sh
|
|
57
|
+
export NODE_EXTRA_CA_CERTS=/path/to/corporate-ca.pem
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Node 只在进程启动时读取该变量,所以要在运行 `dsh` 之前导出。
|
|
61
|
+
|
|
62
|
+
**DSH 替你运行的工具遵循同一个代理。** bash 工具里的命令、`git`、`gh`,以及作为子进程启动的 MCP 服务器都会继承这些变量。子进程若本身是 Node 程序,则需 Node 22.21 或更高版本才会遵循;更旧的 Node 会直连。如果你的某个代理变量是 DSH 拒绝的值——比如 SOCKS URL——基于 Node 的工具同样直连而不是起不来,`curl` 与 `git` 则仍会读取那个值。
|
|
63
|
+
|
|
64
|
+
**代理 URL 里的密码同样会到达这些工具。** `HTTPS_PROXY=http://alice:s3cret@proxy.example:8080` 就是一个普通环境变量,因此 DSH 运行的每一条命令——包括模型编写的那些——都能读到它,而打印环境的命令会把密码写进被保留的输出。这与该变量在你 shell 里对其他一切程序的行为一致。若这一点重要,请为代理提供一个无需凭据的入口,或改用 URL 之外的方式认证。
|
|
65
|
+
|
|
66
|
+
## 哪些保持直连
|
|
67
|
+
|
|
68
|
+
并非 DSH 发出的每个请求都会走代理:
|
|
69
|
+
|
|
70
|
+
- **本机上的一切。** loopback 始终直连:`localhost`、整个 `127.0.0.0/8` 段、`::1` 与 `0.0.0.0`。代理无法有意义地访问一个只在本地监听的服务。
|
|
71
|
+
- **模型编写的代码。** workflow 与 code-runtime worker 从不接收代理配置,因此模型编写的脚本读不到可能携带密码的代理 URL。这类脚本只有自行配置才能联网。
|
|
72
|
+
- **使用情况遥测。** OTLP 导出器用的是 Node 自带的 HTTP 客户端,而不是代理所配置的那个,因此遥测直连;在禁止直连出网的环境里它只会失败。DSH 的任何功能都不依赖它。设 `DSH_TELEMETRY_MODE=DISABLED` 可完全关闭。
|
|
73
|
+
- **`web_fetch` 访问字面量私网地址。** 形如 `http://10.0.0.5/` 的 URL 会被拒绝而非交给代理,与未配置代理时得到的拒绝相同。
|
|
74
|
+
|
|
75
|
+
## 验证是否生效
|
|
76
|
+
|
|
77
|
+
让 agent 抓取一个页面,同时观察代理软件的连接日志:
|
|
78
|
+
|
|
79
|
+
```sh
|
|
80
|
+
dsh --profile headless "fetch https://example.com and tell me the page title"
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
如果请求没有出现在那里,确认变量确实进入了 DSH 自己的环境:
|
|
84
|
+
|
|
85
|
+
```sh
|
|
86
|
+
env | grep -i proxy
|
|
87
|
+
```
|
|
@@ -14,21 +14,39 @@ editSource: "docs/user/guide/providers.zh.md"
|
|
|
14
14
|
|
|
15
15
|
密钥是只写的。保存后,页面只会收到脱敏描述符,永远不会收到明文密钥。密钥存储在 `$DSH_HOME/.credentials.yaml` 中,settings 只保留它的凭据引用。
|
|
16
16
|
|
|
17
|
-
##
|
|
17
|
+
## 添加内置提供方
|
|
18
18
|
|
|
19
|
-
选择**添加提供方**,选取
|
|
19
|
+
选择**添加提供方**,选取 dsh 自带的提供方;列表显示的是提供方 id,例如 `anthropic`、`openai`、Kimi 对应的 `moonshotai`、GLM 对应的 `zai`。输入其 API 密钥并保存。已安装目录会提供端点、协议和模型列表。
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
通过 OAuth 登录的提供方(例如 Codex)暂不支持。
|
|
22
22
|
|
|
23
23
|
## 添加自定义提供方
|
|
24
24
|
|
|
25
|
-
对于公司网关、自建服务器或已安装目录中不存在的提供方,选择**添加自定义提供方**。提供小写 Provider ID、基础 URL、API
|
|
25
|
+
对于公司网关、自建服务器或已安装目录中不存在的提供方,选择**添加自定义提供方**。提供小写 Provider ID、基础 URL、API 协议、凭据和至少一个模型。**API 协议**必须选网关实际使用的那一种,表单提供三种:`openai-completions` 对应 OpenAI Chat Completions,`openai-responses` 对应 OpenAI Responses API,`anthropic-messages` 对应 Anthropic Messages API。一个提供方只使用一种协议,网关同时提供两种时需要建两个提供方。
|
|
26
26
|
|
|
27
27
|

|
|
28
28
|
|
|
29
29
|
Provider ID 是永久的,因为请求、已保存会话、模型默认值和凭据引用都会使用它。如需重命名提供方,请添加新提供方并删除旧提供方。显示名称、基础 URL、协议、凭据和模型仍可编辑。
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
### 探测模型
|
|
32
|
+
|
|
33
|
+
在**模型目录**中选择**获取可用模型**,即可询问端点它提供哪些模型。请求使用表单当前的 API 地址、协议和密钥,已保存的提供方则用已存储的密钥;响应会打开一个可搜索的选择框,搜索、勾选想要的模型,再点**添加所选**。保存或创建提供方之前不会存储任何内容。
|
|
34
|
+
|
|
35
|
+
探测读取的是常见网关公开的列表格式,但并非每个端点都用这些格式作答,所以它只是便利手段而非保证:探测失败或列表为空时,手动添加模型 ID 即可,效果完全一样。内置提供方一律由已安装目录作答,即使其 API 地址指向网关也是如此,要查看网关实际提供的模型,请通过自定义提供方探测。
|
|
36
|
+
|
|
37
|
+
## 选择模型
|
|
38
|
+
|
|
39
|
+
已配置的提供方会出现在模型选择器中。选择模型也会将其设为新会话的默认值。已发送过请求的会话会保留自身日志中记录的模型。
|
|
40
|
+
|
|
41
|
+
如果已保存默认值指向已删除的提供方,输入框会显示**选择模型**,并在选择其他模型前阻止输入。
|
|
42
|
+
|
|
43
|
+
## 进阶配置
|
|
44
|
+
|
|
45
|
+
自动生成的[插件配置目录](../reference/config-catalog.md)列出每个插件的所有受支持字段与默认值;[`dsh-llm-pi-ai`](../reference/config-catalog.md#deepseek-aidsh-llm-pi-ai) 就是本页所配置的那个提供方段落。[`dsh-llm-pi-ai`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/llm-pi-ai/README.zh.md) 和 [`dsh-llm-deepseek`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/llm-deepseek/README.zh.md) 参考文档负责直接 `settings.yaml` 配置、目录解析、推理控制、凭据与适配器错误。
|
|
46
|
+
|
|
47
|
+
::: tip 表单刻意保持精简
|
|
48
|
+
模型页只开放让一条路由得以存在的字段:API 密钥、显示名称、API 地址、API 协议,以及每个模型的 ID、显示名称、上下文窗口和最大输出 token 数。其余所有字段——推理等级、图片输入、请求兼容性开关、请求头、超时、重试策略——都在 `$DSH_HOME/settings.yaml` 中设置,也就是模型页写入的同一份文档。可以直接编辑它;浏览器与服务器在同一台机器时,也可以点击设置页顶部的**打开配置文件**打开它。适配器会在下一次请求时重新读取,无需重启任何东西。下面各小节介绍多数网关会用到的字段。
|
|
49
|
+
:::
|
|
32
50
|
|
|
33
51
|
### 图片输入
|
|
34
52
|
|
|
@@ -66,7 +84,7 @@ llm-pi-ai:
|
|
|
66
84
|
- id: second-model
|
|
67
85
|
```
|
|
68
86
|
|
|
69
|
-
`defaultInput` 是回退值而不是覆盖值,默认为 `[text]
|
|
87
|
+
`defaultInput` 是回退值而不是覆盖值,默认为 `[text]`:在内置提供方上,它只为其目录未描述的模型作答,因此绝不会把目录中本就具备图片能力的模型的该能力去掉。要收窄这类模型,请用它自己的 `input`。内置提供方没有可供填写的 `models` 列表,因此写在 `modelOverrides` 下,以模型 id 为键:
|
|
70
88
|
|
|
71
89
|
```yaml
|
|
72
90
|
llm-pi-ai:
|
|
@@ -81,6 +99,48 @@ llm-pi-ai:
|
|
|
81
99
|
|
|
82
100
|
这两个字段都是对你端点的断言,而不是对它的检查。声明了端点并不提供的图片能力的模型不会在这里被拦下,改由提供方拒绝该请求。
|
|
83
101
|
|
|
102
|
+
### 推理等级
|
|
103
|
+
|
|
104
|
+
对于声明了推理等级的模型,模型选择器会提供**推理等级**菜单。内置提供方的模型从已安装目录继承其等级。手动录入的模型不声明任何等级,因此模型菜单里不会出现推理等级项,由端点自身的默认值决定模型是否思考。请在 `$DSH_HOME/settings.yaml` 中用 `reasoningEfforts` 声明等级:
|
|
105
|
+
|
|
106
|
+
```yaml
|
|
107
|
+
llm-pi-ai:
|
|
108
|
+
providers:
|
|
109
|
+
my-gateway:
|
|
110
|
+
apiKeyEnv: GATEWAY_API_KEY
|
|
111
|
+
api: openai-completions
|
|
112
|
+
baseURL: https://gateway.example/v1
|
|
113
|
+
reasoning: high
|
|
114
|
+
models:
|
|
115
|
+
- id: my-reasoner
|
|
116
|
+
reasoningEfforts:
|
|
117
|
+
off:
|
|
118
|
+
high: high
|
|
119
|
+
max: max
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
每个键都是菜单提供的一个等级,其值是在协议上以 `reasoning_effort` 发送的写法,因此 `max: xhigh` 可以为自有一套词汇的网关重命名某个等级。只有 `off` 可以留空,因为对多数端点来说,不思考就是不传该参数。路由的 `reasoning` 是会话尚未选择等级时采用的等级;在选择器中选定某个等级后,它会与模型一起保存为新会话的默认值。
|
|
123
|
+
|
|
124
|
+
留空的 `off` 什么都不发送,这只能让「按请求才思考」的模型停下来;给 `off` 一个值,则会把该值作为 `reasoning_effort` 发送。对于「不明确关闭就会思考」的模型——例如 OpenAI 兼容网关后面的 DeepSeek V4——需要 `compat.thinkingFormat: deepseek`:它让 `off` 发送 `thinking: {type: disabled}`,其他每个等级则在 effort 之外再发送 `thinking: {type: enabled}`:
|
|
125
|
+
|
|
126
|
+
```yaml
|
|
127
|
+
models:
|
|
128
|
+
- id: deepseek-v4-pro
|
|
129
|
+
compat:
|
|
130
|
+
thinkingFormat: deepseek
|
|
131
|
+
reasoningEfforts:
|
|
132
|
+
off:
|
|
133
|
+
high: high
|
|
134
|
+
max: max
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
网关并不提供推理能力的内置提供方模型,可在 `modelOverrides` 下用 `reasoningEfforts: false` 去掉其等级;之后再为它选择等级会被拒绝并报 `UNSUPPORTED_REASONING_EFFORT`。DeepSeek 自身的路由不需要以上任何配置:其模型已经提供 `off`、`low`、`high` 和 `max`,`llm-deepseek.reasoningEffort` 设置选择器的起始默认值:
|
|
138
|
+
|
|
139
|
+
```yaml
|
|
140
|
+
llm-deepseek:
|
|
141
|
+
reasoningEffort: max
|
|
142
|
+
```
|
|
143
|
+
|
|
84
144
|
### 请求兼容性
|
|
85
145
|
|
|
86
146
|
网关可能持有可用的密钥、地址也通得到,却仍然拒绝每一个请求。pi-ai 依据端点的 URL 决定请求的形状——系统提示词由哪个角色承载、输出上限写在哪个字段、思考级别如何传输——而对于它无法识别的地址,会当作 OpenAI 本身来对待。多数 OpenAI 兼容网关至少会拒绝 OpenAI 所接受的某一样东西。
|
|
@@ -117,23 +177,16 @@ llm-pi-ai:
|
|
|
117
177
|
|
|
118
178
|
全部开关、各自接受的取值,以及接受它们的协议,都列在[生成的 `dsh-llm-pi-ai` 配置参考](../reference/config-catalog.md#deepseek-aidsh-llm-pi-ai)的 `PiAiCompatProfile` 之下——该参考派生自源码,因此不会落后于适配器实际接受的内容。
|
|
119
179
|
|
|
120
|
-
## 选择模型
|
|
121
|
-
|
|
122
|
-
已配置的提供方会出现在模型选择器中。选择模型也会将其设为新会话的默认值。已发送过请求的会话会保留自身日志中记录的模型。
|
|
123
|
-
|
|
124
|
-
如果已保存默认值指向已删除的提供方,输入框会显示**选择模型**,并在选择其他模型前阻止输入。
|
|
125
|
-
|
|
126
180
|
## 排错
|
|
127
181
|
|
|
128
182
|
- **`MISSING_CREDENTIAL`**:通过模型页存储提供方密钥,或提供被引用的环境变量。
|
|
129
183
|
- **`UNKNOWN_MODEL`**:选择已配置的模型,或向自定义提供方添加缺失的模型。
|
|
130
184
|
- **获取可用模型返回 401**:检查密钥。模型发现会调用 OpenAI 兼容的 `GET /models` 端点;对于不提供该端点的服务,请手动输入模型。
|
|
185
|
+
- **获取可用模型提示既没有 `data` 数组也没有 `models` 对象**:端点返回的列表格式不在探测的读取范围内。请手动输入模型。
|
|
131
186
|
- **密钥与地址都正确,网关却拒绝每一个请求**:它的请求形状与 OpenAI 不同。先在路由上设 `compat.supportsDeveloperRole: false` 与 `compat.maxTokensField: max_tokens`。
|
|
132
187
|
- **只有推理模型失败**:pi-ai 把它们的系统提示词以 `developer` 角色发出,而网关拒绝该角色。设 `compat.supportsDeveloperRole: false`。
|
|
188
|
+
- **手动录入的模型没有推理等级菜单**:该模型没有声明任何等级。在 `settings.yaml` 中给该模型加上 `reasoningEfforts`。
|
|
189
|
+
- **`off` 无法让 DeepSeek 模型停止思考**:留空的 `off` 不发送任何推理字段,默认思考的端点就继续思考。请在模型或路由上设置 `compat.thinkingFormat: deepseek`。
|
|
133
190
|
- **某个 compat 开关因没有值而被拒绝**:冒号后什么都没写。给它一个值,或删掉该键以沿用已安装 catalog 的值。
|
|
134
|
-
- **图片在发送前被拒绝**:该模型未声明图片模态。请给自定义提供方的模型加上 `input: [text, image]
|
|
191
|
+
- **图片在发送前被拒绝**:该模型未声明图片模态。请给自定义提供方的模型加上 `input: [text, image]`;在 DeepSeek 自身的路由上,请选择声明了图片能力的模型 `deepseek-v4-flash-vision-exp`。
|
|
135
192
|
- **提供方拒绝了带图片的请求**:该模型声明了其端点实际并不提供的图片能力。请从授予它图片能力的那个列表中移除 `image`——可能是模型的 `input`,也可能是路由的 `defaultInput`——然后开启新会话:附加的图片会留在会话日志里,因此在会话离开它之前,同一个请求会不断重复。
|
|
136
|
-
|
|
137
|
-
## 进阶配置
|
|
138
|
-
|
|
139
|
-
自动生成的[插件配置目录](../reference/config-catalog.md)列出每个插件的所有受支持字段与默认值;[`dsh-llm-pi-ai`](../reference/config-catalog.md#deepseek-aidsh-llm-pi-ai) 就是本页所配置的那个提供方段落。[`dsh-llm-pi-ai`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/llm-pi-ai/README.zh.md) 和 [`dsh-llm-deepseek`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/llm/llm-deepseek/README.zh.md) 参考文档负责直接 `settings.yaml` 配置、目录解析、推理控制、凭据与适配器错误。
|
|
@@ -2,21 +2,21 @@
|
|
|
2
2
|
editSource: "docs/user/guide/python-sdk.zh.md"
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
# Python SDK
|
|
5
|
+
# Python SDK 入门
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
本教程安装已发布的 Python SDK,运行随附的独立极简 profile,并说明如何从自己的程序自定义同一个 `dsh` profile。
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## 前置条件
|
|
10
10
|
|
|
11
11
|
- Python 3.10 或更高版本
|
|
12
12
|
- Git
|
|
13
|
-
- Linux x64、Linux arm64
|
|
14
|
-
- DeepSeek 兼容的 API
|
|
15
|
-
-
|
|
13
|
+
- Linux x64、Linux arm64、arm64 上的 macOS 14 或更高版本,或 Windows x64
|
|
14
|
+
- DeepSeek 兼容的 API endpoint 与凭据
|
|
15
|
+
- 隔离的 workspace 与隔离的 Harness home
|
|
16
16
|
|
|
17
17
|
## 安装 SDK
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
### Linux 与 macOS
|
|
20
20
|
|
|
21
21
|
```sh
|
|
22
22
|
git clone https://github.com/deepseek-ai/deepseek-harness.git
|
|
@@ -26,51 +26,76 @@ python -m venv .venv
|
|
|
26
26
|
python -m pip install deepseek-harness-sdk
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
### Windows PowerShell
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
```powershell
|
|
32
|
+
git clone https://github.com/deepseek-ai/deepseek-harness.git
|
|
33
|
+
Set-Location deepseek-harness
|
|
34
|
+
py -3.10 -m venv .venv
|
|
35
|
+
.venv\Scripts\Activate.ps1
|
|
36
|
+
python -m pip install deepseek-harness-sdk
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
安装内容包含匹配的原生运行时 wheel 与 `dsh` 命令。普通 SDK 运行不需要系统 Node.js。需要构建产物的仓库贡献者应使用 [Python 贡献者工作流](https://github.com/deepseek-ai/deepseek-harness/blob/master/python/development.zh.md)。
|
|
32
40
|
|
|
33
|
-
|
|
41
|
+
## 运行检入示例
|
|
42
|
+
|
|
43
|
+
导出凭据;使用兼容代理时再设置 endpoint:
|
|
44
|
+
|
|
45
|
+
### Linux 与 macOS
|
|
34
46
|
|
|
35
47
|
```sh
|
|
36
48
|
export DEEPSEEK_API_KEY=sk-your-key-here
|
|
37
49
|
# export DEEPSEEK_BASE_URL=http://127.0.0.1:8000/v1
|
|
38
|
-
# export DSH_MODEL=deepseek-v4-flash
|
|
39
|
-
# export DSH_SYSTEM_PROMPT='You are a helpful software engineer assistant.'
|
|
40
50
|
```
|
|
41
51
|
|
|
42
|
-
|
|
52
|
+
### Windows PowerShell
|
|
53
|
+
|
|
54
|
+
```powershell
|
|
55
|
+
$env:DEEPSEEK_API_KEY = "sk-your-key-here"
|
|
56
|
+
# $env:DEEPSEEK_BASE_URL = "http://127.0.0.1:8000/v1"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
使用显式 workspace 与 home 路径运行一个任务:
|
|
60
|
+
|
|
61
|
+
### Linux 与 macOS
|
|
43
62
|
|
|
44
63
|
```sh
|
|
45
|
-
python examples/
|
|
46
|
-
--workspace /absolute/path/to/workspace \
|
|
47
|
-
--
|
|
64
|
+
python python/sdk/examples/minimal.py \
|
|
65
|
+
--workspace /absolute/path/to/disposable-workspace \
|
|
66
|
+
--dsh-home /absolute/path/to/example-dsh-home \
|
|
48
67
|
--session-id example-001 \
|
|
49
68
|
"Inspect the repository and fix the failing tests."
|
|
50
69
|
```
|
|
51
70
|
|
|
52
|
-
|
|
71
|
+
### Windows PowerShell
|
|
72
|
+
|
|
73
|
+
```powershell
|
|
74
|
+
python python/sdk/examples/minimal.py `
|
|
75
|
+
--workspace C:\work\disposable-workspace `
|
|
76
|
+
--dsh-home C:\work\example-dsh-home `
|
|
77
|
+
--session-id example-001 `
|
|
78
|
+
"Inspect the repository and fix the failing tests."
|
|
79
|
+
```
|
|
53
80
|
|
|
54
|
-
|
|
81
|
+
脚本会打印最终 assistant 响应。所选 home 会保存生成的 `sdk-minimal` profile、已安装插件,以及 `sessions/` 下的未压缩 JSONL 会话日志。示例与 SDK 绝不会静默读取 `~/.dsh`。
|
|
55
82
|
|
|
56
|
-
|
|
83
|
+
## 在程序中使用 SDK
|
|
57
84
|
|
|
58
85
|
```python
|
|
59
86
|
from pathlib import Path
|
|
60
87
|
|
|
61
88
|
from deepseek_harness import DeepSeekHarness
|
|
62
89
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
sessions = Path("/absolute/path/to/sessions").resolve()
|
|
66
|
-
|
|
90
|
+
workspace = Path("/absolute/path/to/disposable-workspace").resolve()
|
|
91
|
+
dsh_home = Path("/absolute/path/to/example-dsh-home").resolve()
|
|
67
92
|
with DeepSeekHarness(
|
|
68
93
|
provider="deepseek-official",
|
|
69
94
|
model="deepseek-v4-flash",
|
|
70
95
|
max_tokens=49_152,
|
|
71
96
|
cwd=str(workspace),
|
|
72
|
-
|
|
73
|
-
|
|
97
|
+
dsh_home=str(dsh_home),
|
|
98
|
+
profile="sdk-minimal",
|
|
74
99
|
) as harness:
|
|
75
100
|
result = harness.run(
|
|
76
101
|
"Inspect the repository and fix the failing tests.",
|
|
@@ -80,27 +105,48 @@ with DeepSeekHarness(
|
|
|
80
105
|
print(result.final_response)
|
|
81
106
|
```
|
|
82
107
|
|
|
83
|
-
`
|
|
108
|
+
SDK 会延迟启动内置的 `dsh --profile sdk-minimal` 进程,并复用到上下文管理器退出。Profile、其持久 patch、home patch 与任何有序 `patches` tuple 共同组成应用配置。不存在独立 Python 运行时 bin 或完整配置选项。
|
|
109
|
+
|
|
110
|
+
## 安装或定义插件
|
|
111
|
+
|
|
112
|
+
需要在该 home 中持久保存依赖与 bundle 层时,使用 `dsh plugin`:
|
|
113
|
+
|
|
114
|
+
### Linux 与 macOS
|
|
115
|
+
|
|
116
|
+
```sh
|
|
117
|
+
export DSH_HOME=/absolute/path/to/example-dsh-home
|
|
118
|
+
dsh --profile sdk-minimal --dump-default-config >/dev/null
|
|
119
|
+
dsh plugin --profile sdk-minimal add file:/absolute/path/to/my-plugin-bundle
|
|
120
|
+
```
|
|
84
121
|
|
|
85
|
-
|
|
122
|
+
### Windows PowerShell
|
|
123
|
+
|
|
124
|
+
```powershell
|
|
125
|
+
$env:DSH_HOME = "C:\work\example-dsh-home"
|
|
126
|
+
dsh --profile sdk-minimal --dump-default-config | Out-Null
|
|
127
|
+
dsh plugin --profile sdk-minimal add file:C:/work/my-plugin-bundle
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
第一个命令初始化随附的独立 profile。第二个命令把包管理转发给 `pnpm`,然后记录所有导出 `dsh.bundle` 层的已安装包。只有执行此管理命令时才需要安装 `pnpm`;启动已安装 SDK 不需要它。持久配置项变更应编辑 `$DSH_HOME/profiles/sdk-minimal/cordis.patch.yml`;单次启动变更则从 Python 传入 patch 文件。
|
|
131
|
+
|
|
132
|
+
另一个 `profile` 只有包含 `@deepseek-ai/dsh-sdk-app` 或另一个 JSON-RPC server 配置项时才有效。缺失 server 配置项、无法解析的插件和非法 patch 会在启动时失败,不会回退到其他组合。
|
|
133
|
+
|
|
134
|
+
## 理解极简 profile
|
|
86
135
|
|
|
87
136
|
| 属性 | 值 |
|
|
88
137
|
|---|---|
|
|
89
|
-
| 系统提示词 | `DSH_SYSTEM_PROMPT
|
|
90
|
-
| `minimal.py`
|
|
91
|
-
| 面向模型的工具 |
|
|
92
|
-
|
|
|
93
|
-
|
|
|
94
|
-
|
|
|
95
|
-
|
|
|
96
|
-
| 会话持久化 | `DSH_SESSION_ROOT` 下未压缩的 JSONL |
|
|
97
|
-
|
|
98
|
-
该组合省略了 harness 身份、workspace 提示词文本、skill(技能)、一次性 Bash、任务工具、上下文压缩和其他所有面向模型的插件。沙箱策略事实记录为运行时用户上下文,而不会追加到系统提示词中。
|
|
138
|
+
| 系统提示词 | `DSH_SYSTEM_PROMPT`,未设置时为 `You are a helpful software engineer assistant.` |
|
|
139
|
+
| `minimal.py` 的模型 | `--model`,然后是 `DSH_MODEL`,最后是 `deepseek-v4-flash` |
|
|
140
|
+
| 面向模型的工具 | Linux/macOS 上的持久 `bash` 或 Windows 上的 `pwsh`,以及 `str_replace_editor` |
|
|
141
|
+
| Shell 超时 | 300 秒 |
|
|
142
|
+
| Editor 输出上限 | 16,000 字符 |
|
|
143
|
+
| 运行时上下文与 compaction | 不存在 |
|
|
144
|
+
| 会话持久化 | `<dsh_home>/sessions` 下的未压缩 JSONL |
|
|
99
145
|
|
|
100
|
-
|
|
146
|
+
该 profile 的唯一组合包会在空根之上插入完整配置树,且不包含 `dsh-base`,因此基础 profile 以后新增的工具不会隐式出现。它包含 SDK 协议、一个由环境配置的 DeepSeek 适配器、本地执行与持久化;settings、托管凭据、遥测、Web 工具、subagent、本地指令发现和 compaction 均不存在。它固定使用 `danger-full-access`,因此按平台选择的持久 shell 与 editor 可以修改运行时可见的任何路径;应使用一次性 checkout 或容器。
|
|
101
147
|
|
|
102
|
-
`
|
|
148
|
+
已安装 wheel 仍会打包完整 `web` profile 与前端产物。如果 Python SDK 部署还需要浏览器应用,请针对显式 `DSH_HOME` 运行 `dsh web`;`web` 是独立 CLI 应用,不能为 Python SDK client 提供服务。
|
|
103
149
|
|
|
104
|
-
|
|
150
|
+
需要隔离 profile、插件、凭据、设置与会话时,应使用新的 home。独立工作应使用新的 session id;只有继续同一段持久对话和会话资源时,才同时复用 harness、home 与 id。
|
|
105
151
|
|
|
106
|
-
|
|
152
|
+
[组合包参考](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/bundle/sdk-minimal/README.zh.md)定义确切配置树,[示例参考](https://github.com/deepseek-ai/deepseek-harness/blob/master/python/sdk/examples/README.zh.md)定义可运行程序。[Python SDK 参考](https://github.com/deepseek-ai/deepseek-harness/blob/master/python/sdk/README.zh.md)介绍生命周期、结果、通知与底层行为;[dsh CLI 参考](https://github.com/deepseek-ai/deepseek-harness/blob/master/apps/cli/reference/README.zh.md)介绍 profile 分层。
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
editSource: "docs/user/guide/schedule.zh.md"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# 安排会话内提醒
|
|
6
|
+
|
|
7
|
+
此 overlay 让一个 `dsh web` 进程显式启用 Schedule 提醒,同时不改变交付的默认 Web 组合:
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
dsh web --patch apps/cli/config/examples/schedule/cordis.yml
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
当前 overlay 支持使用正整数 `after_seconds`、绝对时间 `at` 目标,或至少 300 秒的固定速率 `every_seconds` 间隔创建提醒。模型通过 `schedule_create`、`schedule_list` 和 `schedule_delete` 管理它们;每个结果都会把交付标为 `session-local`。
|
|
14
|
+
|
|
15
|
+
启用此 overlay 后,成功打开且存在活动提醒的 Session 会在对话 header 中显示只读目录。目录列出完整 prompt、等待中或已逾期状态、单次或精确重复周期、浏览器本地目标时间与相对时间。侧边栏还会在 grouped、flat 与 search 行当前可用的 projection 值非空时,于标题后显示不可交互的闹钟。这些界面不会创建、编辑、删除或确认提醒;cold Session 的缓存闹钟允许短暂漏显或残留。
|
|
16
|
+
|
|
17
|
+
浏览器会为每条提示词附加其 IANA 时区。Time-context 会告诉模型,把未明确限定时区的日期和时间解释为该请求的浏览器时区。此假设仅用于自然语言解释:`schedule_create.at` 必须是带 `Z` 或数值偏移量且严格符合 RFC 3339 的日期时间,或是带显式 `UTC` 或 IANA Area/Location 时区的 `{ date, time, time_zone }`。Schedule 不保留或推断 Session 默认时区。夏令时缺口会被拒绝,重叠时段选择第一个时刻;成功创建的记录只保留所得的 UTC 目标。
|
|
18
|
+
|
|
19
|
+
每条提醒由原 Session 日志拥有。live 根 Agent 会等待到完全 idle,再在该对话中排入一个普通 follow-up 轮次。它绝不会中途引导当前工作,也不会添加独立回执或提醒卡片。关闭进程或让 Session 保持 cold 会停止内存 timer,但不会删除记录;重新打开同一个 Session 会恢复等待并交付逾期提醒。查看 cold 历史不会激活提醒,fork 也不会继承父 Session 的提醒。
|
|
20
|
+
|
|
21
|
+
Every 提醒始终与其创建时刻对齐。如果提醒逾期,只会呈现最新一个到期发生时点,下一个目标仍保留在原固定速率序列上。同一次 idle 决策中逾期的所有不同 Every 记录会合并为一个 follow-up,每条记录各有一个发生时点;错过的间隔不会形成积压。已到期的一次性提醒会在该批次之前运行。不支持日历表达式和 Cron 表达式。
|
|
22
|
+
|
|
23
|
+
创建和实际删除操作只有在 Session persistence 确认对应事件前缀后才会确认成功。Schedule 不提供浏览器、操作系统、邮件、短信或其他外部通知。持久 dispatch 会记录 follow-up 已经入队;它不确认模型成功或用户已收到提醒。
|
|
@@ -39,14 +39,16 @@ sequenceDiagram
|
|
|
39
39
|
Driver->>Prompt: <code>system-prompt/assemble</code> waterfall
|
|
40
40
|
Driver->>LLM: <code>agent/request</code> waterfall, then <code>llm/stream</code> waterfall
|
|
41
41
|
LLM-->>Driver: StreamChunk*
|
|
42
|
-
Driver
|
|
43
|
-
Session-->>SDK: <code>session/event</code> <code>assistant/chunk</code>*
|
|
42
|
+
Driver-->>SDK: <code>agent/assistant-stream</code> chunk*
|
|
44
43
|
alt final adapter or terminal in-band request failure
|
|
44
|
+
Driver->>Session: <code>assistant/attempt</code>
|
|
45
|
+
Driver-->>SDK: <code>agent/assistant-stream</code> committed end
|
|
45
46
|
Driver->>Session: <code>step/end</code>
|
|
46
47
|
Driver->>Hooks: <code>agent/request-error</code> waterfall
|
|
47
48
|
Hooks-->>Driver: return retry action or preserve the original error
|
|
48
49
|
else model request succeeded
|
|
49
50
|
Driver->>Session: <code>assistant/message</code>
|
|
51
|
+
Driver-->>SDK: <code>agent/assistant-stream</code> committed end
|
|
50
52
|
Driver->>Tools: classify pending call by executionMode
|
|
51
53
|
loop barriers and bounded rolling pool, reclassify before start
|
|
52
54
|
opt call starts
|
|
@@ -75,11 +77,11 @@ sequenceDiagram
|
|
|
75
77
|
Driver-->>SDK: <code>agent/status</code> idle
|
|
76
78
|
```
|
|
77
79
|
|
|
78
|
-
`assistant/message` 事件会记录每次成功的提供方调用,包括返回空内容或以 `max-tokens`
|
|
80
|
+
`assistant/message` 事件会记录每次成功的提供方调用,包括返回空内容或以 `max-tokens` 结束的调用,并嵌入精确的紧凑带时间 stream。空内容不会进入派生历史。失败、重试、取消或 stream error attempt 到达 settlement 时,如果没有 surface message,就会把 stream 记录为 `assistant/attempt`。实时 `agent/assistant-stream` chunk frame 是瞬态数据;回放读取任一种持久 settlement,如果进程在 settlement 前硬中断,则不会留下持久 attempt stream。
|
|
79
81
|
|
|
80
82
|
`dsh-compaction-basic` 在派生请求之前通过 `agent/pre-step` 处理压力,而 `agent/request-error` 仅用于规范的上下文溢出。任一触发条件满足后,系统都会先执行可选的工具结果剪枝,再选择摘要。恢复发生在失败步骤结束之后、失败轮次结束之前;只有当剪枝或摘要生成推进了 surface replacement generation 时,系统才会开启一个全新的重试轮次,否则仍以原始请求错误为准。
|
|
81
83
|
|
|
82
|
-
以返回的 `agent/pre-step` 决策为准;通过包装 `next()`
|
|
84
|
+
以返回的 `agent/pre-step` 决策为准;通过包装 `next()` 的监听器会保留下游消息与 `startsRequestSeries`,除非有意替换。steering(中途引导)和注入的上下文在后续的认领操作取得其下一步骤批次后,会经过同一 waterfall(瀑布式事件)。
|
|
83
85
|
|
|
84
86
|
需要可回放 transcript(文本记录)数据的 SDK 用户应当消费 `session/event`;`agent/*` 是用于队列与状态、提示词拦截、请求构造、steering、继续执行和错误处理的实时协调接口。
|
|
85
87
|
|