快速开始:DeepSeek Harness 运行时上手
本指南面向 Agent 运行时工程:启动 Cordis Host、编写 cordis.yml、验证预设与 Session、体验审批与 MCP。理论背景见 入门导论;动手实验见 七天子站。
一、环境准备
| 项目 | 要求 | 说明 |
|---|---|---|
| Node.js | >= 18,推荐 20 LTS | node -v 验证 |
| 包管理 | npm / pnpm / yarn | npx 路径需 npm |
| LLM API | OpenAI 兼容 Key | DeepSeek / OpenAI 等 |
| 磁盘 | ≥ 2GB 可用 | Session Log 增长 |
| 内存 | ≥ 4GB 推荐 | MCP 多进程时 |
export DEEPSEEK_API_KEY="sk-..."
export DSH_LOG_LEVEL="info" # 排错时用 debug
默认 Web UI 地址:http://127.0.0.1:3080
1.1 网络与代理
企业环境若 npx 拉包失败,配置 HTTPS_PROXY 或使用内 npm mirror。LLM API 需 Host 出站访问;纯内网部署需自建模型 endpoint 并在 Profile 修改 model.baseURL。
二、安装路径对比
| 路径 | 命令 | 适用场景 | 缺点 |
|---|---|---|---|
| npx 一键 | npx @deepseek-ai/dsh web | 首次体验、Demo | 版本浮动 |
| 克隆源码 | git clone + pnpm install + pnpm dev | 插件/Bug 开发 | 需构建 |
| Docker | 官方镜像 + volume | 生产预演、CI | 需维护镜像 |
# 推荐首启命令
npx @deepseek-ai/dsh web
# 等价包名(视发布渠道)
# npx @deepseek-ai/deepseek-harness web
生产应用 pin digest 而非 @latest;开发可用 pnpm link 本地 cordis 插件。
2.1 决策矩阵
| 你的目标 | 选择 |
|---|---|
| 15 分钟体验 | npx |
| 写 Cordis 插件 | clone 源码 |
| K8s 部署 Rehearsal | Docker + PVC |
| 无 Node 的服务器 | Docker only |
三、cordis.yml 精讲
项目根或 DSH_CONFIG_DIR 指向目录下的 cordis.yml 是 Effective Runtime 的声明式入口。
host:
name: local-dev
port: 3080
bind: 127.0.0.1
bundle: standard
profile: local
profiles:
local:
model:
provider: deepseek
name: deepseek-chat
apiKey: ${DEEPSEEK_API_KEY}
session:
store: ./.dsh/sessions
maxTurns: 40
sandbox:
workspace: ./demo-ws
denyPaths:
- "**/.env"
- "**/secrets/**"
approval:
mode: permissive
context:
compress: hybrid
patches: []
| 字段 | 配置层 | 含义 |
|---|---|---|
bundle | Bundle | 预设能力包 |
profile | Profile | 当前激活环境名 |
profiles.* | Profile | 各环境参数块 |
patches | Patch | 短期覆盖列表 |
Patch 示例——临时禁用 bash:
patches:
- op: disable
path: tools.bash
reason: "demo 只读"
expire: "2026-12-31"
3.1 合并语义
后应用的 Patch 覆盖先应用的 Profile 字段;patches 数组顺序 significant。环境变量 ${VAR} 在启动时展开,缺失时 fail-fast。
四、首启验证(七步)
node -v≥ 18export DEEPSEEK_API_KEY=...- 创建
demo-ws/README.md测试文件 - 写入第三节
cordis.yml npx @deepseek-ai/dsh web- 浏览器打开
http://127.0.0.1:3080,选 Standard - 发送:「读取 README 第一行」→ 检查
.dsh/sessions/*/events.jsonl
健康检查:curl -sf http://127.0.0.1:3080/health 应返回 200。
五、预设切换实验
固定 Prompt:「列出当前目录文件并总结」,分别用 Standard / Code / Minimal 新建 Session 对比:
| 观测项 | Standard | Code | Minimal |
|---|---|---|---|
| 可用 tools | 中 | 多含 bash | 少 |
| 是否触发 approval | 少见 | bash 常见 | 罕见 |
| token 消耗 | 中 | 高 | 低 |
Creator 仅能在 隔离 VM 或容器 中实验。禁止对生产仓库或含真实 Key 的环境使用。
# 切换 bundle 只需改 cordis.yml 后重启 Host
# bundle: code
六、Session 观察
Session 目录:./.dsh/sessions/<sessionId>/events.jsonl
tail -f .dsh/sessions/*/events.jsonl | python3 -m json.tool
关键事件类型:user_message、assistant_message、tool_call、tool_result、approval_blocked、session_fork。
Resume/Fork/Replay 语义详见 intro 第八章。
七、审批初体验
将 bundle 改为 code,approval.mode 改为 strict,Prompt:「执行 rm -rf /tmp/test」
预期:UI 或 CLI 出现 approval 弹窗;jsonl 写入 approval_blocked 或用户确认后执行。
子站交互 lab:审批模拟器
八、MCP 初配
mcp:
servers:
filesystem:
command: npx
args:
- "-y"
- "@modelcontextprotocol/server-filesystem"
- "./demo-ws"
重启 Host 后,Log 应出现 MCP connect 事件;UI tools 列表含 MCP 提供的 tools。MCP 工具与内置工具 同一审批链。
九、排错决策树
| 现象 | 可能原因 | 修复 |
|---|---|---|
| EADDRINUSE | 3080 占用 | 改端口 |
| 401 / 403 | Key 错或过期 | 轮换 Key |
| 白屏 | 前端未 build | 用官方 npx 包 |
| 无 tool_call | model 不支持 tools | 换 deepseek-chat 等 |
| MCP spawn fail | command 路径错 | 本地先跑 MCP 命令 |
十、验收清单
-
npx @deepseek-ai/dsh web成功监听 3080 - 理解 cordis.yml 三层字段
- Standard 下完成带 tool 的对话
- 对比至少两种预设
- 找到并解读 events.jsonl
- 体验一次 approval 拦截
- 知悉 Creator 风险
- (可选)MCP filesystem 连通
十一、下一步
十二、30 分钟首启完整剧本
mkdir -p ~/dsh-lab/demo-ws && cd ~/dsh-lab
echo "# Harness Lab" > demo-ws/README.md
echo 'console.log("ok")' > demo-ws/index.js
cat > cordis.yml << 'EOF'
host:
name: lab
port: 3080
bundle: standard
profile: local
profiles:
local:
model:
provider: deepseek
name: deepseek-chat
apiKey: ${DEEPSEEK_API_KEY}
session:
store: ./.dsh/sessions
sandbox:
workspace: ./demo-ws
patches: []
EOF
export DEEPSEEK_API_KEY="sk-..."
npx @deepseek-ai/dsh web
另开终端:curl -sf http://127.0.0.1:3080/health && find .dsh -name '*.jsonl'
UI Prompt 序列:①「README 主题」②「index.js 做什么」③「创建 notes.txt 写入 hello」(观察是否触发 tool 与 approval)
十三、cordis.yml 扩展字段参考
| 字段路径 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| host.bind | string | 127.0.0.1 | 0.0.0.0 允许 LAN |
| host.port | number | 3080 | 多实例改 3081 |
| session.maxTurns | number | 无限制 | 防 agent loop |
| session.store | path | .dsh/sessions | 生产用 PVC |
| sandbox.denyPaths | glob[] | [] | 拒绝敏感路径 |
| sandbox.denyNetwork | bool | false | 内网 QA 可 true |
| approval.mode | enum | permissive | prod 用 strict |
| approval.rules | array | [] | tool 名 pattern |
| context.compress | enum | hybrid | none/sliding/summarize/hybrid |
| otel.enabled | bool | false | staging 建议 true |
| otel.endpoint | url | - | Jaeger/OTLP |
| mcp.servers | map | MCP Server 定义 |
十四、安装故障库(分场景五步法)
EADDRINUSE
lsof -i :3080查占用进程- kill 或改
host.port - 重启 npx
- curl health
- 记录端口规范进团队 wiki
npx 首次极慢
- 检查 npm registry 与代理
- 预装
npm i -g @deepseek-ai/dshpin 版本 - 或使用 Docker 镜像
- CI 缓存 npm store
- 文档注明期望冷启动时间
401 Unauthorized
- echo 环境变量是否为空(勿 commit Key)
- 验证 Key 在 provider 控制台有效
- 检查 model.provider 与 baseURL
- 用 curl 直接打 LLM API 对比
- 轮换 Key 后重启 Host
模型从不调用 tool
- 确认 bundle 非 empty
- 换支持 function calling 的 model.name
- Prompt 明确「使用工具读取文件」
- debug 日志看 tools schema 是否下发
- 对照 intro 工具管道
十五、预设对照实验记录表
实验 Prompt:「分析 demo-ws 目录并给出改进建议」
| 指标 | Standard | Code | Minimal |
|---|---|---|---|
| 首 token 延迟 | 记录 | 记录 | 记录 |
| 总 turn 数 | |||
| tool_call 次数 | |||
| approval 次数 | |||
| 估算 token |
实验后回答:谁适合 prod 默认?谁适合 CI smoke?Creator 为何不能填表?
十六、Session Log 分析 命令
SESSION=$(ls -t .dsh/sessions | head -1)
cat .dsh/sessions/$SESSION/events.jsonl | python3 -c "
import sys,json
for line in sys.stdin:
e=json.loads(line)
print(e.get('type'), e.get('name','')[:40])
"
筛选 tool:grep tool_call events.jsonl。筛选拦截:grep blocked。
Resume 测试:对话中 kill Host 进程 → 同 sessionId 重启 → UI 点 Resume → 上下文应连贯。
十七、审批规则配置工作坊
approval:
mode: strict
rules:
- match: "bash"
action: require_human
- match: "rm*"
action: deny
- match: "read_file"
action: allow
实验 Prompt:①「bash: ls」②「bash: rm x」③「读 README」。确认 jsonl 三类不同事件。
十八、MCP 连通剧本
- 安装
@modelcontextprotocol/server-filesystem - cordis.yml 添加 mcp.servers
- 重启 Host,日志搜
mcp - Prompt「用 MCP 列出 demo-ws 文件」
- 故意写错 command,观察 fail-fast 错误
- 修正后 tool 出现
- 确认 MCP tool 走 approval(若配置 strict)
十九、OpenTelemetry 本地验证
otel:
enabled: true
endpoint: http://localhost:4318
启动 Jaeger all-in-one,完成一轮对话,在 UI 查 trace:http → session.turn → llm → tool。
二十、沙箱边界测试(预期 deny)
| Prompt | 预期 |
|---|---|
| 读 /etc/passwd | deny 或 block |
| 写 ../outside.txt | deny |
| curl 外网 URL | 视 denyNetwork |
记录 jsonl 中 sandbox 相关事件,附进安全评审文档。