Python SDK 是 DeepSeek Harness 的 Python 面孔:它以子进程方式、通过 stdio 上的换行分隔 JSON-RPC 驱动打包好的 harness 运行时,让 Python 代码无需系统 Node.js 即可运行 agent 轮次。它以两个 PyPI 包发布——客户端 deepseek-harness-sdk 与平台运行时载体 deepseek-harness-runtime-bin——它所讲的线协议与 TypeScript SDK 使用的是同一个。
| 包 | 分发 / 模块 | 角色 |
|---|---|---|
python/sdk | deepseek-harness-sdk / deepseek_harness | 高层轮次 API 与低层 JSON-RPC 客户端 |
python/sdk-runtime | deepseek-harness-runtime-bin / deepseek_harness_runtime | 打包的 dsh CLI 可执行文件与本地 sidecar(仅 wheel) |
客户端包依赖当前平台上的同版本运行时 wheel(deepseek-harness-sdk 固定 deepseek-harness-runtime-bin 的版本),因此一次 pip install deepseek-harness-sdk 两者都会装好:
python -m pip install deepseek-harness-sdk如何启动运行时
Python SDK 没有独立的应用程序入口。它用 --profile sdk 启动匹配的打包版 dsh CLI;所选 profile 拥有 JSON-RPC 服务器、agent 组合、凭据、持久化、工具与关闭行为。每次启动都要求显式选择 Harness home——传入 dsh_home,或在子进程环境中提供非空的 DSH_HOME。Python 从不静默读取 ~/.dsh;运行时 wheel 的 dsh 命令同样强制该规则,绝不回退到 ~/.dsh。
from deepseek_harness import DeepSeekHarness
with DeepSeekHarness(
dsh_home="/absolute/path/to/isolated-dsh-home",
cwd="/absolute/path/to/workspace",
provider="deepseek-official",
model="deepseek-v4-flash",
reasoning_effort="max",
max_tokens=49_152,
) as harness:
result = harness.run("Say hi.", session_id="example-001")
print(result.final_response)DeepSeekHarness 惰性启动,并在 close() 或上下文管理器退出前复用其运行时。cwd 是 agent 工作区;runtime_cwd 独立选择子进程工作目录;两者在启动前都会转为绝对路径。provider、model、可选的 reasoning_effort 与可选的正数 max_tokens 在 JSON-RPC 初始化期间发送,而 base_url 与 api_key 显式覆盖子进程环境中的 DEEPSEEK_BASE_URL 与 DEEPSEEK_API_KEY。初始 profile 握手有独立的 30 秒默认上限(initialize_timeout_seconds);普通轮次在设置 request_timeout_seconds 之前保持无界。
sdk profile 与其 bundle
使用 --profile sdk 启动会加载 @deepseek-ai/dsh-sdk-app(packages/bundle/sdk-app),即作为 dsh-base 之上的 profile bundle 的 SDK stdio 应用。它的 patch 设置编码 agent 人设、挂载一个应用自有的零选项命令提供方,并且只在那个提供方接受调用后才启动 dsh-sdk-jsonrpc-server——因此 dsh --profile sdk --help 会写出帮助并退出,而不占用 stdin 或 stdout。stdout 只保留给换行分隔的 JSON-RPC 帧。客户端选择的自定义 profile 必须保留 @deepseek-ai/dsh-sdk-app 或另一个 dsh-sdk-jsonrpc-server 行;省略了 SDK 服务器的 profile 会在没有 peer 应答时初始化失败。
随附的 sdk-minimal 变体(@deepseek-ai/dsh-sdk-minimal)是独立的显式树,而不是 dsh-base 之上的覆盖层。它提供持久 shell、字符串替换编辑器、本地执行与 JSONL 会话;settings、托管凭据、遥测、Web 工具与完整默认工具名册仍可通过独立的完整 sdk 与 web profile 获得。可运行的极简示例(python/sdk/examples/minimal.py)默认选择 sdk-minimal。
持久化定制属于 dsh profile——初始化随附 profile,并用运行时 wheel 的 dsh 命令安装外部 bundle;其 $DSH_HOME/profiles/sdk/cordis.patch.yml 是持久用户 patch。如需只对某次调用生效的变更,可传入一个或多个 patch 文件,它们会在 profile 与 home patch 层之后按顺序转发。
客户端模块
deepseek_harness 包是导入表面(见 python/sdk/src/deepseek_harness/):
| 模块 | 内容 |
|---|---|
__init__.py | 再导出公共 API:DeepSeekHarness、DeepSeekHarnessConfig、Session、RunResult、HarnessClient、HarnessConfig |
api.py | 高层轮次 API——启动、profiles、patches 与上下文管理的运行时 |
client.py | HarnessClient——低层换行分隔 JSON-RPC 客户端 |
models.py | 线类型,如 RunResult、Session 与事件/通知形状 |
errors.py | 协议与启动错误(例如畸形 turn/end 时的 SdkProtocolError) |
Session.run() 拥有一个活动区间:从提示词的持久 inbox 回执到下一个整 agent idle,并返回 RunResult(session_id, final_response, finish_reason, events, notifications)。final_response 是该区间内最后一次已提交的根会话助手文本;finish_reason 是最后一次根会话 turn/end 的 kind,例如 completed、max-tokens 或 error,当没有轮次结束时为 None。协议就是 SDK 协议 文档中描述的同一个换行分隔 JSON-RPC;缺少字符串 data.reason.kind 的 turn/end 违反协议并抛出 SdkProtocolError。
运行时载体:deepseek-harness-runtime-bin
运行时 wheel 把常规的 dsh CLI 及其封闭的 Node 依赖树打包进一个原生可执行文件,因此 SDK 使用无需系统 Node.js;dev-only node 载体绝不会被自动选中,并被排除在 wheel 与 sdist 之外。wheel 安装一个 dsh 控制台命令(在 python/sdk-runtime/pyproject.toml 中为 dsh = "deepseek_harness_runtime:main")以及 deepseek_harness_runtime Python 模块,其 API 定位打包好的可执行文件:
from deepseek_harness_runtime import (
bundled_package_dir, # 已安装的 module-data 根目录,校验发布元数据
bundled_runtime_path, # 当前平台可执行文件,校验必需 sidecar
resolve_bundled_launch_args, # 默认 argv;mode="node" 选择仅仓库载体
)生产可执行文件以 deepseek-harness-sdk-runtime-<platform>-<arch> 命名,位于模块的 runtime/ 目录下;Windows 使用 .exe 后缀。Linux x64、Linux arm64、macOS arm64 与 Windows x64 是已发布目标。Linux 与 macOS wheel 包含目标原生的 -rg sidecar,Windows 包含 -rg.exe,macOS 还包含用于 node-pty 的 -spawn-helper。工作区清单是 python/sdk-runtime——python/sdk-runtime/package.json 中的 dsh-python-runtime-closure 部署根定义了打包的依赖闭包,其 pyproject.toml 定义了 deepseek-harness-runtime-bin。没有 Python 专属的 Node 应用,也没有签入的默认 cordis.yml。
外部 profile 管理使用 dsh plugin --profile <name> ...,该命令需要 PATH 上有 pnpm;普通 SDK/profile 执行不需要。
包
| 包 |
|---|
deepseek-harness-sdk(PyPI) |
deepseek-harness-runtime-bin(PyPI) |
延伸阅读
python/README.md——Python SDK 概览与双包拆分python/sdk/README.md——运行时选择、profiles、patches 与插件管理python/sdk-runtime/README.md——运行时 wheel、sidecars 与构建/分发- SDK 协议——共享的换行分隔 JSON-RPC 线协议
packages/bundle/sdk-app/README.md——sdkprofile bundlepackages/bundle/sdk-minimal/README.md——独立的sdk-minimal树