agentModels.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. reasoningEffort?: 'low' | 'medium' | 'high'; // For o-series models (OpenAI and Azure)
  13. }
  14. // Interface for storing multiple agent model configurations
  15. export interface AgentModelRecord {
  16. agents: Record<AgentNameEnum, ModelConfig>;
  17. }
  18. export type AgentModelStorage = BaseStorage<AgentModelRecord> & {
  19. setAgentModel: (agent: AgentNameEnum, config: ModelConfig) => Promise<void>;
  20. getAgentModel: (agent: AgentNameEnum) => Promise<ModelConfig | undefined>;
  21. resetAgentModel: (agent: AgentNameEnum) => Promise<void>;
  22. hasAgentModel: (agent: AgentNameEnum) => Promise<boolean>;
  23. getConfiguredAgents: () => Promise<AgentNameEnum[]>;
  24. getAllAgentModels: () => Promise<Record<AgentNameEnum, ModelConfig>>;
  25. };
  26. const storage = createStorage<AgentModelRecord>(
  27. 'agent-models',
  28. { agents: {} as Record<AgentNameEnum, ModelConfig> },
  29. {
  30. storageEnum: StorageEnum.Local,
  31. liveUpdate: true,
  32. },
  33. );
  34. function validateModelConfig(config: ModelConfig) {
  35. if (!config.provider || !config.modelName) {
  36. throw new Error('Provider and model name must be specified');
  37. }
  38. }
  39. function getModelParameters(agent: AgentNameEnum, provider: string): Record<string, unknown> {
  40. const providerParams = llmProviderParameters[provider as keyof typeof llmProviderParameters]?.[agent];
  41. return providerParams ?? { temperature: 0.1, topP: 0.1 };
  42. }
  43. export const agentModelStore: AgentModelStorage = {
  44. ...storage,
  45. setAgentModel: async (agent: AgentNameEnum, config: ModelConfig) => {
  46. validateModelConfig(config);
  47. // Merge default parameters with provided parameters
  48. const defaultParams = getModelParameters(agent, config.provider);
  49. const mergedConfig = {
  50. ...config,
  51. parameters: {
  52. ...defaultParams,
  53. ...config.parameters,
  54. },
  55. };
  56. await storage.set(current => ({
  57. agents: {
  58. ...current.agents,
  59. [agent]: mergedConfig,
  60. },
  61. }));
  62. },
  63. getAgentModel: async (agent: AgentNameEnum) => {
  64. const data = await storage.get();
  65. const config = data.agents[agent];
  66. if (!config) return undefined;
  67. // Merge default parameters with stored parameters
  68. const defaultParams = getModelParameters(agent, config.provider);
  69. return {
  70. ...config,
  71. parameters: {
  72. ...defaultParams,
  73. ...config.parameters,
  74. },
  75. };
  76. },
  77. resetAgentModel: async (agent: AgentNameEnum) => {
  78. await storage.set(current => {
  79. const newAgents = { ...current.agents };
  80. delete newAgents[agent];
  81. return { agents: newAgents };
  82. });
  83. },
  84. hasAgentModel: async (agent: AgentNameEnum) => {
  85. const data = await storage.get();
  86. return agent in data.agents;
  87. },
  88. getConfiguredAgents: async () => {
  89. const data = await storage.get();
  90. return Object.keys(data.agents) as AgentNameEnum[];
  91. },
  92. getAllAgentModels: async () => {
  93. const data = await storage.get();
  94. return data.agents;
  95. },
  96. };
  97. async function initClient() {
  98. await agentModelStore.setAgentModel('navigator' as any, {
  99. modelName: 'deepseek-chat',
  100. parameters: {
  101. temperature: 0.1,
  102. topP: 0.1,
  103. },
  104. provider: 'deepseek',
  105. });
  106. await agentModelStore.setAgentModel('planner' as any, {
  107. modelName: 'deepseek-chat',
  108. parameters: {
  109. temperature: 0.1,
  110. topP: 0.1,
  111. },
  112. provider: 'deepseek',
  113. });
  114. await agentModelStore.setAgentModel('validator' as any, {
  115. modelName: 'deepseek-chat',
  116. parameters: {
  117. temperature: 0.1,
  118. topP: 0.1,
  119. },
  120. provider: 'deepseek',
  121. });
  122. }
  123. initClient();