import { StorageEnum } from '../base/enums'; import { createStorage } from '../base/base'; import type { BaseStorage } from '../base/types'; import { type AgentNameEnum, type LLMProviderEnum, llmProviderModelNames } from './types'; // Interface for a single model configuration export interface ModelConfig { provider: LLMProviderEnum; modelName: string; } // Interface for storing multiple agent model configurations export interface AgentModelRecord { agents: Record; } export type AgentModelStorage = BaseStorage & { setAgentModel: (agent: AgentNameEnum, config: ModelConfig) => Promise; getAgentModel: (agent: AgentNameEnum) => Promise; resetAgentModel: (agent: AgentNameEnum) => Promise; hasAgentModel: (agent: AgentNameEnum) => Promise; getConfiguredAgents: () => Promise; getAllAgentModels: () => Promise>; }; const storage = createStorage( 'agent-models', { agents: {} as Record }, { storageEnum: StorageEnum.Local, liveUpdate: true, }, ); function validateModelConfig(config: ModelConfig) { if (!config.provider || !config.modelName) { throw new Error('Provider and model name must be specified'); } const validModels = llmProviderModelNames[config.provider]; if (!validModels.includes(config.modelName)) { throw new Error(`Invalid model "${config.modelName}" for provider "${config.provider}"`); } } export const agentModelStore: AgentModelStorage = { ...storage, setAgentModel: async (agent: AgentNameEnum, config: ModelConfig) => { validateModelConfig(config); await storage.set(current => ({ agents: { ...current.agents, [agent]: config, }, })); }, getAgentModel: async (agent: AgentNameEnum) => { const data = await storage.get(); return data.agents[agent]; }, resetAgentModel: async (agent: AgentNameEnum) => { await storage.set(current => { const newAgents = { ...current.agents }; delete newAgents[agent]; return { agents: newAgents }; }); }, hasAgentModel: async (agent: AgentNameEnum) => { const data = await storage.get(); return agent in data.agents; }, getConfiguredAgents: async () => { const data = await storage.get(); return Object.keys(data.agents) as AgentNameEnum[]; }, getAllAgentModels: async () => { const data = await storage.get(); return data.agents; }, };