Skip to content

Commit fa077b9

Browse files
committed
zen: update sticky session logic
1 parent 8ad3a4b commit fa077b9

5 files changed

Lines changed: 2871 additions & 7 deletions

File tree

packages/console/app/src/routes/zen/util/handler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ export async function handler(
123123
? createIpRateLimiter(modelInfo.id, modelInfo.rateLimit, ip, input.request)
124124
: createKeyRateLimiter(modelInfo.id, modelInfo.rateLimit, zenApiKey, input.request)
125125
await rateLimiter?.check()
126-
const stickyTracker = createStickyTracker(modelInfo.stickyProvider, sessionId)
126+
const stickyTracker = createStickyTracker(modelInfo.id, modelInfo.stickyProvider, sessionId)
127127
const stickyProvider = await stickyTracker?.get()
128128
const authInfo = await authenticate(modelInfo, zenApiKey)
129129
const billingSource = validateBilling(authInfo, modelInfo)
@@ -238,7 +238,7 @@ export async function handler(
238238
dataDumper?.provideRequest(reqBody)
239239

240240
// Store sticky provider
241-
await stickyTracker?.set(providerInfo.id)
241+
if (res.status === 200) await stickyTracker?.set(providerInfo.id)
242242

243243
// Temporarily change 404 to 400 status code b/c solid start automatically override 404 response
244244
const resStatus = res.status === 404 ? 400 : res.status
Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,42 @@
1-
import { Resource } from "@opencode-ai/console-resource"
1+
import { Database, eq } from "@opencode-ai/console-core/drizzle/index.js"
2+
import { ModelStickyProviderTable } from "@opencode-ai/console-core/schema/ip.sql.js"
23

3-
export function createStickyTracker(stickyProvider: "strict" | "prefer" | undefined, session: string) {
4+
export function createStickyTracker(modelId: string, stickyProvider: "strict" | "prefer" | undefined, session: string) {
45
if (!stickyProvider) return
56
if (!session) return
6-
const key = `sticky:${session}`
7+
const id = `${modelId}/${session}`
8+
let _providerId: string | undefined
79

810
return {
911
get: async () => {
10-
return await Resource.GatewayKv.get(key)
12+
const data = await Database.use((tx) =>
13+
tx
14+
.select({
15+
providerId: ModelStickyProviderTable.providerId,
16+
})
17+
.from(ModelStickyProviderTable)
18+
.where(eq(ModelStickyProviderTable.id, id))
19+
.limit(1),
20+
)
21+
_providerId = data[0]?.providerId
22+
return _providerId
1123
},
1224
set: async (providerId: string) => {
13-
await Resource.GatewayKv.put(key, providerId, { expirationTtl: 86400 })
25+
if (_providerId === providerId) return
26+
27+
await Database.use((tx) =>
28+
tx
29+
.insert(ModelStickyProviderTable)
30+
.values({
31+
id,
32+
providerId,
33+
})
34+
.onDuplicateKeyUpdate({
35+
set: {
36+
providerId,
37+
},
38+
}),
39+
)
1440
},
1541
}
1642
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CREATE TABLE `model_sticky_provider` (
2+
`id` varchar(255) PRIMARY KEY,
3+
`time_created` timestamp(3) NOT NULL DEFAULT (now()),
4+
`time_updated` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
5+
`time_deleted` timestamp(3),
6+
`provider_id` varchar(255) NOT NULL
7+
);

0 commit comments

Comments
 (0)