@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.
- package/dist/index.js +135 -5
- package/dist/index.js.map +1 -1
- package/dist/types/helpers/Sysconfig.helper.d.ts +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/subsystems/IO/Log.service/connectors/ConsoleLog.class.d.ts +1 -1
- package/dist/types/subsystems/IO/NKV.service/NKVConnector.d.ts +2 -0
- package/dist/types/subsystems/IO/NKV.service/connectors/NKVLocalStorage.class.d.ts +34 -0
- package/dist/types/subsystems/IO/Storage.service/connectors/LocalStorage.class.d.ts +1 -0
- package/dist/types/subsystems/IO/VectorDB.service/connectors/PineconeVectorDB.class.d.ts +2 -2
- package/dist/types/subsystems/IO/VectorDB.service/embed/BaseEmbedding.d.ts +11 -7
- package/dist/types/types/VectorDB.types.d.ts +13 -11
- package/package.json +2 -28
- package/src/Core/SmythRuntime.class.ts +3 -66
- package/src/helpers/Sysconfig.helper.ts +67 -0
- package/src/index.ts +2 -0
- package/src/index.ts.bak +178 -176
- package/src/subsystems/AgentManager/AgentLogger.class.ts +1 -1
- package/src/subsystems/IO/Log.service/connectors/ConsoleLog.class.ts +1 -1
- package/src/subsystems/IO/NKV.service/NKVConnector.ts +2 -0
- package/src/subsystems/IO/NKV.service/connectors/NKVLocalStorage.class.ts +211 -0
- package/src/subsystems/IO/NKV.service/connectors/NKVRAM.class.ts +1 -1
- package/src/subsystems/IO/NKV.service/index.ts +2 -0
- package/src/subsystems/IO/Storage.service/connectors/LocalStorage.class.ts +21 -1
- package/src/subsystems/IO/VectorDB.service/connectors/MilvusVectorDB.class.ts +6 -2
- package/src/subsystems/IO/VectorDB.service/connectors/PineconeVectorDB.class.ts +26 -15
- package/src/subsystems/IO/VectorDB.service/connectors/RAMVecrtorDB.class.ts +6 -5
- package/src/subsystems/IO/VectorDB.service/embed/BaseEmbedding.ts +11 -10
- package/src/subsystems/IO/VectorDB.service/embed/OpenAIEmbedding.ts +1 -1
- package/src/subsystems/LLMManager/LLM.service/LLMConnector.ts +2 -1
- package/src/subsystems/Security/Vault.service/connectors/JSONFileVault.class.ts +11 -11
- 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
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
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?.
|
|
185
|
-
match.metadata.
|
|
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
|
-
|
|
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,
|
|
240
|
-
const
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
.
|
|
246
|
-
|
|
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
|
-
|
|
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
|
|
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?.
|
|
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
|
-
|
|
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({
|
|
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
|
|
88
|
+
console.warn('Vault file not found in:', _vaultFile);
|
|
86
89
|
|
|
87
|
-
//try
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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 };
|