File size: 2,037 Bytes
69b897d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | const redis = require('../models/redis')
const pricingService = require('../services/pricingService')
const CostCalculator = require('./costCalculator')
function toNumber(value) {
const num = Number(value)
return Number.isFinite(num) ? num : 0
}
async function updateRateLimitCounters(rateLimitInfo, usageSummary, model) {
if (!rateLimitInfo) {
return { totalTokens: 0, totalCost: 0 }
}
const client = redis.getClient()
if (!client) {
throw new Error('Redis 未连接,无法更新限流计数')
}
const inputTokens = toNumber(usageSummary.inputTokens)
const outputTokens = toNumber(usageSummary.outputTokens)
const cacheCreateTokens = toNumber(usageSummary.cacheCreateTokens)
const cacheReadTokens = toNumber(usageSummary.cacheReadTokens)
const totalTokens = inputTokens + outputTokens + cacheCreateTokens + cacheReadTokens
if (totalTokens > 0 && rateLimitInfo.tokenCountKey) {
await client.incrby(rateLimitInfo.tokenCountKey, Math.round(totalTokens))
}
let totalCost = 0
const usagePayload = {
input_tokens: inputTokens,
output_tokens: outputTokens,
cache_creation_input_tokens: cacheCreateTokens,
cache_read_input_tokens: cacheReadTokens
}
try {
const costInfo = pricingService.calculateCost(usagePayload, model)
const { totalCost: calculatedCost } = costInfo || {}
if (typeof calculatedCost === 'number') {
totalCost = calculatedCost
}
} catch (error) {
// 忽略此处错误,后续使用备用计算
totalCost = 0
}
if (totalCost === 0) {
try {
const fallback = CostCalculator.calculateCost(usagePayload, model)
const { costs } = fallback || {}
if (costs && typeof costs.total === 'number') {
totalCost = costs.total
}
} catch (error) {
totalCost = 0
}
}
if (totalCost > 0 && rateLimitInfo.costCountKey) {
await client.incrbyfloat(rateLimitInfo.costCountKey, totalCost)
}
return { totalTokens, totalCost }
}
module.exports = {
updateRateLimitCounters
}
|