Skip to content

Releases: cslkkl/dsh-cpa-switch

v0.19.0

Choose a tag to compare

@github-actions github-actions released this 24 Oct 03:14

新功能

  • 账号被判死时,面板会说,并给你一个按钮。
    上游有时会把凭据判死而不是封号:token 的有效期还有几周、refreshToken 也没过期,
    但服务端已经把那个会话列进黑名单(WorkBuddy 侧的错误码是 12153)。
    这种号在面板上和正常的号长得一模一样 —— status 仍是 active、disabled 是 false
    —— 唯一的不同只在 auth-files 的 note 里。于是你能看到的线索只有
    「这号怎么不出余额」,而该做的事(重新授权一次)界面上一个字都没提。

    • 卡片上出现琥珀色「需重新登录」标签,旁边是「重新登录」按钮;
    • 点它走的是与「添加账号」同一个登录会话 —— 协议上重登旧号与加新号是同一件事,
      落盘按 uid 覆盖,不会多出一个号;但弹窗标题会写「重新登录」而不是「添加账号」;
    • 判据只认上游那句文案(session dead / re-login required / 12153),
      认不出就不说话:误报会让你去换掉一份还能用的凭据;
    • 三条一起跟着受益:签到、跑任务、模型调用在这个号上本来就全都会失败。
  • 可以删掉没用的账号了。
    CPA 本来就有 DELETE /v0/management/auth-files,只是官方管理界面没做出来。

    • 卡片按钮行末尾多一个「删除」(弱化样式、位置固定 —— 这一排里只有它不可逆);
    • 点它弹确认框,标题带账号名,正文说清三件事:删的是什么、后果(要重新授权一次)、
      以及替代方案(只想让它不参与调度的话用卡片上的开关禁用即可);
    • 删完会回读确认文件真的没了才算成功 —— 200 只说明请求被接受,
      照它报成功的话界面会抹掉那张卡,下次打开号又回来了、而且一直在参与调度;
    • 同时清掉本地记忆里那个号的启用状态,免得以后用同一个 uid 重登时
      带着上一次的开关状态回来。

修复

  • 无。这一版只有上面两项新能力。

升级

dsh plugin --profile <profile> add dsh-cpa-switch

装完重启 DSH —— 这次新增了一条宿主路由(/api/v1/cpa/account-remove),
宿主半端要重新加载;浏览器半端的改动刷新页面即可。
无配置迁移:账号状态与偏好文件都不动。

复验

  • 有被判死的号时:卡片上有琥珀色「需重新登录」+ 一个主按钮;正常的号没有任何标签;
  • 点「重新登录」→ 弹窗标题是「重新登录 · WorkBuddy」,走完授权后那个号恢复正常;
  • 点「删除」→ 确认框标题带账号名;取消 → 什么都不发生;
  • 确认删除 → 那张卡消失;~/.cli-proxy-api/ 里对应的 <渠道>-<uid>.json 真的没了;
  • 删除后再打开面板:不会又冒出来(回读确认过);
  • 英文界面:Sign in again / Delete / Delete the account "…"?。

版本号说明

取 minor:两项使用者可观察到的新能力(一个状态标签 + 一个按钮、一个新动作 + 一条新路由)。
按发布手册的口径,新增能力走 minor。

正文手写的原因:这次改动直接推到 main,而 Release Drafter 草稿只看得见「合并进 main 的 PR」——
草稿此刻是空的(- (还没有已合并的改动))。按手册那条口径,直推成批改动的版本必须以本文件为准。

v0.18.1

Choose a tag to compare

@github-actions github-actions released this 20 Oct 04:03

修复

  • 侧栏入口默认不再显示。
    0.18.0 让它默认开:装上插件,左侧栏立刻多一行。侧栏是全宿主共用的一列
    (插件 / 自动任务 / 用量统计 / SSH),插件默认占位是在替用户决定它长什么样。

    • 现在默认关:装完侧栏不动,面板从「插件」页进 —— 那条路一直都在;
    • 想要常驻入口的人:面板底部按一下「侧栏入口」,之后跨重启保持;
    • 读不到偏好也按关(与默认值同向):一次读失败不会凭空给侧栏加一行,
      而文件里明明写着关;
    • 面板底部那个开关在「还没读到」时按关画(仍可点)—— 读失败不该让它变成点不动。
  • 产物断言里那条「关得掉」以前是空的。
    假 ctx 的 slots.inject 返回 undefined,组件侧兜成空函数,于是「关掉会摘掉那一行」
    在断言里永远成立。现在它真的返回 disposer,并新增一档「宿主说关 ⇒ 那一行真被摘掉」,
    同时钉住 main(面板整页)不受这个开关影响。

