deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:Visol-456/dsh-llm-fallback
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
English | 中文
DeepSeek Harness 的 provider fallback chain 插件——当主 provider 失败时,同一请求会自动在下一个配置的 (provider, model) 条目上重试,限流、超时或临时不可用的 provider 不会直接终结一轮对话。
DeepSeek Harness
dsh-plugin生态的社区插件,不属于官方仓库。
由于众所周知的原因,deepseek要涨价了,对于我一个学生直接用不起了,于是只能去投奔opencode-go。然而,opencode-go的海外链接非常不稳定,挂了代理都不行,在长程任务中经常出错暂停,单 provider 部署在服务不稳定时会直接失败:
本插件为每条链维护一份按优先级排序的 (provider, model) 路由表,跟踪连续可切换失败(熔断器),并自动把请求故障切换到下一个健康条目。后续请求会继续使用当前服务条目,直到冷却结束、对链头的一次探测成功为止。
npm i @visol-456/dsh-llm-fallback
在 cordis.yml 中挂载插件:
- name: '@visol-456/dsh-llm-fallback'
config:
fallbacks:
- provider: pi-ai
model: glm-4.5
switchCodes: [EMPTY_RESPONSE, RATE_LIMIT, SERVER, UNKNOWN_MODEL, TIMEOUT, TRANSPORT]
failureThreshold: 1
cooldownMs: 30000
请求本身永远是链头(你在 UI 里选的 provider/model,或部署默认值),永不被改写。fallbacks 列出请求失败后按顺序切换的备用目标。省略 fallbacks 键合法且插件保持休眠,所有请求原样放行;等你在 Web 界面的 Settings -> 回退链 页保存备用目标之后再生效。
dsh plugin add(推荐)本包声明了 dsh.bundle,安装后会作为 profile 层自动激活(无需手写 patch 文件——随包附带的 cordis.patch.yml 会以无备用目标挂载插件,目标在 UI 里创建):
dsh plugin --profile web add @visol-456/dsh-llm-fallback
创建一个覆盖层文件(是 patch 列表,不是裸条目列表),用 --patch 应用:
# cordis.yml
- insert:
- id: llm-fallback
name: '@visol-456/dsh-llm-fallback'
dsh web --patch ./cordis.yml
每个挂载条目必须有 id。
新增条目必须放在顶层 - insert: 列表里(参照 harness 的 examples/web-schedule/cordis.yml)。
裸条目列表会被静默拒绝:报 patch: id is required for non-insert patches / entry "xxx" not found,而且 dsh web 启动不打印任何错误(只有一行 dsh web: http://...)。
用以下命令诊断组合配置树(含 patch 错误):
node --import tsx/esm apps/cli/src/bin.ts web --dump-config --patch <file>
$DSH_HOME/profiles/node_modules 是 launcher 维护的 bundle 回退目录,不参与 cordis.yml 条目的裸 import 解析(loader 从 harness 源码位置向上走 Node 标准 node_modules 解析)。本地挂载未发布的 checkout,必须把 junction 建在 harness 根 node_modules:
New-Item -ItemType Junction -Path 'E:\python_programs\deepseek-harness\node_modules\@visol-456\dsh-llm-fallback' -Target 'E:\python_programs\llm-fallback'
然后按名字挂载(见上)。不再需要时删除 junction。
web profile 的 base bundle 已经自带 @deepseek-ai/dsh-llm-retry,重复挂载会叠加一层重试。只需挂 llm-fallback 一条——waterfall 顺序(先重试后回退)天然正确。
发布不足 24 小时的包会被 pnpm 的 minimumReleaseAge 拦截(ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION);失败的 pnpm add 还可能改动官方仓库的 pnpm-workspace.yaml(用 git restore pnpm-workspace.yaml 恢复)。当天安装要么等 24 小时,要么走上面的 junction 方式。
dsh web 起不来(或浏览器打到旧实例)时,找到并结束旧进程:
netstat -ano | findstr :3080
taskkill /PID <pid> /F
所有键都是顶层(不再有 chains/match):
fallbacks(需要路由时必填,至少一条):按顺序排列的 (provider, model) 备用目标,请求失败后切换过去。请求本身是链头,永不被改写;条目不得重复 (provider, model) 组合。省略 fallbacks 键合法且插件保持休眠(可在 Settings -> 回退链 页创建,或写入 <DSH_HOME>/settings.yaml)。switchCodes(默认 EMPTY_RESPONSE, RATE_LIMIT, SERVER, UNKNOWN_MODEL, TIMEOUT, TRANSPORT,覆盖瞬时故障与配置错误类):允许触发切换的失败码;其他错误码永不切换。failureThreshold(默认 1):链头(或某个 fallback)上的连续合格失败数达到该值即打开熔断;冷却探测失败则无条件打开。cooldownMs(默认 0):切换后链头在多长时间内保持排除、之后才可被再次探测。建议:把
cooldownMs设为至少30000。默认0意味着每个请求都会先探测链头,故障期间每个请求都会先在链头上失败一次,再被备用条目接管。
破坏性变更(0.1.x):配置曾用过
chains[]里的providers(0.1.0)或match+fallbacks(更早的 0.1.1 快照)。这些都没了:链头永远是请求本身,只需顶层fallbacks列表(加上切换规则)。迁移:chains: [{ match: { provider: A.provider, model: A.model }, fallbacks: [B, C] }]→fallbacks: [B, C]。加载含旧chains/match/providers键的配置会报清晰弃用错误。
非空配置非法时,插件加载(或经 settings seam 保存时)会直接报错。
fallbacks 列表上重试。switchCodes 内时才计。failureThreshold(或冷却探测失败)时,同一请求在 fallbacks[0] 上重试;之后每个 fallback 失败依次切到下一个。ctx.llm.stream():每次 adapter 调用仍是一次 provider 尝试,每次链尝试都会在同一份持久历史之上开启新的编号轮次。两个事件都是持久会话事件,永不呈现给模型。
llm/fallback——每次切换时追加。载荷:turn、step、headProvider、headModel、fromProvider、fromModel、toProvider、toModel、reason(threshold | probe)、failure、cooldownMs。llm/fallback-route——每次请求实际由 fallback 目标服务时追加。载荷:turn、step、headProvider、headModel、provider、model(head = 触发路由的那个请求)。fallbacks 列表;失败按实际服务的 (provider, model) 归因,一个 agent 的成功不会清除另一个 agent 的待定计数。ctx.llm.stream() 的消费者仍是单 provider。always 的 provider 会自己重试一切,fallback 看不到它的失败。无需手写 cordis.yml,也可以在 Harness 的 Web 界面里编辑备用目标。插件加载到 dsh web profile 后,Settings 面板会出现一个 回退链(Fallback)页面(与 Models 并列):
11111 这类不存在的 model),上移/下移/删除按钮在行内右侧;切换错误码(宽输入框)、失败阈值与冷却时间在下方同一对齐网格里,然后点击 保存。deepseek-official 显示为 DeepSeek),休眠的 pi-ai 目录路由(如没有配置段的 deepseek)不会出现,避免同名/近名 provider 互相混淆。provider 只有一个 model 时自动选中它,选完即可保存。<DSH_HOME>/settings.yaml,并在下一次请求生效(无需重启)。解析顺序为 schema 默认 → cordis.yml 条目 → 已保存的 UI 段,因此 UI 保存优先,cordis.yml 未写的字段回落到默认值。cordis.yml 行为(若条目无链则回到休眠模式)。浏览器通过插件在共享 web server 上提供的仅回环端点(/llm-fallback/config)读写该段。端点拒绝非回环来源与跨站请求;它是防误写/防跨站围栏,不是鉴权层。当 web server 绑定 0.0.0.0 时局域网客户端无法写入,但仍不建议将该端点暴露给不受信网络。
MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。