@smythos/sre 1.6.1 → 1.6.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/CHANGELOG +111 -111
  2. package/LICENSE +18 -18
  3. package/README.md +135 -135
  4. package/dist/index.js +2 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/types/subsystems/LLMManager/ModelsProvider.service/connectors/SmythModelsProvider.class.d.ts +39 -0
  7. package/package.json +1 -1
  8. package/src/Components/APICall/APICall.class.ts +161 -161
  9. package/src/Components/APICall/AccessTokenManager.ts +166 -166
  10. package/src/Components/APICall/ArrayBufferResponse.helper.ts +58 -58
  11. package/src/Components/APICall/OAuth.helper.ts +447 -447
  12. package/src/Components/APICall/mimeTypeCategories.ts +46 -46
  13. package/src/Components/APICall/parseData.ts +167 -167
  14. package/src/Components/APICall/parseHeaders.ts +41 -41
  15. package/src/Components/APICall/parseProxy.ts +68 -68
  16. package/src/Components/APICall/parseUrl.ts +91 -91
  17. package/src/Components/APIEndpoint.class.ts +234 -234
  18. package/src/Components/APIOutput.class.ts +58 -58
  19. package/src/Components/AgentPlugin.class.ts +102 -102
  20. package/src/Components/Async.class.ts +155 -155
  21. package/src/Components/Await.class.ts +90 -90
  22. package/src/Components/Classifier.class.ts +158 -158
  23. package/src/Components/Component.class.ts +147 -147
  24. package/src/Components/ComponentHost.class.ts +38 -38
  25. package/src/Components/DataSourceCleaner.class.ts +92 -92
  26. package/src/Components/DataSourceIndexer.class.ts +181 -181
  27. package/src/Components/DataSourceLookup.class.ts +161 -161
  28. package/src/Components/ECMASandbox.class.ts +72 -72
  29. package/src/Components/FEncDec.class.ts +29 -29
  30. package/src/Components/FHash.class.ts +33 -33
  31. package/src/Components/FSign.class.ts +80 -80
  32. package/src/Components/FSleep.class.ts +25 -25
  33. package/src/Components/FTimestamp.class.ts +66 -66
  34. package/src/Components/FileStore.class.ts +78 -78
  35. package/src/Components/ForEach.class.ts +97 -97
  36. package/src/Components/GPTPlugin.class.ts +70 -70
  37. package/src/Components/GenAILLM.class.ts +586 -586
  38. package/src/Components/HuggingFace.class.ts +313 -313
  39. package/src/Components/Image/imageSettings.config.ts +70 -70
  40. package/src/Components/ImageGenerator.class.ts +483 -483
  41. package/src/Components/JSONFilter.class.ts +54 -54
  42. package/src/Components/LLMAssistant.class.ts +213 -213
  43. package/src/Components/LogicAND.class.ts +28 -28
  44. package/src/Components/LogicAtLeast.class.ts +85 -85
  45. package/src/Components/LogicAtMost.class.ts +86 -86
  46. package/src/Components/LogicOR.class.ts +29 -29
  47. package/src/Components/LogicXOR.class.ts +34 -34
  48. package/src/Components/MCPClient.class.ts +137 -137
  49. package/src/Components/MemoryDeleteKeyVal.class.ts +70 -70
  50. package/src/Components/MemoryReadKeyVal.class.ts +67 -67
  51. package/src/Components/MemoryWriteKeyVal.class.ts +62 -62
  52. package/src/Components/MemoryWriteObject.class.ts +97 -97
  53. package/src/Components/MultimodalLLM.class.ts +128 -128
  54. package/src/Components/OpenAPI.class.ts +72 -72
  55. package/src/Components/PromptGenerator.class.ts +122 -122
  56. package/src/Components/ScrapflyWebScrape.class.ts +183 -183
  57. package/src/Components/ServerlessCode.class.ts +123 -123
  58. package/src/Components/TavilyWebSearch.class.ts +103 -103
  59. package/src/Components/VisionLLM.class.ts +104 -104
  60. package/src/Components/ZapierAction.class.ts +127 -127
  61. package/src/Components/index.ts +97 -97
  62. package/src/Core/AgentProcess.helper.ts +240 -240
  63. package/src/Core/Connector.class.ts +123 -123
  64. package/src/Core/ConnectorsService.ts +197 -197
  65. package/src/Core/DummyConnector.ts +49 -49
  66. package/src/Core/HookService.ts +105 -105
  67. package/src/Core/SmythRuntime.class.ts +241 -241
  68. package/src/Core/SystemEvents.ts +16 -16
  69. package/src/Core/boot.ts +56 -56
  70. package/src/config.ts +15 -15
  71. package/src/constants.ts +126 -126
  72. package/src/data/hugging-face.params.json +579 -579
  73. package/src/helpers/AWSLambdaCode.helper.ts +624 -599
  74. package/src/helpers/BinaryInput.helper.ts +331 -331
  75. package/src/helpers/Conversation.helper.ts +1157 -1157
  76. package/src/helpers/ECMASandbox.helper.ts +64 -64
  77. package/src/helpers/JsonContent.helper.ts +97 -97
  78. package/src/helpers/LocalCache.helper.ts +97 -97
  79. package/src/helpers/Log.helper.ts +274 -274
  80. package/src/helpers/OpenApiParser.helper.ts +150 -150
  81. package/src/helpers/S3Cache.helper.ts +147 -147
  82. package/src/helpers/SmythURI.helper.ts +5 -5
  83. package/src/helpers/Sysconfig.helper.ts +95 -95
  84. package/src/helpers/TemplateString.helper.ts +243 -243
  85. package/src/helpers/TypeChecker.helper.ts +329 -329
  86. package/src/index.ts +198 -198
  87. package/src/index.ts.bak +198 -198
  88. package/src/subsystems/AgentManager/Agent.class.ts +1114 -1114
  89. package/src/subsystems/AgentManager/Agent.helper.ts +3 -3
  90. package/src/subsystems/AgentManager/AgentData.service/AgentDataConnector.ts +230 -230
  91. package/src/subsystems/AgentManager/AgentData.service/connectors/CLIAgentDataConnector.class.ts +66 -66
  92. package/src/subsystems/AgentManager/AgentData.service/connectors/LocalAgentDataConnector.class.ts +145 -145
  93. package/src/subsystems/AgentManager/AgentData.service/connectors/NullAgentData.class.ts +39 -39
  94. package/src/subsystems/AgentManager/AgentData.service/index.ts +18 -18
  95. package/src/subsystems/AgentManager/AgentLogger.class.ts +301 -301
  96. package/src/subsystems/AgentManager/AgentRequest.class.ts +51 -51
  97. package/src/subsystems/AgentManager/AgentRuntime.class.ts +557 -557
  98. package/src/subsystems/AgentManager/AgentSSE.class.ts +101 -101
  99. package/src/subsystems/AgentManager/AgentSettings.class.ts +52 -52
  100. package/src/subsystems/AgentManager/Component.service/ComponentConnector.ts +32 -32
  101. package/src/subsystems/AgentManager/Component.service/connectors/LocalComponentConnector.class.ts +60 -60
  102. package/src/subsystems/AgentManager/Component.service/index.ts +11 -11
  103. package/src/subsystems/AgentManager/EmbodimentSettings.class.ts +47 -47
  104. package/src/subsystems/AgentManager/ForkedAgent.class.ts +154 -154
  105. package/src/subsystems/AgentManager/OSResourceMonitor.ts +77 -77
  106. package/src/subsystems/ComputeManager/Code.service/CodeConnector.ts +98 -98
  107. package/src/subsystems/ComputeManager/Code.service/connectors/AWSLambdaCode.class.ts +171 -172
  108. package/src/subsystems/ComputeManager/Code.service/connectors/ECMASandbox.class.ts +131 -131
  109. package/src/subsystems/ComputeManager/Code.service/index.ts +13 -13
  110. package/src/subsystems/IO/CLI.service/CLIConnector.ts +47 -47
  111. package/src/subsystems/IO/CLI.service/index.ts +9 -9
  112. package/src/subsystems/IO/Log.service/LogConnector.ts +32 -32
  113. package/src/subsystems/IO/Log.service/connectors/ConsoleLog.class.ts +28 -28
  114. package/src/subsystems/IO/Log.service/index.ts +13 -13
  115. package/src/subsystems/IO/NKV.service/NKVConnector.ts +43 -43
  116. package/src/subsystems/IO/NKV.service/connectors/NKVLocalStorage.class.ts +234 -234
  117. package/src/subsystems/IO/NKV.service/connectors/NKVRAM.class.ts +204 -204
  118. package/src/subsystems/IO/NKV.service/connectors/NKVRedis.class.ts +182 -182
  119. package/src/subsystems/IO/NKV.service/index.ts +14 -14
  120. package/src/subsystems/IO/Router.service/RouterConnector.ts +21 -21
  121. package/src/subsystems/IO/Router.service/connectors/ExpressRouter.class.ts +48 -48
  122. package/src/subsystems/IO/Router.service/connectors/NullRouter.class.ts +40 -40
  123. package/src/subsystems/IO/Router.service/index.ts +11 -11
  124. package/src/subsystems/IO/Storage.service/SmythFS.class.ts +488 -488
  125. package/src/subsystems/IO/Storage.service/StorageConnector.ts +66 -66
  126. package/src/subsystems/IO/Storage.service/connectors/LocalStorage.class.ts +327 -327
  127. package/src/subsystems/IO/Storage.service/connectors/S3Storage.class.ts +482 -482
  128. package/src/subsystems/IO/Storage.service/index.ts +13 -13
  129. package/src/subsystems/IO/VectorDB.service/VectorDBConnector.ts +108 -108
  130. package/src/subsystems/IO/VectorDB.service/connectors/MilvusVectorDB.class.ts +465 -465
  131. package/src/subsystems/IO/VectorDB.service/connectors/PineconeVectorDB.class.ts +387 -387
  132. package/src/subsystems/IO/VectorDB.service/connectors/RAMVecrtorDB.class.ts +408 -408
  133. package/src/subsystems/IO/VectorDB.service/embed/BaseEmbedding.ts +107 -107
  134. package/src/subsystems/IO/VectorDB.service/embed/GoogleEmbedding.ts +118 -118
  135. package/src/subsystems/IO/VectorDB.service/embed/OpenAIEmbedding.ts +109 -109
  136. package/src/subsystems/IO/VectorDB.service/embed/index.ts +26 -26
  137. package/src/subsystems/IO/VectorDB.service/index.ts +14 -14
  138. package/src/subsystems/LLMManager/LLM.helper.ts +251 -251
  139. package/src/subsystems/LLMManager/LLM.inference.ts +345 -345
  140. package/src/subsystems/LLMManager/LLM.service/LLMConnector.ts +492 -492
  141. package/src/subsystems/LLMManager/LLM.service/LLMCredentials.helper.ts +171 -171
  142. package/src/subsystems/LLMManager/LLM.service/connectors/Anthropic.class.ts +666 -666
  143. package/src/subsystems/LLMManager/LLM.service/connectors/Bedrock.class.ts +407 -407
  144. package/src/subsystems/LLMManager/LLM.service/connectors/Echo.class.ts +92 -92
  145. package/src/subsystems/LLMManager/LLM.service/connectors/GoogleAI.class.ts +983 -983
  146. package/src/subsystems/LLMManager/LLM.service/connectors/Groq.class.ts +319 -319
  147. package/src/subsystems/LLMManager/LLM.service/connectors/Ollama.class.ts +361 -361
  148. package/src/subsystems/LLMManager/LLM.service/connectors/Perplexity.class.ts +257 -257
  149. package/src/subsystems/LLMManager/LLM.service/connectors/VertexAI.class.ts +430 -430
  150. package/src/subsystems/LLMManager/LLM.service/connectors/openai/OpenAIConnector.class.ts +503 -503
  151. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ChatCompletionsApiInterface.ts +524 -524
  152. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/OpenAIApiInterface.ts +100 -100
  153. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/OpenAIApiInterfaceFactory.ts +81 -81
  154. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ResponsesApiInterface.ts +1145 -1145
  155. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/constants.ts +13 -13
  156. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/index.ts +4 -4
  157. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/utils.ts +11 -11
  158. package/src/subsystems/LLMManager/LLM.service/connectors/openai/types.ts +32 -32
  159. package/src/subsystems/LLMManager/LLM.service/connectors/xAI.class.ts +478 -478
  160. package/src/subsystems/LLMManager/LLM.service/index.ts +47 -47
  161. package/src/subsystems/LLMManager/ModelsProvider.service/ModelsProviderConnector.ts +303 -303
  162. package/src/subsystems/LLMManager/ModelsProvider.service/connectors/JSONModelsProvider.class.ts +271 -271
  163. package/src/subsystems/LLMManager/ModelsProvider.service/index.ts +11 -11
  164. package/src/subsystems/LLMManager/custom-models.ts +854 -854
  165. package/src/subsystems/LLMManager/models.ts +2540 -2540
  166. package/src/subsystems/LLMManager/paramMappings.ts +69 -69
  167. package/src/subsystems/MemoryManager/Cache.service/CacheConnector.ts +86 -86
  168. package/src/subsystems/MemoryManager/Cache.service/connectors/LocalStorageCache.class.ts +297 -297
  169. package/src/subsystems/MemoryManager/Cache.service/connectors/RAMCache.class.ts +214 -214
  170. package/src/subsystems/MemoryManager/Cache.service/connectors/RedisCache.class.ts +252 -252
  171. package/src/subsystems/MemoryManager/Cache.service/connectors/S3Cache.class.ts +373 -373
  172. package/src/subsystems/MemoryManager/Cache.service/index.ts +15 -15
  173. package/src/subsystems/MemoryManager/LLMCache.ts +72 -72
  174. package/src/subsystems/MemoryManager/LLMContext.ts +124 -124
  175. package/src/subsystems/MemoryManager/LLMMemory.service/LLMMemoryConnector.ts +26 -26
  176. package/src/subsystems/MemoryManager/RuntimeContext.ts +277 -277
  177. package/src/subsystems/Security/AccessControl/ACL.class.ts +208 -208
  178. package/src/subsystems/Security/AccessControl/AccessCandidate.class.ts +82 -82
  179. package/src/subsystems/Security/AccessControl/AccessRequest.class.ts +52 -52
  180. package/src/subsystems/Security/Account.service/AccountConnector.ts +44 -44
  181. package/src/subsystems/Security/Account.service/connectors/DummyAccount.class.ts +130 -130
  182. package/src/subsystems/Security/Account.service/connectors/JSONFileAccount.class.ts +170 -170
  183. package/src/subsystems/Security/Account.service/connectors/MySQLAccount.class.ts +76 -76
  184. package/src/subsystems/Security/Account.service/index.ts +14 -14
  185. package/src/subsystems/Security/Credentials.helper.ts +62 -62
  186. package/src/subsystems/Security/ManagedVault.service/ManagedVaultConnector.ts +38 -38
  187. package/src/subsystems/Security/ManagedVault.service/connectors/NullManagedVault.class.ts +53 -53
  188. package/src/subsystems/Security/ManagedVault.service/connectors/SecretManagerManagedVault.ts +154 -154
  189. package/src/subsystems/Security/ManagedVault.service/index.ts +12 -12
  190. package/src/subsystems/Security/SecureConnector.class.ts +110 -110
  191. package/src/subsystems/Security/Vault.service/Vault.helper.ts +30 -30
  192. package/src/subsystems/Security/Vault.service/VaultConnector.ts +29 -29
  193. package/src/subsystems/Security/Vault.service/connectors/HashicorpVault.class.ts +46 -46
  194. package/src/subsystems/Security/Vault.service/connectors/JSONFileVault.class.ts +221 -221
  195. package/src/subsystems/Security/Vault.service/connectors/NullVault.class.ts +54 -54
  196. package/src/subsystems/Security/Vault.service/connectors/SecretsManager.class.ts +140 -140
  197. package/src/subsystems/Security/Vault.service/index.ts +12 -12
  198. package/src/types/ACL.types.ts +104 -104
  199. package/src/types/AWS.types.ts +10 -10
  200. package/src/types/Agent.types.ts +61 -61
  201. package/src/types/AgentLogger.types.ts +17 -17
  202. package/src/types/Cache.types.ts +1 -1
  203. package/src/types/Common.types.ts +2 -2
  204. package/src/types/LLM.types.ts +520 -520
  205. package/src/types/Redis.types.ts +8 -8
  206. package/src/types/SRE.types.ts +64 -64
  207. package/src/types/Security.types.ts +14 -14
  208. package/src/types/Storage.types.ts +5 -5
  209. package/src/types/VectorDB.types.ts +86 -86
  210. package/src/utils/base64.utils.ts +275 -275
  211. package/src/utils/cli.utils.ts +68 -68
  212. package/src/utils/data.utils.ts +322 -322
  213. package/src/utils/date-time.utils.ts +22 -22
  214. package/src/utils/general.utils.ts +238 -238
  215. package/src/utils/index.ts +12 -12
  216. package/src/utils/lazy-client.ts +261 -261
  217. package/src/utils/numbers.utils.ts +13 -13
  218. package/src/utils/oauth.utils.ts +35 -35
  219. package/src/utils/string.utils.ts +414 -414
  220. package/src/utils/url.utils.ts +19 -19
  221. package/src/utils/validation.utils.ts +74 -74
  222. package/dist/bundle-analysis-lazy.html +0 -4949
  223. package/dist/bundle-analysis.html +0 -4949
  224. package/dist/types/Components/Triggers/GmailTrigger.class.d.ts +0 -13
  225. package/dist/types/Components/Triggers/Trigger.class.d.ts +0 -3
  226. package/dist/types/helpers/AIPerformanceAnalyzer.helper.d.ts +0 -45
  227. package/dist/types/helpers/AIPerformanceCollector.helper.d.ts +0 -111
  228. package/dist/types/subsystems/IO/Storage.service/connectors/AzureBlobStorage.class.d.ts +0 -211
  229. package/dist/types/subsystems/IO/VectorDB.service/connectors/WeaviateVectorDB.class.d.ts +0 -187
  230. package/dist/types/subsystems/PerformanceManager/Performance.service/PerformanceConnector.d.ts +0 -102
  231. package/dist/types/subsystems/PerformanceManager/Performance.service/connectors/LocalPerformanceConnector.class.d.ts +0 -100
  232. package/dist/types/subsystems/PerformanceManager/Performance.service/index.d.ts +0 -22
  233. package/dist/types/types/Performance.types.d.ts +0 -468
  234. package/dist/types/utils/package-manager.utils.d.ts +0 -26
