wip: zen
This commit is contained in:
@@ -1,13 +1,13 @@
|
|||||||
export class AuthError extends Error {}
|
export class AuthError extends Error {}
|
||||||
export class CreditsError extends Error {}
|
export class CreditsError extends Error {}
|
||||||
export class MonthlyLimitError extends Error {}
|
export class MonthlyLimitError extends Error {}
|
||||||
export class SubscriptionError extends Error {
|
export class UserLimitError extends Error {}
|
||||||
|
export class ModelError extends Error {}
|
||||||
|
export class FreeUsageLimitError extends Error {}
|
||||||
|
export class SubscriptionUsageLimitError extends Error {
|
||||||
retryAfter?: number
|
retryAfter?: number
|
||||||
constructor(message: string, retryAfter?: number) {
|
constructor(message: string, retryAfter?: number) {
|
||||||
super(message)
|
super(message)
|
||||||
this.retryAfter = retryAfter
|
this.retryAfter = retryAfter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
export class UserLimitError extends Error {}
|
|
||||||
export class ModelError extends Error {}
|
|
||||||
export class RateLimitError extends Error {}
|
|
||||||
|
|||||||
@@ -18,10 +18,10 @@ import {
|
|||||||
AuthError,
|
AuthError,
|
||||||
CreditsError,
|
CreditsError,
|
||||||
MonthlyLimitError,
|
MonthlyLimitError,
|
||||||
SubscriptionError,
|
|
||||||
UserLimitError,
|
UserLimitError,
|
||||||
ModelError,
|
ModelError,
|
||||||
RateLimitError,
|
FreeUsageLimitError,
|
||||||
|
SubscriptionUsageLimitError,
|
||||||
} from "./error"
|
} from "./error"
|
||||||
import { createBodyConverter, createStreamPartConverter, createResponseConverter, UsageInfo } from "./provider/provider"
|
import { createBodyConverter, createStreamPartConverter, createResponseConverter, UsageInfo } from "./provider/provider"
|
||||||
import { anthropicHelper } from "./provider/anthropic"
|
import { anthropicHelper } from "./provider/anthropic"
|
||||||
@@ -304,9 +304,9 @@ export async function handler(
|
|||||||
{ status: 401 },
|
{ status: 401 },
|
||||||
)
|
)
|
||||||
|
|
||||||
if (error instanceof RateLimitError || error instanceof SubscriptionError) {
|
if (error instanceof FreeUsageLimitError || error instanceof SubscriptionUsageLimitError) {
|
||||||
const headers = new Headers()
|
const headers = new Headers()
|
||||||
if (error instanceof SubscriptionError && error.retryAfter) {
|
if (error instanceof SubscriptionUsageLimitError && error.retryAfter) {
|
||||||
headers.set("retry-after", String(error.retryAfter))
|
headers.set("retry-after", String(error.retryAfter))
|
||||||
}
|
}
|
||||||
return new Response(
|
return new Response(
|
||||||
@@ -520,7 +520,7 @@ export async function handler(
|
|||||||
timeUpdated: sub.timeFixedUpdated,
|
timeUpdated: sub.timeFixedUpdated,
|
||||||
})
|
})
|
||||||
if (result.status === "rate-limited")
|
if (result.status === "rate-limited")
|
||||||
throw new SubscriptionError(
|
throw new SubscriptionUsageLimitError(
|
||||||
`Subscription quota exceeded. Retry in ${formatRetryTime(result.resetInSec)}.`,
|
`Subscription quota exceeded. Retry in ${formatRetryTime(result.resetInSec)}.`,
|
||||||
result.resetInSec,
|
result.resetInSec,
|
||||||
)
|
)
|
||||||
@@ -534,7 +534,7 @@ export async function handler(
|
|||||||
timeUpdated: sub.timeRollingUpdated,
|
timeUpdated: sub.timeRollingUpdated,
|
||||||
})
|
})
|
||||||
if (result.status === "rate-limited")
|
if (result.status === "rate-limited")
|
||||||
throw new SubscriptionError(
|
throw new SubscriptionUsageLimitError(
|
||||||
`Subscription quota exceeded. Retry in ${formatRetryTime(result.resetInSec)}.`,
|
`Subscription quota exceeded. Retry in ${formatRetryTime(result.resetInSec)}.`,
|
||||||
result.resetInSec,
|
result.resetInSec,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Database, eq, and, sql, inArray } from "@opencode-ai/console-core/drizzle/index.js"
|
import { Database, eq, and, sql, inArray } from "@opencode-ai/console-core/drizzle/index.js"
|
||||||
import { IpRateLimitTable } from "@opencode-ai/console-core/schema/ip.sql.js"
|
import { IpRateLimitTable } from "@opencode-ai/console-core/schema/ip.sql.js"
|
||||||
import { RateLimitError } from "./error"
|
import { FreeUsageLimitError } from "./error"
|
||||||
import { logger } from "./logger"
|
import { logger } from "./logger"
|
||||||
import { ZenData } from "@opencode-ai/console-core/model.js"
|
import { ZenData } from "@opencode-ai/console-core/model.js"
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ export function createRateLimiter(limit: ZenData.RateLimit | undefined, rawIp: s
|
|||||||
)
|
)
|
||||||
const total = rows.reduce((sum, r) => sum + r.count, 0)
|
const total = rows.reduce((sum, r) => sum + r.count, 0)
|
||||||
logger.debug(`rate limit total: ${total}`)
|
logger.debug(`rate limit total: ${total}`)
|
||||||
if (total >= limitValue) throw new RateLimitError(`Rate limit exceeded. Please try again later.`)
|
if (total >= limitValue) throw new FreeUsageLimitError(`Rate limit exceeded. Please try again later.`)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user