feat(channels): 渠道未填价时按 LiteLLM 默认价展示
「可用渠道」展示链路有两个未覆盖场景导致用户看到"未配置定价":
1. admin 在 UI 里建了 ModelPricing 条目但没填任何价格 (常见于
per_request / image 模式只填了 tier_label 没填单价): 原 fallback
只检查 Pricing == nil, 这种空条目会跳过 LiteLLM 兜底。
2. LiteLLM 把图片模型标记 mode=image_generation, 但合成器固定按
token 模式合成, 把 OutputCostPerImage / 图片 token 价丢到错误字段。
改动 (仅 backend/internal/service/channel_available.go):
- 新增 pricingNeedsFallback: 价格字段全空 (含 intervals 全空) 视为
未配置, 触发 LiteLLM 兜底。
- synthesizePricingFromLiteLLM 加 existing 参数: 优先尊重渠道已选
BillingMode (per_request / image 也按此模式合成), 没选才看 LiteLLM
mode, 仍未命中默认 token。
- image / per_request 分支用 OutputCostPerImage 填 PerRequestPrice,
OutputCostPerImageToken 填 ImageOutputPrice, 让 gpt-image / dall-e
系列展示出参考价。
仅影响展示链路, 真实计费走 BillingService / ModelPricingResolver
完全不受影响。新增 8 个单元测试覆盖 pricingNeedsFallback 各分支、
合成器三种模式选择、空条目兜底与既有价格保护。