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