feat: openai转发增加apikey速率限制

This commit is contained in:
shaw
2025-10-08 08:36:43 +08:00
parent 9209f10fc3
commit eb304c7e70
5 changed files with 308 additions and 135 deletions

View File

@@ -11,6 +11,7 @@ const openaiResponsesRelayService = require('../services/openaiResponsesRelaySer
const apiKeyService = require('../services/apiKeyService')
const crypto = require('crypto')
const ProxyHelper = require('../utils/proxyHelper')
const { updateRateLimitCounters } = require('../utils/rateLimitHelper')
// 创建代理 Agent使用统一的代理工具
function createProxyAgent(proxy) {
@@ -67,6 +68,31 @@ function extractCodexUsageHeaders(headers) {
return hasData ? snapshot : null
}
async function applyRateLimitTracking(req, usageSummary, model, context = '') {
if (!req.rateLimitInfo) {
return
}
const label = context ? ` (${context})` : ''
try {
const { totalTokens, totalCost } = await updateRateLimitCounters(
req.rateLimitInfo,
usageSummary,
model
)
if (totalTokens > 0) {
logger.api(`📊 Updated rate limit token count${label}: +${totalTokens} tokens`)
}
if (typeof totalCost === 'number' && totalCost > 0) {
logger.api(`💰 Updated rate limit cost count${label}: +$${totalCost.toFixed(6)}`)
}
} catch (error) {
logger.error(`❌ Failed to update rate limit counters${label}:`, error)
}
}
// 使用统一调度器选择 OpenAI 账户
async function getOpenAIAuthToken(apiKeyData, sessionId = null, requestedModel = null) {
try {
@@ -579,6 +605,18 @@ const handleResponses = async (req, res) => {
logger.info(
`📊 Recorded OpenAI non-stream usage - Input: ${totalInputTokens}(actual:${actualInputTokens}+cached:${cacheReadTokens}), Output: ${outputTokens}, Total: ${usageData.total_tokens || totalInputTokens + outputTokens}, Model: ${actualModel}`
)
await applyRateLimitTracking(
req,
{
inputTokens: actualInputTokens,
outputTokens,
cacheCreateTokens: 0,
cacheReadTokens
},
actualModel,
'openai-non-stream'
)
}
// 返回响应
@@ -700,6 +738,18 @@ const handleResponses = async (req, res) => {
`📊 Recorded OpenAI usage - Input: ${totalInputTokens}(actual:${actualInputTokens}+cached:${cacheReadTokens}), Output: ${outputTokens}, Total: ${usageData.total_tokens || totalInputTokens + outputTokens}, Model: ${modelToRecord} (actual: ${actualModel}, requested: ${requestedModel})`
)
usageReported = true
await applyRateLimitTracking(
req,
{
inputTokens: actualInputTokens,
outputTokens,
cacheCreateTokens: 0,
cacheReadTokens
},
modelToRecord,
'openai-stream'
)
} catch (error) {
logger.error('Failed to record OpenAI usage:', error)
}