@smythos/sre 1.5.2 → 1.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/index.js +135 -5
  2. package/dist/index.js.map +1 -1
  3. package/dist/types/helpers/Sysconfig.helper.d.ts +1 -0
  4. package/dist/types/index.d.ts +2 -0
  5. package/dist/types/subsystems/IO/Log.service/connectors/ConsoleLog.class.d.ts +1 -1
  6. package/dist/types/subsystems/IO/NKV.service/NKVConnector.d.ts +2 -0
  7. package/dist/types/subsystems/IO/NKV.service/connectors/NKVLocalStorage.class.d.ts +34 -0
  8. package/dist/types/subsystems/IO/Storage.service/connectors/LocalStorage.class.d.ts +1 -0
  9. package/dist/types/subsystems/IO/VectorDB.service/connectors/PineconeVectorDB.class.d.ts +2 -2
  10. package/dist/types/subsystems/IO/VectorDB.service/embed/BaseEmbedding.d.ts +11 -7
  11. package/dist/types/types/VectorDB.types.d.ts +13 -11
  12. package/package.json +2 -28
  13. package/src/Core/SmythRuntime.class.ts +3 -66
  14. package/src/helpers/Sysconfig.helper.ts +67 -0
  15. package/src/index.ts +2 -0
  16. package/src/index.ts.bak +178 -176
  17. package/src/subsystems/AgentManager/AgentLogger.class.ts +1 -1
  18. package/src/subsystems/IO/Log.service/connectors/ConsoleLog.class.ts +1 -1
  19. package/src/subsystems/IO/NKV.service/NKVConnector.ts +2 -0
  20. package/src/subsystems/IO/NKV.service/connectors/NKVLocalStorage.class.ts +211 -0
  21. package/src/subsystems/IO/NKV.service/connectors/NKVRAM.class.ts +1 -1
  22. package/src/subsystems/IO/NKV.service/index.ts +2 -0
  23. package/src/subsystems/IO/Storage.service/connectors/LocalStorage.class.ts +21 -1
  24. package/src/subsystems/IO/VectorDB.service/connectors/MilvusVectorDB.class.ts +6 -2
  25. package/src/subsystems/IO/VectorDB.service/connectors/PineconeVectorDB.class.ts +26 -15
  26. package/src/subsystems/IO/VectorDB.service/connectors/RAMVecrtorDB.class.ts +6 -5
  27. package/src/subsystems/IO/VectorDB.service/embed/BaseEmbedding.ts +11 -10
  28. package/src/subsystems/IO/VectorDB.service/embed/OpenAIEmbedding.ts +1 -1
  29. package/src/subsystems/LLMManager/LLM.service/LLMConnector.ts +2 -1
  30. package/src/subsystems/Security/Vault.service/connectors/JSONFileVault.class.ts +11 -11
  31. package/src/types/VectorDB.types.ts +14 -6
@@ -4,9 +4,11 @@ import { ConnectorService, ConnectorServiceProvider } from '@sre/Core/Connectors
4
4
  import { TConnectorService } from '@sre/types/SRE.types';
5
5
  import { NKVRedis } from './connectors/NKVRedis.class';
6
6
  import { NKVRAM } from './connectors/NKVRAM.class';
7
+ import { NKVLocalStorage } from './connectors/NKVLocalStorage.class';
7
8
  export class NKVService extends ConnectorServiceProvider {
8
9
  public register() {
9
10
  ConnectorService.register(TConnectorService.NKV, 'Redis', NKVRedis);
10
11
  ConnectorService.register(TConnectorService.NKV, 'RAM', NKVRAM);
12
+ ConnectorService.register(TConnectorService.NKV, 'LocalStorage', NKVLocalStorage);
11
13
  }
12
14
  }
@@ -11,6 +11,7 @@ import { SecureConnector } from '@sre/Security/SecureConnector.class';
11
11
  import fs, { existsSync } from 'fs';
12
12
  import os from 'os';
13
13
  import path from 'path';
14
+ import { findSmythPath } from '../../../..';
14
15
 
15
16
  const console = Logger('LocalStorage');
16
17
 
