20 · 实战三:TypeScript、Python 与真实运行时测试¶
20.1 解压后如何一次跑通¶
本实验运行过 Node 24.14.0、npm 11.9.0 与 Python 虚拟环境 3.11.14。Node 24 是这里实际验证的环境,不声称所有 Node 小版本/Windows/macOS 都执行过。Python 依赖固定在 requirements 文件;系统默认 Python 与选择的虚拟环境解释器可能不同。
unzip deepseek-agent-labs.zip
cd examples
npm ci --ignore-scripts
python3 -m venv .venv
.venv/bin/python -m pip install -r python/requirements.txt
export DSH_COURSE_PYTHON="$PWD/.venv/bin/python"
npm run check
npm run build
npm test
npm run demo
npm run demo:python
Windows 的 venv 路径是 .venv/Scripts/python.exe,也要把 DSH_COURSE_PYTHON 指向它;这是路径说明,本次未在 Windows 验证。npm test 使用编译后的 dist,因此不要省略 build。--ignore-scripts 是本次下载复建使用的安装方式,并不证明整条 npm 依赖链没有供应链风险。
18 项检查包括 11 项真实 Cordis 组件契约、6 项真正 dsh 子进程/SDK 集成与 1 项 Python SDK 集成。fixture 不调用付费模型,不需要 API key,也不会读取你已有 home 的凭据。
20.2 离线模型没有伪造 SDK¶
mock-server.ts 在 loopback 启动真实 HTTP endpoint,接收官方 DeepSeek Messages adapter 发出的请求,按脚本依次返回 Messages SSE:message_start、content_block_start/delta/stop、message_delta、message_stop。工具 input JSON 被切成两段 delta,确保走实际流式组装而非只测一个静态完整对象。
HTTP fixture 能发送文字、tool call、401 等 response。脚本耗尽返回 400,避免测试变成无限 retry。请求体最多 2 MiB,连接在 finally 清理。它仅覆盖本实验使用的 Messages/SSE 子集,不是完整 DeepSeek 服务模拟器,也不评估模型推理质量。
因此测试能够证明插件加载、真实 CLI profile、SDK JSON-RPC、HTTP adapter、loop、tool gate、日志 settlement 的这条纵向链路确实打通。它不能证明真实模型会正确搜索、可靠引用或拒绝所有 prompt injection;这些需要真实模型评估。
20.3 TypeScript demo 的结果怎么判断¶
offline-demo.ts 加载 JSON provider,用两次工具返回与最后文字组成三次请求,打印 sessionId、finalResponse、requests 与 eventTypes;完成原因在测试中用 durable turn/end 检查。没有输出 API key/header。你可改脚本最后回答来检查消费代码是否真正使用 result,而不是只打印一条固定成功文案。
SDK run() 等匹配本次 prompt 的 agent/inbox/spliced,之后等 root idle;返回区间里的 root assistant 最后文本,并非给 prompt 分配了一个无限强的因果 ID。并发向同一 root 放多条 prompt 时,要遵守 14 章的归属边界,不把一次 run 的回答自动关联到某个外部请求。
sdk-runtime.test.mjs 的连续两轮测试顺序 run,第二轮带 first.sessionId,测试第三类需求:同一 runtime 的历史继续存在、下一次请求包含 first answer、每轮步骤预算重置。并不是 Python/TS runtime 重启后 cold resume 的完整测试。
20.4 为什么 Python 没有直接安装“最新两个包”¶
研究时官方 PyPI 包 deepseek-harness-sdk 与 deepseek-harness-runtime-bin 最新都是 0.1.5rc1,npm 已是 0.2.0-rc.2。为了和本实验的 rc.2 CLI 同步,我们在 python/source_vendor/ 原样保留官方 tag 的五个 Python SDK 文件,通过 公开 dsh_bin 参数 指向同版本 node_modules/.bin/dsh。
这不是 fork 出新的协议实现。SOURCE.json 记录 tag、完整 commit 与五个原文件 SHA256;LICENSE.txt 保留 MIT 许可。脚本只把 vendor 目录加入 sys.path,调用 deepseek_harness.DeepSeekHarness。dsh_bin 必须是可执行 launcher,不能随手传一个没有执行权限的 JS 文件路径。
rc.2 Python SDK 与 发布版 TS SDK 为对应源码。依赖 pin 文件覆盖 pydantic、pydantic-core、annotated-types、typing-extensions、typing-inspection;无需安装旧 runtime wheel。将来官方同步发布后,你可以重新按同版本 wheel 安装,但应更新声明与实验,不要把现在的 vendor 声称成 pip 最新发布内容。
20.5 Python demo 的两层宿主¶
python-demo.ts 启动同一个 loopback fixture,生成同一个 plugin patch,但并不启动 TS SDK 子进程;它用 Node execFile 启动 Python。Python 文件用公开 profile、patches、dsh_home、cwd、base_url、api_key、max_tokens 参数启动实际 rc.2 dsh。
Node 给 Python 只传 PATH,因此 Python SDK 合并父环境时不会恢复宿主的其他密钥。Python finally/context manager 关闭自己的 runtime,Node finally 清理 home/server。Python 输出 JSON 包含 finishReason 和 toolResults,集成测试检查 completed、3 请求、2 工具结果和预期回答。
Python 的 finish_reason 是该 SDK result 的便利字段;TypeScript 没有同名字段。不能把两个语言的数据模型机械一比一复制。SDK JSON-RPC serverInfo.version 0.0.1 是协议身份,不能据此误写安装的 npm 版本为 0.0.1。
20.6 每组测试到底证明什么¶
| 检查 | 正向/反向证据 | 没有证明的范围 |
|---|---|---|
| tools consumer 卸载 | 工具与prompt section撤销 | 外部副作用回滚 |
| provider 替换 | 消费者停用后重激活、读新快照 | 任意provider接口兼容 |
| schema与领域验证 | missing参数、path id、unknown id失败 | 模型理解/业务规则完整 |
| pre-execute gate | 拒绝时body未执行 | post-execute可以撤销body |
| post-execute block | body副作用已发生,结果可blocked | 强事务回滚 |
| cancelled signal | dispatch前拒绝、取消结果 | 每种外部请求均可取消 |
| SSE纵切面 | 3实际HTTP、2tool、V4文件 | 全部协议/provider正确 |
| 不存在bash capability | 越权tool error、文件未出现 | 插件代码OS隔离 |
| maxSteps 2 | 第3请求未发、turn blocked | retry/token/总时间硬预算 |
| 连续两轮 | 相同session、历史进入请求 | 冷重启完整恢复 |
| AGENTS/SYSTEM sentinel | 本组合未加载这些项目内容 | 任意preset发现策略 |
| HTTP401 | error settlement、idle不是成功 | 所有网络错误分支 |
| Python纵切面 | 原样rc.2 SDK+真实CLI成功 | PyPI最新版与rc.2兼容 |
下载包验收是在新的临时目录从 ZIP 解压、npm ci、重新编译、完整测试、两种 demo,而不是只运行作者工作目录内已有 node_modules。下载重建记录 与 测试原输出 可核对。
20.7 可选真实模型命令¶
默认官方 Messages endpoint 为 https://api.deepseek.com/anthropic;若你配置兼容 endpoint,需自己确认其协议与信任边界。命令仍用同一组合、同一工具、同一步骤预算和临时 home。
本次没有执行这个付费调用,也没有凭空宣称真实模型质量、成功率、token成本或延迟。想验收自己的 Agent,可先设固定问答集、已知来源与错误请求,再检查 tool selection、引用命中、空答案/blocked/error比例与成本。把这些结果保存成自己的 evaluation artifact,而不是只看一段听起来正确的回答。