mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-23 00:53:33 +00:00
feat: 给key增加总用量限制
This commit is contained in:
@@ -308,6 +308,29 @@ const authenticateApiKey = async (req, res, next) => {
|
||||
}
|
||||
}
|
||||
|
||||
// 检查总额度限制(基于累计费用)
|
||||
const totalUsageLimit = Number(validation.keyData.totalUsageLimit || 0)
|
||||
if (totalUsageLimit > 0) {
|
||||
const totalCost = Number(validation.keyData.totalCost || 0)
|
||||
|
||||
if (totalCost >= totalUsageLimit) {
|
||||
logger.security(
|
||||
`📉 Total usage limit exceeded for key: ${validation.keyData.id} (${validation.keyData.name}), cost: $${totalCost.toFixed(2)}/$${totalUsageLimit.toFixed(2)}`
|
||||
)
|
||||
|
||||
return res.status(429).json({
|
||||
error: 'Total usage limit exceeded',
|
||||
message: `已达到总额度限制 ($${totalUsageLimit.toFixed(2)})`,
|
||||
currentCost: totalCost,
|
||||
costLimit: totalUsageLimit
|
||||
})
|
||||
}
|
||||
|
||||
logger.api(
|
||||
`📉 Total usage for key: ${validation.keyData.id} (${validation.keyData.name}), cost: $${totalCost.toFixed(2)}/$${totalUsageLimit.toFixed(2)}`
|
||||
)
|
||||
}
|
||||
|
||||
// 检查每日费用限制
|
||||
const dailyCostLimit = validation.keyData.dailyCostLimit || 0
|
||||
if (dailyCostLimit > 0) {
|
||||
@@ -333,6 +356,29 @@ const authenticateApiKey = async (req, res, next) => {
|
||||
)
|
||||
}
|
||||
|
||||
// 检查总费用限制
|
||||
const totalCostLimit = validation.keyData.totalCostLimit || 0
|
||||
if (totalCostLimit > 0) {
|
||||
const totalCost = validation.keyData.totalCost || 0
|
||||
|
||||
if (totalCost >= totalCostLimit) {
|
||||
logger.security(
|
||||
`💰 Total cost limit exceeded for key: ${validation.keyData.id} (${validation.keyData.name}), cost: $${totalCost.toFixed(2)}/$${totalCostLimit}`
|
||||
)
|
||||
|
||||
return res.status(429).json({
|
||||
error: 'Total cost limit exceeded',
|
||||
message: `已达到总费用限制 ($${totalCostLimit})`,
|
||||
currentCost: totalCost,
|
||||
costLimit: totalCostLimit
|
||||
})
|
||||
}
|
||||
|
||||
logger.api(
|
||||
`💰 Total cost usage for key: ${validation.keyData.id} (${validation.keyData.name}), current: $${totalCost.toFixed(2)}/$${totalCostLimit}`
|
||||
)
|
||||
}
|
||||
|
||||
// 检查 Opus 周费用限制(仅对 Opus 模型生效)
|
||||
const weeklyOpusCostLimit = validation.keyData.weeklyOpusCostLimit || 0
|
||||
if (weeklyOpusCostLimit > 0) {
|
||||
@@ -394,6 +440,9 @@ const authenticateApiKey = async (req, res, next) => {
|
||||
allowedClients: validation.keyData.allowedClients,
|
||||
dailyCostLimit: validation.keyData.dailyCostLimit,
|
||||
dailyCost: validation.keyData.dailyCost,
|
||||
totalUsageLimit: validation.keyData.totalUsageLimit,
|
||||
totalCostLimit: validation.keyData.totalCostLimit,
|
||||
totalCost: validation.keyData.totalCost,
|
||||
usage: validation.keyData.usage
|
||||
}
|
||||
req.usage = validation.keyData.usage
|
||||
|
||||
Reference in New Issue
Block a user