diff --git a/packages/console/app/src/routes/zen/util/format.ts b/packages/console/app/src/routes/zen/util/format.ts deleted file mode 100644 index 53a07496..00000000 --- a/packages/console/app/src/routes/zen/util/format.ts +++ /dev/null @@ -1 +0,0 @@ -export type Format = "anthropic" | "openai" | "oa-compat" diff --git a/packages/console/app/src/routes/zen/util/handler.ts b/packages/console/app/src/routes/zen/util/handler.ts index ebf42f4b..0d46e858 100644 --- a/packages/console/app/src/routes/zen/util/handler.ts +++ b/packages/console/app/src/routes/zen/util/handler.ts @@ -18,7 +18,6 @@ import { createStreamPartConverter, createResponseConverter, } from "./provider/provider" -import { Format } from "./format" import { anthropicHelper } from "./provider/anthropic" import { openaiHelper } from "./provider/openai" import { oaCompatHelper } from "./provider/openai-compatible" @@ -29,7 +28,7 @@ type Model = ZenData["models"][string] export async function handler( input: APIEvent, opts: { - format: Format + format: ZenData.Format parseApiKey: (headers: Headers) => string | undefined }, ) { @@ -248,12 +247,14 @@ export async function handler( throw new ModelError(`Provider ${provider.id} not supported`) } + const format = zenData.providers[provider.id].format + return { ...provider, ...zenData.providers[provider.id], - ...(provider.id === "anthropic" + ...(format === "anthropic" ? anthropicHelper - : provider.id === "openai" + : format === "openai" ? openaiHelper : oaCompatHelper), } diff --git a/packages/console/app/src/routes/zen/util/provider/provider.ts b/packages/console/app/src/routes/zen/util/provider/provider.ts index 03dfbc3c..d0f12396 100644 --- a/packages/console/app/src/routes/zen/util/provider/provider.ts +++ b/packages/console/app/src/routes/zen/util/provider/provider.ts @@ -1,5 +1,4 @@ -import { Format } from "../format" - +import { ZenData } from "@opencode-ai/console-core/model.js" import { fromAnthropicChunk, fromAnthropicRequest, @@ -26,7 +25,7 @@ import { } from "./openai-compatible" export type ProviderHelper = { - format: Format + format: ZenData.Format modifyUrl: (providerApi: string) => string modifyHeaders: (headers: Headers, body: Record, apiKey: string) => void modifyBody: (body: Record) => Record @@ -158,7 +157,7 @@ export interface CommonChunk { } } -export function createBodyConverter(from: Format, to: Format) { +export function createBodyConverter(from: ZenData.Format, to: ZenData.Format) { return (body: any): any => { if (from === to) return body @@ -173,7 +172,7 @@ export function createBodyConverter(from: Format, to: Format) { } } -export function createStreamPartConverter(from: Format, to: Format) { +export function createStreamPartConverter(from: ZenData.Format, to: ZenData.Format) { return (part: any): any => { if (from === to) return part @@ -191,7 +190,7 @@ export function createStreamPartConverter(from: Format, to: Format) { } } -export function createResponseConverter(from: Format, to: Format) { +export function createResponseConverter(from: ZenData.Format, to: ZenData.Format) { return (response: any): any => { if (from === to) return response diff --git a/packages/console/core/src/model.ts b/packages/console/core/src/model.ts index 118f7401..30cc15e4 100644 --- a/packages/console/core/src/model.ts +++ b/packages/console/core/src/model.ts @@ -8,6 +8,9 @@ import { Actor } from "./actor" import { Resource } from "@opencode-ai/console-resource" export namespace ZenData { + const FormatSchema = z.enum(["anthropic", "openai", "oa-compat"]) + export type Format = z.infer + const ModelCostSchema = z.object({ input: z.number(), output: z.number(), @@ -34,6 +37,7 @@ export namespace ZenData { const ProviderSchema = z.object({ api: z.string(), apiKey: z.string(), + format: FormatSchema, headerMappings: z.record(z.string(), z.string()).optional(), })