agentModels.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { StorageEnum } from '../base/enums';
  2. import { createStorage } from '../base/base';
  3. import type { BaseStorage } from '../base/types';
  4. import { type AgentNameEnum, type LLMProviderEnum, llmProviderModelNames } from './types';
  5. // Interface for a single model configuration
  6. export interface ModelConfig {
  7. provider: LLMProviderEnum;
  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. const validModels = llmProviderModelNames[config.provider];
  35. if (!validModels.includes(config.modelName)) {
  36. throw new Error(`Invalid model "${config.modelName}" for provider "${config.provider}"`);
  37. }
  38. }
  39. export const agentModelStore: AgentModelStorage = {
  40. ...storage,
  41. setAgentModel: async (agent: AgentNameEnum, config: ModelConfig) => {
  42. validateModelConfig(config);
  43. await storage.set(current => ({
  44. agents: {
  45. ...current.agents,
  46. [agent]: config,
  47. },
  48. }));
  49. },
  50. getAgentModel: async (agent: AgentNameEnum) => {
  51. const data = await storage.get();
  52. return data.agents[agent];
  53. },
  54. resetAgentModel: async (agent: AgentNameEnum) => {
  55. await storage.set(current => {
  56. const newAgents = { ...current.agents };
  57. delete newAgents[agent];
  58. return { agents: newAgents };
  59. });
  60. },
  61. hasAgentModel: async (agent: AgentNameEnum) => {
  62. const data = await storage.get();
  63. return agent in data.agents;
  64. },
  65. getConfiguredAgents: async () => {
  66. const data = await storage.get();
  67. return Object.keys(data.agents) as AgentNameEnum[];
  68. },
  69. getAllAgentModels: async () => {
  70. const data = await storage.get();
  71. return data.agents;
  72. },
  73. };