ソースを参照

chore: improve variant parsing for zen

vimtor 4 ヶ月 前
コミット
cc6dd5321c

+ 2 - 1
packages/console/app/src/routes/zen/go/v1/chat/completions.ts

@@ -1,5 +1,6 @@
 import type { APIEvent } from "@solidjs/start/server"
 import type { APIEvent } from "@solidjs/start/server"
 import { handler } from "~/routes/zen/util/handler"
 import { handler } from "~/routes/zen/util/handler"
+import { parseOpenAiVariant } from "~/routes/zen/util/variant"
 
 
 export function POST(input: APIEvent) {
 export function POST(input: APIEvent) {
   return handler(input, {
   return handler(input, {
@@ -7,7 +8,7 @@ export function POST(input: APIEvent) {
     modelList: "lite",
     modelList: "lite",
     parseApiKey: (headers: Headers) => headers.get("authorization")?.split(" ")[1],
     parseApiKey: (headers: Headers) => headers.get("authorization")?.split(" ")[1],
     parseModel: (url: string, body: any) => body.model,
     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,
     parseIsStream: (url: string, body: any) => !!body.stream,
   })
   })
 }
 }

+ 2 - 1
packages/console/app/src/routes/zen/go/v1/messages.ts

@@ -1,5 +1,6 @@
 import type { APIEvent } from "@solidjs/start/server"
 import type { APIEvent } from "@solidjs/start/server"
 import { handler } from "~/routes/zen/util/handler"
 import { handler } from "~/routes/zen/util/handler"
+import { parseAnthropicVariant } from "~/routes/zen/util/variant"
 
 
 export function POST(input: APIEvent) {
 export function POST(input: APIEvent) {
   return handler(input, {
   return handler(input, {
@@ -7,7 +8,7 @@ export function POST(input: APIEvent) {
     modelList: "lite",
     modelList: "lite",
     parseApiKey: (headers: Headers) => headers.get("x-api-key") ?? undefined,
     parseApiKey: (headers: Headers) => headers.get("x-api-key") ?? undefined,
     parseModel: (url: string, body: any) => body.model,
     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,
     parseIsStream: (url: string, body: any) => !!body.stream,
   })
   })
 }
 }

+ 21 - 0
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
+}

+ 2 - 1
packages/console/app/src/routes/zen/v1/chat/completions.ts

@@ -1,5 +1,6 @@
 import type { APIEvent } from "@solidjs/start/server"
 import type { APIEvent } from "@solidjs/start/server"
 import { handler } from "~/routes/zen/util/handler"
 import { handler } from "~/routes/zen/util/handler"
+import { parseOpenAiVariant } from "~/routes/zen/util/variant"
 
 
 export function POST(input: APIEvent) {
 export function POST(input: APIEvent) {
   return handler(input, {
   return handler(input, {
@@ -7,7 +8,7 @@ export function POST(input: APIEvent) {
     modelList: "full",
     modelList: "full",
     parseApiKey: (headers: Headers) => headers.get("authorization")?.split(" ")[1],
     parseApiKey: (headers: Headers) => headers.get("authorization")?.split(" ")[1],
     parseModel: (url: string, body: any) => body.model,
     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,
     parseIsStream: (url: string, body: any) => !!body.stream,
   })
   })
 }
 }

+ 2 - 1
packages/console/app/src/routes/zen/v1/messages.ts

@@ -1,5 +1,6 @@
 import type { APIEvent } from "@solidjs/start/server"
 import type { APIEvent } from "@solidjs/start/server"
 import { handler } from "~/routes/zen/util/handler"
 import { handler } from "~/routes/zen/util/handler"
+import { parseAnthropicVariant } from "~/routes/zen/util/variant"
 
 
 export function POST(input: APIEvent) {
 export function POST(input: APIEvent) {
   return handler(input, {
   return handler(input, {
@@ -7,7 +8,7 @@ export function POST(input: APIEvent) {
     modelList: "full",
     modelList: "full",
     parseApiKey: (headers: Headers) => headers.get("x-api-key") ?? undefined,
     parseApiKey: (headers: Headers) => headers.get("x-api-key") ?? undefined,
     parseModel: (url: string, body: any) => body.model,
     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,
     parseIsStream: (url: string, body: any) => !!body.stream,
   })
   })
 }
 }

+ 2 - 1
packages/console/app/src/routes/zen/v1/models/[model].ts

@@ -1,5 +1,6 @@
 import type { APIEvent } from "@solidjs/start/server"
 import type { APIEvent } from "@solidjs/start/server"
 import { handler } from "~/routes/zen/util/handler"
 import { handler } from "~/routes/zen/util/handler"
+import { parseGoogleVariant } from "~/routes/zen/util/variant"
 
 
 export function POST(input: APIEvent) {
 export function POST(input: APIEvent) {
   return handler(input, {
   return handler(input, {
@@ -7,7 +8,7 @@ export function POST(input: APIEvent) {
     modelList: "full",
     modelList: "full",
     parseApiKey: (headers: Headers) => headers.get("x-goog-api-key") ?? undefined,
     parseApiKey: (headers: Headers) => headers.get("x-goog-api-key") ?? undefined,
     parseModel: (url: string, _body: any) => url.split("/").pop()?.split(":")?.[0] ?? "",
     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) =>
     parseIsStream: (url: string, _body: any) =>
       // ie. url: https://opencode.ai/zen/v1/models/gemini-3-pro:streamGenerateContent?alt=sse'
       // ie. url: https://opencode.ai/zen/v1/models/gemini-3-pro:streamGenerateContent?alt=sse'
       url.split("/").pop()?.split(":")?.[1]?.startsWith("streamGenerateContent") ?? false,
       url.split("/").pop()?.split(":")?.[1]?.startsWith("streamGenerateContent") ?? false,

+ 2 - 1
packages/console/app/src/routes/zen/v1/responses.ts

@@ -1,5 +1,6 @@
 import type { APIEvent } from "@solidjs/start/server"
 import type { APIEvent } from "@solidjs/start/server"
 import { handler } from "~/routes/zen/util/handler"
 import { handler } from "~/routes/zen/util/handler"
+import { parseOpenAiVariant } from "~/routes/zen/util/variant"
 
 
 export function POST(input: APIEvent) {
 export function POST(input: APIEvent) {
   return handler(input, {
   return handler(input, {
@@ -7,7 +8,7 @@ export function POST(input: APIEvent) {
     modelList: "full",
     modelList: "full",
     parseApiKey: (headers: Headers) => headers.get("authorization")?.split(" ")[1],
     parseApiKey: (headers: Headers) => headers.get("authorization")?.split(" ")[1],
     parseModel: (url: string, body: any) => body.model,
     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,
     parseIsStream: (url: string, body: any) => !!body.stream,
   })
   })
 }
 }