Skip to content

Releases: elegant01/dsh-codearts

v1.2.4

Choose a tag to compare

@elegant01 elegant01 released this 03 Nov 08:18

1.2.4 - 2026-11-03

变更

  • 登录回调页不再停在一行「可关闭」提示上,标签页会自己关掉:华为授权完成后浏览器
    必然落回 http://127.0.0.1:<port>/oauth/callback —— redirect_uri 由华为侧指定,登录成功
    的标志就是这次 302,华为那边没有自己的「登录成功」页可停留;这一页也没有任何后续逻辑,
    code 在响应发出的同一时刻就交给了服务端,token 交换、身份探测与卡片刷新都不依赖它。
    现在页面先显示「正在返回 DeepSeek Harness…」,300ms 后调用 window.close() 自动关闭
    标签页(卡片用 window.open 打开授权页,标签页可自关);只有从卡片的手动链接打开、
    或浏览器拦截脚本关窗时,才会在 1.2s 后退化成「登录成功,本页可关闭」的提示。

新增

  • 用量里记「缓存命中的输入 token」,弹层保持两列、不摊开:部分上游在流末尾的
    usage 帧里带 prompt_tokens_details.cached_tokens(或平铺的 cached_tokens /
    cache_tokens / prompt_cache_hit_tokens),这块以前被丢掉,只留下一个合计。
    现在解析并存进账本(缓存是输入的子集,脏数据会钳到输入以内),设置卡片的「今日」
    与「近 30 天」显示成 输入 x · 输出 y · 缓存 z;缓存段始终显示(没有命中就是
    缓存 0,命中率仅在有命中时附上)—— 隐藏 0 会让「没命中」和「上游没下发该字段」
    看起来一样,反而分不清功能有没有生效。旧账本(没有 cachedTokens 字段)读取时按
    0 补齐,不需要迁移。
    底部积分弹层只回答「哪个号还有多少积分」,这些用量数字到设置卡片的「用量」页里看。
    /api/codearts/debug 另外返回最近 5 帧 usage 的原样内容
    (usages),用来判断上游到底有没有下发缓存字段。
  • 底部的积分挪进输入框工具行、权限控制右边:输入框下方那行还挤着宿主的 tok/s、
    缓存命中与上下文圆环,模型名一长(DeepSeek-V4.1-Flash-20261017)就压不住。现在
    积分段挂在 conversation.input.left(宿主契约里的「composer 工具行左侧紧凑控件」,
    渲染在权限 + 计划之后),Provider / 模型 / 倍率 / 排队仍留在输入框下方那行 —— 同一个
    组件的两个实例,用注入的 zone 区分,共用同一份数据和两个显隐开关。点开仍是逐号
    明细:每个号一行「名字 + 余额」,下面一行 11px 灰字 入 · 出 · 命中 · 条数(思考
    token 放到设置卡片里),原来那个悬停才出的原生 title 和跟着走的尾巴 · 一并去掉。
  • 设置卡片的「用量」页:数字块 + 横条 + 悬停卡片:顶部三个数字块(今日 token /
    缓存命中 / 今日请求)替掉原来的「今日合计 / 近 30 天」两行文字;下面仍按账号、按模型
    出横向柱状图,悬停任意一行弹出明细卡片(输入 / 输出 / 思考 / 缓存命中 / 请求 /
    命中率,数字精确到个位带千分位),版式照 agent-acta 的 .tok-tip:名称打头、
    分隔线分段、数字等宽右对齐。上游没下发缓存字段时写「上游未下发」,不显示成 0%。
  • 同时记下「思考 token」:上游在 completion_tokens_details.reasoning_tokens
    (平铺的 reasoning_tokens 也认)里单列推理模型的思考量 —— 实测华为每帧都带,
    以前整块丢掉,只看得到一个偏大的「输出」。现在存进账本(它是输出的子集,脏数据钳到
    输出以内),界面统一显示成 输出 697(思考 505),上游不给就只是 输出 697;
    0 不单独成段,也不显示 思考 0。旧账本同样按 0 补齐。

v1.2.3

Choose a tag to compare

@elegant01 elegant01 released this 02 Nov 03:44

[1.2.3] - 2026-11-02

