@ai-stack/payloadcms 3.2.7-beta → 3.2.9-beta

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.
Files changed (85) hide show
  1. package/README.md +22 -2
  2. package/dist/ai/models/index.d.ts +1 -1
  3. package/dist/ai/models/index.d.ts.map +1 -1
  4. package/dist/ai/models/index.js +1 -1
  5. package/dist/ai/models/index.js.map +1 -1
  6. package/dist/ai/models/openai/generateRichText.d.ts.map +1 -1
  7. package/dist/ai/models/openai/generateRichText.js +1 -1
  8. package/dist/ai/models/openai/generateRichText.js.map +1 -1
  9. package/dist/ai/models/openai/index.d.ts.map +1 -1
  10. package/dist/ai/models/openai/index.js +1 -1
  11. package/dist/ai/models/openai/index.js.map +1 -1
  12. package/dist/ai/models/openai/openai.d.ts +2 -0
  13. package/dist/ai/models/openai/openai.d.ts.map +1 -0
  14. package/dist/ai/models/openai/openai.js +9 -0
  15. package/dist/ai/models/openai/openai.js.map +1 -0
  16. package/dist/ai/schemas/lexicalJsonSchema.d.ts +373 -1
  17. package/dist/ai/schemas/lexicalJsonSchema.d.ts.map +1 -1
  18. package/dist/ai/schemas/lexicalJsonSchema.js +13 -9
  19. package/dist/ai/schemas/lexicalJsonSchema.js.map +1 -1
  20. package/dist/ai/utils/systemGenerate.d.ts +1 -1
  21. package/dist/ai/utils/systemGenerate.d.ts.map +1 -1
  22. package/dist/ai/utils/systemGenerate.js +6 -2
  23. package/dist/ai/utils/systemGenerate.js.map +1 -1
  24. package/dist/collections/Instructions.d.ts +2 -1
  25. package/dist/collections/Instructions.d.ts.map +1 -1
  26. package/dist/collections/Instructions.js +36 -46
  27. package/dist/collections/Instructions.js.map +1 -1
  28. package/dist/endpoints/fetchFields.d.ts +2 -1
  29. package/dist/endpoints/fetchFields.d.ts.map +1 -1
  30. package/dist/endpoints/fetchFields.js +33 -17
  31. package/dist/endpoints/fetchFields.js.map +1 -1
  32. package/dist/endpoints/index.d.ts +2 -2
  33. package/dist/endpoints/index.d.ts.map +1 -1
  34. package/dist/endpoints/index.js +97 -96
  35. package/dist/endpoints/index.js.map +1 -1
  36. package/dist/exports/types.d.ts +1 -1
  37. package/dist/exports/types.d.ts.map +1 -1
  38. package/dist/exports/types.js.map +1 -1
  39. package/dist/fields/ComposeField/ComposeField.js +3 -2
  40. package/dist/fields/ComposeField/ComposeField.js.map +1 -1
  41. package/dist/fields/LexicalEditor/ComposeFeatureComponent.d.ts.map +1 -1
  42. package/dist/fields/LexicalEditor/ComposeFeatureComponent.js +3 -2
  43. package/dist/fields/LexicalEditor/ComposeFeatureComponent.js.map +1 -1
  44. package/dist/fields/LexicalEditor/feature.server.d.ts.map +1 -1
  45. package/dist/fields/LexicalEditor/feature.server.js +2 -3
  46. package/dist/fields/LexicalEditor/feature.server.js.map +1 -1
  47. package/dist/fields/PromptEditorField/PromptEditorField.d.ts.map +1 -1
  48. package/dist/fields/PromptEditorField/PromptEditorField.js +5 -1
  49. package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
  50. package/dist/init.d.ts.map +1 -1
  51. package/dist/init.js +10 -6
  52. package/dist/init.js.map +1 -1
  53. package/dist/libraries/handlebars/replacePlaceholders.d.ts +1 -1
  54. package/dist/libraries/handlebars/replacePlaceholders.d.ts.map +1 -1
  55. package/dist/libraries/handlebars/replacePlaceholders.js.map +1 -1
  56. package/dist/plugin.d.ts.map +1 -1
  57. package/dist/plugin.js +11 -6
  58. package/dist/plugin.js.map +1 -1
  59. package/dist/providers/InstructionsProvider/InstructionsProvider.d.ts +1 -0
  60. package/dist/providers/InstructionsProvider/InstructionsProvider.d.ts.map +1 -1
  61. package/dist/providers/InstructionsProvider/InstructionsProvider.js +11 -4
  62. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  63. package/dist/types.d.ts +13 -2
  64. package/dist/types.d.ts.map +1 -1
  65. package/dist/types.js.map +1 -1
  66. package/dist/ui/Compose/Compose.d.ts +2 -1
  67. package/dist/ui/Compose/Compose.d.ts.map +1 -1
  68. package/dist/ui/Compose/Compose.js +5 -4
  69. package/dist/ui/Compose/Compose.js.map +1 -1
  70. package/dist/ui/Compose/hooks/menu/TranslateMenu.d.ts.map +1 -1
  71. package/dist/ui/Compose/hooks/menu/TranslateMenu.js +4 -0
  72. package/dist/ui/Compose/hooks/menu/TranslateMenu.js.map +1 -1
  73. package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -2
  74. package/dist/ui/Compose/hooks/menu/useMenu.d.ts.map +1 -1
  75. package/dist/ui/Compose/hooks/menu/useMenu.js +8 -4
  76. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  77. package/dist/utilities/getGenerationModels.d.ts +3 -0
  78. package/dist/utilities/getGenerationModels.d.ts.map +1 -0
  79. package/dist/utilities/getGenerationModels.js +10 -0
  80. package/dist/utilities/getGenerationModels.js.map +1 -0
  81. package/dist/utilities/isPluginActivated.d.ts +2 -1
  82. package/dist/utilities/isPluginActivated.d.ts.map +1 -1
  83. package/dist/utilities/isPluginActivated.js +3 -2
  84. package/dist/utilities/isPluginActivated.js.map +1 -1
  85. package/package.json +6 -6
@@ -1,9 +1,9 @@
1
- import { GenerationModels } from '../ai/models/index.js';
2
1
  import { defaultPrompts } from '../ai/prompts.js';
3
2
  import { PLUGIN_API_ENDPOINT_GENERATE, PLUGIN_API_ENDPOINT_GENERATE_UPLOAD, PLUGIN_INSTRUCTIONS_TABLE, PLUGIN_NAME } from '../defaults.js';
4
3
  import { registerEditorHelper } from '../libraries/handlebars/helpers.js';
5
4
  import { handlebarsHelpersMap } from '../libraries/handlebars/helpersMap.js';
