@smythos/sre 1.5.45 → 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 +6 -6
- 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/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/constants.d.ts +2 -2
- 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 -528
- 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 -1168
- 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
package/src/subsystems/LLMManager/ModelsProvider.service/connectors/JSONModelsProvider.class.ts
CHANGED
|
@@ -1,252 +1,252 @@
|
|
|
1
|
-
import { AccessRequest } from '@sre/Security/AccessControl/AccessRequest.class';
|
|
2
|
-
import { models } from '@sre/LLMManager/models';
|
|
3
|
-
import { ModelsProviderConnector } from '../ModelsProviderConnector';
|
|
4
|
-
import { IAccessCandidate } from '@sre/types/ACL.types';
|
|
5
|
-
import { TAccessLevel } from '@sre/types/ACL.types';
|
|
6
|
-
import { TAccessRole } from '@sre/types/ACL.types';
|
|
7
|
-
import { ConnectorService } from '@sre/Core/ConnectorsService';
|
|
8
|
-
import { ACL } from '@sre/Security/AccessControl/ACL.class';
|
|
9
|
-
import { SecureConnector } from '@sre/Security/SecureConnector.class';
|
|
10
|
-
import { TLLMModel, TLLMModelsList } from '@sre/types/LLM.types';
|
|
11
|
-
import { Logger } from '@sre/helpers/Log.helper';
|
|
12
|
-
import { debounce } from '@sre/utils/general.utils';
|
|
13
|
-
import chokidar from 'chokidar';
|
|
14
|
-
import fs from 'fs/promises';
|
|
15
|
-
import fsSync from 'fs';
|
|
16
|
-
import path from 'path';
|
|
17
|
-
|
|
18
|
-
const console = Logger('SmythModelsProvider');
|
|
19
|
-
|
|
20
|
-
type SmythModelsProviderConfig = {
|
|
21
|
-
/**
|
|
22
|
-
* The models to be used.
|
|
23
|
-
*
|
|
24
|
-
* If a string is provided, it will be used as the directory name to load the models from.
|
|
25
|
-
* If a TLLMModelsList is provided, it will be used as the models to be used.
|
|
26
|
-
*
|
|
27
|
-
*/
|
|
28
|
-
models?: string | TLLMModelsList;
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* The mode to be used.
|
|
32
|
-
*
|
|
33
|
-
* If 'append' is used, the models will be appended to the existing models.
|
|
34
|
-
* If 'replace' is used, the existing models will be replaced with the new models.
|
|
35
|
-
*/
|
|
36
|
-
mode?: 'merge' | 'replace';
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
export class JSONModelsProvider extends ModelsProviderConnector {
|
|
40
|
-
public name = 'JSONModelsProvider';
|
|
41
|
-
|
|
42
|
-
private models: TLLMModelsList;
|
|
43
|
-
|
|
44
|
-
constructor(protected _settings?: SmythModelsProviderConfig) {
|
|
45
|
-
super(_settings);
|
|
46
|
-
|
|
47
|
-
this.models = JSON.parse(JSON.stringify(models));
|
|
48
|
-
if (typeof this._settings.models === 'string') {
|
|
49
|
-
this.initDirWatcher(this._settings.models);
|
|
50
|
-
} else if (typeof this._settings.models === 'object') {
|
|
51
|
-
if (this._settings.mode === 'merge') this.models = { ...this.models, ...(this._settings.models as TLLMModelsList) };
|
|
52
|
-
else this.models = this._settings.models as TLLMModelsList;
|
|
53
|
-
this.started = true;
|
|
54
|
-
} else {
|
|
55
|
-
this.started = true;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
public async start() {
|
|
59
|
-
super.start();
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
@SecureConnector.AccessControl
|
|
63
|
-
public async addModels(acRequest: AccessRequest, models: TLLMModelsList): Promise<void> {
|
|
64
|
-
await this.ready();
|
|
65
|
-
const validModels = (await this.getValidModels(models)) || {};
|
|
66
|
-
if (Object.keys(validModels).length > 0) {
|
|
67
|
-
this.models = { ...this.models, ...validModels };
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
@SecureConnector.AccessControl
|
|
72
|
-
public async getModels(acRequest: AccessRequest): Promise<any> {
|
|
73
|
-
await this.ready();
|
|
74
|
-
|
|
75
|
-
return this.models;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
public async getResourceACL(resourceId: string, candidate: IAccessCandidate) {
|
|
79
|
-
const accountConnector = ConnectorService.getAccountConnector();
|
|
80
|
-
|
|
81
|
-
const acl = new ACL();
|
|
82
|
-
//give read access to the candidate by default
|
|
83
|
-
acl.addAccess(candidate.role, candidate.id, TAccessLevel.Read);
|
|
84
|
-
|
|
85
|
-
return acl;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
private async reindexModels(dir: string) {
|
|
89
|
-
try {
|
|
90
|
-
console.debug(`Reindexing models from directory: ${dir}`);
|
|
91
|
-
|
|
92
|
-
// Scan directory for models and get them as an object
|
|
93
|
-
const scannedModels = await this.scanDirectoryForModels(dir);
|
|
94
|
-
|
|
95
|
-
// Apply models based on settings mode or default behavior
|
|
96
|
-
if (this._settings?.mode === 'merge') {
|
|
97
|
-
this.models = { ...this.models, ...scannedModels };
|
|
98
|
-
} else {
|
|
99
|
-
// Default behavior: reset to base models first, then add scanned models
|
|
100
|
-
this.models = scannedModels;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
JSONModelsProvider.localCache.clear();
|
|
104
|
-
|
|
105
|
-
console.debug(`Successfully reindexed models. Total models: ${Object.keys(this.models).length}`);
|
|
106
|
-
} catch (error) {
|
|
107
|
-
console.error(`Error reindexing models from directory "${dir}":`, error);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
private async scanDirectoryForModels(dir: string): Promise<TLLMModelsList> {
|
|
112
|
-
const scannedModels: TLLMModelsList = {};
|
|
113
|
-
|
|
114
|
-
try {
|
|
115
|
-
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
116
|
-
|
|
117
|
-
for (const entry of entries) {
|
|
118
|
-
const fullPath = path.join(dir, entry.name);
|
|
119
|
-
|
|
120
|
-
if (entry.isDirectory()) {
|
|
121
|
-
// Recursively scan subdirectories and merge results
|
|
122
|
-
const subDirModels = await this.scanDirectoryForModels(fullPath);
|
|
123
|
-
Object.assign(scannedModels, subDirModels);
|
|
124
|
-
} else if (entry.isFile() && entry.name.endsWith('.json')) {
|
|
125
|
-
// Process JSON files and merge results
|
|
126
|
-
const fileContent = await fs.readFile(fullPath, 'utf-8');
|
|
127
|
-
const modelData = JSON.parse(fileContent);
|
|
128
|
-
const validModels = await this.getValidModels(modelData);
|
|
129
|
-
Object.assign(scannedModels, validModels);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
} catch (error) {
|
|
133
|
-
console.warn(`Error scanning directory "${dir}":`, error);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return scannedModels;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
private async getValidModels(modelData: any): Promise<TLLMModelsList> {
|
|
140
|
-
const validModels: TLLMModelsList = {};
|
|
141
|
-
|
|
142
|
-
try {
|
|
143
|
-
// Check if it's a single model or an object of models
|
|
144
|
-
if (modelData.modelId) {
|
|
145
|
-
// Single model case
|
|
146
|
-
if (this.isValidSingleModel(modelData)) {
|
|
147
|
-
validModels[modelData.modelId] = modelData as TLLMModel;
|
|
148
|
-
console.debug(`Loaded model: ${modelData.modelId}`);
|
|
149
|
-
} else {
|
|
150
|
-
console.warn(`Invalid model format`, modelData);
|
|
151
|
-
}
|
|
152
|
-
} else if (typeof modelData === 'object' && !Array.isArray(modelData)) {
|
|
153
|
-
// Object of models case
|
|
154
|
-
for (const [modelId, model] of Object.entries(modelData)) {
|
|
155
|
-
try {
|
|
156
|
-
if (this.isValidSingleModel(model)) {
|
|
157
|
-
validModels[modelId] = model as TLLMModel;
|
|
158
|
-
console.debug(`Loaded model: ${modelId}`);
|
|
159
|
-
} else {
|
|
160
|
-
console.warn(`Invalid model format for model "${modelId}"`);
|
|
161
|
-
}
|
|
162
|
-
} catch (error) {
|
|
163
|
-
console.warn(`Error processing model "${modelId}":`, error);
|
|
164
|
-
// Continue processing other models instead of failing the whole file
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
} else {
|
|
168
|
-
console.warn(`Invalid format (not a model or object of models)`);
|
|
169
|
-
}
|
|
170
|
-
} catch (error) {
|
|
171
|
-
console.warn(`Error loading model:`, error);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
return validModels;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
private isValidSingleModel(data: any): boolean {
|
|
178
|
-
// Basic validation for single model structure
|
|
179
|
-
return (
|
|
180
|
-
data && typeof data === 'object' && typeof data.modelId === 'string' && (data.provider === undefined || typeof data.provider === 'string')
|
|
181
|
-
);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
private isValidModel(data: any): boolean {
|
|
185
|
-
// Keep for backward compatibility, but delegate to simpler function
|
|
186
|
-
return this.isValidSingleModel(data);
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
private initDirWatcher(dir) {
|
|
190
|
-
// Synchronous file system operations for initial setup
|
|
191
|
-
try {
|
|
192
|
-
const stats = fsSync.statSync(dir);
|
|
193
|
-
|
|
194
|
-
if (!stats.isDirectory()) {
|
|
195
|
-
//is it a file?
|
|
196
|
-
if (stats.isFile()) {
|
|
197
|
-
//load the file
|
|
198
|
-
const fileContent = fsSync.readFileSync(dir, 'utf-8');
|
|
199
|
-
const modelData = JSON.parse(fileContent);
|
|
200
|
-
|
|
201
|
-
if (this._settings?.mode === 'merge') this.models = { ...this.models, ...modelData };
|
|
202
|
-
else this.models = modelData;
|
|
203
|
-
|
|
204
|
-
this.started = true;
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
console.warn(`Path "${dir}" is neither a file nor a directory`);
|
|
209
|
-
return;
|
|
210
|
-
}
|
|
211
|
-
} catch (error) {
|
|
212
|
-
console.warn(`Path "${dir}" does not exist or cannot be accessed:`, error.message);
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
const debouncedReindex = debounce(this.reindexModels.bind(this, dir), 1000, {
|
|
217
|
-
leading: false,
|
|
218
|
-
trailing: true,
|
|
219
|
-
maxWait: 5000,
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
const watcher = chokidar.watch(dir, {
|
|
223
|
-
ignored: /(^|[\/\\])\../, // ignore dotfiles
|
|
224
|
-
persistent: true,
|
|
225
|
-
ignoreInitial: true, // Don't fire events for files that already exist
|
|
226
|
-
awaitWriteFinish: {
|
|
227
|
-
stabilityThreshold: 2000,
|
|
228
|
-
pollInterval: 100,
|
|
229
|
-
},
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
watcher
|
|
233
|
-
.on('add', (path) => {
|
|
234
|
-
console.debug(`File ${path} has been added`);
|
|
235
|
-
debouncedReindex();
|
|
236
|
-
})
|
|
237
|
-
.on('change', (path) => {
|
|
238
|
-
console.debug(`File ${path} has been changed`);
|
|
239
|
-
debouncedReindex();
|
|
240
|
-
})
|
|
241
|
-
.on('unlink', (path) => {
|
|
242
|
-
console.debug(`File ${path} has been removed`);
|
|
243
|
-
debouncedReindex();
|
|
244
|
-
})
|
|
245
|
-
.on('ready', async () => {
|
|
246
|
-
console.debug(`Watcher ready. Performing initial scan of ${dir}`);
|
|
247
|
-
// Do initial scan once when watcher is ready
|
|
248
|
-
await this.reindexModels(dir);
|
|
249
|
-
this.started = true;
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
}
|
|
1
|
+
import { AccessRequest } from '@sre/Security/AccessControl/AccessRequest.class';
|
|
2
|
+
import { models } from '@sre/LLMManager/models';
|
|
3
|
+
import { ModelsProviderConnector } from '../ModelsProviderConnector';
|
|
4
|
+
import { IAccessCandidate } from '@sre/types/ACL.types';
|
|
5
|
+
import { TAccessLevel } from '@sre/types/ACL.types';
|
|
6
|
+
import { TAccessRole } from '@sre/types/ACL.types';
|
|
7
|
+
import { ConnectorService } from '@sre/Core/ConnectorsService';
|
|
8
|
+
import { ACL } from '@sre/Security/AccessControl/ACL.class';
|
|
9
|
+
import { SecureConnector } from '@sre/Security/SecureConnector.class';
|
|
10
|
+
import { TLLMModel, TLLMModelsList } from '@sre/types/LLM.types';
|
|
11
|
+
import { Logger } from '@sre/helpers/Log.helper';
|
|
12
|
+
import { debounce } from '@sre/utils/general.utils';
|
|
13
|
+
import chokidar from 'chokidar';
|
|
14
|
+
import fs from 'fs/promises';
|
|
15
|
+
import fsSync from 'fs';
|
|
16
|
+
import path from 'path';
|
|
17
|
+
|
|
18
|
+
const console = Logger('SmythModelsProvider');
|
|
19
|
+
|
|
20
|
+
type SmythModelsProviderConfig = {
|
|
21
|
+
/**
|
|
22
|
+
* The models to be used.
|
|
23
|
+
*
|
|
24
|
+
* If a string is provided, it will be used as the directory name to load the models from.
|
|
25
|
+
* If a TLLMModelsList is provided, it will be used as the models to be used.
|
|
26
|
+
*
|
|
27
|
+
*/
|
|
28
|
+
models?: string | TLLMModelsList;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The mode to be used.
|
|
32
|
+
*
|
|
33
|
+
* If 'append' is used, the models will be appended to the existing models.
|
|
34
|
+
* If 'replace' is used, the existing models will be replaced with the new models.
|
|
35
|
+
*/
|
|
36
|
+
mode?: 'merge' | 'replace';
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export class JSONModelsProvider extends ModelsProviderConnector {
|
|
40
|
+
public name = 'JSONModelsProvider';
|
|
41
|
+
|
|
42
|
+
private models: TLLMModelsList;
|
|
43
|
+
|
|
44
|
+
constructor(protected _settings?: SmythModelsProviderConfig) {
|
|
45
|
+
super(_settings);
|
|
46
|
+
|
|
47
|
+
this.models = JSON.parse(JSON.stringify(models));
|
|
48
|
+
if (typeof this._settings.models === 'string') {
|
|
49
|
+
this.initDirWatcher(this._settings.models);
|
|
50
|
+
} else if (typeof this._settings.models === 'object') {
|
|
51
|
+
if (this._settings.mode === 'merge') this.models = { ...this.models, ...(this._settings.models as TLLMModelsList) };
|
|
52
|
+
else this.models = this._settings.models as TLLMModelsList;
|
|
53
|
+
this.started = true;
|
|
54
|
+
} else {
|
|
55
|
+
this.started = true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
public async start() {
|
|
59
|
+
super.start();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
@SecureConnector.AccessControl
|
|
63
|
+
public async addModels(acRequest: AccessRequest, models: TLLMModelsList): Promise<void> {
|
|
64
|
+
await this.ready();
|
|
65
|
+
const validModels = (await this.getValidModels(models)) || {};
|
|
66
|
+
if (Object.keys(validModels).length > 0) {
|
|
67
|
+
this.models = { ...this.models, ...validModels };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@SecureConnector.AccessControl
|
|
72
|
+
public async getModels(acRequest: AccessRequest): Promise<any> {
|
|
73
|
+
await this.ready();
|
|
74
|
+
|
|
75
|
+
return this.models;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
public async getResourceACL(resourceId: string, candidate: IAccessCandidate) {
|
|
79
|
+
const accountConnector = ConnectorService.getAccountConnector();
|
|
80
|
+
|
|
81
|
+
const acl = new ACL();
|
|
82
|
+
//give read access to the candidate by default
|
|
83
|
+
acl.addAccess(candidate.role, candidate.id, TAccessLevel.Read);
|
|
84
|
+
|
|
85
|
+
return acl;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
private async reindexModels(dir: string) {
|
|
89
|
+
try {
|
|
90
|
+
console.debug(`Reindexing models from directory: ${dir}`);
|
|
91
|
+
|
|
92
|
+
// Scan directory for models and get them as an object
|
|
93
|
+
const scannedModels = await this.scanDirectoryForModels(dir);
|
|
94
|
+
|
|
95
|
+
// Apply models based on settings mode or default behavior
|
|
96
|
+
if (this._settings?.mode === 'merge') {
|
|
97
|
+
this.models = { ...this.models, ...scannedModels };
|
|
98
|
+
} else {
|
|
99
|
+
// Default behavior: reset to base models first, then add scanned models
|
|
100
|
+
this.models = scannedModels;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
JSONModelsProvider.localCache.clear();
|
|
104
|
+
|
|
105
|
+
console.debug(`Successfully reindexed models. Total models: ${Object.keys(this.models).length}`);
|
|
106
|
+
} catch (error) {
|
|
107
|
+
console.error(`Error reindexing models from directory "${dir}":`, error);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
private async scanDirectoryForModels(dir: string): Promise<TLLMModelsList> {
|
|
112
|
+
const scannedModels: TLLMModelsList = {};
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
116
|
+
|
|
117
|
+
for (const entry of entries) {
|
|
118
|
+
const fullPath = path.join(dir, entry.name);
|
|
119
|
+
|
|
120
|
+
if (entry.isDirectory()) {
|
|
121
|
+
// Recursively scan subdirectories and merge results
|
|
122
|
+
const subDirModels = await this.scanDirectoryForModels(fullPath);
|
|
123
|
+
Object.assign(scannedModels, subDirModels);
|
|
124
|
+
} else if (entry.isFile() && entry.name.endsWith('.json')) {
|
|
125
|
+
// Process JSON files and merge results
|
|
126
|
+
const fileContent = await fs.readFile(fullPath, 'utf-8');
|
|
127
|
+
const modelData = JSON.parse(fileContent);
|
|
128
|
+
const validModels = await this.getValidModels(modelData);
|
|
129
|
+
Object.assign(scannedModels, validModels);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
} catch (error) {
|
|
133
|
+
console.warn(`Error scanning directory "${dir}":`, error);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return scannedModels;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
private async getValidModels(modelData: any): Promise<TLLMModelsList> {
|
|
140
|
+
const validModels: TLLMModelsList = {};
|
|
141
|
+
|
|
142
|
+
try {
|
|
143
|
+
// Check if it's a single model or an object of models
|
|
144
|
+
if (modelData.modelId) {
|
|
145
|
+
// Single model case
|
|
146
|
+
if (this.isValidSingleModel(modelData)) {
|
|
147
|
+
validModels[modelData.modelId] = modelData as TLLMModel;
|
|
148
|
+
console.debug(`Loaded model: ${modelData.modelId}`);
|
|
149
|
+
} else {
|
|
150
|
+
console.warn(`Invalid model format`, modelData);
|
|
151
|
+
}
|
|
152
|
+
} else if (typeof modelData === 'object' && !Array.isArray(modelData)) {
|
|
153
|
+
// Object of models case
|
|
154
|
+
for (const [modelId, model] of Object.entries(modelData)) {
|
|
155
|
+
try {
|
|
156
|
+
if (this.isValidSingleModel(model)) {
|
|
157
|
+
validModels[modelId] = model as TLLMModel;
|
|
158
|
+
console.debug(`Loaded model: ${modelId}`);
|
|
159
|
+
} else {
|
|
160
|
+
console.warn(`Invalid model format for model "${modelId}"`);
|
|
161
|
+
}
|
|
162
|
+
} catch (error) {
|
|
163
|
+
console.warn(`Error processing model "${modelId}":`, error);
|
|
164
|
+
// Continue processing other models instead of failing the whole file
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
} else {
|
|
168
|
+
console.warn(`Invalid format (not a model or object of models)`);
|
|
169
|
+
}
|
|
170
|
+
} catch (error) {
|
|
171
|
+
console.warn(`Error loading model:`, error);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return validModels;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
private isValidSingleModel(data: any): boolean {
|
|
178
|
+
// Basic validation for single model structure
|
|
179
|
+
return (
|
|
180
|
+
data && typeof data === 'object' && typeof data.modelId === 'string' && (data.provider === undefined || typeof data.provider === 'string')
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
private isValidModel(data: any): boolean {
|
|
185
|
+
// Keep for backward compatibility, but delegate to simpler function
|
|
186
|
+
return this.isValidSingleModel(data);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
private initDirWatcher(dir) {
|
|
190
|
+
// Synchronous file system operations for initial setup
|
|
191
|
+
try {
|
|
192
|
+
const stats = fsSync.statSync(dir);
|
|
193
|
+
|
|
194
|
+
if (!stats.isDirectory()) {
|
|
195
|
+
//is it a file?
|
|
196
|
+
if (stats.isFile()) {
|
|
197
|
+
//load the file
|
|
198
|
+
const fileContent = fsSync.readFileSync(dir, 'utf-8');
|
|
199
|
+
const modelData = JSON.parse(fileContent);
|
|
200
|
+
|
|
201
|
+
if (this._settings?.mode === 'merge') this.models = { ...this.models, ...modelData };
|
|
202
|
+
else this.models = modelData;
|
|
203
|
+
|
|
204
|
+
this.started = true;
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
console.warn(`Path "${dir}" is neither a file nor a directory`);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
} catch (error) {
|
|
212
|
+
console.warn(`Path "${dir}" does not exist or cannot be accessed:`, error.message);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const debouncedReindex = debounce(this.reindexModels.bind(this, dir), 1000, {
|
|
217
|
+
leading: false,
|
|
218
|
+
trailing: true,
|
|
219
|
+
maxWait: 5000,
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
const watcher = chokidar.watch(dir, {
|
|
223
|
+
ignored: /(^|[\/\\])\../, // ignore dotfiles
|
|
224
|
+
persistent: true,
|
|
225
|
+
ignoreInitial: true, // Don't fire events for files that already exist
|
|
226
|
+
awaitWriteFinish: {
|
|
227
|
+
stabilityThreshold: 2000,
|
|
228
|
+
pollInterval: 100,
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
watcher
|
|
233
|
+
.on('add', (path) => {
|
|
234
|
+
console.debug(`File ${path} has been added`);
|
|
235
|
+
debouncedReindex();
|
|
236
|
+
})
|
|
237
|
+
.on('change', (path) => {
|
|
238
|
+
console.debug(`File ${path} has been changed`);
|
|
239
|
+
debouncedReindex();
|
|
240
|
+
})
|
|
241
|
+
.on('unlink', (path) => {
|
|
242
|
+
console.debug(`File ${path} has been removed`);
|
|
243
|
+
debouncedReindex();
|
|
244
|
+
})
|
|
245
|
+
.on('ready', async () => {
|
|
246
|
+
console.debug(`Watcher ready. Performing initial scan of ${dir}`);
|
|
247
|
+
// Do initial scan once when watcher is ready
|
|
248
|
+
await this.reindexModels(dir);
|
|
249
|
+
this.started = true;
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
//==[ SRE: ModelsProvider ]======================
|
|
2
|
-
|
|
3
|
-
import { ConnectorService, ConnectorServiceProvider } from '@sre/Core/ConnectorsService';
|
|
4
|
-
import { TConnectorService } from '@sre/types/SRE.types';
|
|
5
|
-
import { JSONModelsProvider } from './connectors/JSONModelsProvider.class';
|
|
6
|
-
|
|
7
|
-
export class ModelsProviderService extends ConnectorServiceProvider {
|
|
8
|
-
public register() {
|
|
9
|
-
ConnectorService.register(TConnectorService.ModelsProvider, 'JSONModelsProvider', JSONModelsProvider);
|
|
10
|
-
}
|
|
11
|
-
}
|
|
1
|
+
//==[ SRE: ModelsProvider ]======================
|
|
2
|
+
|
|
3
|
+
import { ConnectorService, ConnectorServiceProvider } from '@sre/Core/ConnectorsService';
|
|
4
|
+
import { TConnectorService } from '@sre/types/SRE.types';
|
|
5
|
+
import { JSONModelsProvider } from './connectors/JSONModelsProvider.class';
|
|
6
|
+
|
|
7
|
+
export class ModelsProviderService extends ConnectorServiceProvider {
|
|
8
|
+
public register() {
|
|
9
|
+
ConnectorService.register(TConnectorService.ModelsProvider, 'JSONModelsProvider', JSONModelsProvider);
|
|
10
|
+
}
|
|
11
|
+
}
|