DeepSeek Harness 引擎
架构
Portal Chat (Vue 3) → Gateway (:8010) → engine-deepseek-{id}:8649 → 平台 LiteLLM 代理 → DeepSeek v4 Flash
↑
DNS 命名规范路由 (X-Agent-ID 头)DeepSeek Harness 引擎把 dsh CLI(npm 包 @deepseek-ai/dsh,Cordis 插件架构) 包装为 OpenAI 兼容的 HTTP/SSE 服务:容器内 server.py 接收请求,spawn dsh --profile veyraos-sdk 子进程(SDK profile 暴露 newline-delimited JSON-RPC stdio 通道),把 dsh 的 session.event 流式事件翻译成 OpenAI SSE 流给 gateway。 模型不直连 DeepSeek 官方 API,统一经平台 LiteLLM 代理(OpenAI 兼容 endpoint + per-instance key)。
容器构建
- 基础镜像:
python:3.11-slim(终段) - 构建段:
node:20— 全局安装@deepseek-ai/dsh(锁版本0.1.2-rc.1)- 沙箱插件
@veyraos/opensandbox-shell
- 沙箱插件
- 运行时: FastAPI + uvicorn + pyyaml,内置
server.py/entrypoint.sh/ profile 模板 /engines/_shared/profile_isolation.py - 入口:
entrypoint.sh— 校验 dsh CLI、检测沙箱开关、启动 API server(端口 8649)
API 面
| 端点 | 说明 |
|---|---|
GET /health | 健康检查 |
POST /v1/chat/completions | OpenAI 兼容响应:默认/显式 stream:true 为 SSE 流(delta + 工具进度帧 + usage);显式 stream:false 聚合为 chat.completion JSON |
POST/GET /v1/sessions | 创建 / 列举 session |
GET /v1/sessions/{sid}/messages | 读 session 历史 |
DELETE/PATCH /v1/sessions/{sid} | 删 / 改名 session |
POST /v1/sessions/{sid}/stop | 停止该 session 正在运行的推理(幂等) |
GET /v1/models | 当前注入的模型列表 |
GET /v1/files | 列举 profile 默认工作区目录 |
GET /v1/files/content | 读取工作区文件内容(≤1MB 文本) |
SSE 输出契约与 claudecode 引擎一致:delta 帧(content / reasoning_content)、 p 工具进度帧(running→success/error)、末帧 usage、[DONE]、30s keepalive。
多用户隔离
与 claudecode 同机制(engines/_shared/profile_isolation.py):
per-profile UID(20000-29999) ← useradd -r -M -u {uid} -d {profile_dir} deepseek-{name[:25]}
+ chown -R {uid}:{uid} profile 目录
+ chmod 0700 profile 目录
+ spawn dsh 时 preexec_fn 降权
+ cwd = HOME = /opt/data/profiles/{name}
+ DSH_HOME = {profile_dir}/.dsh ← dsh session 日志/settings 按 profile 隔离沙箱(可选)
- 开启条件:Pod env 同时存在
OPENSANDBOX_SERVER_URL与OPENSANDBOX_API_KEY - 开启后 dsh 的 shell 工具执行经插件
@veyraos/opensandbox-shell转发到 OpenSandbox server(建 ephemeral 沙箱 → 执行命令 → 命令结束删除沙箱) - 未开启则 dsh 使用本地 provider(降权 uid 执行),沙箱插件不加载
环境变量
| 变量 | 用途 | 来源 |
|---|---|---|
API_SERVER_KEY | 引擎 API Key | K8s secret |
API_SERVER_PORT | 监听端口(默认 8649) | 固定 |
OPENAI_BASE_URL | 平台 LiteLLM 代理地址 | 平台注入 |
OPENAI_API_KEY | per-instance 模型 Key | 平台注入 |
DSH_MODEL | 默认模型名(deepseek-v4-flash) | 平台注入 |
OPENSANDBOX_SERVER_URL | 沙箱服务地址 | 平台注入(可选) |
OPENSANDBOX_API_KEY | 沙箱服务 Key | 平台注入(可选) |
OPENSANDBOX_IMAGE | 沙箱镜像(默认 ubuntu:22.04) | 平台注入(可选) |
请求头 X-Ua-Profile 指定 profile(sk- API Key 无登录态调用时 gateway 自动按实例 派生 {agent_short}-default 默认 profile);X-Ua-Model-Config 可每请求注入 base_url / api_key / default_model,优先于 Pod env。
人设注入:请求体 messages 里的 system 消息经 DSH_SYSTEM_PROMPT env 进入 dsh 原生 system prompt(sdk-minimal bundle 的 system-prompt 插件读取该 env),不并入用户消息。