|
|
@@ -284,8 +284,7 @@ export async function handler(
|
|
|
const costInfo = calculateCost(modelInfo, usageInfo)
|
|
|
await trialLimiter?.track(usageInfo)
|
|
|
await modelTpmLimiter?.track(providerInfo.id, providerInfo.model, usageInfo)
|
|
|
- if (providerInfo.budgetPriority !== undefined)
|
|
|
- await providerBudgetTracker?.track(providerInfo.id, providerInfo.budgetPriority, costInfo.totalCostInCent)
|
|
|
+ await providerBudgetTracker?.track(providerInfo.id, providerInfo.budgetPriority, costInfo.totalCostInCent)
|
|
|
await trackUsage(sessionId, billingSource, authInfo, modelInfo, providerInfo, usageInfo, costInfo)
|
|
|
await reload(billingSource, authInfo, costInfo)
|
|
|
json.cost = calculateOccurredCost(billingSource, costInfo)
|
|
|
@@ -346,12 +345,7 @@ export async function handler(
|
|
|
timestampLastByte,
|
|
|
usageInfo,
|
|
|
)
|
|
|
- if (providerInfo.budgetPriority !== undefined)
|
|
|
- await providerBudgetTracker?.track(
|
|
|
- providerInfo.id,
|
|
|
- providerInfo.budgetPriority,
|
|
|
- costInfo.totalCostInCent,
|
|
|
- )
|
|
|
+ await providerBudgetTracker?.track(providerInfo.id, providerInfo.budgetPriority, costInfo.totalCostInCent)
|
|
|
await trackUsage(sessionId, billingSource, authInfo, modelInfo, providerInfo, usageInfo, costInfo)
|
|
|
await reload(billingSource, authInfo, costInfo)
|
|
|
const cost = calculateOccurredCost(billingSource, costInfo)
|
|
|
@@ -518,7 +512,12 @@ export async function handler(
|
|
|
stickyProviderId: string | undefined,
|
|
|
modelTpmLimits: Record<string, number> | undefined,
|
|
|
modelTpsLimits: Record<string, { qualify: number; unqualify: number }> | undefined,
|
|
|
- providerBudget: { qualify: (providerId: string, priority: number) => boolean } | undefined,
|
|
|
+ providerBudget:
|
|
|
+ | {
|
|
|
+ qualify: (providerId: string, priority: number) => boolean
|
|
|
+ prefer: (providerId: string, priority: number) => boolean
|
|
|
+ }
|
|
|
+ | undefined,
|
|
|
) {
|
|
|
const modelProvider = (() => {
|
|
|
// Byok is top priority b/c if user set their own API key, we should use it
|
|
|
@@ -581,15 +580,19 @@ export async function handler(
|
|
|
const stickProvider = allProviders.find((provider) => provider.id === stickyProviderId)
|
|
|
if (!stickProvider) return provider
|
|
|
|
|
|
- // stick provider exists + selected provider is API type => use sticky provider
|
|
|
- if (!provider.tpsGoal) return stickProvider
|
|
|
+ const preferBudgetProvider =
|
|
|
+ provider.budgetPriority !== undefined && providerBudget?.prefer(provider.id, provider.budgetPriority)
|
|
|
|
|
|
- // stick provier exists + selected provider is GPU type + GPU not idle => use selected provider
|
|
|
- const tps = modelTpsLimits?.[`${provider.id}/${provider.model}/${provider.tpsGoal}`] ?? {
|
|
|
- qualify: 0,
|
|
|
- unqualify: 0,
|
|
|
- }
|
|
|
- if (tps.qualify <= tps.unqualify * 3) return stickProvider
|
|
|
+ const preferTpsProvider = (() => {
|
|
|
+ if (!provider.tpsGoal) return false
|
|
|
+ const tps = modelTpsLimits?.[`${provider.id}/${provider.model}/${provider.tpsGoal}`] ?? {
|
|
|
+ qualify: 0,
|
|
|
+ unqualify: 0,
|
|
|
+ }
|
|
|
+ return tps.qualify > tps.unqualify * 3
|
|
|
+ })()
|
|
|
+
|
|
|
+ if (!preferBudgetProvider && !preferTpsProvider) return stickProvider
|
|
|
|
|
|
return provider
|
|
|
}
|