summaryrefslogtreecommitdiffhomepage
path: root/packages/console/app
diff options
context:
space:
mode:
authorFrank <[email protected]>2025-10-16 15:58:49 -0400
committerFrank <[email protected]>2025-10-16 15:58:51 -0400
commit88fef05923a748e059afbcf34c83be98ba6763e4 (patch)
tree40398ddf86989917f046e7705d3f62635a037450 /packages/console/app
parent8552f3555e90ba981f7519975b15958d7b0a552f (diff)
downloadopencode-88fef05923a748e059afbcf34c83be98ba6763e4.tar.gz
opencode-88fef05923a748e059afbcf34c83be98ba6763e4.zip
wip: zen
Diffstat (limited to 'packages/console/app')
-rw-r--r--packages/console/app/src/routes/workspace/[id]/model-section.tsx4
-rw-r--r--packages/console/app/src/routes/zen/handler.ts32
2 files changed, 20 insertions, 16 deletions
diff --git a/packages/console/app/src/routes/workspace/[id]/model-section.tsx b/packages/console/app/src/routes/workspace/[id]/model-section.tsx
index 0a6086036..4dea0b982 100644
--- a/packages/console/app/src/routes/workspace/[id]/model-section.tsx
+++ b/packages/console/app/src/routes/workspace/[id]/model-section.tsx
@@ -2,7 +2,7 @@ import { Model } from "@opencode-ai/console-core/model.js"
import { query, action, useParams, createAsync, json } from "@solidjs/router"
import { createMemo, For, Show } from "solid-js"
import { withActor } from "~/context/auth.withActor"
-import { ZenModel } from "@opencode-ai/console-core/model.js"
+import { ZenData } from "@opencode-ai/console-core/model.js"
import styles from "./model-section.module.css"
import { querySessionInfo } from "../common"
import { IconAlibaba, IconAnthropic, IconMoonshotAI, IconOpenAI, IconStealth, IconXai, IconZai } from "~/component/icon"
@@ -21,7 +21,7 @@ const getModelsInfo = query(async (workspaceID: string) => {
"use server"
return withActor(async () => {
return {
- all: Object.entries(ZenModel.list())
+ all: Object.entries(ZenData.list().models)
.filter(([id, _model]) => !["claude-3-5-haiku"].includes(id))
.filter(([id, _model]) => !id.startsWith("an-"))
.sort(([_idA, modelA], [_idB, modelB]) => modelA.name.localeCompare(modelB.name))
diff --git a/packages/console/app/src/routes/zen/handler.ts b/packages/console/app/src/routes/zen/handler.ts
index 1f93d971c..67b03ab00 100644
--- a/packages/console/app/src/routes/zen/handler.ts
+++ b/packages/console/app/src/routes/zen/handler.ts
@@ -10,7 +10,7 @@ import { Resource } from "@opencode-ai/console-resource"
import { Billing } from "../../../../core/src/billing"
import { Actor } from "@opencode-ai/console-core/actor.js"
import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js"
-import { ZenModel } from "@opencode-ai/console-core/model.js"
+import { ZenData } from "@opencode-ai/console-core/model.js"
import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js"
import { ModelTable } from "@opencode-ai/console-core/schema/model.sql.js"
import { ProviderTable } from "@opencode-ai/console-core/schema/provider.sql.js"
@@ -39,7 +39,8 @@ export async function handler(
class UserLimitError extends Error {}
class ModelError extends Error {}
- type Model = z.infer<typeof ZenModel.ModelSchema>
+ type ZenData = Awaited<ReturnType<typeof ZenData.list>>
+ type Model = ZenData["models"][string]
const FREE_WORKSPACES = [
"wrk_01K46JDFR0E75SG2Q8K172KF3Y", // frank
@@ -66,8 +67,9 @@ export async function handler(
session: input.request.headers.get("x-opencode-session"),
request: input.request.headers.get("x-opencode-request"),
})
- const modelInfo = validateModel(body.model)
- const providerInfo = selectProvider(modelInfo)
+ const zenData = ZenData.list()
+ const modelInfo = validateModel(zenData, body.model)
+ const providerInfo = selectProvider(zenData, modelInfo)
const authInfo = await authenticate(modelInfo, providerInfo)
validateBilling(modelInfo, authInfo)
validateModelSettings(authInfo)
@@ -211,27 +213,29 @@ export async function handler(
)
}
- function validateModel(reqModel: string) {
- const json = JSON.parse(Resource.ZEN_MODELS.value)
-
- const allModels = ZenModel.ModelsSchema.parse(json)
-
- if (!(reqModel in allModels)) {
+ function validateModel(zenData: ZenData, reqModel: string) {
+ if (!(reqModel in zenData.models)) {
throw new ModelError(`Model ${reqModel} not supported`)
}
- const modelId = reqModel as keyof typeof allModels
- const modelData = allModels[modelId]
+ const modelId = reqModel as keyof typeof zenData.models
+ const modelData = zenData.models[modelId]
logger.metric({ model: modelId })
return { id: modelId, ...modelData }
}
- function selectProvider(model: Awaited<ReturnType<typeof validateModel>>) {
+ function selectProvider(zenData: ZenData, model: Awaited<ReturnType<typeof validateModel>>) {
const providers = model.providers
.filter((provider) => !provider.disabled)
.flatMap((provider) => Array<typeof provider>(provider.weight ?? 1).fill(provider))
- return providers[Math.floor(Math.random() * providers.length)]
+ const provider = providers[Math.floor(Math.random() * providers.length)]
+
+ if (!(provider.id in zenData.providers)) {
+ throw new ModelError(`Provider ${provider.id} not supported`)
+ }
+
+ return { ...provider, ...zenData.providers[provider.id] }
}
async function authenticate(