@memberjunction/server 2.56.0 → 2.58.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/src/index.ts CHANGED
@@ -40,6 +40,23 @@ LoadCoreEntitiesServerSubClasses(); // prevent tree shaking for this dynamic mod
40
40
  import { LoadAgentManagementActions } from '@memberjunction/ai-agent-manager-actions';
41
41
  LoadAgentManagementActions();
42
42
 
43
+
44
+ import { resolve } from 'node:path';
45
+ import { DataSourceInfo, raiseEvent } from './types.js';
46
+ import { LoadOpenAILLM } from '@memberjunction/ai-openai';
47
+ import { LoadAnthropicLLM } from '@memberjunction/ai-anthropic';
48
+ import { LoadGroqLLM } from '@memberjunction/ai-groq';
49
+ import { LoadCerebrasLLM } from '@memberjunction/ai-cerebras';
50
+ import { LoadMistralLLM } from '@memberjunction/ai-mistral';
51
+ // Load AI LLMs
52
+ // These imports are necessary to ensure the LLMs are registered in the MemberJunction AI
53
+ // system. They are not tree-shaken because they are dynamically loaded at runtime.
54
+ LoadOpenAILLM();
55
+ LoadAnthropicLLM();
56
+ LoadGroqLLM();
57
+ LoadCerebrasLLM();
58
+ LoadMistralLLM();
59
+
43
60
  import { ExternalChangeDetectorEngine } from '@memberjunction/external-change-detection';
44
61
 
45
62
  const cacheRefreshInterval = configInfo.databaseSettings.metadataCacheRefreshInterval;
@@ -80,8 +97,6 @@ export { GetReadOnlyDataSource, GetReadWriteDataSource } from './util.js';
80
97
 
81
98
  export * from './generated/generated.js';
82
99
 
83
- import { resolve } from 'node:path';
84
- import { DataSourceInfo, raiseEvent } from './types.js';
85
100
 
