Phase 1 — Foundation (1/4)
Define the core type system and provider registry for the multi-provider AI integration.
Scope
src/lib/ai/types.ts
AIProvider enum: openai, anthropic, google, groq, openrouter
AIModel interface: { id, name, provider, maxTokens, description }
AIProviderConfig interface: { id, name, baseUrl, models[], headerBuilder(apiKey), validateEndpoint }
AIGenerateRequest interface: { provider, apiKey, model, prompt, maxTokens?, temperature? }
AIGenerateResponse interface: { content, model, usage? }
AIValidationResult interface: { valid, error?, provider }
src/lib/ai/providers.ts
- Provider registry map with config for each provider:
- OpenAI: base URL, auth header format, available models (gpt-4o, gpt-4o-mini)
- Anthropic: base URL, x-api-key + anthropic-version headers, models (claude-sonnet-4-6, claude-haiku-4-5)
- Google: generativelanguage.googleapis.com, key-as-param, models (gemini-2.0-flash, gemini-2.5-pro)
- Groq: OpenAI-compatible base URL, models (llama-3.3-70b, mixtral-8x7b)
- OpenRouter: base URL, models (flexible — let users pick any)
- Helper functions:
getProvider(id), getModelsForProvider(id), getDefaultModel(providerId)
- Each provider config includes the request body formatter (OpenAI-style vs Anthropic-style vs Google-style)
Acceptance Criteria
Technical Notes
- OpenAI, Groq, and OpenRouter all use the OpenAI-compatible chat completions format
- Anthropic uses its own messages format (
/v1/messages)
- Google uses the Gemini format (
/v1beta/models/{model}:generateContent)
- Keep the registry extensible — adding a new provider should be one object addition
Phase 1 — Foundation (1/4)
Define the core type system and provider registry for the multi-provider AI integration.
Scope
src/lib/ai/types.tsAIProviderenum:openai,anthropic,google,groq,openrouterAIModelinterface:{ id, name, provider, maxTokens, description }AIProviderConfiginterface:{ id, name, baseUrl, models[], headerBuilder(apiKey), validateEndpoint }AIGenerateRequestinterface:{ provider, apiKey, model, prompt, maxTokens?, temperature? }AIGenerateResponseinterface:{ content, model, usage? }AIValidationResultinterface:{ valid, error?, provider }src/lib/ai/providers.tsgetProvider(id),getModelsForProvider(id),getDefaultModel(providerId)Acceptance Criteria
Technical Notes
/v1/messages)/v1beta/models/{model}:generateContent)