summaryrefslogtreecommitdiffhomepage
path: root/packages/console
diff options
context:
space:
mode:
authorFrank <[email protected]>2025-10-28 15:55:01 -0400
committerFrank <[email protected]>2025-10-28 15:55:03 -0400
commite29dd27632da70d6e716fbca8a909b8361e8187f (patch)
tree7af012bf25d9c39d9a247abf0fab7efe00fea82d /packages/console
parent37380e1f945f215be65d108bc8094e0f23b0d897 (diff)
downloadopencode-e29dd27632da70d6e716fbca8a909b8361e8187f.tar.gz
opencode-e29dd27632da70d6e716fbca8a909b8361e8187f.zip
zen: provider affinity
Diffstat (limited to 'packages/console')
-rw-r--r--packages/console/app/src/routes/zen/util/handler.ts10
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`)