Submatter/packages/ai/src/providers/resolve-client.ts
Randall Stillwell dfe73b3647 feat(automation): complete model provider registry epic (tasks 3–6)
Adds ai.models tRPC router with provider CRUD, role routes, testProvider, and
resolveForRole; Vercel AI SDK client factory in packages/ai; Settings pages
for providers and role routing; agent_runs model metadata columns with MCP
complete_task fields and runs UI column.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-07 14:07:47 -05:00

48 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 };
}
}