From fe58321f368fabb0794021f9ad05387c432096dd Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Tue, 20 Jan 2026 17:50:34 -0600 Subject: [PATCH] wip --- .opencode/opencode.jsonc | 5 ++++ packages/opencode/src/provider/models.ts | 7 ++++- packages/opencode/src/provider/provider.ts | 32 ++++++++++++++-------- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/.opencode/opencode.jsonc b/.opencode/opencode.jsonc index 5d2dec625c..f109d42028 100644 --- a/.opencode/opencode.jsonc +++ b/.opencode/opencode.jsonc @@ -9,6 +9,11 @@ "opencode": { "options": {}, }, + "azure": { + "options": { + "resourceName": "alice-mi7mfgew-eastus2", + }, + }, }, "mcp": { "context7": { diff --git a/packages/opencode/src/provider/models.ts b/packages/opencode/src/provider/models.ts index c5465f9880..f60089d940 100644 --- a/packages/opencode/src/provider/models.ts +++ b/packages/opencode/src/provider/models.ts @@ -60,7 +60,12 @@ export namespace ModelsDev { status: z.enum(["alpha", "beta", "deprecated"]).optional(), options: z.record(z.string(), z.any()), headers: z.record(z.string(), z.string()).optional(), - provider: z.object({ npm: z.string() }).optional(), + provider: z + .object({ + npm: z.string().optional(), + api: z.string().optional(), + }) + .optional(), variants: z.record(z.string(), z.record(z.string(), z.any())).optional(), }) export type Model = z.infer diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index 978012dccc..bd34f1fc2f 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -142,7 +142,6 @@ export namespace Provider { }, // TODO: handle the openai and anthropic deployments azure: async () => { - const resourceName = Env.get("AZURE_RESOURCE_NAME") return { autoload: false, async getModel(sdk: any, model: Model, options?: Record) { @@ -154,13 +153,10 @@ export namespace Provider { } return sdk.responses(model.api.id) }, - options: { - baseURL: resourceName ? `https://${resourceName}.cognitiveservices.azure.com/anthropic/v1` : undefined, - }, + options: {}, } }, "azure-cognitive-services": async () => { - const resourceName = Env.get("AZURE_COGNITIVE_SERVICES_RESOURCE_NAME") return { autoload: false, async getModel(sdk: any, model: Model, options?: Record) { @@ -172,9 +168,7 @@ export namespace Provider { } return sdk.responses(model.api.id) }, - options: { - baseURL: resourceName ? `https://${resourceName}.cognitiveservices.azure.com/openai` : undefined, - }, + options: {}, } }, "amazon-bedrock": async () => { @@ -515,7 +509,7 @@ export namespace Provider { providerID: z.string(), api: z.object({ id: z.string(), - url: z.string(), + url: z.string().optional(), npm: z.string(), }), name: z.string(), @@ -603,7 +597,7 @@ export namespace Provider { family: model.family, api: { id: model.id, - url: provider.api!, + url: model.provider?.api ?? provider.api, npm: model.provider?.npm ?? provider.npm ?? "@ai-sdk/openai-compatible", }, status: model.status ?? "active", @@ -966,6 +960,21 @@ export namespace Provider { return state().then((state) => state.providers) } + function resolveModelBaseURL(model: Model, options: Record): string { + const template = model.api?.url ?? "" + if (!template) return "" + const matches = [...template.matchAll(/{{([^}]+)}}/g)] + if (matches.length === 0) return template + return matches.reduce((url, match) => { + const keys = match[1].split("|").map((item) => item.trim()) + const resolved = keys + .map((key) => Env.get(key) ?? options[key]) + .find((value) => value !== undefined && value !== null && value !== "") + if (resolved === undefined || resolved === null || resolved === "") return url + return url.replaceAll(match[0], String(resolved)) + }, template) + } + async function getSDK(model: Model) { try { using _ = log.time("getSDK", { @@ -979,7 +988,8 @@ export namespace Provider { options["includeUsage"] = true } - if (!options["baseURL"]) options["baseURL"] = model.api.url + const resolvedBaseURL = resolveModelBaseURL(model, options) + if (!options["baseURL"] && resolvedBaseURL) options["baseURL"] = resolvedBaseURL if (options["apiKey"] === undefined && provider.key) options["apiKey"] = provider.key if (model.headers) options["headers"] = {