@smythos/sre 1.5.46 → 1.5.50
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.
- package/CHANGELOG +98 -90
- package/LICENSE +18 -18
- package/README.md +135 -135
- package/dist/bundle-analysis-lazy.html +4949 -0
- package/dist/bundle-analysis.html +4949 -0
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/types/Components/MCPClient.class.d.ts +1 -0
- package/dist/types/subsystems/LLMManager/LLM.service/connectors/openai/OpenAIConnector.class.d.ts +1 -6
- package/dist/types/utils/package-manager.utils.d.ts +26 -0
- package/package.json +1 -1
- package/src/Components/APICall/APICall.class.ts +156 -156
- package/src/Components/APICall/AccessTokenManager.ts +130 -130
- package/src/Components/APICall/ArrayBufferResponse.helper.ts +58 -58
- package/src/Components/APICall/OAuth.helper.ts +294 -294
- package/src/Components/APICall/mimeTypeCategories.ts +46 -46
- package/src/Components/APICall/parseData.ts +167 -167
- package/src/Components/APICall/parseHeaders.ts +41 -41
- package/src/Components/APICall/parseProxy.ts +68 -68
- package/src/Components/APICall/parseUrl.ts +91 -91
- package/src/Components/APIEndpoint.class.ts +234 -234
- package/src/Components/APIOutput.class.ts +58 -58
- package/src/Components/AgentPlugin.class.ts +102 -102
- package/src/Components/Async.class.ts +155 -155
- package/src/Components/Await.class.ts +90 -90
- package/src/Components/Classifier.class.ts +158 -158
- package/src/Components/Component.class.ts +132 -132
- package/src/Components/ComponentHost.class.ts +38 -38
- package/src/Components/DataSourceCleaner.class.ts +92 -92
- package/src/Components/DataSourceIndexer.class.ts +181 -181
- package/src/Components/DataSourceLookup.class.ts +161 -161
- package/src/Components/ECMASandbox.class.ts +71 -71
- package/src/Components/FEncDec.class.ts +29 -29
- package/src/Components/FHash.class.ts +33 -33
- package/src/Components/FSign.class.ts +80 -80
- package/src/Components/FSleep.class.ts +25 -25
- package/src/Components/FTimestamp.class.ts +25 -25
- package/src/Components/FileStore.class.ts +78 -78
- package/src/Components/ForEach.class.ts +97 -97
- package/src/Components/GPTPlugin.class.ts +70 -70
- package/src/Components/GenAILLM.class.ts +586 -586
- package/src/Components/HuggingFace.class.ts +314 -314
- package/src/Components/Image/imageSettings.config.ts +70 -70
- package/src/Components/ImageGenerator.class.ts +502 -502
- package/src/Components/JSONFilter.class.ts +54 -54
- package/src/Components/LLMAssistant.class.ts +213 -213
- package/src/Components/LogicAND.class.ts +28 -28
- package/src/Components/LogicAtLeast.class.ts +85 -85
- package/src/Components/LogicAtMost.class.ts +86 -86
- package/src/Components/LogicOR.class.ts +29 -29
- package/src/Components/LogicXOR.class.ts +34 -34
- package/src/Components/MCPClient.class.ts +138 -112
- package/src/Components/MemoryDeleteKeyVal.class.ts +70 -70
- package/src/Components/MemoryReadKeyVal.class.ts +66 -66
- package/src/Components/MemoryWriteKeyVal.class.ts +62 -62
- package/src/Components/MemoryWriteObject.class.ts +97 -97
- package/src/Components/MultimodalLLM.class.ts +128 -128
- package/src/Components/OpenAPI.class.ts +72 -72
- package/src/Components/PromptGenerator.class.ts +122 -122
- package/src/Components/ScrapflyWebScrape.class.ts +159 -159
- package/src/Components/ServerlessCode.class.ts +123 -123
- package/src/Components/TavilyWebSearch.class.ts +98 -98
- package/src/Components/VisionLLM.class.ts +104 -104
- package/src/Components/ZapierAction.class.ts +127 -127
- package/src/Components/index.ts +97 -97
- package/src/Core/AgentProcess.helper.ts +240 -240
- package/src/Core/Connector.class.ts +123 -123
- package/src/Core/ConnectorsService.ts +197 -197
- package/src/Core/DummyConnector.ts +49 -49
- package/src/Core/HookService.ts +105 -105
- package/src/Core/SmythRuntime.class.ts +235 -235
- package/src/Core/SystemEvents.ts +16 -16
- package/src/Core/boot.ts +56 -56
- package/src/config.ts +15 -15
- package/src/constants.ts +126 -126
- package/src/data/hugging-face.params.json +579 -579
- package/src/helpers/AWSLambdaCode.helper.ts +587 -587
- package/src/helpers/BinaryInput.helper.ts +331 -331
- package/src/helpers/Conversation.helper.ts +1119 -1119
- package/src/helpers/ECMASandbox.helper.ts +54 -54
- package/src/helpers/JsonContent.helper.ts +97 -97
- package/src/helpers/LocalCache.helper.ts +97 -97
- package/src/helpers/Log.helper.ts +274 -274
- package/src/helpers/OpenApiParser.helper.ts +150 -150
- package/src/helpers/S3Cache.helper.ts +147 -147
- package/src/helpers/SmythURI.helper.ts +5 -5
- package/src/helpers/Sysconfig.helper.ts +77 -77
- package/src/helpers/TemplateString.helper.ts +243 -243
- package/src/helpers/TypeChecker.helper.ts +329 -329
- package/src/index.ts +3 -3
- package/src/index.ts.bak +3 -3
- package/src/subsystems/AgentManager/Agent.class.ts +1114 -1114
- package/src/subsystems/AgentManager/Agent.helper.ts +3 -3
- package/src/subsystems/AgentManager/AgentData.service/AgentDataConnector.ts +230 -230
- package/src/subsystems/AgentManager/AgentData.service/connectors/CLIAgentDataConnector.class.ts +66 -66
- package/src/subsystems/AgentManager/AgentData.service/connectors/LocalAgentDataConnector.class.ts +142 -142
- package/src/subsystems/AgentManager/AgentData.service/connectors/NullAgentData.class.ts +39 -39
- package/src/subsystems/AgentManager/AgentData.service/index.ts +18 -18
- package/src/subsystems/AgentManager/AgentLogger.class.ts +297 -297
- package/src/subsystems/AgentManager/AgentRequest.class.ts +51 -51
- package/src/subsystems/AgentManager/AgentRuntime.class.ts +559 -559
- package/src/subsystems/AgentManager/AgentSSE.class.ts +101 -101
- package/src/subsystems/AgentManager/AgentSettings.class.ts +52 -52
- package/src/subsystems/AgentManager/Component.service/ComponentConnector.ts +32 -32
- package/src/subsystems/AgentManager/Component.service/connectors/LocalComponentConnector.class.ts +60 -60
- package/src/subsystems/AgentManager/Component.service/index.ts +11 -11
- package/src/subsystems/AgentManager/EmbodimentSettings.class.ts +47 -47
- package/src/subsystems/AgentManager/ForkedAgent.class.ts +154 -154
- package/src/subsystems/AgentManager/OSResourceMonitor.ts +77 -77
- package/src/subsystems/ComputeManager/Code.service/CodeConnector.ts +98 -98
- package/src/subsystems/ComputeManager/Code.service/connectors/AWSLambdaCode.class.ts +172 -172
- package/src/subsystems/ComputeManager/Code.service/connectors/ECMASandbox.class.ts +131 -131
- package/src/subsystems/ComputeManager/Code.service/index.ts +13 -13
- package/src/subsystems/IO/CLI.service/CLIConnector.ts +47 -47
- package/src/subsystems/IO/CLI.service/index.ts +9 -9
- package/src/subsystems/IO/Log.service/LogConnector.ts +32 -32
- package/src/subsystems/IO/Log.service/connectors/ConsoleLog.class.ts +28 -28
- package/src/subsystems/IO/Log.service/index.ts +13 -13
- package/src/subsystems/IO/NKV.service/NKVConnector.ts +43 -43
- package/src/subsystems/IO/NKV.service/connectors/NKVLocalStorage.class.ts +234 -234
- package/src/subsystems/IO/NKV.service/connectors/NKVRAM.class.ts +204 -204
- package/src/subsystems/IO/NKV.service/connectors/NKVRedis.class.ts +182 -182
- package/src/subsystems/IO/NKV.service/index.ts +14 -14
- package/src/subsystems/IO/Router.service/RouterConnector.ts +21 -21
- package/src/subsystems/IO/Router.service/connectors/ExpressRouter.class.ts +48 -48
- package/src/subsystems/IO/Router.service/connectors/NullRouter.class.ts +40 -40
- package/src/subsystems/IO/Router.service/index.ts +11 -11
- package/src/subsystems/IO/Storage.service/SmythFS.class.ts +489 -489
- package/src/subsystems/IO/Storage.service/StorageConnector.ts +66 -66
- package/src/subsystems/IO/Storage.service/connectors/LocalStorage.class.ts +327 -327
- package/src/subsystems/IO/Storage.service/connectors/S3Storage.class.ts +482 -482
- package/src/subsystems/IO/Storage.service/index.ts +13 -13
- package/src/subsystems/IO/VectorDB.service/VectorDBConnector.ts +108 -108
- package/src/subsystems/IO/VectorDB.service/connectors/MilvusVectorDB.class.ts +454 -454
- package/src/subsystems/IO/VectorDB.service/connectors/PineconeVectorDB.class.ts +384 -384
- package/src/subsystems/IO/VectorDB.service/connectors/RAMVecrtorDB.class.ts +421 -421
- package/src/subsystems/IO/VectorDB.service/embed/BaseEmbedding.ts +107 -107
- package/src/subsystems/IO/VectorDB.service/embed/OpenAIEmbedding.ts +109 -109
- package/src/subsystems/IO/VectorDB.service/embed/index.ts +21 -21
- package/src/subsystems/IO/VectorDB.service/index.ts +14 -14
- package/src/subsystems/LLMManager/LLM.helper.ts +251 -251
- package/src/subsystems/LLMManager/LLM.inference.ts +339 -339
- package/src/subsystems/LLMManager/LLM.service/LLMConnector.ts +489 -489
- package/src/subsystems/LLMManager/LLM.service/LLMCredentials.helper.ts +171 -171
- package/src/subsystems/LLMManager/LLM.service/connectors/Anthropic.class.ts +659 -659
- package/src/subsystems/LLMManager/LLM.service/connectors/Bedrock.class.ts +400 -400
- package/src/subsystems/LLMManager/LLM.service/connectors/Echo.class.ts +77 -77
- package/src/subsystems/LLMManager/LLM.service/connectors/GoogleAI.class.ts +757 -757
- package/src/subsystems/LLMManager/LLM.service/connectors/Groq.class.ts +304 -304
- package/src/subsystems/LLMManager/LLM.service/connectors/Perplexity.class.ts +250 -250
- package/src/subsystems/LLMManager/LLM.service/connectors/VertexAI.class.ts +423 -423
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/OpenAIConnector.class.ts +488 -488
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ChatCompletionsApiInterface.ts +524 -524
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/OpenAIApiInterface.ts +100 -100
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/OpenAIApiInterfaceFactory.ts +81 -81
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ResponsesApiInterface.ts +1145 -1145
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/constants.ts +13 -13
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/index.ts +4 -4
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/utils.ts +11 -11
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/types.ts +32 -32
- package/src/subsystems/LLMManager/LLM.service/connectors/xAI.class.ts +471 -471
- package/src/subsystems/LLMManager/LLM.service/index.ts +44 -44
- package/src/subsystems/LLMManager/ModelsProvider.service/ModelsProviderConnector.ts +300 -300
- package/src/subsystems/LLMManager/ModelsProvider.service/connectors/JSONModelsProvider.class.ts +252 -252
- package/src/subsystems/LLMManager/ModelsProvider.service/index.ts +11 -11
- package/src/subsystems/LLMManager/custom-models.ts +854 -854
- package/src/subsystems/LLMManager/models.ts +2540 -2540
- package/src/subsystems/LLMManager/paramMappings.ts +69 -69
- package/src/subsystems/MemoryManager/Cache.service/CacheConnector.ts +86 -86
- package/src/subsystems/MemoryManager/Cache.service/connectors/LocalStorageCache.class.ts +297 -297
- package/src/subsystems/MemoryManager/Cache.service/connectors/RAMCache.class.ts +201 -201
- package/src/subsystems/MemoryManager/Cache.service/connectors/RedisCache.class.ts +252 -252
- package/src/subsystems/MemoryManager/Cache.service/connectors/S3Cache.class.ts +373 -373
- package/src/subsystems/MemoryManager/Cache.service/index.ts +15 -15
- package/src/subsystems/MemoryManager/LLMCache.ts +72 -72
- package/src/subsystems/MemoryManager/LLMContext.ts +124 -124
- package/src/subsystems/MemoryManager/LLMMemory.service/LLMMemoryConnector.ts +26 -26
- package/src/subsystems/MemoryManager/RuntimeContext.ts +266 -266
- package/src/subsystems/Security/AccessControl/ACL.class.ts +208 -208
- package/src/subsystems/Security/AccessControl/AccessCandidate.class.ts +82 -82
- package/src/subsystems/Security/AccessControl/AccessRequest.class.ts +52 -52
- package/src/subsystems/Security/Account.service/AccountConnector.ts +44 -44
- package/src/subsystems/Security/Account.service/connectors/AWSAccount.class.ts +76 -76
- package/src/subsystems/Security/Account.service/connectors/DummyAccount.class.ts +130 -130
- package/src/subsystems/Security/Account.service/connectors/JSONFileAccount.class.ts +159 -159
- package/src/subsystems/Security/Account.service/index.ts +14 -14
- package/src/subsystems/Security/Credentials.helper.ts +62 -62
- package/src/subsystems/Security/ManagedVault.service/ManagedVaultConnector.ts +38 -38
- package/src/subsystems/Security/ManagedVault.service/connectors/NullManagedVault.class.ts +53 -53
- package/src/subsystems/Security/ManagedVault.service/connectors/SecretManagerManagedVault.ts +154 -154
- package/src/subsystems/Security/ManagedVault.service/index.ts +12 -12
- package/src/subsystems/Security/SecureConnector.class.ts +110 -110
- package/src/subsystems/Security/Vault.service/Vault.helper.ts +30 -30
- package/src/subsystems/Security/Vault.service/VaultConnector.ts +29 -29
- package/src/subsystems/Security/Vault.service/connectors/HashicorpVault.class.ts +46 -46
- package/src/subsystems/Security/Vault.service/connectors/JSONFileVault.class.ts +221 -221
- package/src/subsystems/Security/Vault.service/connectors/NullVault.class.ts +54 -54
- package/src/subsystems/Security/Vault.service/connectors/SecretsManager.class.ts +140 -140
- package/src/subsystems/Security/Vault.service/index.ts +12 -12
- package/src/types/ACL.types.ts +104 -104
- package/src/types/AWS.types.ts +10 -10
- package/src/types/Agent.types.ts +61 -61
- package/src/types/AgentLogger.types.ts +17 -17
- package/src/types/Cache.types.ts +1 -1
- package/src/types/Common.types.ts +2 -2
- package/src/types/LLM.types.ts +496 -496
- package/src/types/Redis.types.ts +8 -8
- package/src/types/SRE.types.ts +64 -64
- package/src/types/Security.types.ts +14 -14
- package/src/types/Storage.types.ts +5 -5
- package/src/types/VectorDB.types.ts +86 -86
- package/src/utils/base64.utils.ts +275 -275
- package/src/utils/cli.utils.ts +68 -68
- package/src/utils/data.utils.ts +322 -322
- package/src/utils/date-time.utils.ts +22 -22
- package/src/utils/general.utils.ts +238 -238
- package/src/utils/index.ts +12 -12
- package/src/utils/lazy-client.ts +261 -261
- package/src/utils/numbers.utils.ts +13 -13
- package/src/utils/oauth.utils.ts +35 -35
- package/src/utils/string.utils.ts +414 -414
- package/src/utils/url.utils.ts +19 -19
- package/src/utils/validation.utils.ts +74 -74
- package/dist/types/subsystems/LLMManager/ModelsProvider.service/connectors/SmythModelsProvider.class.d.ts +0 -39
|
@@ -1,300 +1,300 @@
|
|
|
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
|
-
const modelInfo = await this.getModelInfo(candidate.readRequest, {}, model, hasAPIKey);
|
|
136
|
-
const allowedContextTokens = modelInfo?.tokens;
|
|
137
|
-
const totalTokens = promptTokens + completionTokens;
|
|
138
|
-
|
|
139
|
-
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.`;
|
|
140
|
-
const noAPIKeyExceededMessage = `Input exceeds max tokens limit of ${allowedContextTokens}. Please add your API key and select Personal tagged models to unlock full length.`;
|
|
141
|
-
|
|
142
|
-
if (totalTokens > allowedContextTokens) {
|
|
143
|
-
throw new Error(hasAPIKey ? teamAPIKeyExceededMessage : noAPIKeyExceededMessage);
|
|
144
|
-
}
|
|
145
|
-
},
|
|
146
|
-
};
|
|
147
|
-
ModelsProviderConnector.localCache.set(cacheKey, instance, 10 * 60 * 1000); // cache for 10 minutes
|
|
148
|
-
return instance;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
protected async getModelInfo(
|
|
152
|
-
acRequest: AccessRequest,
|
|
153
|
-
models: TLLMModelsList,
|
|
154
|
-
model: string | TLLMModel | TCustomLLMModel,
|
|
155
|
-
hasAPIKey: boolean = false
|
|
156
|
-
): Promise<TLLMModel> {
|
|
157
|
-
//model can be passed directly, in which case we do not need to look it up in the models list
|
|
158
|
-
|
|
159
|
-
let modelId, alias, aliasModelInfo, modelInfo;
|
|
160
|
-
|
|
161
|
-
if (typeof model === 'object' && model.modelId) {
|
|
162
|
-
//return model;
|
|
163
|
-
modelId = model.modelId;
|
|
164
|
-
alias = model.alias;
|
|
165
|
-
aliasModelInfo = models?.[alias];
|
|
166
|
-
modelInfo = model;
|
|
167
|
-
} else {
|
|
168
|
-
//model can be passed as a string, in which case we need to look it up in the models list
|
|
169
|
-
|
|
170
|
-
modelId = await this.getModelId(acRequest, models, model);
|
|
171
|
-
alias = models?.[model as string]?.alias;
|
|
172
|
-
aliasModelInfo = models?.[alias];
|
|
173
|
-
modelInfo = models?.[model as string];
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
const aliasKeyOptions = aliasModelInfo && hasAPIKey ? aliasModelInfo?.keyOptions : null;
|
|
177
|
-
|
|
178
|
-
const modelKeyOptions = modelInfo?.keyOptions || aliasKeyOptions;
|
|
179
|
-
|
|
180
|
-
return { ...aliasModelInfo, ...modelInfo, ...aliasKeyOptions, ...modelKeyOptions, modelId };
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
protected async getModelId(acRequest: AccessRequest, models: TLLMModelsList, model: string | TLLMModel | TCustomLLMModel): Promise<string> {
|
|
184
|
-
//model can be passed directly, in which case we do not need to look it up in the models list
|
|
185
|
-
if (typeof model === 'object' && model.modelId) {
|
|
186
|
-
return model.modelId;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
//model can be passed as a string, in which case we need to look it up in the models list
|
|
190
|
-
const modelId = models?.[model as string]?.modelId || (model as string);
|
|
191
|
-
const alias = models?.[model as string]?.alias;
|
|
192
|
-
if (alias) {
|
|
193
|
-
const aliasModelId = models?.[alias]?.modelId || alias || (model as string);
|
|
194
|
-
return aliasModelId;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
return modelId;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// public static async validateTokensLimit({
|
|
201
|
-
// model,
|
|
202
|
-
// promptTokens,
|
|
203
|
-
// completionTokens,
|
|
204
|
-
// hasAPIKey = false,
|
|
205
|
-
// }: {
|
|
206
|
-
// model: string;
|
|
207
|
-
// promptTokens: number;
|
|
208
|
-
// completionTokens: number;
|
|
209
|
-
// hasAPIKey?: boolean;
|
|
210
|
-
// }): Promise<void> {
|
|
211
|
-
|
|
212
|
-
// const allowedContextTokens = this.getMaxContextTokens(model, hasAPIKey);
|
|
213
|
-
// const totalTokens = promptTokens + completionTokens;
|
|
214
|
-
|
|
215
|
-
// 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.`;
|
|
216
|
-
// const noAPIKeyExceededMessage = `Input exceeds max tokens limit of ${allowedContextTokens}. Please add your API key to unlock full length.`;
|
|
217
|
-
|
|
218
|
-
// if (totalTokens > allowedContextTokens) {
|
|
219
|
-
// throw new Error(hasAPIKey ? teamAPIKeyExceededMessage : noAPIKeyExceededMessage);
|
|
220
|
-
// }
|
|
221
|
-
// }
|
|
222
|
-
|
|
223
|
-
protected async getProvider(acRequest: AccessRequest, models: TLLMModelsList, model: string | TLLMModel | TCustomLLMModel): Promise<string> {
|
|
224
|
-
//model can be passed directly, in which case we do not need to look it up in the models list
|
|
225
|
-
if (typeof model === 'object' && model.provider) {
|
|
226
|
-
return model.provider;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
//model can be passed as a string, in which case we need to look it up in the models list
|
|
230
|
-
|
|
231
|
-
const modelId = await this.getModelId(acRequest, models, model);
|
|
232
|
-
|
|
233
|
-
return models?.[modelId]?.provider || models?.[model as string]?.provider || models?.[modelId]?.llm || models?.[model as string]?.llm;
|
|
234
|
-
}
|
|
235
|
-
protected async getCustomModels(candidate: IAccessCandidate): Promise<Record<string, any>> {
|
|
236
|
-
const models = {};
|
|
237
|
-
const settingsKey = 'custom-llm';
|
|
238
|
-
|
|
239
|
-
try {
|
|
240
|
-
const accountConnector = ConnectorService.getAccountConnector();
|
|
241
|
-
const team = await accountConnector.requester(candidate as AccessCandidate).getTeam();
|
|
242
|
-
|
|
243
|
-
const teamSettings = await accountConnector.team(team).getTeamSetting(settingsKey);
|
|
244
|
-
const savedCustomModelsData = JSON.parse(teamSettings || '{}') as Record<string, any>;
|
|
245
|
-
|
|
246
|
-
for (const [entryId, entry] of Object.entries(savedCustomModelsData)) {
|
|
247
|
-
const foundationModel = entry.settings.foundationModel;
|
|
248
|
-
const customModel = entry.settings.customModel;
|
|
249
|
-
const supportsSystemPrompt = customModels[foundationModel]?.supportsSystemPrompt || entry.settings.supportsSystemPrompt;
|
|
250
|
-
const customModelData = customModels[foundationModel] || {};
|
|
251
|
-
|
|
252
|
-
let credentials = null;
|
|
253
|
-
switch (entry.provider) {
|
|
254
|
-
case TLLMProvider.Bedrock:
|
|
255
|
-
credentials = TLLMCredentials.BedrockVault;
|
|
256
|
-
break;
|
|
257
|
-
case TLLMProvider.VertexAI:
|
|
258
|
-
credentials = TLLMCredentials.VertexAIVault;
|
|
259
|
-
break;
|
|
260
|
-
default:
|
|
261
|
-
credentials = TLLMCredentials.Internal;
|
|
262
|
-
break;
|
|
263
|
-
}
|
|
264
|
-
models[entry.name] = {
|
|
265
|
-
label: entry.name,
|
|
266
|
-
modelId: customModel || foundationModel,
|
|
267
|
-
provider: entry.provider,
|
|
268
|
-
features: entry.features?.map((feature) => {
|
|
269
|
-
switch (feature) {
|
|
270
|
-
case 'text-completion':
|
|
271
|
-
return 'text';
|
|
272
|
-
case 'tool-use':
|
|
273
|
-
return 'tools';
|
|
274
|
-
default:
|
|
275
|
-
return feature;
|
|
276
|
-
}
|
|
277
|
-
}),
|
|
278
|
-
tags: Array.isArray(entry?.tags) ? ['Enterprise', ...entry?.tags] : ['Enterprise'],
|
|
279
|
-
tokens: customModelData?.tokens ?? 100000,
|
|
280
|
-
completionTokens: customModelData?.completionTokens ?? 4096,
|
|
281
|
-
enabled: true,
|
|
282
|
-
|
|
283
|
-
id: entryId,
|
|
284
|
-
name: entry.name,
|
|
285
|
-
alias: foundationModel,
|
|
286
|
-
llm: entry.provider,
|
|
287
|
-
components: customModelData?.components ?? [],
|
|
288
|
-
isCustomLLM: true,
|
|
289
|
-
supportsSystemPrompt,
|
|
290
|
-
settings: entry.settings,
|
|
291
|
-
credentials,
|
|
292
|
-
};
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
return models;
|
|
296
|
-
} catch (error) {
|
|
297
|
-
return {};
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
}
|
|
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
|
+
const modelInfo = await this.getModelInfo(candidate.readRequest, {}, model, hasAPIKey);
|
|
136
|
+
const allowedContextTokens = modelInfo?.tokens;
|
|
137
|
+
const totalTokens = promptTokens + completionTokens;
|
|
138
|
+
|
|
139
|
+
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.`;
|
|
140
|
+
const noAPIKeyExceededMessage = `Input exceeds max tokens limit of ${allowedContextTokens}. Please add your API key and select Personal tagged models to unlock full length.`;
|
|
141
|
+
|
|
142
|
+
if (totalTokens > allowedContextTokens) {
|
|
143
|
+
throw new Error(hasAPIKey ? teamAPIKeyExceededMessage : noAPIKeyExceededMessage);
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
ModelsProviderConnector.localCache.set(cacheKey, instance, 10 * 60 * 1000); // cache for 10 minutes
|
|
148
|
+
return instance;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
protected async getModelInfo(
|
|
152
|
+
acRequest: AccessRequest,
|
|
153
|
+
models: TLLMModelsList,
|
|
154
|
+
model: string | TLLMModel | TCustomLLMModel,
|
|
155
|
+
hasAPIKey: boolean = false
|
|
156
|
+
): Promise<TLLMModel> {
|
|
157
|
+
//model can be passed directly, in which case we do not need to look it up in the models list
|
|
158
|
+
|
|
159
|
+
let modelId, alias, aliasModelInfo, modelInfo;
|
|
160
|
+
|
|
161
|
+
if (typeof model === 'object' && model.modelId) {
|
|
162
|
+
//return model;
|
|
163
|
+
modelId = model.modelId;
|
|
164
|
+
alias = model.alias;
|
|
165
|
+
aliasModelInfo = models?.[alias];
|
|
166
|
+
modelInfo = model;
|
|
167
|
+
} else {
|
|
168
|
+
//model can be passed as a string, in which case we need to look it up in the models list
|
|
169
|
+
|
|
170
|
+
modelId = await this.getModelId(acRequest, models, model);
|
|
171
|
+
alias = models?.[model as string]?.alias;
|
|
172
|
+
aliasModelInfo = models?.[alias];
|
|
173
|
+
modelInfo = models?.[model as string];
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const aliasKeyOptions = aliasModelInfo && hasAPIKey ? aliasModelInfo?.keyOptions : null;
|
|
177
|
+
|
|
178
|
+
const modelKeyOptions = modelInfo?.keyOptions || aliasKeyOptions;
|
|
179
|
+
|
|
180
|
+
return { ...aliasModelInfo, ...modelInfo, ...aliasKeyOptions, ...modelKeyOptions, modelId };
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
protected async getModelId(acRequest: AccessRequest, models: TLLMModelsList, model: string | TLLMModel | TCustomLLMModel): Promise<string> {
|
|
184
|
+
//model can be passed directly, in which case we do not need to look it up in the models list
|
|
185
|
+
if (typeof model === 'object' && model.modelId) {
|
|
186
|
+
return model.modelId;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
//model can be passed as a string, in which case we need to look it up in the models list
|
|
190
|
+
const modelId = models?.[model as string]?.modelId || (model as string);
|
|
191
|
+
const alias = models?.[model as string]?.alias;
|
|
192
|
+
if (alias) {
|
|
193
|
+
const aliasModelId = models?.[alias]?.modelId || alias || (model as string);
|
|
194
|
+
return aliasModelId;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return modelId;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// public static async validateTokensLimit({
|
|
201
|
+
// model,
|
|
202
|
+
// promptTokens,
|
|
203
|
+
// completionTokens,
|
|
204
|
+
// hasAPIKey = false,
|
|
205
|
+
// }: {
|
|
206
|
+
// model: string;
|
|
207
|
+
// promptTokens: number;
|
|
208
|
+
// completionTokens: number;
|
|
209
|
+
// hasAPIKey?: boolean;
|
|
210
|
+
// }): Promise<void> {
|
|
211
|
+
|
|
212
|
+
// const allowedContextTokens = this.getMaxContextTokens(model, hasAPIKey);
|
|
213
|
+
// const totalTokens = promptTokens + completionTokens;
|
|
214
|
+
|
|
215
|
+
// 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.`;
|
|
216
|
+
// const noAPIKeyExceededMessage = `Input exceeds max tokens limit of ${allowedContextTokens}. Please add your API key to unlock full length.`;
|
|
217
|
+
|
|
218
|
+
// if (totalTokens > allowedContextTokens) {
|
|
219
|
+
// throw new Error(hasAPIKey ? teamAPIKeyExceededMessage : noAPIKeyExceededMessage);
|
|
220
|
+
// }
|
|
221
|
+
// }
|
|
222
|
+
|
|
223
|
+
protected async getProvider(acRequest: AccessRequest, models: TLLMModelsList, model: string | TLLMModel | TCustomLLMModel): Promise<string> {
|
|
224
|
+
//model can be passed directly, in which case we do not need to look it up in the models list
|
|
225
|
+
if (typeof model === 'object' && model.provider) {
|
|
226
|
+
return model.provider;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
//model can be passed as a string, in which case we need to look it up in the models list
|
|
230
|
+
|
|
231
|
+
const modelId = await this.getModelId(acRequest, models, model);
|
|
232
|
+
|
|
233
|
+
return models?.[modelId]?.provider || models?.[model as string]?.provider || models?.[modelId]?.llm || models?.[model as string]?.llm;
|
|
234
|
+
}
|
|
235
|
+
protected async getCustomModels(candidate: IAccessCandidate): Promise<Record<string, any>> {
|
|
236
|
+
const models = {};
|
|
237
|
+
const settingsKey = 'custom-llm';
|
|
238
|
+
|
|
239
|
+
try {
|
|
240
|
+
const accountConnector = ConnectorService.getAccountConnector();
|
|
241
|
+
const team = await accountConnector.requester(candidate as AccessCandidate).getTeam();
|
|
242
|
+
|
|
243
|
+
const teamSettings = await accountConnector.team(team).getTeamSetting(settingsKey);
|
|
244
|
+
const savedCustomModelsData = JSON.parse(teamSettings || '{}') as Record<string, any>;
|
|
245
|
+
|
|
246
|
+
for (const [entryId, entry] of Object.entries(savedCustomModelsData)) {
|
|
247
|
+
const foundationModel = entry.settings.foundationModel;
|
|
248
|
+
const customModel = entry.settings.customModel;
|
|
249
|
+
const supportsSystemPrompt = customModels[foundationModel]?.supportsSystemPrompt || entry.settings.supportsSystemPrompt;
|
|
250
|
+
const customModelData = customModels[foundationModel] || {};
|
|
251
|
+
|
|
252
|
+
let credentials = null;
|
|
253
|
+
switch (entry.provider) {
|
|
254
|
+
case TLLMProvider.Bedrock:
|
|
255
|
+
credentials = TLLMCredentials.BedrockVault;
|
|
256
|
+
break;
|
|
257
|
+
case TLLMProvider.VertexAI:
|
|
258
|
+
credentials = TLLMCredentials.VertexAIVault;
|
|
259
|
+
break;
|
|
260
|
+
default:
|
|
261
|
+
credentials = TLLMCredentials.Internal;
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
models[entry.name] = {
|
|
265
|
+
label: entry.name,
|
|
266
|
+
modelId: customModel || foundationModel,
|
|
267
|
+
provider: entry.provider,
|
|
268
|
+
features: entry.features?.map((feature) => {
|
|
269
|
+
switch (feature) {
|
|
270
|
+
case 'text-completion':
|
|
271
|
+
return 'text';
|
|
272
|
+
case 'tool-use':
|
|
273
|
+
return 'tools';
|
|
274
|
+
default:
|
|
275
|
+
return feature;
|
|
276
|
+
}
|
|
277
|
+
}),
|
|
278
|
+
tags: Array.isArray(entry?.tags) ? ['Enterprise', ...entry?.tags] : ['Enterprise'],
|
|
279
|
+
tokens: customModelData?.tokens ?? 100000,
|
|
280
|
+
completionTokens: customModelData?.completionTokens ?? 4096,
|
|
281
|
+
enabled: true,
|
|
282
|
+
|
|
283
|
+
id: entryId,
|
|
284
|
+
name: entry.name,
|
|
285
|
+
alias: foundationModel,
|
|
286
|
+
llm: entry.provider,
|
|
287
|
+
components: customModelData?.components ?? [],
|
|
288
|
+
isCustomLLM: true,
|
|
289
|
+
supportsSystemPrompt,
|
|
290
|
+
settings: entry.settings,
|
|
291
|
+
credentials,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return models;
|
|
296
|
+
} catch (error) {
|
|
297
|
+
return {};
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|