6
5
  import { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js';
6
+ import { getGenerationModels } from '../utilities/getGenerationModels.js';
7
7
  const assignPrompt = async (action, { type, actionParams, context, field, layout, systemPrompt = '', template })=>{
8
8
  const prompt = await replacePlaceholders(template, context);
9
9
  const toLexicalHTML = type === 'richText' ? handlebarsHelpersMap.toHTML.name : '';
@@ -33,104 +33,105 @@ const assignPrompt = async (action, { type, actionParams, context, field, layout
33
33
  system
34
34
  };
35
35
  };
36
- export const endpoints = {
37
- textarea: {
38
- handler: async (req)=>{
39
- const data = await req.json?.();
40
- const { locale = 'en', options } = data;
41
- const { action, actionParams, instructionId } = options;
42
- const contextData = data.doc;
43
- if (!instructionId) {
44
- throw new Error(`Instruction ID is required for "${PLUGIN_NAME}" to work, please check your configuration`);
45
- }
46
- const instructions = await req.payload.findByID({
47
- id: instructionId,
48
- collection: PLUGIN_INSTRUCTIONS_TABLE
49
- });
50
- const { collections } = req.payload.config;
51
- const collection = collections.find((collection)=>collection.slug === PLUGIN_INSTRUCTIONS_TABLE);
52
- const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin;
53
- const { schema: editorSchema = {} } = editorConfig;
54
- const { prompt: promptTemplate = '' } = instructions;
55
- const schemaPath = instructions['schema-path'];
56
- const fieldName = schemaPath?.split('.').pop();
57
- registerEditorHelper(req.payload, schemaPath);
58
- const { defaultLocale, locales = [] } = req.payload.config.localization || {};
59
- const localeData = locales.find((l)=>{
60
- return l.code === locale;
61
- });
62
- const localeInfo = localeData?.label[defaultLocale] || locale;
63
- const model = GenerationModels.find((model)=>model.id === instructions['model-id']);
64
- const settingsName = model.settings?.name;
65
- const modelOptions = instructions[settingsName] || {};
66
- const prompts = await assignPrompt(action, {
67
- type: instructions['field-type'],
68
- actionParams,
69
- context: contextData,
70
- field: fieldName,
71
- layout: instructions.layout,
72
- systemPrompt: instructions.system,
73
- template: promptTemplate
74
- });
75
- // console.log('Running handler with prompts:', prompts)
76
- return model.handler?.(prompts.prompt, {
77
- ...modelOptions,
78
- editorSchema,
79
- layout: prompts.layout,
80
- locale: localeInfo,
81
- system: prompts.system
82
- }).catch((error)=>{
83
- console.error('Error: endpoint - generating text:', error);
84
- return new Response(JSON.stringify(error.message), {
85
- status: 500
86
- });
87
- });
88
- },
89
- method: 'post',
90
- path: PLUGIN_API_ENDPOINT_GENERATE
91
- },
92
- upload: {
93
- handler: async (req)=>{
94
- const data = await req.json?.();
95
- const { options } = data;
96
- const { instructionId } = options;
97
- const contextData = data.doc;
98
- let instructions = {
99
- 'model-id': '',
100
- prompt: ''
101
- };
102
- if (instructionId) {
103
- // @ts-expect-error
104
- instructions = await req.payload.findByID({
36
+ export const endpoints = (pluginConfig)=>({
37
+ textarea: {
38
+ //TODO: This is the main endpoint for generating content - its just needs to be renamed to 'generate' or something.
39
+ handler: async (req)=>{
40
+ const data = await req.json?.();
41
+ const { locale = 'en', options } = data;
42
+ const { action, actionParams, instructionId } = options;
43
+ const contextData = data.doc;
44
+ if (!instructionId) {
45
+ throw new Error(`Instruction ID is required for "${PLUGIN_NAME}" to work, please check your configuration`);
46
+ }
47
+ const instructions = await req.payload.findByID({
105
48
  id: instructionId,
106
49
  collection: PLUGIN_INSTRUCTIONS_TABLE
107
50
  });
108
- }
109
- const { prompt: promptTemplate = '' } = instructions;
110
- const schemaPath = instructions['schema-path'];
111
- registerEditorHelper(req.payload, schemaPath);
112
- const text = await replacePlaceholders(promptTemplate, contextData);
113
- const modelId = instructions['model-id'];
114
- const uploadCollectionSlug = instructions['relation-to'];
115
- const model = GenerationModels.find((model)=>model.id === modelId);
116
- const settingsName = model.settings?.name;
117
- const modelOptions = instructions[settingsName] || {};
118
- const result = await model.handler?.(text, modelOptions);
119
- const assetData = await req.payload.create({
120
- collection: uploadCollectionSlug,
121
- data: result.data,
122
- file: result.file
123
- });
124
- return new Response(JSON.stringify({
125
- result: {
126
- id: assetData.id,
127
- alt: assetData.alt
128
- }
129
- }));
51
+ const { collections } = req.payload.config;
52
+ const collection = collections.find((collection)=>collection.slug === PLUGIN_INSTRUCTIONS_TABLE);
53
+ const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin;
54
+ const { schema: editorSchema = {} } = editorConfig;
55
+ const { prompt: promptTemplate = '' } = instructions;
56
+ const schemaPath = instructions['schema-path'];
57
+ const fieldName = schemaPath?.split('.').pop();
58
+ registerEditorHelper(req.payload, schemaPath);
59
+ const { defaultLocale, locales = [] } = req.payload.config.localization || {};
60
+ const localeData = locales.find((l)=>{
61
+ return l.code === locale;
62
+ });
63
+ const localeInfo = localeData?.label[defaultLocale] || locale;
64
+ const model = getGenerationModels(pluginConfig).find((model)=>model.id === instructions['model-id']);
65
+ const settingsName = model.settings?.name;
66
+ const modelOptions = instructions[settingsName] || {};
67
+ const prompts = await assignPrompt(action, {
68
+ type: instructions['field-type'],
69
+ actionParams,
70
+ context: contextData,
71
+ field: fieldName,
72
+ layout: instructions.layout,
73
+ systemPrompt: instructions.system,
74
+ template: promptTemplate
75
+ });
76
+ // console.log('Running handler with prompts:', prompts)
77
+ return model.handler?.(prompts.prompt, {
78
+ ...modelOptions,
79
+ editorSchema,
80
+ layout: prompts.layout,
81
+ locale: localeInfo,
82
+ system: prompts.system
83
+ }).catch((error)=>{
84
+ console.error('Error: endpoint - generating text:', error);
85
+ return new Response(JSON.stringify(error.message), {
86
+ status: 500
87
+ });
88
+ });
89
+ },
90
+ method: 'post',
91
+ path: PLUGIN_API_ENDPOINT_GENERATE
130
92
  },
131
- method: 'post',
132
- path: PLUGIN_API_ENDPOINT_GENERATE_UPLOAD
133
- }
134
- };
93
+ upload: {
94
+ handler: async (req)=>{
95
+ const data = await req.json?.();
96
+ const { options } = data;
97
+ const { instructionId } = options;
98
+ const contextData = data.doc;
99
+ let instructions = {
100
+ 'model-id': '',
101
+ prompt: ''
102
+ };
103
+ if (instructionId) {
104
+ // @ts-expect-error
105
+ instructions = await req.payload.findByID({
106
+ id: instructionId,
107
+ collection: PLUGIN_INSTRUCTIONS_TABLE
108
+ });
109
+ }
110
+ const { prompt: promptTemplate = '' } = instructions;
111
+ const schemaPath = instructions['schema-path'];
112
+ registerEditorHelper(req.payload, schemaPath);
113
+ const text = await replacePlaceholders(promptTemplate, contextData);
114
+ const modelId = instructions['model-id'];
115
+ const uploadCollectionSlug = instructions['relation-to'];
116
+ const model = getGenerationModels(pluginConfig).find((model)=>model.id === modelId);
117
+ const settingsName = model.settings?.name;
118
+ const modelOptions = instructions[settingsName] || {};
119
+ const result = await model.handler?.(text, modelOptions);
120
+ const assetData = await req.payload.create({
121
+ collection: uploadCollectionSlug,
122
+ data: result.data,
123
+ file: result.file
124
+ });
125
+ return new Response(JSON.stringify({
126
+ result: {
127
+ id: assetData.id,
128
+ alt: assetData.alt
129
+ }
130
+ }));
131
+ },
132
+ method: 'post',
133
+ path: PLUGIN_API_ENDPOINT_GENERATE_UPLOAD
134
+ }
135
+ });
135
136
 
136
137
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/endpoints/index.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport type { ActionMenuItems, Endpoints } from '../types.js'\n\nimport { GenerationModels } from '../ai/models/index.js'\nimport { defaultPrompts } from '../ai/prompts.js'\nimport {\n PLUGIN_API_ENDPOINT_GENERATE,\n PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n PLUGIN_INSTRUCTIONS_TABLE,\n PLUGIN_NAME,\n} from '../defaults.js'\nimport { registerEditorHelper } from '../libraries/handlebars/helpers.js'\nimport { handlebarsHelpersMap } from '../libraries/handlebars/helpersMap.js'\nimport { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js'\n\nconst assignPrompt = async (\n action: ActionMenuItems,\n {\n type,\n actionParams,\n context,\n field,\n layout,\n systemPrompt = '',\n template,\n }: {\n actionParams: Record<any, any>\n context: object\n field: string\n layout: string\n systemPrompt: string\n template: string\n type: string\n },\n) => {\n const prompt = await replacePlaceholders(template, context)\n const toLexicalHTML = type === 'richText' ? handlebarsHelpersMap.toHTML.name : ''\n\n const assignedPrompts = {\n layout: type === 'richText' ? layout : undefined,\n prompt,\n //TODO: Define only once on a collection level\n system: type === 'richText' ? systemPrompt : undefined,\n }\n\n if (action === 'Compose') {\n return assignedPrompts\n }\n\n const { layout: getLayout, system: getSystemPrompt } = defaultPrompts.find(\n (p) => p.name === action,\n )\n\n let updatedLayout = layout\n if (getLayout) {\n updatedLayout = getLayout()\n }\n\n const system = getSystemPrompt({\n ...(actionParams || {}),\n prompt,\n systemPrompt,\n })\n\n return {\n layout: updatedLayout,\n // TODO: revisit this toLexicalHTML\n prompt: await replacePlaceholders(`{{${toLexicalHTML} ${field}}}`, context),\n system,\n }\n}\n\nexport const endpoints: Endpoints = {\n textarea: { //TODO: This is the main endpoint for generating content - its just needs to be renamed to 'generate' or something.\n handler: async (req: PayloadRequest) => {\n const data = await req.json?.()\n\n const { locale = 'en', options } = data\n const { action, actionParams, instructionId } = options\n const contextData = data.doc\n\n if (!instructionId) {\n throw new Error(\n `Instruction ID is required for \"${PLUGIN_NAME}\" to work, please check your configuration`,\n )\n }\n\n const instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n })\n\n const { collections } = req.payload.config\n const collection = collections.find(\n (collection) => collection.slug === PLUGIN_INSTRUCTIONS_TABLE,\n )\n\n const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin\n const { schema: editorSchema = {} } = editorConfig\n const { prompt: promptTemplate = '' } = instructions\n\n const schemaPath = instructions['schema-path'] as string\n const fieldName = schemaPath?.split('.').pop()\n\n registerEditorHelper(req.payload, schemaPath)\n\n const { defaultLocale, locales = [] } = req.payload.config.localization || {}\n const localeData = locales.find((l) => {\n return l.code === locale\n })\n\n const localeInfo = localeData?.label[defaultLocale] || locale\n\n const model = GenerationModels.find((model) => model.id === instructions['model-id'])\n const settingsName = model.settings?.name\n const modelOptions = instructions[settingsName] || {}\n\n const prompts = await assignPrompt(action, {\n type: instructions['field-type'] as string,\n actionParams,\n context: contextData,\n field: fieldName,\n layout: instructions.layout,\n systemPrompt: instructions.system,\n template: promptTemplate as string,\n })\n\n // console.log('Running handler with prompts:', prompts)\n return model\n .handler?.(prompts.prompt, {\n ...modelOptions,\n editorSchema,\n layout: prompts.layout,\n locale: localeInfo,\n system: prompts.system,\n })\n .catch((error) => {\n console.error('Error: endpoint - generating text:', error)\n return new Response(JSON.stringify(error.message), { status: 500 })\n })\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE,\n },\n upload: {\n handler: async (req: PayloadRequest) => {\n const data = await req.json?.()\n\n const { options } = data\n const { instructionId } = options\n const contextData = data.doc\n\n let instructions = { 'model-id': '', prompt: '' }\n\n if (instructionId) {\n // @ts-expect-error\n instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n })\n }\n\n const { prompt: promptTemplate = '' } = instructions\n const schemaPath = instructions['schema-path']\n\n registerEditorHelper(req.payload, schemaPath)\n\n const text = await replacePlaceholders(promptTemplate, contextData)\n const modelId = instructions['model-id']\n const uploadCollectionSlug = instructions['relation-to']\n\n const model = GenerationModels.find((model) => model.id === modelId)\n const settingsName = model.settings?.name\n const modelOptions = instructions[settingsName] || {}\n\n const result = await model.handler?.(text, modelOptions)\n\n const assetData = await req.payload.create({\n collection: uploadCollectionSlug,\n data: result.data,\n file: result.file,\n })\n\n return new Response(\n JSON.stringify({\n result: {\n id: assetData.id,\n alt: assetData.alt,\n },\n }),\n )\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n },\n}\n"],"names":["GenerationModels","defaultPrompts","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","registerEditorHelper","handlebarsHelpersMap","replacePlaceholders","assignPrompt","action","type","actionParams","context","field","layout","systemPrompt","template","prompt","toLexicalHTML","toHTML","name","assignedPrompts","undefined","system","getLayout","getSystemPrompt","find","p","updatedLayout","endpoints","textarea","handler","req","data","json","locale","options","instructionId","contextData","doc","Error","instructions","payload","findByID","id","collection","collections","config","slug","custom","editorConfig","admin","schema","editorSchema","promptTemplate","schemaPath","fieldName","split","pop","defaultLocale","locales","localization","localeData","l","code","localeInfo","label","model","settingsName","settings","modelOptions","prompts","catch","error","console","Response","JSON","stringify","message","status","method","path","upload","text","modelId","uploadCollectionSlug","result","assetData","create","file","alt"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/endpoints/index.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport type { ActionMenuItems, Endpoints, PluginConfig } from '../types.js'\n\nimport { defaultPrompts } from '../ai/prompts.js'\nimport {\n PLUGIN_API_ENDPOINT_GENERATE,\n PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n PLUGIN_INSTRUCTIONS_TABLE,\n PLUGIN_NAME,\n} from '../defaults.js'\nimport { registerEditorHelper } from '../libraries/handlebars/helpers.js'\nimport { handlebarsHelpersMap } from '../libraries/handlebars/helpersMap.js'\nimport { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js'\nimport { getGenerationModels } from '../utilities/getGenerationModels.js'\n\nconst assignPrompt = async (\n action: ActionMenuItems,\n {\n type,\n actionParams,\n context,\n field,\n layout,\n systemPrompt = '',\n template,\n }: {\n actionParams: Record<any, any>\n context: object\n field: string\n layout: string\n systemPrompt: string\n template: string\n type: string\n },\n) => {\n const prompt = await replacePlaceholders(template, context)\n const toLexicalHTML = type === 'richText' ? handlebarsHelpersMap.toHTML.name : ''\n\n const assignedPrompts = {\n layout: type === 'richText' ? layout : undefined,\n prompt,\n //TODO: Define only once on a collection level\n system: type === 'richText' ? systemPrompt : undefined,\n }\n\n if (action === 'Compose') {\n return assignedPrompts\n }\n\n const { layout: getLayout, system: getSystemPrompt } = defaultPrompts.find(\n (p) => p.name === action,\n )\n\n let updatedLayout = layout\n if (getLayout) {\n updatedLayout = getLayout()\n }\n\n const system = getSystemPrompt({\n ...(actionParams || {}),\n prompt,\n systemPrompt,\n })\n\n return {\n layout: updatedLayout,\n // TODO: revisit this toLexicalHTML\n prompt: await replacePlaceholders(`{{${toLexicalHTML} ${field}}}`, context),\n system,\n }\n}\n\nexport const endpoints: (pluginConfig: PluginConfig) => Endpoints = (pluginConfig) =>\n ({\n textarea: {\n //TODO: This is the main endpoint for generating content - its just needs to be renamed to 'generate' or something.\n handler: async (req: PayloadRequest) => {\n const data = await req.json?.()\n\n const { locale = 'en', options } = data\n const { action, actionParams, instructionId } = options\n const contextData = data.doc\n\n if (!instructionId) {\n throw new Error(\n `Instruction ID is required for \"${PLUGIN_NAME}\" to work, please check your configuration`,\n )\n }\n\n const instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n })\n\n const { collections } = req.payload.config\n const collection = collections.find(\n (collection) => collection.slug === PLUGIN_INSTRUCTIONS_TABLE,\n )\n\n const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin\n const { schema: editorSchema = {} } = editorConfig\n const { prompt: promptTemplate = '' } = instructions\n\n const schemaPath = instructions['schema-path'] as string\n const fieldName = schemaPath?.split('.').pop()\n\n registerEditorHelper(req.payload, schemaPath)\n\n const { defaultLocale, locales = [] } = req.payload.config.localization || {}\n const localeData = locales.find((l) => {\n return l.code === locale\n })\n\n const localeInfo = localeData?.label[defaultLocale] || locale\n\n const model = getGenerationModels(pluginConfig)\n .find((model) => model.id === instructions['model-id'])\n const settingsName = model.settings?.name\n const modelOptions = instructions[settingsName] || {}\n\n const prompts = await assignPrompt(action, {\n type: instructions['field-type'] as string,\n actionParams,\n context: contextData,\n field: fieldName,\n layout: instructions.layout,\n systemPrompt: instructions.system,\n template: promptTemplate as string,\n })\n\n // console.log('Running handler with prompts:', prompts)\n return model\n .handler?.(prompts.prompt, {\n ...modelOptions,\n editorSchema,\n layout: prompts.layout,\n locale: localeInfo,\n system: prompts.system,\n })\n .catch((error) => {\n console.error('Error: endpoint - generating text:', error)\n return new Response(JSON.stringify(error.message), { status: 500 })\n })\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE,\n },\n upload: {\n handler: async (req: PayloadRequest) => {\n const data = await req.json?.()\n\n const { options } = data\n const { instructionId } = options\n const contextData = data.doc\n\n let instructions = { 'model-id': '', prompt: '' }\n\n if (instructionId) {\n // @ts-expect-error\n instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n })\n }\n\n const { prompt: promptTemplate = '' } = instructions\n const schemaPath = instructions['schema-path']\n\n registerEditorHelper(req.payload, schemaPath)\n\n const text = await replacePlaceholders(promptTemplate, contextData)\n const modelId = instructions['model-id']\n const uploadCollectionSlug = instructions['relation-to']\n\n const model = getGenerationModels(pluginConfig)\n .find((model) => model.id === modelId)\n const settingsName = model.settings?.name\n const modelOptions = instructions[settingsName] || {}\n\n const result = await model.handler?.(text, modelOptions)\n\n const assetData = await req.payload.create({\n collection: uploadCollectionSlug,\n data: result.data,\n file: result.file,\n })\n\n return new Response(\n JSON.stringify({\n result: {\n id: assetData.id,\n alt: assetData.alt,\n },\n }),\n )\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n },\n }) satisfies Endpoints\n"],"names":["defaultPrompts","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","registerEditorHelper","handlebarsHelpersMap","replacePlaceholders","getGenerationModels","assignPrompt","action","type","actionParams","context","field","layout","systemPrompt","template","prompt","toLexicalHTML","toHTML","name","assignedPrompts","undefined","system","getLayout","getSystemPrompt","find","p","updatedLayout","endpoints","pluginConfig","textarea","handler","req","data","json","locale","options","instructionId","contextData","doc","Error","instructions","payload","findByID","id","collection","collections","config","slug","custom","editorConfig","admin","schema","editorSchema","promptTemplate","schemaPath","fieldName","split","pop","defaultLocale","locales","localization","localeData","l","code","localeInfo","label","model","settingsName","settings","modelOptions","prompts","catch","error","console","Response","JSON","stringify","message","status","method","path","upload","text","modelId","uploadCollectionSlug","result","assetData","create","file","alt"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  export type { payloadAiPlugin } from '../plugin.ts';
2
- export type { PluginConfig } from '../types.ts';
2
+ export type { PluginConfig, GenerationConfig, GenerationModel } from '../types.ts';
3
3
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/exports/types.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACnD,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/exports/types.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACnD,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/types.ts"],"sourcesContent":["export type { payloadAiPlugin } from '../plugin.ts'\nexport type { PluginConfig } from '../types.ts'\n"],"names":[],"mappings":"AACA,WAA+C"}
1
+ {"version":3,"sources":["../../src/exports/types.ts"],"sourcesContent":["export type { payloadAiPlugin } from '../plugin.ts'\nexport type { PluginConfig, GenerationConfig, GenerationModel } from '../types.ts'"],"names":[],"mappings":"AACA,WAAkF"}
@@ -5,7 +5,7 @@ import { FieldProvider } from '../../providers/FieldProvider/FieldProvider.js';
5
5
  import { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js';
6
6
  import { Compose } from '../../ui/Compose/Compose.js';
7
7
  export const ComposeField = (props)=>{
8
- const { id: instructionId } = useInstructions({
8
+ const { id: instructionId, isConfigAllowed } = useInstructions({
9
9
  schemaPath: props?.schemaPath
10
10
  });
11
11
  return /*#__PURE__*/ _jsx(FieldProvider, {
@@ -16,7 +16,8 @@ export const ComposeField = (props)=>{
16
16
  },
17
17
  children: /*#__PURE__*/ _jsx(Compose, {
18
18
  descriptionProps: props,
19
- instructionId: instructionId
19
+ instructionId: instructionId,
20
+ isConfigAllowed: isConfigAllowed
20
21
  })
21
22
  });
22
23
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/ComposeField/ComposeField.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\n\nimport { FieldProvider } from '../../providers/FieldProvider/FieldProvider.js'\nimport { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js'\nimport { Compose } from '../../ui/Compose/Compose.js'\n\nexport const ComposeField = (props) => {\n\n const { id: instructionId } = useInstructions({\n schemaPath: props?.schemaPath,\n })\n\n return (\n <FieldProvider\n context={{\n type: props?.field.type,\n path: props?.path,\n schemaPath: props?.schemaPath,\n }}\n >\n <Compose descriptionProps={props} instructionId={instructionId} />\n </FieldProvider>\n )\n}\n"],"names":["React","FieldProvider","useInstructions","Compose","ComposeField","props","id","instructionId","schemaPath","context","type","field","path","descriptionProps"],"mappings":"AAAA;;AAEA,OAAOA,WAAW,QAAO;AAEzB,SAASC,aAAa,QAAQ,iDAAgD;AAC9E,SAASC,eAAe,QAAQ,0DAAyD;AACzF,SAASC,OAAO,QAAQ,8BAA6B;AAErD,OAAO,MAAMC,eAAe,CAACC;IAE3B,MAAM,EAAEC,IAAIC,aAAa,EAAE,GAAGL,gBAAgB;QAC5CM,YAAYH,OAAOG;IACrB;IAEA,qBACE,KAACP;QACCQ,SAAS;YACPC,MAAML,OAAOM,MAAMD;YACnBE,MAAMP,OAAOO;YACbJ,YAAYH,OAAOG;QACrB;kBAEA,cAAA,KAACL;YAAQU,kBAAkBR;YAAOE,eAAeA;;;AAGvD,EAAC"}
1
+ {"version":3,"sources":["../../../src/fields/ComposeField/ComposeField.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\n\nimport { FieldProvider } from '../../providers/FieldProvider/FieldProvider.js'\nimport { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js'\nimport { Compose } from '../../ui/Compose/Compose.js'\n\nexport const ComposeField = (props) => {\n\n const { id: instructionId, isConfigAllowed } = useInstructions({\n schemaPath: props?.schemaPath,\n })\n\n return (\n <FieldProvider\n context={{\n type: props?.field.type,\n path: props?.path,\n schemaPath: props?.schemaPath,\n }}\n >\n <Compose descriptionProps={props} instructionId={instructionId} isConfigAllowed={isConfigAllowed} />\n </FieldProvider>\n )\n}\n"],"names":["React","FieldProvider","useInstructions","Compose","ComposeField","props","id","instructionId","isConfigAllowed","schemaPath","context","type","field","path","descriptionProps"],"mappings":"AAAA;;AAEA,OAAOA,WAAW,QAAO;AAEzB,SAASC,aAAa,QAAQ,iDAAgD;AAC9E,SAASC,eAAe,QAAQ,0DAAyD;AACzF,SAASC,OAAO,QAAQ,8BAA6B;AAErD,OAAO,MAAMC,eAAe,CAACC;IAE3B,MAAM,EAAEC,IAAIC,aAAa,EAAEC,eAAe,EAAE,GAAGN,gBAAgB;QAC7DO,YAAYJ,OAAOI;IACrB;IAEA,qBACE,KAACR;QACCS,SAAS;YACPC,MAAMN,OAAOO,MAAMD;YACnBE,MAAMR,OAAOQ;YACbJ,YAAYJ,OAAOI;QACrB;kBAEA,cAAA,KAACN;YAAQW,kBAAkBT;YAAOE,eAAeA;YAAeC,iBAAiBA;;;AAGvF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ComposeFeatureComponent.d.ts","sourceRoot":"","sources":["../../../src/fields/LexicalEditor/ComposeFeatureComponent.tsx"],"names":[],"mappings":"AAMA,eAAO,MAAM,uBAAuB,GAAI,OAAO,GAAG,4CAwBjD,CAAA"}
1
+ {"version":3,"file":"ComposeFeatureComponent.d.ts","sourceRoot":"","sources":["../../../src/fields/LexicalEditor/ComposeFeatureComponent.tsx"],"names":[],"mappings":"AAMA,eAAO,MAAM,uBAAuB,GAAI,OAAO,GAAG,4CAyBjD,CAAA"}
@@ -4,7 +4,7 @@ import { FieldProvider } from '../../providers/FieldProvider/FieldProvider.js';
4
4
  import { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js';
5
5
  import { Compose } from '../../ui/Compose/Compose.js';
6
6
  export const ComposeFeatureComponent = (props)=>{
7
- const { id: instructionId } = useInstructions({
7
+ const { id: instructionId, isConfigAllowed } = useInstructions({
8
8
  schemaPath: props?.clientProps?.schemaPath
9
9
  });
10
10
  return /*#__PURE__*/ _jsx(FieldProvider, {
@@ -20,7 +20,8 @@ export const ComposeFeatureComponent = (props)=>{
20
20
  schemaPath: props?.clientProps?.schemaPath,
21
21
  ...props?.clientProps
22
22
  },
23
- instructionId: instructionId
23
+ instructionId: instructionId,
24
+ isConfigAllowed: isConfigAllowed
24
25
  })
25
26
  });
26
27
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/LexicalEditor/ComposeFeatureComponent.tsx"],"sourcesContent":["import React from 'react'\n\nimport { FieldProvider } from '../../providers/FieldProvider/FieldProvider.js'\nimport { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js'\nimport { Compose } from '../../ui/Compose/Compose.js'\n\nexport const ComposeFeatureComponent = (props: any) => {\n const { id: instructionId } = useInstructions({\n schemaPath: props?.clientProps?.schemaPath,\n })\n\n return (\n <FieldProvider\n context={{\n type: props?.clientProps?.field?.type,\n path: props?.clientProps?.path,\n schemaPath: props?.clientProps?.schemaPath,\n }}\n >\n <Compose\n descriptionProps={{\n field: props?.clientProps?.field,\n path: props?.clientProps?.path,\n schemaPath: props?.clientProps?.schemaPath,\n ...props?.clientProps,\n }}\n instructionId={instructionId}\n />\n </FieldProvider>\n )\n}\n"],"names":["React","FieldProvider","useInstructions","Compose","ComposeFeatureComponent","props","id","instructionId","schemaPath","clientProps","context","type","field","path","descriptionProps"],"mappings":";AAAA,OAAOA,WAAW,QAAO;AAEzB,SAASC,aAAa,QAAQ,iDAAgD;AAC9E,SAASC,eAAe,QAAQ,0DAAyD;AACzF,SAASC,OAAO,QAAQ,8BAA6B;AAErD,OAAO,MAAMC,0BAA0B,CAACC;IACtC,MAAM,EAAEC,IAAIC,aAAa,EAAE,GAAGL,gBAAgB;QAC5CM,YAAYH,OAAOI,aAAaD;IAClC;IAEA,qBACE,KAACP;QACCS,SAAS;YACPC,MAAMN,OAAOI,aAAaG,OAAOD;YACjCE,MAAMR,OAAOI,aAAaI;YAC1BL,YAAYH,OAAOI,aAAaD;QAClC;kBAEA,cAAA,KAACL;YACCW,kBAAkB;gBAChBF,OAAOP,OAAOI,aAAaG;gBAC3BC,MAAMR,OAAOI,aAAaI;gBAC1BL,YAAYH,OAAOI,aAAaD;gBAChC,GAAGH,OAAOI,WAAW;YACvB;YACAF,eAAeA;;;AAIvB,EAAC"}
1
+ {"version":3,"sources":["../../../src/fields/LexicalEditor/ComposeFeatureComponent.tsx"],"sourcesContent":["import React from 'react'\n\nimport { FieldProvider } from '../../providers/FieldProvider/FieldProvider.js'\nimport { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js'\nimport { Compose } from '../../ui/Compose/Compose.js'\n\nexport const ComposeFeatureComponent = (props: any) => {\n const { id: instructionId, isConfigAllowed } = useInstructions({\n schemaPath: props?.clientProps?.schemaPath,\n })\n\n return (\n <FieldProvider\n context={{\n type: props?.clientProps?.field?.type,\n path: props?.clientProps?.path,\n schemaPath: props?.clientProps?.schemaPath,\n }}\n >\n <Compose\n descriptionProps={{\n field: props?.clientProps?.field,\n path: props?.clientProps?.path,\n schemaPath: props?.clientProps?.schemaPath,\n ...props?.clientProps,\n }}\n instructionId={instructionId}\n isConfigAllowed={isConfigAllowed}\n />\n </FieldProvider>\n )\n}\n"],"names":["React","FieldProvider","useInstructions","Compose","ComposeFeatureComponent","props","id","instructionId","isConfigAllowed","schemaPath","clientProps","context","type","field","path","descriptionProps"],"mappings":";AAAA,OAAOA,WAAW,QAAO;AAEzB,SAASC,aAAa,QAAQ,iDAAgD;AAC9E,SAASC,eAAe,QAAQ,0DAAyD;AACzF,SAASC,OAAO,QAAQ,8BAA6B;AAErD,OAAO,MAAMC,0BAA0B,CAACC;IACtC,MAAM,EAAEC,IAAIC,aAAa,EAAEC,eAAe,EAAE,GAAGN,gBAAgB;QAC7DO,YAAYJ,OAAOK,aAAaD;IAClC;IAEA,qBACE,KAACR;QACCU,SAAS;YACPC,MAAMP,OAAOK,aAAaG,OAAOD;YACjCE,MAAMT,OAAOK,aAAaI;YAC1BL,YAAYJ,OAAOK,aAAaD;QAClC;kBAEA,cAAA,KAACN;YACCY,kBAAkB;gBAChBF,OAAOR,OAAOK,aAAaG;gBAC3BC,MAAMT,OAAOK,aAAaI;gBAC1BL,YAAYJ,OAAOK,aAAaD;gBAChC,GAAGJ,OAAOK,WAAW;YACvB;YACAH,eAAeA;YACfC,iBAAiBA;;;AAIzB,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"feature.server.d.ts","sourceRoot":"","sources":["../../../src/fields/LexicalEditor/feature.server.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,mCAAmC,uGAK9C,CAAA"}
1
+ {"version":3,"file":"feature.server.d.ts","sourceRoot":"","sources":["../../../src/fields/LexicalEditor/feature.server.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,mCAAmC,uGAK9C,CAAA"}
@@ -1,10 +1,9 @@
1
1
  import { createServerFeature } from '@payloadcms/richtext-lexical';
2
2
  import { PLUGIN_LEXICAL_EDITOR_FEATURE } from '../../defaults.js';
3
- import { isPluginActivated } from '../../utilities/isPluginActivated.js';
4
- const isActivated = isPluginActivated();
3
+ // TODO: Find a way to check if the plugin is activated
5
4
  export const PayloadAiPluginLexicalEditorFeature = createServerFeature({
6
5
  feature: {
7
- ClientFeature: isActivated ? '@ai-stack/payloadcms/client#LexicalEditorFeatureClient' : null
6
+ ClientFeature: '@ai-stack/payloadcms/client#LexicalEditorFeatureClient'
8
7
  },
9
8
  key: PLUGIN_LEXICAL_EDITOR_FEATURE
10
9
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/LexicalEditor/feature.server.ts"],"sourcesContent":["import { createServerFeature } from '@payloadcms/richtext-lexical'\n\nimport { PLUGIN_LEXICAL_EDITOR_FEATURE } from '../../defaults.js'\nimport { isPluginActivated } from '../../utilities/isPluginActivated.js'\n\nconst isActivated = isPluginActivated()\n\nexport const PayloadAiPluginLexicalEditorFeature = createServerFeature({\n feature: {\n ClientFeature: isActivated ? '@ai-stack/payloadcms/client#LexicalEditorFeatureClient' : null,\n },\n key: PLUGIN_LEXICAL_EDITOR_FEATURE,\n})\n"],"names":["createServerFeature","PLUGIN_LEXICAL_EDITOR_FEATURE","isPluginActivated","isActivated","PayloadAiPluginLexicalEditorFeature","feature","ClientFeature","key"],"mappings":"AAAA,SAASA,mBAAmB,QAAQ,+BAA8B;AAElE,SAASC,6BAA6B,QAAQ,oBAAmB;AACjE,SAASC,iBAAiB,QAAQ,uCAAsC;AAExE,MAAMC,cAAcD;AAEpB,OAAO,MAAME,sCAAsCJ,oBAAoB;IACrEK,SAAS;QACPC,eAAeH,cAAc,2DAA2D;IAC1F;IACAI,KAAKN;AACP,GAAE"}
1
+ {"version":3,"sources":["../../../src/fields/LexicalEditor/feature.server.ts"],"sourcesContent":["import { createServerFeature } from '@payloadcms/richtext-lexical'\n\nimport { PLUGIN_LEXICAL_EDITOR_FEATURE } from '../../defaults.js'\n\n// TODO: Find a way to check if the plugin is activated\nexport const PayloadAiPluginLexicalEditorFeature = createServerFeature({\n feature: {\n ClientFeature: '@ai-stack/payloadcms/client#LexicalEditorFeatureClient',\n },\n key: PLUGIN_LEXICAL_EDITOR_FEATURE,\n})\n"],"names":["createServerFeature","PLUGIN_LEXICAL_EDITOR_FEATURE","PayloadAiPluginLexicalEditorFeature","feature","ClientFeature","key"],"mappings":"AAAA,SAASA,mBAAmB,QAAQ,+BAA8B;AAElE,SAASC,6BAA6B,QAAQ,oBAAmB;AAEjE,uDAAuD;AACvD,OAAO,MAAMC,sCAAsCF,oBAAoB;IACrEG,SAAS;QACPC,eAAe;IACjB;IACAC,KAAKJ;AACP,GAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"PromptEditorField.d.ts","sourceRoot":"","sources":["../../../src/fields/PromptEditorField/PromptEditorField.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAGvD,OAAO,KAAK,MAAM,OAAO,CAAA;AAMzB,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAyBhE,CAAA"}
1
+ {"version":3,"file":"PromptEditorField.d.ts","sourceRoot":"","sources":["../../../src/fields/PromptEditorField/PromptEditorField.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAGvD,OAAO,KAAK,MAAM,OAAO,CAAA;AAMzB,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CA0BhE,CAAA"}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { FieldLabel, useField } from '@payloadcms/ui';
3
+ import { FieldDescription, FieldLabel, useField } from '@payloadcms/ui';
4
4
  import React from 'react';
5
5
  import { AutocompleteTextField } from '../../libraries/autocomplete/AutocompleteTextArea.js';
6
6
  import { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js';
@@ -29,6 +29,10 @@ export const PromptEditorField = (props)=>{
29
29
  '{{ '
30
30
  ],
31
31
  value: value
32
+ }),
33
+ /*#__PURE__*/ _jsx(FieldDescription, {
34
+ description: field?.admin?.description,
35
+ path: ""
32
36
  })
33
37
  ]
34
38
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/PromptEditorField/PromptEditorField.tsx"],"sourcesContent":["'use client'\n\nimport type { TextareaFieldClientProps } from 'payload'\n\nimport { FieldLabel, useField } from '@payloadcms/ui'\nimport React from 'react'\n\nimport { AutocompleteTextField } from '../../libraries/autocomplete/AutocompleteTextArea.js'\nimport { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js'\n\n//NOTE: HMR does not work for plugin components anymore, I think it has to do with importMap/ string path\nexport const PromptEditorField: React.FC<TextareaFieldClientProps> = (props) => {\n const { field, path: pathFromContext } = props\n\n const { setValue, value } = useField<string>({\n path: pathFromContext,\n })\n\n const { promptEditorSuggestions } = useInstructions()\n\n return (\n <div className=\"field-type textarea\">\n <FieldLabel label={field.label} />\n <AutocompleteTextField\n changeOnSelect={(trigger, selected) => {\n return trigger + selected + ' }}'\n }}\n onChange={(val: string) => {\n setValue(val)\n }}\n options={promptEditorSuggestions}\n trigger={['{{ ']}\n value={value}\n />\n </div>\n )\n}\n"],"names":["FieldLabel","useField","React","AutocompleteTextField","useInstructions","PromptEditorField","props","field","path","pathFromContext","setValue","value","promptEditorSuggestions","div","className","label","changeOnSelect","trigger","selected","onChange","val","options"],"mappings":"AAAA;;AAIA,SAASA,UAAU,EAAEC,QAAQ,QAAQ,iBAAgB;AACrD,OAAOC,WAAW,QAAO;AAEzB,SAASC,qBAAqB,QAAQ,uDAAsD;AAC5F,SAASC,eAAe,QAAQ,0DAAyD;AAEzF,yGAAyG;AACzG,OAAO,MAAMC,oBAAwD,CAACC;IACpE,MAAM,EAAEC,KAAK,EAAEC,MAAMC,eAAe,EAAE,GAAGH;IAEzC,MAAM,EAAEI,QAAQ,EAAEC,KAAK,EAAE,GAAGV,SAAiB;QAC3CO,MAAMC;IACR;IAEA,MAAM,EAAEG,uBAAuB,EAAE,GAAGR;IAEpC,qBACE,MAACS;QAAIC,WAAU;;0BACb,KAACd;gBAAWe,OAAOR,MAAMQ,KAAK;;0BAC9B,KAACZ;gBACCa,gBAAgB,CAACC,SAASC;oBACxB,OAAOD,UAAUC,WAAW;gBAC9B;gBACAC,UAAU,CAACC;oBACTV,SAASU;gBACX;gBACAC,SAAST;gBACTK,SAAS;oBAAC;iBAAM;gBAChBN,OAAOA;;;;AAIf,EAAC"}
1
+ {"version":3,"sources":["../../../src/fields/PromptEditorField/PromptEditorField.tsx"],"sourcesContent":["'use client'\n\nimport type { TextareaFieldClientProps } from 'payload'\n\nimport { FieldDescription, FieldLabel, useField } from '@payloadcms/ui'\nimport React from 'react'\n\nimport { AutocompleteTextField } from '../../libraries/autocomplete/AutocompleteTextArea.js'\nimport { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js'\n\n//NOTE: HMR does not work for plugin components anymore, I think it has to do with importMap/ string path\nexport const PromptEditorField: React.FC<TextareaFieldClientProps> = (props) => {\n const { field, path: pathFromContext } = props\n\n const { setValue, value } = useField<string>({\n path: pathFromContext,\n })\n\n const { promptEditorSuggestions } = useInstructions()\n\n return (\n <div className=\"field-type textarea\">\n <FieldLabel label={field.label} />\n <AutocompleteTextField\n changeOnSelect={(trigger, selected) => {\n return trigger + selected + ' }}'\n }}\n onChange={(val: string) => {\n setValue(val)\n }}\n options={promptEditorSuggestions}\n trigger={['{{ ']}\n value={value}\n />\n <FieldDescription description={field?.admin?.description} path=\"\" />\n </div>\n )\n}\n"],"names":["FieldDescription","FieldLabel","useField","React","AutocompleteTextField","useInstructions","PromptEditorField","props","field","path","pathFromContext","setValue","value","promptEditorSuggestions","div","className","label","changeOnSelect","trigger","selected","onChange","val","options","description","admin"],"mappings":"AAAA;;AAIA,SAASA,gBAAgB,EAAEC,UAAU,EAAEC,QAAQ,QAAQ,iBAAgB;AACvE,OAAOC,WAAW,QAAO;AAEzB,SAASC,qBAAqB,QAAQ,uDAAsD;AAC5F,SAASC,eAAe,QAAQ,0DAAyD;AAEzF,yGAAyG;AACzG,OAAO,MAAMC,oBAAwD,CAACC;IACpE,MAAM,EAAEC,KAAK,EAAEC,MAAMC,eAAe,EAAE,GAAGH;IAEzC,MAAM,EAAEI,QAAQ,EAAEC,KAAK,EAAE,GAAGV,SAAiB;QAC3CO,MAAMC;IACR;IAEA,MAAM,EAAEG,uBAAuB,EAAE,GAAGR;IAEpC,qBACE,MAACS;QAAIC,WAAU;;0BACb,KAACd;gBAAWe,OAAOR,MAAMQ,KAAK;;0BAC9B,KAACZ;gBACCa,gBAAgB,CAACC,SAASC;oBACxB,OAAOD,UAAUC,WAAW;gBAC9B;gBACAC,UAAU,CAACC;oBACTV,SAASU;gBACX;gBACAC,SAAST;gBACTK,SAAS;oBAAC;iBAAM;gBAChBN,OAAOA;;0BAET,KAACZ;gBAAiBuB,aAAaf,OAAOgB,OAAOD;gBAAad,MAAK;;;;AAGrE,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAO9C,eAAO,MAAM,IAAI,GAAU,SAAS,OAAO,EAAE,qBAAgB,EAAE,cAAc,YAAY,kBAuFxF,CAAA"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAO9C,eAAO,MAAM,IAAI,GAAU,SAAS,OAAO,EAAE,qBAAgB,EAAE,cAAc,YAAY,kBA8FxF,CAAA"}
package/dist/init.js CHANGED
@@ -1,9 +1,11 @@
1
- import { GenerationModels } from './ai/models/index.js';
2
1
  import { seedPrompts } from './ai/prompts.js';
3
2
  import { systemGenerate } from './ai/utils/systemGenerate.js';
4
3
  import { PLUGIN_INSTRUCTIONS_TABLE } from './defaults.js';
4
+ import { getGenerationModels } from './utilities/getGenerationModels.js';
5
5
  export const init = async (payload, fieldSchemaPaths, pluginConfig)=>{
6
- payload.logger.info(`— AI Plugin: Initializing...`);
6
+ if (pluginConfig.debugging) {
7
+ payload.logger.info(`— AI Plugin: Initializing...`);
8
+ }
7
9
  const paths = Object.keys(fieldSchemaPaths);
8
10
  const fieldInstructionsMap = {};
9
11
  for(let i = 0; i < paths.length; i++){
@@ -30,17 +32,19 @@ export const init = async (payload, fieldSchemaPaths, pluginConfig)=>{
30
32
  });
31
33
  let generatedPrompt = '{{ title }}';
32
34
  if (pluginConfig.generatePromptOnInit) {
35
+ // find the model that has the generateText function
36
+ const model = getGenerationModels(pluginConfig).find((model)=>model.generateText);
33
37
  generatedPrompt = await systemGenerate({
34
38
  prompt,
35
39
  system
36
- });
40
+ }, model?.generateText);
37
41
  payload.logger.info(`\nPrompt generated for "${fieldLabel}" field:\nprompt: ${generatedPrompt}\n\n`);
38
42
  }
39
43
  const instructions = await payload.create({
40
44
  collection: PLUGIN_INSTRUCTIONS_TABLE,
41
45
  data: {
42
46
  'field-type': fieldType,
43
- 'model-id': GenerationModels.find((a)=>{
47
+ 'model-id': getGenerationModels(pluginConfig).find((a)=>{
44
48
  return a.fields.includes(fieldType);
45
49
  })?.id,
46
50
  prompt: generatedPrompt,
@@ -48,7 +52,7 @@ export const init = async (payload, fieldSchemaPaths, pluginConfig)=>{
48
52
  'schema-path': path
49
53
  }
50
54
  }).then((a)=>a).catch((err)=>{
51
- console.log('— AI Plugin: Error creating Compose settings-', err);
55
+ payload.logger.error('— AI Plugin: Error creating Compose settings-', err);
52
56
  });
53
57
  // @ts-expect-error
54
58
  if (instructions?.id) {
@@ -67,8 +71,8 @@ export const init = async (payload, fieldSchemaPaths, pluginConfig)=>{
67
71
  }
68
72
  if (pluginConfig.debugging) {
69
73
  payload.logger.info(`— AI Plugin: Enabled fields map: ${JSON.stringify(fieldInstructionsMap, null, 2)}`);
74
+ payload.logger.info(`— AI Plugin: Initialized!`);
70
75
  }
71
- payload.logger.info(`— AI Plugin: Initialized!`);
72
76
  if (pluginConfig.generatePromptOnInit) {
73
77
  payload.logger.info('\n\n-AI Plugin: Example prompts are added to get you started, Now go break some code 🚀🚀🚀\n\n');
74
78
  }
package/dist/init.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/init.ts"],"sourcesContent":["import type { Payload } from 'payload'\n\nimport type { PluginConfig } from './types.js'\n\nimport { GenerationModels } from './ai/models/index.js'\nimport { seedPrompts } from './ai/prompts.js'\nimport { systemGenerate } from './ai/utils/systemGenerate.js'\nimport { PLUGIN_INSTRUCTIONS_TABLE } from './defaults.js'\n\nexport const init = async (payload: Payload, fieldSchemaPaths, pluginConfig: PluginConfig) => {\n payload.logger.info(`— AI Plugin: Initializing...`)\n\n const paths = Object.keys(fieldSchemaPaths)\n\n const fieldInstructionsMap = {}\n for (let i = 0; i < paths.length; i++) {\n const path = paths[i]\n const { type: fieldType, label: fieldLabel, relationTo } = fieldSchemaPaths[path]\n const entry = await payload.find({\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n pagination: false,\n where: {\n 'field-type': {\n equals: fieldType,\n },\n 'schema-path': {\n equals: path,\n },\n },\n })\n\n if (!entry?.docs?.length) {\n const { prompt, system } = seedPrompts({\n fieldLabel,\n fieldSchemaPaths,\n fieldType,\n path,\n })\n\n let generatedPrompt = '{{ title }}'\n if (pluginConfig.generatePromptOnInit) {\n generatedPrompt = await systemGenerate({\n prompt,\n system,\n })\n payload.logger.info(\n `\\nPrompt generated for \"${fieldLabel}\" field:\\nprompt: ${generatedPrompt}\\n\\n`,\n )\n }\n\n const instructions = await payload\n .create({\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n data: {\n 'field-type': fieldType,\n 'model-id': GenerationModels.find((a) => {\n return a.fields.includes(fieldType)\n })?.id,\n prompt: generatedPrompt,\n 'relation-to': relationTo,\n 'schema-path': path,\n },\n })\n .then((a) => a)\n .catch((err) => {\n console.log('— AI Plugin: Error creating Compose settings-', err)\n })\n\n // @ts-expect-error\n if (instructions?.id) {\n fieldInstructionsMap[path] = {\n id: instructions.id,\n fieldType,\n }\n }\n } else {\n const [instructions] = entry.docs\n fieldInstructionsMap[path] = {\n id: instructions.id,\n fieldType,\n }\n }\n }\n\n if (pluginConfig.debugging) {\n payload.logger.info(\n `— AI Plugin: Enabled fields map: ${JSON.stringify(fieldInstructionsMap, null, 2)}`,\n )\n }\n\n payload.logger.info(`— AI Plugin: Initialized!`)\n if (pluginConfig.generatePromptOnInit) {\n payload.logger.info(\n '\\n\\n-AI Plugin: Example prompts are added to get you started, Now go break some code 🚀🚀🚀\\n\\n',\n )\n }\n}\n"],"names":["GenerationModels","seedPrompts","systemGenerate","PLUGIN_INSTRUCTIONS_TABLE","init","payload","fieldSchemaPaths","pluginConfig","logger","info","paths","Object","keys","fieldInstructionsMap","i","length","path","type","fieldType","label","fieldLabel","relationTo","entry","find","collection","pagination","where","equals","docs","prompt","system","generatedPrompt","generatePromptOnInit","instructions","create","data","a","fields","includes","id","then","catch","err","console","log","debugging","JSON","stringify"],"mappings":"AAIA,SAASA,gBAAgB,QAAQ,uBAAsB;AACvD,SAASC,WAAW,QAAQ,kBAAiB;AAC7C,SAASC,cAAc,QAAQ,+BAA8B;AAC7D,SAASC,yBAAyB,QAAQ,gBAAe;AAEzD,OAAO,MAAMC,OAAO,OAAOC,SAAkBC,kBAAkBC;IAC7DF,QAAQG,MAAM,CAACC,IAAI,CAAC,CAAC,4BAA4B,CAAC;IAElD,MAAMC,QAAQC,OAAOC,IAAI,CAACN;IAE1B,MAAMO,uBAAuB,CAAC;IAC9B,IAAK,IAAIC,IAAI,GAAGA,IAAIJ,MAAMK,MAAM,EAAED,IAAK;QACrC,MAAME,OAAON,KAAK,CAACI,EAAE;QACrB,MAAM,EAAEG,MAAMC,SAAS,EAAEC,OAAOC,UAAU,EAAEC,UAAU,EAAE,GAAGf,gBAAgB,CAACU,KAAK;QACjF,MAAMM,QAAQ,MAAMjB,QAAQkB,IAAI,CAAC;YAC/BC,YAAYrB;YACZsB,YAAY;YACZC,OAAO;gBACL,cAAc;oBACZC,QAAQT;gBACV;gBACA,eAAe;oBACbS,QAAQX;gBACV;YACF;QACF;QAEA,IAAI,CAACM,OAAOM,MAAMb,QAAQ;YACxB,MAAM,EAAEc,MAAM,EAAEC,MAAM,EAAE,GAAG7B,YAAY;gBACrCmB;gBACAd;gBACAY;gBACAF;YACF;YAEA,IAAIe,kBAAkB;YACtB,IAAIxB,aAAayB,oBAAoB,EAAE;gBACrCD,kBAAkB,MAAM7B,eAAe;oBACrC2B;oBACAC;gBACF;gBACAzB,QAAQG,MAAM,CAACC,IAAI,CACjB,CAAC,wBAAwB,EAAEW,WAAW,kBAAkB,EAAEW,gBAAgB,IAAI,CAAC;YAEnF;YAEA,MAAME,eAAe,MAAM5B,QACxB6B,MAAM,CAAC;gBACNV,YAAYrB;gBACZgC,MAAM;oBACJ,cAAcjB;oBACd,YAAYlB,iBAAiBuB,IAAI,CAAC,CAACa;wBACjC,OAAOA,EAAEC,MAAM,CAACC,QAAQ,CAACpB;oBAC3B,IAAIqB;oBACJV,QAAQE;oBACR,eAAeV;oBACf,eAAeL;gBACjB;YACF,GACCwB,IAAI,CAAC,CAACJ,IAAMA,GACZK,KAAK,CAAC,CAACC;gBACNC,QAAQC,GAAG,CAAC,iDAAiDF;YAC/D;YAEF,mBAAmB;YACnB,IAAIT,cAAcM,IAAI;gBACpB1B,oBAAoB,CAACG,KAAK,GAAG;oBAC3BuB,IAAIN,aAAaM,EAAE;oBACnBrB;gBACF;YACF;QACF,OAAO;YACL,MAAM,CAACe,aAAa,GAAGX,MAAMM,IAAI;YACjCf,oBAAoB,CAACG,KAAK,GAAG;gBAC3BuB,IAAIN,aAAaM,EAAE;gBACnBrB;YACF;QACF;IACF;IAEA,IAAIX,aAAasC,SAAS,EAAE;QAC1BxC,QAAQG,MAAM,CAACC,IAAI,CACjB,CAAC,iCAAiC,EAAEqC,KAAKC,SAAS,CAAClC,sBAAsB,MAAM,IAAI;IAEvF;IAEAR,QAAQG,MAAM,CAACC,IAAI,CAAC,CAAC,yBAAyB,CAAC;IAC/C,IAAIF,aAAayB,oBAAoB,EAAE;QACrC3B,QAAQG,MAAM,CAACC,IAAI,CACjB;IAEJ;AACF,EAAC"}
1
+ {"version":3,"sources":["../src/init.ts"],"sourcesContent":["import type { Payload } from 'payload'\n\nimport type { PluginConfig } from './types.js'\n\nimport { seedPrompts } from './ai/prompts.js'\nimport { systemGenerate } from './ai/utils/systemGenerate.js'\nimport { PLUGIN_INSTRUCTIONS_TABLE } from './defaults.js'\nimport { getGenerationModels } from './utilities/getGenerationModels.js'\n\nexport const init = async (payload: Payload, fieldSchemaPaths, pluginConfig: PluginConfig) => {\n if (pluginConfig.debugging) {\n payload.logger.info(`— AI Plugin: Initializing...`)\n }\n\n const paths = Object.keys(fieldSchemaPaths)\n\n const fieldInstructionsMap = {}\n for (let i = 0; i < paths.length; i++) {\n const path = paths[i]\n const { type: fieldType, label: fieldLabel, relationTo } = fieldSchemaPaths[path]\n const entry = await payload.find({\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n pagination: false,\n where: {\n 'field-type': {\n equals: fieldType,\n },\n 'schema-path': {\n equals: path,\n },\n },\n })\n\n if (!entry?.docs?.length) {\n const { prompt, system } = seedPrompts({\n fieldLabel,\n fieldSchemaPaths,\n fieldType,\n path,\n })\n\n let generatedPrompt = '{{ title }}'\n if (pluginConfig.generatePromptOnInit) {\n // find the model that has the generateText function\n const model = getGenerationModels(pluginConfig).find((model) => model.generateText)\n generatedPrompt = await systemGenerate(\n {\n prompt,\n system,\n },\n model?.generateText,\n )\n payload.logger.info(\n `\\nPrompt generated for \"${fieldLabel}\" field:\\nprompt: ${generatedPrompt}\\n\\n`,\n )\n }\n\n const instructions = await payload\n .create({\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n data: {\n 'field-type': fieldType,\n 'model-id': getGenerationModels(pluginConfig).find((a) => {\n return a.fields.includes(fieldType)\n })?.id,\n prompt: generatedPrompt,\n 'relation-to': relationTo,\n 'schema-path': path,\n },\n })\n .then((a) => a)\n .catch((err) => {\n payload.logger.error('— AI Plugin: Error creating Compose settings-', err)\n })\n\n // @ts-expect-error\n if (instructions?.id) {\n fieldInstructionsMap[path] = {\n id: instructions.id,\n fieldType,\n }\n }\n } else {\n const [instructions] = entry.docs\n fieldInstructionsMap[path] = {\n id: instructions.id,\n fieldType,\n }\n }\n }\n\n if (pluginConfig.debugging) {\n payload.logger.info(\n `— AI Plugin: Enabled fields map: ${JSON.stringify(fieldInstructionsMap, null, 2)}`,\n )\n payload.logger.info(`— AI Plugin: Initialized!`)\n }\n\n if (pluginConfig.generatePromptOnInit) {\n payload.logger.info(\n '\\n\\n-AI Plugin: Example prompts are added to get you started, Now go break some code 🚀🚀🚀\\n\\n',\n )\n }\n}\n"],"names":["seedPrompts","systemGenerate","PLUGIN_INSTRUCTIONS_TABLE","getGenerationModels","init","payload","fieldSchemaPaths","pluginConfig","debugging","logger","info","paths","Object","keys","fieldInstructionsMap","i","length","path","type","fieldType","label","fieldLabel","relationTo","entry","find","collection","pagination","where","equals","docs","prompt","system","generatedPrompt","generatePromptOnInit","model","generateText","instructions","create","data","a","fields","includes","id","then","catch","err","error","JSON","stringify"],"mappings":"AAIA,SAASA,WAAW,QAAQ,kBAAiB;AAC7C,SAASC,cAAc,QAAQ,+BAA8B;AAC7D,SAASC,yBAAyB,QAAQ,gBAAe;AACzD,SAASC,mBAAmB,QAAQ,qCAAoC;AAExE,OAAO,MAAMC,OAAO,OAAOC,SAAkBC,kBAAkBC;IAC7D,IAAIA,aAAaC,SAAS,EAAE;QAC1BH,QAAQI,MAAM,CAACC,IAAI,CAAC,CAAC,4BAA4B,CAAC;IACpD;IAEA,MAAMC,QAAQC,OAAOC,IAAI,CAACP;IAE1B,MAAMQ,uBAAuB,CAAC;IAC9B,IAAK,IAAIC,IAAI,GAAGA,IAAIJ,MAAMK,MAAM,EAAED,IAAK;QACrC,MAAME,OAAON,KAAK,CAACI,EAAE;QACrB,MAAM,EAAEG,MAAMC,SAAS,EAAEC,OAAOC,UAAU,EAAEC,UAAU,EAAE,GAAGhB,gBAAgB,CAACW,KAAK;QACjF,MAAMM,QAAQ,MAAMlB,QAAQmB,IAAI,CAAC;YAC/BC,YAAYvB;YACZwB,YAAY;YACZC,OAAO;gBACL,cAAc;oBACZC,QAAQT;gBACV;gBACA,eAAe;oBACbS,QAAQX;gBACV;YACF;QACF;QAEA,IAAI,CAACM,OAAOM,MAAMb,QAAQ;YACxB,MAAM,EAAEc,MAAM,EAAEC,MAAM,EAAE,GAAG/B,YAAY;gBACrCqB;gBACAf;gBACAa;gBACAF;YACF;YAEA,IAAIe,kBAAkB;YACtB,IAAIzB,aAAa0B,oBAAoB,EAAE;gBACrC,oDAAoD;gBACpD,MAAMC,QAAQ/B,oBAAoBI,cAAciB,IAAI,CAAC,CAACU,QAAUA,MAAMC,YAAY;gBAClFH,kBAAkB,MAAM/B,eACtB;oBACE6B;oBACAC;gBACF,GACAG,OAAOC;gBAET9B,QAAQI,MAAM,CAACC,IAAI,CACjB,CAAC,wBAAwB,EAAEW,WAAW,kBAAkB,EAAEW,gBAAgB,IAAI,CAAC;YAEnF;YAEA,MAAMI,eAAe,MAAM/B,QACxBgC,MAAM,CAAC;gBACNZ,YAAYvB;gBACZoC,MAAM;oBACJ,cAAcnB;oBACd,YAAYhB,oBAAoBI,cAAciB,IAAI,CAAC,CAACe;wBAClD,OAAOA,EAAEC,MAAM,CAACC,QAAQ,CAACtB;oBAC3B,IAAIuB;oBACJZ,QAAQE;oBACR,eAAeV;oBACf,eAAeL;gBACjB;YACF,GACC0B,IAAI,CAAC,CAACJ,IAAMA,GACZK,KAAK,CAAC,CAACC;gBACNxC,QAAQI,MAAM,CAACqC,KAAK,CAAC,iDAAiDD;YACxE;YAEF,mBAAmB;YACnB,IAAIT,cAAcM,IAAI;gBACpB5B,oBAAoB,CAACG,KAAK,GAAG;oBAC3ByB,IAAIN,aAAaM,EAAE;oBACnBvB;gBACF;YACF;QACF,OAAO;YACL,MAAM,CAACiB,aAAa,GAAGb,MAAMM,IAAI;YACjCf,oBAAoB,CAACG,KAAK,GAAG;gBAC3ByB,IAAIN,aAAaM,EAAE;gBACnBvB;YACF;QACF;IACF;IAEA,IAAIZ,aAAaC,SAAS,EAAE;QAC1BH,QAAQI,MAAM,CAACC,IAAI,CACjB,CAAC,iCAAiC,EAAEqC,KAAKC,SAAS,CAAClC,sBAAsB,MAAM,IAAI;QAErFT,QAAQI,MAAM,CAACC,IAAI,CAAC,CAAC,yBAAyB,CAAC;IACjD;IAEA,IAAIH,aAAa0B,oBAAoB,EAAE;QACrC5B,QAAQI,MAAM,CAACC,IAAI,CACjB;IAEJ;AACF,EAAC"}
@@ -1,2 +1,2 @@
1
- export declare const replacePlaceholders: (prompt: string, values: object) => any;
1
+ export declare const replacePlaceholders: (prompt: string, values: object) => Promise<string>;
2
2
  //# sourceMappingURL=replacePlaceholders.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"replacePlaceholders.d.ts","sourceRoot":"","sources":["../../../src/libraries/handlebars/replacePlaceholders.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,EAAE,QAAQ,MAAM,QAEjE,CAAA"}
1
+ {"version":3,"file":"replacePlaceholders.d.ts","sourceRoot":"","sources":["../../../src/libraries/handlebars/replacePlaceholders.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,EAAE,QAAQ,MAAM,KACM,OAAO,CAAC,MAAM,CACrF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/libraries/handlebars/replacePlaceholders.ts"],"sourcesContent":["import { asyncHandlebars } from './asyncHandlebars.js'\n\nexport const replacePlaceholders = (prompt: string, values: object) => {\n return asyncHandlebars.compile(prompt, { trackIds: true })(values)\n}\n"],"names":["asyncHandlebars","replacePlaceholders","prompt","values","compile","trackIds"],"mappings":"AAAA,SAASA,eAAe,QAAQ,uBAAsB;AAEtD,OAAO,MAAMC,sBAAsB,CAACC,QAAgBC;IAClD,OAAOH,gBAAgBI,OAAO,CAACF,QAAQ;QAAEG,UAAU;IAAK,GAAGF;AAC7D,EAAC"}
1
+ {"version":3,"sources":["../../../src/libraries/handlebars/replacePlaceholders.ts"],"sourcesContent":["import { asyncHandlebars } from './asyncHandlebars.js'\n\nexport const replacePlaceholders = (prompt: string, values: object) => {\n return asyncHandlebars.compile(prompt, { trackIds: true })(values) as Promise<string>\n}\n"],"names":["asyncHandlebars","replacePlaceholders","prompt","values","compile","trackIds"],"mappings":"AAAA,SAASA,eAAe,QAAQ,uBAAsB;AAEtD,OAAO,MAAMC,sBAAsB,CAACC,QAAgBC;IAClD,OAAOH,gBAAgBI,OAAO,CAACF,QAAQ;QAAEG,UAAU;IAAK,GAAGF;AAC7D,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAIrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAsC9C,QAAA,MAAM,eAAe,GAClB,cAAc,YAAY,MAC1B,gBAAgB,MAAM,KAAG,MA+FzB,CAAA;AAEH,OAAO,EAAE,eAAe,EAAE,CAAA"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAIrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAyC9C,QAAA,MAAM,eAAe,GAClB,cAAc,YAAY,MAC1B,gBAAgB,MAAM,KAAG,MAiGzB,CAAA;AAEH,OAAO,EAAE,eAAe,EAAE,CAAA"}
package/dist/plugin.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { deepMerge } from 'payload/shared';
2
+ import { defaultGenerationModels } from './ai/models/index.js';
2
3
  import { lexicalJsonSchema } from './ai/schemas/lexicalJsonSchema.js';
3
4
  import { instructionsCollection } from './collections/Instructions.js';
4
5
  import { PLUGIN_NAME } from './defaults.js';
@@ -6,12 +7,14 @@ import { fetchFields } from './endpoints/fetchFields.js';
6
7
  import { endpoints } from './endpoints/index.js';
7
8
  import { init } from './init.js';
8
9
  import { translations } from './translations/index.js';
10
+ import { getGenerationModels } from './utilities/getGenerationModels.js';
9
11
  import { isPluginActivated } from './utilities/isPluginActivated.js';
10
12
  import { updateFieldsConfig } from './utilities/updateFieldsConfig.js';
11
13
  const defaultPluginConfig = {
12
14
  collections: {},
13
15
  disableSponsorMessage: false,
14
- generatePromptOnInit: true
16
+ generatePromptOnInit: true,
17
+ generationModels: defaultGenerationModels
15
18
  };
16
19
  const sponsorMessage = `
17
20
  ╔═══════════════════════════════════════════════════════════════╗
@@ -37,13 +40,14 @@ const payloadAiPlugin = (pluginConfig)=>(incomingConfig)=>{
37
40
  ...defaultPluginConfig,
38
41
  ...pluginConfig
39
42
  };
40
- const isActivated = isPluginActivated();
43
+ pluginConfig.generationModels = getGenerationModels(pluginConfig);
44
+ const isActivated = isPluginActivated(pluginConfig);
41
45
  let updatedConfig = {
42
46
  ...incomingConfig
43
47
  };
44
48
  let collectionsFieldPathMap = {};
45
49
  if (isActivated) {
46
- const Instructions = instructionsCollection();
50
+ const Instructions = instructionsCollection(pluginConfig);
47
51
  // Inject editor schema to config, so that it can be accessed when /textarea endpoint will hit
48
52
  const lexicalSchema = lexicalJsonSchema(pluginConfig.editorConfig?.nodes);
49
53
  if (pluginConfig.debugging) {
@@ -77,6 +81,7 @@ const payloadAiPlugin = (pluginConfig)=>(incomingConfig)=>{
77
81
  providers: updatedProviders
78
82
  }
79
83
  };
84
+ const pluginEndpoints = endpoints(pluginConfig);
80
85
  updatedConfig = {
81
86
  ...incomingConfig,
82
87
  collections: collections.map((collection)=>{
@@ -92,9 +97,9 @@ const payloadAiPlugin = (pluginConfig)=>(incomingConfig)=>{
92
97
  }),
93
98
  endpoints: [
94
99
  ...incomingConfig.endpoints ?? [],
95
- endpoints.textarea,
96
- endpoints.upload,
97
- fetchFields
100
+ pluginEndpoints.textarea,
101
+ pluginEndpoints.upload,
102
+ fetchFields(pluginConfig.access)
98
103
  ],
99
104
  i18n: {
100
105
  ...incomingConfig.i18n || {},