49 lines
1.6 KiB
TypeScript
49 lines
1.6 KiB
TypeScript
|
|
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 };
|
||
|
|
}
|
||
|
|
}
|