本文提供 DeepSeek Harness 预置镜像地址,并说明如何构建模板、创建沙箱和运行任务。
概述
DeepSeek Harness 是 DeepSeek AI 开源的 Agent harness(npm 包 @deepseek-ai/dsh,CLI 名 dsh),支持 headless 单任务、Web UI 和 SDK/ACP 程序化接入。
各地域 ACR 已预置 DeepSeek Harness 镜像,无需自行推送镜像或配置 ACR EE,选取下方镜像地址,通过 from_image + Template.build 构建模板后即可使用。
本页说明镜像规格与完整用法:前置条件、镜像地址、构建模板、创建沙箱、运行 DeepSeek Harness、自定义域名浏览器访问、销毁沙箱、环境概览与 Profile 能力约定。
前置条件
-
首次使用请先完成通过 SDK 使用云沙箱中的前置准备、API Key 创建和 SDK 配置(E2B API Key、
api_url、domain)。 -
已安装依赖:
pip install e2b==2.31.0(本模板不使用 Code Interpreter,无需安装e2b-code-interpreter)。 -
已准备模型 API Key,创建沙箱时通过
envs注入,镜像内不预置。-
在 DeepSeek 开放平台获取
DEEPSEEK_API_KEY。 -
可选
DEEPSEEK_BASE_URL:指定中转端点(dsh原生读取),不设置则直连 DeepSeek 官方。
-
镜像地址
按地域选取 FROM_IMAGE:
|
地域 |
镜像 |
|
cn-beijing |
|
|
cn-shenzhen |
|
|
ap-southeast-1 |
|
|
cn-hongkong |
|
|
cn-shanghai |
|
|
cn-hangzhou |
|
|
us-east-1 |
|
|
us-west-1 |
|
推荐构建规格:cpu_count=2,memory_mb=4096。
镜像内置 Web UI 一键启动脚本 /opt/deepseek-harness/start.sh。
构建模板
自定义模板需先将镜像构建为模板,只需执行一次。完成后保存模板名称,后续创建沙箱时直接复用。
以下以北京地域为例:
import time
from e2b import Template, default_build_logger
FROM_IMAGE = "fc-e2b-registry.cn-beijing.cr.aliyuncs.com/runtime/deepseek-harness:v0.0.52"
TEMPLATE_NAME = f"deepseek-harness-{int(time.time())}"
OPTS = {
"api_key": "<你的 E2B API Key>",
"api_url": "https://api.cn-beijing.e2b.fc.aliyuncs.com",
"domain": "cn-beijing.e2b.fc.aliyuncs.com",
}
build = Template.build(
Template().from_image(FROM_IMAGE),
name=TEMPLATE_NAME,
cpu_count=2,
memory_mb=4096,
on_build_logs=default_build_logger(),
**OPTS,
)
print(f"template: {build.name}") # 保存,后续可复用
构建完成后控制台模板状态应为 ready。同一模板名称可多次创建沙箱,无需每次重新构建。
创建沙箱
创建沙箱时通过 envs 注入 DeepSeek API Key:
from e2b import Sandbox
sandbox = Sandbox.create(
template=TEMPLATE_NAME,
envs={"DEEPSEEK_API_KEY": "<your-deepseek-api-key>"},
timeout=600,
**OPTS,
)
运行 DeepSeek Harness
headless 单任务
--profile headless 执行一个任务,打印最终答案后退出:
result = sandbox.commands.run(
'dsh --profile headless "用一句话介绍 DeepSeek Harness" 2>&1',
timeout=0,
)
print(result.stdout)
模型 API Key 未注入或无效时,dsh 以非零码退出并给出明确错误(错误输出在 stderr,下表为经 2>&1 合并后的错误原文):
|
场景 |
输出 |
|
未提供 Key |
|
|
Key 无效 |
|
Web UI
镜像内置一键启动脚本,沙箱内执行一条命令即可启动 Web UI。脚本后台启动 dsh web(仅监听 127.0.0.1:8080,Token 鉴权),就绪后在 stdout 输出 DSH_WEB_TOKEN 与 DSH_WEB_LAUNCH_URL;脚本幂等,Web UI 已在运行时直接回显现有 token,不重复启动:
import re
r = sandbox.commands.run("/opt/deepseek-harness/start.sh", timeout=180)
print(r.stdout)
# 输出形如:
# DSH_WEB_TOKEN=<token>
# DSH_WEB_LAUNCH_URL=http://127.0.0.1:8080/?token=<token>
token = re.search(r"DSH_WEB_TOKEN=(\S+)", r.stdout).group(1)
用 SDK 端口代理把沙箱内 8080 端口映射为公网可访问地址。默认平台域名(*.e2b.fc.aliyuncs.com)下该地址仅适合 curl / SDK 层验证,Web UI 无法在浏览器中使用;要在浏览器中使用 Web UI,须先绑定自定义域名,参见浏览器访问:
host = sandbox.get_host(8080)
print(f"https://{host}/?token={token}")
输出的 URL 含 ?token=,等同于访问凭据,不要分享或记录带 token 的 URL(浏览器历史、终端输出、代理日志都可能留存)。首次访问建立会话后,改用不带 ?token= 的 URL 继续访问。
DEEPSEEK_API_KEY 未注入时,start.sh 非零退出并提示通过 envs 注入。
浏览器访问(自定义域名 + --trusted-host)
默认平台域名(*.e2b.fc.aliyuncs.com)下 Web UI 无法在浏览器中使用,原因有二:
-
平台对默认域名的 HTTP 响应强制添加
Content-Disposition: attachment,浏览器打开会下载 HTML 文件而非渲染页面。 -
dsh对/api请求设有浏览器信任栅栏,默认只信任 loopback 主机名;经平台域名代理访问时 Host 不被信任,/api全部返回 403,页面为空壳。
默认域名仅适合 curl / SDK 层验证:不带 token 访问返回 401(dsh 原生鉴权提示),带 token 访问返回 303 并签发会话 cookie,携带 cookie 再访返回 200。
要在浏览器中使用 Web UI,须先绑定自定义域名,并在启动时通过 --trusted-host 把公网主机名加入信任列表:
-
绑定自定义域名:控制台添加域名、DNS 解析与 HTTPS 证书的完整步骤见云沙箱自定义域名。要点:配置控制链路域名
api.<你的自定义域名>与数据链路泛域名*.<你的自定义域名>,证书须覆盖泛域名,域名需按所在地域要求完成备案。 -
SDK 换用自定义域名:将
OPTS替换为与控制台一致的配置(api_key须为绑定该域名同一账号下的 Key),后续Template.build(...)、Sandbox.create(...)等所有调用均使用新的OPTS。替换OPTS后需重新执行Sandbox.create(...)创建沙箱,本步骤的sandbox.get_host(8080)才会返回自定义域名下的主机名:OPTS = { "api_key": "<你的 E2B API Key>", "api_url": "https://api.<你的自定义域名>", "domain": "<你的自定义域名>", } -
带
--trusted-host启动并访问:start.sh额外参数原样透传给dsh web,将sandbox.get_host(8080)返回的公网主机名传入:host = sandbox.get_host(8080) # 8080-<sandbox_id>.<你的自定义域名> r = sandbox.commands.run( f"/opt/deepseek-harness/start.sh --trusted-host {host}", timeout=180, ) token = re.search(r"DSH_WEB_TOKEN=(\S+)", r.stdout).group(1) print(f"https://{host}/?token={token}")
浏览器打开输出的 URL 即可使用 Web UI。首次进入会弹出 Internal Testing Notice(DeepSeek Harness 0.1 内测期提示),单击 Continue 关闭;必须先选 workspace 才能对话(单击 Choose workspace 选择一个目录),之后模型流式回复,界面含思考过程折叠与每轮 Token 用量统计。输出的 URL 同样含 token,按凭据处理;首次访问建立会话后,改用不带 ?token= 的 URL 即可。
关于 --trusted-host 与鉴权:
-
加入信任列表只影响信任栅栏,鉴权不变:不带 token 访问仍返回 401,首次访问后由会话 cookie 承接(30 天有效)。
-
可重复传入多个主机名;条目带端口号时精确匹配,不带端口号时匹配任意端口。
-
dsh重启后 token 会变化,已签发的浏览器会话 cookie 仍有效。
排障:若访问返回代理层 403(JSON 错误体),带 X-Access-Token: <sandbox._envd_access_token> 请求头重试。_envd_access_token 是 Python SDK 的内部属性(e2b==2.31.0 实测可用,后续版本可能重命名或移除),对应 Sandbox Access Token,随沙箱销毁失效。
销毁沙箱
任务完成后释放资源(会一并结束沙箱内的 dsh web 进程):
sandbox.kill()
环境概览
|
项目 |
规格 |
|
操作系统 |
Debian 13 |
|
|
|
|
自带 Node |
v22.22.3( |
|
系统 Node |
v20.x |
|
默认用户 / 工作目录 |
|
Profile 能力约定
|
Profile |
用法 |
说明 |
|
|
|
执行单任务,打印最终答案后退出 |
|
|
|
Web UI,Token 鉴权;脚本固定监听 |
|
|
|
JSON-RPC stdio,供 SDK client 接入 |
|
|
|
独立极简 agent 配置树 |
|
|
|
ACP stdio,供自动化 client 接入 |
headless 与 web 为本页流程所用 profile;sdk、sdk-minimal、acp 说明来自镜像内 dsh README(/home/user/.dsh/lib/node_modules/@deepseek-ai/dsh/README.zh.md),内置 profile 在首次使用时自动初始化。其他 profile 通过 dsh plugin --profile <name> <pnpm args> 管理;运行命令所在目录即默认 workspace 根目录。