🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

云端沙箱代理 dorisgyl/dsh-cloud

DeepSeek Harnessv0.0.1
dorisgyl73 天前有提交已提供中文文档扫描:含敏感能力

云端托管的 DeepSeek Harness 跑在 Cloudflare 上——会话放在 Durable Objects,工具放在沙箱里。

36.1/100
综合分
16
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dorisgyl/dsh-cloud
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · tool
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 73 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-cloud @ 0.0.1
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/1 18:26:19

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 60 处,展示前 42 条)
  • 请求外部主机exec
    packages/cf-exec-provider/src/fs.mjs:84
    response = await this.exec.fetch('http://exec/fs', {
  • 发起网络请求
    packages/cf-exec-provider/src/fs.mjs:84
    response = await this.exec.fetch('http://exec/fs', {
  • 请求外部主机exec
    packages/cf-exec-provider/src/shell.mjs:71
    const response = await this.exec.fetch('http://exec/exec', {
  • 发起网络请求
    packages/cf-exec-provider/src/shell.mjs:71
    const response = await this.exec.fetch('http://exec/exec', {
  • 请求外部主机exec
    packages/cf-exec-provider/src/subprocess.mjs:50
    const response = await this.exec.fetch('http://exec/exec', {
  • 发起网络请求
    packages/cf-exec-provider/src/subprocess.mjs:50
    const response = await this.exec.fetch('http://exec/exec', {
  • 请求外部主机exec
    packages/cf-exec-provider/src/subprocess.mjs:111
    const response = await this.exec.fetch(`http://exec/terminal?${query}`, {
  • 发起网络请求
    packages/cf-exec-provider/src/subprocess.mjs:111
    const response = await this.exec.fetch(`http://exec/terminal?${query}`, {
  • 请求外部主机exec
    packages/cf-exec-provider/src/subprocess.mjs:158
    const response = await this.exec.fetch('http://exec/exec', {
  • 发起网络请求
    packages/cf-exec-provider/src/subprocess.mjs:158
    const response = await this.exec.fetch('http://exec/exec', {
  • 发起网络请求
    packages/cf-plugin-host/src/index.mjs:178
    const response = await this.worker(row).getEntrypoint().fetch(
  • 发起网络请求
    packages/cf-web-browser-run/src/index.mjs:225
    async fetch(request, signal) {
  • 发起网络请求
    packages/cf-web-browser-run/src/index.mjs:309
    return fetch(endpoint, {
  • 发起网络请求
    packages/cf-web-search-duckduckgo/src/index.mjs:259
    response = await fetch(`${this.endpoint}?q=${encodeURIComponent(query)}`, {
  • 发起网络请求
    packages/cf-web-search-tavily/src/index.mjs:86
    response = await fetch(ENDPOINT, {
  • 请求外部主机exec
    packages/cf-workspace-picker/src/index.mjs:38
    const response = await this.exec.fetch('http://exec/fs', {
  • 发起网络请求
    packages/cf-workspace-picker/src/index.mjs:38
    const response = await this.exec.fetch('http://exec/fs', {
  • 请求外部主机cdn-cgi
    units/edge/src/index.mjs:75
    const response = await fetch(`https://${env.ACCESS_TEAM_DOMAIN}/cdn-cgi/access/get-identity`, {
  • 发起网络请求
    units/edge/src/index.mjs:75
    const response = await fetch(`https://${env.ACCESS_TEAM_DOMAIN}/cdn-cgi/access/get-identity`, {
  • 请求外部主机session
    units/edge/src/index.mjs:100
    const verdict = await admission.fetch('http://session/admission', {
  • 发起网络请求
    units/edge/src/index.mjs:100
    const verdict = await admission.fetch('http://session/admission', {
  • 发起网络请求
    units/edge/src/index.mjs:191
    async fetch(request, env) {
  • 发起网络请求
    units/edge/src/index.mjs:244
    const response = await env.ASSETS.fetch(request)
  • 请求外部主机cdn-cgi
    units/edge/src/index.mjs:295
    const response = await fetch(`https://${env.ACCESS_TEAM_DOMAIN}/cdn-cgi/access/get-identity`, {
  • 发起网络请求
    units/edge/src/index.mjs:295
    const response = await fetch(`https://${env.ACCESS_TEAM_DOMAIN}/cdn-cgi/access/get-identity`, {
  • 请求外部主机session
    units/edge/src/index.mjs:411
    const response = await admission.fetch('http://session/admission-state' + url.search, {
  • 发起网络请求
    units/edge/src/index.mjs:411
    const response = await admission.fetch('http://session/admission-state' + url.search, {
  • 请求外部主机session
    units/edge/src/index.mjs:433
    const verdict = await env.SESSION.get(ledgerId).fetch('http://session/budget/check', {
  • 发起网络请求
    units/exec/src/index.mjs:148
    async fetch(request, env) {
  • 读取本地文件
    units/session-do/m1-assemble.mjs:10
    const specifiers = Object.keys(JSON.parse(readFileSync('../../scripts/u2-deps.json', 'utf8')))
  • 请求外部主机session
    units/session-do/src/index.mjs:407
    const response = await this.env.SESSION.get(id).fetch('http://session/plugin-store', {
  • 发起网络请求
    units/session-do/src/index.mjs:407
    const response = await this.env.SESSION.get(id).fetch('http://session/plugin-store', {
  • 发起网络请求
    units/session-do/src/index.mjs:811
    return await exec.fetch(...args)
  • 发起网络请求
    units/session-do/src/index.mjs:903
    async fetch(request) {
  • 请求外部主机exec
    units/session-do/src/index.mjs:1194
    const response = await this.env.EXEC.fetch('http://exec/exec', {
  • 发起网络请求
    units/session-do/src/index.mjs:1194
    const response = await this.env.EXEC.fetch('http://exec/exec', {
  • 发起网络请求
    units/session-do/src/index.mjs:1240
    const direct = await fetch(target, {
  • 发起网络请求
    units/session-do/src/index.mjs:1288
    const response = await this.env.EXEC.fetch(
  • 请求外部主机session
    units/session-do/src/index.mjs:1446
    const response = await store.fetch(`http://session/plugin-store?id=${encodeURIComponent(id)}`, {
  • 请求外部主机session
    units/session-do/src/index.mjs:1478
    const response = await store.fetch('http://session/plugin-store', {
  • 请求外部主机plugin
    units/session-do/src/index.mjs:1565
    const response = await worker.getEntrypoint().fetch(new Request('http://plugin/'))
  • 请求外部主机exec
    units/session-do/src/index.mjs:1703
    const response = await this.env.EXEC.fetch(`http://exec/${op}`, {
扫描于 2026/11/3(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库
涉及外部主机:exec、cdn-cgi、session、plugin

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 云端托管运行
  • 工具置于沙箱

README

由 DeepSeek 最新模型翻译生成
dsh-cloud 在 Cloudflare 上运行 DeepSeek Harness。 无服务器,空闲时休眠,而且关掉标签页后照样继续干活。 非官方。 与 DeepSeek 没有关联。这是第三方把他们的开源智能体框架移植到 Cloudflare Workers 的版本。 部署到你自己的 Cloudflare 账号。账号和模型密钥都由你提供;这里不会让你注册我们的任何东西。 https://github.com/user-attachments/assets/2fb87efd-3530-4392-94ae-f9161183ea47 dsh-cloud demo 36 秒:智能体写出 primes.js,用 node 运行,然后展示输出——模型、文件系统和 shell 在同一轮里跑通,而且是在一个线上部署上。 试试 demo <https://dsh-cloud-demo.nevoflux.app/> 用 GitHub 登录,然后给这个仓库点 star——这个部署只放行给它点过 star 的 GitHub 账号,其他人一律不放。star 列表大约每分钟刷新一次,所以刚点的 star 要等一会儿才生效。 这道门槛不是摆设;它就是下文要讲的准入控制,正在运行。智能体每跑一轮模型、每占用一秒容器、每占用一秒浏览器,都得有人掏钱,而这个部署上掏钱的只有一个人。
展开完整文档(README 剩余 1 节)
dsh-cloud

在 Cloudflare 上运行 DeepSeek Harness。
无服务器,空闲时休眠,而且关掉标签页后照样继续干活。

非官方。 与 DeepSeek 没有关联。这是第三方把他们的开源智能体框架移植到 Cloudflare Workers 的版本。

部署到你自己的 Cloudflare 账号。账号和模型密钥都由你提供;这里不会让你注册我们的任何东西。

https://github.com/user-attachments/assets/2fb87efd-3530-4392-94ae-f9161183ea47

dsh-cloud demo

36 秒:智能体写出 primes.js,用 node 运行,然后展示输出——模型、文件系统和 shell 在同一轮里跑通,而且是在一个线上部署上。

试试 demo

<https://dsh-cloud-demo.nevoflux.app/>

用 GitHub 登录,然后给这个仓库点 star——这个部署只放行给它点过 star 的 GitHub 账号,其他人一律不放。star 列表大约每分钟刷新一次,所以刚点的 star 要等一会儿才生效。

这道门槛不是摆设;它就是下文要讲的准入控制,正在运行。智能体每跑一轮模型、每占用一秒容器、每占用一秒浏览器,都得有人掏钱,而这个部署上掏钱的只有一个人。

状态:开发中

今天能跑起来的东西,已在真实部署上验证:

| 上游智能体代码树能在 Worker 里组装 | 能——88 个包,266 ms |
| 轮次在 Durable Object 里运行,客户端离开也不中断 | 能 |
| 会话日志持久化到 Durable Object SQLite | 能 |
| 边缘接入 Cloudflare Access,并按用户分片 | 能 |
| 接真实模型 | 能——Workers AI,不需要 API key |
| Shell——在 Cloudflare 容器里跑真实命令 | 能 |
| 文件——读 / 写 / 编辑,和 shell 共用同一个执行环境 | 能 |
| 终端——真实 PTY,状态跨轮次保留 | 能,但默认的 bash 工具仍是一次性的 |
| dsh web UI | 能——已提供,协议端到端可用 |
| 第三方插件,无需重新部署即可安装 | 能——相互隔离,自身没有网络(packages/cf-plugin-hostins.md) |
| 容器回收后工作区文件仍保留 | 不能——见「限制」 |
对照上游 harness 的逐项功能比较见 docs/parity.md,其中也说明了哪些功能是刻意不做的,以及原因。

限制

容器被回收后,工作区文件不会保留。 Cloudflare 容器会休眠并被回收,之后 /workspace 会从镜像重新恢复成初始状态。智能体几分钟前写入的文件直接消失,而工作区记录——存在 Durable Object SQLite 里——还在,指向一个已经不存在的目录。

所以工作区只在创建它的那个会话内有用,出了会话就不行。设计 6.3 已经为此做了规划(租约加快照休眠,由 Sandbox SDK 的 createBackup/restoreBackup 承载);目前还没实现。这里的 Web UI 只是演示,如果你想把它当成更正式的东西用,这条限制最关键。

每个 Access 用户相互隔离,这部分是真的。 边缘节点完全根据校验过的 Access 声明推导出 Durable Object 名称——tenant/<tenant>/user/<user>/session/<id>——所以每个用户都有自己的对象、自己的 SQLite、自己的容器。用户无法访问别人的对象:调用方只能提供 session 段,而且只能在自己前缀之内。同一用户的多个会话共用该用户的容器,这是有意为之。

单一模型、单一区域、没有配额。 没有按用户限流,没有消费上限,也没有准入控制。把部署开放给公众,就意味着它被要求做什么,你就要为什么付费。

层级

执行层可插拔,三个层级都是同一份构建——层级由存在哪些绑定决定,而不是由你编译哪份代码决定。

| 层级 | 执行后端 | 你需要 | 能力 |
| Minimal | 无 | Workers Paid | 聊天 + Web 工具 |
| Standard | Cloudflare Containers | + 容器镜像 | 完整 shell / 文件 / 终端 |
| Alternative | E2B | + E2B key | 完整 shell / 文件,不用 Containers |

目前只有 minimal 层级可用。

前置条件

- Node 22+、pnpm、wrangler
- 一个 Workers Paid 套餐的 Cloudflare 账号($5/月起)

免费套餐每次调用只给 10 ms CPU。实测一次针对真实模型的智能体轮次要花 ~49 ms,所以免费套餐的部署连一轮都跑不完。(桩模型只要 4–8 ms,所以这个限制很容易被忽略,直到接上真实模型才会暴露。)Cloudflare 托管的 DeepSeek 模型同样只对付费套餐开放。
- 一个你能控制的域名。不要部署在 .workers.dev 上——某些网络会直接屏蔽它,而且浏览器端看不到任何失败迹象。

部署

三个 Worker,按依赖顺序部署。构建步骤不是可选项:每个 wrangler.jsonc 里的 main 都指向生成的 bundle,而 wrangler deploy 并不知道这一点——它会心安理得地发布一份过期的 bundle,报告成功,然后给你一个对应旧代码的新版本 ID。

bash
git clone <this repo> && cd dsh-cloud
pnpm install

npm run deploy:exec # the container: shell, files, terminal
npm run deploy:do # the session object; the edge binds to it by name
npm run deploy:edge # the edge; builds the client graph, then deploys

npm run deploy 会执行后两条。每个脚本都会先跑一遍打包器。

这两个要一起部署。 浏览器和智能体说的是同一套带版本号的协议,而上游会在版本之间往协议里加必填字段——客户端渲染任何东西之前都会先调 host.describe,遇到解析不了的响应就直接抛错。只更新其中一半,结果是一片白页加控制台里一条报错,而不是部分更新的部署。

跳过 deploy:exec 会留下一个能跑但没有执行世界的部署:shell、文件系统和终端这几处接缝没人填,对应的工具也永远不会注册。这是一个受支持的层级,不是坏掉的部署——见上面的表格——但这是一个选择,所以要有意识地做。

绑定你的主机名

每个单元都带着 workers_dev: false 发布。给 dsh-edge 加一个自定义域名或路由(Workers & Pages → dsh-edge → Settings → Domains & Routes)。另外两个只能通过它访问,必须保持从公网不可达:dsh-session-do 和 dsh-exec 会运行任意代码。

不要在 .workers.dev 上部署——某些网络会直接封掉它,而且从浏览器里看不出失败:fetch 在 WebSocket 升级之前就挂了,所以 Worker 的日志里什么都收不到,看起来就像服务挂了。

用 Cloudflare Access 保护它

账号上必须启用 Zero Trust。

用基于主机名的应用,不要用 Worker 的 Access 标签页。
Worker 级别的 Access 策略不支持 WebSocket:对这样保护的 Worker 发起升级请求会返回 403。这个应用基于 WebSocket,所以 Worker 级别的 Access 会把它弄坏,而配置看上去还是对的。

在 Zero Trust → Access → Applications → Self-hosted 里创建,应用域名填你的主机名,再给需要登录的人加一条 Allow 策略。机器访问——CI、脚本化测试——再加一条策略,Action: Service Auth,配一个服务令牌。(Service Token 选择器只有在 action 是 Service Auth 之后才会出现,很容易漏掉。)

然后把 edge 指向那个应用: bash
npx wrangler secret put ACCESS_TEAM_DOMAIN --config units/edge/wrangler.jsonc
npx wrangler secret put ACCESS_AUD --config units/edge/wrangler.jsonc

这两个都是密钥,不是变量。同名的变量会悄悄覆盖密钥,所以这个文件的早期版本——在 wrangler.jsonc 里带着某次部署的真实值——会让每个克隆都指向别人的 Access 应用,不管操作者设了什么。

没有它们,edge 会返回 503 access-not-configured,而不是提供一个未受保护的智能体。想确认某个主机名背后实际是哪个应用,又不想登录: bash
curl -s -o /dev/null -w "%{redirect_url}
" https://<your-host>/api/version

重定向里的 kid= 就是该主机名真正使用的 AUD。

代码里没有任何需要配置的地方。请求到达 Worker 之前,访问就已经完成认证,身份以运行时 API 的形式送达。边缘把它化简为 tenant / user / scopes,并据此推导出每个 Durable Object 的名字——客户端从不提供名字的任何部分,因此无法访问其他用户的会话。人工登录和服务 token 都能用,且各自分到独立的 shard。

从干净克隆验证

这条路径在 2026-08-18 完整走了一遍:全新 git clone、pnpm install,加上上面三条命令,用 -probe 名字部署到第二组 Workers 上,然后拆除。三个都部署成功;SPA 及其资源正常提供;API 返回 503 access-not-configured,这正是未接入 Access 的部署应有的表现。

它发现了一个 bug,而这正是这次演练的目的。那个 503 只出现在 /api 上,所以没有 Access 应用的部署会把整个 UI 提供给互联网,而它的 API 却拒绝服务——从任何现有部署都看不出来,因为它们全都配置了 Access,而未配置的路径从未在任何地方跑过。现在,未受保护的部署什么都不提供。

有两处偏差,都是在同一账号上测试的产物:Workers 被重命名,workers_dev 被打开以获得可访问的 URL。Access 应用本身没有重建,所以本节中已配置的那一半仍未从零验证。

其余都是可选的

上面的部署能跑。下面每一项都增加一种能力,没有一项是必需的;除标注外,每一项都是 secret。

模型 —— Workers AI 是零配置默认项,什么都不需要。

| AI_MODEL(var) | 覆盖默认的 Workers AI 模型 |
| DEEPSEEK_API_KEY | DeepSeek 的 API,以及跑在它上面的 web_search 服务商 |

Web 访问 —— web_fetch 开箱即用,走 browser 绑定,用 Browser Run 的默认浏览器,按浏览器时长计费。

| CF_ACCOUNT_ID + BROWSER_RUN_TOKEN | 改用 REST 上的 Kitesurf——beta 期间免费,每次抓取约慢 2.5 倍 |
| WEB_TRANSPORT=binding(var) | 拒绝 Kitesurf,保留更快的默认项 |
| TAVILY_API_KEY | 第二个 web_search 服务商。有两个可用服务商时,需要用 DSH_WEB_SEARCH_PROVIDER 指定其中一个,否则每次搜索都会因歧义失败 |

限制 —— 四个计量器默认全部开启,按用户计。0 表示禁用某一项。

| | 默认值 |
| LIMIT_REQUESTS_PER_MINUTE | 240 |
| LIMIT_MODEL_TURNS_PER_DAY | 100 |
| LIMIT_CONTAINER_MS_PER_DAY | 900000 |
| LIMIT_BROWSER_MS_PER_DAY | 300000 |
| SESSION_RETENTION_DAYS(var) | 3 —— 闲置这么久的会话会被整体丢弃 |
准入控制 —— 默认关闭,除非你主动要求。

| ADMISSION_REQUIRE_STAR=1(edge) | 要求 GitHub 登录账号给仓库点过 star |
| GITHUB_REPO(var) | 指定哪个仓库。默认是本仓库,对你的 fork 来说这个默认值是错的 |
| GITHUB_TOKEN | 开启准入后必填:GET /stargazers 未认证时一律返回 401,任何仓库都一样。不带任何 scope 的 token 就够用 |
| ADMISSION_BYPASS_USERS(edge) | 跳过 star 检查的账号。默认为空 |
| ADMIN_USERS(session object) | 可以为所有用户安装插件的账号。故意用另一份名单 |

其余变量,一并列出以求完整 —— 代码读取的所有变量都在这里,因为只存在于源码里的变量,没人找得到。

| ADMISSION_TTL_MS | star 被取消后还能继续生效多久。默认 60000 |
| DSH_WEB_FETCH_PROVIDER / DSH_WEB_SEARCH_PROVIDER(vars) | 有多个服务商可用时,指定用哪一个 |
| DEEPSEEK_SEARCH_BASE_URL | 搜索端点,与对话端点不同 |
| WEB_SEARCH_DUCKDUCKGO=1 | 一个无需密钥的搜索服务商,但用不了:DuckDuckGo 对 Worker 返回 522,对容器返回机器人验证。保留在 cf-web-search-duckduckgo 中,连同实测数据 |
| TENANT(var) | 分片名称。除非你跑多个分片,否则是 default |
| DEV_IDENTITY | 仅用于本地开发;只要配置了 Access 就会被忽略 |

开启准入时,按不会把自己锁在外面的顺序来:先给仓库点 star,再设置 GITHUB_TOKEN,然后检查 /api/admission-check(这个接口不受准入限制,因为被拒绝不能等于查不到被拒绝的原因),最后才设置 ADMISSION_REQUIRE_STAR。wrangler secret delete ADMISSION_REQUIRE_STAR 是回到原状的退路,它不依赖你能否登录。

本地运行 bash
node scripts/m0-bundle.mjs && node scripts/build-edge.mjs
npx wrangler dev -c units/edge/wrangler.jsonc -c units/session-do/wrangler.jsonc \
--port 8811 --local --var DEV_IDENTITY:localdev

curl http://127.0.0.1:8811/api/whoami
curl "http://127.0.0.1:8811/api/?q=hello" # queues a turn
curl http://127.0.0.1:8811/api/state # watch the log grow

DEV_IDENTITY 之所以存在,是因为 Access 挡在部署实例前面,而不是挡在 wrangler dev 前面。只有在 Access 未配置时才会读取它,所以已部署的实例不会因为忘了加某个 flag 就掉进这个身份。

成本

空闲成本接近 Workers Paid 的下限:Durable Objects 休眠期间不计时长费,唯一的常驻成本是存储字节数。

空闲和干活是两回事。 一轮对话运行期间 —— 包括你关掉标签页之后 —— 会计时长、CPU 和模型 token。空闲几乎免费;干活就该花干活的钱。

精确数字随 M1 和 M2 一起给出;设计上把它们当作交付物,而不是事后补的东西。

模型访问

BYOK,分三步,投入逐级递增:
1. 什么都不用 —— Workers AI,完全不需要密钥。Cloudflare 托管 DeepSeek 自家的模型,所以默认配置不需要第三方账号。用 AI_MODEL 覆盖
2. 部署时用 wrangler secret put —— 常规做法
3. 在 UI 里,按租户加密存储 —— 适合团队,也适合频繁切换

出站流量默认走 AI Gateway,白送你用量和成本的可视化。自托管或 OpenAI 兼容端点支持自定义 base URL。

许可证

MIT。见 LICENSE。
预览分享卡片长什么样 ↓dorisgyl/dsh-cloud
分享 · DeepSeek Harness Hub
dorisgyl/dsh-cloud

云端托管的 DeepSeek Harness 跑在 Cloudflare 上——会话放在 Durable Objects,工具放在沙箱里。

这是你的仓库?认领条目

回到顶部