@memberjunction/ai-vector-sync 2.4.0 → 2.5.0

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 (61) hide show
  1. package/dist/config.d.ts +13 -0
  2. package/dist/config.d.ts.map +1 -0
  3. package/dist/config.js +21 -0
  4. package/dist/config.js.map +1 -0
  5. package/dist/db/db.d.ts +4 -0
  6. package/dist/db/db.d.ts.map +1 -0
  7. package/dist/db/db.js +40 -0
  8. package/dist/db/db.js.map +1 -0
  9. package/dist/db/dbAI.d.ts +4 -0
  10. package/dist/db/dbAI.d.ts.map +1 -0
  11. package/dist/db/dbAI.js +18 -0
  12. package/dist/db/dbAI.js.map +1 -0
  13. package/dist/generic/EntityDocumenTemplateParserBase.d.ts +14 -0
  14. package/dist/generic/EntityDocumenTemplateParserBase.d.ts.map +1 -0
  15. package/dist/generic/EntityDocumenTemplateParserBase.js +76 -0
  16. package/dist/generic/EntityDocumenTemplateParserBase.js.map +1 -0
  17. package/dist/generic/EntityDocumentTemplateParser.d.ts +7 -0
  18. package/dist/generic/EntityDocumentTemplateParser.d.ts.map +1 -0
  19. package/dist/generic/EntityDocumentTemplateParser.js +74 -0
  20. package/dist/generic/EntityDocumentTemplateParser.js.map +1 -0
  21. package/dist/generic/entitySyncConfig.types.d.ts +11 -0
  22. package/dist/generic/entitySyncConfig.types.d.ts.map +1 -0
  23. package/dist/generic/entitySyncConfig.types.js +3 -0
  24. package/dist/generic/entitySyncConfig.types.js.map +1 -0
  25. package/dist/generic/vectorSync.types.d.ts +61 -0
  26. package/dist/generic/vectorSync.types.d.ts.map +1 -0
  27. package/dist/generic/vectorSync.types.js +3 -0
  28. package/dist/generic/vectorSync.types.js.map +1 -0
  29. package/dist/index.d.ts +5 -2014
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +21 -4
  32. package/dist/index.js.map +1 -1
  33. package/dist/models/BatchWorker.d.ts +34 -0
  34. package/dist/models/BatchWorker.d.ts.map +1 -0
  35. package/dist/models/BatchWorker.js +77 -0
  36. package/dist/models/BatchWorker.js.map +1 -0
  37. package/dist/models/EntityDocumentCache.d.ts +27 -0
  38. package/dist/models/EntityDocumentCache.d.ts.map +1 -0
  39. package/dist/models/EntityDocumentCache.js +118 -0
  40. package/dist/models/EntityDocumentCache.js.map +1 -0
  41. package/dist/models/PagedRecords.d.ts +9 -0
  42. package/dist/models/PagedRecords.d.ts.map +1 -0
  43. package/dist/models/PagedRecords.js +19 -0
  44. package/dist/models/PagedRecords.js.map +1 -0
  45. package/dist/models/entityVectorSync.d.ts +28 -0
  46. package/dist/models/entityVectorSync.d.ts.map +1 -0
  47. package/dist/models/entityVectorSync.js +486 -0
  48. package/dist/models/entityVectorSync.js.map +1 -0
  49. package/dist/models/workers/UpsertVectors.d.ts +2 -0
  50. package/dist/models/workers/UpsertVectors.d.ts.map +1 -0
  51. package/dist/models/workers/UpsertVectors.js +48 -0
  52. package/dist/models/workers/UpsertVectors.js.map +1 -0
  53. package/dist/models/workers/VectorizeTemplates.d.ts +2 -0
  54. package/dist/models/workers/VectorizeTemplates.d.ts.map +1 -0
  55. package/dist/models/workers/VectorizeTemplates.js +88 -0
  56. package/dist/models/workers/VectorizeTemplates.js.map +1 -0
  57. package/dist/models/workers/upserter.d.ts +2 -0
  58. package/dist/models/workers/upserter.d.ts.map +1 -0
  59. package/dist/models/workers/upserter.js +11 -0
  60. package/dist/models/workers/upserter.js.map +1 -0
  61. package/package.json +14 -14