@@ -1,303 +1,303 @@
1
- import { ConnectorService } from '@sre/Core/ConnectorsService';
2
- import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
3
- import { AccessRequest } from '@sre/Security/AccessControl/AccessRequest.class';
4
- import { ACL } from '@sre/Security/AccessControl/ACL.class';
5
- import { SecureConnector } from '@sre/Security/SecureConnector.class';
6
- import { IAccessCandidate } from '@sre/types/ACL.types';
7
- import { TCustomLLMModel, TLLMCredentials, TLLMModel, TLLMModelsList, TLLMProvider } from '@sre/types/LLM.types';
8
- import { customModels } from '../custom-models';
9
- import { LocalCache } from '@sre/helpers/LocalCache.helper';
10
-
11
- export interface IModelsProviderRequest {
12
- getModels(): Promise<any>;
13
- getCustomModels(): Promise<any>;
14
- getMaxContextTokens(model: string, hasAPIKey?: boolean): Promise<number>;
15
- addModels(models: TLLMModelsList): Promise<void>;
16
- getModelInfo(model: string | TLLMModel | TCustomLLMModel, hasAPIKey?: boolean): Promise<TLLMModel>;
17
- getModelId(model: string | TLLMModel | TCustomLLMModel): Promise<string>;
18
- getProvider(model: string | TLLMModel | TCustomLLMModel): Promise<string>;
19
- isStandardLLM(model: string | TLLMModel | TCustomLLMModel): Promise<boolean>;
20
- adjustMaxCompletionTokens(model: string | TLLMModel | TCustomLLMModel, maxCompletionTokens: number, hasAPIKey?: boolean): Promise<number>;
21
- getMaxContextTokens(model: string | TLLMModel | TCustomLLMModel, hasAPIKey?: boolean): Promise<number>;
22
- getMaxCompletionTokens(model: string | TLLMModel | TCustomLLMModel, hasAPIKey?: boolean): Promise<number>;
23
- validateTokensLimit({
24
- model,
25
- promptTokens,
26
- completionTokens,
27
- hasAPIKey,
28
- }: {
29
- model: TLLMModel | TCustomLLMModel;
30
- promptTokens: number;
31
- completionTokens: number;
32
- hasAPIKey?: boolean;
33
- }): Promise<void>;
34
- }
35
-
36
- export abstract class ModelsProviderConnector extends SecureConnector {
37
- protected static localCache = new LocalCache();
38
- public abstract getResourceACL(resourceId: string, candidate: IAccessCandidate): Promise<ACL>;
39
- public abstract getModels(acRequest: AccessRequest): Promise<TLLMModelsList>;
40
- public abstract addModels(acRequest: AccessRequest, models: TLLMModelsList): Promise<void>;
41
-
42
- public requester(candidate: AccessCandidate): IModelsProviderRequest {
43
- const cacheKey = `ModelsProviderConnector:${candidate.toString()}`;
44
- if (ModelsProviderConnector.localCache.has(cacheKey)) {
45
- //update the TTL every time the requester is called
46
- return ModelsProviderConnector.localCache.get(cacheKey, 10 * 60 * 1000) as IModelsProviderRequest;
47
- }
48
-
49
- let teamModels = null;
50
- let customModels = null;
51
-
52
- const loadTeamModels = async () => {
53
- if (!teamModels) {
54
- try {
55
- const builtinmodels = await this.getModels(candidate.readRequest);
56
- customModels = await this.getCustomModels(candidate);
57
- teamModels = { ...builtinmodels, ...customModels };
58
- } catch (error) {
59
- return null;
60
- }
61
- }
62
- //Workaround : non-blocking auto-refresh of team models
63
- //this will force team models to refresh for the next request
64
- //TODO: we need a more elegant cache invalidation mechanism, and only refresh the team models if the custom models have changed
65
- setImmediate(async () => {
66
- const _customModels = await this.getCustomModels(candidate);
67
- teamModels = { ...teamModels, ..._customModels };
68
- });
69
-
70
- //immediatelly return the team models
71
- return teamModels;
72
- };
73
- loadTeamModels();
74
-
75
- const instance: IModelsProviderRequest = {
76
- getModels: async () => {
77
- return await loadTeamModels();
78
- },
79
- getCustomModels: async () => {
80
- return await this.getCustomModels(candidate);
81
- },
82
- addModels: async (models: TLLMModelsList) => {
83
- return await this.addModels(candidate.readRequest, models);
84
- },
85
- getModelInfo: async (model: string | TLLMModel | TCustomLLMModel, hasAPIKey: boolean = false) => {
86
- const teamModels = typeof model === 'string' ? await loadTeamModels() : {};
87
- const modelInfo = await this.getModelInfo(candidate.readRequest, teamModels, model, hasAPIKey);
88
- return modelInfo;
89
- },
90
-
91
- getModelId: async (model: string | TLLMModel | TCustomLLMModel) => {
92
- const teamModels = typeof model === 'string' ? await loadTeamModels() : {};
93
- return this.getModelId(candidate.readRequest, teamModels, model);
94
- },
95
- getProvider: async (model: string | TLLMModel | TCustomLLMModel) => {
96
- const teamModels = typeof model === 'string' ? await loadTeamModels() : {};
97
- return this.getProvider(candidate.readRequest, teamModels, model);
98
- },
99
- isStandardLLM: async (model: string | TLLMModel | TCustomLLMModel) => {
100
- const teamModels = typeof model === 'string' ? await loadTeamModels() : {};
101
- const modelInfo = await this.getModelInfo(candidate.readRequest, teamModels, model);
102
- return !modelInfo.isCustomLLM;
103
- },
104
- adjustMaxCompletionTokens: async (
105
- model: string | TLLMModel | TCustomLLMModel,
106
- maxCompletionTokens: number,
107
- hasAPIKey: boolean = false
108
- ) => {
109
- const teamModels = typeof model === 'string' ? await loadTeamModels() : {};
110
- const modelInfo = await this.getModelInfo(candidate.readRequest, teamModels, model, hasAPIKey);
111
- return Math.min(maxCompletionTokens || 512, modelInfo?.completionTokens || modelInfo?.tokens || maxCompletionTokens || 512);
112
- },
113
- getMaxContextTokens: async (model: string | TLLMModel | TCustomLLMModel, hasAPIKey: boolean = false) => {
114
- const teamModels = typeof model === 'string' ? await loadTeamModels() : {};
115
- const modelInfo = await this.getModelInfo(candidate.readRequest, teamModels, model, hasAPIKey);
116
- return modelInfo?.tokens || 1024;
117
- },
118
- getMaxCompletionTokens: async (model: string | TLLMModel | TCustomLLMModel, hasAPIKey: boolean = false) => {
119
- const teamModels = typeof model === 'string' ? await loadTeamModels() : {};
120
- const modelInfo = await this.getModelInfo(candidate.readRequest, teamModels, model, hasAPIKey);
121
- return modelInfo?.completionTokens || modelInfo?.tokens || 512;
122
- },
123
- validateTokensLimit: async ({
124
- model,
125
- promptTokens,
126
- completionTokens,
127
- hasAPIKey,
128
- }: {
129
- model: TLLMModel | TCustomLLMModel;
130
- promptTokens: number;
131
- completionTokens: number;
132
- hasAPIKey: boolean;
133
- }) => {
134
- //const teamModels = typeof model === 'string' ? await loadTeamModels() : {};
135
- if (Array.isArray(model?.tags) && model?.tags?.includes('sdk')) {
136
- return; //skip check for SDK
137
- }
138
- const modelInfo = await this.getModelInfo(candidate.readRequest, {}, model, hasAPIKey);
139
- const allowedContextTokens = modelInfo?.tokens;
140
- const totalTokens = promptTokens + completionTokens;
141
-
142
- const teamAPIKeyExceededMessage = `This models' maximum content length is ${allowedContextTokens} tokens. (This is the sum of your prompt with all variables and the maximum output tokens you've set in Advanced Settings) However, you requested approx ${totalTokens} tokens (${promptTokens} in the prompt, ${completionTokens} in the output). Please reduce the length of either the input prompt or the Maximum output tokens.`;
143
- const noAPIKeyExceededMessage = `Input exceeds max tokens limit of ${allowedContextTokens}. Please add your API key and select Personal tagged models to unlock full length.`;
144
-
145
- if (totalTokens > allowedContextTokens) {
146
- throw new Error(hasAPIKey ? teamAPIKeyExceededMessage : noAPIKeyExceededMessage);
147
- }
148
- },
149
- };
150
- ModelsProviderConnector.localCache.set(cacheKey, instance, 10 * 60 * 1000); // cache for 10 minutes
151
- return instance;
152
- }
153
-
154
- protected async getModelInfo(
155
- acRequest: AccessRequest,
156
- models: TLLMModelsList,
157
- model: string | TLLMModel | TCustomLLMModel,
158
- hasAPIKey: boolean = false
159
- ): Promise<TLLMModel> {
160
- //model can be passed directly, in which case we do not need to look it up in the models list
161
-
162
- let modelId, alias, aliasModelInfo, modelInfo;
163
-
164
- if (typeof model === 'object' && model.modelId) {
165
- //return model;
166
- modelId = model.modelId;
167
- alias = model.alias;
168
- aliasModelInfo = models?.[alias];
169
- modelInfo = model;
170
- } else {
171
- //model can be passed as a string, in which case we need to look it up in the models list
172
-
173
- modelId = await this.getModelId(acRequest, models, model);
174
- alias = models?.[model as string]?.alias;
175
- aliasModelInfo = models?.[alias];
176
- modelInfo = models?.[model as string];
177
- }
178
-
179
- const aliasKeyOptions = aliasModelInfo && hasAPIKey ? aliasModelInfo?.keyOptions : null;
180
-
181
- const modelKeyOptions = modelInfo?.keyOptions || aliasKeyOptions;
182
-
183
- return { ...aliasModelInfo, ...modelInfo, ...aliasKeyOptions, ...modelKeyOptions, modelId };
184
- }
185
-
186
- protected async getModelId(acRequest: AccessRequest, models: TLLMModelsList, model: string | TLLMModel | TCustomLLMModel): Promise<string> {
187
- //model can be passed directly, in which case we do not need to look it up in the models list
188
- if (typeof model === 'object' && model.modelId) {
189
- return model.modelId;
190
- }
191
-
192
- //model can be passed as a string, in which case we need to look it up in the models list
193
- const modelId = models?.[model as string]?.modelId || (model as string);
194
- const alias = models?.[model as string]?.alias;
195
- if (alias) {
196
- const aliasModelId = models?.[alias]?.modelId || alias || (model as string);
197
- return aliasModelId;
198
- }
199
-
200
- return modelId;
201
- }
202
-
203
- // public static async validateTokensLimit({
204
- // model,
205
- // promptTokens,
206
- // completionTokens,
207
- // hasAPIKey = false,
208
- // }: {
209
- // model: string;
210
- // promptTokens: number;
211
- // completionTokens: number;
212
- // hasAPIKey?: boolean;
213
- // }): Promise<void> {
214
-
215
- // const allowedContextTokens = this.getMaxContextTokens(model, hasAPIKey);
216
- // const totalTokens = promptTokens + completionTokens;
217
-
218
- // const teamAPIKeyExceededMessage = `This models' maximum content length is ${allowedContextTokens} tokens. (This is the sum of your prompt with all variables and the maximum output tokens you've set in Advanced Settings) However, you requested approx ${totalTokens} tokens (${promptTokens} in the prompt, ${completionTokens} in the output). Please reduce the length of either the input prompt or the Maximum output tokens.`;
219
- // const noAPIKeyExceededMessage = `Input exceeds max tokens limit of ${allowedContextTokens}. Please add your API key to unlock full length.`;
220
-
221
- // if (totalTokens > allowedContextTokens) {
222
- // throw new Error(hasAPIKey ? teamAPIKeyExceededMessage : noAPIKeyExceededMessage);
223
- // }
224
- // }
225
-
226
- protected async getProvider(acRequest: AccessRequest, models: TLLMModelsList, model: string | TLLMModel | TCustomLLMModel): Promise<string> {
227
- //model can be passed directly, in which case we do not need to look it up in the models list
228
- if (typeof model === 'object' && model.provider) {
229
- return model.provider;
230
- }
231
-
232
- //model can be passed as a string, in which case we need to look it up in the models list
233
-
234
- const modelId = await this.getModelId(acRequest, models, model);
235
-
236
- return models?.[modelId]?.provider || models?.[model as string]?.provider || models?.[modelId]?.llm || models?.[model as string]?.llm;
237
- }
238
- protected async getCustomModels(candidate: IAccessCandidate): Promise<Record<string, any>> {
239
- const models = {};
240
- const settingsKey = 'custom-llm';
241
-
242
- try {
243
- const accountConnector = ConnectorService.getAccountConnector();
244
- const team = await accountConnector.requester(candidate as AccessCandidate).getTeam();
245
-
246
- const teamSettings = await accountConnector.team(team).getTeamSetting(settingsKey);
247
- const savedCustomModelsData = JSON.parse(teamSettings || '{}') as Record<string, any>;
248
-
249
- for (const [entryId, entry] of Object.entries(savedCustomModelsData)) {
250
- const foundationModel = entry.settings.foundationModel;
251
- const customModel = entry.settings.customModel;
252
- const supportsSystemPrompt = customModels[foundationModel]?.supportsSystemPrompt || entry.settings.supportsSystemPrompt;
253
- const customModelData = customModels[foundationModel] || {};
254
-
255
- let credentials = null;
256
- switch (entry.provider) {
257
- case TLLMProvider.Bedrock:
258
- credentials = TLLMCredentials.BedrockVault;
259
- break;
260
- case TLLMProvider.VertexAI:
261
- credentials = TLLMCredentials.VertexAIVault;
262
- break;
263
- default:
264
- credentials = TLLMCredentials.Internal;
265
- break;
266
- }
267
- models[entry.name] = {
268
- label: entry.name,
269
- modelId: customModel || foundationModel,
270
- provider: entry.provider,
271
- features: entry.features?.map((feature) => {
272
- switch (feature) {
273
- case 'text-completion':
274
- return 'text';
275
- case 'tool-use':
276
- return 'tools';
277
- default:
278
- return feature;
279
- }
280
- }),
281
- tags: Array.isArray(entry?.tags) ? ['Enterprise', ...entry?.tags] : ['Enterprise'],
282
- tokens: customModelData?.tokens ?? 100000,
283
- completionTokens: customModelData?.completionTokens ?? 4096,
284
- enabled: true,
285
-
286
- id: entryId,
287
- name: entry.name,
288
- alias: foundationModel,
289
- llm: entry.provider,
290
- components: customModelData?.components ?? [],
291
- isCustomLLM: true,
292
- supportsSystemPrompt,
293
- settings: entry.settings,
294
- credentials,
295
- };
296
- }
297
-
298
- return models;
299
- } catch (error) {
300
- return {};
301
- }
302
- }
303
- }
1
+ import { ConnectorService } from '@sre/Core/ConnectorsService';
2
+ import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
3
+ import { AccessRequest } from '@sre/Security/AccessControl/AccessRequest.class';
4
+ import { ACL } from '@sre/Security/AccessControl/ACL.class';
5
+ import { SecureConnector } from '@sre/Security/SecureConnector.class';
6
+ import { IAccessCandidate } from '@sre/types/ACL.types';
7
+ import { TCustomLLMModel, TLLMCredentials, TLLMModel, TLLMModelsList, TLLMProvider } from '@sre/types/LLM.types';
8
+ import { customModels } from '../custom-models';
9
+ import { LocalCache } from '@sre/helpers/LocalCache.helper';
10
+
11
+ export interface IModelsProviderRequest {
12
+ getModels(): Promise<any>;
13
+ getCustomModels(): Promise<any>;
14
+ getMaxContextTokens(model: string, hasAPIKey?: boolean): Promise<number>;
15
+ addModels(models: TLLMModelsList): Promise<void>;
16
+ getModelInfo(model: string | TLLMModel | TCustomLLMModel, hasAPIKey?: boolean): Promise<TLLMModel>;
17
+ getModelId(model: string | TLLMModel | TCustomLLMModel): Promise<string>;
18
+ getProvider(model: string | TLLMModel | TCustomLLMModel): Promise<string>;
19
+ isStandardLLM(model: string | TLLMModel | TCustomLLMModel): Promise<boolean>;
20
+ adjustMaxCompletionTokens(model: string | TLLMModel | TCustomLLMModel, maxCompletionTokens: number, hasAPIKey?: boolean): Promise<number>;
21
+ getMaxContextTokens(model: string | TLLMModel | TCustomLLMModel, hasAPIKey?: boolean): Promise<number>;
22
+ getMaxCompletionTokens(model: string | TLLMModel | TCustomLLMModel, hasAPIKey?: boolean): Promise<number>;
23
+ validateTokensLimit({
24
+ model,
25
+ promptTokens,
26
+ completionTokens,
27
+ hasAPIKey,
28
+ }: {
29
+ model: TLLMModel | TCustomLLMModel;
30
+ promptTokens: number;
31
+ completionTokens: number;
32
+ hasAPIKey?: boolean;
33
+ }): Promise<void>;
34
+ }
35
+
36
+ export abstract class ModelsProviderConnector extends SecureConnector {
37
+ protected static localCache = new LocalCache();
38
+ public abstract getResourceACL(resourceId: string, candidate: IAccessCandidate): Promise<ACL>;
39
+ public abstract getModels(acRequest: AccessRequest): Promise<TLLMModelsList>;
40
+ public abstract addModels(acRequest: AccessRequest, models: TLLMModelsList): Promise<void>;
41
+
42
+ public requester(candidate: AccessCandidate): IModelsProviderRequest {
43
+ const cacheKey = `ModelsProviderConnector:${candidate.toString()}`;
44
+ if (ModelsProviderConnector.localCache.has(cacheKey)) {
45
+ //update the TTL every time the requester is called
46
+ return ModelsProviderConnector.localCache.get(cacheKey, 10 * 60 * 1000) as IModelsProviderRequest;
47
+ }
48
+
49
+ let teamModels = null;
50
+ let customModels = null;
51
+
52
+ const loadTeamModels = async () => {
53
+ if (!teamModels) {
54
+ try {
55
+ const builtinmodels = await this.getModels(candidate.readRequest);
56
+ customModels = await this.getCustomModels(candidate);
57
+ teamModels = { ...builtinmodels, ...customModels };
58
+ } catch (error) {
59
+ return null;
60
+ }
61
+ }
62
+ //Workaround : non-blocking auto-refresh of team models
63
+ //this will force team models to refresh for the next request
64
+ //TODO: we need a more elegant cache invalidation mechanism, and only refresh the team models if the custom models have changed
65
+ setImmediate(async () => {
66
+ const _customModels = await this.getCustomModels(candidate);
67
+ teamModels = { ...teamModels, ..._customModels };
68
+ });
69
+
70
+ //immediatelly return the team models
71
+ return teamModels;
72
+ };
73
+ loadTeamModels();
74
+
75
+ const instance: IModelsProviderRequest = {
76
+ getModels: async () => {
77
+ return await loadTeamModels();
78
+ },
79
+ getCustomModels: async () => {
80
+ return await this.getCustomModels(candidate);
81
+ },
82
+ addModels: async (models: TLLMModelsList) => {
83
+ return await this.addModels(candidate.readRequest, models);
84
+ },
85
+ getModelInfo: async (model: string | TLLMModel | TCustomLLMModel, hasAPIKey: boolean = false) => {
86
+ const teamModels = typeof model === 'string' ? await loadTeamModels() : {};
87
+ const modelInfo = await this.getModelInfo(candidate.readRequest, teamModels, model, hasAPIKey);
88
+ return modelInfo;
89
+ },
90
+
91
+ getModelId: async (model: string | TLLMModel | TCustomLLMModel) => {
92
+ const teamModels = typeof model === 'string' ? await loadTeamModels() : {};
93
+ return this.getModelId(candidate.readRequest, teamModels, model);
94
+ },
95
+ getProvider: async (model: string | TLLMModel | TCustomLLMModel) => {
96
+ const teamModels = typeof model === 'string' ? await loadTeamModels() : {};
97
+ return this.getProvider(candidate.readRequest, teamModels, model);
98
+ },
99
+ isStandardLLM: async (model: string | TLLMModel | TCustomLLMModel) => {
100
+ const teamModels = typeof model === 'string' ? await loadTeamModels() : {};
101
+ const modelInfo = await this.getModelInfo(candidate.readRequest, teamModels, model);
102
+ return !modelInfo.isCustomLLM;
103
+ },
104
+ adjustMaxCompletionTokens: async (
105
+ model: string | TLLMModel | TCustomLLMModel,
106
+ maxCompletionTokens: number,
107
+ hasAPIKey: boolean = false
108
+ ) => {
109
+ const teamModels = typeof model === 'string' ? await loadTeamModels() : {};
110
+ const modelInfo = await this.getModelInfo(candidate.readRequest, teamModels, model, hasAPIKey);
111
+ return Math.min(maxCompletionTokens || 512, modelInfo?.completionTokens || modelInfo?.tokens || maxCompletionTokens || 512);
112
+ },
113
+ getMaxContextTokens: async (model: string | TLLMModel | TCustomLLMModel, hasAPIKey: boolean = false) => {
114
+ const teamModels = typeof model === 'string' ? await loadTeamModels() : {};
115
+ const modelInfo = await this.getModelInfo(candidate.readRequest, teamModels, model, hasAPIKey);
116
+ return modelInfo?.tokens || 1024;
117
+ },
118
+ getMaxCompletionTokens: async (model: string | TLLMModel | TCustomLLMModel, hasAPIKey: boolean = false) => {
119
+ const teamModels = typeof model === 'string' ? await loadTeamModels() : {};
120
+ const modelInfo = await this.getModelInfo(candidate.readRequest, teamModels, model, hasAPIKey);
121
+ return modelInfo?.completionTokens || modelInfo?.tokens || 512;
122
+ },
123
+ validateTokensLimit: async ({
124
+ model,
125
+ promptTokens,
126
+ completionTokens,
127
+ hasAPIKey,
128
+ }: {
129
+ model: TLLMModel | TCustomLLMModel;
130
+ promptTokens: number;
131
+ completionTokens: number;
132
+ hasAPIKey: boolean;
133
+ }) => {
134
+ //const teamModels = typeof model === 'string' ? await loadTeamModels() : {};
135
+ if (Array.isArray(model?.tags) && model?.tags?.includes('sdk')) {
136
+ return; //skip check for SDK
137
+ }
138
+ const modelInfo = await this.getModelInfo(candidate.readRequest, {}, model, hasAPIKey);
139
+ const allowedContextTokens = modelInfo?.tokens;
140
+ const totalTokens = promptTokens + completionTokens;
141
+
142
+ const teamAPIKeyExceededMessage = `This models' maximum content length is ${allowedContextTokens} tokens. (This is the sum of your prompt with all variables and the maximum output tokens you've set in Advanced Settings) However, you requested approx ${totalTokens} tokens (${promptTokens} in the prompt, ${completionTokens} in the output). Please reduce the length of either the input prompt or the Maximum output tokens.`;
143
+ const noAPIKeyExceededMessage = `Input exceeds max tokens limit of ${allowedContextTokens}. Please add your API key and select Personal tagged models to unlock full length.`;
144
+
145
+ if (totalTokens > allowedContextTokens) {
146
+ throw new Error(hasAPIKey ? teamAPIKeyExceededMessage : noAPIKeyExceededMessage);
147
+ }
148
+ },
149
+ };
150
+ ModelsProviderConnector.localCache.set(cacheKey, instance, 10 * 60 * 1000); // cache for 10 minutes
151
+ return instance;
152
+ }
153
+
154
+ protected async getModelInfo(
155
+ acRequest: AccessRequest,
156
+ models: TLLMModelsList,
157
+ model: string | TLLMModel | TCustomLLMModel,
158
+ hasAPIKey: boolean = false
159
+ ): Promise<TLLMModel> {
160
+ //model can be passed directly, in which case we do not need to look it up in the models list
161
+
162
+ let modelId, alias, aliasModelInfo, modelInfo;
163
+
164
+ if (typeof model === 'object' && model.modelId) {
165
+ //return model;
166
+ modelId = model.modelId;
167
+ alias = model.alias;
168
+ aliasModelInfo = models?.[alias];
169
+ modelInfo = model;
170
+ } else {
171
+ //model can be passed as a string, in which case we need to look it up in the models list
172
+
173
+ modelId = await this.getModelId(acRequest, models, model);
174
+ alias = models?.[model as string]?.alias;
175
+ aliasModelInfo = models?.[alias];
176
+ modelInfo = models?.[model as string];
177
+ }
178
+
179
+ const aliasKeyOptions = aliasModelInfo && hasAPIKey ? aliasModelInfo?.keyOptions : null;
180
+
181
+ const modelKeyOptions = modelInfo?.keyOptions || aliasKeyOptions;
182
+
183
+ return { ...aliasModelInfo, ...modelInfo, ...aliasKeyOptions, ...modelKeyOptions, modelId };
184
+ }
185
+
186
+ protected async getModelId(acRequest: AccessRequest, models: TLLMModelsList, model: string | TLLMModel | TCustomLLMModel): Promise<string> {
187
+ //model can be passed directly, in which case we do not need to look it up in the models list
188
+ if (typeof model === 'object' && model.modelId) {
189
+ return model.modelId;
190
+ }
191
+
192
+ //model can be passed as a string, in which case we need to look it up in the models list
193
+ const modelId = models?.[model as string]?.modelId || (model as string);
194
+ const alias = models?.[model as string]?.alias;
195
+ if (alias) {
196
+ const aliasModelId = models?.[alias]?.modelId || alias || (model as string);
197
+ return aliasModelId;
198
+ }
199
+
200
+ return modelId;
201
+ }
202
+
203
+ // public static async validateTokensLimit({
204
+ // model,
205
+ // promptTokens,
206
+ // completionTokens,
207
+ // hasAPIKey = false,
208
+ // }: {
209
+ // model: string;
210
+ // promptTokens: number;
211
+ // completionTokens: number;
212
+ // hasAPIKey?: boolean;
213
+ // }): Promise<void> {
214
+
215
+ // const allowedContextTokens = this.getMaxContextTokens(model, hasAPIKey);
216
+ // const totalTokens = promptTokens + completionTokens;
217
+
218
+ // const teamAPIKeyExceededMessage = `This models' maximum content length is ${allowedContextTokens} tokens. (This is the sum of your prompt with all variables and the maximum output tokens you've set in Advanced Settings) However, you requested approx ${totalTokens} tokens (${promptTokens} in the prompt, ${completionTokens} in the output). Please reduce the length of either the input prompt or the Maximum output tokens.`;
219
+ // const noAPIKeyExceededMessage = `Input exceeds max tokens limit of ${allowedContextTokens}. Please add your API key to unlock full length.`;
220
+
221
+ // if (totalTokens > allowedContextTokens) {
222
+ // throw new Error(hasAPIKey ? teamAPIKeyExceededMessage : noAPIKeyExceededMessage);
223
+ // }
224
+ // }
225
+
226
+ protected async getProvider(acRequest: AccessRequest, models: TLLMModelsList, model: string | TLLMModel | TCustomLLMModel): Promise<string> {
227
+ //model can be passed directly, in which case we do not need to look it up in the models list
228
+ if (typeof model === 'object' && model.provider) {
229
+ return model.provider;
230
+ }
231
+
232
+ //model can be passed as a string, in which case we need to look it up in the models list
233
+
234
+ const modelId = await this.getModelId(acRequest, models, model);
235
+
236
+ return models?.[modelId]?.provider || models?.[model as string]?.provider || models?.[modelId]?.llm || models?.[model as string]?.llm;
237
+ }
238
+ protected async getCustomModels(candidate: IAccessCandidate): Promise<Record<string, any>> {
239
+ const models = {};
240
+ const settingsKey = 'custom-llm';
241
+
242
+ try {
243
+ const accountConnector = ConnectorService.getAccountConnector();
244
+ const team = await accountConnector.requester(candidate as AccessCandidate).getTeam();
245
+
246
+ const teamSettings = await accountConnector.team(team).getTeamSetting(settingsKey);
247
+ const savedCustomModelsData = JSON.parse(teamSettings || '{}') as Record<string, any>;
248
+
249
+ for (const [entryId, entry] of Object.entries(savedCustomModelsData)) {
250
+ const foundationModel = entry.settings.foundationModel;
251
+ const customModel = entry.settings.customModel;
252
+ const supportsSystemPrompt = customModels[foundationModel]?.supportsSystemPrompt || entry.settings.supportsSystemPrompt;
253
+ const customModelData = customModels[foundationModel] || {};
254
+
255
+ let credentials = null;
256
+ switch (entry.provider) {
257
+ case TLLMProvider.Bedrock:
258
+ credentials = TLLMCredentials.BedrockVault;
259
+ break;
260
+ case TLLMProvider.VertexAI:
261
+ credentials = TLLMCredentials.VertexAIVault;
262
+ break;
263
+ default:
264
+ credentials = TLLMCredentials.Internal;
265
+ break;
266
+ }
267
+ models[entry.name] = {
268
+ label: entry.name,
269
+ modelId: customModel || foundationModel,
270
+ provider: entry.provider,
271
+ features: entry.features?.map((feature) => {
272
+ switch (feature) {
273
+ case 'text-completion':
274
+ return 'text';
275
+ case 'tool-use':
276
+ return 'tools';
277
+ default:
278
+ return feature;
279
+ }
280
+ }),
281
+ tags: Array.isArray(entry?.tags) ? ['Enterprise', ...entry?.tags] : ['Enterprise'],
282
+ tokens: customModelData?.tokens ?? 100000,
283
+ completionTokens: customModelData?.completionTokens ?? 4096,
284
+ enabled: true,
285
+
286
+ id: entryId,
287
+ name: entry.name,
288
+ alias: foundationModel,
289
+ llm: entry.provider,
290
+ components: customModelData?.components ?? [],
291
+ isCustomLLM: true,
292
+ supportsSystemPrompt,
293
+ settings: entry.settings,
294
+ credentials,
295
+ };
296
+ }
297
+
298
+ return models;
299
+ } catch (error) {
300
+ return {};
301
+ }
302
+ }
303
+ }