agentModels.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { StorageEnum } from '../base/enums';
  2. import { createStorage } from '../base/base';
  3. import type { BaseStorage } from '../base/types';
  4. import { type AgentNameEnum, llmProviderModelNames } from './types';
  5. // Interface for a single model configuration
  6. export interface ModelConfig {
  7. provider: string;
  8. modelName: string;
  9. }
  10. // Interface for storing multiple agent model configurations
  11. export interface AgentModelRecord {
  12. agents: Record<AgentNameEnum, ModelConfig>;
  13. }
  14. export type AgentModelStorage = BaseStorage<AgentModelRecord> & {
  15. setAgentModel: (agent: AgentNameEnum, config: ModelConfig) => Promise<void>;
  16. getAgentModel: (agent: AgentNameEnum) => Promise<ModelConfig | undefined>;
  17. resetAgentModel: (agent: AgentNameEnum) => Promise<void>;
  18. hasAgentModel: (agent: AgentNameEnum) => Promise<boolean>;
  19. getConfiguredAgents: () => Promise<AgentNameEnum[]>;
  20. getAllAgentModels: () => Promise<Record<AgentNameEnum, ModelConfig>>;
  21. };
  22. const storage = createStorage<AgentModelRecord>(
  23. 'agent-models',
  24. { agents: {} as Record<AgentNameEnum, ModelConfig> },
  25. {
  26. storageEnum: StorageEnum.Local,
  27. liveUpdate: true,
  28. },
  29. );
  30. function validateModelConfig(config: ModelConfig) {
  31. if (!config.provider || !config.modelName) {
  32. throw new Error('Provider and model name must be specified');
  33. }
  34. // Check if the provider exists in our predefined providers
  35. const validModels = llmProviderModelNames[config.provider as keyof typeof llmProviderModelNames];
  36. if (!validModels || !validModels.includes(config.modelName)) {
  37. throw new Error(`Invalid model "${config.modelName}" for provider "${config.provider}"`);
  38. }
  39. }
  40. export const agentModelStore: AgentModelStorage = {
  41. ...storage,
  42. setAgentModel: async (agent: AgentNameEnum, config: ModelConfig) => {
  43. validateModelConfig(config);
  44. await storage.set(current => ({
  45. agents: {
  46. ...current.agents,
  47. [agent]: config,
  48. },
  49. }));
  50. },
  51. getAgentModel: async (agent: AgentNameEnum) => {
  52. const data = await storage.get();
  53. return data.agents[agent];
  54. },
  55. resetAgentModel: async (agent: AgentNameEnum) => {
  56. await storage.set(current => {
  57. const newAgents = { ...current.agents };
  58. delete newAgents[agent];
  59. return { agents: newAgents };
  60. });
  61. },
  62. hasAgentModel: async (agent: AgentNameEnum) => {
  63. const data = await storage.get();
  64. return agent in data.agents;
  65. },
  66. getConfiguredAgents: async () => {
  67. const data = await storage.get();
  68. return Object.keys(data.agents) as AgentNameEnum[];
  69. },
  70. getAllAgentModels: async () => {
  71. const data = await storage.get();
  72. return data.agents;
  73. },
  74. };