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
dc0870ad0a
chore: bump version to 0.1.105.29
2026-04-01 02:41:00 +08:00
erio
9a9eadeba0
chore: bump version to 0.1.105.28
2026-04-01 01:51:25 +08:00
erio
ae3c6b5881
chore: bump version to 0.1.105.27
2026-03-31 21:35:31 +08:00
erio
68fb629280
chore: bump version to 0.1.105.26
2026-03-31 21:27:32 +08:00
erio
513da0f4f7
chore: bump version to 0.1.105.25
2026-03-31 21:21:03 +08:00
erio
729530dfa6
chore: bump version to 0.1.105.24
2026-03-31 20:48:18 +08:00
erio
493fa9d4c2
chore: bump version to 0.1.105.23
2026-03-31 20:38:02 +08:00
erio
5a2d423d02
chore: bump version to 0.1.105.22
2026-03-31 20:11:46 +08:00
erio
788288c86b
chore: bump version to 0.1.105.21
2026-03-31 19:40:18 +08:00
erio
c8eec9c076
chore: bump version to 0.1.105.20
2026-03-31 17:50:39 +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
7347916f09
Merge remote-tracking branch 'origin/feature/channel' into release/custom-0.1.105
2026-03-30 23:05:04 +08:00
erio
08593ea3e4
fix(billing): 按次计费回退到默认 PerRequestPrice
...
ResolvedPricing 新增 DefaultPerRequestPrice,当无层级匹配时使用渠道的默认按次价格
2026-03-30 23:04:48 +08:00
erio
9876c05efc
merge: feature/channel → release (v0.1.105.15) — 计费迁移到 CalculateCostUnified
2026-03-30 22:59:15 +08:00
erio
f0d5163973
feat(billing): 网关计费迁移到 CalculateCostUnified + 模型限制错误统一
...
- GatewayService/OpenAIGatewayService 注入 ModelPricingResolver
- RecordUsage 从旧路径迁移到 CalculateCostUnified(支持 per_request/image 模式)
- 无渠道时自动回退旧路径,保持原有行为
- 长上下文双倍计费仅在无渠道定价时生效
- CostBreakdown 新增 BillingMode 字段,使用日志记录实际计费模式
- 模型限制错误改为与"无可用账号"相同的 503 响应
2026-03-30 22:58:28 +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
4db51115cd
chore: bump version to 0.1.105.7
2026-03-30 16:13:53 +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
f954e3875e
chore: bump version to 0.1.105.6
2026-03-30 15:04:58 +08:00
erio
a6b62e7508
chore: bump version to 0.1.105.7
2026-03-30 13:40:59 +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
00b48ab436
chore: bump version to 0.1.105.5
2026-03-30 02:38:18 +08:00
erio
6fa385255d
chore: bump version to 0.1.105.4
2026-03-30 02:25:23 +08:00
erio
e87ed88090
chore: bump version to 0.1.105.3
2026-03-30 02:14:30 +08:00
erio
3fd0361542
chore: bump version to 0.1.105.2
2026-03-30 02:06:07 +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
shaw
1854050df3
feat(tls-fingerprint): 新增 TLS 指纹 Profile 数据库管理及代码质量优化
...
新增功能:
- 新增 TLS 指纹 Profile CRUD 管理(Ent schema + 迁移 + Admin API + 前端管理界面)
- 支持账号绑定数据库中的自定义 TLS Profile,或随机选择(profile_id=-1)
- HTTPUpstream.DoWithTLS 接口从 bool 改为 *tlsfingerprint.Profile,支持按账号指定 Profile
- AccountUsageService 注入 TLSFingerprintProfileService,统一 usage 场景与网关的 Profile 解析逻辑
代码优化:
- 删除已被 TLSFingerprintProfileService 完全取代的 registry.go 死代码(418 行)
- 提取 3 个 dialer 的重复 TLS 握手逻辑为 performTLSHandshake() 共用函数
- 修复 GetTLSFingerprintProfileID 缺少 json.Number 处理的 bug
- gateway_service.Forward 中 ResolveTLSProfile 从重试循环内重复调用改为预解析局部变量
- 删除冗余的 buildClientHelloSpec() 单行 wrapper 和 int64(e.ID) 无效转换
- tls_fingerprint_profile_cache.go 日志从 log.Printf 改为 slog 结构化日志
- dialer_capture_test.go 添加 //go:build integration 标签,防止 CI 失败
- 去重 TestProfileExpectation 类型至共享 test_types_test.go
- 修复 9 个测试文件缺少 tlsfingerprint import 的编译错误
- 修复 error_policy_integration_test.go 中 handleError 回调签名被错误替换的问题
2026-03-27 14:33:05 +08:00