package model import "math" // ============================================================================ // 成本折扣率(price_discount_percent)相关函数 // ============================================================================ // ApplyChannelPriceDiscountToQuota 将「原价算出的额度」乘以渠道折扣(百分数转小数,如 60% -> ×0.6)。 // percent 为渠道存储值:100=不打折,0=全免;<0 或越上限时与 ResolvedPriceDiscountPercent 对齐。 func ApplyChannelPriceDiscountToQuota(quota int, percent float64) int { percent = clampChannelPriceDiscountPercent(percent) if quota == 0 { return 0 } return int(math.Round(float64(quota) * (percent / 100.0))) } // clampChannelPriceDiscountPercent 将渠道折扣限制在合理范围;负值或 nil 读出的 0 在 Resolved 中已处理。 func clampChannelPriceDiscountPercent(percent float64) float64 { if percent < 0 { return 0 } if percent > 1000 { return 1000 } return percent } // ResolvedPriceDiscountPercent 返回用于计费的成本折扣百分数,缺省/NULL 视为 100(无折扣)。 func (c *Channel) ResolvedPriceDiscountPercent() float64 { if c == nil { return 100 } if c.PriceDiscountPercent == nil { return 100 } return clampChannelPriceDiscountPercent(*c.PriceDiscountPercent) } // ResolveChannelPriceDiscountPercent 按渠道 ID 从缓存取渠道并解析成本折扣,失败或无渠道时 100%。 func ResolveChannelPriceDiscountPercent(channelId int) float64 { if channelId <= 0 { return 100 } ch, err := CacheGetChannel(channelId) if err != nil || ch == nil { return 100 } return ch.ResolvedPriceDiscountPercent() } // ChannelPriceDiscountMultiplierForPricing 用于展示:把 60% 转为 0.6。 func ChannelPriceDiscountMultiplierForPricing(percent float64) float64 { percent = clampChannelPriceDiscountPercent(percent) return percent / 100.0 } // ============================================================================ // 加价折扣率(markup_discount_rate)相关函数 // ============================================================================ // clampChannelMarkupDiscountRate 将加价折扣率限制在合理范围(0-1000%)。 func clampChannelMarkupDiscountRate(percent float64) float64 { if percent < 0 { return 0 } if percent > 1000 { return 1000 } return percent } // ResolvedMarkupDiscountRate 返回用于计费的加价折扣百分数,缺省/NULL 视为 0(无加价)。 func (c *Channel) ResolvedMarkupDiscountRate() float64 { if c == nil { return 0 } if c.MarkupDiscountRate == nil { return 0 } return clampChannelMarkupDiscountRate(*c.MarkupDiscountRate) } // ResolveChannelMarkupDiscountRate 按渠道 ID 从缓存取渠道并解析加价折扣,失败或无渠道时 0%。 func ResolveChannelMarkupDiscountRate(channelId int) float64 { if channelId <= 0 { return 0 } ch, err := CacheGetChannel(channelId) if err != nil || ch == nil { return 0 } return ch.ResolvedMarkupDiscountRate() } // ============================================================================ // 新计费公式辅助函数 // ============================================================================ // 新公式(各类型独立有效倍率,所有百分比字段按 % 计算,如 90 代表 90%): // 输入 = (ch.model_ratio × costDisc% + globalMr × markupRate%) × 2 × groupRatio(展示价;扣费为 tokens×有效倍率×groupRatio) // 输出 = (ch.model_ratio × completionRatio × costDisc% + globalMr × 全局输出倍率 × markupRate%) × 2 × groupRatio // 缓存读取 = (ch.model_ratio × ch.cache_ratio × costDisc% + globalMr × 全局读取缓存倍率 × markupRate%) × 2 × groupRatio // 缓存创建 = (ch.model_ratio × ch.create_cache_ratio × costDisc% + globalMr × 全局创建缓存倍率 × markupRate%) × 2 × groupRatio // 固定价格 = (ch.model_price × costDisc% + 全局固定价 × markupRate%) × groupRatio // ============================================================================ // EffectiveInputRate 计算有效输入倍率(不含分组倍率)。 // channelRatio: 渠道解析后的模型输入倍率(渠道无设置时已回退至全局) // globalRatio: 全局模型输入倍率(ratio_setting.GetModelRatio 返回值) // costDiscPercent: 成本折扣率百分数(price_discount_percent,如 90 表示 90%) // markupDiscPercent: 加价折扣率百分数(markup_discount_rate,如 5 表示 5%) func EffectiveInputRate(channelRatio, globalRatio, costDiscPercent, markupDiscPercent float64) float64 { return channelRatio*(costDiscPercent/100.0) + globalRatio*(markupDiscPercent/100.0) } // EffectiveOutputRate 计算有效输出倍率(每输出 token 的有效价格,不含分组倍率)。 // channelRatio: 渠道解析后的模型输入倍率 // completionRatio: 渠道解析后的输出倍率(相对于输入价格的倍数) // globalRatio: 全局模型输入倍率 // globalCompletionRatio: 全局模型输出倍率(用于加价部分) // costDiscPercent/markupDiscPercent: 成本/加价折扣率百分数 // // 新公式:输出 = channelRatio × completionRatio × costDisc% + globalRatio × globalCompletionRatio × markupDisc% func EffectiveOutputRate(channelRatio, completionRatio, globalRatio, globalCompletionRatio, costDiscPercent, markupDiscPercent float64) float64 { return channelRatio*completionRatio*(costDiscPercent/100.0) + globalRatio*globalCompletionRatio*(markupDiscPercent/100.0) } // EffectiveCacheReadRate 计算有效缓存读取倍率(每个缓存读取 token 的有效价格,不含分组倍率)。 // channelRatio: 渠道解析后的模型输入倍率 // channelCacheRatio: 渠道解析后的缓存读取倍率 // globalRatio: 全局模型输入倍率 // globalCacheRatio: 全局缓存读取倍率(用于加价部分) // costDiscPercent/markupDiscPercent: 成本/加价折扣率百分数 // // 新公式:缓存读取 = channelRatio × channelCacheRatio × costDisc% + globalRatio × globalCacheRatio × markupDisc% func EffectiveCacheReadRate(channelRatio, channelCacheRatio, globalRatio, globalCacheRatio, costDiscPercent, markupDiscPercent float64) float64 { return channelRatio*channelCacheRatio*(costDiscPercent/100.0) + globalRatio*globalCacheRatio*(markupDiscPercent/100.0) } // EffectiveCacheCreationRate 计算有效缓存创建倍率(每个缓存写入 token 的有效价格,不含分组倍率)。 // channelRatio: 渠道解析后的模型输入倍率 // channelCreateCacheRatio: 渠道解析后的缓存创建倍率 // globalRatio: 全局模型输入倍率 // globalCreateCacheRatio: 全局缓存创建倍率(用于加价部分) // costDiscPercent/markupDiscPercent: 成本/加价折扣率百分数 // // 新公式:缓存创建 = channelRatio × channelCreateCacheRatio × costDisc% + globalRatio × globalCreateCacheRatio × markupDisc% func EffectiveCacheCreationRate(channelRatio, channelCreateCacheRatio, globalRatio, globalCreateCacheRatio, costDiscPercent, markupDiscPercent float64) float64 { return channelRatio*channelCreateCacheRatio*(costDiscPercent/100.0) + globalRatio*globalCreateCacheRatio*(markupDiscPercent/100.0) } // EffectiveModelPrice 计算有效固定价格(USD/次,不含分组倍率)。 // channelPrice: 渠道解析后的固定价(渠道无设置时已回退至全局) // globalPrice: 全局模型固定价(ratio_setting.GetModelPrice 返回值) // costDiscPercent/markupDiscPercent: 成本/加价折扣率百分数 func EffectiveModelPrice(channelPrice, globalPrice, costDiscPercent, markupDiscPercent float64) float64 { return channelPrice*(costDiscPercent/100.0) + globalPrice*(markupDiscPercent/100.0) } // EffectiveRuleUnitPrice 视频/图片等「规则表单价」(美元/秒、美元/张、美元/条)的有效价。 // 与 EffectiveModelPrice 相同:渠道规则价 × 成本折扣% + 全局规则价 × 加价折扣%。 // 当全局规则价未配置时,回退为渠道规则价,使渠道 markup_discount_rate 仍可作用于规则计费。 func EffectiveRuleUnitPrice(channelRuleUSD, globalRuleUSD, costDiscPercent, markupDiscPercent float64) float64 { if globalRuleUSD <= 0 { globalRuleUSD = channelRuleUSD } return EffectiveModelPrice(channelRuleUSD, globalRuleUSD, costDiscPercent, markupDiscPercent) }