Files
deepseek-harness/packages/sdk/client/README.zh.md
T

51 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# @deepseek-ai/dsh-sdk-client
[English](README.md) | 中文
通过 stdio JSON-RPC 驱动同版本 [`dsh`](../../../apps/cli/README.zh.md) runtime 的 TypeScript client SDK。`DeepSeekHarness` 是高层自有运行 API`HarnessClient` 是低层协议 client。本包依赖 `@deepseek-ai/dsh` 并直接解析随安装的 CLI,因此普通消费方无需发现 runtime 可执行文件,也无需维护第二套应用配置。干净源码 checkout 中若不存在 `lib/bin.js`client 会通过已解析的 `tsx/esm` loader 启动同一包的 `src/bin.ts`,并应用一个省略构建期生成 Typert 贡献加载的内部 patchSDK JSON-RPC 应用不消费该远程网关。已安装包使用完整的构建后入口。
两层 client 接受同一组启动字段:`dshBin?``profile?`(默认 `sdk`)、有序 `patches?``dshHome?``processCwd?``env?`,以及请求、初始化、关闭和 dispose 超时。相对调用方的 CLI 模块、patch、显式 home 与进程 cwd 路径会在 spawn 前转为绝对路径。client 会在所有平台上通过自身当前的 Node 可执行文件运行 dsh CLI 模块。省略 home 时保留 dsh 的普通解析(先 `DSH_HOME`,再 `~/.dsh`);显式 home 会覆盖子进程环境。提供 `env` 时,它整体替换子进程环境;client 会在 `start()` 实际 spawn 时读取该对象或 `process.env`,所以首次启动前的修改会生效。
组合自定义属于 profile 系统。使用 `dsh plugin --profile <name> …` 安装持久组合包与插件依赖,编辑该 profile 的 `cordis.patch.yml`,再通过 `profile` 选择。`patches` 用于有序的逐次启动覆盖。patch 会替换配置行的完整 config;自定义 profile 必须保留 `@deepseek-ai/dsh-sdk-app` 或另一个 SDK server 配置行。
## DeepSeekHarness
```ts
import { DeepSeekHarness } from '@deepseek-ai/dsh-sdk-client'
await using harness = new DeepSeekHarness({
profile: 'sdk',
patches: ['./automation.cordis.yml'],
provider: 'deepseek-official',
model: 'deepseek-v4-flash',
maxTokens: 49_152,
})
const result = await harness.run('say hi')
console.log(result.finalResponse)
```
dsh 进程在首次使用时惰性启动,并在多次 `run()` 之间持续归实例所有;必须调用 `close()`(或使用 `await using`)。`start()` 会记忆化有界的 `initialize` 握手;`initializeTimeoutMs` 默认 10 秒,诊断会写明所选 profile 并附带保留的 stderr 尾部。握手失败会回收 runtime,之后的调用可以用新进程重试,直至终结性的 `close()`
握手携带绝对 session workspace、provider/model 和可选的正整数 `maxTokens``run(input, { sessionId?, onNotification? })` 接受文本或 `SdkPromptContentBlock[]`;内联栅格图片块携带规范 base64 与 `mimeType`,并在运行时内成为持久附件。该调用将 prompt 入队,等待持久 inbox 回执,并收集到整个根 agent 下次 idle。它返回 `RunResult { sessionId, finalResponse, events, notifications }``events` 仅限根 sessionnotification 还包括发现的后代。
## HarnessClient
低层 client 提供 `start()`/`initialize()`/`prompt()`/`request()`/`close()` 与 notification 订阅。`prompt()` 返回入队后的持久消息 ID,而不是 prompt 结果。`subscribeSessionTree(id)` 把进程级 notification 流限定到一个 session 血缘。导出的失败类型为 `JsonRpcResponseError``RequestTimeoutError``SdkProtocolError``TransportClosedError`
`close()` 先请求协议 `shutdown`(默认上限 1000 毫秒),再执行 stdin EOF → SIGTERM → SIGKILL`disposeEofGraceMs` 6000、`disposeGraceMs` 3000),直到进程退出。client 位于任何 Harness context 之外,因此其私有进程 adapter 是 `dsh-subprocess` 中记录的 SDK 托管传输例外;通用 command/argv 启动仅是包测试机制,不是消费方接口。
## 模型体验
本库不会增加任何模型可见内容;所选 dsh profile 负责子进程模型的 prompt、工具、策略和缓存前缀(见 [`dsh-sdk-app`](../../bundle/sdk-app/README.zh.md))。
#### KV Cache 影响
client 进程中无影响。子进程的 profile、patch、provider、model 与历史决定缓存复用。
## 已知限制与暂缓事项
- **所选 profile 可以省略 SDK server**:初始化会在配置的上限失败并写明 profile;请保留 SDK app 组合包或等价 server 配置行。
- **没有轮次中取消或逐 prompt 结果**:放弃自有活动意味着关闭 runtime;模型结果保留在 session event 中。
- **受信任 patch 可能破坏 stdout 纯净性**:随附 SDK profile 只写协议 frame,但任意用户插件负责自己的输出行为。
- **client→server notification 与 server→client request 尚未实现**。