|
|
ed954b77bd
|
fix(channels): buddy 计费请求缺身份头 → 上游 401(逐行移植参考 checkinHeaders)
修好凭据读取后,余额端点仍报 HTTP 401。逐行核对参考 checkinHeaders
(credits.ts) 后发现我们只发了 Authorization,而 buddy 要求身份标识头齐全:
X-Domain: copilot.tencent.com (以产品配置为准,不用凭据里的 domain 快照)
X-Product: SaaS (部署类型)
X-Product-Code: codebuddy (产品码)
User-Agent: CodeBuddyIDE/1.106.1
X-User-Id / X-Enterprise-Id / X-Tenant-Id(凭据携带时)
参考的注释特别警告 X-Domain 的方向:凭据里的 domain 是「登录时那个域名」的
快照,跨产品迁移后会指错区域,所以必须以产品端点为准。
## 实现
- 平台级声明 headers_fn(accessToken, cred) → 返回请求头表;buddy 据此逐行移植。
- fetchAccountJSON 增加头钩子位:spec 自己的 headers_fn 优先,否则回退平台级。
未声明的平台仍走通用默认头(Bearer + JSON),不改变既有行为。
- set_endpoints 补齐 checkin_status / balance 端点覆盖(此前只覆盖旧的
plat.checkin,buddy 这类平台无从改指,自动化测试也指不到假上游)。
端点覆盖是参考明确的产品配置能力,也是测试缝。
## 判据
TestBuddyBillingHeadersMatchReference:把 buddy 余额端点指到本地假上游,
断言四个必备身份头逐字段正确。变异:改名 headers_fn → 立即 FAIL(已实测)。
go test ./internal/core/ 与 ./internal/lua/ 全绿。
|
2026-10-13 07:57:46 +08:00 |
|
|
|
6b6f9526ff
|
feat(channels): 对外功能面全量对齐参考 channel-pack RPC + 逐平台余额/签到状态端点
此前只实现了参考 RPC 面的一部分(账号池/模型开关/供应商/备份)。本次按
用户要求把对外呈现的功能补齐到与参考 channel-pack-rpc.ts 一致,并逐平台
移植真实余额/签到状态端点(不再'选一部分')。
## 新增 RPC(对齐 channel-pack-rpc.ts 的 case 清单)
credits.status 逐账号签到状态(平台声明 checkin_status 时查,status_fn 解析;
无端点平台如实 null,与参考对 CodeArts/LobsterAI 处理一致)
credits.balances 逐账号余额(平台声明 balance 时查,total_fn 解析;无端点/无凭据
返回 {balance=null,error=...} 不编造数字 —— 对齐参考'不伪装余额')
credits.permanentLock 永久积分锁定读写(buddy/loomy 等)
account.reset/retest 清限流标记 / 重测(支持 __all__ 批量)
model.setDisabledMany 批量模型开关
model.clearDead 清黑名单里已下线的死模型(只清不在 models 表的 id)
provider.getOrder/setOrder 供应商显示顺序(bogus id 过滤)
gateway.getEnabled/setEnabled 网关整体开关(复用 provider_set_enabled 语义)
backup.status 备份健康度(账号数/无过期时间账号数)
usage.tokenLedger 本网关 token 用量快照(数据源 /api/stats,与 usage 插件同思路)
usage.badge 渠道徽标(credits.balances 汇总)
usage.badgePreference 徽标偏好读写(非法值拒绝不回落,对齐参考注释)
onboarding.status/claim 新人任务(raccoon 桌面登录奖励 3000 分实测端点)
## 逐平台真实余额/签到端点(照各 *-credits.ts 逐字移植)
minimax signin/status 预检 + credit/details 余额(total=Σ remaining_amount,
避开参考踩过的 total_count 误读坑)
trae checkin_credits/status + ide_user_ent_usage(remain=Σ(limit-amount))
buddy checkin-activity-status(不是 checkin-status 占位坑)+ get-user-resource
cline usage-limits(dollars,取剩余百分比最小的限额)
lobsterai profile-summary;qoder me/usage(userQuota+addOnQuota);raccoon points/v1/balance
每平台 CHANNEL_CREDITS 能力表声明 unit/claim(对齐参考同名表)。
## WebUI 补齐
账号行展示逐账号余额(credits.balances);详情动作区加「重置限流」「清死模型」;
顶栏加「Token 用量」弹窗(usage.tokenLedger)。node --check 过。
## 测试
TestChannelsExtendedRPCBehavior 10 子项全过:balances 无凭据报错不编造、status
无端点 null、reset、setDisabledMany、clearDead 只清死模型、provider order 过滤、
backup.status、badgePreference 非法拒绝、onboarding supported=false、permanentLock 读写。
全量 8 包回归通过。
已知未移植(如实说明,均需本机无法提供的运行时):captcha.*(zcode 验证码载体,
需浏览器端求解器)、login.sendSms/submitSms(loomy 短信,备用路径)、
cline.requestLog/usage.tokenLedgerHistory(历史聚合,内核未落盘日维度表)。
|
2026-10-12 08:45:49 +08:00 |
|
|
|
4d0efab86b
|
feat(channels): 渠道控制台对齐参考 ChannelCard —— 账号池/模型开关/供应商治理/备份 + 全量 UI
用户要求与示例插件 dsh-our-free-model 的 WebUI 全面对齐。参考前端的
核心是 ChannelCard(client.js 3627 行起):一个渠道可挂**多账号池**,
账号可逐个启用/停用/测试/删除/排序,模型可逐个开关,供应商整体开关,
账号备份导出/导入,自动签到开关。此前是单凭据 + 平表登录,差距大。
## 后端(channels.lua 新增 19 个 RPC,对齐参考 channel-pack 契约)
账号池(对齐参考 account.*):
account_add/list/update/delete/test/refresh/reorder —— 一平台多账号,
每账号一条上游源 channels-<plat>-<aid>,凭据走保险库(0600 加密落盘)。
complete_login 带 account_id 时走池路径回填凭据。
模型开关(对齐 model.*):
model_list/set_disabled/set_all_disabled —— 黑名单存 state,开关即重同步
该平台所有账号源(关掉模型=该账号源里去掉该模型)。
供应商治理(对齐 provider.*):
provider_status(账号数/模型数/closed 态)+ provider_set_enabled
(关闭=全关模型+停用全部账号;打开=清黑名单+启用全部账号)。
一键领取(对齐 credits.claimAll):
credits_claim_all —— 逐账号 claim_daily 收集结果,返回 {claimed, results}。
备份(对齐 backup.*):
backup_export/import —— 账号池+凭据+模型黑名单+自动签到开关打包,导入
恢复凭据(走保险库)+重建全部账号源。
自动签到开关(对齐 usage.autoCheckin):
auto_checkin —— 读写 state.settings.auto_checkin,关闭时 auto_claim 跳过。
auto_claim 升级为账号池驱动(逐账号 claim + 尊重 CHANNEL_CREDITS 能力表)。
**修一个真 bug**:__llmsproxy_secrets.set 返回 (true, nil) 成功 / (nil, err) 失败,
我多值赋给单变量拿到第一个返回值,误判为失败 → 改为 local _, serr = set(...)。
## WebUI(整个重写,对齐 ChannelCard 交互)
渠道网格(搜索/筛选全部·已接入·待接入/汇总条已接入N·账号总数)
→ 渠道详情(账号池列表:昵称/启用态/上次领取摘要 + 测试/刷新/停用/优先/删除;
模型折叠:逐个开关 + 全部启用/关闭 + 计数;添加账号=登录(占位账号先入池,
login 完成回填凭据,两步式对齐参考 account.create);一键领取额度(结果
摘要展示成功数+失败原因);供应商整体开关;自动签到开关;导出/导入备份)。
登录区仍覆盖 device-poll/callback/paste/manual/vnc 全部流程。
node --check 过内联 JS;凭据只经 complete_login 落保险库,不回显。
## 行为测试(channels_pool_test.go)
TestChannelsAccountPoolBehavior 5 个子测试全过:
账号增删改(含返回 account_id、改名、删空)
模型开关同步上游源(3模型→关1→2→全关→closed=true→全开恢复)
enabled开关同步上游源(停用删源、启用重建源)
供应商整体开关(关→无源+closed;开→源重建)
备份导出含凭据明文
## 已知边界(如实说明,未假装对齐)
- 余额逐账号展示:参考有 credits.balances(真实查上游余额),本环境各平台余额
端点形状差异大且多数需真实凭据,未编造假余额;账号行只显示上次领取摘要。
- usage.tokenLedger / cline.requestLog(用量账本/请求日志页):参考有,本插件
内核侧已有 usage 记录但未暴露给插件,暂缺这两页(其余控制台能力已对齐)。
回归:全量 8 包(core/lua/gateway/config/types/scheduler/provider/e2e)通过。
|
2026-10-12 08:18:33 +08:00 |
|