@memberjunction/ai-recommendations 4.4.0 → 5.0.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/dist/Engine.d.ts +2 -2
- package/dist/Engine.d.ts.map +1 -1
- package/dist/Engine.js +7 -7
- package/dist/Engine.js.map +1 -1
- package/dist/ProviderBase.d.ts +3 -3
- package/dist/ProviderBase.d.ts.map +1 -1
- package/dist/ProviderBase.js.map +1 -1
- package/dist/generic/types.d.ts +5 -5
- package/dist/generic/types.d.ts.map +1 -1
- package/dist/generic/types.js.map +1 -1
- package/package.json +5 -5
- package/README.md +0 -376
package/dist/Engine.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BaseEngine, UserInfo, IMetadataProvider } from '@memberjunction/core';
|
|
2
|
-
import {
|
|
2
|
+
import { MJRecommendationProviderEntity } from '@memberjunction/core-entities';
|
|
3
3
|
import { RecommendationRequest, RecommendationResult } from './generic/types.js';
|
|
4
4
|
/**
|
|
5
5
|
* Engine class to be used for running all recommendation requests
|
|
@@ -7,7 +7,7 @@ import { RecommendationRequest, RecommendationResult } from './generic/types.js'
|
|
|
7
7
|
export declare class RecommendationEngineBase extends BaseEngine<RecommendationEngineBase> {
|
|
8
8
|
private _RecommendationProviders;
|
|
9
9
|
static get Instance(): RecommendationEngineBase;
|
|
10
|
-
get RecommendationProviders():
|
|
10
|
+
get RecommendationProviders(): MJRecommendationProviderEntity[];
|
|
11
11
|
Config(forceRefresh?: boolean, contextUser?: UserInfo, provider?: IMetadataProvider): Promise<void>;
|
|
12
12
|
Recommend<T>(request: RecommendationRequest<T>): Promise<RecommendationResult>;
|
|
13
13
|
private GetRecommendationEntities;
|
package/dist/Engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Engine.d.ts","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAY,QAAQ,EAA4C,iBAAiB,EAA4B,MAAM,sBAAsB,CAAC;AAC7J,OAAO,
|
|
1
|
+
{"version":3,"file":"Engine.d.ts","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAY,QAAQ,EAA4C,iBAAiB,EAA4B,MAAM,sBAAsB,CAAC;AAC7J,OAAO,EAAkF,8BAA8B,EAA6B,MAAM,+BAA+B,CAAC;AAG1L,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE9E;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,UAAU,CAAC,wBAAwB,CAAC;IAChF,OAAO,CAAC,wBAAwB,CAAwC;IAExE,WAAkB,QAAQ,IAAI,wBAAwB,CAErD;IAED,IAAW,uBAAuB,IAAI,8BAA8B,EAAE,CAErE;IAEY,MAAM,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,iBAAiB;IAYnF,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC;YAuE7E,yBAAyB;YA4BzB,0BAA0B;YAoE1B,6BAA6B;YAiC7B,6BAA6B;IAmB3C,OAAO,CAAC,iBAAiB;CAG1B"}
|
package/dist/Engine.js
CHANGED
|
@@ -19,7 +19,7 @@ export class RecommendationEngineBase extends BaseEngine {
|
|
|
19
19
|
const params = [
|
|
20
20
|
{
|
|
21
21
|
PropertyName: '_RecommendationProviders',
|
|
22
|
-
EntityName: 'Recommendation Providers',
|
|
22
|
+
EntityName: 'MJ: Recommendation Providers',
|
|
23
23
|
CacheLocal: true
|
|
24
24
|
},
|
|
25
25
|
];
|
|
@@ -52,7 +52,7 @@ export class RecommendationEngineBase extends BaseEngine {
|
|
|
52
52
|
}
|
|
53
53
|
request.Recommendations = recommendations;
|
|
54
54
|
// load the run
|
|
55
|
-
const recommendationRunEntity = await new Metadata().GetEntityObject('Recommendation Runs', request.CurrentUser);
|
|
55
|
+
const recommendationRunEntity = await new Metadata().GetEntityObject('MJ: Recommendation Runs', request.CurrentUser);
|
|
56
56
|
recommendationRunEntity.NewRecord();
|
|
57
57
|
// update status for current run
|
|
58
58
|
recommendationRunEntity.Status = 'In Progress';
|
|
@@ -109,12 +109,12 @@ export class RecommendationEngineBase extends BaseEngine {
|
|
|
109
109
|
const md = new Metadata();
|
|
110
110
|
const rvListDetailsResult = await rv.RunViews([
|
|
111
111
|
{
|
|
112
|
-
EntityName: 'Lists',
|
|
112
|
+
EntityName: 'MJ: Lists',
|
|
113
113
|
ExtraFilter: `ID = '${listID}'`,
|
|
114
114
|
ResultType: 'simple'
|
|
115
115
|
},
|
|
116
116
|
{
|
|
117
|
-
EntityName: 'List Details',
|
|
117
|
+
EntityName: 'MJ: List Details',
|
|
118
118
|
ExtraFilter: `ListID = '${listID}'`,
|
|
119
119
|
ResultType: 'simple',
|
|
120
120
|
IgnoreMaxRows: true,
|
|
@@ -152,7 +152,7 @@ export class RecommendationEngineBase extends BaseEngine {
|
|
|
152
152
|
}
|
|
153
153
|
let recommendations = [];
|
|
154
154
|
for (const entity of rvEntityResult.Results) {
|
|
155
|
-
const recommendationEntity = await md.GetEntityObject('Recommendations', currentUser);
|
|
155
|
+
const recommendationEntity = await md.GetEntityObject('MJ: Recommendations', currentUser);
|
|
156
156
|
recommendationEntity.NewRecord();
|
|
157
157
|
recommendationEntity.SourceEntityID = entityID;
|
|
158
158
|
recommendationEntity.SourceEntityRecordID = entity.ID;
|
|
@@ -180,7 +180,7 @@ export class RecommendationEngineBase extends BaseEngine {
|
|
|
180
180
|
}
|
|
181
181
|
let recommendations = [];
|
|
182
182
|
for (const entity of rvEntityResult.Results) {
|
|
183
|
-
const recommendationEntity = await md.GetEntityObject('Recommendations', currentUser);
|
|
183
|
+
const recommendationEntity = await md.GetEntityObject('MJ: Recommendations', currentUser);
|
|
184
184
|
recommendationEntity.NewRecord();
|
|
185
185
|
recommendationEntity.SourceEntityID = entity.ID;
|
|
186
186
|
recommendations.push(recommendationEntity);
|
|
@@ -189,7 +189,7 @@ export class RecommendationEngineBase extends BaseEngine {
|
|
|
189
189
|
}
|
|
190
190
|
async CreateRecommendationErrorList(recommendationRunID, entityID, currentUser) {
|
|
191
191
|
const md = new Metadata();
|
|
192
|
-
const list = await md.GetEntityObject('Lists', currentUser);
|
|
192
|
+
const list = await md.GetEntityObject('MJ: Lists', currentUser);
|
|
193
193
|
list.Name = `Recommendation Run ${recommendationRunID} Errors`;
|
|
194
194
|
list.EntityID = entityID;
|
|
195
195
|
list.UserID = currentUser ? currentUser.ID : super.ContextUser.ID;
|
package/dist/Engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Engine.js","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAY,SAAS,EAAE,OAAO,EAAc,QAAQ,EAA+C,MAAM,sBAAsB,CAAC;AAE7J,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAG5D;;GAEG;AACH,MAAM,OAAO,wBAAyB,SAAQ,UAAoC;IAAlF;;QACU,6BAAwB,
|
|
1
|
+
{"version":3,"file":"Engine.js","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"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"}
|
package/dist/ProviderBase.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MJRecommendationEntity, MJRecommendationItemEntity } from '@memberjunction/core-entities';
|
|
2
2
|
import { UserInfo } from '@memberjunction/core';
|
|
3
3
|
import { RecommendationRequest, RecommendationResult } from './generic/types.js';
|
|
4
4
|
/**
|
|
@@ -11,7 +11,7 @@ export declare abstract class RecommendationProviderBase {
|
|
|
11
11
|
get ContextUser(): UserInfo;
|
|
12
12
|
/**
|
|
13
13
|
* For each entry in the request.Recommendations array, the provider's external API is called to
|
|
14
|
-
* produce zero or more {@link
|
|
14
|
+
* produce zero or more {@link MJRecommendationItemEntity} records.
|
|
15
15
|
*
|
|
16
16
|
* @param request - The Recommendations to request from this provider
|
|
17
17
|
*/
|
|
@@ -22,6 +22,6 @@ export declare abstract class RecommendationProviderBase {
|
|
|
22
22
|
* @param recommendation
|
|
23
23
|
* @param RunID
|
|
24
24
|
*/
|
|
25
|
-
protected SaveRecommendation(recommendation:
|
|
25
|
+
protected SaveRecommendation(recommendation: MJRecommendationEntity, RunID: string, items: MJRecommendationItemEntity[]): Promise<boolean>;
|
|
26
26
|
}
|
|
27
27
|
//# sourceMappingURL=ProviderBase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProviderBase.d.ts","sourceRoot":"","sources":["../src/ProviderBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ProviderBase.d.ts","sourceRoot":"","sources":["../src/ProviderBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AACnG,OAAO,EAAsB,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE9E;;GAEG;AACH,8BAAsB,0BAA0B;IAC9C,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,YAAY,CAAW;gBAEZ,WAAW,EAAE,QAAQ;IAKxC,IAAW,WAAW,IAAI,QAAQ,CAEjC;IAED;;;;;OAKG;aACa,SAAS,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAExF;;;;;OAKG;cACa,kBAAkB,CAAC,cAAc,EAAE,sBAAsB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,0BAA0B,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CAoBjJ"}
|
package/dist/ProviderBase.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProviderBase.js","sourceRoot":"","sources":["../src/ProviderBase.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAY,MAAM,sBAAsB,CAAC;AAGpE;;GAEG;AACH,MAAM,OAAgB,0BAA0B;IAI9C,YAAmB,WAAqB;QACtC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC5B,CAAC;IAED,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAUD;;;;;OAKG;IACO,KAAK,CAAC,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"ProviderBase.js","sourceRoot":"","sources":["../src/ProviderBase.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAY,MAAM,sBAAsB,CAAC;AAGpE;;GAEG;AACH,MAAM,OAAgB,0BAA0B;IAI9C,YAAmB,WAAqB;QACtC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC5B,CAAC;IAED,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAUD;;;;;OAKG;IACO,KAAK,CAAC,kBAAkB,CAAC,cAAsC,EAAE,KAAa,EAAE,KAAmC;QAC3H,cAAc,CAAC,mBAAmB,GAAG,KAAK,CAAC;QAC3C,MAAM,wBAAwB,GAAY,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QACtE,IAAG,CAAC,wBAAwB,EAAE,CAAC;YAC7B,QAAQ,CAAC,mCAAmC,cAAc,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC;YACzG,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,QAAQ,GAAY,IAAI,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,gBAAgB,GAAG,cAAc,CAAC,EAAE,CAAC;YAC1C,MAAM,UAAU,GAAY,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAG,CAAC,UAAU,EAAE,CAAC;gBACf,QAAQ,CAAC,uDAAuD,cAAc,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gBACnH,QAAQ,GAAG,KAAK,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
|
package/dist/generic/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { UserInfo } from "@memberjunction/core";
|
|
2
|
-
import {
|
|
2
|
+
import { MJRecommendationEntity, MJRecommendationItemEntity, MJRecommendationProviderEntity, MJRecommendationRunEntity } from "@memberjunction/core-entities";
|
|
3
3
|
/**
|
|
4
4
|
* Used to make requests to Recommendation providers
|
|
5
5
|
*/
|
|
@@ -15,7 +15,7 @@ export declare class RecommendationRequest<T = Record<string, any>> {
|
|
|
15
15
|
* to save the Recommendation records. This will be done as the batch is processed. You cannot save a Recommendation record until a Run is created
|
|
16
16
|
* which is done by the RecommendationEngineBase.Recommend() method.
|
|
17
17
|
*/
|
|
18
|
-
Recommendations?:
|
|
18
|
+
Recommendations?: MJRecommendationEntity[];
|
|
19
19
|
/**
|
|
20
20
|
* This is an optional field that can be passed in instead of the Recommendations field. If passed in,
|
|
21
21
|
* the Recommendations field will be populated with Recommendation Entities whose Primary key value matches any of the RecordIDs passed in.
|
|
@@ -35,7 +35,7 @@ export declare class RecommendationRequest<T = Record<string, any>> {
|
|
|
35
35
|
/**
|
|
36
36
|
* The specific provider to use for the request. Leave this undefined if you want to use the default provider.
|
|
37
37
|
*/
|
|
38
|
-
Provider?:
|
|
38
|
+
Provider?: MJRecommendationProviderEntity;
|
|
39
39
|
/**
|
|
40
40
|
* UserInfo object to use when applicable.
|
|
41
41
|
*/
|
|
@@ -62,11 +62,11 @@ export declare class RecommendationResult {
|
|
|
62
62
|
/**
|
|
63
63
|
* The Recommendation Run entity that was created by the recommendation engine
|
|
64
64
|
*/
|
|
65
|
-
RecommendationRun?:
|
|
65
|
+
RecommendationRun?: MJRecommendationRunEntity;
|
|
66
66
|
/**
|
|
67
67
|
* The Recommendation Item Entities that were created by the recommendation provider
|
|
68
68
|
*/
|
|
69
|
-
RecommendationItems?:
|
|
69
|
+
RecommendationItems?: MJRecommendationItemEntity[];
|
|
70
70
|
Success: boolean;
|
|
71
71
|
ErrorMessage: string;
|
|
72
72
|
constructor(request: RecommendationRequest);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/generic/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/generic/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,8BAA8B,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAE9J;;GAEG;AACH,qBAAa,qBAAqB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACtD;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,eAAe,CAAC,EAAE,sBAAsB,EAAE,CAAM;IAEhD;;;OAGG;IACH,oBAAoB,CAAC,EAAE;QACnB;;WAEG;QACH,UAAU,EAAE,MAAM,CAAC;QACnB;;;WAGG;QACH,SAAS,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;KACpC,CAAA;IAED,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,QAAQ,CAAC,EAAE,8BAA8B,CAAC;IAE1C;;OAEG;IACH,WAAW,CAAC,EAAE,QAAQ,CAAC;IAEvB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,CAAC;IAEZ;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAC7B,OAAO,EAAE,qBAAqB,CAAC;IAC/B;;OAEG;IACH,iBAAiB,CAAC,EAAE,yBAAyB,CAAC;IAC9C;;OAEG;IACH,mBAAmB,CAAC,EAAE,0BAA0B,EAAE,CAAM;IACxD,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;gBAET,OAAO,EAAE,qBAAqB;IAM1C;;;;OAIG;IACH,aAAa,CAAC,cAAc,EAAE,MAAM;IAIpC;;;;OAIG;IACH,WAAW,CAAC,YAAY,EAAE,MAAM;IAKhC;;;;OAIG;IACH,gBAAgB,IAAI,MAAM,EAAE;CAG/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/generic/types.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,OAAO,qBAAqB;IAAlC;QAQI;;;;WAIG;QACH,oBAAe,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/generic/types.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,OAAO,qBAAqB;IAAlC;QAQI;;;;WAIG;QACH,oBAAe,GAA8B,EAAE,CAAC;IA6CpD,CAAC;CAAA;AAED;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAa7B,YAAY,OAA8B;QAP1C;;WAEG;QACH,wBAAmB,GAAkC,EAAE,CAAC;QAKpD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,cAAsB;QAChC,IAAI,CAAC,YAAY,IAAI,YAAY,cAAc,KAAK,CAAC;IACzD,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,YAAoB;QAC5B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,YAAY,IAAI,UAAU,YAAY,KAAK,CAAC;IACrD,CAAC;IAED;;;;OAIG;IACH,gBAAgB;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;CACJ"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ai-recommendations",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "5.0.0",
|
|
5
5
|
"description": "MemberJunction Recommendations Engine",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
"typescript": "^5.9.3"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@memberjunction/global": "
|
|
25
|
-
"@memberjunction/core": "
|
|
26
|
-
"@memberjunction/core-entities": "
|
|
27
|
-
"@memberjunction/ai": "
|
|
24
|
+
"@memberjunction/global": "5.0.0",
|
|
25
|
+
"@memberjunction/core": "5.0.0",
|
|
26
|
+
"@memberjunction/core-entities": "5.0.0",
|
|
27
|
+
"@memberjunction/ai": "5.0.0"
|
|
28
28
|
},
|
|
29
29
|
"repository": {
|
|
30
30
|
"type": "git",
|
package/README.md
DELETED
|
@@ -1,376 +0,0 @@
|
|
|
1
|
-
# @memberjunction/ai-recommendations
|
|
2
|
-
|
|
3
|
-
A provider-based recommendation engine for MemberJunction. Manages recommendation runs, delegates to pluggable providers via the class factory, and tracks results through Recommendation, Recommendation Run, and Recommendation Item entities.
|
|
4
|
-
|
|
5
|
-
## Architecture
|
|
6
|
-
|
|
7
|
-
```mermaid
|
|
8
|
-
graph TD
|
|
9
|
-
subgraph Engine["@memberjunction/ai-recommendations"]
|
|
10
|
-
REB["RecommendationEngineBase<br/>(singleton BaseEngine)"]
|
|
11
|
-
RPB["RecommendationProviderBase<br/>(abstract)"]
|
|
12
|
-
RR["RecommendationRequest<T>"]
|
|
13
|
-
RRES["RecommendationResult"]
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
subgraph Providers["Registered Providers"]
|
|
17
|
-
P1["Provider A"]
|
|
18
|
-
P2["Provider B"]
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
subgraph MJEntities["MemberJunction Entities"]
|
|
22
|
-
RP["Recommendation Providers"]
|
|
23
|
-
RUN["Recommendation Runs"]
|
|
24
|
-
REC["Recommendations"]
|
|
25
|
-
RI["Recommendation Items"]
|
|
26
|
-
LIST["Lists / List Details"]
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
subgraph MJCore["MemberJunction Core"]
|
|
30
|
-
BE["BaseEngine"]
|
|
31
|
-
CF["ClassFactory"]
|
|
32
|
-
MD["Metadata"]
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
REB -->|extends| BE
|
|
36
|
-
REB -->|discovers| CF
|
|
37
|
-
CF -->|creates| P1
|
|
38
|
-
CF -->|creates| P2
|
|
39
|
-
P1 -->|extends| RPB
|
|
40
|
-
P2 -->|extends| RPB
|
|
41
|
-
REB --> RP
|
|
42
|
-
REB --> RUN
|
|
43
|
-
RPB --> REC
|
|
44
|
-
RPB --> RI
|
|
45
|
-
REB --> LIST
|
|
46
|
-
|
|
47
|
-
style Engine fill:#2d6a9f,stroke:#1a4971,color:#fff
|
|
48
|
-
style Providers fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
49
|
-
style MJEntities fill:#b8762f,stroke:#8a5722,color:#fff
|
|
50
|
-
style MJCore fill:#7c5295,stroke:#563a6b,color:#fff
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## Installation
|
|
54
|
-
|
|
55
|
-
```bash
|
|
56
|
-
npm install @memberjunction/ai-recommendations
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
## Overview
|
|
60
|
-
|
|
61
|
-
This package provides the framework for running recommendations in MemberJunction. It follows the engine/provider pattern used throughout the platform:
|
|
62
|
-
|
|
63
|
-
1. **RecommendationEngineBase** -- a singleton engine (extending `BaseEngine`) that loads provider metadata, selects a provider, creates Recommendation Run tracking records, and delegates the actual recommendation logic
|
|
64
|
-
2. **RecommendationProviderBase** -- an abstract class that concrete providers implement to generate recommendations for each source record
|
|
65
|
-
3. **RecommendationRequest/RecommendationResult** -- typed request and response objects that flow through the pipeline
|
|
66
|
-
|
|
67
|
-
Providers are discovered at runtime through MemberJunction's `ClassFactory` using `@RegisterClass(RecommendationProviderBase, 'ProviderName')`.
|
|
68
|
-
|
|
69
|
-
## Recommendation Flow
|
|
70
|
-
|
|
71
|
-
```mermaid
|
|
72
|
-
sequenceDiagram
|
|
73
|
-
participant Caller
|
|
74
|
-
participant Engine as RecommendationEngineBase
|
|
75
|
-
participant CF as ClassFactory
|
|
76
|
-
participant Provider as RecommendationProvider
|
|
77
|
-
participant DB as MJ Database
|
|
78
|
-
|
|
79
|
-
Caller->>Engine: Recommend(request)
|
|
80
|
-
Engine->>Engine: TryThrowIfNotLoaded()
|
|
81
|
-
|
|
82
|
-
alt Provider specified
|
|
83
|
-
Engine->>Engine: Use request.Provider
|
|
84
|
-
else No provider
|
|
85
|
-
Engine->>Engine: Use first available
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
Engine->>Engine: GetRecommendationEntities(request)
|
|
89
|
-
|
|
90
|
-
alt From List
|
|
91
|
-
Engine->>DB: Load List + List Details
|
|
92
|
-
Engine->>DB: Load entity records by IDs
|
|
93
|
-
else From EntityAndRecordsInfo
|
|
94
|
-
Engine->>DB: Load records by entity name + IDs
|
|
95
|
-
else Pre-built
|
|
96
|
-
Engine->>Engine: Validate Recommendations array
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
Engine->>DB: Create Recommendation Run (Status: In Progress)
|
|
100
|
-
|
|
101
|
-
opt CreateErrorList = true
|
|
102
|
-
Engine->>DB: Create error tracking List
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
Engine->>CF: CreateInstance(provider.Name)
|
|
106
|
-
CF-->>Engine: Provider instance
|
|
107
|
-
|
|
108
|
-
Engine->>Provider: Recommend(request)
|
|
109
|
-
|
|
110
|
-
loop For each recommendation
|
|
111
|
-
Provider->>Provider: Call external API
|
|
112
|
-
Provider->>DB: SaveRecommendation + Items
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
Provider-->>Engine: RecommendationResult
|
|
116
|
-
|
|
117
|
-
Engine->>DB: Update Run (Completed/Error)
|
|
118
|
-
Engine-->>Caller: RecommendationResult
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
## Core Components
|
|
122
|
-
|
|
123
|
-
### RecommendationEngineBase
|
|
124
|
-
|
|
125
|
-
A singleton engine that manages the recommendation lifecycle.
|
|
126
|
-
|
|
127
|
-
```typescript
|
|
128
|
-
import { RecommendationEngineBase } from '@memberjunction/ai-recommendations';
|
|
129
|
-
|
|
130
|
-
// Access the singleton
|
|
131
|
-
const engine = RecommendationEngineBase.Instance;
|
|
132
|
-
|
|
133
|
-
// Initialize (loads Recommendation Providers metadata)
|
|
134
|
-
await engine.Config(false, contextUser);
|
|
135
|
-
|
|
136
|
-
// Run recommendations
|
|
137
|
-
const result = await engine.Recommend(request);
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
**Key properties and methods:**
|
|
141
|
-
|
|
142
|
-
| Member | Description |
|
|
143
|
-
|---|---|
|
|
144
|
-
| `Instance` | Static getter for the singleton instance |
|
|
145
|
-
| `RecommendationProviders` | Array of `RecommendationProviderEntity` loaded from metadata |
|
|
146
|
-
| `Config(forceRefresh?, contextUser?, provider?)` | Loads provider metadata into cache |
|
|
147
|
-
| `Recommend<T>(request)` | Runs the full recommendation pipeline |
|
|
148
|
-
|
|
149
|
-
### RecommendationProviderBase
|
|
150
|
-
|
|
151
|
-
Abstract base class for implementing recommendation providers.
|
|
152
|
-
|
|
153
|
-
```mermaid
|
|
154
|
-
classDiagram
|
|
155
|
-
class RecommendationProviderBase {
|
|
156
|
-
<<abstract>>
|
|
157
|
-
-_md : Metadata
|
|
158
|
-
-_ContextUser : UserInfo
|
|
159
|
-
+ContextUser : UserInfo
|
|
160
|
-
+Recommend(request)* RecommendationResult
|
|
161
|
-
#SaveRecommendation(rec, runID, items) boolean
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
class ConcreteProvider {
|
|
165
|
-
+Recommend(request) RecommendationResult
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
RecommendationProviderBase <|-- ConcreteProvider
|
|
169
|
-
|
|
170
|
-
style RecommendationProviderBase fill:#2d6a9f,stroke:#1a4971,color:#fff
|
|
171
|
-
style ConcreteProvider fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
The `SaveRecommendation` helper method handles:
|
|
175
|
-
1. Setting the `RecommendationRunID` on the recommendation entity
|
|
176
|
-
2. Saving the recommendation record
|
|
177
|
-
3. Linking and saving all `RecommendationItemEntity` records
|
|
178
|
-
|
|
179
|
-
### RecommendationRequest\<T\>
|
|
180
|
-
|
|
181
|
-
The request object supports three ways to specify source records:
|
|
182
|
-
|
|
183
|
-
```mermaid
|
|
184
|
-
graph TD
|
|
185
|
-
RR["RecommendationRequest"]
|
|
186
|
-
OPT1["Recommendations[]<br/>Pre-built entities"]
|
|
187
|
-
OPT2["EntityAndRecordsInfo<br/>Entity name + Record IDs"]
|
|
188
|
-
OPT3["ListID<br/>MJ List reference"]
|
|
189
|
-
|
|
190
|
-
RR --> OPT1
|
|
191
|
-
RR --> OPT2
|
|
192
|
-
RR --> OPT3
|
|
193
|
-
|
|
194
|
-
style RR fill:#2d6a9f,stroke:#1a4971,color:#fff
|
|
195
|
-
style OPT1 fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
196
|
-
style OPT2 fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
197
|
-
style OPT3 fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
| Field | Type | Description |
|
|
201
|
-
|---|---|---|
|
|
202
|
-
| `Recommendations` | `RecommendationEntity[]` | Pre-built unsaved recommendation entities |
|
|
203
|
-
| `EntityAndRecordsInfo` | `{ EntityName, RecordIDs }` | Entity name and array of record IDs to process |
|
|
204
|
-
| `ListID` | `string` | ID of a MJ List whose details become the source records |
|
|
205
|
-
| `Provider` | `RecommendationProviderEntity` | Specific provider to use (defaults to first available) |
|
|
206
|
-
| `CurrentUser` | `UserInfo` | User context |
|
|
207
|
-
| `Options` | `T` | Generic additional options passed to the provider |
|
|
208
|
-
| `CreateErrorList` | `boolean` | Whether to create an error tracking list |
|
|
209
|
-
| `RunID` | `string` | Set automatically by the engine |
|
|
210
|
-
| `ErrorListID` | `string` | Set automatically if error list is created |
|
|
211
|
-
|
|
212
|
-
### RecommendationResult
|
|
213
|
-
|
|
214
|
-
```typescript
|
|
215
|
-
class RecommendationResult {
|
|
216
|
-
Request: RecommendationRequest;
|
|
217
|
-
RecommendationRun?: RecommendationRunEntity;
|
|
218
|
-
RecommendationItems?: RecommendationItemEntity[];
|
|
219
|
-
Success: boolean;
|
|
220
|
-
ErrorMessage: string;
|
|
221
|
-
|
|
222
|
-
AppendWarning(message: string): void; // Adds warning without setting Success=false
|
|
223
|
-
AppendError(message: string): void; // Adds error and sets Success=false
|
|
224
|
-
GetErrorMessages(): string[]; // Splits ErrorMessage into array
|
|
225
|
-
}
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
## Usage
|
|
229
|
-
|
|
230
|
-
### Running Recommendations from a List
|
|
231
|
-
|
|
232
|
-
```typescript
|
|
233
|
-
import { RecommendationEngineBase } from '@memberjunction/ai-recommendations';
|
|
234
|
-
import { RecommendationRequest } from '@memberjunction/ai-recommendations';
|
|
235
|
-
|
|
236
|
-
const engine = RecommendationEngineBase.Instance;
|
|
237
|
-
await engine.Config(false, contextUser);
|
|
238
|
-
|
|
239
|
-
const request = new RecommendationRequest();
|
|
240
|
-
request.ListID = 'list-uuid';
|
|
241
|
-
request.CurrentUser = contextUser;
|
|
242
|
-
request.CreateErrorList = true;
|
|
243
|
-
|
|
244
|
-
const result = await engine.Recommend(request);
|
|
245
|
-
|
|
246
|
-
if (result.Success) {
|
|
247
|
-
console.log(`Generated ${result.RecommendationItems?.length ?? 0} items`);
|
|
248
|
-
} else {
|
|
249
|
-
console.error(result.ErrorMessage);
|
|
250
|
-
}
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
### Running Recommendations by Entity and Record IDs
|
|
254
|
-
|
|
255
|
-
```typescript
|
|
256
|
-
const request = new RecommendationRequest();
|
|
257
|
-
request.EntityAndRecordsInfo = {
|
|
258
|
-
EntityName: 'Products',
|
|
259
|
-
RecordIDs: ['id-1', 'id-2', 'id-3']
|
|
260
|
-
};
|
|
261
|
-
request.CurrentUser = contextUser;
|
|
262
|
-
|
|
263
|
-
const result = await engine.Recommend(request);
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
### Implementing a Provider
|
|
267
|
-
|
|
268
|
-
```typescript
|
|
269
|
-
import { RecommendationProviderBase } from '@memberjunction/ai-recommendations';
|
|
270
|
-
import { RecommendationRequest, RecommendationResult } from '@memberjunction/ai-recommendations';
|
|
271
|
-
import { RegisterClass } from '@memberjunction/global';
|
|
272
|
-
import { Metadata } from '@memberjunction/core';
|
|
273
|
-
import { RecommendationItemEntity } from '@memberjunction/core-entities';
|
|
274
|
-
|
|
275
|
-
@RegisterClass(RecommendationProviderBase, 'My Recommendation Provider')
|
|
276
|
-
export class MyProvider extends RecommendationProviderBase {
|
|
277
|
-
async Recommend(request: RecommendationRequest): Promise<RecommendationResult> {
|
|
278
|
-
const result = new RecommendationResult(request);
|
|
279
|
-
const md = new Metadata();
|
|
280
|
-
|
|
281
|
-
for (const rec of request.Recommendations) {
|
|
282
|
-
// Call your recommendation API/algorithm
|
|
283
|
-
const suggestions = await this.getSuggestions(rec.SourceEntityRecordID);
|
|
284
|
-
|
|
285
|
-
const items: RecommendationItemEntity[] = [];
|
|
286
|
-
for (const suggestion of suggestions) {
|
|
287
|
-
const item = await md.GetEntityObject<RecommendationItemEntity>(
|
|
288
|
-
'Recommendation Items', request.CurrentUser
|
|
289
|
-
);
|
|
290
|
-
item.NewRecord();
|
|
291
|
-
item.DestinationEntityID = suggestion.entityID;
|
|
292
|
-
item.DestinationEntityRecordID = suggestion.recordID;
|
|
293
|
-
item.MatchProbability = suggestion.score;
|
|
294
|
-
items.push(item);
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
await this.SaveRecommendation(rec, request.RunID, items);
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
return result;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
private async getSuggestions(recordID: string): Promise<Suggestion[]> {
|
|
304
|
-
// Your recommendation logic here
|
|
305
|
-
return [];
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
## Database Entities
|
|
311
|
-
|
|
312
|
-
```mermaid
|
|
313
|
-
erDiagram
|
|
314
|
-
RECOMMENDATION_PROVIDERS {
|
|
315
|
-
string ID PK
|
|
316
|
-
string Name
|
|
317
|
-
string Description
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
RECOMMENDATION_RUNS {
|
|
321
|
-
string ID PK
|
|
322
|
-
string RecommendationProviderID FK
|
|
323
|
-
string RunByUserID FK
|
|
324
|
-
datetime StartDate
|
|
325
|
-
string Status
|
|
326
|
-
string Description
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
RECOMMENDATIONS {
|
|
330
|
-
string ID PK
|
|
331
|
-
string RecommendationRunID FK
|
|
332
|
-
string SourceEntityID FK
|
|
333
|
-
string SourceEntityRecordID
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
RECOMMENDATION_ITEMS {
|
|
337
|
-
string ID PK
|
|
338
|
-
string RecommendationID FK
|
|
339
|
-
string DestinationEntityID FK
|
|
340
|
-
string DestinationEntityRecordID
|
|
341
|
-
float MatchProbability
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
LISTS {
|
|
345
|
-
string ID PK
|
|
346
|
-
string Name
|
|
347
|
-
string EntityID FK
|
|
348
|
-
string UserID FK
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
RECOMMENDATION_PROVIDERS ||--o{ RECOMMENDATION_RUNS : has
|
|
352
|
-
RECOMMENDATION_RUNS ||--o{ RECOMMENDATIONS : contains
|
|
353
|
-
RECOMMENDATIONS ||--o{ RECOMMENDATION_ITEMS : produces
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
## Dependencies
|
|
357
|
-
|
|
358
|
-
| Package | Purpose |
|
|
359
|
-
|---|---|
|
|
360
|
-
| `@memberjunction/core` | `BaseEngine`, `Metadata`, `RunView`, `UserInfo`, `LogStatus` |
|
|
361
|
-
| `@memberjunction/core-entities` | `RecommendationEntity`, `RecommendationRunEntity`, `RecommendationItemEntity`, `RecommendationProviderEntity`, `ListEntity` |
|
|
362
|
-
| `@memberjunction/global` | `MJGlobal` class factory for provider discovery |
|
|
363
|
-
|
|
364
|
-
## Development
|
|
365
|
-
|
|
366
|
-
```bash
|
|
367
|
-
# Build
|
|
368
|
-
npm run build
|
|
369
|
-
|
|
370
|
-
# Development mode
|
|
371
|
-
npm run start
|
|
372
|
-
```
|
|
373
|
-
|
|
374
|
-
## License
|
|
375
|
-
|
|
376
|
-
ISC
|