@@ -0,0 +1,28 @@
1
+ import { VectorBase } from '@memberjunction/ai-vectors';
2
+ import { EntityField, EntityInfo, UserInfo } from '@memberjunction/core';
3
+ import { AIModelEntity, EntityDocumentEntity, TemplateEntity, VectorDatabaseEntity } from '@memberjunction/core-entities';
4
+ import { EmbeddingData, TemplateParamData, VectorEmeddingData, VectorizeEntityParams, VectorizeEntityResponse } from '../generic/vectorSync.types';
5
+ import { TemplateEntityExtended } from '@memberjunction/templates-base-types';
6
+ export declare class EntityVectorSyncer extends VectorBase {
7
+ _startTime: Date;
8
+ _endTime: Date;
9
+ constructor();
10
+ Config(forceRefresh: boolean, contextUser?: UserInfo): Promise<void>;
11
+ VectorizeEntity(params: VectorizeEntityParams, contextUser?: UserInfo): Promise<VectorizeEntityResponse>;
12
+ CreateDefaultEntityDocument(EntityID: string, VectorDatabase: VectorDatabaseEntity, AIModel: AIModelEntity): Promise<EntityDocumentEntity>;
13
+ protected GetVectorDatabaseAndEmbeddingClassByEntityDocumentID(entityDocumentID: string, createDocumentIfNotFound?: boolean): Promise<VectorEmeddingData>;
14
+ GetEntityDocument(EntityDocumentID: string): Promise<EntityDocumentEntity | null>;
15
+ GetEntityDocumentByName(EntityDocumentName: string, ContextUser?: UserInfo): Promise<EntityDocumentEntity | null>;
16
+ GetActiveEntityDocuments(entityNames?: string[]): Promise<EntityDocumentEntity[]>;
17
+ private GetOrCreateVectorIndex;
18
+ protected CreateTemplateForEntityDocument(entityDocument: EntityDocumentEntity): Promise<TemplateEntity>;
19
+ protected BuildTemplateContent(entityFields: EntityField[]): string;
20
+ protected GetEntityFieldsForSimilaritySearch(entityID: string): Promise<EntityField[]>;
21
+ protected GetTemplateData(entity: EntityInfo, record: unknown, template: TemplateEntityExtended, relatedData: TemplateParamData[]): Promise<{
22
+ [key: string]: any;
23
+ }>;
24
+ protected GetRelatedTemplateDataForBatch(entity: EntityInfo, records: unknown[], template: TemplateEntityExtended): Promise<TemplateParamData[]>;
25
+ protected UpsertEntityRecordDocumentRecords(embeddingData: EmbeddingData, contextUser: UserInfo): Promise<void>;
26
+ protected ValidateTemplateContextParamAlignment(template: TemplateEntityExtended): boolean;
27
+ }
28
+ //# sourceMappingURL=entityVectorSync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entityVectorSync.d.ts","sourceRoot":"","sources":["../../src/models/entityVectorSync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAc,WAAW,EAAE,UAAU,EAAyD,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC5I,OAAO,EAAE,aAAa,EAAE,oBAAoB,EACf,cAAc,EAAuB,oBAAoB,EAAqB,MAAM,+BAA+B,CAAC;AAGjJ,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAQnJ,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAK9E,qBAAa,kBAAmB,SAAQ,UAAU;IAChD,UAAU,EAAE,IAAI,CAAC;IACjB,QAAQ,EAAE,IAAI,CAAC;;IAWF,MAAM,CAAC,YAAY,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpE,eAAe,CAAC,MAAM,EAAE,qBAAqB,EAAE,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAsJxG,2BAA2B,CACtC,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,oBAAoB,EACpC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,oBAAoB,CAAC;cA0ChB,oDAAoD,CAAE,gBAAgB,EAAE,MAAM,EAAE,wBAAwB,CAAC,EAAE,OAAO,GAAI,OAAO,CAAC,kBAAkB,CAAC;IAsDpJ,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAQjF,uBAAuB,CAAC,kBAAkB,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAcjH,wBAAwB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;YAsChF,sBAAsB;cAoCpB,+BAA+B,CAAC,cAAc,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC;IAqE9G,SAAS,CAAC,oBAAoB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,MAAM;cAMnD,kCAAkC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;cAiB5E,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;cAmCzJ,8BAA8B,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;cAsCtI,iCAAiC,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAiErH,SAAS,CAAC,qCAAqC,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO;CAiB3F"}
@@ -0,0 +1,486 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EntityVectorSyncer = void 0;
4
+ const ai_1 = require("@memberjunction/ai");
5
+ const ai_vectordb_1 = require("@memberjunction/ai-vectordb");
6
+ const ai_vectors_1 = require("@memberjunction/ai-vectors");
7
+ const core_1 = require("@memberjunction/core");
8
+ const global_1 = require("@memberjunction/global");
9
+ const promises_1 = require("node:stream/promises");
10
+ const BatchWorker_1 = require("./BatchWorker");
11
+ const EntityDocumentCache_1 = require("./EntityDocumentCache");
12
+ const PagedRecords_1 = require("./PagedRecords");
13
+ const node_path_1 = require("node:path");
14
+ const node_stream_1 = require("node:stream");
15
+ const aiengine_1 = require("@memberjunction/aiengine");
16
+ const templates_1 = require("@memberjunction/templates");
17
+ class EntityVectorSyncer extends ai_vectors_1.VectorBase {
18
+ _startTime;
19
+ _endTime;
20
+ constructor() {
21
+ super();
22
+ }
23
+ async Config(forceRefresh, contextUser) {
24
+ super.CurrentUser = contextUser;
25
+ await EntityDocumentCache_1.EntityDocumentCache.Instance.Refresh(forceRefresh, contextUser);
26
+ await aiengine_1.AIEngine.Instance.Config(forceRefresh, contextUser);
27
+ await templates_1.TemplateEngineServer.Instance.Config(forceRefresh, contextUser);
28
+ }
29
+ async VectorizeEntity(params, contextUser) {
30
+ if (!contextUser) {
31
+ throw new Error('ContextUser is required to vectorize the entity');
32
+ }
33
+ const delayTimeMS = 250;
34
+ const startTime = new Date().getTime();
35
+ super.CurrentUser = contextUser;
36
+ await templates_1.TemplateEngineServer.Instance.Config(false, contextUser);
37
+ const entityDocument = await this.GetEntityDocument(params.entityDocumentID);
38
+ const vectorIndexEntity = await this.GetOrCreateVectorIndex(entityDocument);
39
+ const obj = await this.GetVectorDatabaseAndEmbeddingClassByEntityDocumentID(params.entityDocumentID);
40
+ const md = new core_1.Metadata();
41
+ const entity = md.Entities.find((e) => e.ID === params.entityID);
42
+ if (!entity) {
43
+ throw new Error(`Entity with ID ${params.entityID} not found.`);
44
+ }
45
+ (0, core_1.LogStatus)(`Vectorizing entity ${entity.Name} using Entity Document ${entityDocument.Name}`);
46
+ const template = templates_1.TemplateEngineServer.Instance.Templates.find((t) => t.ID === entityDocument.TemplateID);
47
+ if (!template) {
48
+ throw new Error(`Template not found with ID ${entityDocument.TemplateID}`);
49
+ }
50
+ if (template.Content.length === 0) {
51
+ throw new Error(`Template ${template.ID} does not have an associated Template Content record`);
52
+ }
53
+ if (template.Content.length > 1) {
54
+ throw new Error('Templates used by Entity Documents should only have one associated Template Content record.');
55
+ }
56
+ const validTemplate = this.ValidateTemplateContextParamAlignment(template);
57
+ const pageSize = params.batchCount || 20;
58
+ const dataStream = new PagedRecords_1.PagedRecords();
59
+ let templateObj = {
60
+ ...template.GetAll(),
61
+ Params: template.Params.map((p) => p.To())
62
+ };
63
+ const workerContext = {
64
+ executionId: Date.now(),
65
+ entity,
66
+ entityDocument: entityDocument.To(),
67
+ template: templateObj,
68
+ templateContent: template.Content[0].To(),
69
+ vectorDBClassKey: obj.vectorDBClassKey,
70
+ vectorDBAPIKey: obj.vectorDBAPIKey,
71
+ embeddingDriverClass: obj.embeddingDriverClass,
72
+ embeddingAPIKey: obj.embeddingAPIKey,
73
+ delayTimeMS
74
+ };
75
+ const annotator = new BatchWorker_1.BatchWorker({
76
+ workerFile: (0, node_path_1.resolve)(__dirname, 'workers/VectorizeTemplates.js'),
77
+ batchSize: 3,
78
+ concurrencyLimit: 2,
79
+ contextUser: super.CurrentUser,
80
+ workerContext,
81
+ });
82
+ annotator.on('error', (err) => {
83
+ (0, core_1.LogError)('Error in annotator worker', null, err);
84
+ });
85
+ const archiver = new BatchWorker_1.BatchWorker({
86
+ workerFile: (0, node_path_1.resolve)(__dirname, 'workers/UpsertVectors.js'),
87
+ batchSize: 4,
88
+ contextUser: super.CurrentUser,
89
+ workerContext
90
+ });
91
+ archiver.on('error', (err) => {
92
+ (0, core_1.LogError)('Error in archiver worker', null, err);
93
+ });
94
+ const upserter = new node_stream_1.Transform({ objectMode: true, transform: (chunk, encoding, callback) => {
95
+ this.UpsertEntityRecordDocumentRecords(chunk, super.CurrentUser).then(() => callback(null)).catch(callback);
96
+ } });
97
+ const getData = async () => {
98
+ let pageNumber = 0;
99
+ let hasMore = true;
100
+ while (hasMore) {
101
+ let pageRecordRequest = {
102
+ EntityID: params.entityID,
103
+ PageNumber: pageNumber,
104
+ PageSize: pageSize,
105
+ ResultType: 'simple',
106
+ };
107
+ if (params.listID) {
108
+ const coreSchema = md.ConfigData.MJCoreSchemaName;
109
+ pageRecordRequest.Filter = `ID IN (SELECT RecordID FROM ${coreSchema}.vwListDetails WHERE ListID = '${params.listID}')`;
110
+ }
111
+ const recordsPage = await super.PageRecordsByEntityID(pageRecordRequest);
112
+ const relatedData = await this.GetRelatedTemplateDataForBatch(entity, recordsPage, template);
113
+ const items = [];
114
+ (0, core_1.LogStatus)(`Fetched page ${pageNumber + 1} with ${recordsPage.length} records to process`);
115
+ for (const record of recordsPage) {
116
+ const templateData = await this.GetTemplateData(entity, record, template, relatedData);
117
+ templateData.__mj_recordID = record[entity.FirstPrimaryKey.Name];
118
+ templateData.__mj_compositeKey = entity.PrimaryKeys.map((key) => `${key.Name}|${record[key.Name]}`).join("||");
119
+ templateData.VectorIndexID = vectorIndexEntity.ID;
120
+ templateData.TemplateContent = template.Content[0].TemplateText;
121
+ items.push(templateData);
122
+ }
123
+ dataStream.addPage(items);
124
+ if (recordsPage.length < pageSize) {
125
+ hasMore = false;
126
+ break;
127
+ }
128
+ pageNumber++;
129
+ }
130
+ dataStream.endStream();
131
+ };
132
+ getData();
133
+ console.log('Starting pipeline');
134
+ await (0, promises_1.pipeline)(dataStream, annotator, archiver, upserter, new node_stream_1.PassThrough({ objectMode: true }));
135
+ const endTime = new Date().getTime();
136
+ (0, core_1.LogStatus)(`Finished vectorizing ${entityDocument.Entity} entity in ${endTime - startTime} ms`);
137
+ return null;
138
+ }
139
+ async CreateDefaultEntityDocument(EntityID, VectorDatabase, AIModel) {
140
+ const md = new core_1.Metadata();
141
+ const entity = md.Entities.find((e) => e.ID === EntityID);
142
+ if (!entity)
143
+ throw new Error(`Entity with ID ${EntityID} not found.`);
144
+ const EDTemplate = entity.Fields.map((ef) => {
145
+ return `${ef.Name}: \$\{${ef.Name}\}`;
146
+ }).join(' ');
147
+ const rv = new core_1.RunView();
148
+ const rvResult = await rv.RunView({
149
+ EntityName: 'Entity Document Types',
150
+ ExtraFilter: `Name = 'Record Duplicate'`,
151
+ }, super.CurrentUser);
152
+ if (!rvResult.Success) {
153
+ throw new Error(`Unable to fetch Entity Document Type: ${rvResult.ErrorMessage}`);
154
+ }
155
+ if (rvResult.Results.length === 0) {
156
+ throw new Error('Record Duplicate Entity Document Type not found');
157
+ }
158
+ const entityDocumentType = rvResult.Results[0];
159
+ const entityDocument = await md.GetEntityObject('Entity Documents');
160
+ entityDocument.NewRecord();
161
+ entityDocument.Name = `Default duplicate record Entity Document for the ${entity.Name} entity using vector database ${VectorDatabase.Name} and AI Model ${AIModel.Name}`;
162
+ entityDocument.EntityID = EntityID;
163
+ entityDocument.TypeID = entityDocumentType.ID;
164
+ entityDocument.Status = 'Active';
165
+ entityDocument.TemplateID = EDTemplate;
166
+ entityDocument.VectorDatabaseID = VectorDatabase.ID;
167
+ entityDocument.AIModelID = AIModel.ID;
168
+ let saveResult = await this.SaveEntity(entityDocument);
169
+ if (saveResult) {
170
+ return entityDocument;
171
+ }
172
+ else {
173
+ throw new Error(`Failed to save Entity Document for ${EntityID}`);
174
+ }
175
+ }
176
+ async GetVectorDatabaseAndEmbeddingClassByEntityDocumentID(entityDocumentID, createDocumentIfNotFound) {
177
+ let entityDocument = EntityDocumentCache_1.EntityDocumentCache.Instance.GetDocument(entityDocumentID);
178
+ if (!entityDocument) {
179
+ if (createDocumentIfNotFound) {
180
+ (0, core_1.LogStatus)(`No active Entity Document found for entity ${entityDocumentID}, creating one`);
181
+ const defaultVectorDB = this.GetVectorDatabase();
182
+ const defaultAIModel = this.GetAIModel();
183
+ entityDocument = await this.CreateDefaultEntityDocument(entityDocumentID, defaultVectorDB, defaultAIModel);
184
+ }
185
+ else {
186
+ throw new Error(`No Entity Document found for ID=${entityDocumentID}`);
187
+ }
188
+ }
189
+ const vectorDBEntity = this.GetVectorDatabase(entityDocument.VectorDatabaseID);
190
+ const aiModelEntity = this.GetAIModel(entityDocument.AIModelID);
191
+ const embeddingAPIKey = (0, ai_1.GetAIAPIKey)(aiModelEntity.DriverClass);
192
+ const vectorDBAPIKey = (0, ai_1.GetAIAPIKey)(vectorDBEntity.ClassKey);
193
+ if (!embeddingAPIKey) {
194
+ throw Error(`No API Key found for AI Model ${aiModelEntity.DriverClass}`);
195
+ }
196
+ if (!vectorDBAPIKey) {
197
+ throw Error(`No API Key found for Vector Database ${vectorDBEntity.ClassKey}`);
198
+ }
199
+ const embedding = global_1.MJGlobal.Instance.ClassFactory.CreateInstance(ai_1.Embeddings, aiModelEntity.DriverClass, embeddingAPIKey);
200
+ const vectorDB = global_1.MJGlobal.Instance.ClassFactory.CreateInstance(ai_vectordb_1.VectorDBBase, vectorDBEntity.ClassKey, vectorDBAPIKey);
201
+ if (!embedding) {
202
+ throw Error(`Failed to create Embeddings instance for AI Model ${aiModelEntity.DriverClass}`);
203
+ }
204
+ if (!vectorDB) {
205
+ throw Error(`Failed to create Vector Database instance for ${vectorDBEntity.ClassKey}`);
206
+ }
207
+ (0, core_1.LogStatus)(`Using vector database ${vectorDBEntity.Name} and AI Model ${aiModelEntity.Name}`);
208
+ const obj = {
209
+ embedding,
210
+ vectorDB,
211
+ vectorDBClassKey: vectorDBEntity.ClassKey,
212
+ vectorDBAPIKey: vectorDBAPIKey,
213
+ embeddingDriverClass: aiModelEntity.DriverClass,
214
+ embeddingAPIKey: embeddingAPIKey
215
+ };
216
+ return obj;
217
+ }
218
+ async GetEntityDocument(EntityDocumentID) {
219
+ const cache = EntityDocumentCache_1.EntityDocumentCache.Instance;
220
+ if (!cache.IsLoaded) {
221
+ await cache.Refresh(false, super.CurrentUser);
222
+ }
223
+ return cache.GetDocument(EntityDocumentID);
224
+ }
225
+ async GetEntityDocumentByName(EntityDocumentName, ContextUser) {
226
+ const cache = EntityDocumentCache_1.EntityDocumentCache.Instance;
227
+ if (!cache.IsLoaded) {
228
+ await cache.Refresh(false, ContextUser);
229
+ }
230
+ return cache.GetDocumentByName(EntityDocumentName);
231
+ }
232
+ async GetActiveEntityDocuments(entityNames) {
233
+ await EntityDocumentCache_1.EntityDocumentCache.Instance.Refresh(false, super.CurrentUser);
234
+ const entityDocumentType = EntityDocumentCache_1.EntityDocumentCache.Instance.GetDocumentTypeByName('Record Duplicate');
235
+ if (!entityDocumentType) {
236
+ throw new Error('Entity Document Type not found');
237
+ }
238
+ let filter = `TypeID = '${entityDocumentType.ID}' AND Status = 'Active' `;
239
+ if (entityNames && entityNames.length > 0) {
240
+ filter += ` AND Entity IN (${entityNames.map((entityName) => `'${entityName}'`).join(',')})`;
241
+ }
242
+ const runViewResult = await super.RunView.RunView({
243
+ EntityName: 'Entity Documents',
244
+ ExtraFilter: filter,
245
+ ResultType: 'entity_object',
246
+ }, super.CurrentUser);
247
+ if (!runViewResult.Success) {
248
+ throw new Error(runViewResult.ErrorMessage);
249
+ }
250
+ let entityDocuments = [];
251
+ let seenEntities = [];
252
+ for (const entityDocument of runViewResult.Results) {
253
+ if (seenEntities.includes(entityDocument.EntityID)) {
254
+ continue;
255
+ }
256
+ entityDocuments.push(entityDocument);
257
+ seenEntities.push(entityDocument.EntityID);
258
+ }
259
+ return entityDocuments;
260
+ }
261
+ async GetOrCreateVectorIndex(entityDocument) {
262
+ let vectorIndexEntity = await super.RunViewForSingleValue('Vector Indexes', `VectorDatabaseID = '${entityDocument.VectorDatabaseID}' AND EmbeddingModelID = '${entityDocument.AIModelID}'`);
263
+ if (vectorIndexEntity) {
264
+ return vectorIndexEntity;
265
+ }
266
+ (0, core_1.LogStatus)(`No Vector Index found for entityDocument ${entityDocument.ID}, creating one`);
267
+ try {
268
+ vectorIndexEntity = await super.Metadata.GetEntityObject('Vector Indexes');
269
+ vectorIndexEntity.NewRecord();
270
+ vectorIndexEntity.VectorDatabaseID = entityDocument.VectorDatabaseID;
271
+ vectorIndexEntity.EmbeddingModelID = entityDocument.AIModelID;
272
+ vectorIndexEntity.Name = `Vector Index for entityDocument ${entityDocument.EntityID}`;
273
+ vectorIndexEntity.Set('EntityRecordUpdatedAt', new Date());
274
+ vectorIndexEntity.Set('EntityDocumentID', entityDocument.ID);
275
+ vectorIndexEntity.Description = `Vector Index that uses the Vector database ${entityDocument.VectorDatabaseID} and ${entityDocument.AIModelID} as the embedding model`;
276
+ const saveResult = await super.SaveEntity(vectorIndexEntity);
277
+ if (saveResult) {
278
+ (0, core_1.LogStatus)(`Successfully created new Vector Index Entity`);
279
+ return vectorIndexEntity;
280
+ }
281
+ else {
282
+ (0, core_1.LogError)('Error saving Vector Index Entity');
283
+ return null;
284
+ }
285
+ }
286
+ catch (err) {
287
+ console.error(JSON.stringify(err));
288
+ (0, core_1.LogError)(err);
289
+ return null;
290
+ }
291
+ }
292
+ async CreateTemplateForEntityDocument(entityDocument) {
293
+ const templateEntity = await super.Metadata.GetEntityObject('Templates');
294
+ templateEntity.NewRecord();
295
+ templateEntity.Name = `Template for EntityDocument ${entityDocument.EntityID}`;
296
+ templateEntity.Description = `The template used by EntityDocument ${entityDocument.ID}`;
297
+ templateEntity.UserID = super.CurrentUser.ID;
298
+ templateEntity.IsActive = true;
299
+ templateEntity.CategoryID = null;
300
+ const templateEntitySaveResult = await super.SaveEntity(templateEntity);
301
+ if (!templateEntitySaveResult) {
302
+ (0, core_1.LogError)('Error saving Template Entity', undefined, templateEntity.LatestResult);
303
+ throw new Error(templateEntity.LatestResult.Message);
304
+ }
305
+ (0, core_1.LogStatus)(`Successfully created new Template Entity ${templateEntity.ID}`);
306
+ await templates_1.TemplateEngineServer.Instance.Config(false, super.CurrentUser);
307
+ const textContentType = templates_1.TemplateEngineServer.Instance.TemplateContentTypes.find((type) => type.Name === 'Text');
308
+ if (!textContentType) {
309
+ throw new Error('Text template content type not found');
310
+ }
311
+ const entityFields = await this.GetEntityFieldsForSimilaritySearch(entityDocument.EntityID);
312
+ const templateContentsEntity = await super.Metadata.GetEntityObject('Template Contents');
313
+ templateContentsEntity.NewRecord();
314
+ templateContentsEntity.TemplateID = templateEntity.ID;
315
+ templateContentsEntity.TypeID = textContentType.ID;
316
+ templateContentsEntity.Priority = 1;
317
+ templateContentsEntity.IsActive = true;
318
+ templateContentsEntity.TemplateText = this.BuildTemplateContent(entityFields);
319
+ const templateContentsEntitySaveResult = await super.SaveEntity(templateContentsEntity);
320
+ if (!templateContentsEntitySaveResult) {
321
+ (0, core_1.LogError)('Error saving Template Entity', undefined, templateContentsEntity.LatestResult);
322
+ throw new Error(templateContentsEntity.LatestResult.Message);
323
+ }
324
+ (0, core_1.LogStatus)(`Successfully created new Template Content Entity ${templateContentsEntity.ID}`);
325
+ const templateParamsEntity = await super.Metadata.GetEntityObject('Template Params');
326
+ templateParamsEntity.NewRecord();
327
+ templateParamsEntity.TemplateID = templateEntity.ID;
328
+ templateParamsEntity.Name = 'Entity';
329
+ templateParamsEntity.Description = 'The entity object to be used in the template';
330
+ templateParamsEntity.Type = 'Record';
331
+ templateParamsEntity.DefaultValue = null;
332
+ templateParamsEntity.IsRequired = true;
333
+ templateParamsEntity.LinkedParameterName = null;
334
+ templateParamsEntity.LinkedParameterField = null;
335
+ templateParamsEntity.ExtraFilter = null;
336
+ templateParamsEntity.EntityID = entityDocument.EntityID;
337
+ templateParamsEntity.RecordID = null;
338
+ const templateParamsEntitySaveResult = await super.SaveEntity(templateParamsEntity);
339
+ if (!templateParamsEntitySaveResult) {
340
+ (0, core_1.LogError)('Error saving Template Entity', undefined, templateParamsEntity.LatestResult);
341
+ throw new Error(templateParamsEntity.LatestResult.Message);
342
+ }
343
+ (0, core_1.LogStatus)(`Successfully created new Template Param Entity ${templateParamsEntity.ID}`);
344
+ templateEntity.Content.push(templateContentsEntity);
345
+ templateEntity.Params.push(templateParamsEntity);
346
+ templates_1.TemplateEngineServer.Instance.AddTemplate(templateEntity);
347
+ return templateEntity;
348
+ }
349
+ BuildTemplateContent(entityFields) {
350
+ return entityFields.map((field) => {
351
+ return `{{Entity.${field.Name}}}`;
352
+ }).join(' ');
353
+ }
354
+ async GetEntityFieldsForSimilaritySearch(entityID) {
355
+ const runViewResult = await super.RunView.RunView({
356
+ EntityName: 'Entity Fields',
357
+ ExtraFilter: `EntityID = '${entityID}' AND IsPrimaryKey = 0 AND IsUnique = 0 AND AutoIncrement = 0 and Type NOT IN ('datetimeoffset', 'datetime')`,
358
+ ResultType: 'entity_object',
359
+ }, super.CurrentUser);
360
+ if (!runViewResult.Success) {
361
+ throw new Error(runViewResult.ErrorMessage);
362
+ }
363
+ return runViewResult.Results;
364
+ }
365
+ async GetTemplateData(entity, record, template, relatedData) {
366
+ const templateData = {};
367
+ for (const param of template.Params) {
368
+ if (templateData[param.Name]) {
369
+ continue;
370
+ }
371
+ switch (param.Type) {
372
+ case 'Record':
373
+ templateData[param.Name] = record;
374
+ break;
375
+ case 'Entity':
376
+ const paramData = relatedData.find((rd) => rd.ParamName === param.Name);
377
+ if (!paramData) {
378
+ (0, core_1.LogError)(`No related data found for param ${param.Name} in template ${template.ID}`);
379
+ break;
380
+ }
381
+ templateData[param.Name] = paramData.Data.filter((rdfr) => rdfr[param.LinkedParameterField] === record[entity.FirstPrimaryKey.Name]);
382
+ break;
383
+ case "Array":
384
+ case "Scalar":
385
+ case "Object":
386
+ (0, core_1.LogError)(`Unsupported parameter type ${param.Type} for parameter ${param.Name} in template ${template.ID}`);
387
+ break;
388
+ }
389
+ }
390
+ return templateData;
391
+ }
392
+ async GetRelatedTemplateDataForBatch(entity, records, template) {
393
+ const relatedData = [];
394
+ for (const templateParam of template.Params) {
395
+ if (templateParam.Type !== 'Entity') {
396
+ continue;
397
+ }
398
+ const relatedEntity = templateParam.Entity;
399
+ const relatedField = templateParam.LinkedParameterField;
400
+ const quotes = entity.FirstPrimaryKey.NeedsQuotes ? "'" : "";
401
+ const filter = `${relatedField} in (${records.map((record) => `${quotes}${record[entity.FirstPrimaryKey.Name]}${quotes}`).join(',')})`;
402
+ const finalFilter = templateParam.ExtraFilter ? `(${filter}) AND (${templateParam.ExtraFilter})` : filter;
403
+ const result = await super.RunView.RunView({
404
+ EntityName: relatedEntity,
405
+ ExtraFilter: finalFilter,
406
+ ResultType: 'simple'
407
+ }, super.CurrentUser);
408
+ if (result && result.Success) {
409
+ const data = { ParamName: '', Data: [] };
410
+ data.ParamName = templateParam.Name,
411
+ data.Data = result.Results;
412
+ relatedData.push(data);
413
+ }
414
+ else {
415
+ (0, core_1.LogError)(`Error getting related data for entity ${relatedEntity} with filter ${finalFilter}`, undefined, result.ErrorMessage);
416
+ }
417
+ }
418
+ return relatedData;
419
+ }
420
+ async UpsertEntityRecordDocumentRecords(embeddingData, contextUser) {
421
+ let md = super.Metadata;
422
+ let rv = super.RunView;
423
+ let success = true;
424
+ let vectorIndex = await md.GetEntityObject('Vector Indexes', contextUser);
425
+ let vectorIndexID = embeddingData.VectorIndexID.toString();
426
+ let loadResult = await vectorIndex.Load(vectorIndexID);
427
+ if (!loadResult) {
428
+ (0, core_1.LogError)(`Vector Index with ID ${embeddingData.VectorIndexID} not found`);
429
+ return;
430
+ }
431
+ let entityDocument = embeddingData.EntityDocument;
432
+ let entityID = entityDocument.EntityID;
433
+ let existingRecords = [];
434
+ const runViewResult = await rv.RunView({
435
+ EntityName: 'Entity Record Documents',
436
+ ExtraFilter: `EntityID = '${entityID}' AND EntityDocumentID = '${entityDocument.ID}' AND RecordID in ('${embeddingData.__mj_recordID}')`,
437
+ ResultType: 'entity_object'
438
+ }, contextUser);
439
+ if (runViewResult.Success) {
440
+ existingRecords = runViewResult.Results;
441
+ }
442
+ else {
443
+ (0, core_1.LogError)(`Error getting existing Entity Record Documents`, undefined, runViewResult.ErrorMessage);
444
+ }
445
+ let erdEntity = existingRecords.find((er) => er.Get("RecordID").toString() === embeddingData.__mj_recordID.toString());
446
+ if (!erdEntity) {
447
+ erdEntity = await md.GetEntityObject('Entity Record Documents', contextUser);
448
+ erdEntity.NewRecord();
449
+ }
450
+ erdEntity.Set("EntityID", entityID.toString());
451
+ erdEntity.Set("RecordID", embeddingData.__mj_recordID.toString());
452
+ erdEntity.Set("DocumentText", embeddingData.TemplateContent);
453
+ erdEntity.Set("VectorID", embeddingData.VectorID.toString());
454
+ erdEntity.Set("VectorJSON", JSON.stringify(embeddingData.Vector));
455
+ erdEntity.Set("VectorIndexID", embeddingData.VectorIndexID.toString());
456
+ erdEntity.Set("EntityRecordUpdatedAt", new Date());
457
+ erdEntity.Set("EntityDocumentID", embeddingData.EntityDocument.ID.toString());
458
+ erdEntity.ContextCurrentUser = contextUser;
459
+ let erdEntitySaveResult = await erdEntity.Save();
460
+ if (!erdEntitySaveResult) {
461
+ (0, core_1.LogError)('Error saving Entity Record Document Entity', undefined, erdEntity.LatestResult);
462
+ success = false;
463
+ }
464
+ if (success) {
465
+ (0, core_1.LogStatus)("Upserting Entity Record Documents: Complete");
466
+ }
467
+ else {
468
+ (0, core_1.LogError)("Upserting Entity Record Documents: Fail");
469
+ }
470
+ }
471
+ ValidateTemplateContextParamAlignment(template) {
472
+ const seenParams = {};
473
+ for (const templateParam of template.Params) {
474
+ const param = seenParams[templateParam.Name];
475
+ if (param && param.Type !== templateParam.Type) {
476
+ throw new Error(`Parameter ${param.Name} has different types in different templates`);
477
+ }
478
+ else {
479
+ seenParams[templateParam.Name] = templateParam;
480
+ }
481
+ }
482
+ return true;
483
+ }
484
+ }
485
+ exports.EntityVectorSyncer = EntityVectorSyncer;
486
+ //# sourceMappingURL=entityVectorSync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entityVectorSync.js","sourceRoot":"","sources":["../../src/models/entityVectorSync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function UpsertVectorRecords(): Promise<void>;
2
+ //# sourceMappingURL=UpsertVectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpsertVectors.d.ts","sourceRoot":"","sources":["../../../src/models/workers/UpsertVectors.ts"],"names":[],"mappings":"AAYA,wBAAsB,mBAAmB,kBAsCxC"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UpsertVectorRecords = void 0;
4
+ const node_worker_threads_1 = require("node:worker_threads");
5
+ const ai_vectordb_1 = require("@memberjunction/ai-vectordb");
6
+ const global_1 = require("@memberjunction/global");
7
+ const ai_vectors_pinecone_1 = require("@memberjunction/ai-vectors-pinecone");
8
+ const core_1 = require("@memberjunction/core");
9
+ (0, ai_vectors_pinecone_1.LoadPineconeVectorDB)();
10
+ const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
11
+ async function UpsertVectorRecords() {
12
+ const { batch, context } = node_worker_threads_1.workerData;
13
+ const embeddingsBatch = batch;
14
+ if (!embeddingsBatch) {
15
+ throw new Error('Embeddings are required for the ArchiveWorker');
16
+ }
17
+ const entityDocument = context.entityDocument;
18
+ const vectorDB = global_1.MJGlobal.Instance.ClassFactory.CreateInstance(ai_vectordb_1.VectorDBBase, context.vectorDBClassKey, context.vectorDBAPIKey);
19
+ const startTime = Date.now();
20
+ const vectorRecords = embeddingsBatch.map((embedding) => {
21
+ const guid = uuidv4();
22
+ embedding.VectorID = guid;
23
+ return {
24
+ id: guid,
25
+ values: embedding.Vector,
26
+ metadata: {
27
+ RecordID: embedding.__mj_compositeKey.toString(),
28
+ Entity: entityDocument.Entity,
29
+ TemplateID: context.templateContent.ID,
30
+ }
31
+ };
32
+ });
33
+ const response = await vectorDB.createRecords(vectorRecords);
34
+ if (!response.success) {
35
+ (0, core_1.LogError)('Unable to successfully save records to vector database', undefined, response.message);
36
+ }
37
+ const runTime = Date.now() - startTime;
38
+ const elapsed = Date.now() - context.executionId;
39
+ console.log('\t##### Upserting records to vector database: Complete #####', { threadId: node_worker_threads_1.threadId, now: Date.now() % 100_000, runTime, elapsed });
40
+ await delay(context.delayTimeMS);
41
+ node_worker_threads_1.parentPort.postMessage({ ...node_worker_threads_1.workerData, ...batch });
42
+ }
43
+ exports.UpsertVectorRecords = UpsertVectorRecords;
44
+ function uuidv4() {
45
+ return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, c => (+c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> +c / 4).toString(16));
46
+ }
47
+ UpsertVectorRecords();
48
+ //# sourceMappingURL=UpsertVectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpsertVectors.js","sourceRoot":"","sources":["../../../src/models/workers/UpsertVectors.ts"],"names":[],"mappings":";;;AAAA,6DAAuE;AAEvE,6DAAuF;AACvF,mDAAkD;AAClD,6EAA2E;AAC3E,+CAAgD;AAGhD,IAAA,0CAAoB,GAAE,CAAC;AAEvB,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAEzE,KAAK,UAAU,mBAAmB;IACvC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,gCAA8C,CAAC;IAE1E,MAAM,eAAe,GAAoB,KAAY,CAAC;IACtD,IAAG,CAAC,eAAe,EAAC,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAC9C,MAAM,QAAQ,GAAiB,iBAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAe,0BAAY,EAAE,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAE3J,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAG7B,MAAM,aAAa,GAAmB,eAAe,CAAC,GAAG,CAAC,CAAC,SAAwB,EAAE,EAAE;QACrF,MAAM,IAAI,GAAW,MAAM,EAAE,CAAC;QAC9B,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC1B,OAAO;YACL,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,QAAQ,EAAE;gBACR,QAAQ,EAAE,SAAS,CAAC,iBAAiB,CAAC,QAAQ,EAAE;gBAChD,MAAM,EAAE,cAAc,CAAC,MAAM;gBAC7B,UAAU,EAAE,OAAO,CAAC,eAAe,CAAC,EAAE;aACvC;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAiB,MAAM,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAC3E,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtB,IAAA,eAAQ,EAAC,wDAAwD,EAAE,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClG,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,8DAA8D,EAAE,EAAE,QAAQ,EAAR,8BAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACvI,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACjC,gCAAU,CAAC,WAAW,CAAC,EAAE,GAAG,gCAAU,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AACtD,CAAC;AAtCD,kDAsCC;AAED,SAAS,MAAM;IACb,OAAO,sCAAsC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAClE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAChF,CAAC;AACJ,CAAC;AAED,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function VectorizeEntity(): Promise<void>;
2
+ //# sourceMappingURL=VectorizeTemplates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorizeTemplates.d.ts","sourceRoot":"","sources":["../../../src/models/workers/VectorizeTemplates.ts"],"names":[],"mappings":"AAkBA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAmDrD"}