86
101
  export type MJServerOptions = {
87
102
  onBeforeServe?: () => void | Promise<void>;
@@ -1318,6 +1318,10 @@ cycle.`);
1318
1318
  vendorDriverName: 'MistralLLM',
1319
1319
  apiKey: GetAIAPIKey('MistralLLM'),
1320
1320
  },
1321
+ {
1322
+ vendorDriverName: 'CerebrasLLM',
1323
+ apiKey: GetAIAPIKey('CerebrasLLM'),
1324
+ },
1321
1325
  ];
1322
1326
  }
1323
1327
 
@@ -1,4 +1,4 @@
1
- import { EntityPermissionType, Metadata } from '@memberjunction/core';
1
+ import { EntityPermissionType, Metadata, FieldValueCollection } from '@memberjunction/core';
2
2
  import { FileEntity, FileStorageProviderEntity } from '@memberjunction/core-entities';
3
3
  import {
4
4
  AppContext,
@@ -57,23 +57,27 @@ export class FileResolver extends FileResolverBase {
57
57
  fileEntity.CheckPermissions(EntityPermissionType.Create, true);
58
58
 
59
59
  // Check to see if there's already an object with that name
60
- const [sameName] = await this.findBy(context.dataSource, 'Files', { Name: input.Name, ProviderID: input.ProviderID }, context.userPayload.userRecord);
60
+ const [sameName] = await this.findBy(
61
+ context.dataSource,
62
+ 'Files',
63
+ { Name: input.Name, ProviderID: input.ProviderID },
64
+ context.userPayload.userRecord
65
+ );
61
66
  const NameExists = Boolean(sameName);
62
67
 
63
- const fileRecord = (await super.CreateFile({ ...input, Status: 'Pending' }, context, pubSub)) as File_;
68
+ const success = fileEntity.NewRecord(FieldValueCollection.FromObject({ ...input, Status: 'Pending' }));
64
69
 
65
70
  // If there's a problem creating the file record, the base resolver will return null
66
- if (!fileRecord) {
71
+ if (!success) {
67
72
  return null;
68
73
  }
69
74
 
70
75
  // Create the upload URL and get the record updates (provider key, content type, etc)
71
- const { updatedInput, UploadUrl } = await createUploadUrl(providerEntity, fileRecord);
76
+ const { updatedInput, UploadUrl } = await createUploadUrl(providerEntity, fileEntity);
72
77
 
73
78
  // Save the file record with the updated input
74
79
  const mapper = new FieldMapper();
75
- await fileEntity.LoadFromData(mapper.ReverseMapFields({ ...input }));
76
- fileEntity.SetMany(mapper.ReverseMapFields({ ...updatedInput }));
80
+ fileEntity.SetMany(mapper.ReverseMapFields({ ...updatedInput }), true, true);
77
81
  await fileEntity.Save();
78
82
  const File = mapper.MapFields({ ...fileEntity.GetAll() });
79
83
 
@@ -3,7 +3,7 @@ import { UserPayload } from '../types.js';
3
3
  import { LogError, LogStatus } from '@memberjunction/core';
4
4
  import { AIAgentEntity } from '@memberjunction/core-entities';
5
5
  import { AgentRunner } from '@memberjunction/ai-agents';
6
- import { ExecuteAgentResult } from '@memberjunction/aiengine';
6
+ import { ExecuteAgentResult } from '@memberjunction/ai-core-plus';
7
7
  import { AIEngine } from '@memberjunction/aiengine';
8
8
  import { ResolverBase } from '../generic/ResolverBase.js';
9
9
  import { PUSH_STATUS_UPDATES_TOPIC } from '../generic/PushStatusResolver.js';
@@ -2,7 +2,8 @@ import { Resolver, Mutation, Arg, Ctx, ObjectType, Field, Int } from 'type-graph
2
2
  import { UserPayload } from '../types.js';
3
3
  import { LogError, LogStatus, Metadata } from '@memberjunction/core';
4
4
  import { AIPromptEntity } from '@memberjunction/core-entities';
5
- import { AIPromptRunner, AIPromptParams } from '@memberjunction/ai-prompts';
5
+ import { AIPromptRunner } from '@memberjunction/ai-prompts';
6
+ import { AIPromptParams } from '@memberjunction/ai-core-plus';
6
7
  import { ResolverBase } from '../generic/ResolverBase.js';
7
8
 
8
9
  @ObjectType()
@@ -45,8 +46,8 @@ export class RunAIPromptResolver extends ResolverBase {
45
46
  @Arg('promptId') promptId: string,
46
47
  @Ctx() { userPayload }: { userPayload: UserPayload },
47
48
  @Arg('data', { nullable: true }) data?: string,
48
- @Arg('modelId', { nullable: true }) modelId?: string,
49
- @Arg('vendorId', { nullable: true }) vendorId?: string,
49
+ @Arg('overrideModelId', { nullable: true }) overrideModelId?: string,
50
+ @Arg('overrideVendorId', { nullable: true }) overrideVendorId?: string,
50
51
  @Arg('configurationId', { nullable: true }) configurationId?: string,
51
52
  @Arg('skipValidation', { nullable: true }) skipValidation?: boolean,
52
53
  @Arg('templateData', { nullable: true }) templateData?: string,
@@ -137,12 +138,18 @@ export class RunAIPromptResolver extends ResolverBase {
137
138
  promptParams.prompt = promptEntity;
138
139
  promptParams.data = parsedData;
139
140
  promptParams.templateData = parsedTemplateData;
140
- promptParams.modelId = modelId;
141
- promptParams.vendorId = vendorId;
142
141
  promptParams.configurationId = configurationId;
143
142
  promptParams.contextUser = currentUser;
144
143
  promptParams.skipValidation = skipValidation || false;
145
144
 
145
+ // Set override if model or vendor ID provided
146
+ if (overrideModelId || overrideVendorId) {
147
+ promptParams.override = {
148
+ modelId: overrideModelId,
149
+ vendorId: overrideVendorId
150
+ };
151
+ }
152
+
146
153
  // Parse and set conversation messages if provided
147
154
  if (messages) {
148
155
  try {