summaryrefslogtreecommitdiffhomepage
path: root/packages/console/core/src
diff options
context:
space:
mode:
authorShoubhit Dash <[email protected]>2026-04-16 17:30:14 +0530
committerShoubhit Dash <[email protected]>2026-04-16 17:30:14 +0530
commit2e18a603f0ea24154908e748493fd4bfaa74fc00 (patch)
treeb723e00af2821b213573b16fa199b64babd5f1f5 /packages/console/core/src
parent9819eb04614fd607cacb07d754052f1531a82331 (diff)
parent7341718f9234b0cf3a8758c87e91d2006b71bff6 (diff)
downloadopencode-2e18a603f0ea24154908e748493fd4bfaa74fc00.tar.gz
opencode-2e18a603f0ea24154908e748493fd4bfaa74fc00.zip
merge dev
Diffstat (limited to 'packages/console/core/src')
-rw-r--r--packages/console/core/src/key.ts16
-rw-r--r--packages/console/core/src/model.ts72
-rw-r--r--packages/console/core/src/schema/ip.sql.ts10
-rw-r--r--packages/console/core/src/util/env.cloudflare.ts1
-rw-r--r--packages/console/core/src/util/log.ts2
5 files changed, 84 insertions, 17 deletions
diff --git a/packages/console/core/src/key.ts b/packages/console/core/src/key.ts
index 688f19b3d..aef4298c9 100644
--- a/packages/console/core/src/key.ts
+++ b/packages/console/core/src/key.ts
@@ -24,11 +24,9 @@ export namespace Key {
.innerJoin(AuthTable, and(eq(UserTable.accountID, AuthTable.accountID), eq(AuthTable.provider, "email")))
.where(
and(
- ...[
- eq(KeyTable.workspaceID, Actor.workspace()),
- isNull(KeyTable.timeDeleted),
- ...(Actor.userRole() === "admin" ? [] : [eq(KeyTable.userID, Actor.userID())]),
- ],
+ eq(KeyTable.workspaceID, Actor.workspace()),
+ isNull(KeyTable.timeDeleted),
+ ...(Actor.userRole() === "admin" ? [] : [eq(KeyTable.userID, Actor.userID())]),
),
)
.orderBy(sql`${KeyTable.name} DESC`),
@@ -84,11 +82,9 @@ export namespace Key {
})
.where(
and(
- ...[
- eq(KeyTable.id, input.id),
- eq(KeyTable.workspaceID, Actor.workspace()),
- ...(Actor.userRole() === "admin" ? [] : [eq(KeyTable.userID, Actor.userID())]),
- ],
+ eq(KeyTable.id, input.id),
+ eq(KeyTable.workspaceID, Actor.workspace()),
+ ...(Actor.userRole() === "admin" ? [] : [eq(KeyTable.userID, Actor.userID())]),
),
),
)
diff --git a/packages/console/core/src/model.ts b/packages/console/core/src/model.ts
index 3b2439431..3d614d303 100644
--- a/packages/console/core/src/model.ts
+++ b/packages/console/core/src/model.ts
@@ -26,7 +26,7 @@ export namespace ZenData {
allowAnonymous: z.boolean().optional(),
byokProvider: z.enum(["openai", "anthropic", "google"]).optional(),
stickyProvider: z.enum(["strict", "prefer"]).optional(),
- trialProviders: z.array(z.string()).optional(),
+ trialProvider: z.string().optional(),
trialEnded: z.boolean().optional(),
fallbackProvider: z.string().optional(),
rateLimit: z.number().optional(),
@@ -44,8 +44,9 @@ export namespace ZenData {
})
const ProviderSchema = z.object({
+ displayName: z.string().optional(),
api: z.string(),
- apiKey: z.string(),
+ apiKey: z.union([z.string(), z.record(z.string(), z.string())]),
format: FormatSchema.optional(),
headerMappings: z.record(z.string(), z.string()).optional(),
payloadModifier: z.record(z.string(), z.any()).optional(),
@@ -54,7 +55,10 @@ export namespace ZenData {
})
const ModelsSchema = z.object({
- models: z.record(z.string(), z.union([ModelSchema, z.array(ModelSchema.extend({ formatFilter: FormatSchema }))])),
+ zenModels: z.record(
+ z.string(),
+ z.union([ModelSchema, z.array(ModelSchema.extend({ formatFilter: FormatSchema }))]),
+ ),
liteModels: z.record(
z.string(),
z.union([ModelSchema, z.array(ModelSchema.extend({ formatFilter: FormatSchema }))]),
@@ -99,10 +103,66 @@ export namespace ZenData {
Resource.ZEN_MODELS29.value +
Resource.ZEN_MODELS30.value,
)
- const { models, liteModels, providers } = ModelsSchema.parse(json)
+ const { zenModels, liteModels, providers } = ModelsSchema.parse(json)
+ const compositeProviders = Object.fromEntries(
+ Object.entries(providers).map(([id, provider]) => [
+ id,
+ typeof provider.apiKey === "string"
+ ? [{ id: id, key: provider.apiKey }]
+ : Object.entries(provider.apiKey).map(([kid, key]) => ({
+ id: `${id}.${kid}`,
+ key,
+ })),
+ ]),
+ )
return {
- models: modelList === "lite" ? liteModels : models,
- providers,
+ providers: Object.fromEntries(
+ Object.entries(providers).flatMap(([providerId, provider]) =>
+ compositeProviders[providerId].map((p) => [p.id, { ...provider, apiKey: p.key }]),
+ ),
+ ),
+ models: (() => {
+ const normalize = (model: z.infer<typeof ModelSchema>) => {
+ const composite = model.providers.find((p) => compositeProviders[p.id].length > 1)
+ if (!composite)
+ return {
+ trialProvider: model.trialProvider ? [model.trialProvider] : undefined,
+ }
+
+ const weightMulti = compositeProviders[composite.id].length
+
+ return {
+ trialProvider: (() => {
+ if (!model.trialProvider) return undefined
+ if (model.trialProvider === composite.id) return compositeProviders[composite.id].map((p) => p.id)
+ return [model.trialProvider]
+ })(),
+ providers: model.providers.flatMap((p) =>
+ p.id === composite.id
+ ? compositeProviders[p.id].map((sub) => ({
+ ...p,
+ id: sub.id,
+ weight: p.weight ?? 1,
+ }))
+ : [
+ {
+ ...p,
+ weight: (p.weight ?? 1) * weightMulti,
+ },
+ ],
+ ),
+ }
+ }
+
+ return Object.fromEntries(
+ Object.entries(modelList === "lite" ? liteModels : zenModels).map(([modelId, model]) => {
+ const n = Array.isArray(model)
+ ? model.map((m) => ({ ...m, ...normalize(m) }))
+ : { ...model, ...normalize(model) }
+ return [modelId, n]
+ }),
+ )
+ })(),
}
})
}
diff --git a/packages/console/core/src/schema/ip.sql.ts b/packages/console/core/src/schema/ip.sql.ts
index 97e356024..a840a78c1 100644
--- a/packages/console/core/src/schema/ip.sql.ts
+++ b/packages/console/core/src/schema/ip.sql.ts
@@ -20,3 +20,13 @@ export const IpRateLimitTable = mysqlTable(
},
(table) => [primaryKey({ columns: [table.ip, table.interval] })],
)
+
+export const KeyRateLimitTable = mysqlTable(
+ "key_rate_limit",
+ {
+ key: varchar("key", { length: 255 }).notNull(),
+ interval: varchar("interval", { length: 40 }).notNull(),
+ count: int("count").notNull(),
+ },
+ (table) => [primaryKey({ columns: [table.key, table.interval] })],
+)
diff --git a/packages/console/core/src/util/env.cloudflare.ts b/packages/console/core/src/util/env.cloudflare.ts
index e69de29bb..336ce12bb 100644
--- a/packages/console/core/src/util/env.cloudflare.ts
+++ b/packages/console/core/src/util/env.cloudflare.ts
@@ -0,0 +1 @@
+export {}
diff --git a/packages/console/core/src/util/log.ts b/packages/console/core/src/util/log.ts
index 4f2d25c13..ef3ad85c6 100644
--- a/packages/console/core/src/util/log.ts
+++ b/packages/console/core/src/util/log.ts
@@ -48,7 +48,7 @@ export namespace Log {
function use() {
try {
return ctx.use()
- } catch (e) {
+ } catch {
return { tags: {} }
}
}