erio
180cf97588
fix(ui): show token breakdown when image model uses token billing
...
Only display image count format when billing_mode is "image".
When channel has token pricing, show input/output/cache token details.
2026-04-02 01:45:13 +08:00
erio
6b69e5c7cf
fix(ui): also fix floating point precision in mTokToPerToken
2026-04-01 23:18:03 +08:00
erio
2646173a84
fix(ui): floating point precision in perTokenToMTok conversion
2026-04-01 23:15:59 +08:00
erio
5f48e903bf
fix: address audit findings - cache sync, validation, consistency
...
- clearCreditsExhausted: sync Redis scheduler cache after DB update
- Image billing mode UI: write to per_request_price instead of image_output_price
- OpenAI RecordUsage: use BillingModelSourceRequested constant, add s.cfg nil guard
- Fix i18n key path: admin.channels.perRequestPriceRequired → admin.channels.form.perRequestPriceRequired
2026-04-01 23:13:58 +08:00
erio
8b179af2e4
fix: validate empty intervals + antigravity platform pricing match
...
- Backend: reject intervals with all-null price fields on save
- Backend: filterValidIntervals skips empty intervals in pricing resolver
- Frontend: red border + asterisk on empty interval rows
- Backend: antigravity groups now match anthropic/gemini channel pricing
2026-04-01 22:03:00 +08:00
erio
72731a81cf
feat(ui): display three-level model mapping chain in usage logs
...
- Show channel + account mapping steps using model_mapping_chain field
- Add model_mapping_chain to AdminUsageLog TypeScript type
- Fallback to two-level display when chain is not available
- Fix cost nil guard in Anthropic/Antigravity RecordUsage paths
- Bump version to 0.1.105.31
2026-04-01 17:57:11 +08:00
erio
a1216b8839
feat: image output token billing, channel-mapped billing source, credits balance precheck
...
- Parse candidatesTokensDetails from Gemini API to separate image/text output tokens
- Add image_output_tokens and image_output_cost to usage_log (migration 089)
- Support per-image-token pricing via output_cost_per_image_token from model pricing data
- Channel pricing ImageOutputPrice override works in token billing mode
- Auto-fill image_output_price in channel pricing form from model defaults
- Add "channel_mapped" billing model source as new default (migration 088)
- Bills by model name after channel mapping, before account mapping
- Fix channel cache error TTL sign error (115s → 5s)
- Fix Update channel only invalidating new groups, not removed groups
- Fix frontend model_mapping clearing sending undefined instead of {}
- Credits balance precheck via shared AccountUsageService cache before injection
- Skip credits injection for accounts with insufficient balance
- Don't mark credits exhausted for "exhausted your capacity on this model" 429s
2026-04-01 15:08:57 +08:00
erio
7abc6e02f4
feat(channel): 渠道管理全链路集成 — 模型映射、定价、限制、用量统计
...
- 渠道模型映射:支持精确匹配和通配符映射,按平台隔离
- 渠道模型定价:支持 token/按次/图片三种计费模式,区间分层定价
- 模型限制:渠道可限制仅允许定价列表中的模型
- 计费模型来源:支持 requested/upstream 两种计费模型选择
- 用量统计:usage_logs 新增 channel_id/model_mapping_chain/billing_tier/billing_mode 字段
- Dashboard 支持 model_source 维度(requested/upstream/mapping)查看模型统计
- 全部 gateway handler 统一接入 ResolveChannelMappingAndRestrict
- 修复测试:同步 SoraGenerationRepository 接口、SQL INSERT 参数、scan 字段
2026-04-01 01:51:19 +08:00
erio
34267c0395
fix(ui): 模型映射改用平台色字体,删除多余的边框色函数
2026-03-31 21:36:45 +08:00
erio
ddef383903
fix(ui): 模型映射输入框改为平台色字体,保持默认边框
2026-03-31 21:35:31 +08:00
erio
1b6b3cf2fa
feat(ui): 渠道表单模型标签和映射输入框显示平台对应颜色
...
- PricingEntryCard 折叠态模型 tag 按平台着色
- ModelTagInput 模型标签按平台着色
- 模型映射输入框边框按平台着色
2026-03-31 21:27:32 +08:00
erio
5631c5f20c
feat(ui): 渠道列表状态列改为 Toggle 开关,支持直接启用/禁用
2026-03-31 21:21:03 +08:00
erio
963c3b5dd6
fix(ui): 渠道定价折叠态模型名完整展示,不再截断
...
去掉 max-w-[120px] truncate 限制,改用 flex-wrap 允许换行,
充分利用空白区域展示完整模型名。
2026-03-31 20:48:18 +08:00
erio
9311ca31fc
fix(channel): 前端重复模型校验改为按平台检查
...
后端 validateNoDuplicateModels 使用 platform:model 复合键,
前端之前跨平台扁平化检查导致不同平台下的同名模型误报重复。
2026-03-31 19:40:07 +08:00
erio
da72cf670a
fix(channel): 渠道表单校验增强 — 空模型定价报错 + 必填标记
...
- 保存时校验:定价条目有但模型列表为空时报错并跳转到对应平台 tab,
不再静默跳过导致数据丢失
- 保存时校验:启用的平台必须至少选择一个分组
- 分组关联标签增加红色 * 必填标记
2026-03-31 19:22:48 +08:00
erio
b4514501dd
Merge remote-tracking branch 'origin/feature/channel' into release/custom-0.1.105
2026-03-31 02:11:52 +08:00
erio
d1791f43f8
refactor(channel): 抽取渠道映射公共函数 + OpenAI映射到body + 空响应修复 + 清理日志
...
- 抽取 ResolveChannelMappingAndRestrict 统一入口(5处→1个方法)
- 抽取 BuildModelMappingChain 到 ChannelMappingResult 方法(5处→1行调用)
- OpenAI 三入口 Forward 前应用渠道映射到请求体
- OpenAI Responses/Messages 限制检查添加错误响应
- 清理前端 3 处 console.log 调试日志
2026-03-31 02:11:24 +08:00
erio
8741864b79
Merge remote-tracking branch 'origin/feature/channel' into release/custom-0.1.105
2026-03-31 01:34:37 +08:00
erio
946180ef0d
fix(channel): 模型限制用映射后模型检查 + 平台开关保留配置不删除
...
- OpenAI 网关三处 IsModelRestricted 改用 channelMapping.MappedModel
- 前端平台勾选改为 enabled 开关,取消勾选不清空配置数据
- formToAPI/校验只处理 enabled 的平台
2026-03-31 01:34:16 +08:00
erio
f27f1254ae
Merge remote-tracking branch 'origin/feature/channel' into release/custom-0.1.105
2026-03-31 00:24:22 +08:00
erio
a65a8bcd93
feat(channel): 通配符定价匹配 + OpenAI BillingModelSource + 按次价格校验 + 用户端计费模式展示
...
- 定价查找支持通配符(suffix *),最长前缀优先匹配
- 模型限制(restrict_models)同样支持通配符匹配
- OpenAI 网关接入渠道映射/BillingModelSource/模型限制
- 按次/图片计费模式创建时强制要求价格或层级(前后端)
- 用户使用记录列表增加计费模式 badge 列
2026-03-31 00:23:45 +08:00
erio
54976c77ce
merge: feature/channel → release (v0.1.105.14) — 使用记录计费模式
2026-03-30 22:14:24 +08:00
erio
9e848ec2f0
feat(usage): 使用记录增加计费模式字段 — 记录/展示/筛选 token/按次/图片
...
- DB: usage_logs 表新增 billing_mode VARCHAR(20) 列
- 后端: RecordUsage 写入时根据 image_count 判定计费模式
- 前端: 使用记录表格新增计费模式 badge 列 + 筛选下拉
2026-03-30 22:13:16 +08:00
erio
a0d15fe784
Merge remote-tracking branch 'origin/feature/channel' into release/custom-0.1.105
2026-03-30 21:47:21 +08:00
erio
bef6728ada
fix(channel): splice替换model_pricing条目 + 增强调试日志
2026-03-30 21:47:06 +08:00
erio
465ec9a9f3
Merge remote-tracking branch 'origin/feature/channel' into release/custom-0.1.105
2026-03-30 21:37:57 +08:00
erio
79c3f4481a
debug(channel): 添加 formToAPI 调试日志 + 移除 Sora 平台
2026-03-30 21:37:27 +08:00
erio
b42b2a7491
Merge remote-tracking branch 'origin/feature/channel' into release/custom-0.1.105
2026-03-30 21:06:55 +08:00
erio
47d52a971e
feat(channel): 平台配置改为勾选式,勾选后出现 Tab 但不自动跳转
2026-03-30 21:06:38 +08:00
erio
4e966d2331
Merge remote-tracking branch 'origin/feature/channel' into release/custom-0.1.105
2026-03-30 19:06:28 +08:00
erio
6f6365e2c0
feat(channel): 对话框 Tab 布局 — 基础设置 + 平台独立 Tab + 固定高度
2026-03-30 19:06:03 +08:00
erio
a77eb1dc21
Merge remote-tracking branch 'origin/feature/channel' into release/custom-0.1.105
2026-03-30 17:51:18 +08:00
erio
ed4a4f95f6
fix(channel): 分组加载时序修复 — 预加载 + await 确保分组数据就绪
2026-03-30 17:50:48 +08:00
erio
467bba161c
merge: feature/channel → release/custom-0.1.105 (v0.1.105.8)
2026-03-30 17:27:12 +08:00
erio
2f9f7de19d
fix(i18n): 渠道管理页面标题国际化
2026-03-30 17:26:16 +08:00
erio
2f1168a126
Merge remote-tracking branch 'origin/feature/channel' into release/custom-0.1.105
...
# Conflicts:
# backend/cmd/server/wire_gen.go
2026-03-30 16:13:52 +08:00
erio
c74c6f3f1f
feat(channel): 模型价格自动填充 + 默认定价 API
...
- 新增 GET /admin/channels/model-pricing?model=xxx API
- 从 BillingService 查询 LiteLLM/Fallback 默认定价
- 前端添加模型时自动查询并填充价格($/MTok)
- 仅在所有价格字段为空时才自动填充,不覆盖手动配置
2026-03-30 16:11:49 +08:00
erio
b80361e57a
Merge remote-tracking branch 'origin/feature/channel' into release/custom-0.1.105
2026-03-30 15:04:48 +08:00
erio
c67e5a9cd9
feat(channel): 缓存扁平化 + 网关映射集成 + 计费模式统一 + 模型限制
...
- 缓存按 (groupID, platform, model) 三维 key 扁平化,避免跨平台同名模型冲突
- buildCache 批量查询 group platform,按平台过滤展开定价和映射
- model_mapping 改为嵌套格式 {platform: {src: dst}}
- channel_model_pricing 新增 platform 列
- 前端按平台维度重构:每个平台独立配置分组/映射/定价
- 迁移 086: platform 列 + model_mapping 嵌套格式迁移
2026-03-30 15:04:30 +08:00
erio
0924ef3c36
Merge branch 'feature/channel' into release/custom-0.1.105
2026-03-30 13:40:52 +08:00
erio
204da5c455
fix(channel): 分组紧凑布局+平台颜色名称+计费基准重命名+表单排序调整
2026-03-30 13:40:29 +08:00
erio
6b68152540
Merge branch 'feature/channel' into release/custom-0.1.105
...
# Conflicts:
# backend/cmd/server/VERSION
# backend/internal/handler/admin/channel_handler.go
# backend/internal/service/channel.go
2026-03-30 13:27:26 +08:00
erio
19d1a28e23
feat(channel): 缓存扁平化 + 网关映射集成 + 计费模式统一 + 模型限制
...
- 缓存重构为 O(1) 哈希结构 (pricingByGroupModel, mappingByGroupModel)
- 渠道模型映射接入网关流程 (Forward 前应用, a→b→c 映射链)
- 新增 billing_model_source 配置 (请求模型/最终模型计费)
- usage_logs 新增 channel_id, model_mapping_chain, billing_tier 字段
- 每种计费模式统一支持默认价格 + 区间定价
- 渠道模型限制开关 (restrict_models)
- 分组按平台分类展示 + 彩色图标
- 必填字段红色星号 + 模型映射 UI
- 去除模型通配符支持
2026-03-30 13:26:05 +08:00
erio
151ea48b87
Merge remote-tracking branch 'origin/feature/channel' into release/custom-0.1.105
...
# Conflicts:
# backend/internal/handler/admin/channel_handler.go
2026-03-30 02:38:18 +08:00
erio
e2f0df78ce
feat(channel): 模型映射 + 分组搜索 + 卡片折叠 + 冲突校验
...
- 渠道模型映射:新增 model_mapping JSONB 字段,在账号映射之前执行
- 分组选择:添加搜索过滤 + 平台图标
- 定价卡片:支持折叠/展开,已有数据默认折叠
- 模型冲突校验:前后端均禁止同一渠道内重复模型
- 迁移 083: channels 表添加 model_mapping 列
2026-03-30 02:36:04 +08:00
erio
755bf44e4d
Merge remote-tracking branch 'origin/feature/channel' into release/custom-0.1.105
2026-03-30 02:25:12 +08:00
erio
e4814e4c77
feat(channel): 模型标签输入 + $/MTok 价格单位 + 左开右闭区间 + i18n
...
- 模型输入改为标签列表(输入回车添加,支持粘贴批量导入)
- 价格显示单位改为 $/MTok(每百万 token),提交时自动转换
- Token 模式增加图片输出价格字段(适配 Gemini 图片模型按 token 计费)
- 区间边界改为左开右闭 (min, max],右边界包含
- 默认价格作为未命中区间时的回退价格
- 添加完整中英文 i18n 翻译
2026-03-30 02:24:54 +08:00
erio
9e9285c25a
Merge remote-tracking branch 'origin/feature/channel' into release/custom-0.1.105
...
# Conflicts:
# backend/cmd/server/wire_gen.go
# backend/internal/handler/handler.go
# backend/internal/handler/wire.go
2026-03-30 02:05:59 +08:00
erio
a9117600a5
feat(channel): 渠道管理系统 — 多模式定价 + 统一计费解析
...
新增渠道管理功能,支持三种计费模式(Token 区间/按次/图片),
统一定价解析链(Channel → LiteLLM → Fallback),
无渠道配置时保持原有计费逻辑不变。
Backend:
- 新增 channels/channel_groups/channel_model_pricing/channel_pricing_intervals 表
- ChannelService: atomic.Value + singleflight 缓存,通配符模型匹配
- ModelPricingResolver: 统一定价解析器
- BillingService: CalculateCostUnified 统一计费入口
- 完整输入验证(BillingMode/价格非负/名称长度)
- 33 个单元测试覆盖核心路径
Frontend:
- ChannelsView.vue: 渠道 CRUD 列表页
- PricingEntryCard.vue + IntervalRow.vue: 定价编辑组件
- 支持三种计费模式切换 + 区间编辑
2026-03-30 02:03:06 +08:00
erio
0393981397
merge: integrate upstream v0.1.105 into release/custom-0.1.105
...
Merge upstream v0.1.105 (94 commits) with our customizations from
release/custom-0.1.104. Key upstream additions:
- TLS fingerprint profile management
- OpenAI→Anthropic endpoint compatibility routing
- Privacy mode for OpenAI/Antigravity accounts
- Requested model tracking in usage logs
- Error observability enhancements
- Various bug fixes
Conflict resolutions (all "keep both sides"):
- handler.go/wire.go: added both TLSFingerprintProfile and GDriveOAuth
- wire_gen.go: combined internal500CounterCache with TLS fingerprint objects
- accounts.ts: kept setPrivacy + affinity functions
- BulkEditAccountModal.vue: kept OpenAI WS mode + Allow Overages sections
Additional fixes:
- gateway_handler_chat_completions.go, gateway_handler_responses.go:
added missing sub2apiUserID parameter to SelectAccountWithLoadAwareness
- antigravity_internal500_penalty.go: gofmt fix
2026-03-27 18:23:39 +08:00