升级

dsh plugin --profile <profile> add dsh-cpa-switch

装完重启 DSH。无配置迁移,但有一条要预期:

  • 从 0.18.0 升级上来、没按过那个开关的用户:侧栏那一行会消失(文件不存在 ⇒ 新默认)。
    按一下就回来。
  • 已经打开过开关的用户:文件里是「开」,升级后仍然是开 —— 你的选择不会被冲掉。

复验

  • 装好不点任何开关:侧栏没有本插件那一行;面板从「插件」页进;
  • 面板底部按「侧栏入口」→ 侧栏那一行出现;再关掉 → 立刻消失;
  • 关掉后重启 DSH:仍然关着;打开后重启:仍然开着。

版本号说明

取 patch:这是把上一版判错的默认值改回来,没有新增能力。判据与取舍见
决策记录。

v0.18.0

Choose a tag to compare

@github-actions github-actions released this 20 Oct 03:41

新功能

  • 侧栏那一行可以关掉了。
    面板最底下多了一行「侧栏入口」(默认开)。关掉之后左侧栏那行不再出现,
    面板只能从「插件」页打开 —— 想给侧栏腾地方时用。
    • 关掉是摘除注册,不是不画:留一个空按钮会让人点进去,那是更糟的形态;
    • 默认开、坏值也按开:入口没了比多一个入口难查得多 —— 用户看不到某个东西时,
      没有任何线索指向一个 JSON 文件;
    • 开关状态存在 ~/.dsh/storages/cpa-panel-prefs.json,与「隐藏模型」同一类(你的意图,
      不是插件派生出来的),重启后保持;
    • 文案:标题只说「是什么」(侧栏入口 / Sidebar entry),说明只说「关掉之后什么样」
      (关掉后,面板只能从插件页打开)。

修复

  • 开关自己会点不动(本版内修掉,未进过发布包):inject 的返回值被当成 disposer 用,
    而它要 dispose 的是整个 inject;读写又按 result.data.* 取值,而宿主是摊平返回的 ——
    合起来的症状是开关一直显示「开」、点了回弹。两处都按真实契约改掉,判据钉住
    响应体的取值位置(顶层 {ok, sidebarEntry})。

升级

dsh plugin --profile <profile> add dsh-cpa-switch

装完重启 DSH —— 这次新增了一条宿主路由(/api/v1/cpa/panel-prefs),
宿主半端要重新加载。无配置迁移:偏好文件不存在时按「开」,与升级前行为一致。

复验

  • 面板拉到底:一行分隔线 + 「侧栏入口」开关,默认在手;
  • 关掉 → 左侧栏那行消失(不是变灰);点开面板仍能从「插件」页进;
  • 再打开 → 侧栏那行回来;
  • 关掉后重启 DSH:仍然关着(偏好落盘);
  • 英文界面文案是 Sidebar entry / When off, the panel is only reachable from the Plugins page。

版本号说明

取 minor:新增一处使用者可观察到的新能力(侧栏入口的开关 + 一条新路由)。按
发布手册
的口径,新增能力走 minor。

  • 决策与替代方案:侧栏入口
  • 运行时状态文件归属(cpa-panel-prefs.json 属「意图」类):src/README.md

v0.17.0

Choose a tag to compare

@github-actions github-actions released this 19 Oct 15:42

新功能

  • 左侧栏多了一行「CPA 切换器」,面板可以直接点进去。
    以前进面板只有一条路:翻到「插件」页、在那张卡片里展开。现在侧栏
    (与「插件 / 自动任务 / 用量统计 / SSH」同一排)多了一行本插件的入口,
    点开之后中间列就是同一个面板的整页形态。
    • 两个入口、一份实现:插件页里那处照旧;侧栏那行渲染的是同一个面板,
      只是外面多一层页面外壳(顶部一行「返回」+ 一列定宽内容);
    • 字形换成线条的:侧栏那排官方图标都是 16 格轮廓,所以这一行用轮廓字形
      (弧 = 切号、人物 = 账号,与插件页那枚实心图标同源、不同画法);颜色取
      currentColor,选中态与明暗主题自动跟随;
    • 名字与插件列表对齐:以前侧栏那行写「CPA 面板」、插件列表里叫「CPA 切换器」——
      同一件东西两个名字。现在统一成后者(英文 CPA Switch);
    • 面板里的东西一个没变:账号、余额、签到、模型勾选、渠道插件更新都还在原处。

