本文提供 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 根目錄。