llmProviders.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import { StorageEnum } from '../base/enums';
  2. import { createStorage } from '../base/base';
  3. import type { BaseStorage } from '../base/types';
  4. import type { LLMProviderEnum } from './types';
  5. // Interface for a single provider configuration
  6. export interface ProviderConfig {
  7. apiKey: string;
  8. baseUrl?: string;
  9. }
  10. // Interface for storing multiple LLM provider configurations
  11. export interface LLMKeyRecord {
  12. providers: Record<LLMProviderEnum, ProviderConfig>;
  13. }
  14. export type LLMProviderStorage = BaseStorage<LLMKeyRecord> & {
  15. setProvider: (provider: LLMProviderEnum, config: ProviderConfig) => Promise<void>;
  16. getProvider: (provider: LLMProviderEnum) => Promise<ProviderConfig | undefined>;
  17. removeProvider: (provider: LLMProviderEnum) => Promise<void>;
  18. hasProvider: (provider: LLMProviderEnum) => Promise<boolean>;
  19. getConfiguredProviders: () => Promise<LLMProviderEnum[]>;
  20. getAllProviders: () => Promise<Record<LLMProviderEnum, ProviderConfig>>;
  21. };
  22. const storage = createStorage<LLMKeyRecord>(
  23. 'llm-api-keys',
  24. { providers: {} as Record<LLMProviderEnum, ProviderConfig> },
  25. {
  26. storageEnum: StorageEnum.Local,
  27. liveUpdate: true,
  28. },
  29. );
  30. export const llmProviderStore: LLMProviderStorage = {
  31. ...storage,
  32. async setProvider(provider: LLMProviderEnum, config: ProviderConfig) {
  33. if (!provider) {
  34. throw new Error('Provider name cannot be empty');
  35. }
  36. if (!config.apiKey) {
  37. throw new Error('API key cannot be empty');
  38. }
  39. const current = (await storage.get()) || { providers: {} };
  40. await storage.set({
  41. providers: {
  42. ...current.providers,
  43. [provider]: config,
  44. },
  45. });
  46. },
  47. async getProvider(provider: LLMProviderEnum) {
  48. const data = (await storage.get()) || { providers: {} };
  49. return data.providers[provider];
  50. },
  51. async removeProvider(provider: LLMProviderEnum) {
  52. const current = (await storage.get()) || { providers: {} };
  53. const newProviders = { ...current.providers };
  54. delete newProviders[provider];
  55. await storage.set({ providers: newProviders });
  56. },
  57. async hasProvider(provider: LLMProviderEnum) {
  58. const data = (await storage.get()) || { providers: {} };
  59. return provider in data.providers;
  60. },
  61. async getConfiguredProviders() {
  62. console.log('Getting configured providers');
  63. const data = await storage.get();
  64. console.log('Raw storage data:', data); // Debug the entire data object
  65. if (!data || !data.providers) {
  66. console.log('No data found, returning empty array');
  67. return [];
  68. }
  69. console.log('Configured providers:', data.providers);
  70. return Object.keys(data.providers) as LLMProviderEnum[];
  71. },
  72. async getAllProviders() {
  73. const data = await storage.get();
  74. return data.providers;
  75. },
  76. };