DeepSeek 模板

更新时间:
复制 MD 格式

本文提供 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

fc-e2b-registry.cn-beijing.cr.aliyuncs.com/runtime/deepseek-harness:v0.0.52

cn-shenzhen

fc-e2b-registry.cn-shenzhen.cr.aliyuncs.com/runtime/deepseek-harness:v0.0.52

ap-southeast-1

fc-e2b-registry.ap-southeast-1.cr.aliyuncs.com/runtime/deepseek-harness:v0.0.52

cn-hongkong

fc-e2b-registry.cn-hongkong.cr.aliyuncs.com/runtime/deepseek-harness:v0.0.52

cn-shanghai

fc-e2b-registry.cn-shanghai.cr.aliyuncs.com/runtime/deepseek-harness:v0.0.52

cn-hangzhou

fc-e2b-registry.cn-hangzhou.cr.aliyuncs.com/runtime/deepseek-harness:v0.0.52

us-east-1

fc-e2b-registry.us-east-1.cr.aliyuncs.com/runtime/deepseek-harness:v0.0.52

us-west-1

fc-e2b-registry.us-west-1.cr.aliyuncs.com/runtime/deepseek-harness:v0.0.52

推荐构建规格: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

dsh: MISSING_CREDENTIAL: llm-deepseek: no API key for provider route "deepseek-official"; store DEEPSEEK_API_KEY through the credentials service (the web Models page writes it), or export DEEPSEEK_API_KEY in the launching environment

Key 无效

dsh: AUTH: Authentication Fails, Your api key: ****3000 is invalid(3000 为无效 Key 的末 4 位,随实际 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 无法在浏览器中使用,原因有二:

  1. 平台对默认域名的 HTTP 响应强制添加 Content-Disposition: attachment,浏览器打开会下载 HTML 文件而非渲染页面。

  2. dsh 对 /api 请求设有浏览器信任栅栏,默认只信任 loopback 主机名;经平台域名代理访问时 Host 不被信任,/api 全部返回 403,页面为空壳。

默认域名仅适合 curl / SDK 层验证:不带 token 访问返回 401(dsh 原生鉴权提示),带 token 访问返回 303 并签发会话 cookie,携带 cookie 再访返回 200。

要在浏览器中使用 Web UI,须先绑定自定义域名,并在启动时通过 --trusted-host 把公网主机名加入信任列表:

  1. 绑定自定义域名:控制台添加域名、DNS 解析与 HTTPS 证书的完整步骤见云沙箱自定义域名。要点:配置控制链路域名 api.<你的自定义域名> 与数据链路泛域名 *.<你的自定义域名>,证书须覆盖泛域名,域名需按所在地域要求完成备案。

  2. 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": "<你的自定义域名>",
    }
  3. 带 --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

dsh 路径

/home/user/.dsh/bin/dsh(0.1.5-rc.1,rc 版本,行为可能随上游变动)

自带 Node

v22.22.3(/home/user/.dsh/tools/node/bin/node,dsh 不依赖系统 Node)

系统 Node

v20.x

默认用户 / 工作目录

user / /home/user

Profile 能力约定

Profile

用法

说明

headless

dsh --profile headless "<任务>"

执行单任务,打印最终答案后退出

web

/opt/deepseek-harness/start.sh(或裸 dsh web --no-open)

Web UI,Token 鉴权;脚本固定监听 127.0.0.1:8080,裸 dsh web 默认 127.0.0.1:3080

sdk

dsh --profile sdk

JSON-RPC stdio,供 SDK client 接入

sdk-minimal

dsh --profile sdk-minimal

独立极简 agent 配置树

acp

dsh --profile acp

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 根目录。