From 6869186fc69983becd55f2a9ec6f9c623037d3fc Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 8 May 2026 03:52:56 -0400 Subject: [PATCH] zen: update tpm rate limit algo --- .../src/routes/zen/util/modelTpmLimiter.ts | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/packages/console/app/src/routes/zen/util/modelTpmLimiter.ts b/packages/console/app/src/routes/zen/util/modelTpmLimiter.ts index 8e3e8cc95e..2ccc47589f 100644 --- a/packages/console/app/src/routes/zen/util/modelTpmLimiter.ts +++ b/packages/console/app/src/routes/zen/util/modelTpmLimiter.ts @@ -1,4 +1,4 @@ -import { and, Database, eq, inArray, sql } from "@opencode-ai/console-core/drizzle/index.js" +import { and, Database, inArray, sql } from "@opencode-ai/console-core/drizzle/index.js" import { ModelTpmRateLimitTable } from "@opencode-ai/console-core/schema/ip.sql.js" import { UsageInfo } from "./provider/provider" @@ -6,12 +6,16 @@ export function createModelTpmLimiter(providers: { id: string; model: string; tp const ids = providers.filter((p) => p.tpmLimit).map((p) => `${p.id}/${p.model}`) if (ids.length === 0) return - const yyyyMMddHHmm = parseInt( - new Date(Date.now()) - .toISOString() - .replace(/[^0-9]/g, "") - .substring(0, 12), - ) + const toInterval = (date: Date) => + parseInt( + date + .toISOString() + .replace(/[^0-9]/g, "") + .substring(0, 12), + ) + const now = Date.now() + const currInterval = toInterval(new Date(now)) + const prevInterval = toInterval(new Date(now - 60_000)) return { check: async () => { @@ -19,13 +23,18 @@ export function createModelTpmLimiter(providers: { id: string; model: string; tp tx .select() .from(ModelTpmRateLimitTable) - .where(and(inArray(ModelTpmRateLimitTable.id, ids), eq(ModelTpmRateLimitTable.interval, yyyyMMddHHmm))), + .where( + and( + inArray(ModelTpmRateLimitTable.id, ids), + inArray(ModelTpmRateLimitTable.interval, [currInterval, prevInterval]), + ), + ), ) // convert to map of model to count return data.reduce( (acc, curr) => { - acc[curr.id] = curr.count + acc[curr.id] = Math.max(acc[curr.id] ?? 0, curr.count) return acc }, {} as Record, @@ -39,7 +48,7 @@ export function createModelTpmLimiter(providers: { id: string; model: string; tp await Database.use((tx) => tx .insert(ModelTpmRateLimitTable) - .values({ id, interval: yyyyMMddHHmm, count: usage }) + .values({ id, interval: currInterval, count: usage }) .onDuplicateKeyUpdate({ set: { count: sql`${ModelTpmRateLimitTable.count} + ${usage}` } }), ) },