agentModels.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { StorageEnum } from '../base/enums';
  2. import { createStorage } from '../base/base';
  3. import type { BaseStorage } from '../base/types';
  4. import type { AgentNameEnum } from './types';
  5. import { llmProviderParameters } from './types';
  6. // Interface for a single model configuration
  7. export interface ModelConfig {
  8. // providerId, the key of the provider in the llmProviderStore, not the provider name
  9. provider: string;
  10. modelName: string;
  11. parameters?: Record<string, unknown>;
  12. }
  13. // Interface for storing multiple agent model configurations
  14. export interface AgentModelRecord {
  15. agents: Record<AgentNameEnum, ModelConfig>;
  16. }
  17. export type AgentModelStorage = BaseStorage<AgentModelRecord> & {
  18. setAgentModel: (agent: AgentNameEnum, config: ModelConfig) => Promise<void>;
  19. getAgentModel: (agent: AgentNameEnum) => Promise<ModelConfig | undefined>;
  20. resetAgentModel: (agent: AgentNameEnum) => Promise<void>;
  21. hasAgentModel: (agent: AgentNameEnum) => Promise<boolean>;
  22. getConfiguredAgents: () => Promise<AgentNameEnum[]>;
  23. getAllAgentModels: () => Promise<Record<AgentNameEnum, ModelConfig>>;
  24. };
  25. const storage = createStorage<AgentModelRecord>(
  26. 'agent-models',
  27. { agents: {} as Record<AgentNameEnum, ModelConfig> },
  28. {
  29. storageEnum: StorageEnum.Local,
  30. liveUpdate: true,
  31. },
  32. );
  33. function validateModelConfig(config: ModelConfig) {
  34. if (!config.provider || !config.modelName) {
  35. throw new Error('Provider and model name must be specified');
  36. }
  37. }
  38. function getModelParameters(agent: AgentNameEnum, provider: string): Record<string, unknown> {
  39. const providerParams = llmProviderParameters[provider as keyof typeof llmProviderParameters]?.[agent];
  40. return providerParams ?? { temperature: 0.1, topP: 0.1 };
  41. }
  42. export const agentModelStore: AgentModelStorage = {
  43. ...storage,
  44. setAgentModel: async (agent: AgentNameEnum, config: ModelConfig) => {
  45. validateModelConfig(config);
  46. // Merge default parameters with provided parameters
  47. const defaultParams = getModelParameters(agent, config.provider);
  48. const mergedConfig = {
  49. ...config,
  50. parameters: {
  51. ...defaultParams,
  52. ...config.parameters,
  53. },
  54. };
  55. await storage.set(current => ({
  56. agents: {
  57. ...current.agents,
  58. [agent]: mergedConfig,
  59. },
  60. }));
  61. },
  62. getAgentModel: async (agent: AgentNameEnum) => {
  63. const data = await storage.get();
  64. const config = data.agents[agent];
  65. if (!config) return undefined;
  66. // Merge default parameters with stored parameters
  67. const defaultParams = getModelParameters(agent, config.provider);
  68. return {
  69. ...config,
  70. parameters: {
  71. ...defaultParams,
  72. ...config.parameters,
  73. },
  74. };
  75. },
  76. resetAgentModel: async (agent: AgentNameEnum) => {
  77. await storage.set(current => {
  78. const newAgents = { ...current.agents };
  79. delete newAgents[agent];
  80. return { agents: newAgents };
  81. });
  82. },
  83. hasAgentModel: async (agent: AgentNameEnum) => {
  84. const data = await storage.get();
  85. return agent in data.agents;
  86. },
  87. getConfiguredAgents: async () => {
  88. const data = await storage.get();
  89. return Object.keys(data.agents) as AgentNameEnum[];
  90. },
  91. getAllAgentModels: async () => {
  92. const data = await storage.get();
  93. return data.agents;
  94. },
  95. };