feat(ai): single point of provider selection

This commit is contained in:
Dave 2026-09-16 15:53:59 +02:00
parent b233259f18
commit e837500c6f

41
src/lib/ai/index.ts Normal file
View file

@ -0,0 +1,41 @@
import "server-only";
import { loadAiSettings } from "@/lib/ai/settings";
import { buildSystemPrompt } from "@/lib/ai/prompt";
import { createAnthropicProvider } from "@/lib/ai/provider-anthropic";
import { createOpenAiCompatibleProvider } from "@/lib/ai/provider-openai";
import { AiError, type AiProvider } from "@/lib/ai/types";
/**
* The only module that decides which provider is active.
*
* Every consumer asks for `getProvider()` and gets the interface. Nothing else
* in the codebase should import an adapter directly — that is what keeps
* switching provider a settings change.
*/
export async function getProvider(): Promise<AiProvider> {
const settings = await loadAiSettings();
if (!settings?.apiKey) {
throw new AiError("No AI provider is configured", false);
}
if (settings.provider === "anthropic") {
return createAnthropicProvider(settings.apiKey, settings.model);
}
return createOpenAiCompatibleProvider(
settings.apiKey,
settings.model,
settings.provider
);
}
/** The full system prompt for the current settings. */
export async function getSystemPrompt(): Promise<string> {
const settings = await loadAiSettings();
return buildSystemPrompt(settings?.systemPromptExtra ?? "");
}
export { AiError };
export type { AiProvider, CompletionRequest, CompletionResult } from "@/lib/ai/types";