← Back to home@modesthub

dsh-sensenova-freeapi

DSH provider plugin for SenseNova with running/blocked dual-list key pool & dual-account rotation

Stars
1
Language
TypeScript
Created
Oct 1, 2026
Updated
Oct 2, 2026
GitHub repo

Introduction

dsh-sensenova-freeapi

简体中文 | English

dsh-sensenova-freeapi 是一个非官方的 DeepSeek Harness(DSH)LLM 提供商插件,基于一切皆插件(everything-is-a-plugin)架构注册 sensenova 提供商路由,对接 SenseNova(OpenAI 兼容 API)。它内置多账户 API-Key 轮换、运行态 / 阻塞态双列表状态机、实时模型目录与 Models 页设置面板,把渠道限流从「错误轰炸」变成「稳定服务」。

DeepSeek Harness × SenseNova

release license

参考实现:@mars-sea/dsh-commandcode-provider(MIT)。本插件只保留多账户连接能力;登录流程、用量面板、套餐窗口、命令行工具均已裁剪。


🚀 快速上手:注册、申请 Key、配置账户

1. 注册 SenseNova 账号

到 https://platform.sensenova.cn/login 注册并登录(支持手机号 / 邮箱)。

2. 在控制台申请多个 API Key

进入控制台 https://platform.sensenova.cn/console,在「API Key 管理」中创建密钥。每个 API Key 对应一次限流额度,多申请几把即可显著提升吞吐。

📷 账户配置界面示意(控制台申请多个 API Key 的位置):

SenseNova 账户配置界面示意图

3. 建议注册 ≥ 2 个账户

SenseNova 的限流额度是账户级 / 端点级的(同一账户内多把 Key 共享同一个额度桶),因此把 API Key 分散到 ≥ 2 个账户才能绕开单账户瓶颈。

  • 2 个账户已足够普通用户使用;需要更高吞吐可继续增加。
  • 本插件运行态/阻塞态双列表 + 账户轮换就是为「多账户」设计的。

4. 建议 API Key 输入顺序:按账户交替

在 Models 页配置 accounts[] 时,把不同账户的 Key 交替排列,例如有 2 个账户 A、B,则填写顺序为:

A1  B1  A2  B2  A3  B3  …(即 121212 交替)

这样每把 Key 之间天然错位,轮换时不会在同一账户内打转,显著降低单账户触顶概率。

  • 可以按需申请更多 Key;开源作者实测使用的是 2 个账户 10 个 API Key(每账户 5 把)达到最优平衡。

5. 推荐模型

以下结论来自垃圾站长程实测校准(2026-09),按首选用途排序:

模型能力 / 说明推荐度
deepseek-v4-flash首选。DeepSeek V4 Flash(0731),任意时段使用都只比 DeepSeek 官方 API 慢一点点;低成本、1M 上下文、支持思考/工具调用⭐⭐⭐⭐⭐
sensenova-6.8-flash-lite6.8-flash-lite 走轻量专属额度池,真视觉(读图、截图唯一可靠)、墙钟最快(26.6× 提速)⭐⭐⭐⭐⭐(读图首选)
kimi-k3月之暗面旗舰多模态 Agent,原生态视觉 + 1M 上下文,适合长程编程/知识工作⭐⭐⭐⭐
glm-5.2智谱长程 Agent,持续吞吐最高(比 deepseek-flash 快 201%、延迟快 45%),但无视觉(读图会幻觉)⭐⭐⭐⭐(纯文本/长程)
⚠️ deepseek-flash(DeepSeek V4.1 Flash)不建议:实测高峰期很慢、低峰期也只能达到官网 API 一半速度及以下❌

💡 一句话结论:日常/代码/Agent 用 deepseek-v4-flash;要读图用 sensenova-6.8-flash-lite;追求极限文本吞吐且不读图用 glm-5.2。不要用 deepseek-flash(V4.1)。

🔭 搭配推荐(视觉辅助):主模型用 deepseek-v4-flash(快且稳、成本低),图片识别交给视觉辅助插件 —— 安装 dsh-sensenova-vision-aid 后,收到图片识别请求会自动派生子 agent 切换到 SenseNova 视觉模型(sensenova-6.8-flash-lite → deepseek-flash → kimi-k3 故障转移),并自动复用本插件同一把 key(默认 reuseFreeapiCredentials=true,无需再配第二把 key)。最合适的组合:deepseek-v4-flash 处理文本/代码/Agent + vision-aid 辅助视觉,又快又好。


核心思想:把「限流」当作常态设计

SenseNova 渠道对单 key 存在 TPM / RPM 并发与配额限制,瞬时超限会抛 429。多数插件的做法是报错 + 重试,连续限流时陷入正反馈死锁:计数只在 2xx 清零 → 短路导致零成功 → 计数永不清零 → 短路永不解除 → 只能重启进程。

本插件换了一个思路:限流不是事故,是运行常态。用两个显式列表管理每一把 API Key 的状态:

运行态 / 阻塞态双列表状态机

运行态 / 阻塞态 双列表状态机:连续 kickThreshold 次 tpm 限流则移出运行态、进阻塞态;外部调度器定期用最小请求探测,成功则挂回运行态末尾,失败则退避更久(15s → 30s → 60s)