新增

  • 模型列表里给「上游说不可用」的模型挂「异常」Tag:某个模型被上游回
    InferHub.ModelArts.81003.401(模型不存在 / 本账号无权限)后,设置卡片的勾选区
    会挂一个「异常」Tag,悬浮显示上游原始原因。只标记,不替用户取消勾选,也
    不随「刷新模型列表」清掉 —— 刷新只重拉上游清单,而清单里照样有它(2026-11-02
    实测),复活不了;标记按本地日期自然过期,第二天自动重试。多账号下这个错误只有在
    所有号都试过之后才会浮上来,所以按模型记全局。
  • 勾选的模型可以点「测试」实测一次:模型行上多一个「测试」按钮(只对已勾选的
    模型出现),点一下就用一句 ping、max_tokens: 16 真发一次请求,逐账号轮着试 ——
    清单里有 ≠ 能调通,只有实测才知道。成功显示「通过」并清掉该模型的「异常」标记;
    失败显示「失败」,悬浮可看上游原因。同一时间只测一个,不占满上游并发槽位。
  • 点开积分弹层也能看到每个账号今天用了多少 token:那张逐号明细表多了「今日 Token」
    一列,数字口径与设置卡片「用量」区块一致(输入 + 输出,按人类习惯缩写成 12.3k),
    悬浮还能看到输入/输出拆分与请求数。只统计本机经插件发出的请求,不是账号总额度。

v1.2.2

Choose a tag to compare

@elegant01 elegant01 released this 02 Nov 03:19

[1.2.2] - 2026-11-02

修复

  • invalid_iam_token 只会干等:这类错误以流内首帧(HTTP 200)回来,既绕过
    错误分类、也不会触发换号;而 ensureFresh() 只在距 expiration 不足 5 分钟时才
    续期,token 被提前作废(另一个客户端续期 / 上游轮换)后每条消息都会撞同一堵墙。
    现在首帧识别 invalid_iam_token / Incorrect IAM authentication / APIG.0301
    等措辞,强制续期一次并让同一个账号重试;续期仍失败就冷却该账号,不再把
    原始英文串甩给用户。HTTP 400 响应体里的同类错误走同一分支。
  • 上游流内的「模型不存在 / 无权限」和「不吃图」都翻成人话:
    InferHub.ModelArts.81003.401 与 InferHub.001001020.406 以前会原样透传,
    用户只看到两句英文。现在分别提示「模型不存在或当前账号没有权限(换号没用)」
    与「该模型不支持图片输入」。识图能力本身仍以上游发现结果为准,不做本地覆盖。

v1.2.1

Choose a tag to compare

@elegant01 elegant01 released this 28 Oct 05:09

[1.2.1]

  • 2026-10-28

新增

  • 底部那一行改成段式,与 dsh-codebuddy-cli 同构:积分 24,091 · Provider CodeArts · Model DeepSeek-V4.1-Flash-1017 · x0.18。积分挪到最前,倍率单独成段(不再粘在模型名
    尾巴上),段与段用 · 连接,和邻居那一行的观感一致。只有积分那一段是开积分弹层
    的按钮(原来的设定不变):模型、倍率、排队都是纯文本,点它们不会弹面板。
    /api/codearts/status 与 /api/codearts/models 的模型条目因此多了一个 ratio 字段
    (x0.18;福利恒为 x0.00;上游没给倍率的模型缺席),免得客户端去拆显示名。
  • 对话底部那行先说自己是谁了:中间是 Provider CodeArts · Model <模型名> · <倍率>。
    这一段不受「显示剩余积分 / 显示上游排队位置」两个开关影响,始终出现;
    开关只管积分与排队两段。
  • 这一行以前是靠邻居插件(dsh-codebuddy-cli 的 dock 会替任何 provider 画
    Provider <id> · Model <id>)顺带显示的,但它在 codearts 下只给模型 id、
    给不出倍率,而且受那个插件自己的「切换到其它 provider 时也显示这一行」开关控制
    (关了整行就消失)。现在身份行由本插件自己负责,不依赖别人。
  • 选中我们的模型时,那一行里别人的条目会暂时消失:我们改不了别人的注册,但
    conversation.composer.dock 是 list 槽位、每条注册都被宿主平铺成同一个
    [data-composer-dock] 行里的兄弟节点,所以我们这条会认出新出现的别人、给它们
    打上 data-codearts-dock-suppressed 属性,由我们注入的一条 CSS 隐藏。切换 provider
    或卸载时逐个摘掉属性,别人的行立刻回来。不碰宿主自己的轮次/token 统计 pill
    (data-composer-stat)和上下文占用格子。规则与边界在 src/client/dock-suppress.ts,
    单测见 test/dock-suppress.spec.ts。
  • 模型勾选区标出「识图」:/api/codearts/enabled-models 的 choices 多了
    supportsImages,卡片给支持图片输入的模型挂一个「识图」Tag。声明了 reasoning 之外
    的模型能力本来就该在勾选时看得见,不然只有发了图才知道谁不吃图。
  • 新增 DeepSeek-V4.1-Flash-1017 种子条目(1,048,576 context)。

