본문으로 건너뛰기
V

dsh-minimax-connect

vicqiufeeng/dsh-minimax-connect

Turns the MiniMax Code (Mavis) subscription already signed in on this machine into a DSH model provider, renewing the OAuth token itself so the desktop client can stay closed, with points, check-in and subscription-quota panels.

설치

dsh plugin --profile web add github:vicqiufeeng/dsh-minimax-connect

README

dsh-minimax-connect

把本机 MiniMax Code(Mavis) 已登录的订阅接入 DeepSeek Harness,作为模型 provider,并在设置里给出一张卡片:积分余额 / 每日签到 / 订阅额度 / 模型清单。

积分制账号:不消耗 API key,消耗订阅积分。推理端点本身就是 Anthropic Messages 协议,所以直连官方端点 —— 不需要反代进程,也不需要 hook 客户端。

不用打开 MiniMax Code。 插件自己完成 OAuth 续期。

English: README.en.md

兼容性

一个实现,没有版本判断。向下兼容到 @deepseek-ai/dsh 0.2.1-rc.2,实测到 0.2.1-rc.5(当前 latest)。这条线内 dsh-llm / dsh-settings / dsh-client-ui-slots / dsh-llm-pi-ai 四个包的 lib/ 逐字节相同,所以兼容性不靠分支维持。

0.2.2-alpha.* 是另一条线,不在声明范围内(当前测下来也能跑,但没做保证)。

安装

dsh plugin --profile desktop add "github:VICqiufeeng/dsh-minimax-connect"

装完重启 DSH。插件不写用户补丁层(不碰 cordis.patch.yml),卸载时从 dependencies 与 dsh.profile.bundles 两处移除即可。

界面

设置 → MiniMax,四个区块:

  • 积分 + 签到 + 账号 —— 积分余额、七天签到、续期状态。
  • 订阅额度 —— 套餐、订阅类型、倍用量、额度余额(总 / 订阅 / 免费)、待入账、每日登录赠送、到期时间、自动续费、可升级动作、工作区,以及「已自动续期 N 次」。
  • 模型清单 —— 逐模型开关 / 图片输入 / 上下文窗口(512K 或 1M)。
  • 保存行 —— 落到插件自己的 settings 命名空间 llm-minimax。

同一张卡片还出现在插件管理页(包页与行页)和 设置 → 模型 里本 provider 的卡片位。另有零构建 HTML 面板:GET /plugins/dsh-minimax-connect/panel。

鉴权与续期

读 ~/.minimax/auth/prod/cn/mcode-public/auth.json 的 records[*].accessToken(mmoat_ 开头),以 Authorization: Bearer 发送。不能用 x-api-key(实测 401)。

access token 只有 1 小时。关掉桌面客户端后没有别的东西会续期,所以插件自己执行同一个 grant:

  • 提前 5 分钟续期,另有 60 秒巡检。
  • refresh_token 每次 grant 都轮换,新的一对原子落盘(临时文件 + rename),客户端不会读到写了一半的记录。
  • 复用客户端的文件锁约定(mkdir 抢占、30 秒陈旧回收),写入前重读并采纳更新的 generation 而不是覆盖它 —— 两边轮流续期互不踢出。
  • 失败不抛异常,回 { ok: false, reason, fatal? },继续用盘上已有的 token。fatal 只标一种永久失败:invalid_grant。

test/renew-e2e.mjs 只把 expiresAtMs 改到即将过期(两个 token 一个都不碰),在 MiniMax Code 进程数为 0 时实测通过:grant 273 ms、代际 +1、新 token 打 /v1/messages 返回 200。

实测契约(真实响应,非推测)

用途方法与路径备注
对话POST {llm}/v1/messagesAnthropic Messages,流式 thinking_delta + text_delta
模型清单GET {llm}/v1/models返回 503 direct_route_not_configured → 改从本地 config.yaml 解析
续期POST https://account.minimax.cn/oauth2/tokengrant_type=refresh_token
积分GET {cloud}/credit/detailsdetails[] 带 granted / remaining / consumed
签到GET/POST {cloud}/signin/{status,claim}?timezone_id=Asia/Shanghai缺 timezone_id 报 1406010011
订阅POST {matrix}/commerce/get_membership_infobody {}
工作区POST {matrix}/user/get_user_extra_infobody {}
{llm}    = https://agent.minimax.cn/mavis/api/v1/llm   ← 不带结尾 /v1,SDK 自己补
{cloud}  = https://agent.minimax.cn/minimax-cloud/api/v1
{matrix} = https://agent.minimax.cn/matrix/api/v1