修复

  • 产物断言里那处「假 ctx」其实不会执行注册(内部测试夹具,不影响已发布的包)。
    它的 inject(deps, cb) 是个空函数,于是包在座位级等待里的注册在断言里一条都不会发生 ——
    一条永远不会红的检查。现在改成真的回调,并补上侧栏那一组断言
    (两处 id 逐字相同、没占官方 id、返回真调一次)。

升级

dsh plugin --profile <profile> add dsh-cpa-switch

装完重启 DSH(宿主半端零改动,但浏览器半端与文案变了)。无配置迁移 ——
模型选择、账号禁用状态、隐藏的模型清单都不变。

复验

  • 侧栏出现一行 CPA 切换器 / CPA Switch,位置在「自动任务」与「用量统计」之间;
  • 点它 → 中间列打开整页面板;点顶部「返回」回对话;
  • 插件页里那张卡片的入口照旧可用;
  • 亮暗两套主题、以及选中态下,那枚线条字形都读得清。

⚠️ 「返回」按钮的真机点击还没走通(高 DPI 缩放下鼠标没命中),已记进待办;
它只有一条路径(selectPanel(null)),产物断言里会被真调一次。

版本号说明

取 minor:新增一处使用者可观察到的新入口(侧栏行 + 中央面板页)。按
发布手册
的口径,新增能力走 minor。

v0.16.1

Choose a tag to compare

@github-actions github-actions released this 19 Oct 05:37

