The MemberJunction Recommendations Engine provides a flexible and extensible framework for integrating with AI-powered recommendation systems. It handles the orchestration of recommendation requests, provider management, and the storage of recommendation results within the MemberJunction ecosystem.
npm install @memberjunction/ai-recommendations
The main engine class that coordinates recommendation requests:
import { RecommendationEngineBase, RecommendationRequest } from '@memberjunction/ai-recommendations';
// Initialize and load the engine
await RecommendationEngineBase.Instance.Config();
// Create a recommendation request
const request = new RecommendationRequest();
// Configure the request
request.EntityAndRecordsInfo = {
EntityName: 'Customers',
RecordIDs: ['CUST001', 'CUST002']
};
// Execute the recommendation
const result = await RecommendationEngineBase.Instance.Recommend(request);
Abstract base class for implementing recommendation providers:
import { RecommendationProviderBase, RecommendationRequest, RecommendationResult } from '@memberjunction/ai-recommendations';
import { UserInfo } from '@memberjunction/core';
import { RecommendationItemEntity } from '@memberjunction/core-entities';
export class MyRecommendationProvider extends RecommendationProviderBase {
constructor(contextUser: UserInfo) {
super(contextUser);
}
public async Recommend(request: RecommendationRequest): Promise<RecommendationResult> {
const result = new RecommendationResult(request);
try {
// Process each recommendation
for (const recommendation of request.Recommendations) {
// Generate items for this recommendation
const items: RecommendationItemEntity[] = [];
// Your recommendation logic here
// ...
// Save the recommendation and its items
await this.SaveRecommendation(recommendation, request.RunID, items);
}
} catch (error) {
result.AppendError(error.message);
}
return result;
}
}
import { RecommendationEngineBase, RecommendationRequest } from '@memberjunction/ai-recommendations';
async function getCustomerRecommendations(customerIds: string[]) {
// Ensure the engine is configured
await RecommendationEngineBase.Instance.Config();
// Create a request for specific customer records
const request = new RecommendationRequest();
request.EntityAndRecordsInfo = {
EntityName: 'Customers',
RecordIDs: customerIds
};
// Optionally specify a provider
// request.Provider = RecommendationEngineBase.Instance.RecommendationProviders.find(p => p.Name === 'MyProvider');
// Execute the recommendation
const result = await RecommendationEngineBase.Instance.Recommend(request);
if (result.Success) {
console.log('Recommendations generated successfully!');
return result.RecommendationItems;
} else {
console.error('Error generating recommendations:', result.ErrorMessage);
return null;
}
}
import { RecommendationEngineBase, RecommendationRequest } from '@memberjunction/ai-recommendations';
async function getRecommendationsFromList(listId: string) {
await RecommendationEngineBase.Instance.Config();
// Create a request for records in a list
const request = new RecommendationRequest();
request.ListID = listId;
request.CreateErrorList = true; // Create a list to track errors
// Execute the recommendation
const result = await RecommendationEngineBase.Instance.Recommend(request);
if (result.Success) {
console.log('Recommendations generated successfully!');
console.log('Error list ID (if needed):', result.Request.ErrorListID);
return result.RecommendationItems;
} else {
console.error('Error generating recommendations:', result.ErrorMessage);
return null;
}
}
import { RecommendationEngineBase, RecommendationRequest } from '@memberjunction/ai-recommendations';
// Define a custom options interface for your provider
interface MyProviderOptions {
similarityThreshold: number;
maxRecommendations: number;
includeRatings: boolean;
}
async function getCustomizedRecommendations(customerId: string) {
await RecommendationEngineBase.Instance.Config();
// Create a request with custom options
const request = new RecommendationRequest<MyProviderOptions>();
request.EntityAndRecordsInfo = {
EntityName: 'Customers',
RecordIDs: [customerId]
};
// Add provider-specific options
request.Options = {
similarityThreshold: 0.75,
maxRecommendations: 5,
includeRatings: true
};
// Execute the recommendation
return await RecommendationEngineBase.Instance.Recommend(request);
}
The recommendation process follows these steps:
RecommendationRequest is created with entity records or a listRecommendationRun entity is created to track the processRecommendationResult is returned to the callerThe recommendation engine works with these key entities:
To create a custom recommendation provider:
RecommendationProviderBaseRecommend method to generate recommendations// Register your provider with MemberJunction's class factory
import { MJGlobal } from '@memberjunction/global';
import { RecommendationProviderBase } from '@memberjunction/ai-recommendations';
MJGlobal.Instance.ClassFactory.RegisterClass(
RecommendationProviderBase,
'MyRecommendationProvider',
MyRecommendationProvider
);
This package integrates with the MemberJunction ecosystem:
@memberjunction/global: MemberJunction global utilities@memberjunction/core: MemberJunction core library@memberjunction/core-entities: MemberJunction entity definitions@memberjunction/ai: MemberJunction AI abstractionsISC