import { createAnthropic } from "@ai-sdk/anthropic"; import { createGoogleGenerativeAI } from "@ai-sdk/google"; import { createOpenAI } from "@ai-sdk/openai"; import type { LanguageModel } from "ai"; import type { ResolvedModel } from "@tasks/shared/model-routing"; export type CreateLanguageModelResult = | { ok: true; model: LanguageModel } | { ok: false; reason: string }; /** * Build a Vercel AI SDK `LanguageModel` from a resolved registry config. * Callers must pass a fully resolved `ResolvedModel` (including apiKey). */ export function createLanguageModelFromResolved( resolved: ResolvedModel, ): CreateLanguageModelResult { try { switch (resolved.providerType) { case "anthropic": { const anthropic = createAnthropic({ apiKey: resolved.apiKey }); return { ok: true, model: anthropic(resolved.modelId) }; } case "openai": case "openai_compatible": case "azure_openai": { const openai = createOpenAI({ apiKey: resolved.apiKey, baseURL: resolved.baseUrl, }); return { ok: true, model: openai(resolved.modelId) }; } case "google": { const google = createGoogleGenerativeAI({ apiKey: resolved.apiKey }); return { ok: true, model: google(resolved.modelId) }; } default: return { ok: false, reason: `Unsupported provider type: ${resolved.providerType as string}`, }; } } catch (e) { const message = e instanceof Error ? e.message : String(e); return { ok: false, reason: message }; } }