配置

字段默认
baseUrlhttps://agent.minimax.cn/mavis/api/v1/llm
cloudBaseUrlhttps://agent.minimax.cn/minimax-cloud/api/v1
matrixBaseUrl由 cloudBaseUrl 派生(/minimax-cloud → /matrix)
authFile~/.minimax/auth/prod/cn/mcode-public/auth.json
configFile~/.minimax/config.yaml
cacheMs15000

enabledModelIds / imageOverrides / useMaximumContextWindow 由设置页写入,三者必须是 volatile 字段,否则 settings 服务拒绝写入(Config field "X" is not volatile)。

模型

清单来自本地 config.yaml,解析模型条目本身(limit / modalities / thinking_config / capabilities / contextWindowOptions),不依赖 whitelist 或 model_order。本机实测:

模型上下文图片思考模式
MiniMax-M3512K / 1M✅可切换
MiniMax-M3.1-Flash512K / 1M✅强制开启

目录里还声明了 video,卡片会显示但不作为可选项:报文只承载 text 与 image 两类内容块,列成可勾选等于承诺一个送不出去的能力。读不到 config.yaml 时回落到内置清单,/models 的 source 字段会说明来源是磁盘还是回落。

订阅额度

唯一真实来源是 POST {matrix}/commerce/get_membership_info。卡片显示套餐 / 订阅类型 / 倍用量 / 额度余额 / 待入账 / 每日登录赠送 / 到期时间 / 自动续费 / 续费周期 / 可升级 / 工作区;拿不到的字段显示「接口未返回」,不空着也不填 0。

倍用量:客户端包里没有套餐目录接口,营销页的 Go / Explore / Build 与 3× / 12× 是静态文案,服务端不发布。所以不硬编一张营销表,而是在应答里递归(最多三层)找数值型 *multiplier* / *multiple* / *times* 字段,找到就显示,找不到就写「接口未返回」。

包含的模型用本账号真正能用的清单回答 —— 即本地 config.yaml 的解析结果,而不是套餐宣传里的模型表。OpenPlatform 的 /backend/account/token_plan/subscriptions 用 agent token 调用会 404 / 401 not login(实测),所以订阅额度只走 matrix 通道。

「长时间免登录」靠的是续期机制,不是这张卡:卡片上的已自动续期 N 次取自 auth-state.json 的 generation。

路由(全部仅回环)

前缀均为 /plugins/dsh-minimax-connect。

路由说明
GET /status汇总快照,含 selfRenewal 与 membership
GET /usage、GET /signin积分明细 / 签到面板原始应答
POST /signin/claim执行签到
GET /models当前模型清单(?refresh=1 重读磁盘)
POST /__save写回启用模型 / 图片开关 / 上下文窗口
GET /panel自包含 HTML 面板(无构建步骤)

保存优先走宿主的 configForms(带 revision,冲突自动恢复),宿主没有该命名空间时回落到 __save;两条路写同一份配置,写没落地会明确报错而不是假装成功。

已知限制

  • 积分不换算成本:没有公开的每 token 单价,模型描述符的 cost 全填 0。
  • 倍用量拿不到就写「接口未返回」:服务端没有套餐目录接口。
  • 依赖客户端非公开接口:MiniMax 更新后端点可能变动,端点集中在 lib/index.js 顶部注释里便于对照。
  • 图片输入走宿主的 durable attachment service(0.2 线用 resolveImageAccess),缺该服务时回 UNSUPPORTED_CONTENT。
  • 只测过 Windows + 国内版(cn);区域路径与 buildEnv 硬编码在 defaultAuthFile(),其它区域需改这一处。

自检

npm run smoke        # 槽位 / 命名空间契约
npm run smoke:slots  # 把注册灌进真实 SlotCore 校验
npm run matrix       # rc.5 → rc.2 逐版本过一遍
npm run render       # 用真机 /status 应答渲染卡片文本

matrix 对每个版本加载那个版本自己的 SlotCore,把插件真实的注册灌进去,并跑一条负向对照 —— 0.1.0 那种「keyed 槽传 id」的写法必须被拒;对照没被拒就说明整列在测空气,脚本会报 HARNESS BROKEN。

License

MIT

관련 플러그인