From cc6dd5321c393beca7dc97c957bb207898d41dd8 Mon Sep 17 00:00:00 2001 From: vimtor Date: Thu, 7 May 2026 20:36:19 +0200 Subject: [PATCH] chore: improve variant parsing for zen --- .../src/routes/zen/go/v1/chat/completions.ts | 3 ++- .../app/src/routes/zen/go/v1/messages.ts | 3 ++- .../app/src/routes/zen/util/variant.ts | 21 +++++++++++++++++++ .../app/src/routes/zen/v1/chat/completions.ts | 3 ++- .../console/app/src/routes/zen/v1/messages.ts | 3 ++- .../app/src/routes/zen/v1/models/[model].ts | 3 ++- .../app/src/routes/zen/v1/responses.ts | 3 ++- 7 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 packages/console/app/src/routes/zen/util/variant.ts diff --git a/packages/console/app/src/routes/zen/go/v1/chat/completions.ts b/packages/console/app/src/routes/zen/go/v1/chat/completions.ts index a5cf41f8f0..71fb8f2e6d 100644 --- a/packages/console/app/src/routes/zen/go/v1/chat/completions.ts +++ b/packages/console/app/src/routes/zen/go/v1/chat/completions.ts @@ -1,5 +1,6 @@ import type { APIEvent } from "@solidjs/start/server" import { handler } from "~/routes/zen/util/handler" +import { parseOpenAiVariant } from "~/routes/zen/util/variant" export function POST(input: APIEvent) { return handler(input, { @@ -7,7 +8,7 @@ export function POST(input: APIEvent) { modelList: "lite", parseApiKey: (headers: Headers) => headers.get("authorization")?.split(" ")[1], parseModel: (url: string, body: any) => body.model, - parseVariant: (url: string, body: any) => body.reasoningEffort ?? body.reasoning_effort, + parseVariant: (url: string, body: any) => parseOpenAiVariant(body), parseIsStream: (url: string, body: any) => !!body.stream, }) } diff --git a/packages/console/app/src/routes/zen/go/v1/messages.ts b/packages/console/app/src/routes/zen/go/v1/messages.ts index e66f3658c6..d356b0bf53 100644 --- a/packages/console/app/src/routes/zen/go/v1/messages.ts +++ b/packages/console/app/src/routes/zen/go/v1/messages.ts @@ -1,5 +1,6 @@ import type { APIEvent } from "@solidjs/start/server" import { handler } from "~/routes/zen/util/handler" +import { parseAnthropicVariant } from "~/routes/zen/util/variant" export function POST(input: APIEvent) { return handler(input, { @@ -7,7 +8,7 @@ export function POST(input: APIEvent) { modelList: "lite", parseApiKey: (headers: Headers) => headers.get("x-api-key") ?? undefined, parseModel: (url: string, body: any) => body.model, - parseVariant: (url: string, body: any) => body.effort, + parseVariant: (url: string, body: any) => parseAnthropicVariant(body), parseIsStream: (url: string, body: any) => !!body.stream, }) } diff --git a/packages/console/app/src/routes/zen/util/variant.ts b/packages/console/app/src/routes/zen/util/variant.ts new file mode 100644 index 0000000000..63464397f9 --- /dev/null +++ b/packages/console/app/src/routes/zen/util/variant.ts @@ -0,0 +1,21 @@ +export function parseAnthropicVariant(body: any) { + const effort = body.effort ?? body.output_config?.effort ?? body.outputConfig?.effort ?? body.thinking?.effort + if (effort) return effort + + const budget = body.thinking?.budget_tokens ?? body.thinking?.budgetTokens + if (body.thinking?.type !== "enabled" || typeof budget !== "number") return undefined + return budget > 16_000 ? "max" : "high" +} + +export function parseGoogleVariant(body: any) { + const thinkingConfig = body.generationConfig?.thinkingConfig ?? body.thinkingConfig + if (thinkingConfig?.thinkingLevel) return thinkingConfig.thinkingLevel + + const budget = thinkingConfig?.thinkingBudget ?? thinkingConfig?.thinking_budget + if (typeof budget !== "number" || budget <= 0) return undefined + return budget > 16_000 ? "max" : "high" +} + +export function parseOpenAiVariant(body: any) { + return body.reasoningEffort ?? body.reasoning_effort ?? body.reasoning?.effort +} diff --git a/packages/console/app/src/routes/zen/v1/chat/completions.ts b/packages/console/app/src/routes/zen/v1/chat/completions.ts index a55d743565..745e0c2182 100644 --- a/packages/console/app/src/routes/zen/v1/chat/completions.ts +++ b/packages/console/app/src/routes/zen/v1/chat/completions.ts @@ -1,5 +1,6 @@ import type { APIEvent } from "@solidjs/start/server" import { handler } from "~/routes/zen/util/handler" +import { parseOpenAiVariant } from "~/routes/zen/util/variant" export function POST(input: APIEvent) { return handler(input, { @@ -7,7 +8,7 @@ export function POST(input: APIEvent) { modelList: "full", parseApiKey: (headers: Headers) => headers.get("authorization")?.split(" ")[1], parseModel: (url: string, body: any) => body.model, - parseVariant: (url: string, body: any) => body.reasoningEffort ?? body.reasoning_effort, + parseVariant: (url: string, body: any) => parseOpenAiVariant(body), parseIsStream: (url: string, body: any) => !!body.stream, }) } diff --git a/packages/console/app/src/routes/zen/v1/messages.ts b/packages/console/app/src/routes/zen/v1/messages.ts index f023d4f9ac..876a16029e 100644 --- a/packages/console/app/src/routes/zen/v1/messages.ts +++ b/packages/console/app/src/routes/zen/v1/messages.ts @@ -1,5 +1,6 @@ import type { APIEvent } from "@solidjs/start/server" import { handler } from "~/routes/zen/util/handler" +import { parseAnthropicVariant } from "~/routes/zen/util/variant" export function POST(input: APIEvent) { return handler(input, { @@ -7,7 +8,7 @@ export function POST(input: APIEvent) { modelList: "full", parseApiKey: (headers: Headers) => headers.get("x-api-key") ?? undefined, parseModel: (url: string, body: any) => body.model, - parseVariant: (url: string, body: any) => body.effort, + parseVariant: (url: string, body: any) => parseAnthropicVariant(body), parseIsStream: (url: string, body: any) => !!body.stream, }) } diff --git a/packages/console/app/src/routes/zen/v1/models/[model].ts b/packages/console/app/src/routes/zen/v1/models/[model].ts index bfe6e86540..372f666761 100644 --- a/packages/console/app/src/routes/zen/v1/models/[model].ts +++ b/packages/console/app/src/routes/zen/v1/models/[model].ts @@ -1,5 +1,6 @@ import type { APIEvent } from "@solidjs/start/server" import { handler } from "~/routes/zen/util/handler" +import { parseGoogleVariant } from "~/routes/zen/util/variant" export function POST(input: APIEvent) { return handler(input, { @@ -7,7 +8,7 @@ export function POST(input: APIEvent) { modelList: "full", parseApiKey: (headers: Headers) => headers.get("x-goog-api-key") ?? undefined, parseModel: (url: string, _body: any) => url.split("/").pop()?.split(":")?.[0] ?? "", - parseVariant: (url: string, body: any) => body.thinkingLevel, + parseVariant: (url: string, body: any) => parseGoogleVariant(body), parseIsStream: (url: string, _body: any) => // ie. url: https://opencode.ai/zen/v1/models/gemini-3-pro:streamGenerateContent?alt=sse' url.split("/").pop()?.split(":")?.[1]?.startsWith("streamGenerateContent") ?? false, diff --git a/packages/console/app/src/routes/zen/v1/responses.ts b/packages/console/app/src/routes/zen/v1/responses.ts index 539b2fdad0..b82735817f 100644 --- a/packages/console/app/src/routes/zen/v1/responses.ts +++ b/packages/console/app/src/routes/zen/v1/responses.ts @@ -1,5 +1,6 @@ import type { APIEvent } from "@solidjs/start/server" import { handler } from "~/routes/zen/util/handler" +import { parseOpenAiVariant } from "~/routes/zen/util/variant" export function POST(input: APIEvent) { return handler(input, { @@ -7,7 +8,7 @@ export function POST(input: APIEvent) { modelList: "full", parseApiKey: (headers: Headers) => headers.get("authorization")?.split(" ")[1], parseModel: (url: string, body: any) => body.model, - parseVariant: (url: string, body: any) => body.reasoning?.effort, + parseVariant: (url: string, body: any) => parseOpenAiVariant(body), parseIsStream: (url: string, body: any) => !!body.stream, }) }