From e29dd27632da70d6e716fbca8a909b8361e8187f Mon Sep 17 00:00:00 2001 From: Frank Date: Tue, 28 Oct 2025 15:55:01 -0400 Subject: [PATCH] zen: provider affinity --- packages/console/app/src/routes/zen/util/handler.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/console/app/src/routes/zen/util/handler.ts b/packages/console/app/src/routes/zen/util/handler.ts index 85ba5eea..f7a1f0e1 100644 --- a/packages/console/app/src/routes/zen/util/handler.ts +++ b/packages/console/app/src/routes/zen/util/handler.ts @@ -43,7 +43,7 @@ export async function handler( }) const zenData = ZenData.list() const modelInfo = validateModel(zenData, body.model) - const providerInfo = selectProvider(zenData, modelInfo) + const providerInfo = selectProvider(zenData, modelInfo, input.request.headers.get("x-real-ip") ?? "") const authInfo = await authenticate(modelInfo, providerInfo) validateBilling(modelInfo, authInfo) validateModelSettings(authInfo) @@ -222,11 +222,15 @@ export async function handler( return { id: modelId, ...modelData } } - function selectProvider(zenData: ZenData, model: Awaited>) { + function selectProvider(zenData: ZenData, model: Awaited>, ip: string) { const providers = model.providers .filter((provider) => !provider.disabled) .flatMap((provider) => Array(provider.weight ?? 1).fill(provider)) - const provider = providers[Math.floor(Math.random() * providers.length)] + + // Use last character of IP address to select a provider + const lastChar = ip.charCodeAt(ip.length - 1) || 0 + const index = lastChar % providers.length + const provider = providers[index] if (!(provider.id in zenData.providers)) { throw new ModelError(`Provider ${provider.id} not supported`)