Browse Source
Add provider registry in src/lib/providers/index.ts: - Export all types from types.ts - providerRegistry for storing provider implementations - registerProvider() for providers to self-register - getProvider() to retrieve provider by type - getConfiguredProviders() to get providers with API keys - getAllProviders() to get all registered providers Registry will be populated when provider modules are imported in Phase 2 (Replicate and fal.ai implementations). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>handoff-20260429-1057
1 changed files with 90 additions and 0 deletions
@ -0,0 +1,90 @@ |
|||
/** |
|||
* Provider Registry and Factory |
|||
* |
|||
* Central registry for AI provider implementations. Providers register themselves |
|||
* when their modules are imported, enabling dynamic provider discovery. |
|||
* |
|||
* Usage: |
|||
* import { getProvider, getConfiguredProviders } from "@/lib/providers"; |
|||
* |
|||
* // Get a specific provider
|
|||
* const replicate = getProvider("replicate"); |
|||
* |
|||
* // Get all providers with API keys configured
|
|||
* const available = getConfiguredProviders(); |
|||
* |
|||
* Phase 2 Implementation Notes: |
|||
* - Replicate and fal.ai provider implementations will register themselves here |
|||
* - Gemini remains special-cased in existing generate route for now |
|||
* - Each provider module calls registerProvider() on import |
|||
*/ |
|||
|
|||
import { ProviderType } from "@/types"; |
|||
import { ProviderInterface } from "./types"; |
|||
|
|||
// Re-export all types for convenient imports
|
|||
export * from "./types"; |
|||
|
|||
/** |
|||
* Provider registry - populated by provider implementations when they are imported. |
|||
* Initially empty; providers call registerProvider() to add themselves. |
|||
* |
|||
* Phase 2 will add: |
|||
* - ReplicateProvider (registers as "replicate") |
|||
* - FalProvider (registers as "fal") |
|||
* |
|||
* Note: Gemini provider is currently implemented directly in /api/generate route. |
|||
* It may be migrated to this abstraction in a future phase. |
|||
*/ |
|||
const providerRegistry: Partial<Record<ProviderType, ProviderInterface>> = {}; |
|||
|
|||
/** |
|||
* Register a provider implementation in the registry. |
|||
* Called by provider modules when they are imported. |
|||
* |
|||
* @param provider - The provider implementation to register |
|||
* |
|||
* @example |
|||
* // In src/lib/providers/replicate.ts:
|
|||
* import { registerProvider, ProviderInterface } from "@/lib/providers"; |
|||
* |
|||
* const replicateProvider: ProviderInterface = { ... }; |
|||
* registerProvider(replicateProvider); |
|||
*/ |
|||
export function registerProvider(provider: ProviderInterface): void { |
|||
providerRegistry[provider.id] = provider; |
|||
} |
|||
|
|||
/** |
|||
* Get a provider by its type identifier. |
|||
* |
|||
* @param id - The provider type (e.g., "replicate", "fal") |
|||
* @returns The provider implementation or undefined if not registered |
|||
*/ |
|||
export function getProvider(id: ProviderType): ProviderInterface | undefined { |
|||
return providerRegistry[id]; |
|||
} |
|||
|
|||
/** |
|||
* Get all providers that have API keys configured. |
|||
* Useful for showing available options in the UI. |
|||
* |
|||
* @returns Array of configured provider implementations |
|||
*/ |
|||
export function getConfiguredProviders(): ProviderInterface[] { |
|||
return Object.values(providerRegistry).filter( |
|||
(p): p is ProviderInterface => p !== undefined && p.isConfigured() |
|||
); |
|||
} |
|||
|
|||
/** |
|||
* Get all registered providers regardless of configuration status. |
|||
* Useful for settings UI where users can configure API keys. |
|||
* |
|||
* @returns Array of all registered provider implementations |
|||
*/ |
|||
export function getAllProviders(): ProviderInterface[] { |
|||
return Object.values(providerRegistry).filter( |
|||
(p): p is ProviderInterface => p !== undefined |
|||
); |
|||
} |
|||
Loading…
Reference in new issue