import { StorageEnum } from '../base/enums'; import { createStorage } from '../base/base'; import type { BaseStorage } from '../base/types'; import type { AgentNameEnum } from './types'; import { llmProviderParameters } from './types'; // Interface for a single model configuration export interface ModelConfig { // providerId, the key of the provider in the llmProviderStore, not the provider name provider: string; modelName: string; parameters?: Record; } // 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'); } } function getModelParameters(agent: AgentNameEnum, provider: string): Record { const providerParams = llmProviderParameters[provider as keyof typeof llmProviderParameters]?.[agent]; return providerParams ?? { temperature: 0.1, topP: 0.1 }; } export const agentModelStore: AgentModelStorage = { ...storage, setAgentModel: async (agent: AgentNameEnum, config: ModelConfig) => { validateModelConfig(config); // Merge default parameters with provided parameters const defaultParams = getModelParameters(agent, config.provider); const mergedConfig = { ...config, parameters: { ...defaultParams, ...config.parameters, }, }; await storage.set(current => ({ agents: { ...current.agents, [agent]: mergedConfig, }, })); }, getAgentModel: async (agent: AgentNameEnum) => { const data = await storage.get(); const config = data.agents[agent]; if (!config) return undefined; // Merge default parameters with stored parameters const defaultParams = getModelParameters(agent, config.provider); return { ...config, parameters: { ...defaultParams, ...config.parameters, }, }; }, 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; }, };