@memberjunction/ai-vector-dupe 3.4.0 → 4.1.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.
- package/README.md +212 -157
- package/dist/config.js +14 -20
- package/dist/config.js.map +1 -1
- package/dist/duplicateRecordDetector.js +61 -48
- package/dist/duplicateRecordDetector.js.map +1 -1
- package/dist/generic/vectorSyncBase.js +9 -37
- package/dist/generic/vectorSyncBase.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -19
- package/dist/index.js.map +1 -1
- package/dist/models/entitySyncConfig.d.ts +25 -0
- package/dist/models/entitySyncConfig.d.ts.map +1 -1
- package/dist/models/entitySyncConfig.js +1 -2
- package/package.json +16 -15
package/README.md
CHANGED
|
@@ -1,14 +1,42 @@
|
|
|
1
1
|
# @memberjunction/ai-vector-dupe
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
-
|
|
10
|
-
|
|
11
|
-
|
|
3
|
+
AI-powered duplicate record detection for MemberJunction entities. This package uses vector embeddings and similarity search to find potential duplicate records, track detection runs, and optionally auto-merge high-confidence matches.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
```mermaid
|
|
8
|
+
graph TD
|
|
9
|
+
subgraph DupePkg["@memberjunction/ai-vector-dupe"]
|
|
10
|
+
DRD["DuplicateRecordDetector"]
|
|
11
|
+
VSB["VectorSyncBase"]
|
|
12
|
+
ESC["EntitySyncConfig"]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
subgraph Pipeline["Detection Pipeline"]
|
|
16
|
+
LIST["Load Records<br/>from List"] --> VECT["Vectorize Records<br/>via Templates"]
|
|
17
|
+
VECT --> EMBED["Generate<br/>Embeddings"]
|
|
18
|
+
EMBED --> QUERY["Query Vector DB<br/>for Matches"]
|
|
19
|
+
QUERY --> FILTER["Filter by<br/>Threshold"]
|
|
20
|
+
FILTER --> TRACK["Track Results<br/>in Duplicate Runs"]
|
|
21
|
+
TRACK --> MERGE["Auto-Merge<br/>Above Threshold"]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
subgraph Dependencies["Key Dependencies"]
|
|
25
|
+
VB["ai-vectors<br/>(VectorBase)"]
|
|
26
|
+
SYNC["ai-vector-sync<br/>(EntityVectorSyncer)"]
|
|
27
|
+
VDBB["ai-vectordb<br/>(VectorDBBase)"]
|
|
28
|
+
AI["ai<br/>(BaseEmbeddings)"]
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
DRD -->|extends| VB
|
|
32
|
+
DRD --> SYNC
|
|
33
|
+
DRD --> VDBB
|
|
34
|
+
DRD --> AI
|
|
35
|
+
|
|
36
|
+
style DupePkg fill:#2d6a9f,stroke:#1a4971,color:#fff
|
|
37
|
+
style Pipeline fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
38
|
+
style Dependencies fill:#7c5295,stroke:#563a6b,color:#fff
|
|
39
|
+
```
|
|
12
40
|
|
|
13
41
|
## Installation
|
|
14
42
|
|
|
@@ -16,49 +44,99 @@ The AI Vector Dupe package provides sophisticated duplicate detection capabiliti
|
|
|
16
44
|
npm install @memberjunction/ai-vector-dupe
|
|
17
45
|
```
|
|
18
46
|
|
|
19
|
-
##
|
|
47
|
+
## Overview
|
|
20
48
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
49
|
+
The package provides the `DuplicateRecordDetector` class, which orchestrates a complete duplicate detection workflow:
|
|
50
|
+
|
|
51
|
+
1. Loads records from a MemberJunction List
|
|
52
|
+
2. Vectorizes them using a configured Entity Document template and embedding model
|
|
53
|
+
3. Queries the vector database for similarity matches
|
|
54
|
+
4. Filters results against configurable thresholds
|
|
55
|
+
5. Creates Duplicate Run, Duplicate Run Detail, and Duplicate Run Detail Match records for tracking
|
|
56
|
+
6. Optionally auto-merges records that exceed the absolute match threshold
|
|
57
|
+
|
|
58
|
+
## Duplicate Detection Flow
|
|
59
|
+
|
|
60
|
+
```mermaid
|
|
61
|
+
sequenceDiagram
|
|
62
|
+
participant Caller
|
|
63
|
+
participant DRD as DuplicateRecordDetector
|
|
64
|
+
participant EVS as EntityVectorSyncer
|
|
65
|
+
participant Embed as Embedding Model
|
|
66
|
+
participant VDB as Vector Database
|
|
67
|
+
participant DB as MJ Database
|
|
68
|
+
|
|
69
|
+
Caller->>DRD: getDuplicateRecords(request, user)
|
|
70
|
+
DRD->>DB: Load Entity Document
|
|
71
|
+
DRD->>EVS: VectorizeEntity (ensure all records are indexed)
|
|
72
|
+
DRD->>DB: Load records from List
|
|
73
|
+
|
|
74
|
+
loop For each record
|
|
75
|
+
DRD->>Embed: Generate embedding from template
|
|
76
|
+
DRD->>VDB: queryIndex (topK=5)
|
|
77
|
+
VDB-->>DRD: Scored matches
|
|
78
|
+
DRD->>DRD: Filter by PotentialMatchThreshold
|
|
79
|
+
DRD->>DB: Create DuplicateRunDetailMatch records
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
DRD->>DRD: Check AbsoluteMatchThreshold
|
|
83
|
+
DRD->>DB: Auto-merge high-confidence duplicates
|
|
84
|
+
DRD-->>Caller: PotentialDuplicateResponse
|
|
85
|
+
```
|
|
25
86
|
|
|
26
87
|
## Core Components
|
|
27
88
|
|
|
28
89
|
### DuplicateRecordDetector
|
|
29
90
|
|
|
30
|
-
The main class that
|
|
91
|
+
The main class that extends `VectorBase` from `@memberjunction/ai-vectors`.
|
|
31
92
|
|
|
32
|
-
|
|
33
|
-
import { DuplicateRecordDetector } from '@memberjunction/ai-vector-dupe';
|
|
34
|
-
import { PotentialDuplicateRequest, UserInfo } from '@memberjunction/core';
|
|
93
|
+
**Key method:**
|
|
35
94
|
|
|
36
|
-
|
|
95
|
+
```typescript
|
|
96
|
+
getDuplicateRecords(
|
|
97
|
+
params: PotentialDuplicateRequest,
|
|
98
|
+
contextUser?: UserInfo
|
|
99
|
+
): Promise<PotentialDuplicateResponse>
|
|
37
100
|
```
|
|
38
101
|
|
|
102
|
+
**Parameters in `PotentialDuplicateRequest`:**
|
|
103
|
+
|
|
104
|
+
| Field | Type | Description |
|
|
105
|
+
|---|---|---|
|
|
106
|
+
| `ListID` | `string` | ID of the List containing records to check |
|
|
107
|
+
| `EntityID` | `string` | ID of the entity type |
|
|
108
|
+
| `EntityDocumentID` | `string` | ID of the Entity Document with vectorization template |
|
|
109
|
+
| `Options.DuplicateRunID` | `string` (optional) | Resume an existing duplicate run |
|
|
110
|
+
|
|
111
|
+
**Thresholds (configured on Entity Document):**
|
|
112
|
+
|
|
113
|
+
| Threshold | Purpose |
|
|
114
|
+
|---|---|
|
|
115
|
+
| `PotentialMatchThreshold` | Minimum similarity score to report as potential duplicate |
|
|
116
|
+
| `AbsoluteMatchThreshold` | Minimum similarity score for automatic record merge |
|
|
117
|
+
|
|
39
118
|
### VectorSyncBase
|
|
40
119
|
|
|
41
|
-
|
|
120
|
+
A utility base class providing helper methods for vector synchronization operations:
|
|
42
121
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
122
|
+
- `parseStringTemplate(str, obj)` -- simple template variable substitution
|
|
123
|
+
- `timer(ms)` -- async delay
|
|
124
|
+
- `start()` / `end()` / `timeDiff()` -- execution timing
|
|
125
|
+
- `saveJSONData(data, path)` -- JSON file output
|
|
46
126
|
|
|
47
127
|
### EntitySyncConfig
|
|
48
128
|
|
|
49
|
-
|
|
129
|
+
Configuration type for entity synchronization scheduling:
|
|
50
130
|
|
|
51
131
|
```typescript
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
VectorIndexID: 1,
|
|
61
|
-
VectorID: 1
|
|
132
|
+
type EntitySyncConfig = {
|
|
133
|
+
EntityDocumentID: string; // Entity Document to use
|
|
134
|
+
Interval: number; // Sync interval in seconds
|
|
135
|
+
RunViewParams: RunViewParams; // View parameters for fetching
|
|
136
|
+
IncludeInSync: boolean; // Whether to include in sync
|
|
137
|
+
LastRunDate: string; // Last sync timestamp
|
|
138
|
+
VectorIndexID: number; // Vector index ID
|
|
139
|
+
VectorID: number; // Vector database ID
|
|
62
140
|
};
|
|
63
141
|
```
|
|
64
142
|
|
|
@@ -70,106 +148,109 @@ const config: EntitySyncConfig = {
|
|
|
70
148
|
import { DuplicateRecordDetector } from '@memberjunction/ai-vector-dupe';
|
|
71
149
|
import { PotentialDuplicateRequest, UserInfo } from '@memberjunction/core';
|
|
72
150
|
|
|
73
|
-
// Initialize the detector
|
|
74
151
|
const detector = new DuplicateRecordDetector();
|
|
75
152
|
|
|
76
|
-
// Define the request parameters
|
|
77
153
|
const request: PotentialDuplicateRequest = {
|
|
78
|
-
ListID: '
|
|
79
|
-
EntityID: '
|
|
80
|
-
EntityDocumentID: 'doc-
|
|
81
|
-
Options: {
|
|
82
|
-
DuplicateRunID: 'run-id' // Optional: existing duplicate run to continue
|
|
83
|
-
}
|
|
154
|
+
ListID: 'list-uuid',
|
|
155
|
+
EntityID: 'entity-uuid',
|
|
156
|
+
EntityDocumentID: 'doc-uuid'
|
|
84
157
|
};
|
|
85
158
|
|
|
86
|
-
// Execute duplicate detection
|
|
87
159
|
const response = await detector.getDuplicateRecords(request, currentUser);
|
|
88
160
|
|
|
89
161
|
if (response.Status === 'Success') {
|
|
90
|
-
console.log(`Found ${response.PotentialDuplicateResult.length} records with potential duplicates`);
|
|
91
|
-
|
|
92
162
|
for (const result of response.PotentialDuplicateResult) {
|
|
93
|
-
console.log(`Record ${result.RecordCompositeKey.ToString()}
|
|
94
|
-
for (const
|
|
95
|
-
console.log(`
|
|
163
|
+
console.log(`Record: ${result.RecordCompositeKey.ToString()}`);
|
|
164
|
+
for (const dupe of result.Duplicates) {
|
|
165
|
+
console.log(` Match: ${dupe.ToString()} (${(dupe.ProbabilityScore * 100).toFixed(1)}%)`);
|
|
96
166
|
}
|
|
97
167
|
}
|
|
98
168
|
}
|
|
99
169
|
```
|
|
100
170
|
|
|
101
|
-
###
|
|
171
|
+
### Resuming an Existing Run
|
|
102
172
|
|
|
103
173
|
```typescript
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
## API Reference
|
|
115
|
-
|
|
116
|
-
### DuplicateRecordDetector
|
|
117
|
-
|
|
118
|
-
#### `getDuplicateRecords(params: PotentialDuplicateRequest, contextUser?: UserInfo): Promise<PotentialDuplicateResponse>`
|
|
119
|
-
|
|
120
|
-
Performs duplicate detection on records in a list.
|
|
121
|
-
|
|
122
|
-
**Parameters:**
|
|
123
|
-
- `params`: Request parameters including:
|
|
124
|
-
- `ListID`: ID of the list containing records to analyze
|
|
125
|
-
- `EntityID`: ID of the entity type
|
|
126
|
-
- `EntityDocumentID`: ID of the entity document configuration
|
|
127
|
-
- `Options`: Optional configuration including `DuplicateRunID`
|
|
128
|
-
- `contextUser`: Optional user context for permissions
|
|
129
|
-
|
|
130
|
-
**Returns:** `PotentialDuplicateResponse` containing:
|
|
131
|
-
- `Status`: 'Success' or 'Error'
|
|
132
|
-
- `ErrorMessage`: Error details if failed
|
|
133
|
-
- `PotentialDuplicateResult[]`: Array of results for each analyzed record
|
|
134
|
-
|
|
135
|
-
### VectorSyncBase
|
|
136
|
-
|
|
137
|
-
Base class providing utility methods:
|
|
138
|
-
|
|
139
|
-
- `parseStringTemplate(str: string, obj: any): string` - Parse template strings
|
|
140
|
-
- `timer(ms: number): Promise<unknown>` - Async delay utility
|
|
141
|
-
- `start()` / `end()` / `timeDiff()` - Timing utilities
|
|
142
|
-
- `saveJSONData(data: any, path: string)` - JSON file operations
|
|
174
|
+
const request: PotentialDuplicateRequest = {
|
|
175
|
+
ListID: 'list-uuid',
|
|
176
|
+
EntityID: 'entity-uuid',
|
|
177
|
+
EntityDocumentID: 'doc-uuid',
|
|
178
|
+
Options: {
|
|
179
|
+
DuplicateRunID: 'existing-run-uuid'
|
|
180
|
+
}
|
|
181
|
+
};
|
|
143
182
|
|
|
144
|
-
|
|
183
|
+
const response = await detector.getDuplicateRecords(request, currentUser);
|
|
184
|
+
```
|
|
145
185
|
|
|
146
|
-
|
|
186
|
+
## Database Entities Used
|
|
187
|
+
|
|
188
|
+
The package reads from and writes to these MemberJunction entities:
|
|
189
|
+
|
|
190
|
+
```mermaid
|
|
191
|
+
erDiagram
|
|
192
|
+
DUPLICATE_RUN {
|
|
193
|
+
string ID PK
|
|
194
|
+
string EntityID
|
|
195
|
+
string StartedByUserID
|
|
196
|
+
datetime StartedAt
|
|
197
|
+
datetime EndedAt
|
|
198
|
+
string ProcessingStatus
|
|
199
|
+
string ApprovalStatus
|
|
200
|
+
string SourceListID
|
|
201
|
+
}
|
|
147
202
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
203
|
+
DUPLICATE_RUN_DETAIL {
|
|
204
|
+
string ID PK
|
|
205
|
+
string DuplicateRunID FK
|
|
206
|
+
string RecordID
|
|
207
|
+
string MatchStatus
|
|
208
|
+
string MergeStatus
|
|
209
|
+
}
|
|
153
210
|
|
|
154
|
-
|
|
211
|
+
DUPLICATE_RUN_DETAIL_MATCH {
|
|
212
|
+
string ID PK
|
|
213
|
+
string DuplicateRunDetailID FK
|
|
214
|
+
string MatchRecordID
|
|
215
|
+
float MatchProbability
|
|
216
|
+
datetime MatchedAt
|
|
217
|
+
string Action
|
|
218
|
+
string ApprovalStatus
|
|
219
|
+
string MergeStatus
|
|
220
|
+
}
|
|
155
221
|
|
|
156
|
-
|
|
222
|
+
LIST {
|
|
223
|
+
string ID PK
|
|
224
|
+
string Name
|
|
225
|
+
string EntityID
|
|
226
|
+
}
|
|
157
227
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
- **Entity Documents**: Configuration for entity vectorization
|
|
228
|
+
LIST_DETAIL {
|
|
229
|
+
string ID PK
|
|
230
|
+
string ListID FK
|
|
231
|
+
string RecordID
|
|
232
|
+
}
|
|
164
233
|
|
|
165
|
-
|
|
234
|
+
ENTITY_DOCUMENT {
|
|
235
|
+
string ID PK
|
|
236
|
+
string EntityID
|
|
237
|
+
string TemplateID
|
|
238
|
+
string AIModelID
|
|
239
|
+
string VectorDatabaseID
|
|
240
|
+
float PotentialMatchThreshold
|
|
241
|
+
float AbsoluteMatchThreshold
|
|
242
|
+
}
|
|
166
243
|
|
|
167
|
-
|
|
244
|
+
DUPLICATE_RUN ||--o{ DUPLICATE_RUN_DETAIL : contains
|
|
245
|
+
DUPLICATE_RUN_DETAIL ||--o{ DUPLICATE_RUN_DETAIL_MATCH : has
|
|
246
|
+
DUPLICATE_RUN }o--|| LIST : "source"
|
|
247
|
+
LIST ||--o{ LIST_DETAIL : contains
|
|
248
|
+
```
|
|
168
249
|
|
|
169
|
-
|
|
250
|
+
## Environment Variables
|
|
170
251
|
|
|
171
252
|
```env
|
|
172
|
-
# AI Model
|
|
253
|
+
# AI Model API Keys
|
|
173
254
|
OPENAI_API_KEY=your-openai-key
|
|
174
255
|
MISTRAL_API_KEY=your-mistral-key
|
|
175
256
|
|
|
@@ -189,63 +270,37 @@ DB_DATABASE=your-database
|
|
|
189
270
|
CURRENT_USER_EMAIL=user@example.com
|
|
190
271
|
```
|
|
191
272
|
|
|
192
|
-
### Entity Document Templates
|
|
193
|
-
|
|
194
|
-
Entity documents use template syntax to define how records are converted to text for vectorization:
|
|
195
|
-
|
|
196
|
-
```javascript
|
|
197
|
-
// Example template
|
|
198
|
-
const template = "${FirstName} ${LastName} works at ${Company} as ${Title}";
|
|
199
|
-
```
|
|
200
|
-
|
|
201
273
|
## Dependencies
|
|
202
274
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
275
|
+
| Package | Purpose |
|
|
276
|
+
|---|---|
|
|
277
|
+
| `@memberjunction/ai` | `BaseEmbeddings`, `GetAIAPIKey` |
|
|
278
|
+
| `@memberjunction/ai-vectordb` | `VectorDBBase`, `BaseResponse` |
|
|
279
|
+
| `@memberjunction/ai-vectors` | `VectorBase` base class |
|
|
280
|
+
| `@memberjunction/ai-vectors-pinecone` | Pinecone implementation |
|
|
281
|
+
| `@memberjunction/ai-vector-sync` | `EntityVectorSyncer`, `EntityDocumentTemplateParser` |
|
|
282
|
+
| `@memberjunction/aiengine` | AI engine integration |
|
|
283
|
+
| `@memberjunction/core` | Core MJ types and data access |
|
|
284
|
+
| `@memberjunction/core-entities` | Entity type definitions |
|
|
285
|
+
| `@memberjunction/global` | MJGlobal class factory |
|
|
210
286
|
|
|
211
|
-
##
|
|
287
|
+
## Limitations
|
|
212
288
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
5. **Monitor Performance**: Track processing times and optimize for large datasets
|
|
289
|
+
- Duplicate detection operates within a single entity type
|
|
290
|
+
- Requires pre-configured Entity Documents with templates
|
|
291
|
+
- Currently supports Pinecone as the vector database provider
|
|
292
|
+
- Records must be added to a List before detection can run
|
|
218
293
|
|
|
219
|
-
##
|
|
294
|
+
## Development
|
|
220
295
|
|
|
221
|
-
|
|
296
|
+
```bash
|
|
297
|
+
# Build
|
|
298
|
+
npm run build
|
|
222
299
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
const response = await detector.getDuplicateRecords(request, user);
|
|
226
|
-
if (response.Status === 'Error') {
|
|
227
|
-
console.error('Duplicate detection failed:', response.ErrorMessage);
|
|
228
|
-
}
|
|
229
|
-
} catch (error) {
|
|
230
|
-
console.error('Unexpected error:', error.message);
|
|
231
|
-
}
|
|
300
|
+
# Development mode
|
|
301
|
+
npm run start
|
|
232
302
|
```
|
|
233
303
|
|
|
234
|
-
##
|
|
235
|
-
|
|
236
|
-
- Currently supports duplicate detection within a single entity type only
|
|
237
|
-
- Requires pre-configured entity documents with templates
|
|
238
|
-
- Vector database support limited to Pinecone
|
|
239
|
-
- Performance depends on vector database query capabilities
|
|
240
|
-
|
|
241
|
-
## Future Enhancements
|
|
242
|
-
|
|
243
|
-
- Cross-entity duplicate detection
|
|
244
|
-
- Additional vector database providers
|
|
245
|
-
- Batch processing improvements
|
|
246
|
-
- Real-time duplicate prevention
|
|
247
|
-
- Advanced merge strategies
|
|
248
|
-
|
|
249
|
-
## Support
|
|
304
|
+
## License
|
|
250
305
|
|
|
251
|
-
|
|
306
|
+
ISC
|
package/dist/config.js
CHANGED
|
@@ -1,21 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
exports.dbUsername = process.env.DB_USERNAME;
|
|
16
|
-
exports.dbPassword = process.env.DB_PASSWORD;
|
|
17
|
-
exports.dbDatabase = process.env.DB_DATABASE;
|
|
18
|
-
exports.serverPort = Number(process.env.PORT) || 8000;
|
|
19
|
-
exports.currentUserEmail = process.env.CURRENT_USER_EMAIL;
|
|
20
|
-
exports.mistralAPIKey = process.env.MISTRAL_API_KEY;
|
|
1
|
+
import dotenv from 'dotenv';
|
|
2
|
+
dotenv.config({ quiet: true });
|
|
3
|
+
export const openAIAPIKey = process.env.OPENAI_API_KEY;
|
|
4
|
+
export const pineconeHost = process.env.PINECONE_HOST;
|
|
5
|
+
export const pineconeAPIKey = process.env.PINECONE_API_KEY;
|
|
6
|
+
export const pineconeDefaultIndex = process.env.PINECONE_DEFAULT_INDEX;
|
|
7
|
+
export const dbHost = process.env.DB_HOST;
|
|
8
|
+
export const dbPort = Number(process.env.DB_PORT) || 1433;
|
|
9
|
+
export const dbUsername = process.env.DB_USERNAME;
|
|
10
|
+
export const dbPassword = process.env.DB_PASSWORD;
|
|
11
|
+
export const dbDatabase = process.env.DB_DATABASE;
|
|
12
|
+
export const serverPort = Number(process.env.PORT) || 8000;
|
|
13
|
+
export const currentUserEmail = process.env.CURRENT_USER_EMAIL;
|
|
14
|
+
export const mistralAPIKey = process.env.MISTRAL_API_KEY;
|
|
21
15
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAE/B,MAAM,CAAC,MAAM,YAAY,GAAW,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAC/D,MAAM,CAAC,MAAM,YAAY,GAAW,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;AAC9D,MAAM,CAAC,MAAM,cAAc,GAAW,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAAW,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;AAE/E,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AAC1C,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;AAC1D,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAE3D,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAE/D,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC"}
|
|
@@ -1,35 +1,40 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const ai_vectors_1 = require("@memberjunction/ai-vectors");
|
|
10
|
-
const ai_vector_sync_1 = require("@memberjunction/ai-vector-sync");
|
|
11
|
-
class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
|
|
12
|
-
_vectorDB;
|
|
13
|
-
_embedding;
|
|
1
|
+
import { BaseEmbeddings, GetAIAPIKey } from "@memberjunction/ai";
|
|
2
|
+
import { PotentialDuplicateResponse, RunView, PotentialDuplicateResult, Metadata, LogError, RecordMergeRequest, PotentialDuplicate } from "@memberjunction/core";
|
|
3
|
+
import { LogStatus } from "@memberjunction/core";
|
|
4
|
+
import { VectorDBBase } from "@memberjunction/ai-vectordb";
|
|
5
|
+
import { MJGlobal } from "@memberjunction/global";
|
|
6
|
+
import { VectorBase } from "@memberjunction/ai-vectors";
|
|
7
|
+
import { EntityDocumentTemplateParser, EntityVectorSyncer } from "@memberjunction/ai-vector-sync";
|
|
8
|
+
export class DuplicateRecordDetector extends VectorBase {
|
|
14
9
|
constructor() {
|
|
15
10
|
super();
|
|
16
|
-
this._runView = new
|
|
11
|
+
this._runView = new RunView();
|
|
17
12
|
}
|
|
18
13
|
async getDuplicateRecords(params, contextUser) {
|
|
19
14
|
super.CurrentUser = contextUser;
|
|
20
|
-
|
|
15
|
+
//for testing
|
|
16
|
+
//params.EntityID = 25050001;
|
|
17
|
+
//params.EntityDocumentID = 17;
|
|
18
|
+
let vectorizer = new EntityVectorSyncer();
|
|
21
19
|
vectorizer.CurrentUser = super.CurrentUser;
|
|
22
20
|
let entityDocument = await vectorizer.GetEntityDocument(params.EntityDocumentID);
|
|
23
21
|
if (!entityDocument) {
|
|
24
22
|
throw Error(`No Entity Document found with ID ${params.EntityDocumentID}`);
|
|
23
|
+
//Update: No longer creating an entity docuement if one is not found
|
|
24
|
+
//If an entitiy document is not found, that is our indicator that the
|
|
25
|
+
//underlying entity's records have not been vectorized yet
|
|
26
|
+
//const defaultVectorDB: VectorDatabaseEntity = super.getVectorDatabase();
|
|
27
|
+
//const defaultAIModel: AIModelEntity = super.getAIModel();
|
|
28
|
+
//entityDocument = await this.createEntityDocumentForEntity(params.EntityID, defaultVectorDB, defaultAIModel);
|
|
25
29
|
}
|
|
26
|
-
let response = new
|
|
30
|
+
let response = new PotentialDuplicateResponse();
|
|
27
31
|
response.PotentialDuplicateResult = [];
|
|
28
32
|
if (!entityDocument) {
|
|
29
33
|
response.ErrorMessage = `No active Entity Document found for entity ${params.EntityID}`;
|
|
30
34
|
response.Status = 'Error';
|
|
31
35
|
return response;
|
|
32
36
|
}
|
|
37
|
+
//for testing
|
|
33
38
|
const request = {
|
|
34
39
|
entityID: entityDocument.EntityID,
|
|
35
40
|
entityDocumentID: entityDocument.ID,
|
|
@@ -38,26 +43,29 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
|
|
|
38
43
|
CurrentUser: contextUser
|
|
39
44
|
};
|
|
40
45
|
console.log("vectorizing entity...");
|
|
41
|
-
const templateParser =
|
|
46
|
+
const templateParser = EntityDocumentTemplateParser.CreateInstance();
|
|
42
47
|
await vectorizer.VectorizeEntity(request, super.CurrentUser);
|
|
43
48
|
const list = await this.getListEntity(params.ListID);
|
|
44
49
|
let duplicateRun = params.Options?.DuplicateRunID ? await this.getDuplicateRunEntity(params.Options?.DuplicateRunID) : await this.getDuplicateRunEntityByListID(list.ID);
|
|
50
|
+
//let duplicateRun: DuplicateRunEntity = await this.createDuplicateRunRecord(entityDocument, list.ID);
|
|
45
51
|
const duplicateRunDetails = await this.createDuplicateRunDetailRecordsByListID(list.ID, duplicateRun.ID);
|
|
46
|
-
|
|
52
|
+
//await this.createListDetailsForDupeRun(params.RecordIDs, list.ID);
|
|
53
|
+
LogStatus(`Using vector database ${entityDocument.VectorDatabaseID} and AI Model ${entityDocument.AIModelID}`);
|
|
47
54
|
const vectorDB = super.GetVectorDatabase(entityDocument.VectorDatabaseID);
|
|
48
55
|
const aiModel = super.GetAIModel(entityDocument.AIModelID);
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const embeddingAPIKey =
|
|
52
|
-
const vectorDBAPIKey =
|
|
56
|
+
LogStatus(`AIModel driver class: ${aiModel.DriverClass}`);
|
|
57
|
+
LogStatus(`VectorDB class key: ${vectorDB.ClassKey}`);
|
|
58
|
+
const embeddingAPIKey = GetAIAPIKey(aiModel.DriverClass);
|
|
59
|
+
const vectorDBAPIKey = GetAIAPIKey(vectorDB.ClassKey);
|
|
53
60
|
if (!embeddingAPIKey) {
|
|
54
61
|
throw Error(`No API Key found for AI Model ${aiModel.DriverClass}`);
|
|
55
62
|
}
|
|
56
63
|
if (!vectorDBAPIKey) {
|
|
57
64
|
throw Error(`No API Key found for Vector Database ${vectorDB.ClassKey}`);
|
|
58
65
|
}
|
|
59
|
-
|
|
60
|
-
this.
|
|
66
|
+
//LogStatus(`Embedding API Key: ${embeddingAPIKey} VectorDB API Key: ${vectorDBAPIKey}`);
|
|
67
|
+
this._embedding = MJGlobal.Instance.ClassFactory.CreateInstance(BaseEmbeddings, aiModel.DriverClass, embeddingAPIKey);
|
|
68
|
+
this._vectorDB = MJGlobal.Instance.ClassFactory.CreateInstance(VectorDBBase, vectorDB.ClassKey, vectorDBAPIKey);
|
|
61
69
|
if (!this._embedding) {
|
|
62
70
|
throw Error(`Failed to create Embeddings instance for AI Model ${aiModel.DriverClass}`);
|
|
63
71
|
}
|
|
@@ -66,14 +74,16 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
|
|
|
66
74
|
}
|
|
67
75
|
let records = await this.GetRecordsByListID(list.ID, entityDocument.EntityID);
|
|
68
76
|
if (records.length === 0) {
|
|
69
|
-
|
|
77
|
+
LogError(`No records found in list ${list.Name}, with listID ${list.ID} and EntityID ${entityDocument.EntityID} exiting early`);
|
|
70
78
|
response.ErrorMessage = `No records found in list ${list.Name}`;
|
|
71
79
|
response.Status = 'Error';
|
|
72
80
|
return response;
|
|
73
81
|
}
|
|
74
|
-
|
|
82
|
+
LogStatus("Vectorizing " + records.length + " records");
|
|
75
83
|
const recordTemplates = [];
|
|
84
|
+
//Relationship(entityID: number, entityRecord: any, relationshipName: string, maxRows: number, entityDocumentName: string)
|
|
76
85
|
let sampleTemplate = entityDocument.Template;
|
|
86
|
+
//sampleTemplate += " ${Relationship('Deals', 5, 'Sample Relationship Document for crm.Deals Entity')} ${Relationship('Deals', 5, 'Second Sample Relationship Document for crm.Deals Entity')}";
|
|
77
87
|
for (const record of records) {
|
|
78
88
|
const template = await templateParser.Parse(sampleTemplate, entityDocument.EntityID, record, contextUser);
|
|
79
89
|
recordTemplates.push(template);
|
|
@@ -85,7 +95,7 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
|
|
|
85
95
|
const compositeKey = records[index].PrimaryKey;
|
|
86
96
|
let filterResult = await this._vectorDB.queryIndex({ vector: vector, topK: topK, includeMetadata: true, includeValues: false });
|
|
87
97
|
if (!filterResult.success) {
|
|
88
|
-
|
|
98
|
+
LogError(`Failed to query index for record ${compositeKey.ToString()}`);
|
|
89
99
|
continue;
|
|
90
100
|
}
|
|
91
101
|
let queryResult = await this.getVectorDuplicates(filterResult);
|
|
@@ -95,6 +105,7 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
|
|
|
95
105
|
queryResult.EntityID = entityDocument.EntityID;
|
|
96
106
|
queryResult.RecordCompositeKey = compositeKey;
|
|
97
107
|
results.push(queryResult);
|
|
108
|
+
//now update all of the dupe run detail records
|
|
98
109
|
let dupeRunDetail = duplicateRunDetails.find((detail) => detail.RecordID === compositeKey.Values());
|
|
99
110
|
if (dupeRunDetail) {
|
|
100
111
|
const matchRecords = await this.createDuplicateRunDetailMatchesForRecord(dupeRunDetail.ID, queryResult);
|
|
@@ -102,13 +113,14 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
|
|
|
102
113
|
dupeRunDetail.MatchStatus = 'Complete';
|
|
103
114
|
let success = await super.SaveEntity(dupeRunDetail);
|
|
104
115
|
if (!success) {
|
|
105
|
-
|
|
116
|
+
LogStatus(`Failed to update Duplicate Run Detail record ${dupeRunDetail.ID}`);
|
|
106
117
|
}
|
|
107
118
|
}
|
|
108
119
|
else {
|
|
109
|
-
|
|
120
|
+
LogError(`Failed to find Duplicate Run Detail record for ${compositeKey.ToString()}`);
|
|
110
121
|
}
|
|
111
122
|
}
|
|
123
|
+
//almost done
|
|
112
124
|
duplicateRun.ProcessingStatus = 'Complete';
|
|
113
125
|
duplicateRun.EndedAt = new Date();
|
|
114
126
|
let success = await super.SaveEntity(duplicateRun);
|
|
@@ -118,8 +130,8 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
|
|
|
118
130
|
await this.mergeRecords(response, entityDocument);
|
|
119
131
|
response.PotentialDuplicateResult = results;
|
|
120
132
|
response.Status = 'Success';
|
|
121
|
-
|
|
122
|
-
|
|
133
|
+
LogStatus("Dupe Run complete. Response:");
|
|
134
|
+
LogStatus(JSON.stringify(response, null, "\t"));
|
|
123
135
|
return response;
|
|
124
136
|
}
|
|
125
137
|
async GetRecordsByListID(listID, entityID) {
|
|
@@ -138,7 +150,7 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
|
|
|
138
150
|
return rvResult.Results;
|
|
139
151
|
}
|
|
140
152
|
async createDuplicateRunRecord(entityDocument, listID) {
|
|
141
|
-
const md = new
|
|
153
|
+
const md = new Metadata();
|
|
142
154
|
let duplicateRun = await md.GetEntityObject('Duplicate Runs');
|
|
143
155
|
duplicateRun.NewRecord();
|
|
144
156
|
duplicateRun.EntityID = entityDocument.EntityID;
|
|
@@ -155,7 +167,7 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
|
|
|
155
167
|
}
|
|
156
168
|
async createDuplicateRunDetailRecords(recordIDs, duplicateRunID) {
|
|
157
169
|
let results = [];
|
|
158
|
-
const md = new
|
|
170
|
+
const md = new Metadata();
|
|
159
171
|
for (const recordID of recordIDs) {
|
|
160
172
|
let runDetail = await md.GetEntityObject('Duplicate Run Details');
|
|
161
173
|
runDetail.NewRecord();
|
|
@@ -180,7 +192,7 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
|
|
|
180
192
|
if (!viewResults.Success) {
|
|
181
193
|
throw new Error(viewResults.ErrorMessage);
|
|
182
194
|
}
|
|
183
|
-
const md = new
|
|
195
|
+
const md = new Metadata();
|
|
184
196
|
const listDetails = viewResults.Results;
|
|
185
197
|
for (const listDetail of listDetails) {
|
|
186
198
|
let runDetail = await md.GetEntityObject('Duplicate Run Details');
|
|
@@ -194,13 +206,13 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
|
|
|
194
206
|
results.push(runDetail);
|
|
195
207
|
}
|
|
196
208
|
else {
|
|
197
|
-
|
|
209
|
+
LogError("Failed to save DuplicateRunDetailEntity", undefined, runDetail.LatestResult);
|
|
198
210
|
}
|
|
199
211
|
}
|
|
200
212
|
return results;
|
|
201
213
|
}
|
|
202
214
|
async getListEntity(listID) {
|
|
203
|
-
const md = new
|
|
215
|
+
const md = new Metadata();
|
|
204
216
|
let list = await md.GetEntityObject('Lists');
|
|
205
217
|
list.ContextCurrentUser = super.CurrentUser;
|
|
206
218
|
const success = await list.Load(listID);
|
|
@@ -210,7 +222,7 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
|
|
|
210
222
|
return list;
|
|
211
223
|
}
|
|
212
224
|
async getDuplicateRunEntity(DupeRunID) {
|
|
213
|
-
const md = new
|
|
225
|
+
const md = new Metadata();
|
|
214
226
|
let dupeRun = await md.GetEntityObject('Duplicate Runs');
|
|
215
227
|
dupeRun.ContextCurrentUser = super.CurrentUser;
|
|
216
228
|
const success = await dupeRun.Load(DupeRunID);
|
|
@@ -227,7 +239,7 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
|
|
|
227
239
|
return entity;
|
|
228
240
|
}
|
|
229
241
|
async createListForDupeRun(entityDocument) {
|
|
230
|
-
const md = new
|
|
242
|
+
const md = new Metadata();
|
|
231
243
|
const list = await md.GetEntityObject('Lists');
|
|
232
244
|
list.NewRecord();
|
|
233
245
|
list.Name = `Potential Duplicate Run`;
|
|
@@ -241,7 +253,7 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
|
|
|
241
253
|
return list;
|
|
242
254
|
}
|
|
243
255
|
async createDuplicateRunDetailMatchesForRecord(DuplicateRunDetailID, duplicateResult) {
|
|
244
|
-
const md = new
|
|
256
|
+
const md = new Metadata();
|
|
245
257
|
let matchRecords = [];
|
|
246
258
|
for (const dupe of duplicateResult.Duplicates) {
|
|
247
259
|
const match = await md.GetEntityObject('Duplicate Run Detail Matches');
|
|
@@ -262,14 +274,16 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
|
|
|
262
274
|
return matchRecords;
|
|
263
275
|
}
|
|
264
276
|
async mergeRecords(dupeResponse, entityDocument) {
|
|
265
|
-
const md = new
|
|
277
|
+
const md = new Metadata();
|
|
266
278
|
for (const dupeResult of dupeResponse.PotentialDuplicateResult) {
|
|
267
279
|
for (const [index, dupe] of dupeResult.Duplicates.entries()) {
|
|
268
280
|
if (dupe.ToString() === dupeResult.RecordCompositeKey.ToString()) {
|
|
281
|
+
//same record, skip
|
|
269
282
|
continue;
|
|
270
283
|
}
|
|
271
284
|
if (dupe.ProbabilityScore >= entityDocument.AbsoluteMatchThreshold) {
|
|
272
|
-
|
|
285
|
+
//merge
|
|
286
|
+
let mergeParams = new RecordMergeRequest();
|
|
273
287
|
mergeParams.EntityName = entityDocument.Entity;
|
|
274
288
|
mergeParams.SurvivingRecordCompositeKey = dupeResult.RecordCompositeKey;
|
|
275
289
|
mergeParams.RecordsToMerge = [dupe];
|
|
@@ -278,7 +292,7 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
|
|
|
278
292
|
let dupeRunMatchRecord = await md.GetEntityObject('Duplicate Run Detail Matches', super.CurrentUser);
|
|
279
293
|
let loadResult = await dupeRunMatchRecord.Load(dupeResult.DuplicateRunDetailMatchRecordIDs[index]);
|
|
280
294
|
if (!loadResult) {
|
|
281
|
-
|
|
295
|
+
LogError(`Failed to load Duplicate Run Match record ${dupeResult.DuplicateRunDetailMatchRecordIDs[index]}`);
|
|
282
296
|
continue;
|
|
283
297
|
}
|
|
284
298
|
dupeRunMatchRecord.MergeStatus = 'Complete';
|
|
@@ -286,28 +300,28 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
|
|
|
286
300
|
dupeRunMatchRecord.MergedAt = new Date();
|
|
287
301
|
let saveResult = await dupeRunMatchRecord.Save();
|
|
288
302
|
if (!saveResult) {
|
|
289
|
-
|
|
303
|
+
LogError(`Failed to update Duplicate Run Match record ${dupeRunMatchRecord.ID}`);
|
|
290
304
|
}
|
|
291
305
|
}
|
|
292
306
|
else {
|
|
293
|
-
|
|
307
|
+
LogError(`Failed to merge records ${dupeResult.RecordCompositeKey.ToString()} and ${dupe.ToString()}`);
|
|
294
308
|
}
|
|
295
309
|
}
|
|
296
310
|
}
|
|
297
311
|
}
|
|
298
312
|
}
|
|
299
313
|
async getVectorDuplicates(queryResponse) {
|
|
300
|
-
let response = new
|
|
314
|
+
let response = new PotentialDuplicateResult();
|
|
301
315
|
for (const match of queryResponse.data.matches) {
|
|
302
316
|
const record = match;
|
|
303
317
|
if (!record || !record.id) {
|
|
304
318
|
continue;
|
|
305
319
|
}
|
|
306
320
|
if (!record.metadata || !record.metadata.RecordID) {
|
|
307
|
-
|
|
321
|
+
LogError(`Invalid vector metadata: ${record.id}`);
|
|
308
322
|
continue;
|
|
309
323
|
}
|
|
310
|
-
let duplicate = new
|
|
324
|
+
let duplicate = new PotentialDuplicate();
|
|
311
325
|
duplicate.LoadFromConcatenatedString(record.metadata.RecordID);
|
|
312
326
|
duplicate.ProbabilityScore = record.score;
|
|
313
327
|
response.Duplicates.push(duplicate);
|
|
@@ -315,5 +329,4 @@ class DuplicateRecordDetector extends ai_vectors_1.VectorBase {
|
|
|
315
329
|
return response;
|
|
316
330
|
}
|
|
317
331
|
}
|
|
318
|
-
exports.DuplicateRecordDetector = DuplicateRecordDetector;
|
|
319
332
|
//# sourceMappingURL=duplicateRecordDetector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duplicateRecordDetector.js","sourceRoot":"","sources":["../src/duplicateRecordDetector.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"duplicateRecordDetector.js","sourceRoot":"","sources":["../src/duplicateRecordDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,44 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.VectorSyncBase = void 0;
|
|
27
|
-
const fs = __importStar(require("fs"));
|
|
28
|
-
class VectorSyncBase {
|
|
29
|
-
_contextUser;
|
|
30
|
-
_runView;
|
|
31
|
-
_startTime;
|
|
32
|
-
_endTime;
|
|
33
|
-
_pineconeDB;
|
|
34
|
-
_embedding;
|
|
35
|
-
_languageModel;
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
export class VectorSyncBase {
|
|
36
3
|
async timer(ms) {
|
|
37
4
|
return new Promise(res => setTimeout(res, ms));
|
|
38
5
|
}
|
|
39
6
|
parseStringTemplate(str, obj) {
|
|
7
|
+
//Split string into non-argument textual parts
|
|
40
8
|
let parts = str.split(/\$\{(?!\d)[\wæøåÆØÅ]*\}/);
|
|
9
|
+
//Split string into property names. Empty array if match fails.
|
|
41
10
|
let args = str.match(/[^{\}]+(?=})/g) || [];
|
|
11
|
+
//Map parameters from obj by property name. Solution is limited by shallow one level mapping.
|
|
12
|
+
//Undefined values are substituted with an empty string, but other falsy values are accepted.
|
|
42
13
|
let parameters = args.map(argument => obj[argument] || (obj[argument] === undefined ? "" : obj[argument]));
|
|
43
14
|
return String.raw({ raw: parts }, ...parameters);
|
|
44
15
|
}
|
|
@@ -49,8 +20,10 @@ class VectorSyncBase {
|
|
|
49
20
|
this._endTime = new Date();
|
|
50
21
|
}
|
|
51
22
|
timeDiff() {
|
|
52
|
-
let timeDiff = this._endTime.valueOf() - this._startTime.valueOf();
|
|
23
|
+
let timeDiff = this._endTime.valueOf() - this._startTime.valueOf(); //in ms
|
|
24
|
+
// strip the ms
|
|
53
25
|
timeDiff /= 1000;
|
|
26
|
+
// get seconds
|
|
54
27
|
var seconds = Math.round(timeDiff);
|
|
55
28
|
return seconds;
|
|
56
29
|
}
|
|
@@ -66,5 +39,4 @@ class VectorSyncBase {
|
|
|
66
39
|
return true;
|
|
67
40
|
}
|
|
68
41
|
}
|
|
69
|
-
exports.VectorSyncBase = VectorSyncBase;
|
|
70
42
|
//# sourceMappingURL=vectorSyncBase.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vectorSyncBase.js","sourceRoot":"","sources":["../../src/generic/vectorSyncBase.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vectorSyncBase.js","sourceRoot":"","sources":["../../src/generic/vectorSyncBase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAKzB,MAAM,OAAO,cAAc;IAWb,KAAK,CAAC,KAAK,CAAC,EAAU;QAC5B,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IAES,mBAAmB,CAAC,GAAW,EAAE,GAAQ;QAC/C,8CAA8C;QAC9C,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAEjD,+DAA+D;QAC/D,IAAI,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;QAE5C,8FAA8F;QAC9F,6FAA6F;QAC7F,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC3G,OAAO,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,GAAG,UAAU,CAAC,CAAC;IACrD,CAAC;IAES,KAAK;QACX,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;IACjC,CAAC;IAES,GAAG;QACT,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;IAC/B,CAAC;IAES,QAAQ;QACd,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO;QAC3E,eAAe;QACf,QAAQ,IAAI,IAAI,CAAC;QAEjB,eAAe;QACf,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,OAAO,CAAC;IACnB,CAAC;IAES,YAAY,CAAC,IAAS,EAAE,IAAY;QAC1C,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IAES,OAAO,CAAC,GAAG;QACjB,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;YACvB,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC7B,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from './generic/vectorSyncBase';
|
|
2
|
-
export * from './models/entitySyncConfig';
|
|
3
|
-
export * from './duplicateRecordDetector';
|
|
1
|
+
export * from './generic/vectorSyncBase.js';
|
|
2
|
+
export * from './models/entitySyncConfig.js';
|
|
3
|
+
export * from './duplicateRecordDetector.js';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -1,20 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./generic/vectorSyncBase"), exports);
|
|
18
|
-
__exportStar(require("./models/entitySyncConfig"), exports);
|
|
19
|
-
__exportStar(require("./duplicateRecordDetector"), exports);
|
|
1
|
+
export * from './generic/vectorSyncBase.js';
|
|
2
|
+
export * from './models/entitySyncConfig.js';
|
|
3
|
+
export * from './duplicateRecordDetector.js';
|
|
20
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC"}
|
|
@@ -1,11 +1,36 @@
|
|
|
1
1
|
import { RunViewParams } from "@memberjunction/core";
|
|
2
2
|
export type EntitySyncConfig = {
|
|
3
|
+
/**
|
|
4
|
+
* The ID of the entity document to use
|
|
5
|
+
*/
|
|
3
6
|
EntityDocumentID: string;
|
|
7
|
+
/**
|
|
8
|
+
* The time, in seconds, inbetween each run
|
|
9
|
+
*/
|
|
4
10
|
Interval: number;
|
|
11
|
+
/**
|
|
12
|
+
* The parameters to use when running the dynamic view.
|
|
13
|
+
* Note that the EntityName property will be overriden
|
|
14
|
+
* and set to the value of the Entity Document's Type field
|
|
15
|
+
* */
|
|
5
16
|
RunViewParams: RunViewParams;
|
|
17
|
+
/**
|
|
18
|
+
* If the given entity should be included in the sync
|
|
19
|
+
*/
|
|
6
20
|
IncludeInSync: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* The last time the sync was run for this entitiy
|
|
23
|
+
* format is Month day, year hour:minute:second
|
|
24
|
+
* e.g. August 19, 1975 23:15:30
|
|
25
|
+
*/
|
|
7
26
|
LastRunDate: string;
|
|
27
|
+
/**
|
|
28
|
+
* The ID of the vector index to use
|
|
29
|
+
*/
|
|
8
30
|
VectorIndexID: number;
|
|
31
|
+
/**
|
|
32
|
+
* The ID of the vector database to use
|
|
33
|
+
*/
|
|
9
34
|
VectorID: number;
|
|
10
35
|
};
|
|
11
36
|
//# sourceMappingURL=entitySyncConfig.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entitySyncConfig.d.ts","sourceRoot":"","sources":["../../src/models/entitySyncConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,MAAM,gBAAgB,GAAG;
|
|
1
|
+
{"version":3,"file":"entitySyncConfig.d.ts","sourceRoot":"","sources":["../../src/models/entitySyncConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,MAAM,gBAAgB,GAAG;IAC3B;;OAEG;IACH,gBAAgB,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;SAIK;IACL,aAAa,EAAE,aAAa,CAAC;IAC7B;;OAEG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;CACnB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ai-vector-dupe",
|
|
3
|
-
"
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "4.1.0",
|
|
4
5
|
"description": "MemberJunction: AI Vector/Entity Sync Package - Handles synchronization between Vector DB and MJ CDP Data",
|
|
5
6
|
"main": "dist/index.js",
|
|
6
7
|
"types": "dist/index.d.ts",
|
|
@@ -9,28 +10,28 @@
|
|
|
9
10
|
],
|
|
10
11
|
"scripts": {
|
|
11
12
|
"start": "ts-node-dev src/index.ts",
|
|
12
|
-
"build": "tsc",
|
|
13
|
+
"build": "tsc && tsc-alias -f",
|
|
13
14
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
14
15
|
},
|
|
15
16
|
"author": "MemberJunction.com",
|
|
16
17
|
"license": "ISC",
|
|
17
18
|
"dependencies": {
|
|
18
|
-
"@memberjunction/ai": "
|
|
19
|
-
"@memberjunction/ai-vectordb": "
|
|
20
|
-
"@memberjunction/ai-vectors": "
|
|
21
|
-
"@memberjunction/ai-vectors-pinecone": "
|
|
22
|
-
"@memberjunction/ai-vector-sync": "
|
|
23
|
-
"@memberjunction/aiengine": "
|
|
24
|
-
"@memberjunction/core": "
|
|
25
|
-
"@memberjunction/global": "
|
|
26
|
-
"@memberjunction/core-entities": "
|
|
27
|
-
"dotenv": "^
|
|
19
|
+
"@memberjunction/ai": "4.1.0",
|
|
20
|
+
"@memberjunction/ai-vectordb": "4.1.0",
|
|
21
|
+
"@memberjunction/ai-vectors": "4.1.0",
|
|
22
|
+
"@memberjunction/ai-vectors-pinecone": "4.1.0",
|
|
23
|
+
"@memberjunction/ai-vector-sync": "4.1.0",
|
|
24
|
+
"@memberjunction/aiengine": "4.1.0",
|
|
25
|
+
"@memberjunction/core": "4.1.0",
|
|
26
|
+
"@memberjunction/global": "4.1.0",
|
|
27
|
+
"@memberjunction/core-entities": "4.1.0",
|
|
28
|
+
"dotenv": "^17.2.4"
|
|
28
29
|
},
|
|
29
30
|
"devDependencies": {
|
|
30
|
-
"@types/mssql": "^9.1.
|
|
31
|
-
"@types/node": "
|
|
31
|
+
"@types/mssql": "^9.1.9",
|
|
32
|
+
"@types/node": "24.10.11",
|
|
32
33
|
"ts-node-dev": "^2.0.0",
|
|
33
|
-
"typescript": "^5.
|
|
34
|
+
"typescript": "^5.9.3"
|
|
34
35
|
},
|
|
35
36
|
"repository": {
|
|
36
37
|
"type": "git",
|