@@ -35,7 +36,7 @@ export class LocalStorage extends StorageConnector {
35
36
  super(_settings);
36
37
  //if (!SmythRuntime.Instance) throw new Error('SRE not initialized');
37
38
 
38
- this.folder = _settings?.folder || path.join(os.homedir(), '.smyth/storage');
39
+ this.folder = this.findStorageFolder(_settings?.folder);
39
40
  this.initialize();
40
41
  if (!fs.existsSync(this.folder)) {
41
42
  //throw new Error('Invalid folder provided');
@@ -43,6 +44,25 @@ export class LocalStorage extends StorageConnector {
43
44
  }
44
45
  }
45
46
 
47
+ private findStorageFolder(folder) {
48
+ let _storageFolder = folder;
49
+
50
+ if (fs.existsSync(_storageFolder)) {
51
+ return _storageFolder;
52
+ }
53
+
54
+ _storageFolder = findSmythPath('storage');
55
+
56
+ if (fs.existsSync(_storageFolder)) {
57
+ console.warn('Using alternative storage folder found in : ', _storageFolder);
58
+ return _storageFolder;
59
+ }
60
+
61
+ console.warn('!!! All attempts to find an existing storage folder failed !!!');
62
+ console.warn('!!! I will use this folder: ', _storageFolder);
63
+ return _storageFolder;
64
+ }
65
+
46
66
  /**
47
67
  * Reads an object from the local storage.
48
68
  *
@@ -45,10 +45,13 @@ export class MilvusVectorDB extends VectorDBConnector {
45
45
 
46
46
  constructor(protected _settings: MilvusConfig) {
47
47
  super(_settings);
48
+ if (!_settings.credentials) {
49
+ return;
50
+ }
48
51
 
49
52
  // Create client config based on credential type
50
53
  const clientConfig = {
51
- address: _settings.credentials.address,
54
+ address: _settings.credentials?.address,
52
55
  token: 'token' in _settings.credentials ? _settings.credentials.token : undefined,
53
56
  user: 'user' in _settings.credentials ? _settings.credentials.user : undefined,
54
57
  password: 'password' in _settings.credentials ? _settings.credentials.password : undefined,
@@ -60,7 +63,8 @@ export class MilvusVectorDB extends VectorDBConnector {
60
63
  console.info('Milvus client initialized');
61
64
  this.accountConnector = ConnectorService.getAccountConnector();
62
65
  this.cache = ConnectorService.getCacheConnector();
63
- if (!_settings.embeddings.dimensions) _settings.embeddings.dimensions = 1024;
66
+ if (!_settings.embeddings.params) _settings.embeddings.params = { dimensions: 1024 };
67
+ if (!_settings.embeddings.params?.dimensions) _settings.embeddings.params.dimensions = 1024;
64
68
 
65
69
  this.embedder = EmbeddingsFactory.create(_settings.embeddings.provider, _settings.embeddings);
66
70
 
@@ -4,7 +4,7 @@ import { IAccessCandidate, IACL, TAccessLevel, TAccessRole } from '@sre/types/AC
4
4
  import { AccessRequest } from '@sre/Security/AccessControl/AccessRequest.class';
5
5
  import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
6
6
  import { SecureConnector } from '@sre/Security/SecureConnector.class';
7
- import { VectorDBConnector } from '../VectorDBConnector';
7
+ import { VectorDBConnector, DeleteTarget } from '../VectorDBConnector';
8
8
  import {
9
9
  DatasourceDto,
10
10
  IStorageVectorDataSource,
@@ -72,7 +72,8 @@ export class PineconeVectorDB extends VectorDBConnector {
72
72
  this.accountConnector = ConnectorService.getAccountConnector();
73
73
  this.cache = ConnectorService.getCacheConnector();
74
74
  this.nkvConnector = ConnectorService.getNKVConnector();
75
- if (!_settings.embeddings.dimensions) _settings.embeddings.dimensions = 1024;
75
+ if (!_settings.embeddings.params) _settings.embeddings.params = { dimensions: 1024 };
76
+ if (!_settings.embeddings.params?.dimensions) _settings.embeddings.params.dimensions = 1024;
76
77
 
77
78
  this.embedder = EmbeddingsFactory.create(_settings.embeddings.provider, _settings.embeddings);
78
79
  }
@@ -176,18 +177,21 @@ export class PineconeVectorDB extends VectorDBConnector {
176
177
  includeValues: true,
177
178
  });
178
179
 
179
- let matches: VectorsResultData = [];
180
+ let matches = [];
180
181
 
181
182
  for (const match of results.matches) {
182
183
  if (match.metadata?.isSkeletonVector) continue;
183
184
 
184
- if (match.metadata?.user) {
185
- match.metadata.user = JSONContentHelper.create(match.metadata.user.toString()).tryParse();
185
+ if (match.metadata?.[this.USER_METADATA_KEY]) {
186
+ match.metadata[this.USER_METADATA_KEY] = JSONContentHelper.create(match.metadata[this.USER_METADATA_KEY].toString()).tryParse();
186
187
  }
188
+
187
189
  matches.push({
188
190
  id: match.id,
189
191
  values: match.values,
190
- metadata: match.metadata,
192
+ text: match.metadata?.text as string | undefined,
193
+ metadata: match.metadata?.[this.USER_METADATA_KEY] as Record<string, any> | undefined,
194
+ score: match.score,
191
195
  });
192
196
  }
193
197
 
@@ -236,14 +240,19 @@ export class PineconeVectorDB extends VectorDBConnector {
236
240
  }
237
241
 
238
242
  @SecureConnector.AccessControl
239
- protected async delete(acRequest: AccessRequest, namespace: string, id: string | string[]): Promise<void> {
240
- const _ids = Array.isArray(id) ? id : [id];
241
- //const teamId = await this.accountConnector.getCandidateTeam(acRequest.candidate);
242
-
243
- const res = await this.client
244
- .Index(this.indexName)
245
- .namespace(this.constructNsName(acRequest.candidate as AccessCandidate, namespace))
246
- .deleteMany(_ids);
243
+ protected async delete(acRequest: AccessRequest, namespace: string, deleteTarget: DeleteTarget): Promise<void> {
244
+ const isDeleteByFilter = typeof deleteTarget === 'object';
245
+
246
+ if (isDeleteByFilter) {
247
+ // TODO: handle delete by filter logic
248
+ } else {
249
+ const _ids = Array.isArray(deleteTarget) ? deleteTarget : [deleteTarget];
250
+
251
+ const res = await this.client
252
+ .Index(this.indexName)
253
+ .namespace(this.constructNsName(acRequest.candidate as AccessCandidate, namespace))
254
+ .deleteMany(_ids);
255
+ }
247
256
  }
248
257
 
249
258
  @SecureConnector.AccessControl
@@ -257,6 +266,7 @@ export class PineconeVectorDB extends VectorDBConnector {
257
266
  chunkSize: datasource.chunkSize,
258
267
  chunkOverlap: datasource.chunkOverlap,
259
268
  });
269
+ const label = datasource.label || 'Untitled';
260
270
  const ids = Array.from({ length: chunkedText.length }, (_, i) => `${dsId}_${crypto.randomUUID()}`);
261
271
  const source: IVectorDataSourceDto[] = chunkedText.map((doc, i) => {
262
272
  return {
@@ -266,7 +276,8 @@ export class PineconeVectorDB extends VectorDBConnector {
266
276
  acl: acl.serializedACL,
267
277
  namespaceId: formattedNs,
268
278
  datasourceId: dsId,
269
- user: datasource.metadata ? jsonrepair(JSON.stringify(datasource.metadata)) : undefined,
279
+ datasourceLabel: label,
280
+ user_metadata: datasource.metadata ? jsonrepair(JSON.stringify(datasource.metadata)) : undefined,
270
281
  },
271
282
  };
272
283
  });
@@ -64,9 +64,9 @@ export class RAMVectorDB extends VectorDBConnector {
64
64
  this.accountConnector = ConnectorService.getAccountConnector();
65
65
 
66
66
  if (!_settings.embeddings) {
67
- _settings.embeddings = { provider: 'OpenAI', model: 'text-embedding-3-large' };
67
+ _settings.embeddings = { provider: 'OpenAI', model: 'text-embedding-3-large', params: { dimensions: 1024 } };
68
68
  }
69
- if (!_settings.embeddings.dimensions) _settings.embeddings.dimensions = 1024;
69
+ if (!_settings.embeddings.params?.dimensions) _settings.embeddings.params.dimensions = 1024;
70
70
 
71
71
  this.embedder = EmbeddingsFactory.create(_settings.embeddings.provider, _settings.embeddings);
72
72
  }
@@ -90,7 +90,7 @@ export class RAMVectorDB extends VectorDBConnector {
90
90
  const preparedNs = this.constructNsName(acRequest.candidate as AccessCandidate, namespace);
91
91
 
92
92
  if (!this.namespaces[preparedNs]) {
93
- const nsData: IStorageVectorNamespace = {
93
+ const nsData = {
94
94
  namespace: preparedNs,
95
95
  displayName: namespace,
96
96
  candidateId: acRequest.candidate.id,
@@ -178,7 +178,7 @@ export class RAMVectorDB extends VectorDBConnector {
178
178
 
179
179
  // Search in namespace data
180
180
  const namespaceData = this.vectors[preparedNs] || [];
181
- const results: Array<{ id: string; score: number; values: number[]; metadata?: any }> = [];
181
+ const results: Array<{ id: string; score: number; values: number[]; metadata?: any; text: string }> = [];
182
182
 
183
183
  for (const vector of namespaceData) {
184
184
  const similarity = this.cosineSimilarity(queryVector as number[], vector.values);
@@ -187,6 +187,7 @@ export class RAMVectorDB extends VectorDBConnector {
187
187
  score: similarity,
188
188
  values: vector.values,
189
189
  metadata: options.includeMetadata ? vector.metadata : undefined,
190
+ text: vector.metadata?.text,
190
191
  });
191
192
  }
192
193
 
@@ -228,7 +229,7 @@ export class RAMVectorDB extends VectorDBConnector {
228
229
  const vectorData: VectorData = {
229
230
  id: source.id,
230
231
  values: vector,
231
- datasource: source.metadata?.datasource || 'unknown',
232
+ datasource: source.metadata?.datasourceId || 'unknown',
232
233
  metadata: source.metadata,
233
234
  };
234
235
 
@@ -6,14 +6,16 @@ import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.cla
6
6
  export type TEmbeddings = {
7
7
  provider: SupportedProviders;
8
8
  model: SupportedModels[SupportedProviders];
9
- dimensions?: number;
10
- timeout?: number;
11
- chunkSize?: number;
12
- stripNewLines?: boolean;
13
- maxConcurrency?: number;
9
+
14
10
  credentials?: {
15
11
  apiKey: string;
16
12
  };
13
+ params?: {
14
+ dimensions?: number;
15
+ timeout?: number;
16
+ chunkSize?: number;
17
+ stripNewLines?: boolean;
18
+ };
17
19
  };
18
20
 
19
21
  type SupportedSources = 'text' | 'vector' | 'url';
@@ -25,14 +27,13 @@ export abstract class BaseEmbedding {
25
27
  stripNewLines = true;
26
28
  dimensions?: number;
27
29
  timeout?: number;
28
- maxConcurrency?: number;
29
30
 
30
31
  constructor(fields?: Partial<TEmbeddings>) {
31
32
  this.model = fields?.model ?? this.model;
32
- this.chunkSize = fields?.chunkSize ?? this.chunkSize;
33
- this.stripNewLines = fields?.stripNewLines ?? this.stripNewLines;
34
- this.timeout = fields?.timeout;
35
- this.dimensions = fields?.dimensions;
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;
36
37
  }
37
38
 
38
39
  /**
@@ -28,7 +28,7 @@ export class OpenAIEmbeds extends BaseEmbedding {
28
28
  public canSpecifyDimensions = true;
29
29
 
30
30
  constructor(private settings?: Partial<TEmbeddings>) {
31
- super({ maxConcurrency: 2, model: settings?.model ?? DEFAULT_MODEL, ...settings });
31
+ super({ model: settings?.model ?? DEFAULT_MODEL, ...settings });
32
32
 
33
33
  this.clientConfig = {
34
34
  //apiKey: fields?.credentials?.apiKey || process.env.OPENAI_API_KEY || '',
@@ -296,7 +296,8 @@ export abstract class LLMConnector extends Connector {
296
296
  //_params.model = (await modelProviderCandidate.getModelId(model)) || model;
297
297
 
298
298
  _params.baseURL = modelInfo?.baseURL;
299
- if (!isStandardLLM) _params.modelInfo = modelInfo as TCustomLLMModel; //only if custom LLM ?
299
+ // if (!isStandardLLM) _params.modelInfo = modelInfo as TCustomLLMModel; //only if custom LLM ?
300
+ _params.modelInfo = modelInfo as TCustomLLMModel; // We need model info for both standard and custom LLMs
300
301
 
301
302
  if (_params.maxTokens) {
302
303
  _params.maxTokens = await modelProviderCandidate.adjustMaxCompletionTokens(model, _params.maxTokens, _params?.isUserKey as boolean);
@@ -13,6 +13,7 @@ import crypto from 'crypto';
13
13
  import fs from 'fs';
14
14
  import * as readlineSync from 'readline-sync';
15
15
  import path from 'path';
16
+ import { findSmythPath } from '../../../../helpers/Sysconfig.helper';
16
17
 
17
18
  const console = Logger('JSONFileVault');
18
19
 
@@ -57,6 +58,8 @@ export class JSONFileVault extends VaultConnector {
57
58
  this.vaultData = JSON.parse(fs.readFileSync(vaultFile).toString());
58
59
  }
59
60
  } catch (e) {
61
+ console.error('Error parsing vault file:', e);
62
+ console.error('!!! Vault features might not work properly !!!');
60
63
  this.vaultData = {};
61
64
  }
62
65
 
@@ -82,24 +85,21 @@ export class JSONFileVault extends VaultConnector {
82
85
  if (fs.existsSync(_vaultFile)) {
83
86
  return _vaultFile;
84
87
  }
85
- console.warn('Vault file not found in:', _vaultFile, 'trying to find in local .smyth directory');
88
+ console.warn('Vault file not found in:', _vaultFile);
86
89
 
87
- //try local directory
88
- _vaultFile = path.join(process.cwd(), '.smyth', '.sre', 'vault.json');
89
- if (fs.existsSync(_vaultFile)) {
90
- console.warn('Using alternative vault file found in : ', _vaultFile);
91
- return _vaultFile;
92
- }
90
+ //try to find the .smyth directory and check if it contains a valid vault
91
+
92
+ _vaultFile = findSmythPath('.sre/vault.json', (dir, success, nextDir) => {
93
+ if (!success) {
94
+ console.warn('Vault file not found in:', nextDir);
95
+ }
96
+ });
93
97
 
94
- console.warn('Vault file not found in:', _vaultFile, 'trying to find in user home directory');
95
- //try to find the vault file in the .smyth directory
96
- _vaultFile = path.join(os.homedir(), '.smyth', '.sre', 'vault.json');
97
98
  if (fs.existsSync(_vaultFile)) {
98
99
  console.warn('Using alternative vault file found in : ', _vaultFile);
99
100
  return _vaultFile;
100
101
  }
101
102
 
102
- console.warn('Vault file not found in:', _vaultFile);
103
103
  console.warn('!!! All attempts to find the vault file failed !!!');
104
104
  console.warn('!!! Will continue without vault !!!');
105
105
  console.warn('!!! Many features might not work !!!');
@@ -1,10 +1,18 @@
1
- export type VectorDBMetadata = ({ text?: string; user?: string } & Record<string, string>) | undefined;
1
+ export type VectorDBMetadata = {
2
+ namespaceId: string;
3
+ datasourceId: string;
4
+ datasourceLabel: string;
5
+ acl: string;
6
+ user_metadata?: string;
7
+ text?: string;
8
+ };
2
9
 
3
10
  export type VectorsResultData = {
4
11
  id: string;
5
12
  score?: number;
6
13
  values: number[];
7
- metadata?: ({ text?: string; user?: Record<string, string> } & Record<string, any>) | undefined;
14
+ text: string;
15
+ metadata?: Record<string, any>;
8
16
  }[];
9
17
 
10
18
  export interface NsKnownMetadata {
@@ -46,21 +54,21 @@ export interface IVectorDataSourceDto {
46
54
  export interface IStorageVectorDataSource {
47
55
  namespaceId: string;
48
56
  // indexName: string;
49
- candidateId: string;
50
- candidateRole: string;
51
57
  name: string;
52
58
  metadata: string;
53
- text: string;
59
+ text?: string;
54
60
  vectorIds: string[];
55
61
  id: string;
62
+ candidateId: string;
63
+ candidateRole: string;
56
64
  }
57
65
 
58
66
  export interface IStorageVectorNamespace {
59
67
  namespace: string;
60
68
  displayName: string;
69
+ metadata?: StorageVectorNamespaceMetadata;
61
70
  candidateId: string;
62
71
  candidateRole: string;
63
- metadata?: StorageVectorNamespaceMetadata;
64
72
  }
65
73
 
66
74
  export type StorageVectorNamespaceMetadata = Partial<PineconeNamespaceMetadata> & { isOnCustomStorage?: boolean } & { [key: string]: any };