修复

  • deepseek-v4.1-flash 带图必报 The request model is not multimodal(issue #4):
    这个裸别名在上游不算多模态,种子目录却标了 supportsImages: true,于是带图的请求在
    出网前就被当成合法、到了上游才被拒。现在它标 false;多模态的是带日期的 -1017。
    上游发现接口对 -1017 的 supports_images 也给 false,但 issue 报告者实测带图可用,
    按实测为准标 true。
  • 模型目录为空时会干等一小时:启动/热重载后第一次模型发现如果正好撞上上游抖动,
    目录会一直空着,期间每条消息都死在 pi-ai 的 has no configured model,而重试要等整
    整 CATALOG_REFRESH_MS(1 小时)。现在发现循环自我重排:目录为空时 60 秒后重试,
    有货后回到每小时。

开发

  • scripts/deploy.mjs 不再改写 profile 的依赖版本:它以前把仓库 version 无条件写成
    profile dependencies 的值,本地产物先于 npm 发布升版本时,profile 就会依赖一个
    registry 里不存在的 specifier,宿主重载后整个 bundle 掉线(表现是模型选择器里
    provider 消失,而 HTTP 路由还活着)。现在只在缺这一条时才补,版本不一致时打一行提示。
    仍建议先发布、再升仓库版本。

v1.2.0

Choose a tag to compare

@elegant01 elegant01 released this 27 Oct 03:51

1.2.0 - 2026-10-27

新增

  • 对话底部那行积分可以点开看明细了:以前只有一行聚合数字(多账号把所有号加在
    一起),看不出是哪个号还剩多少。现在那一行是个按钮,点开是逐号明细——账号名、各自
    剩余积分、哪个号有积分将在本周期结束时作废、最近刷新时间,右上角一个「刷新积分」。
    它是唯一绕开 60 秒积分缓存的出口(GET /api/codearts/status?force=1):点了必定打
    上游,不会拿旧数字糊弄。弹层用 fixed 定位挂在按钮上方(放不下就翻到下方),不撑宽
    宿主那条共享的 composer dock 行。
  • 两个显隐开关:设置卡片新增「显示」页,分别管输入框下方那一行的剩余积分与
    上游排队位置(showCreditDock / showQueueDock)。默认都开,老配置行为不变。
    开关值随 /status 一起下发,底部条每 60 秒读一次,所以关掉最多要等一分钟才见效——
    这句写在设置页上,不让人自己猜。

v1.1.4

Choose a tag to compare

@elegant01 elegant01 released this 26 Oct 09:45
fix: pi-ai 改构建期打包进 lib,装插件零新增 npm 包,修 pnpm 11 更新必败 (1.1.4)

dsh-codearts 1.1.3

Choose a tag to compare

@elegant01 elegant01 released this 26 Oct 07:22

[1.1.3] - 2026-10-26

修复

  • 与 billion-context 同用时账号被永久禁用,报「当前没有可用账号」(issue #1):
    billion-context 拦下 SDK-HMAC-SHA256 签名请求做压缩、找不到重签凭据时在本地回 403
    (signed_request_requires_resign),插件把它当凭据失效,账号被禁用且没有任何恢复
    路径。现在按 body 里的拒签标记识别这类本地拦截:不再禁用账号,直接回 400(宿主不会
    再拿它重试 5 次),报错里给出 resign.passthrough 的配置方法。带标记的 401/403 之外
    的真凭据失效行为不变。
  • 重新登录救不回被禁用的账号:disabled 以前只能靠重启清掉,pool.sync() 对同一
    userId 保留运行时状态。现在登录成功(OAuth 与手工贴 token 两条路)会调用池的
    revive(),清掉该账号的禁用/冷却/错误计数。
  • 「没有可用账号」不再一概而论:一个账号都选不出来时,报错分清原因——全禁用(401,
    附各号最后错误并提示重新登录)、全在冷却(429,附剩余秒数)、本地并发槽位全满
    (429,说明每账号 2 个在飞上限)。
  • 已登录却报「积分不可用:statistics HTTP 0 Failed to parse URL from [object
    Request]」(模型清单同时变空,issue #2)
    :出网原本是 fetch(new Request(url, ...), {signal})
    ——邻居插件(如 IP 池出口路由)会把 globalThis.fetch 换成它自己那份 undici 的
    fetch,而 globalThis.Request 还是另一份实例。undici 用 instanceof 认自己的
    Request,认不出就当 URL 字符串处理,于是每条请求在出网之前抛错(HTTP 0)。现在
    Request 只当签名的载体,出网统一走 dispatch():交「字符串 URL + 已展开的普通
    头 + 原字节请求体」,7 处调用点一并收口。
  • 选中 CodeArts 模型后每条消息都「本轮运行失败:Cannot read properties of undefined
    (reading 'length')」(issue #2)
    :@earendil-works/pi-ai 过去只写在 peerDependencies
    (>=0.84.2 <2.0.0),区间不会被安装流程强制满足;插件自己没有 node_modules 时
    import 直接落到 profile 顶层被别的插件 hoist 上来的旧版。旧版的 estimateMessageTokens
    没有 role:"system" 分支,而宿主(dsh-llm-pi-ai 0.2.1-rc.2 起)会把系统提示折叠成
    一条 content 为字符串的 system 消息交给 provider —— 字符串被按字符遍历,读到
    block.name.length 就崩,且崩在出网之前。现在 pi-ai 移进 dependencies(^1.3.0,
    自带一份),并在启动时探测这份能不能估折叠后的 system 消息:不满足就在日志和积分
    卡片上明说「pi-ai 不兼容,需要 >= 1.3.0」,不再让每条消息各自崩在一个看不懂的
    TypeError 上。

dsh-codearts 1.1.1

Choose a tag to compare

@elegant01 elegant01 released this 22 Oct 02:37

1.1.1

  • 2026-10-22

修复

  • 带思考档位的模型(GLM-5.2 / GLM-5.2-ArkTS-SPARK)每轮必失败,报
    Message role cannot empty
    :1.1.0 给这些模型声明了 reasoning,宿主 pi-ai 于是
    把系统提示从 role:"system" 换成 OpenAI 的新叫法 role:"developer" 发出来,
    华为网关只认 system/user/assistant/tool,认不出来就回这一句黑话。出口处统一把
    developer 归一回 system,与档位无关(Default/High/Max 之前都必现)。
  • 新增 GET /api/codearts/debug:回最近 8 次出站请求的形状摘要(消息条数、
    每条的 role 名、工具数),只含 role 名不含任何内容。上游的参数错误全是同一句
    黑话,没有这个就分不清是宿主发的还是插件拼的。

完整记录见 CHANGELOG.md。

dsh-codearts 1.1.0

Choose a tag to compare

@elegant01 elegant01 released this 21 Oct 10:25

1.1.0

  • 2026-10-21

新增

  • 思考强度:模型发现时拉 thinking-variants,只给上游声明过档位的模型(GLM-5.2 /
    GLM-5.2-ArkTS-SPARK:high / max)露出推理选择器,请求以 reasoning_effort 透传;
    这路失败不影响目录。
  • 上游排队:发请求前先向 /api/v1/queue/status 挂号并轮询(每 5 秒一次,最多替
    用户等 20 秒),轮到才开流;等待期间对话底部积分条显示「排队第 N 位」。20 秒
    还没轮到就不挂请求,直接回一句上游自己的排队文案(第几位 / 共多少条)加
    「请稍后重试」;结束、取消、放弃都会 DELETE 清号,不留幽灵排队。
  • 新接口 GET /api/codearts/queue,给卡片读排队快照。

完整记录见 CHANGELOG.md。

v1.0.1 — 更新日志进 README

Choose a tag to compare

@elegant01 elegant01 released this 21 Oct 07:12

文档

  • 新增 CHANGELOG.md,覆盖 0.2.1 ~ 1.0.0,并随 npm 包发布
  • README 中英文版均增加更新日志入口
  • 修正 README 中「CodeArts 不提供积分接口」的过时说明

Full Changelog: v1.0.0...v1.0.1