diff options
| author | Frank <[email protected]> | 2025-10-28 15:55:01 -0400 |
|---|---|---|
| committer | Frank <[email protected]> | 2025-10-28 15:55:03 -0400 |
| commit | e29dd27632da70d6e716fbca8a909b8361e8187f (patch) | |
| tree | 7af012bf25d9c39d9a247abf0fab7efe00fea82d | |
| parent | 37380e1f945f215be65d108bc8094e0f23b0d897 (diff) | |
| download | opencode-e29dd27632da70d6e716fbca8a909b8361e8187f.tar.gz opencode-e29dd27632da70d6e716fbca8a909b8361e8187f.zip | |
zen: provider affinity
| -rw-r--r-- | packages/console/app/src/routes/zen/util/handler.ts | 10 |
1 files 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 85ba5eea1..f7a1f0e16 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<ReturnType<typeof validateModel>>) { + function selectProvider(zenData: ZenData, model: Awaited<ReturnType<typeof validateModel>>, ip: string) { const providers = model.providers .filter((provider) => !provider.disabled) .flatMap((provider) => Array<typeof provider>(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`) |