修复

  • fix: 签到不闪骨架、漂移号不再先全亮、provider 行缺失自愈 (#70)

v0.16.0

Choose a tag to compare

@github-actions github-actions released this 17 Oct 10:32

新功能

  • 模型选择框左边多了一个「我还能花多少」的读数。
    选模型的那一刻正是余额决定事情的那一刻(选贵的还是便宜的),而面板上的余额
    要两跳才看得到。现在对话输入行里、模型选择器的紧左侧是一个小读数:
    一个字形 + 一个数字,回答「当前这个渠道还剩多少」。

    • 只算启用的号(禁用的号不会被调度到);积分渠道是硬币字形,
      token 渠道是圆 + T;
    • 不限额改说「不限」、不写数字:trae 有不限额号时,旁边挂一个合计会被读成
      「你还有这么多」,而上游说的是「这份没有上限」;
    • ⚠️ 读不到 / 还没加载 / 一个号都没凑出来时它是空着的,绝不画 0 ——
      编造的 0 会被读成「余额用光了」,比一片空白更糟;
    • 不是本插件的模型的会话里什么都不显示(别的 provider 旁边挂我们的账本没有意义);
    • 数据走面板那份读缓存,零新增请求;悬停可以看到「哪个渠道、什么单位的合计」。
  • 模型下拉里不再每一行都把渠道名念一遍。
    选择器早就按渠道分组了,组标题就是渠道(CPA Switch · WorkBuddy),而行里
    又写一遍 WorkBuddy · glm-5.3 —— 同一句话说两遍。

    • 现在组内每行只有模型名(glm-5.3),渠道只由组标题承载;
    • 收起状态的按钮与菜单根行仍带渠道名(WorkBuddy · glm-5.3)——
      那两处不在分组里,不写就没人知道是谁家的模型;
    • 面板「模型」勾选弹窗里的行同步改成模型名,与选择器逐字一致。

修复

  • 你禁用的号不再被上游按额度悄悄全部打开。 渠道插件自带的额度生命周期
    (lifecycle_auto,默认开)会在每天 09:00 / 21:00 的定时任务之后,把
    「CN 号 + 被禁用 + 额度未耗尽」的号写回启用 —— 它分不清这个禁用是你点的、
    还是它自己因额度耗尽禁的。

    • 症状:「我没动它,号全亮起来了」,而「设为唯一」按钮整排消失,
      零报错;
    • 现在面板读到漂移就按你的选择禁回去,并说一句「恢复你禁用的 N 个账号」;
    • ⚠️ 只往一个方向主张:绝不把上游因额度耗尽禁掉的号启用回来
      (否则请求会落到一个耗尽的号上)。面板没打开 / 没读到那个渠道时不动手。
  • 「模型」勾选弹窗里几十行长得一模一样。 每行原先交出去的是渠道名,
    三四十行全是同一个「WorkBuddy」,用户分不清在勾哪个模型。
    现在每行是模型名,与选择器里那一行逐字相同。

内部改动

  • 发布流补齐四条底线(发布噪音守卫、发布态不变量、草稿退役、回落改用
    --generate-notes),并逐条钉成判据 —— 这些都是「坏了也不报错」的地方。
  • CI 增加收口 job(分支保护只盯 CI Success 这一个名字),格式步骤与本地
    pnpm check 同源,另加 GitHub Actions 的版本漂移巡逻。
  • 包清单声明补齐:author / homepage / bugs / main 补上(只看 main
    的老工具链此前拿到的是一个没有入口的包),发布产物不再带 sourcemap。
  • 模型名与渠道身份的分工写进决策记录:name 是纯展示载荷,路由身份从头到尾是
    providerId/modelId(去掉前缀因此不牵动任何路由行为)。

升级

dsh plugin --profile <profile> add dsh-cpa-switch

装完重启 DSH(这次改的是宿主半端与浏览器半端两边)。无配置迁移 ——
模型选择、账号禁用状态、隐藏的模型清单都不变。

复验

  • 余额读数:模型选择框左侧出现一个字形 + 数字;切到别的渠道的模型时
    字形 / 数字跟着换;trae 出现「不限」而不是一个数。

  • 下拉行:组内每行只有模型名;收起状态的按钮、菜单根行仍带渠道名。

  • 勾选弹窗:每行是模型名(不再是清一色「WorkBuddy」)。

  • 禁用意图:在面板禁用某个号之后,若上游把它重新打开,面板会再禁回去并提示一句;
    因额度耗尽被上游禁掉的号不会被启用回来。

  • 决策记录:双座位(模型名分层 + 余额读数) ·
    模型名根修 ·
    禁用意图单向主张

版本号说明

取 minor:一处使用者可观察到的新能力(选择器左侧的渠道余额读数)加若干修缺陷
与行为变化(下拉行改裸名)。按发布手册
的口径,新增能力与行为变化走 minor。

⚠️ 两处补不回来的代价(/model 弹窗与悬停文案):宿主在渲染槽位之前就算好了
触发位的 title / aria-label,且 /model 弹窗的搜索只匹配行标签、不匹配分组标题 ——
所以悬停与读屏只拿到裸名、打「workbuddy」搜不到该渠道的模型
(看得到、搜不到)。这是去掉前缀换来「不再重复」的已知取舍,不是缺陷。

⚠️ 正文是手写的,不是草稿:本版除了合并进来的 PR,还有直接推到 main 的
产物改动(包清单声明、CI 收口 job),而 Release Drafter 看不见直推的提交 ——
照默认走会漏掉 npm 页面与包内容的那几条。

v0.15.1

Choose a tag to compare

@github-actions github-actions released this 14 Oct 09:01

修复

  • fix(client): 骨架卡不再被抹掉边框 —— 与汇总三格一样看得见框 (#61)
  • fix(client): 版本读数并进状态条 —— 不再加载后把整块顶高一格 (#62)

v0.15.0

Choose a tag to compare

@github-actions github-actions released this 13 Oct 11:07

新功能

  • 只让常用的模型出现在模型选择器里 —— 面板工具栏上多了个「模型」按钮。
    选择器里挤着四个渠道的全部模型(本机约百行),而常用的就那么几个。
    现在:点工具栏的「模型」,弹出当前渠道的模型清单,取消勾选的就不出现在
    DSH 对话界面的模型下拉里
    。
    • 勾选的地方在面板、生效的地方在选择器 —— 面板本身照旧列出全部模型,
      否则你没法把取消掉的再勾回来;
    • ⚠️ 不勾 ≠ 删掉、也不等于不能用:模型在 CPA 那边照常在、接口照常能调,
      只是不在下拉里出现。这条是弹窗里明写的,也是本功能唯一容易误解的地方;
    • 保存后立即生效(不需要等下一次目录刷新)。

修复

  • 勾选保存成功却不生效(真机实踩)—— 目录护栏把「用户藏掉的行」当成
    「目录读残」原样拦回:面板说保存成功、状态文件也写对了,但选择器里一个都没少。
    护栏现在按(渠道, 裸名)逐行豁免被隐藏的模型,而不是整体放行。
  • 勾选清单与选择器不是同一批模型(真机实踩)—— 清单原先读渠道目录
    (glm-5.2),而推给宿主的行叫 Trae/trae/glm-5.2,两边一个键都对不上:
    勾了 18 个,选择器里 9 行一个没少,而所有请求都是 200。清单改用
    「不隐藏的话会被推送的行」,与推送侧同一个键。
  • 同一个模型在 trae 侧有三个条目 —— 上游给同一个模型注册了三种 id 形态
    (裸名 / 我们写的别名 / 上游又给我们别名套一层前缀),27 条 id 其实只有 16 个模型。
    现在反复剥前缀得到裸名,并且推给宿主的清单同一(渠道, 裸名)只留一行。
  • 面板上的「模型」入口读错响应字段 —— 传输层把响应体摊平在结果对象上,
    而类型带索引签名,于是「取 result.data」能编译通过、却永远是空:
    表现是那块界面根本不存在(而所有请求都是 200、零报错零日志)。
    现在入口永远立着,读不到 / 读失败 / 还没有都在界面里说清楚。
  • 图标在真实显示尺寸下读不清(30px) —— 宿主行内图标只画 30px、卡片 36px,
    而旧图是细线灰环 + 描边人物:在那个尺寸下人物散成毛边、环糊成一段「C」,
    灰色还被读成「已禁用」。换成实心圆盘 + 反白人物 + 反白环绕箭头,与同一排里
    官方插件的实心彩色图标同一族。

内部改动

  • 模型名的归一(剥渠道别名前缀)收成一处实现,宿主写盘与路由侧判定共用,
    避免两边口径漂开(漂开的症状是「用户藏过的模型某天又自己冒出来」,且没有报错)。
  • 撤回了一批做错对象的改动:当初按「号」做隐藏,而维护者要的是按模型 ——
    那批已整体撤回,面板与文档同步回滚,没有留下半截状态。

升级

dsh plugin --profile <profile> add dsh-cpa-switch

装完重启 DSH(改的是宿主半端)。无配置迁移:模型可见性默认「什么都不藏」,
不勾选就等于现在的行为;新的状态文件是 ~/.dsh/storages/cpa-panel-hidden-models.json。

复验

  • 模型入口:面板每个渠道页签的工具栏上有一个「模型」按钮(与
    「刷新 / 全部签到 / 全部任务」同排);点开列出该渠道的模型,弹窗里说清
    「不勾 ≠ 删掉」。

  • 勾选生效:取消勾选某个模型 → 保存 → DSH 对话界面的模型下拉里它消失,
    而面板里它照旧在;勾回来 → 保存 → 下拉里它回来。

  • 互不影响:同渠道其它模型不受影响;同名模型在别的渠道不受影响。

  • 图标:插件页行内 30px、卡片 36px 磁贴里是一块读得清的实心图形,
    亮暗两张主题都看得清。

  • 决策记录:模型可见性 ·
    图标重画

版本号说明

取 minor:一处使用者可观察到的新能力(勾选哪些模型进选择器)加若干修缺陷。
按发布手册
的口径,新增能力走 minor。

⚠️ 正文是手写的,不是草稿:本版全部改动都是直接推到 main 的,
Release Drafter 看不见直推的提交(它只认合并进来的 PR),照默认走会得到一份
只列文档与 CI 的正文。

v0.14.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 14:31

新功能

  • 模型选择器按渠道分组了 —— 不再是一层平铺的近百个模型。
    选择器是按 provider 分组的,而四个渠道(WorkBuddy / Trae / Qoder / ZCode)的模型
    此前全挂在同一个分组下,本机实测 96 行平铺成一层,找模型要一直翻。
    现在一个渠道一个分组,组名是 CPA Switch · <渠道名>,顺序与面板页签一致。

    • ⚠️ 升级后每个会话要重选一次模型(一次性,之后不再受影响)。
      选择器的选项身份是 分组/模型,分组变了,你之前选中的那个就找不到了。
      打开旧会话时会看到输入框停用,在对应渠道的分组里重选一次即可。
      这是这次分组必须付的代价,已确认接受;分组名从此是稳定契约。
  • 思考档位按三重复测重做:摘掉 11 个「假旋钮」,对调 4 个「反方向」的。
    界面上「关 / 开」这一行本来就不总是可信,重测 97 个模型后处置如下:

    • 关不掉的(选「关」照样思考)与两档都不思考的 → 摘掉档位列
      (11 个:hy4-preview-f、step-5-preview、Trae 的 Doubao-Seed-2.1-Pro/Turbo、
      glm-5.2、glm-5.3-flash、kimi-k2.6、step-5-preview,以及 zcode 的
      glm-5.3 / glm-5.3-flash)—— 留着只是给你一个按不动或没意义的按钮;
    • 方向相反的(选「开」反而想得更少)→ 把两个档位的值对调
      (4 个:qoder 的 dfmodel / gfmodel / gm51model / gmodel),
      让「关 = 想得少、开 = 想得多」恢复正确方向。
      ⚠️ 对调只修方向:这些模型「关」那一档仍会思考 —— 上游没给一个真能关掉思考的词;
    • 测不准的 55 个一律不动:两档的字数区间重叠就判「测不准」。
      上一版是按单次测量分类的,而重复测显示同一批模型有一半翻了类
      (wb/glm-5.3 585/38 → 12/12、wb/glm-5.1 真开关 → 测不准)——
      在测不准的数据上改,等于把上一版的错重犯一遍。

修复

  • 「未签到」标签改成灰底 —— 原来是空心描边,看起来像括号,与绿底「已签到」
    并排时会被读成标点而不是状态。「今天没签」可能是有意不签,所以用中性的灰
    (不是警告色,也不是失败色)。
  • 没有签到状态的渠道(Qoder / ZCode)整行不显示任何标签 —— 那是「不知道」,
    不是「没签」,此前就是这个行为,本版把它写成了正式判据。

内部改动

  • 模型 id 的解析收成一处:渠道那侧不再抄一份目录的解析逻辑。
  • 模型窗口校准表:窗口允许缺省 —— 档位标记与窗口是两条独立的证据轴,
    Trae 平台模型的窗口按渠道口径仍不填(走宿主兜底),不再为了挂档位标记
    去凭空补一个窗口值。

升级

dsh plugin --profile <profile> add dsh-cpa-switch

装完重启 DSH(改的是宿主半端)。无配置迁移;唯一的破坏性影响是上面那条
一次性重选模型。

复验

  • 分组:模型选择器里应出现四个分组(CPA Switch · WorkBuddy / Trae / Qoder / ZCode),
    不再是单个分组下近百行。

  • 重选:旧会话打开时输入框停用 → 在对应渠道分组里重选一次模型 → 恢复可用。

  • 档位:workbuddy/step-5-preview、zcode/glm-5.3 这类模型不应有 Effort 行,
    同渠道其它模型照旧;qoder/gmodel 选「开」应比选「关」想得更多。

  • 标签:没签到的号上是一个灰底「未签到」标签,不再是空心描边。

  • 决策记录:模型选择器按渠道分组 ·
    思考档位重新分类 ·
    三重复测数据

版本号说明

取 minor:两处使用者可观察到的变化(选择器分组、档位摘除/对调)加一处修缺陷
(未签到标签)。按发布手册
的口径,行为变化走 minor。

⚠️ 本版有一处破坏性影响:模型选择器改分组,你之前保存的模型选择会失效一次,
需要在新的四个分组里各重选一次(旧的 cpa 分组会被清掉,不会留下幽灵分组)。

v0.13.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 07:10

新功能

  • /v1/* 现在要鉴权 —— 同一台机器上的其它程序不能再白拿你的账号额度。
    托管配置此前没有 access.api-keys 段,/v1 不校验任何密钥:端口虽然只监听
    127.0.0.1,但同机的任何程序都能不带密钥调 /v1/chat/completions,
    直接消耗你的账号额度(2026-10-04 实测不带鉴权返回 200)。
    装上这一版:新机器生成的配置直接带调用密钥;已经跑过一次的老机器在 DSH 启动、
    CPA 未运行时自动补上这一段。

    • 只补「缺失」:配置里已有 api-keys 是你的密钥清单,一个字节都不动;
    • 真机实测(重启后):不带密钥 GET /v1/models → 401,带密钥 → 200;
      重启后 46 次对话请求全部 200 —— 模型照常能发、面板读写照常,
      因为两条路各用各的钥匙(调用密钥走 /v1,管理密钥走管理接口)。
    • ⚠️ 改的是宿主半端,装完要重启 DSH;补写只在 CPA 未运行时做
      (它运行中持有该配置文件、保存时会回写),所以 CPA 常驻不重启的机器
      要等下一次停机窗口才生效。
  • 面板上能看见渠道插件的版本,也能一键换新版。
    以前判断「渠道插件装好了没」只看磁盘上有没有 dll —— 有就算装好,于是
    「一键准备环境」点多少次都不会换版本:本机实测停在 10-04 的构建(qoder 约 0.8.45),
    而上游已是 v0.8.66,且你正踩的那个「developer 角色被上游拒」正是 0.8.64 修的。
    现在面板上多一行「渠道插件 v0.8.45 → v0.8.66」,要换得你自己点。

    • 不自动升级:上游随时可能改行为,静默升级等于把上游的风险直接灌给你;
    • 换之前先停 CPA(Windows 上被加载的 dll 改不了名;外部实例一律拒绝、只停自己启的),
      留旧件备份、失败自动还原上一版,换完不自动重启;
    • 已装版本记在 ~/.dsh/storages/cpa-panel-install.json(不记就无从判断有没有新版);
      判「有没有新版」用 tag 相等,不解析版本号;没记过 tag 时什么都不说,不编。

修复

  • 开着代理时,插件的下载与查版本全部失效(症状是 HTTP 400,而同一个代理用
    curl 却是 200,看着完全像网络问题)。根因是代理路径下 TLS 握手根本没发生,
    明文请求直接打到了代理上。现在代理路径会真正建起加密连接。
  • 重载一次插件就整个挂不上:插件没把 locale 字典的注销函数交还宿主,第二次注册
    直接抛 already has locale,界面上只显示「未能完成同步」。
  • 面板上「渠道插件」那一行不再与提示块撞按钮名。

内部改动

  • 就位探测与配置代际(「对端要哪一代」对不上时提前提示,而不是等 CPA 启动失败)
    补成正式判据 —— 这条分支此前没有测试,只有真机脚本验过。
  • SetupSession 增一个「调用密钥现读」的口子:一键准备写配置时把 access.api-keys
    一起落盘。

升级

dsh plugin --profile <profile> add dsh-cpa-switch

装完重启 DSH:本批改的多数是宿主半端。无配置迁移、无破坏性改动 ——
托管配置里的 access.api-keys 段会在首次启动时自动补上(CPA 未运行时)。

复验

  • 鉴权:重启 DSH 后看托管配置里出现 access: / api-keys: 段;不带密钥调
    http://127.0.0.1:8317/v1/models 应 401,带密钥应 200;随后发一条模型
    消息
    应照常成功,面板打开与写操作照常。

  • 渠道插件版本:面板上应出现版本行;点「更新」后按提示等它下载(约 17 MB),
    日志里应看到「停 CPA → 下载 → 校验 → 替换」的顺序。

  • 代理:开着代理时查版本与下载应正常(不再 400)。

  • 在 CPA 未运行的机器上,终端应出现
    托管配置缺 access.api-keys,已写入 CPA_API_KEY(/v1 从此要求鉴权);
    已自己配过 api-keys 的机器不应出现它(判据是「一字节不动」)。

  • 决策记录:/v1 鉴权收口 ·
    代理路径的 TLS 握手 ·
    渠道插件更新路径

版本号说明

取 minor:一个安全默认的收口(/v1 从不校验到校验,使用者可观察到:不带密钥
调用被拒)加一个新能力(渠道插件可查版本、可一键更新)。按
发布手册
的口径,行为变化 / 新能力走 minor。

⚠️ 本版含一处行为变化:/v1 从此要求密钥。如果你有插件之外的程序在直连
127.0.0.1:8317 调 /v1/*(自己的脚本、别的客户端),它们会开始收到 401 ——
把这些调用方加上托管配置里那个 access.api-keys 值即可。