@smythos/sre 1.6.8 → 1.6.10
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 +111 -111
- 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 +2 -2
- package/dist/index.js.map +1 -1
- package/dist/types/Components/Triggers/Gmail.trigger.d.ts +58 -0
- package/dist/types/Components/Triggers/GmailTrigger.class.d.ts +44 -0
- package/dist/types/Components/Triggers/Trigger.class.d.ts +21 -0
- package/dist/types/Components/Triggers/WhatsApp.trigger.d.ts +22 -0
- package/dist/types/helpers/AIPerformanceAnalyzer.helper.d.ts +45 -0
- package/dist/types/helpers/AIPerformanceCollector.helper.d.ts +111 -0
- package/dist/types/subsystems/IO/Storage.service/connectors/AzureBlobStorage.class.d.ts +211 -0
- package/dist/types/subsystems/IO/VectorDB.service/connectors/WeaviateVectorDB.class.d.ts +187 -0
- package/dist/types/subsystems/PerformanceManager/Performance.service/PerformanceConnector.d.ts +102 -0
- package/dist/types/subsystems/PerformanceManager/Performance.service/connectors/LocalPerformanceConnector.class.d.ts +100 -0
- package/dist/types/subsystems/PerformanceManager/Performance.service/index.d.ts +22 -0
- package/dist/types/subsystems/Security/Credentials/Credentials.class.d.ts +2 -0
- package/dist/types/subsystems/Security/Credentials/ManagedOAuth2Credentials.class.d.ts +18 -0
- package/dist/types/subsystems/Security/Credentials/OAuth2Credentials.class.d.ts +14 -0
- package/dist/types/types/Performance.types.d.ts +468 -0
- package/dist/types/utils/package-manager.utils.d.ts +26 -0
- package/package.json +1 -1
- package/src/Components/APICall/APICall.class.ts +161 -161
- package/src/Components/APICall/AccessTokenManager.ts +166 -166
- package/src/Components/APICall/ArrayBufferResponse.helper.ts +58 -58
- package/src/Components/APICall/OAuth.helper.ts +447 -447
- 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 +147 -147
- 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 +72 -72
- 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 +66 -66
- 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 +313 -313
- package/src/Components/Image/imageSettings.config.ts +70 -70
- package/src/Components/ImageGenerator.class.ts +483 -483
- 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 +137 -137
- package/src/Components/MemoryDeleteKeyVal.class.ts +70 -70
- package/src/Components/MemoryReadKeyVal.class.ts +67 -67
- 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 +183 -183
- package/src/Components/ServerlessCode.class.ts +123 -123
- package/src/Components/TavilyWebSearch.class.ts +103 -103
- 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 +241 -241
- 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 +624 -624
- package/src/helpers/BinaryInput.helper.ts +331 -331
- package/src/helpers/Conversation.helper.ts +1157 -1157
- package/src/helpers/ECMASandbox.helper.ts +64 -64
- 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 +95 -95
- 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 +145 -145
- 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 +301 -301
- package/src/subsystems/AgentManager/AgentRequest.class.ts +51 -51
- package/src/subsystems/AgentManager/AgentRuntime.class.ts +557 -557
- 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 +171 -171
- 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 +488 -488
- 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 +465 -465
- package/src/subsystems/IO/VectorDB.service/connectors/PineconeVectorDB.class.ts +387 -387
- package/src/subsystems/IO/VectorDB.service/connectors/RAMVecrtorDB.class.ts +408 -408
- package/src/subsystems/IO/VectorDB.service/embed/BaseEmbedding.ts +107 -107
- package/src/subsystems/IO/VectorDB.service/embed/GoogleEmbedding.ts +118 -118
- package/src/subsystems/IO/VectorDB.service/embed/OpenAIEmbedding.ts +109 -109
- package/src/subsystems/IO/VectorDB.service/embed/index.ts +26 -26
- 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 +345 -345
- package/src/subsystems/LLMManager/LLM.service/LLMConnector.ts +492 -492
- package/src/subsystems/LLMManager/LLM.service/LLMCredentials.helper.ts +171 -171
- package/src/subsystems/LLMManager/LLM.service/connectors/Anthropic.class.ts +666 -666
- package/src/subsystems/LLMManager/LLM.service/connectors/Bedrock.class.ts +407 -407
- package/src/subsystems/LLMManager/LLM.service/connectors/Echo.class.ts +92 -92
- package/src/subsystems/LLMManager/LLM.service/connectors/GoogleAI.class.ts +983 -983
- package/src/subsystems/LLMManager/LLM.service/connectors/Groq.class.ts +319 -319
- package/src/subsystems/LLMManager/LLM.service/connectors/Ollama.class.ts +361 -361
- package/src/subsystems/LLMManager/LLM.service/connectors/Perplexity.class.ts +257 -257
- package/src/subsystems/LLMManager/LLM.service/connectors/VertexAI.class.ts +430 -430
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/OpenAIConnector.class.ts +503 -503
- 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 +478 -478
- package/src/subsystems/LLMManager/LLM.service/index.ts +47 -47
- package/src/subsystems/LLMManager/ModelsProvider.service/ModelsProviderConnector.ts +303 -303
- package/src/subsystems/LLMManager/ModelsProvider.service/connectors/JSONModelsProvider.class.ts +280 -271
- 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 +214 -214
- 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 +277 -277
- 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/DummyAccount.class.ts +130 -130
- package/src/subsystems/Security/Account.service/connectors/JSONFileAccount.class.ts +170 -170
- package/src/subsystems/Security/Account.service/connectors/MySQLAccount.class.ts +76 -76
- 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 +520 -520
- 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,107 +1,107 @@
|
|
|
1
|
-
import { IVectorDataSourceDto, Source } from '@sre/types/VectorDB.types';
|
|
2
|
-
import { isUrl } from '@sre/utils/index';
|
|
3
|
-
import { SupportedProviders, SupportedModels } from './index';
|
|
4
|
-
import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
|
|
5
|
-
|
|
6
|
-
export type TEmbeddings = {
|
|
7
|
-
provider: SupportedProviders;
|
|
8
|
-
model: SupportedModels[SupportedProviders];
|
|
9
|
-
|
|
10
|
-
credentials?: {
|
|
11
|
-
apiKey: string;
|
|
12
|
-
};
|
|
13
|
-
params?: {
|
|
14
|
-
dimensions?: number;
|
|
15
|
-
timeout?: number;
|
|
16
|
-
chunkSize?: number;
|
|
17
|
-
stripNewLines?: boolean;
|
|
18
|
-
};
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
type SupportedSources = 'text' | 'vector' | 'url';
|
|
22
|
-
|
|
23
|
-
export abstract class BaseEmbedding {
|
|
24
|
-
model: string;
|
|
25
|
-
modelName: string;
|
|
26
|
-
chunkSize = 512;
|
|
27
|
-
stripNewLines = true;
|
|
28
|
-
dimensions?: number;
|
|
29
|
-
timeout?: number;
|
|
30
|
-
|
|
31
|
-
constructor(fields?: Partial<TEmbeddings>) {
|
|
32
|
-
this.model = fields?.model ?? this.model;
|
|
33
|
-
this.chunkSize = fields?.params?.chunkSize ?? this.chunkSize;
|
|
34
|
-
this.stripNewLines = fields?.params?.stripNewLines ?? this.stripNewLines;
|
|
35
|
-
this.timeout = fields?.params?.timeout;
|
|
36
|
-
this.dimensions = fields?.params?.dimensions;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Embed multiple texts and return their vector representations
|
|
41
|
-
*/
|
|
42
|
-
abstract embedTexts(texts: string[], candidate: AccessCandidate): Promise<number[][]>;
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Embed a single text and return its vector representation
|
|
46
|
-
*/
|
|
47
|
-
abstract embedText(text: string, candidate: AccessCandidate): Promise<number[]>;
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Utility method to chunk arrays into smaller batches
|
|
51
|
-
*/
|
|
52
|
-
protected chunkArr<T>(arr: T[], sizePerChunk: number): T[][] {
|
|
53
|
-
return arr.reduce((chunks, elem, index) => {
|
|
54
|
-
const chunkIndex = Math.floor(index / sizePerChunk);
|
|
55
|
-
const chunk = chunks[chunkIndex] || [];
|
|
56
|
-
chunks[chunkIndex] = chunk.concat([elem]);
|
|
57
|
-
return chunks;
|
|
58
|
-
}, [] as T[][]);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Utility method to process multiple texts based on stripNewLines setting
|
|
63
|
-
*/
|
|
64
|
-
protected processTexts(texts: string[]): string[] {
|
|
65
|
-
return this.stripNewLines ? texts.map((t) => t.replace(/\n/g, ' ')) : texts;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
public detectSourceType(source: Source): SupportedSources | 'unknown' {
|
|
69
|
-
if (typeof source === 'string') {
|
|
70
|
-
return isUrl(source) ? 'url' : 'text';
|
|
71
|
-
} else if (Array.isArray(source) && source.every((v) => typeof v === 'number')) {
|
|
72
|
-
return 'vector';
|
|
73
|
-
} else {
|
|
74
|
-
return 'unknown';
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
public transformSource(source: IVectorDataSourceDto[], sourceType: SupportedSources, candidate: AccessCandidate) {
|
|
79
|
-
//* as the accepted sources increases, you will need to implement the strategy pattern instead of a switch case
|
|
80
|
-
switch (sourceType) {
|
|
81
|
-
case 'text': {
|
|
82
|
-
const texts = source.map((s) => s.source as string);
|
|
83
|
-
|
|
84
|
-
return this.embedTexts(texts, candidate).then((vectors) => {
|
|
85
|
-
return source.map((s, i) => ({
|
|
86
|
-
...s,
|
|
87
|
-
source: vectors[i],
|
|
88
|
-
metadata: { ...s.metadata, text: texts[i] },
|
|
89
|
-
}));
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
case 'vector': {
|
|
93
|
-
return source;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// this is a dummy vector used to maximize search distance
|
|
99
|
-
// we use it to create reserved vectors that store namespace data
|
|
100
|
-
public get dummyVector(): number[] {
|
|
101
|
-
//This is good for cosine similarity, but not for euclidean distance
|
|
102
|
-
//TODO: detect current similarity metric and use the appropriate vector (e.g for euclidean distance, use a vector with all large values like [1e6, 1e6, ..., 1e6])
|
|
103
|
-
return Array(this.dimensions - 1)
|
|
104
|
-
.fill(0)
|
|
105
|
-
.concat([1]);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
1
|
+
import { IVectorDataSourceDto, Source } from '@sre/types/VectorDB.types';
|
|
2
|
+
import { isUrl } from '@sre/utils/index';
|
|
3
|
+
import { SupportedProviders, SupportedModels } from './index';
|
|
4
|
+
import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
|
|
5
|
+
|
|
6
|
+
export type TEmbeddings = {
|
|
7
|
+
provider: SupportedProviders;
|
|
8
|
+
model: SupportedModels[SupportedProviders];
|
|
9
|
+
|
|
10
|
+
credentials?: {
|
|
11
|
+
apiKey: string;
|
|
12
|
+
};
|
|
13
|
+
params?: {
|
|
14
|
+
dimensions?: number;
|
|
15
|
+
timeout?: number;
|
|
16
|
+
chunkSize?: number;
|
|
17
|
+
stripNewLines?: boolean;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
type SupportedSources = 'text' | 'vector' | 'url';
|
|
22
|
+
|
|
23
|
+
export abstract class BaseEmbedding {
|
|
24
|
+
model: string;
|
|
25
|
+
modelName: string;
|
|
26
|
+
chunkSize = 512;
|
|
27
|
+
stripNewLines = true;
|
|
28
|
+
dimensions?: number;
|
|
29
|
+
timeout?: number;
|
|
30
|
+
|
|
31
|
+
constructor(fields?: Partial<TEmbeddings>) {
|
|
32
|
+
this.model = fields?.model ?? this.model;
|
|
33
|
+
this.chunkSize = fields?.params?.chunkSize ?? this.chunkSize;
|
|
34
|
+
this.stripNewLines = fields?.params?.stripNewLines ?? this.stripNewLines;
|
|
35
|
+
this.timeout = fields?.params?.timeout;
|
|
36
|
+
this.dimensions = fields?.params?.dimensions;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Embed multiple texts and return their vector representations
|
|
41
|
+
*/
|
|
42
|
+
abstract embedTexts(texts: string[], candidate: AccessCandidate): Promise<number[][]>;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Embed a single text and return its vector representation
|
|
46
|
+
*/
|
|
47
|
+
abstract embedText(text: string, candidate: AccessCandidate): Promise<number[]>;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Utility method to chunk arrays into smaller batches
|
|
51
|
+
*/
|
|
52
|
+
protected chunkArr<T>(arr: T[], sizePerChunk: number): T[][] {
|
|
53
|
+
return arr.reduce((chunks, elem, index) => {
|
|
54
|
+
const chunkIndex = Math.floor(index / sizePerChunk);
|
|
55
|
+
const chunk = chunks[chunkIndex] || [];
|
|
56
|
+
chunks[chunkIndex] = chunk.concat([elem]);
|
|
57
|
+
return chunks;
|
|
58
|
+
}, [] as T[][]);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Utility method to process multiple texts based on stripNewLines setting
|
|
63
|
+
*/
|
|
64
|
+
protected processTexts(texts: string[]): string[] {
|
|
65
|
+
return this.stripNewLines ? texts.map((t) => t.replace(/\n/g, ' ')) : texts;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public detectSourceType(source: Source): SupportedSources | 'unknown' {
|
|
69
|
+
if (typeof source === 'string') {
|
|
70
|
+
return isUrl(source) ? 'url' : 'text';
|
|
71
|
+
} else if (Array.isArray(source) && source.every((v) => typeof v === 'number')) {
|
|
72
|
+
return 'vector';
|
|
73
|
+
} else {
|
|
74
|
+
return 'unknown';
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
public transformSource(source: IVectorDataSourceDto[], sourceType: SupportedSources, candidate: AccessCandidate) {
|
|
79
|
+
//* as the accepted sources increases, you will need to implement the strategy pattern instead of a switch case
|
|
80
|
+
switch (sourceType) {
|
|
81
|
+
case 'text': {
|
|
82
|
+
const texts = source.map((s) => s.source as string);
|
|
83
|
+
|
|
84
|
+
return this.embedTexts(texts, candidate).then((vectors) => {
|
|
85
|
+
return source.map((s, i) => ({
|
|
86
|
+
...s,
|
|
87
|
+
source: vectors[i],
|
|
88
|
+
metadata: { ...s.metadata, text: texts[i] },
|
|
89
|
+
}));
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
case 'vector': {
|
|
93
|
+
return source;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// this is a dummy vector used to maximize search distance
|
|
99
|
+
// we use it to create reserved vectors that store namespace data
|
|
100
|
+
public get dummyVector(): number[] {
|
|
101
|
+
//This is good for cosine similarity, but not for euclidean distance
|
|
102
|
+
//TODO: detect current similarity metric and use the appropriate vector (e.g for euclidean distance, use a vector with all large values like [1e6, 1e6, ..., 1e6])
|
|
103
|
+
return Array(this.dimensions - 1)
|
|
104
|
+
.fill(0)
|
|
105
|
+
.concat([1]);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -1,118 +1,118 @@
|
|
|
1
|
-
import { GoogleGenAI } from '@google/genai';
|
|
2
|
-
import { BaseEmbedding, TEmbeddings } from './BaseEmbedding';
|
|
3
|
-
import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
|
|
4
|
-
import { getLLMCredentials } from '@sre/LLMManager/LLM.service/LLMCredentials.helper';
|
|
5
|
-
import { TLLMCredentials, TLLMModel, BasicCredentials } from '@sre/types/LLM.types';
|
|
6
|
-
|
|
7
|
-
const DEFAULT_MODEL = 'gemini-embedding-001';
|
|
8
|
-
|
|
9
|
-
export class GoogleEmbeds extends BaseEmbedding {
|
|
10
|
-
protected client: GoogleGenAI;
|
|
11
|
-
|
|
12
|
-
// Keep in sync with Gemini API supported embedding models
|
|
13
|
-
public static models = ['gemini-embedding-001', 'text-embedding-005', 'text-multilingual-embedding-002'];
|
|
14
|
-
public canSpecifyDimensions = true;
|
|
15
|
-
|
|
16
|
-
constructor(private settings?: Partial<TEmbeddings>) {
|
|
17
|
-
super({ model: settings?.model ?? DEFAULT_MODEL, ...settings });
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
async embedTexts(texts: string[], candidate: AccessCandidate): Promise<number[][]> {
|
|
21
|
-
const batches = this.chunkArr(this.processTexts(texts), this.chunkSize);
|
|
22
|
-
|
|
23
|
-
const batchRequests = batches.map((batch) => {
|
|
24
|
-
return this.embed(batch, candidate);
|
|
25
|
-
});
|
|
26
|
-
const batchResponses = await Promise.all(batchRequests);
|
|
27
|
-
|
|
28
|
-
const embeddings: number[][] = [];
|
|
29
|
-
for (let i = 0; i < batchResponses.length; i += 1) {
|
|
30
|
-
const batch = batches[i];
|
|
31
|
-
const batchResponse = batchResponses[i];
|
|
32
|
-
for (let j = 0; j < batch.length; j += 1) {
|
|
33
|
-
embeddings.push(batchResponse[j]);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return embeddings;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
async embedText(text: string, candidate: AccessCandidate): Promise<number[]> {
|
|
40
|
-
const processedText = this.processTexts([text])[0];
|
|
41
|
-
const embeddings = await this.embed([processedText], candidate);
|
|
42
|
-
return embeddings[0];
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
protected async embed(texts: string[], candidate: AccessCandidate): Promise<number[][]> {
|
|
46
|
-
let apiKey: string | undefined;
|
|
47
|
-
|
|
48
|
-
// Try to get from credentials first
|
|
49
|
-
try {
|
|
50
|
-
const modelInfo: TLLMModel = {
|
|
51
|
-
provider: 'GoogleAI',
|
|
52
|
-
modelId: this.model,
|
|
53
|
-
credentials: (this.settings?.credentials as unknown as TLLMCredentials) || [TLLMCredentials.Internal, TLLMCredentials.Vault],
|
|
54
|
-
};
|
|
55
|
-
const credentials = await getLLMCredentials(candidate, modelInfo);
|
|
56
|
-
apiKey = (credentials as BasicCredentials)?.apiKey;
|
|
57
|
-
} catch (e) {
|
|
58
|
-
// If credential system fails, fall back to environment variable
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Fall back to environment variable if not found in credentials
|
|
62
|
-
if (!apiKey) {
|
|
63
|
-
apiKey = process.env.GOOGLE_AI_API_KEY;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (!apiKey) {
|
|
67
|
-
throw new Error('Please provide an API key for Google AI embeddings via credentials or GOOGLE_AI_API_KEY environment variable');
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
if (!this.client) {
|
|
71
|
-
this.client = new GoogleGenAI({ apiKey });
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
try {
|
|
75
|
-
const outputDimensionality = this.dimensions && Number.isFinite(this.dimensions) ? this.dimensions : undefined;
|
|
76
|
-
|
|
77
|
-
// Batch request using the new SDK
|
|
78
|
-
const res = await this.client.models.embedContent({
|
|
79
|
-
model: this.model,
|
|
80
|
-
contents: texts,
|
|
81
|
-
...(outputDimensionality ? { outputDimensionality } : {}),
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
// The SDK can return either { embedding } for single or { embeddings } for batch
|
|
85
|
-
const vectors: number[][] = Array.isArray((res as any).embeddings)
|
|
86
|
-
? (res as any).embeddings.map((e: any) => e.values as number[])
|
|
87
|
-
: [((res as any).embedding?.values as number[]) || []];
|
|
88
|
-
|
|
89
|
-
// Enforce dimensions and normalization when requested or when non-3072
|
|
90
|
-
const targetDim = outputDimensionality;
|
|
91
|
-
const processed = vectors.map((v) => this.postProcessEmbedding(v, targetDim));
|
|
92
|
-
|
|
93
|
-
return processed;
|
|
94
|
-
} catch (e) {
|
|
95
|
-
throw new Error(`Google Embeddings API error: ${e.message || e}`);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
private postProcessEmbedding(values: number[], targetDim?: number): number[] {
|
|
100
|
-
let v = Array.isArray(values) ? values.slice() : [];
|
|
101
|
-
if (targetDim && targetDim > 0) {
|
|
102
|
-
if (v.length > targetDim) {
|
|
103
|
-
// SDK ignored smaller dimension: truncate
|
|
104
|
-
v = v.slice(0, targetDim);
|
|
105
|
-
} else if (v.length < targetDim) {
|
|
106
|
-
// SDK returned shorter vector: pad with zeros
|
|
107
|
-
v = v.concat(Array(targetDim - v.length).fill(0));
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
// Normalize for non-default 3072 dims (recommended by Google docs)
|
|
111
|
-
const needNormalize = (targetDim && targetDim !== 3072) || (!targetDim && v.length !== 3072);
|
|
112
|
-
if (needNormalize && v.length > 0) {
|
|
113
|
-
const norm = Math.sqrt(v.reduce((acc, x) => acc + x * x, 0));
|
|
114
|
-
if (norm > 0) v = v.map((x) => x / norm);
|
|
115
|
-
}
|
|
116
|
-
return v;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
1
|
+
import { GoogleGenAI } from '@google/genai';
|
|
2
|
+
import { BaseEmbedding, TEmbeddings } from './BaseEmbedding';
|
|
3
|
+
import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
|
|
4
|
+
import { getLLMCredentials } from '@sre/LLMManager/LLM.service/LLMCredentials.helper';
|
|
5
|
+
import { TLLMCredentials, TLLMModel, BasicCredentials } from '@sre/types/LLM.types';
|
|
6
|
+
|
|
7
|
+
const DEFAULT_MODEL = 'gemini-embedding-001';
|
|
8
|
+
|
|
9
|
+
export class GoogleEmbeds extends BaseEmbedding {
|
|
10
|
+
protected client: GoogleGenAI;
|
|
11
|
+
|
|
12
|
+
// Keep in sync with Gemini API supported embedding models
|
|
13
|
+
public static models = ['gemini-embedding-001', 'text-embedding-005', 'text-multilingual-embedding-002'];
|
|
14
|
+
public canSpecifyDimensions = true;
|
|
15
|
+
|
|
16
|
+
constructor(private settings?: Partial<TEmbeddings>) {
|
|
17
|
+
super({ model: settings?.model ?? DEFAULT_MODEL, ...settings });
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async embedTexts(texts: string[], candidate: AccessCandidate): Promise<number[][]> {
|
|
21
|
+
const batches = this.chunkArr(this.processTexts(texts), this.chunkSize);
|
|
22
|
+
|
|
23
|
+
const batchRequests = batches.map((batch) => {
|
|
24
|
+
return this.embed(batch, candidate);
|
|
25
|
+
});
|
|
26
|
+
const batchResponses = await Promise.all(batchRequests);
|
|
27
|
+
|
|
28
|
+
const embeddings: number[][] = [];
|
|
29
|
+
for (let i = 0; i < batchResponses.length; i += 1) {
|
|
30
|
+
const batch = batches[i];
|
|
31
|
+
const batchResponse = batchResponses[i];
|
|
32
|
+
for (let j = 0; j < batch.length; j += 1) {
|
|
33
|
+
embeddings.push(batchResponse[j]);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return embeddings;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async embedText(text: string, candidate: AccessCandidate): Promise<number[]> {
|
|
40
|
+
const processedText = this.processTexts([text])[0];
|
|
41
|
+
const embeddings = await this.embed([processedText], candidate);
|
|
42
|
+
return embeddings[0];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
protected async embed(texts: string[], candidate: AccessCandidate): Promise<number[][]> {
|
|
46
|
+
let apiKey: string | undefined;
|
|
47
|
+
|
|
48
|
+
// Try to get from credentials first
|
|
49
|
+
try {
|
|
50
|
+
const modelInfo: TLLMModel = {
|
|
51
|
+
provider: 'GoogleAI',
|
|
52
|
+
modelId: this.model,
|
|
53
|
+
credentials: (this.settings?.credentials as unknown as TLLMCredentials) || [TLLMCredentials.Internal, TLLMCredentials.Vault],
|
|
54
|
+
};
|
|
55
|
+
const credentials = await getLLMCredentials(candidate, modelInfo);
|
|
56
|
+
apiKey = (credentials as BasicCredentials)?.apiKey;
|
|
57
|
+
} catch (e) {
|
|
58
|
+
// If credential system fails, fall back to environment variable
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Fall back to environment variable if not found in credentials
|
|
62
|
+
if (!apiKey) {
|
|
63
|
+
apiKey = process.env.GOOGLE_AI_API_KEY;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (!apiKey) {
|
|
67
|
+
throw new Error('Please provide an API key for Google AI embeddings via credentials or GOOGLE_AI_API_KEY environment variable');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (!this.client) {
|
|
71
|
+
this.client = new GoogleGenAI({ apiKey });
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
try {
|
|
75
|
+
const outputDimensionality = this.dimensions && Number.isFinite(this.dimensions) ? this.dimensions : undefined;
|
|
76
|
+
|
|
77
|
+
// Batch request using the new SDK
|
|
78
|
+
const res = await this.client.models.embedContent({
|
|
79
|
+
model: this.model,
|
|
80
|
+
contents: texts,
|
|
81
|
+
...(outputDimensionality ? { outputDimensionality } : {}),
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// The SDK can return either { embedding } for single or { embeddings } for batch
|
|
85
|
+
const vectors: number[][] = Array.isArray((res as any).embeddings)
|
|
86
|
+
? (res as any).embeddings.map((e: any) => e.values as number[])
|
|
87
|
+
: [((res as any).embedding?.values as number[]) || []];
|
|
88
|
+
|
|
89
|
+
// Enforce dimensions and normalization when requested or when non-3072
|
|
90
|
+
const targetDim = outputDimensionality;
|
|
91
|
+
const processed = vectors.map((v) => this.postProcessEmbedding(v, targetDim));
|
|
92
|
+
|
|
93
|
+
return processed;
|
|
94
|
+
} catch (e) {
|
|
95
|
+
throw new Error(`Google Embeddings API error: ${e.message || e}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private postProcessEmbedding(values: number[], targetDim?: number): number[] {
|
|
100
|
+
let v = Array.isArray(values) ? values.slice() : [];
|
|
101
|
+
if (targetDim && targetDim > 0) {
|
|
102
|
+
if (v.length > targetDim) {
|
|
103
|
+
// SDK ignored smaller dimension: truncate
|
|
104
|
+
v = v.slice(0, targetDim);
|
|
105
|
+
} else if (v.length < targetDim) {
|
|
106
|
+
// SDK returned shorter vector: pad with zeros
|
|
107
|
+
v = v.concat(Array(targetDim - v.length).fill(0));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Normalize for non-default 3072 dims (recommended by Google docs)
|
|
111
|
+
const needNormalize = (targetDim && targetDim !== 3072) || (!targetDim && v.length !== 3072);
|
|
112
|
+
if (needNormalize && v.length > 0) {
|
|
113
|
+
const norm = Math.sqrt(v.reduce((acc, x) => acc + x * x, 0));
|
|
114
|
+
if (norm > 0) v = v.map((x) => x / norm);
|
|
115
|
+
}
|
|
116
|
+
return v;
|
|
117
|
+
}
|
|
118
|
+
}
|