@memberjunction/ai-recommendations 1.5.3
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 +37 -0
- package/dist/Engine.d.ts.map +1 -0
- package/dist/Engine.js +93 -0
- package/dist/Engine.js.map +1 -0
- package/dist/ProviderBase.d.ts +14 -0
- package/dist/ProviderBase.d.ts.map +1 -0
- package/dist/ProviderBase.js +10 -0
- package/dist/ProviderBase.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/package.json +27 -0
- package/readme.md +2 -0
package/dist/Engine.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { BaseEngine, UserInfo } from '@memberjunction/core';
|
|
2
|
+
import { RecommendationEntity, RecommendationProviderEntity, RecommendationRunEntity } from '@memberjunction/core-entities';
|
|
3
|
+
/**
|
|
4
|
+
* Used to make requests to providers
|
|
5
|
+
*/
|
|
6
|
+
export declare class RecommendationRequest {
|
|
7
|
+
/**
|
|
8
|
+
* Array of the requested recommendations
|
|
9
|
+
*/
|
|
10
|
+
Recommendations: RecommendationEntity[];
|
|
11
|
+
/**
|
|
12
|
+
* The specific provider to use for the request. Leave this undefined if you want to use the default recommendation.
|
|
13
|
+
*/
|
|
14
|
+
Provider?: RecommendationProviderEntity;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* This response is generated for each Recommend() request
|
|
18
|
+
*/
|
|
19
|
+
export declare class RecommendationResult {
|
|
20
|
+
Success: boolean;
|
|
21
|
+
Request: RecommendationRequest;
|
|
22
|
+
ErrorMessage: string;
|
|
23
|
+
constructor(request: RecommendationRequest);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Engine class to be used for running all recommendation requests
|
|
27
|
+
*/
|
|
28
|
+
export declare class RecommendationEngineBase extends BaseEngine<RecommendationEngineBase> {
|
|
29
|
+
private _RecommendationProviders;
|
|
30
|
+
Config(forceRefresh?: boolean, contextUser?: UserInfo): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Call this method with a provider and a request and a result will be generated
|
|
33
|
+
* @param request - The Recommendations to request, and an optional provider
|
|
34
|
+
*/
|
|
35
|
+
Recommend(request: RecommendationRequest): Promise<RecommendationRunEntity>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=Engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Engine.d.ts","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAY,QAAQ,EAAY,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAI5H;;GAEG;AACH,qBAAa,qBAAqB;IAChC;;OAEG;IACH,eAAe,EAAE,oBAAoB,EAAE,CAAM;IAE7C;;OAEG;IACH,QAAQ,CAAC,EAAE,4BAA4B,CAAC;CACzC;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;gBAET,OAAO,EAAE,qBAAqB;CAG3C;AAED;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,UAAU,CAAC,wBAAwB,CAAC;IAChF,OAAO,CAAC,wBAAwB,CAAsC;IAEzD,MAAM,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,QAAQ;IAUlE;;;OAGG;IACU,SAAS,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAiDzF"}
|
package/dist/Engine.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RecommendationEngineBase = exports.RecommendationResult = exports.RecommendationRequest = void 0;
|
|
4
|
+
const core_1 = require("@memberjunction/core");
|
|
5
|
+
const global_1 = require("@memberjunction/global");
|
|
6
|
+
const ProviderBase_1 = require("./ProviderBase");
|
|
7
|
+
/**
|
|
8
|
+
* Used to make requests to providers
|
|
9
|
+
*/
|
|
10
|
+
class RecommendationRequest {
|
|
11
|
+
constructor() {
|
|
12
|
+
/**
|
|
13
|
+
* Array of the requested recommendations
|
|
14
|
+
*/
|
|
15
|
+
this.Recommendations = [];
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.RecommendationRequest = RecommendationRequest;
|
|
19
|
+
/**
|
|
20
|
+
* This response is generated for each Recommend() request
|
|
21
|
+
*/
|
|
22
|
+
class RecommendationResult {
|
|
23
|
+
constructor(request) {
|
|
24
|
+
this.Request = request;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.RecommendationResult = RecommendationResult;
|
|
28
|
+
/**
|
|
29
|
+
* Engine class to be used for running all recommendation requests
|
|
30
|
+
*/
|
|
31
|
+
class RecommendationEngineBase extends core_1.BaseEngine {
|
|
32
|
+
constructor() {
|
|
33
|
+
super(...arguments);
|
|
34
|
+
this._RecommendationProviders = [];
|
|
35
|
+
}
|
|
36
|
+
async Config(forceRefresh, contextUser) {
|
|
37
|
+
const params = [
|
|
38
|
+
{
|
|
39
|
+
PropertyName: '_RecommendationProviders',
|
|
40
|
+
EntityName: 'Recommendation Providers',
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
return await this.Load(params, forceRefresh, contextUser);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Call this method with a provider and a request and a result will be generated
|
|
47
|
+
* @param request - The Recommendations to request, and an optional provider
|
|
48
|
+
*/
|
|
49
|
+
async Recommend(request) {
|
|
50
|
+
const provider = request.Provider ?? this._RecommendationProviders[0];
|
|
51
|
+
if (!provider) {
|
|
52
|
+
throw new Error('No recommendation provider available');
|
|
53
|
+
}
|
|
54
|
+
// get the driver
|
|
55
|
+
const driver = global_1.MJGlobal.Instance.ClassFactory.CreateInstance(ProviderBase_1.RecommendationProviderBase, provider.Name);
|
|
56
|
+
// make sure we have only one run
|
|
57
|
+
const runIDs = [...new Set(request.Recommendations.map((r) => r.RecommendationRunID))];
|
|
58
|
+
if (runIDs.length > 1) {
|
|
59
|
+
const message = 'All Recommendations must use the same RecommendationRunID';
|
|
60
|
+
(0, core_1.LogError)(message, null, { runIDs });
|
|
61
|
+
throw new Error(message);
|
|
62
|
+
}
|
|
63
|
+
const [runID] = runIDs;
|
|
64
|
+
// load the run
|
|
65
|
+
const run = await new core_1.Metadata().GetEntityObject('Recommendation Runs');
|
|
66
|
+
if (!(await run.Load(runID))) {
|
|
67
|
+
throw new Error(`Error loading RecommendationRun with ID: ${runID}`);
|
|
68
|
+
}
|
|
69
|
+
// update status for current run
|
|
70
|
+
run.Status = 'In Progress';
|
|
71
|
+
if (!(await run.Save())) {
|
|
72
|
+
throw new Error(`Error saving In Progress RecommendationRun with ID: ${runID}`);
|
|
73
|
+
}
|
|
74
|
+
const result = await driver.Recommend(request);
|
|
75
|
+
// finalize status for current run
|
|
76
|
+
if (result.Success) {
|
|
77
|
+
run.Status = 'Completed';
|
|
78
|
+
if (!(await run.Save())) {
|
|
79
|
+
throw new Error(`Error saving Completed RecommendationRun with ID: ${runID}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
run.Status = 'Error';
|
|
84
|
+
run.Description = result.ErrorMessage;
|
|
85
|
+
if (!(await run.Save())) {
|
|
86
|
+
throw new Error(`Error saving Errored RecommendationRun with ID: ${runID}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return run;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.RecommendationEngineBase = RecommendationEngineBase;
|
|
93
|
+
//# sourceMappingURL=Engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Engine.js","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { RecommendationRequest, RecommendationResult } from './Engine';
|
|
2
|
+
/**
|
|
3
|
+
* Base class for all recommendation providers
|
|
4
|
+
*/
|
|
5
|
+
export declare abstract class RecommendationProviderBase {
|
|
6
|
+
/**
|
|
7
|
+
* For each entry in the request.Recommendations array, the provider's external API is called to
|
|
8
|
+
* produce zero or more {@link RecommendationItemEntity} records.
|
|
9
|
+
*
|
|
10
|
+
* @param request - The Recommendations to request from this provider
|
|
11
|
+
*/
|
|
12
|
+
abstract Recommend(request: Pick<RecommendationRequest, 'Recommendations'>): Promise<RecommendationResult>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=ProviderBase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProviderBase.d.ts","sourceRoot":"","sources":["../src/ProviderBase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE5E;;GAEG;AACH,8BAAsB,0BAA0B;IAC9C;;;;;OAKG;aACa,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAClH"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RecommendationProviderBase = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Base class for all recommendation providers
|
|
6
|
+
*/
|
|
7
|
+
class RecommendationProviderBase {
|
|
8
|
+
}
|
|
9
|
+
exports.RecommendationProviderBase = RecommendationProviderBase;
|
|
10
|
+
//# sourceMappingURL=ProviderBase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProviderBase.js","sourceRoot":"","sources":["../src/ProviderBase.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACH,MAAsB,0BAA0B;CAQ/C;AARD,gEAQC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
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 __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("./Engine"), exports);
|
|
18
|
+
__exportStar(require("./ProviderBase"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,iDAA+B"}
|
package/package.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@memberjunction/ai-recommendations",
|
|
3
|
+
"version": "1.5.3",
|
|
4
|
+
"description": "MemberJunction Recommendations Engine",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"/dist"
|
|
9
|
+
],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"start": "ts-node-dev src/index.ts",
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
14
|
+
},
|
|
15
|
+
"author": "MemberJunction.com",
|
|
16
|
+
"license": "ISC",
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"ts-node-dev": "^2.0.0",
|
|
19
|
+
"typescript": "^5.4.5"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@memberjunction/global": "1.5.3",
|
|
23
|
+
"@memberjunction/core": "1.5.3",
|
|
24
|
+
"@memberjunction/core-entities": "1.5.3",
|
|
25
|
+
"@memberjunction/ai": "1.5.3"
|
|
26
|
+
}
|
|
27
|
+
}
|
package/readme.md
ADDED