三条不可让步的性质(与旧「全池短路」机制的本质区别):

  1. 保底:运行态只剩 1 把 key 时永不踢出 ⇒ 池永不空,Agent 请求永远发得出去。
  2. 借用:运行态候选被排除排空时,从阻塞态借「阻塞最久」的一把临时使用(不修改其相位)。
  3. 恢复与请求解耦:阻塞态 Key 的相位只由探测结果决定,不受「零成功」污染,随时能把 key 救回运行态。这是根治旧死锁的关键。

为什么必须探测恢复:Agent 请求只会选中运行态的 Key,阻塞态的 Key 不会被任何请求命中。若无人试探,它就永远回不来——调度器每隔 probeInitialMs(默认 15s,恰好量级匹配请求数桶恢复周期)用一次最小请求探一下,成功即复活。


双账户轮换:交替使用,降低报错与限流

  • 支持 1 个默认账户 + 多个额外账户(accounts[],各配独立 apiKeyEnv 凭据引用),共享同一 base URL。
  • 请求按「账户交替」轮换:被 exclude(401 或配额轮换)的 Key 会从下一位置环回,避免旧实现「前两把反复、第 3+ 把轮不到」的问题。
  • 配额类 429 粘性换 Key:被拒的 Key 保持可用状态,下次从下一把继续,把单 Key 瞬时限流摊到多把。
  • 401(凭据无效)才永久禁用该 Key,直到再 + 凭据被修改;429 一律不冷却、不禁用(渠道限流属于常态,不代表账号异常)。

为什么能「长时间稳定运行」——长程实测支撑

本项目所有关键参数都不是拍脑袋,而是在长程运行中实测校准的:

实测项结论依据
Retry-After 上限提到 60_000ms(原 3000ms 与 TPM 60s 窗口量级不符)长程实测
排队超时默认 60s,与 TPM 窗口对齐,排队必须有界design D4/D6 实测
双列表状态机取代「全池饱和短路」正反馈死锁重构
环回轮换修复排除项后必须从下一位置环回9265 条 429 日志统计
探测间隔15s 起、×2 退避、60s 封顶实测

功能一览

🧠 双列表 Key 池(运行 / 阻塞)

  • 池级单例、跨会话共享:Key 的额度是全局属性,不该被会话隔离。
  • 连续限流踢出、保底不空、借用最久阻塞、探测恢复、15/30/60s 退避,全部可配置。
  • 每把 Key 状态(相位、strikes、blockedSince、probeAttempts)在设置页只读展示。

🔄 双账户轮换

  • 默认账户 + 多额外账户,同 base URL。
  • 环回轮换 + 配额类 429 粘性换 Key + 401 永久禁用。
  • 被禁用 Key 凭据修改后自动恢复。

📋 错误记录表(只读诊断区块)

  • 每次限流落成一条结构化事件,异步写入、绝不阻塞、绝不抛出。
  • 字段:time / model / error.code / account fingerprint / retryFloorMs / probeHits / poolRunning / poolBlocked / rotated / attempt。
  • 密钥只存内存、日志只写 sha256 指纹,Key 原文永不落盘、永不出境。

📊 「当前模型 + 全部参数」面板(只读可视化)

  • 回答三个问题:我现在用的是哪个模型?它支持什么?哪些参数可以改?
  • 数据来自宿主实际解析 + 多轮实测校准。

安装

# 本地路径装入(推荐用于接入 DSH 验证)
dsh plugin --profile <name> add /path/to/dsh-sensenova-freeapi

# GitHub 发布后
dsh plugin --profile <name> add github:modesthub/dsh-sensenova-freeapi

# 或 npm 发布后
dsh plugin --profile <name> add dsh-sensenova-freeapi

然后在「模型」页配置 SenseNova:

  • 默认凭据环境变量:SENSENOVA_API_KEY
  • 默认 base URL:https://token.sensenova.cn/v1

配置项

字段类型默认含义
apiBasestringhttps://token.sensenova.cn/v1所有账户共享的 base URL
apiKeyEnvcredential-refSENSENOVA_API_KEY默认账户凭据引用
accounts[]array[]额外账户:{ id, label, apiKeyEnv }
activeAccountstring""首选账户 id;空 = 自动 / 首个可用
quotaRotationboolfalse配额类 429 是否粘性换 Key
concurrencyint1每 Key 并发闸上限(达限排队 FIFO)
queueTimeoutMsint60000排队等待上限
poolPolicy.kickThresholdint2连续多少次 tpm 限流踢出运行态
poolPolicy.probeInitialMsint15000首次探测间隔
poolPolicy.probeBackoffFactorint2探测失败退避倍率
poolPolicy.probeMaxMsint60000探测间隔上限
poolPolicy.capacityint10池容量上限
errorLogbooltrue是否记录限流事件到错误日志

API Keys 一律经 DSH 凭据服务存储,永不写入日志、永不发送给模型。


开发

pnpm install
pnpm run typecheck
pnpm run build    # tsdown → lib/
pnpm test         # node --import tsx --test tests/**/*.test.ts

许可证

MIT