@ai-stack/payloadcms 3.2.17-beta → 3.2.19-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 (37) hide show
  1. package/README.md +15 -0
  2. package/dist/ai/models/anthropic/index.js +11 -18
  3. package/dist/ai/models/anthropic/index.js.map +1 -1
  4. package/dist/ai/models/openai/index.js +13 -25
  5. package/dist/ai/models/openai/index.js.map +1 -1
  6. package/dist/collections/Instructions.d.ts +1 -1
  7. package/dist/collections/Instructions.js +9 -9
  8. package/dist/collections/Instructions.js.map +1 -1
  9. package/dist/endpoints/fetchFields.js +1 -0
  10. package/dist/endpoints/fetchFields.js.map +1 -1
  11. package/dist/endpoints/index.js +10 -6
  12. package/dist/endpoints/index.js.map +1 -1
  13. package/dist/exports/types.d.ts +1 -1
  14. package/dist/exports/types.js.map +1 -1
  15. package/dist/fields/ComposeField/ComposeField.js +22 -14
  16. package/dist/fields/ComposeField/ComposeField.js.map +1 -1
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.js +1 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/init.js +61 -30
  21. package/dist/init.js.map +1 -1
  22. package/dist/plugin.js +3 -3
  23. package/dist/plugin.js.map +1 -1
  24. package/dist/providers/InstructionsProvider/InstructionsProvider.js +8 -4
  25. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  26. package/dist/providers/InstructionsProvider/context.d.ts +2 -0
  27. package/dist/providers/InstructionsProvider/context.js +2 -0
  28. package/dist/providers/InstructionsProvider/context.js.map +1 -1
  29. package/dist/providers/InstructionsProvider/useInstructions.js +15 -3
  30. package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
  31. package/dist/types.d.ts +10 -3
  32. package/dist/types.js.map +1 -1
  33. package/dist/ui/Compose/Compose.js +21 -30
  34. package/dist/ui/Compose/Compose.js.map +1 -1
  35. package/dist/utilities/extractImageData.js +1 -1
  36. package/dist/utilities/extractImageData.js.map +1 -1
  37. package/package.json +1 -1
package/README.md CHANGED
@@ -201,6 +201,21 @@ export default buildConfig({
201
201
  }
202
202
  ],
203
203
 
204
+ // Optional: Control how field prompts are seeded for the first time
205
+ seedPrompts: ({path}) => {
206
+ if (path.endsWith('.meta.description')) {
207
+ return {
208
+ data: {
209
+ prompt: 'Generate SEO-friendly title for this document: {{markdown}}',
210
+ // other instruction options
211
+ }
212
+ }
213
+ }
214
+ // Don't allow generating slugs
215
+ if (path.endswith('.slug')) return false
216
+ // returning undefined fallbacks to default seed prompt
217
+ },
218
+
204
219
  // Optional: Custom media upload handling, useful for multi-tenant setups
205
220
  mediaUpload: async (result, { request, collection }) => {
206
221
  return request.payload.create({
@@ -4,6 +4,15 @@ import { extractPromptAttachments } from '../../../utilities/extractPromptAttach
4
4
  import { defaultSystemPrompt } from '../../prompts.js';
5
5
  import { generateRichText } from './generateRichText.js';
6
6
  const MODEL_KEY = 'ANTH-C';
7
+ const MODELS = [
8
+ 'claude-opus-4-1',
9
+ 'claude-opus-4-0',
10
+ 'claude-sonnet-4-0',
11
+ 'claude-3-opus-latest',
12
+ 'claude-3-5-haiku-latest',
13
+ 'claude-3-5-sonnet-latest',
14
+ 'claude-3-7-sonnet-latest'
15
+ ];
7
16
  export const AnthropicConfig = {
8
17
  models: [
9
18
  {
@@ -41,15 +50,7 @@ export const AnthropicConfig = {
41
50
  type: 'select',
42
51
  defaultValue: 'claude-3-5-sonnet-latest',
43
52
  label: 'Model',
44
- options: [
45
- 'claude-opus-4-1',
46
- 'claude-opus-4-0',
47
- 'claude-sonnet-4-0',
48
- 'claude-3-opus-latest',
49
- 'claude-3-5-haiku-latest',
50
- 'claude-3-5-sonnet-latest',
51
- 'claude-3-7-sonnet-latest'
52
- ]
53
+ options: MODELS
53
54
  },
54
55
  {
55
56
  type: 'row',
@@ -100,15 +101,7 @@ export const AnthropicConfig = {
100
101
  type: 'select',
101
102
  defaultValue: 'claude-3-5-sonnet-latest',
102
103
  label: 'Model',
103
- options: [
104
- 'claude-opus-4-1',
105
- 'claude-opus-4-0',
106
- 'claude-sonnet-4-0',
107
- 'claude-3-opus-latest',
108
- 'claude-3-5-haiku-latest',
109
- 'claude-3-5-sonnet-latest',
110
- 'claude-3-7-sonnet-latest'
111
- ]
104
+ options: MODELS
112
105
  },
113
106
  {
114
107
  type: 'row',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/ai/models/anthropic/index.ts"],"sourcesContent":["import { anthropic } from '@ai-sdk/anthropic'\nimport { streamText } from 'ai'\n\nimport type { GenerationConfig } from '../../../types.js'\n\nimport { extractPromptAttachments } from '../../../utilities/extractPromptAttachments.js'\nimport { defaultSystemPrompt } from '../../prompts.js'\nimport { generateRichText } from './generateRichText.js'\n\nconst MODEL_KEY = 'ANTH-C'\n\nexport const AnthropicConfig: GenerationConfig = {\n models: [\n {\n id: `${MODEL_KEY}-text`,\n name: 'Anthropic Claude',\n fields: ['text', 'textarea'],\n handler: (prompt: string, options: { extractAttachments: boolean; locale: string; maxTokens: number; model: string; system: string; temperature: number; }) => {\n const streamTextResult = streamText({\n maxOutputTokens: options.maxTokens || 5000,\n model: anthropic(options.model),\n onError: (error) => {\n console.error(`${MODEL_KEY}-text: `, error)\n },\n prompt: options.extractAttachments ? extractPromptAttachments(prompt) : prompt,\n system: options.system || defaultSystemPrompt,\n temperature: options.temperature || 0.7,\n })\n\n return streamTextResult.toUIMessageStreamResponse();\n },\n output: 'text',\n settings: {\n name: `${MODEL_KEY}-text-settings`,\n type: 'group',\n admin: {\n condition(data) {\n return data['model-id'] === `${MODEL_KEY}-text`\n },\n },\n fields: [\n {\n name: 'model',\n type: 'select',\n defaultValue: 'claude-3-5-sonnet-latest',\n label: 'Model',\n options: [\n 'claude-opus-4-1',\n 'claude-opus-4-0',\n 'claude-sonnet-4-0',\n 'claude-3-opus-latest',\n 'claude-3-5-haiku-latest',\n 'claude-3-5-sonnet-latest',\n 'claude-3-7-sonnet-latest',\n ],\n },\n {\n type: 'row', fields: [\n {\n name: 'maxTokens',\n type: 'number',\n defaultValue: 5000,\n },\n {\n name: 'temperature',\n type: 'number',\n defaultValue: 0.7,\n max: 1,\n min: 0,\n },\n\n ]\n },\n {\n name: 'extractAttachments',\n type: 'checkbox',\n } \n ],\n label: 'Anthropic Claude Settings',\n },\n },\n {\n id: `${MODEL_KEY}-object`,\n name: 'Anthropic Claude',\n fields: ['richText'],\n handler: (text: string, options) => {\n return generateRichText(text, options)\n },\n output: 'text',\n settings: {\n name: `${MODEL_KEY}-object-settings`,\n type: 'group',\n admin: {\n condition(data) {\n return data['model-id'] === `${MODEL_KEY}-object`\n },\n },\n fields: [\n {\n name: 'model',\n type: 'select',\n defaultValue: 'claude-3-5-sonnet-latest',\n label: 'Model',\n options: [\n 'claude-opus-4-1',\n 'claude-opus-4-0',\n 'claude-sonnet-4-0',\n 'claude-3-opus-latest',\n 'claude-3-5-haiku-latest',\n 'claude-3-5-sonnet-latest',\n 'claude-3-7-sonnet-latest',\n ],\n },\n {\n type: 'row', fields: [\n {\n name: 'maxTokens',\n type: 'number',\n defaultValue: 5000,\n },\n {\n name: 'temperature',\n type: 'number',\n defaultValue: 0.7,\n max: 1,\n min: 0,\n },\n\n ]\n },\n {\n name: 'extractAttachments',\n type: 'checkbox',\n }\n ],\n label: 'Anthropic Claude Settings',\n },\n },\n ],\n provider: 'Anthropic',\n}\n"],"names":["anthropic","streamText","extractPromptAttachments","defaultSystemPrompt","generateRichText","MODEL_KEY","AnthropicConfig","models","id","name","fields","handler","prompt","options","streamTextResult","maxOutputTokens","maxTokens","model","onError","error","console","extractAttachments","system","temperature","toUIMessageStreamResponse","output","settings","type","admin","condition","data","defaultValue","label","max","min","text","provider"],"mappings":"AAAA,SAASA,SAAS,QAAQ,oBAAmB;AAC7C,SAASC,UAAU,QAAQ,KAAI;AAI/B,SAASC,wBAAwB,QAAQ,iDAAgD;AACzF,SAASC,mBAAmB,QAAQ,mBAAkB;AACtD,SAASC,gBAAgB,QAAQ,wBAAuB;AAExD,MAAMC,YAAY;AAElB,OAAO,MAAMC,kBAAoC;IAC/CC,QAAQ;QACN;YACEC,IAAI,GAAGH,UAAU,KAAK,CAAC;YACvBI,MAAM;YACNC,QAAQ;gBAAC;gBAAQ;aAAW;YAC5BC,SAAS,CAACC,QAAgBC;gBACxB,MAAMC,mBAAmBb,WAAW;oBAClCc,iBAAiBF,QAAQG,SAAS,IAAI;oBACtCC,OAAOjB,UAAUa,QAAQI,KAAK;oBAC9BC,SAAS,CAACC;wBACRC,QAAQD,KAAK,CAAC,GAAGd,UAAU,OAAO,CAAC,EAAEc;oBACvC;oBACAP,QAAQC,QAAQQ,kBAAkB,GAAGnB,yBAAyBU,UAAUA;oBACxEU,QAAQT,QAAQS,MAAM,IAAInB;oBAC1BoB,aAAaV,QAAQU,WAAW,IAAI;gBACtC;gBAEA,OAAOT,iBAAiBU,yBAAyB;YACnD;YACAC,QAAQ;YACRC,UAAU;gBACRjB,MAAM,GAAGJ,UAAU,cAAc,CAAC;gBAClCsB,MAAM;gBACNC,OAAO;oBACLC,WAAUC,IAAI;wBACZ,OAAOA,IAAI,CAAC,WAAW,KAAK,GAAGzB,UAAU,KAAK,CAAC;oBACjD;gBACF;gBACAK,QAAQ;oBACN;wBACED,MAAM;wBACNkB,MAAM;wBACNI,cAAc;wBACdC,OAAO;wBACPnB,SAAS;4BACP;4BACA;4BACA;4BACA;4BACA;4BACA;4BACA;yBACD;oBACH;oBACA;wBACEc,MAAM;wBAAOjB,QAAQ;4BACnB;gCACED,MAAM;gCACNkB,MAAM;gCACNI,cAAc;4BAChB;4BACA;gCACEtB,MAAM;gCACNkB,MAAM;gCACNI,cAAc;gCACdE,KAAK;gCACLC,KAAK;4BACP;yBAED;oBACH;oBACA;wBACEzB,MAAM;wBACNkB,MAAM;oBACR;iBACD;gBACDK,OAAO;YACT;QACF;QACA;YACExB,IAAI,GAAGH,UAAU,OAAO,CAAC;YACzBI,MAAM;YACNC,QAAQ;gBAAC;aAAW;YACpBC,SAAS,CAACwB,MAActB;gBACtB,OAAOT,iBAAiB+B,MAAMtB;YAChC;YACAY,QAAQ;YACRC,UAAU;gBACRjB,MAAM,GAAGJ,UAAU,gBAAgB,CAAC;gBACpCsB,MAAM;gBACNC,OAAO;oBACLC,WAAUC,IAAI;wBACZ,OAAOA,IAAI,CAAC,WAAW,KAAK,GAAGzB,UAAU,OAAO,CAAC;oBACnD;gBACF;gBACAK,QAAQ;oBACN;wBACED,MAAM;wBACNkB,MAAM;wBACNI,cAAc;wBACdC,OAAO;wBACPnB,SAAS;4BACP;4BACA;4BACA;4BACA;4BACA;4BACA;4BACA;yBACD;oBACH;oBACA;wBACEc,MAAM;wBAAOjB,QAAQ;4BACnB;gCACED,MAAM;gCACNkB,MAAM;gCACNI,cAAc;4BAChB;4BACA;gCACEtB,MAAM;gCACNkB,MAAM;gCACNI,cAAc;gCACdE,KAAK;gCACLC,KAAK;4BACP;yBAED;oBACH;oBACA;wBACEzB,MAAM;wBACNkB,MAAM;oBACR;iBACD;gBACDK,OAAO;YACT;QACF;KACD;IACDI,UAAU;AACZ,EAAC"}
1
+ {"version":3,"sources":["../../../../src/ai/models/anthropic/index.ts"],"sourcesContent":["import { anthropic } from '@ai-sdk/anthropic'\nimport { streamText } from 'ai'\n\nimport type { GenerationConfig } from '../../../types.js'\n\nimport { extractPromptAttachments } from '../../../utilities/extractPromptAttachments.js'\nimport { defaultSystemPrompt } from '../../prompts.js'\nimport { generateRichText } from './generateRichText.js'\n\nconst MODEL_KEY = 'ANTH-C'\nconst MODELS = [\n 'claude-opus-4-1',\n 'claude-opus-4-0',\n 'claude-sonnet-4-0',\n 'claude-3-opus-latest',\n 'claude-3-5-haiku-latest',\n 'claude-3-5-sonnet-latest',\n 'claude-3-7-sonnet-latest',\n]\n\nexport const AnthropicConfig: GenerationConfig = {\n models: [\n {\n id: `${MODEL_KEY}-text`,\n name: 'Anthropic Claude',\n fields: ['text', 'textarea'],\n handler: (prompt: string, options: { extractAttachments: boolean; locale: string; maxTokens: number; model: string; system: string; temperature: number; }) => {\n const streamTextResult = streamText({\n maxOutputTokens: options.maxTokens || 5000,\n model: anthropic(options.model),\n onError: (error) => {\n console.error(`${MODEL_KEY}-text: `, error)\n },\n prompt: options.extractAttachments ? extractPromptAttachments(prompt) : prompt,\n system: options.system || defaultSystemPrompt,\n temperature: options.temperature || 0.7,\n })\n\n return streamTextResult.toUIMessageStreamResponse();\n },\n output: 'text',\n settings: {\n name: `${MODEL_KEY}-text-settings`,\n type: 'group',\n admin: {\n condition(data) {\n return data['model-id'] === `${MODEL_KEY}-text`\n },\n },\n fields: [\n {\n name: 'model',\n type: 'select',\n defaultValue: 'claude-3-5-sonnet-latest',\n label: 'Model',\n options: MODELS,\n },\n {\n type: 'row', fields: [\n {\n name: 'maxTokens',\n type: 'number',\n defaultValue: 5000,\n },\n {\n name: 'temperature',\n type: 'number',\n defaultValue: 0.7,\n max: 1,\n min: 0,\n },\n\n ]\n },\n {\n name: 'extractAttachments',\n type: 'checkbox',\n } \n ],\n label: 'Anthropic Claude Settings',\n },\n },\n {\n id: `${MODEL_KEY}-object`,\n name: 'Anthropic Claude',\n fields: ['richText'],\n handler: (text: string, options) => {\n return generateRichText(text, options)\n },\n output: 'text',\n settings: {\n name: `${MODEL_KEY}-object-settings`,\n type: 'group',\n admin: {\n condition(data) {\n return data['model-id'] === `${MODEL_KEY}-object`\n },\n },\n fields: [\n {\n name: 'model',\n type: 'select',\n defaultValue: 'claude-3-5-sonnet-latest',\n label: 'Model',\n options: MODELS,\n },\n {\n type: 'row', fields: [\n {\n name: 'maxTokens',\n type: 'number',\n defaultValue: 5000,\n },\n {\n name: 'temperature',\n type: 'number',\n defaultValue: 0.7,\n max: 1,\n min: 0,\n },\n\n ]\n },\n {\n name: 'extractAttachments',\n type: 'checkbox',\n }\n ],\n label: 'Anthropic Claude Settings',\n },\n },\n ],\n provider: 'Anthropic',\n}\n"],"names":["anthropic","streamText","extractPromptAttachments","defaultSystemPrompt","generateRichText","MODEL_KEY","MODELS","AnthropicConfig","models","id","name","fields","handler","prompt","options","streamTextResult","maxOutputTokens","maxTokens","model","onError","error","console","extractAttachments","system","temperature","toUIMessageStreamResponse","output","settings","type","admin","condition","data","defaultValue","label","max","min","text","provider"],"mappings":"AAAA,SAASA,SAAS,QAAQ,oBAAmB;AAC7C,SAASC,UAAU,QAAQ,KAAI;AAI/B,SAASC,wBAAwB,QAAQ,iDAAgD;AACzF,SAASC,mBAAmB,QAAQ,mBAAkB;AACtD,SAASC,gBAAgB,QAAQ,wBAAuB;AAExD,MAAMC,YAAY;AAClB,MAAMC,SAAS;IACb;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAED,OAAO,MAAMC,kBAAoC;IAC/CC,QAAQ;QACN;YACEC,IAAI,GAAGJ,UAAU,KAAK,CAAC;YACvBK,MAAM;YACNC,QAAQ;gBAAC;gBAAQ;aAAW;YAC5BC,SAAS,CAACC,QAAgBC;gBACxB,MAAMC,mBAAmBd,WAAW;oBAClCe,iBAAiBF,QAAQG,SAAS,IAAI;oBACtCC,OAAOlB,UAAUc,QAAQI,KAAK;oBAC9BC,SAAS,CAACC;wBACRC,QAAQD,KAAK,CAAC,GAAGf,UAAU,OAAO,CAAC,EAAEe;oBACvC;oBACAP,QAAQC,QAAQQ,kBAAkB,GAAGpB,yBAAyBW,UAAUA;oBACxEU,QAAQT,QAAQS,MAAM,IAAIpB;oBAC1BqB,aAAaV,QAAQU,WAAW,IAAI;gBACtC;gBAEA,OAAOT,iBAAiBU,yBAAyB;YACnD;YACAC,QAAQ;YACRC,UAAU;gBACRjB,MAAM,GAAGL,UAAU,cAAc,CAAC;gBAClCuB,MAAM;gBACNC,OAAO;oBACLC,WAAUC,IAAI;wBACZ,OAAOA,IAAI,CAAC,WAAW,KAAK,GAAG1B,UAAU,KAAK,CAAC;oBACjD;gBACF;gBACAM,QAAQ;oBACN;wBACED,MAAM;wBACNkB,MAAM;wBACNI,cAAc;wBACdC,OAAO;wBACPnB,SAASR;oBACX;oBACA;wBACEsB,MAAM;wBAAOjB,QAAQ;4BACnB;gCACED,MAAM;gCACNkB,MAAM;gCACNI,cAAc;4BAChB;4BACA;gCACEtB,MAAM;gCACNkB,MAAM;gCACNI,cAAc;gCACdE,KAAK;gCACLC,KAAK;4BACP;yBAED;oBACH;oBACA;wBACEzB,MAAM;wBACNkB,MAAM;oBACR;iBACD;gBACDK,OAAO;YACT;QACF;QACA;YACExB,IAAI,GAAGJ,UAAU,OAAO,CAAC;YACzBK,MAAM;YACNC,QAAQ;gBAAC;aAAW;YACpBC,SAAS,CAACwB,MAActB;gBACtB,OAAOV,iBAAiBgC,MAAMtB;YAChC;YACAY,QAAQ;YACRC,UAAU;gBACRjB,MAAM,GAAGL,UAAU,gBAAgB,CAAC;gBACpCuB,MAAM;gBACNC,OAAO;oBACLC,WAAUC,IAAI;wBACZ,OAAOA,IAAI,CAAC,WAAW,KAAK,GAAG1B,UAAU,OAAO,CAAC;oBACnD;gBACF;gBACAM,QAAQ;oBACN;wBACED,MAAM;wBACNkB,MAAM;wBACNI,cAAc;wBACdC,OAAO;wBACPnB,SAASR;oBACX;oBACA;wBACEsB,MAAM;wBAAOjB,QAAQ;4BACnB;gCACED,MAAM;gCACNkB,MAAM;gCACNI,cAAc;4BAChB;4BACA;gCACEtB,MAAM;gCACNkB,MAAM;gCACNI,cAAc;gCACdE,KAAK;gCACLC,KAAK;4BACP;yBAED;oBACH;oBACA;wBACEzB,MAAM;wBACNkB,MAAM;oBACR;iBACD;gBACDK,OAAO;YACT;QACF;KACD;IACDI,UAAU;AACZ,EAAC"}
@@ -1,5 +1,5 @@
1
1
  import { streamText } from 'ai';
2
- import { extractPromptAttachments } from "../../../utilities/extractPromptAttachments.js";
2
+ import { extractPromptAttachments } from '../../../utilities/extractPromptAttachments.js';
3
3
  import { defaultSystemPrompt } from '../../prompts.js';
4
4
  import { generateFileNameByPrompt } from '../../utils/generateFileNameByPrompt.js';
5
5
  import { generateImage } from './generateImage.js';
@@ -7,6 +7,16 @@ import { generateRichText } from './generateRichText.js';
7
7
  import { generateVoice } from './generateVoice.js';
8
8
  import { openai } from './openai.js';
9
9
  const MODEL_KEY = 'Oai';
10
+ const MODELS = [
11
+ 'gpt-5',
12
+ 'gpt-5-mini',
13
+ 'gpt-5-nano',
14
+ 'gpt-4.1',
15
+ 'gpt-4o',
16
+ 'gpt-4-turbo',
17
+ 'gpt-4o-mini',
18
+ 'gpt-3.5-turbo'
19
+ ];
10
20
  //TODO: Simplify this file by moving the handlers to separate files and remove duplicate code
11
21
  export const OpenAIConfig = {
12
22
  models: [
@@ -49,18 +59,7 @@ export const OpenAIConfig = {
49
59
  type: 'select',
50
60
  defaultValue: 'gpt-4o-mini',
51
61
  label: 'Model',
52
- options: [
53
- 'gpt-5',
54
- 'gpt-5-mini',
55
- 'gpt-5-nano',
56
- 'gpt-4.1',
57
- 'gpt-4o',
58
- 'gpt-4-turbo',
59
- 'gpt-4o-mini',
60
- 'gpt-3.5-turbo',
61
- 'gpt-4.1',
62
- 'gpt-5'
63
- ]
62
+ options: MODELS
64
63
  },
65
64
  {
66
65
  type: 'row',
@@ -393,18 +392,7 @@ export const OpenAIConfig = {
393
392
  type: 'select',
394
393
  defaultValue: 'gpt-4o',
395
394
  label: 'Model',
396
- options: [
397
- 'gpt-5',
398
- 'gpt-5-mini',
399
- 'gpt-5-nano',
400
- 'gpt-4.1',
401
- 'gpt-4o',
402
- 'gpt-4-turbo',
403
- 'gpt-4o-mini',
404
- 'o4-mini',
405
- 'gpt-4.1',
406
- 'gpt-5'
407
- ]
395
+ options: MODELS
408
396
  },
409
397
  {
410
398
  type: 'row',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/ai/models/openai/index.ts"],"sourcesContent":["import type { SpeechCreateParams } from 'openai/resources/audio/speech'\nimport type { File } from 'payload'\n\nimport { streamText } from 'ai'\n\nimport type { GenerationConfig } from '../../../types.js'\n\nimport { extractPromptAttachments } from \"../../../utilities/extractPromptAttachments.js\";\nimport { defaultSystemPrompt } from '../../prompts.js'\nimport { generateFileNameByPrompt } from '../../utils/generateFileNameByPrompt.js'\nimport { generateImage } from './generateImage.js'\nimport { generateRichText } from './generateRichText.js'\nimport { generateVoice } from './generateVoice.js'\nimport { openai } from './openai.js'\n\nconst MODEL_KEY = 'Oai'\n\n//TODO: Simplify this file by moving the handlers to separate files and remove duplicate code\nexport const OpenAIConfig: GenerationConfig = {\n models: [\n {\n id: `${MODEL_KEY}-text`,\n name: 'OpenAI GPT Text',\n fields: ['text', 'textarea'],\n handler: (prompt: string, options: { extractAttachments: boolean; locale: string; maxTokens: number; model: string; system: string; temperature: number; }) => {\n const streamTextResult = streamText({\n maxOutputTokens: options.maxTokens || 5000,\n model: openai(options.model),\n onError: (error) => {\n console.error(`${MODEL_KEY}-text: `, error)\n },\n temperature: options.temperature || 0.7,\n\n // TODO: Implement billing/token consumption\n // onFinish: (stepResult) => {\n // console.log('streamText : finish : ', stepResult)\n // },\n prompt: options.extractAttachments ? extractPromptAttachments(prompt) : prompt,\n system: options.system || defaultSystemPrompt,\n })\n\n return streamTextResult.toUIMessageStreamResponse();\n },\n output: 'text',\n settings: {\n name: `${MODEL_KEY}-text-settings`,\n type: 'group',\n admin: {\n condition(data) {\n return data['model-id'] === `${MODEL_KEY}-text`\n },\n },\n fields: [\n {\n name: 'model',\n type: 'select',\n defaultValue: 'gpt-4o-mini',\n label: 'Model',\n options: [\n 'gpt-5',\n 'gpt-5-mini',\n 'gpt-5-nano',\n 'gpt-4.1',\n 'gpt-4o',\n 'gpt-4-turbo',\n 'gpt-4o-mini',\n 'gpt-3.5-turbo'\n , 'gpt-4.1', 'gpt-5'],\n },\n {\n type: 'row', fields: [\n {\n name: 'maxTokens',\n type: 'number',\n defaultValue: 5000,\n },\n {\n name: 'temperature',\n type: 'number',\n defaultValue: 0.7,\n max: 1,\n min: 0,\n },\n\n ]\n },\n {\n name: 'extractAttachments',\n type: 'checkbox',\n }\n ],\n label: 'OpenAI GPT Settings',\n },\n },\n {\n id: 'dall-e',\n name: 'OpenAI DALL-E',\n fields: ['upload'],\n handler: async (prompt: string, options) => {\n const imageData = await generateImage(prompt, options)\n return {\n data: {\n alt: imageData.alt,\n },\n file: {\n name: `image_${generateFileNameByPrompt(imageData.alt || prompt)}.jpeg`,\n data: imageData.buffer,\n mimetype: 'image/jpeg',\n size: imageData.buffer.byteLength,\n } as File,\n }\n },\n output: 'image',\n settings: {\n name: 'dalle-e-settings',\n type: 'group',\n admin: {\n condition(data) {\n return data['model-id'] === 'dall-e'\n },\n },\n fields: [\n {\n name: 'version',\n type: 'select',\n defaultValue: 'dall-e-3',\n label: 'Version',\n options: ['dall-e-3', 'dall-e-2'],\n },\n {\n type: 'row',\n fields: [\n {\n name: 'size',\n type: 'select',\n defaultValue: '1024x1024',\n label: 'Size',\n options: ['256x256', '512x512', '1024x1024', '1792x1024', '1024x1792'],\n },\n {\n name: 'style',\n type: 'select',\n defaultValue: 'natural',\n label: 'Style',\n options: ['vivid', 'natural'],\n },\n ],\n },\n {\n name: 'enable-prompt-optimization',\n type: 'checkbox',\n label: 'Optimize prompt',\n },\n ],\n label: 'OpenAI DALL-E Settings',\n },\n },\n {\n id: 'gpt-image-1',\n name: 'OpenAI GPT Image 1',\n fields: ['upload'],\n handler: async (prompt: string, options) => {\n const imageData = await generateImage(prompt, options)\n return {\n data: {\n alt: imageData.alt,\n },\n file: {\n name: `image_${generateFileNameByPrompt(imageData.alt || prompt)}.png`,\n data: imageData.buffer,\n mimetype: 'image/png',\n size: imageData.buffer.byteLength,\n } as File,\n }\n },\n output: 'image',\n settings: {\n name: 'gpt-image-1-settings',\n type: 'group',\n admin: {\n condition(data) {\n return data['model-id'] === 'gpt-image-1'\n },\n },\n fields: [\n {\n name: 'version',\n type: 'select',\n defaultValue: 'gpt-image-1',\n label: 'Version',\n options: ['gpt-image-1'],\n },\n {\n type: 'row',\n fields: [\n {\n name: 'size',\n type: 'select',\n defaultValue: 'auto',\n label: 'Size',\n options: ['1024x1024', '1024x1536', '1536x1024', 'auto'],\n },\n {\n name: 'quality',\n type: 'select',\n defaultValue: 'auto',\n label: 'Quality',\n options: ['low', 'medium', 'high', 'auto'],\n },\n ],\n },\n {\n name: 'output_format',\n type: 'select',\n defaultValue: 'png',\n label: 'Output Format',\n options: ['png', 'jpeg', 'webp'],\n },\n {\n name: 'output_compression',\n type: 'number',\n admin: {\n condition(data) {\n return data.output_format === 'jpeg' || data.output_format === 'webp'\n },\n },\n defaultValue: 100,\n label: 'Output Compression',\n max: 100,\n min: 0,\n },\n {\n name: 'background',\n type: 'select',\n admin: {\n condition(data) {\n return data.output_format === 'png' || data.output_format === 'webp'\n },\n },\n defaultValue: 'white',\n label: 'Background',\n options: ['white', 'transparent'],\n },\n {\n name: 'moderation',\n type: 'select',\n defaultValue: 'auto',\n label: 'Moderation',\n options: ['auto', 'low'],\n },\n ],\n label: 'OpenAI GPT Image 1 Settings',\n },\n },\n {\n id: 'tts',\n name: 'OpenAI Text-to-Speech',\n fields: ['upload'],\n handler: async (text: string, options) => {\n //TODO: change it to open ai text to speech api\n const voiceData = await generateVoice(text, options)\n if (!voiceData || !voiceData.buffer) {\n throw new Error('Voice data missing')\n }\n return {\n data: {\n alt: text,\n },\n file: {\n name: `voice_${generateFileNameByPrompt(text)}.mp3`,\n data: voiceData.buffer,\n mimetype: 'audio/mp3',\n size: voiceData.buffer.byteLength,\n } as File,\n }\n },\n output: 'audio',\n settings: {\n name: `${MODEL_KEY}-tts-settings`,\n type: 'group',\n admin: {\n condition(data) {\n return data['model-id'] === 'tts'\n },\n },\n fields: [\n {\n name: 'voice',\n type: 'select',\n defaultValue: 'alloy',\n label: 'Voice',\n options: ['alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer'] as Array<\n SpeechCreateParams['voice']\n >,\n },\n {\n name: 'model',\n type: 'select',\n defaultValue: 'tts-1',\n label: 'Model',\n options: ['tts-1', 'tts-1-hd'] as Array<SpeechCreateParams['model']>,\n },\n {\n name: 'response_format',\n type: 'select',\n defaultValue: 'mp3',\n label: 'Response Format',\n options: ['mp3', 'opus', 'aac', 'flac', 'wav', 'pcm'],\n },\n {\n name: 'speed',\n type: 'number',\n defaultValue: 1,\n label: 'Speed',\n max: 4,\n min: 0.25,\n },\n ],\n label: 'OpenAI Text-to-Speech Settings',\n },\n },\n {\n id: `${MODEL_KEY}-object`,\n name: 'OpenAI GPT',\n fields: ['richText'],\n handler: (text: string, options) => {\n return generateRichText(text, options)\n },\n output: 'text',\n settings: {\n name: `${MODEL_KEY}-object-settings`,\n type: 'group',\n admin: {\n condition(data) {\n return data['model-id'] === `${MODEL_KEY}-object`\n },\n },\n fields: [\n {\n name: 'model',\n type: 'select',\n defaultValue: 'gpt-4o',\n label: 'Model',\n options: [\n 'gpt-5',\n 'gpt-5-mini',\n 'gpt-5-nano',\n 'gpt-4.1',\n 'gpt-4o',\n 'gpt-4-turbo',\n 'gpt-4o-mini',\n 'o4-mini'\n , 'gpt-4.1', 'gpt-5'],\n },\n {\n type: 'row', fields: [\n {\n name: 'maxTokens',\n type: 'number',\n defaultValue: 5000,\n },\n {\n name: 'temperature',\n type: 'number',\n defaultValue: 0.7,\n max: 1,\n min: 0,\n },\n\n ]\n },\n {\n name: 'extractAttachments',\n type: 'checkbox',\n }\n ],\n label: 'OpenAI GPT Settings',\n },\n },\n ],\n provider: 'OpenAI',\n}\n"],"names":["streamText","extractPromptAttachments","defaultSystemPrompt","generateFileNameByPrompt","generateImage","generateRichText","generateVoice","openai","MODEL_KEY","OpenAIConfig","models","id","name","fields","handler","prompt","options","streamTextResult","maxOutputTokens","maxTokens","model","onError","error","console","temperature","extractAttachments","system","toUIMessageStreamResponse","output","settings","type","admin","condition","data","defaultValue","label","max","min","imageData","alt","file","buffer","mimetype","size","byteLength","output_format","text","voiceData","Error","provider"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/ai/models/openai/index.ts"],"sourcesContent":["import type { SpeechCreateParams } from 'openai/resources/audio/speech'\nimport type { File } from 'payload'\n\nimport { streamText } from 'ai'\n\nimport type { GenerationConfig } from '../../../types.js'\n\nimport { extractPromptAttachments } from '../../../utilities/extractPromptAttachments.js'\nimport { defaultSystemPrompt } from '../../prompts.js'\nimport { generateFileNameByPrompt } from '../../utils/generateFileNameByPrompt.js'\nimport { generateImage } from './generateImage.js'\nimport { generateRichText } from './generateRichText.js'\nimport { generateVoice } from './generateVoice.js'\nimport { openai } from './openai.js'\n\nconst MODEL_KEY = 'Oai'\nconst MODELS = [\n 'gpt-5',\n 'gpt-5-mini',\n 'gpt-5-nano',\n 'gpt-4.1',\n 'gpt-4o',\n 'gpt-4-turbo',\n 'gpt-4o-mini',\n 'gpt-3.5-turbo',\n]\n\n//TODO: Simplify this file by moving the handlers to separate files and remove duplicate code\nexport const OpenAIConfig: GenerationConfig = {\n models: [\n {\n id: `${MODEL_KEY}-text`,\n name: 'OpenAI GPT Text',\n fields: ['text', 'textarea'],\n handler: (\n prompt: string,\n options: {\n extractAttachments: boolean\n locale: string\n maxTokens: number\n model: string\n system: string\n temperature: number\n },\n ) => {\n const streamTextResult = streamText({\n maxOutputTokens: options.maxTokens || 5000,\n model: openai(options.model),\n onError: (error) => {\n console.error(`${MODEL_KEY}-text: `, error)\n },\n temperature: options.temperature || 0.7,\n\n // TODO: Implement billing/token consumption\n // onFinish: (stepResult) => {\n // console.log('streamText : finish : ', stepResult)\n // },\n prompt: options.extractAttachments ? extractPromptAttachments(prompt) : prompt,\n system: options.system || defaultSystemPrompt,\n })\n\n return streamTextResult.toUIMessageStreamResponse()\n },\n output: 'text',\n settings: {\n name: `${MODEL_KEY}-text-settings`,\n type: 'group',\n admin: {\n condition(data) {\n return data['model-id'] === `${MODEL_KEY}-text`\n },\n },\n fields: [\n {\n name: 'model',\n type: 'select',\n defaultValue: 'gpt-4o-mini',\n label: 'Model',\n options: MODELS,\n },\n {\n type: 'row',\n fields: [\n {\n name: 'maxTokens',\n type: 'number',\n defaultValue: 5000,\n },\n {\n name: 'temperature',\n type: 'number',\n defaultValue: 0.7,\n max: 1,\n min: 0,\n },\n ],\n },\n {\n name: 'extractAttachments',\n type: 'checkbox',\n },\n ],\n label: 'OpenAI GPT Settings',\n },\n },\n {\n id: 'dall-e',\n name: 'OpenAI DALL-E',\n fields: ['upload'],\n handler: async (prompt: string, options) => {\n const imageData = await generateImage(prompt, options)\n return {\n data: {\n alt: imageData.alt,\n },\n file: {\n name: `image_${generateFileNameByPrompt(imageData.alt || prompt)}.jpeg`,\n data: imageData.buffer,\n mimetype: 'image/jpeg',\n size: imageData.buffer.byteLength,\n } as File,\n }\n },\n output: 'image',\n settings: {\n name: 'dalle-e-settings',\n type: 'group',\n admin: {\n condition(data) {\n return data['model-id'] === 'dall-e'\n },\n },\n fields: [\n {\n name: 'version',\n type: 'select',\n defaultValue: 'dall-e-3',\n label: 'Version',\n options: ['dall-e-3', 'dall-e-2'],\n },\n {\n type: 'row',\n fields: [\n {\n name: 'size',\n type: 'select',\n defaultValue: '1024x1024',\n label: 'Size',\n options: ['256x256', '512x512', '1024x1024', '1792x1024', '1024x1792'],\n },\n {\n name: 'style',\n type: 'select',\n defaultValue: 'natural',\n label: 'Style',\n options: ['vivid', 'natural'],\n },\n ],\n },\n {\n name: 'enable-prompt-optimization',\n type: 'checkbox',\n label: 'Optimize prompt',\n },\n ],\n label: 'OpenAI DALL-E Settings',\n },\n },\n {\n id: 'gpt-image-1',\n name: 'OpenAI GPT Image 1',\n fields: ['upload'],\n handler: async (prompt: string, options) => {\n const imageData = await generateImage(prompt, options)\n return {\n data: {\n alt: imageData.alt,\n },\n file: {\n name: `image_${generateFileNameByPrompt(imageData.alt || prompt)}.png`,\n data: imageData.buffer,\n mimetype: 'image/png',\n size: imageData.buffer.byteLength,\n } as File,\n }\n },\n output: 'image',\n settings: {\n name: 'gpt-image-1-settings',\n type: 'group',\n admin: {\n condition(data) {\n return data['model-id'] === 'gpt-image-1'\n },\n },\n fields: [\n {\n name: 'version',\n type: 'select',\n defaultValue: 'gpt-image-1',\n label: 'Version',\n options: ['gpt-image-1'],\n },\n {\n type: 'row',\n fields: [\n {\n name: 'size',\n type: 'select',\n defaultValue: 'auto',\n label: 'Size',\n options: ['1024x1024', '1024x1536', '1536x1024', 'auto'],\n },\n {\n name: 'quality',\n type: 'select',\n defaultValue: 'auto',\n label: 'Quality',\n options: ['low', 'medium', 'high', 'auto'],\n },\n ],\n },\n {\n name: 'output_format',\n type: 'select',\n defaultValue: 'png',\n label: 'Output Format',\n options: ['png', 'jpeg', 'webp'],\n },\n {\n name: 'output_compression',\n type: 'number',\n admin: {\n condition(data) {\n return data.output_format === 'jpeg' || data.output_format === 'webp'\n },\n },\n defaultValue: 100,\n label: 'Output Compression',\n max: 100,\n min: 0,\n },\n {\n name: 'background',\n type: 'select',\n admin: {\n condition(data) {\n return data.output_format === 'png' || data.output_format === 'webp'\n },\n },\n defaultValue: 'white',\n label: 'Background',\n options: ['white', 'transparent'],\n },\n {\n name: 'moderation',\n type: 'select',\n defaultValue: 'auto',\n label: 'Moderation',\n options: ['auto', 'low'],\n },\n ],\n label: 'OpenAI GPT Image 1 Settings',\n },\n },\n {\n id: 'tts',\n name: 'OpenAI Text-to-Speech',\n fields: ['upload'],\n handler: async (text: string, options) => {\n //TODO: change it to open ai text to speech api\n const voiceData = await generateVoice(text, options)\n if (!voiceData || !voiceData.buffer) {\n throw new Error('Voice data missing')\n }\n return {\n data: {\n alt: text,\n },\n file: {\n name: `voice_${generateFileNameByPrompt(text)}.mp3`,\n data: voiceData.buffer,\n mimetype: 'audio/mp3',\n size: voiceData.buffer.byteLength,\n } as File,\n }\n },\n output: 'audio',\n settings: {\n name: `${MODEL_KEY}-tts-settings`,\n type: 'group',\n admin: {\n condition(data) {\n return data['model-id'] === 'tts'\n },\n },\n fields: [\n {\n name: 'voice',\n type: 'select',\n defaultValue: 'alloy',\n label: 'Voice',\n options: ['alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer'] as Array<\n SpeechCreateParams['voice']\n >,\n },\n {\n name: 'model',\n type: 'select',\n defaultValue: 'tts-1',\n label: 'Model',\n options: ['tts-1', 'tts-1-hd'] as Array<SpeechCreateParams['model']>,\n },\n {\n name: 'response_format',\n type: 'select',\n defaultValue: 'mp3',\n label: 'Response Format',\n options: ['mp3', 'opus', 'aac', 'flac', 'wav', 'pcm'],\n },\n {\n name: 'speed',\n type: 'number',\n defaultValue: 1,\n label: 'Speed',\n max: 4,\n min: 0.25,\n },\n ],\n label: 'OpenAI Text-to-Speech Settings',\n },\n },\n {\n id: `${MODEL_KEY}-object`,\n name: 'OpenAI GPT',\n fields: ['richText'],\n handler: (text: string, options) => {\n return generateRichText(text, options)\n },\n output: 'text',\n settings: {\n name: `${MODEL_KEY}-object-settings`,\n type: 'group',\n admin: {\n condition(data) {\n return data['model-id'] === `${MODEL_KEY}-object`\n },\n },\n fields: [\n {\n name: 'model',\n type: 'select',\n defaultValue: 'gpt-4o',\n label: 'Model',\n options: MODELS,\n },\n {\n type: 'row',\n fields: [\n {\n name: 'maxTokens',\n type: 'number',\n defaultValue: 5000,\n },\n {\n name: 'temperature',\n type: 'number',\n defaultValue: 0.7,\n max: 1,\n min: 0,\n },\n ],\n },\n {\n name: 'extractAttachments',\n type: 'checkbox',\n },\n ],\n label: 'OpenAI GPT Settings',\n },\n },\n ],\n provider: 'OpenAI',\n}\n"],"names":["streamText","extractPromptAttachments","defaultSystemPrompt","generateFileNameByPrompt","generateImage","generateRichText","generateVoice","openai","MODEL_KEY","MODELS","OpenAIConfig","models","id","name","fields","handler","prompt","options","streamTextResult","maxOutputTokens","maxTokens","model","onError","error","console","temperature","extractAttachments","system","toUIMessageStreamResponse","output","settings","type","admin","condition","data","defaultValue","label","max","min","imageData","alt","file","buffer","mimetype","size","byteLength","output_format","text","voiceData","Error","provider"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import type { CollectionConfig } from 'payload';
2
2
  import type { PluginConfig } from 'src/types.js';
3
- export declare const instructionsCollection: (pluginConfig: PluginConfig, options?: Partial<CollectionConfig>) => CollectionConfig;
3
+ export declare const instructionsCollection: (pluginConfig: PluginConfig) => CollectionConfig;
@@ -43,16 +43,20 @@ const defaultAdminConfig = {
43
43
  group: 'Plugins',
44
44
  hidden: true
45
45
  };
46
- export const instructionsCollection = (pluginConfig, options)=>({
46
+ export const instructionsCollection = (pluginConfig)=>({
47
+ labels: {
48
+ plural: 'Compose Settings',
49
+ singular: 'Compose Setting'
50
+ },
51
+ ...pluginConfig.overrideInstructions,
47
52
  slug: PLUGIN_INSTRUCTIONS_TABLE,
48
53
  access: {
49
54
  ...defaultAccessConfig,
50
- ...options?.access
55
+ ...pluginConfig.overrideInstructions?.access
51
56
  },
52
57
  admin: {
53
58
  ...defaultAdminConfig,
54
- ...options?.admin,
55
- group: 'Plugins'
59
+ ...pluginConfig.overrideInstructions?.admin
56
60
  },
57
61
  fields: [
58
62
  {
@@ -229,11 +233,7 @@ informative and accurate but also captivating and beautifully structured.`,
229
233
  ]
230
234
  },
231
235
  ...groupSettings(pluginConfig)
232
- ],
233
- labels: {
234
- plural: 'Compose Settings',
235
- singular: 'Compose Setting'
236
- }
236
+ ]
237
237
  });
238
238
 
239
239
  //# sourceMappingURL=Instructions.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/collections/Instructions.ts"],"sourcesContent":["import type { CollectionConfig, GroupField } from 'payload'\nimport type { PluginConfig } from 'src/types.js'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\nimport { getGenerationModels } from '../utilities/getGenerationModels.js'\n\nconst groupSettings = (pluginConfig: PluginConfig) =>\n (getGenerationModels(pluginConfig) ?? []).reduce((fields, model) => {\n if (model.settings) {\n fields.push(model.settings)\n }\n return fields\n }, [] as GroupField[])\n\nconst modelOptions = (pluginConfig: PluginConfig) =>\n (getGenerationModels(pluginConfig) ?? []).map((model) => {\n return {\n fields: model.fields,\n label: model.name,\n value: model.id,\n }\n })\n\nconst defaultAccessConfig = {\n create: ({ req }: { req: { user?: any } }) => {\n if (!req.user) {\n return false\n }\n return true\n },\n delete: ({ req }: { req: { user?: any } }) => {\n if (!req.user) {\n return false\n }\n return true\n },\n read: ({ req }: { req: { user?: any } }) => {\n if (!req.user) {\n return false\n }\n return true\n },\n update: ({ req }: { req: { user?: any } }) => {\n if (!req.user) {\n return false\n }\n return true\n },\n}\n\nconst defaultAdminConfig = {\n group: 'Plugins',\n hidden: true,\n}\n\nexport const instructionsCollection = (\n pluginConfig: PluginConfig,\n options?: Partial<CollectionConfig>,\n) =>\n <CollectionConfig>{\n slug: PLUGIN_INSTRUCTIONS_TABLE,\n access: {\n ...defaultAccessConfig,\n ...options?.access,\n },\n admin: {\n ...defaultAdminConfig,\n ...options?.admin,\n group: 'Plugins',\n },\n fields: [\n {\n name: 'schema-path',\n type: 'text',\n admin: {\n description: \"Please don't change this unless you're sure of what you're doing\",\n },\n unique: true,\n },\n {\n name: 'field-type',\n type: 'select',\n admin: {\n description: \"Please don't change this unless you're sure of what you're doing\",\n },\n defaultValue: 'text',\n label: 'Field type',\n options: [\n {\n label: 'text',\n value: 'text',\n },\n {\n label: 'textarea',\n value: 'textarea',\n },\n {\n label: 'upload',\n value: 'upload',\n },\n {\n label: 'richText',\n value: 'richText',\n },\n ],\n },\n {\n name: 'relation-to',\n type: 'text',\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'upload'\n },\n },\n label: 'Relation to',\n },\n {\n name: 'model-id',\n type: 'select',\n admin: {\n components: {\n Field: {\n clientProps: {\n filterByField: 'field-type',\n options: modelOptions(pluginConfig),\n },\n path: '@ai-stack/payloadcms/fields#SelectField',\n },\n },\n },\n label: 'Model',\n options: modelOptions(pluginConfig).map((option) => {\n return {\n label: option.label,\n value: option.value,\n }\n }),\n },\n {\n id: 'ai-prompts-tabs',\n type: 'tabs',\n tabs: [\n {\n description:\n 'Define dynamic templates using {{ fieldName }}. Type { to see available field suggestions.',\n fields: [\n {\n name: 'prompt',\n type: 'textarea',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/fields#PromptEditorField',\n },\n description: \"Click 'Compose' to run this custom prompt and generate content\",\n },\n label: '',\n },\n ],\n label: 'Prompt',\n },\n {\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'upload' && current['model-id'] === 'gpt-image-1'\n },\n },\n description:\n 'These images will be used to generate new visuals in a similar style, layout, or content. You can combine multiple references for more controlled results.',\n fields: [\n {\n name: 'images',\n type: 'array',\n fields: [\n {\n name: 'image',\n type: 'upload',\n admin: {\n description: 'Please make sure the image is publicly accessible.',\n },\n relationTo: pluginConfig.uploadCollectionSlug\n ? pluginConfig.uploadCollectionSlug\n : 'media',\n },\n ],\n },\n ],\n label: 'Sample Images',\n },\n {\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'richText'\n },\n },\n description: '',\n fields: [\n {\n name: 'system',\n type: 'textarea',\n defaultValue: `INSTRUCTIONS:\nYou are a highly skilled and professional blog writer,\nrenowned for crafting engaging and well-organized articles.\nWhen given a title, you meticulously create blogs that are not only\ninformative and accurate but also captivating and beautifully structured.`,\n label: '',\n },\n ],\n label: 'System prompt',\n },\n {\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'richText'\n },\n },\n description: '',\n fields: [\n {\n /** TODO:\n * - Layouts can be saved in as an array\n * - User can add their own layout to collections and use it later for generate specific rich text\n * - User can select previously added layout\n */\n name: 'layout',\n type: 'textarea',\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'richText'\n },\n },\n defaultValue: `[paragraph] - Write a concise introduction (2-3 sentences) that outlines the main topic.\n[horizontalrule] - Insert a horizontal rule to separate the introduction from the main content.\n[list] - Create a list with 3-5 items. Each list item should contain:\n a. [heading] - A brief, descriptive heading (up to 5 words)\n b. [paragraph] - A short explanation or elaboration (1-2 sentences)\n[horizontalrule] - Insert another horizontal rule to separate the main content from the conclusion.\n[paragraph] - Compose a brief conclusion (2-3 sentences) summarizing the key points.\n[quote] - Include a relevant quote from a famous person, directly related to the topic. Format: \"Quote text.\" - Author Name`,\n label: '',\n },\n ],\n label: 'Layout',\n },\n ],\n },\n ...groupSettings(pluginConfig),\n ],\n labels: {\n plural: 'Compose Settings',\n singular: 'Compose Setting',\n },\n }\n"],"names":["PLUGIN_INSTRUCTIONS_TABLE","getGenerationModels","groupSettings","pluginConfig","reduce","fields","model","settings","push","modelOptions","map","label","name","value","id","defaultAccessConfig","create","req","user","delete","read","update","defaultAdminConfig","group","hidden","instructionsCollection","options","slug","access","admin","type","description","unique","defaultValue","condition","_","current","components","Field","clientProps","filterByField","path","option","tabs","relationTo","uploadCollectionSlug","labels","plural","singular"],"mappings":"AAGA,SAASA,yBAAyB,QAAQ,iBAAgB;AAC1D,SAASC,mBAAmB,QAAQ,sCAAqC;AAEzE,MAAMC,gBAAgB,CAACC,eACrB,AAACF,CAAAA,oBAAoBE,iBAAiB,EAAE,AAAD,EAAGC,MAAM,CAAC,CAACC,QAAQC;QACxD,IAAIA,MAAMC,QAAQ,EAAE;YAClBF,OAAOG,IAAI,CAACF,MAAMC,QAAQ;QAC5B;QACA,OAAOF;IACT,GAAG,EAAE;AAEP,MAAMI,eAAe,CAACN,eACpB,AAACF,CAAAA,oBAAoBE,iBAAiB,EAAE,AAAD,EAAGO,GAAG,CAAC,CAACJ;QAC7C,OAAO;YACLD,QAAQC,MAAMD,MAAM;YACpBM,OAAOL,MAAMM,IAAI;YACjBC,OAAOP,MAAMQ,EAAE;QACjB;IACF;AAEF,MAAMC,sBAAsB;IAC1BC,QAAQ,CAAC,EAAEC,GAAG,EAA2B;QACvC,IAAI,CAACA,IAAIC,IAAI,EAAE;YACb,OAAO;QACT;QACA,OAAO;IACT;IACAC,QAAQ,CAAC,EAAEF,GAAG,EAA2B;QACvC,IAAI,CAACA,IAAIC,IAAI,EAAE;YACb,OAAO;QACT;QACA,OAAO;IACT;IACAE,MAAM,CAAC,EAAEH,GAAG,EAA2B;QACrC,IAAI,CAACA,IAAIC,IAAI,EAAE;YACb,OAAO;QACT;QACA,OAAO;IACT;IACAG,QAAQ,CAAC,EAAEJ,GAAG,EAA2B;QACvC,IAAI,CAACA,IAAIC,IAAI,EAAE;YACb,OAAO;QACT;QACA,OAAO;IACT;AACF;AAEA,MAAMI,qBAAqB;IACzBC,OAAO;IACPC,QAAQ;AACV;AAEA,OAAO,MAAMC,yBAAyB,CACpCtB,cACAuB,UAEkB,CAAA;QAChBC,MAAM3B;QACN4B,QAAQ;YACN,GAAGb,mBAAmB;YACtB,GAAGW,SAASE,MAAM;QACpB;QACAC,OAAO;YACL,GAAGP,kBAAkB;YACrB,GAAGI,SAASG,KAAK;YACjBN,OAAO;QACT;QACAlB,QAAQ;YACN;gBACEO,MAAM;gBACNkB,MAAM;gBACND,OAAO;oBACLE,aAAa;gBACf;gBACAC,QAAQ;YACV;YACA;gBACEpB,MAAM;gBACNkB,MAAM;gBACND,OAAO;oBACLE,aAAa;gBACf;gBACAE,cAAc;gBACdtB,OAAO;gBACPe,SAAS;oBACP;wBACEf,OAAO;wBACPE,OAAO;oBACT;oBACA;wBACEF,OAAO;wBACPE,OAAO;oBACT;oBACA;wBACEF,OAAO;wBACPE,OAAO;oBACT;oBACA;wBACEF,OAAO;wBACPE,OAAO;oBACT;iBACD;YACH;YACA;gBACED,MAAM;gBACNkB,MAAM;gBACND,OAAO;oBACLK,WAAW,CAACC,GAAGC;wBACb,OAAOA,OAAO,CAAC,aAAa,KAAK;oBACnC;gBACF;gBACAzB,OAAO;YACT;YACA;gBACEC,MAAM;gBACNkB,MAAM;gBACND,OAAO;oBACLQ,YAAY;wBACVC,OAAO;4BACLC,aAAa;gCACXC,eAAe;gCACfd,SAASjB,aAAaN;4BACxB;4BACAsC,MAAM;wBACR;oBACF;gBACF;gBACA9B,OAAO;gBACPe,SAASjB,aAAaN,cAAcO,GAAG,CAAC,CAACgC;oBACvC,OAAO;wBACL/B,OAAO+B,OAAO/B,KAAK;wBACnBE,OAAO6B,OAAO7B,KAAK;oBACrB;gBACF;YACF;YACA;gBACEC,IAAI;gBACJgB,MAAM;gBACNa,MAAM;oBACJ;wBACEZ,aACE;wBACF1B,QAAQ;4BACN;gCACEO,MAAM;gCACNkB,MAAM;gCACND,OAAO;oCACLQ,YAAY;wCACVC,OAAO;oCACT;oCACAP,aAAa;gCACf;gCACApB,OAAO;4BACT;yBACD;wBACDA,OAAO;oBACT;oBACA;wBACEkB,OAAO;4BACLK,WAAW,CAACC,GAAGC;gCACb,OAAOA,OAAO,CAAC,aAAa,KAAK,YAAYA,OAAO,CAAC,WAAW,KAAK;4BACvE;wBACF;wBACAL,aACE;wBACF1B,QAAQ;4BACN;gCACEO,MAAM;gCACNkB,MAAM;gCACNzB,QAAQ;oCACN;wCACEO,MAAM;wCACNkB,MAAM;wCACND,OAAO;4CACLE,aAAa;wCACf;wCACAa,YAAYzC,aAAa0C,oBAAoB,GACzC1C,aAAa0C,oBAAoB,GACjC;oCACN;iCACD;4BACH;yBACD;wBACDlC,OAAO;oBACT;oBACA;wBACEkB,OAAO;4BACLK,WAAW,CAACC,GAAGC;gCACb,OAAOA,OAAO,CAAC,aAAa,KAAK;4BACnC;wBACF;wBACAL,aAAa;wBACb1B,QAAQ;4BACN;gCACEO,MAAM;gCACNkB,MAAM;gCACNG,cAAc,CAAC;;;;yEAI0C,CAAC;gCAC1DtB,OAAO;4BACT;yBACD;wBACDA,OAAO;oBACT;oBACA;wBACEkB,OAAO;4BACLK,WAAW,CAACC,GAAGC;gCACb,OAAOA,OAAO,CAAC,aAAa,KAAK;4BACnC;wBACF;wBACAL,aAAa;wBACb1B,QAAQ;4BACN;gCACE;;;;iBAIC,GAJD;;;;iBAIC,GACDO,MAAM;gCACNkB,MAAM;gCACND,OAAO;oCACLK,WAAW,CAACC,GAAGC;wCACb,OAAOA,OAAO,CAAC,aAAa,KAAK;oCACnC;gCACF;gCACAH,cAAc,CAAC;;;;;;;2HAO4F,CAAC;gCAC5GtB,OAAO;4BACT;yBACD;wBACDA,OAAO;oBACT;iBACD;YACH;eACGT,cAAcC;SAClB;QACD2C,QAAQ;YACNC,QAAQ;YACRC,UAAU;QACZ;IACF,CAAA,EAAC"}
1
+ {"version":3,"sources":["../../src/collections/Instructions.ts"],"sourcesContent":["import type { CollectionConfig, GroupField } from 'payload'\nimport type { PluginConfig } from 'src/types.js'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\nimport { getGenerationModels } from '../utilities/getGenerationModels.js'\n\nconst groupSettings = (pluginConfig: PluginConfig) =>\n (getGenerationModels(pluginConfig) ?? []).reduce((fields, model) => {\n if (model.settings) {\n fields.push(model.settings)\n }\n return fields\n }, [] as GroupField[])\n\nconst modelOptions = (pluginConfig: PluginConfig) =>\n (getGenerationModels(pluginConfig) ?? []).map((model) => {\n return {\n fields: model.fields,\n label: model.name,\n value: model.id,\n }\n })\n\nconst defaultAccessConfig = {\n create: ({ req }: { req: { user?: any } }) => {\n if (!req.user) {\n return false\n }\n return true\n },\n delete: ({ req }: { req: { user?: any } }) => {\n if (!req.user) {\n return false\n }\n return true\n },\n read: ({ req }: { req: { user?: any } }) => {\n if (!req.user) {\n return false\n }\n return true\n },\n update: ({ req }: { req: { user?: any } }) => {\n if (!req.user) {\n return false\n }\n return true\n },\n}\n\nconst defaultAdminConfig = {\n group: 'Plugins',\n hidden: true,\n}\n\nexport const instructionsCollection = (\n pluginConfig: PluginConfig,\n) =>\n <CollectionConfig>{\n labels: {\n plural: 'Compose Settings',\n singular: 'Compose Setting',\n },\n ...pluginConfig.overrideInstructions,\n slug: PLUGIN_INSTRUCTIONS_TABLE,\n access: {\n ...defaultAccessConfig,\n ...pluginConfig.overrideInstructions?.access,\n },\n admin: {\n ...defaultAdminConfig,\n ...pluginConfig.overrideInstructions?.admin,\n },\n fields: [\n {\n name: 'schema-path',\n type: 'text',\n admin: {\n description: \"Please don't change this unless you're sure of what you're doing\",\n },\n unique: true,\n },\n {\n name: 'field-type',\n type: 'select',\n admin: {\n description: \"Please don't change this unless you're sure of what you're doing\",\n },\n defaultValue: 'text',\n label: 'Field type',\n options: [\n {\n label: 'text',\n value: 'text',\n },\n {\n label: 'textarea',\n value: 'textarea',\n },\n {\n label: 'upload',\n value: 'upload',\n },\n {\n label: 'richText',\n value: 'richText',\n },\n ],\n },\n {\n name: 'relation-to',\n type: 'text',\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'upload'\n },\n },\n label: 'Relation to',\n },\n {\n name: 'model-id',\n type: 'select',\n admin: {\n components: {\n Field: {\n clientProps: {\n filterByField: 'field-type',\n options: modelOptions(pluginConfig),\n },\n path: '@ai-stack/payloadcms/fields#SelectField',\n },\n },\n },\n label: 'Model',\n options: modelOptions(pluginConfig).map((option) => {\n return {\n label: option.label,\n value: option.value,\n }\n }),\n },\n {\n id: 'ai-prompts-tabs',\n type: 'tabs',\n tabs: [\n {\n description:\n 'Define dynamic templates using {{ fieldName }}. Type { to see available field suggestions.',\n fields: [\n {\n name: 'prompt',\n type: 'textarea',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/fields#PromptEditorField',\n },\n description: \"Click 'Compose' to run this custom prompt and generate content\",\n },\n label: '',\n },\n ],\n label: 'Prompt',\n },\n {\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'upload' && current['model-id'] === 'gpt-image-1'\n },\n },\n description:\n 'These images will be used to generate new visuals in a similar style, layout, or content. You can combine multiple references for more controlled results.',\n fields: [\n {\n name: 'images',\n type: 'array',\n fields: [\n {\n name: 'image',\n type: 'upload',\n admin: {\n description: 'Please make sure the image is publicly accessible.',\n },\n relationTo: pluginConfig.uploadCollectionSlug\n ? pluginConfig.uploadCollectionSlug\n : 'media',\n },\n ],\n },\n ],\n label: 'Sample Images',\n },\n {\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'richText'\n },\n },\n description: '',\n fields: [\n {\n name: 'system',\n type: 'textarea',\n defaultValue: `INSTRUCTIONS:\nYou are a highly skilled and professional blog writer,\nrenowned for crafting engaging and well-organized articles.\nWhen given a title, you meticulously create blogs that are not only\ninformative and accurate but also captivating and beautifully structured.`,\n label: '',\n },\n ],\n label: 'System prompt',\n },\n {\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'richText'\n },\n },\n description: '',\n fields: [\n {\n /** TODO:\n * - Layouts can be saved in as an array\n * - User can add their own layout to collections and use it later for generate specific rich text\n * - User can select previously added layout\n */\n name: 'layout',\n type: 'textarea',\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'richText'\n },\n },\n defaultValue: `[paragraph] - Write a concise introduction (2-3 sentences) that outlines the main topic.\n[horizontalrule] - Insert a horizontal rule to separate the introduction from the main content.\n[list] - Create a list with 3-5 items. Each list item should contain:\n a. [heading] - A brief, descriptive heading (up to 5 words)\n b. [paragraph] - A short explanation or elaboration (1-2 sentences)\n[horizontalrule] - Insert another horizontal rule to separate the main content from the conclusion.\n[paragraph] - Compose a brief conclusion (2-3 sentences) summarizing the key points.\n[quote] - Include a relevant quote from a famous person, directly related to the topic. Format: \"Quote text.\" - Author Name`,\n label: '',\n },\n ],\n label: 'Layout',\n },\n ],\n },\n ...groupSettings(pluginConfig),\n ],\n }\n"],"names":["PLUGIN_INSTRUCTIONS_TABLE","getGenerationModels","groupSettings","pluginConfig","reduce","fields","model","settings","push","modelOptions","map","label","name","value","id","defaultAccessConfig","create","req","user","delete","read","update","defaultAdminConfig","group","hidden","instructionsCollection","labels","plural","singular","overrideInstructions","slug","access","admin","type","description","unique","defaultValue","options","condition","_","current","components","Field","clientProps","filterByField","path","option","tabs","relationTo","uploadCollectionSlug"],"mappings":"AAGA,SAASA,yBAAyB,QAAQ,iBAAgB;AAC1D,SAASC,mBAAmB,QAAQ,sCAAqC;AAEzE,MAAMC,gBAAgB,CAACC,eACrB,AAACF,CAAAA,oBAAoBE,iBAAiB,EAAE,AAAD,EAAGC,MAAM,CAAC,CAACC,QAAQC;QACxD,IAAIA,MAAMC,QAAQ,EAAE;YAClBF,OAAOG,IAAI,CAACF,MAAMC,QAAQ;QAC5B;QACA,OAAOF;IACT,GAAG,EAAE;AAEP,MAAMI,eAAe,CAACN,eACpB,AAACF,CAAAA,oBAAoBE,iBAAiB,EAAE,AAAD,EAAGO,GAAG,CAAC,CAACJ;QAC7C,OAAO;YACLD,QAAQC,MAAMD,MAAM;YACpBM,OAAOL,MAAMM,IAAI;YACjBC,OAAOP,MAAMQ,EAAE;QACjB;IACF;AAEF,MAAMC,sBAAsB;IAC1BC,QAAQ,CAAC,EAAEC,GAAG,EAA2B;QACvC,IAAI,CAACA,IAAIC,IAAI,EAAE;YACb,OAAO;QACT;QACA,OAAO;IACT;IACAC,QAAQ,CAAC,EAAEF,GAAG,EAA2B;QACvC,IAAI,CAACA,IAAIC,IAAI,EAAE;YACb,OAAO;QACT;QACA,OAAO;IACT;IACAE,MAAM,CAAC,EAAEH,GAAG,EAA2B;QACrC,IAAI,CAACA,IAAIC,IAAI,EAAE;YACb,OAAO;QACT;QACA,OAAO;IACT;IACAG,QAAQ,CAAC,EAAEJ,GAAG,EAA2B;QACvC,IAAI,CAACA,IAAIC,IAAI,EAAE;YACb,OAAO;QACT;QACA,OAAO;IACT;AACF;AAEA,MAAMI,qBAAqB;IACzBC,OAAO;IACPC,QAAQ;AACV;AAEA,OAAO,MAAMC,yBAAyB,CACpCtB,eAEkB,CAAA;QAChBuB,QAAQ;YACNC,QAAQ;YACRC,UAAU;QACZ;QACA,GAAGzB,aAAa0B,oBAAoB;QACpCC,MAAM9B;QACN+B,QAAQ;YACN,GAAGhB,mBAAmB;YACtB,GAAGZ,aAAa0B,oBAAoB,EAAEE,MAAM;QAC9C;QACAC,OAAO;YACL,GAAGV,kBAAkB;YACrB,GAAGnB,aAAa0B,oBAAoB,EAAEG,KAAK;QAC7C;QACA3B,QAAQ;YACN;gBACEO,MAAM;gBACNqB,MAAM;gBACND,OAAO;oBACLE,aAAa;gBACf;gBACAC,QAAQ;YACV;YACA;gBACEvB,MAAM;gBACNqB,MAAM;gBACND,OAAO;oBACLE,aAAa;gBACf;gBACAE,cAAc;gBACdzB,OAAO;gBACP0B,SAAS;oBACP;wBACE1B,OAAO;wBACPE,OAAO;oBACT;oBACA;wBACEF,OAAO;wBACPE,OAAO;oBACT;oBACA;wBACEF,OAAO;wBACPE,OAAO;oBACT;oBACA;wBACEF,OAAO;wBACPE,OAAO;oBACT;iBACD;YACH;YACA;gBACED,MAAM;gBACNqB,MAAM;gBACND,OAAO;oBACLM,WAAW,CAACC,GAAGC;wBACb,OAAOA,OAAO,CAAC,aAAa,KAAK;oBACnC;gBACF;gBACA7B,OAAO;YACT;YACA;gBACEC,MAAM;gBACNqB,MAAM;gBACND,OAAO;oBACLS,YAAY;wBACVC,OAAO;4BACLC,aAAa;gCACXC,eAAe;gCACfP,SAAS5B,aAAaN;4BACxB;4BACA0C,MAAM;wBACR;oBACF;gBACF;gBACAlC,OAAO;gBACP0B,SAAS5B,aAAaN,cAAcO,GAAG,CAAC,CAACoC;oBACvC,OAAO;wBACLnC,OAAOmC,OAAOnC,KAAK;wBACnBE,OAAOiC,OAAOjC,KAAK;oBACrB;gBACF;YACF;YACA;gBACEC,IAAI;gBACJmB,MAAM;gBACNc,MAAM;oBACJ;wBACEb,aACE;wBACF7B,QAAQ;4BACN;gCACEO,MAAM;gCACNqB,MAAM;gCACND,OAAO;oCACLS,YAAY;wCACVC,OAAO;oCACT;oCACAR,aAAa;gCACf;gCACAvB,OAAO;4BACT;yBACD;wBACDA,OAAO;oBACT;oBACA;wBACEqB,OAAO;4BACLM,WAAW,CAACC,GAAGC;gCACb,OAAOA,OAAO,CAAC,aAAa,KAAK,YAAYA,OAAO,CAAC,WAAW,KAAK;4BACvE;wBACF;wBACAN,aACE;wBACF7B,QAAQ;4BACN;gCACEO,MAAM;gCACNqB,MAAM;gCACN5B,QAAQ;oCACN;wCACEO,MAAM;wCACNqB,MAAM;wCACND,OAAO;4CACLE,aAAa;wCACf;wCACAc,YAAY7C,aAAa8C,oBAAoB,GACzC9C,aAAa8C,oBAAoB,GACjC;oCACN;iCACD;4BACH;yBACD;wBACDtC,OAAO;oBACT;oBACA;wBACEqB,OAAO;4BACLM,WAAW,CAACC,GAAGC;gCACb,OAAOA,OAAO,CAAC,aAAa,KAAK;4BACnC;wBACF;wBACAN,aAAa;wBACb7B,QAAQ;4BACN;gCACEO,MAAM;gCACNqB,MAAM;gCACNG,cAAc,CAAC;;;;yEAI0C,CAAC;gCAC1DzB,OAAO;4BACT;yBACD;wBACDA,OAAO;oBACT;oBACA;wBACEqB,OAAO;4BACLM,WAAW,CAACC,GAAGC;gCACb,OAAOA,OAAO,CAAC,aAAa,KAAK;4BACnC;wBACF;wBACAN,aAAa;wBACb7B,QAAQ;4BACN;gCACE;;;;iBAIC,GAJD;;;;iBAIC,GACDO,MAAM;gCACNqB,MAAM;gCACND,OAAO;oCACLM,WAAW,CAACC,GAAGC;wCACb,OAAOA,OAAO,CAAC,aAAa,KAAK;oCACnC;gCACF;gCACAJ,cAAc,CAAC;;;;;;;2HAO4F,CAAC;gCAC5GzB,OAAO;4BACT;yBACD;wBACDA,OAAO;oBACT;iBACD;YACH;eACGT,cAAcC;SAClB;IACH,CAAA,EAAC"}
@@ -27,6 +27,7 @@ export const fetchFields = (config)=>{
27
27
  });
28
28
  return Response.json({
29
29
  ...options,
30
+ debugging: config.debugging,
30
31
  fields: fieldMap,
31
32
  isConfigAllowed,
32
33
  promptFields: promptFields.map(({ getter: _getter, ...field })=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/endpoints/fetchFields.ts"],"sourcesContent":["import type { Endpoint, PayloadRequest } from 'payload'\n\nimport type { PluginConfig, SerializedPromptField } from '../types.js'\n\nimport { PLUGIN_FETCH_FIELDS_ENDPOINT, PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\n\nexport const fetchFields: (config: PluginConfig) => Endpoint = (\n config\n) => {\n const {access, options = {}, promptFields = []} = config\n return {\n handler: async (req: PayloadRequest) => {\n const { docs = [] } = await req.payload.find({\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n pagination: false,\n })\n\n let isConfigAllowed = true // Users allowed to update prompts by default\n\n if (access?.settings) {\n try {\n isConfigAllowed = await access.settings({ req })\n } catch (e) {\n req.payload.logger.error(req, 'Please check your \"access.settings\" for request')\n }\n }\n\n const fieldMap: Record<string, { fieldType: any; id: any }> = {}\n docs.forEach((doc) => {\n fieldMap[doc['schema-path']] = {\n id: doc.id,\n fieldType: doc['field-type'],\n }\n })\n\n return Response.json({\n ...options,\n fields: fieldMap,\n isConfigAllowed,\n promptFields: promptFields.map(({getter: _getter, ...field}): SerializedPromptField => {\n return field\n }),\n })\n },\n method: 'get',\n path: PLUGIN_FETCH_FIELDS_ENDPOINT,\n }\n}\n"],"names":["PLUGIN_FETCH_FIELDS_ENDPOINT","PLUGIN_INSTRUCTIONS_TABLE","fetchFields","config","access","options","promptFields","handler","req","docs","payload","find","collection","pagination","isConfigAllowed","settings","e","logger","error","fieldMap","forEach","doc","id","fieldType","Response","json","fields","map","getter","_getter","field","method","path"],"mappings":"AAIA,SAASA,4BAA4B,EAAEC,yBAAyB,QAAQ,iBAAgB;AAExF,OAAO,MAAMC,cAAkD,CAC7DC;IAEA,MAAM,EAACC,MAAM,EAAEC,UAAU,CAAC,CAAC,EAAEC,eAAe,EAAE,EAAC,GAAGH;IAClD,OAAO;QACLI,SAAS,OAAOC;YACd,MAAM,EAAEC,OAAO,EAAE,EAAE,GAAG,MAAMD,IAAIE,OAAO,CAACC,IAAI,CAAC;gBAC3CC,YAAYX;gBACZY,YAAY;YACd;YAEA,IAAIC,kBAAkB,KAAK,6CAA6C;;YAExE,IAAIV,QAAQW,UAAU;gBACpB,IAAI;oBACFD,kBAAkB,MAAMV,OAAOW,QAAQ,CAAC;wBAAEP;oBAAI;gBAChD,EAAE,OAAOQ,GAAG;oBACVR,IAAIE,OAAO,CAACO,MAAM,CAACC,KAAK,CAACV,KAAK;gBAChC;YACF;YAEA,MAAMW,WAAwD,CAAC;YAC/DV,KAAKW,OAAO,CAAC,CAACC;gBACZF,QAAQ,CAACE,GAAG,CAAC,cAAc,CAAC,GAAG;oBAC7BC,IAAID,IAAIC,EAAE;oBACVC,WAAWF,GAAG,CAAC,aAAa;gBAC9B;YACF;YAEA,OAAOG,SAASC,IAAI,CAAC;gBACnB,GAAGpB,OAAO;gBACVqB,QAAQP;gBACRL;gBACAR,cAAcA,aAAaqB,GAAG,CAAC,CAAC,EAACC,QAAQC,OAAO,EAAE,GAAGC,OAAM;oBACzD,OAAOA;gBACT;YACF;QACF;QACAC,QAAQ;QACRC,MAAMhC;IACR;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/endpoints/fetchFields.ts"],"sourcesContent":["import type { Endpoint, PayloadRequest } from 'payload'\n\nimport type { PluginConfig, SerializedPromptField } from '../types.js'\n\nimport { PLUGIN_FETCH_FIELDS_ENDPOINT, PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\n\nexport const fetchFields: (config: PluginConfig) => Endpoint = (\n config\n) => {\n const {access, options = {}, promptFields = []} = config\n return {\n handler: async (req: PayloadRequest) => {\n const { docs = [] } = await req.payload.find({\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n pagination: false,\n })\n\n let isConfigAllowed = true // Users allowed to update prompts by default\n\n if (access?.settings) {\n try {\n isConfigAllowed = await access.settings({ req })\n } catch (e) {\n req.payload.logger.error(req, 'Please check your \"access.settings\" for request')\n }\n }\n\n const fieldMap: Record<string, { fieldType: any; id: any }> = {}\n docs.forEach((doc) => {\n fieldMap[doc['schema-path']] = {\n id: doc.id,\n fieldType: doc['field-type'],\n }\n })\n\n return Response.json({\n ...options,\n debugging: config.debugging,\n fields: fieldMap,\n isConfigAllowed,\n promptFields: promptFields.map(({getter: _getter, ...field}): SerializedPromptField => {\n return field\n }),\n })\n },\n method: 'get',\n path: PLUGIN_FETCH_FIELDS_ENDPOINT,\n }\n}\n"],"names":["PLUGIN_FETCH_FIELDS_ENDPOINT","PLUGIN_INSTRUCTIONS_TABLE","fetchFields","config","access","options","promptFields","handler","req","docs","payload","find","collection","pagination","isConfigAllowed","settings","e","logger","error","fieldMap","forEach","doc","id","fieldType","Response","json","debugging","fields","map","getter","_getter","field","method","path"],"mappings":"AAIA,SAASA,4BAA4B,EAAEC,yBAAyB,QAAQ,iBAAgB;AAExF,OAAO,MAAMC,cAAkD,CAC7DC;IAEA,MAAM,EAACC,MAAM,EAAEC,UAAU,CAAC,CAAC,EAAEC,eAAe,EAAE,EAAC,GAAGH;IAClD,OAAO;QACLI,SAAS,OAAOC;YACd,MAAM,EAAEC,OAAO,EAAE,EAAE,GAAG,MAAMD,IAAIE,OAAO,CAACC,IAAI,CAAC;gBAC3CC,YAAYX;gBACZY,YAAY;YACd;YAEA,IAAIC,kBAAkB,KAAK,6CAA6C;;YAExE,IAAIV,QAAQW,UAAU;gBACpB,IAAI;oBACFD,kBAAkB,MAAMV,OAAOW,QAAQ,CAAC;wBAAEP;oBAAI;gBAChD,EAAE,OAAOQ,GAAG;oBACVR,IAAIE,OAAO,CAACO,MAAM,CAACC,KAAK,CAACV,KAAK;gBAChC;YACF;YAEA,MAAMW,WAAwD,CAAC;YAC/DV,KAAKW,OAAO,CAAC,CAACC;gBACZF,QAAQ,CAACE,GAAG,CAAC,cAAc,CAAC,GAAG;oBAC7BC,IAAID,IAAIC,EAAE;oBACVC,WAAWF,GAAG,CAAC,aAAa;gBAC9B;YACF;YAEA,OAAOG,SAASC,IAAI,CAAC;gBACnB,GAAGpB,OAAO;gBACVqB,WAAWvB,OAAOuB,SAAS;gBAC3BC,QAAQR;gBACRL;gBACAR,cAAcA,aAAasB,GAAG,CAAC,CAAC,EAACC,QAAQC,OAAO,EAAE,GAAGC,OAAM;oBACzD,OAAOA;gBACT;YACF;QACF;QACAC,QAAQ;QACRC,MAAMjC;IACR;AACF,EAAC"}
@@ -55,12 +55,12 @@ const extendContextWithPromptFields = (data, ctx, pluginConfig)=>{
55
55
  return Object.getOwnPropertyDescriptor(target, prop);
56
56
  },
57
57
  has: (target, prop)=>{
58
- return fieldsMap.has(prop) || prop in target;
58
+ return fieldsMap.has(prop) || target && prop in target;
59
59
  },
60
60
  ownKeys: (target)=>{
61
61
  return [
62
62
  ...fieldsMap.keys(),
63
- ...Object.keys(target)
63
+ ...Object.keys(target || {})
64
64
  ];
65
65
  }
66
66
  });
@@ -262,9 +262,13 @@ export const endpoints = (pluginConfig)=>({
262
262
  ];
263
263
  const editImages = [];
264
264
  for (const img of images){
265
+ const serverURL = req.payload.config?.serverURL || process.env.SERVER_URL || process.env.NEXT_PUBLIC_SERVER_URL;
266
+ let url = img.image.thumbnailURL || img.image.url;
267
+ if (!url.startsWith('http')) {
268
+ url = `${serverURL}${url}`;
269
+ }
265
270
  try {
266
- const serverURL = req.payload.config?.serverURL || process.env.SERVER_URL || process.env.NEXT_PUBLIC_SERVER_URL;
267
- const response = await fetch(`${serverURL}${img.image.url}`, {
271
+ const response = await fetch(url, {
268
272
  headers: {
269
273
  //TODO: Further testing needed or so find a proper way.
270
274
  Authorization: `Bearer ${req.headers.get('Authorization')?.split('Bearer ')[1] || ''}`
@@ -277,10 +281,10 @@ export const endpoints = (pluginConfig)=>({
277
281
  type: img.image.type,
278
282
  data: blob,
279
283
  size: blob.size,
280
- url: `${serverURL}${img.image.url}`
284
+ url
281
285
  });
282
286
  } catch (e) {
283
- req.payload.logger.error(e, 'Error fetching reference images!');
287
+ req.payload.logger.error(e, `Error fetching reference image ${url}`);
284
288
  throw Error("We couldn't fetch the images. Please ensure the images are accessible and hosted publicly.");
285
289
  }
286
290
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/endpoints/index.ts"],"sourcesContent":["import type { CollectionSlug, PayloadRequest } from 'payload'\n\nimport * as process from 'node:process'\n\nimport type {\n ActionMenuItems,\n Endpoints,\n PluginConfig,\n PromptFieldGetterContext,\n} from '../types.js'\n\nimport { defaultPrompts } from '../ai/prompts.js'\nimport { filterEditorSchemaByNodes } from '../ai/utils/filterEditorSchemaByNodes.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 { asyncHandlebars } from '../libraries/handlebars/asyncHandlebars.js'\nimport { registerEditorHelper } from '../libraries/handlebars/helpers.js'\nimport { handlebarsHelpersMap } from '../libraries/handlebars/helpersMap.js'\nimport { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js'\nimport { extractImageData } from '../utilities/extractImageData.js'\nimport { getGenerationModels } from '../utilities/getGenerationModels.js'\n\nconst requireAuthentication = (req: PayloadRequest) => {\n if (!req.user) {\n throw new Error('Authentication required. Please log in to use AI features.')\n }\n return true\n}\n\nconst checkAccess = async (req: PayloadRequest, pluginConfig: PluginConfig) => {\n requireAuthentication(req)\n\n if (pluginConfig.access?.generate) {\n const hasAccess = await pluginConfig.access.generate({ req })\n if (!hasAccess) {\n throw new Error('Insufficient permissions to use AI generation features.')\n }\n }\n\n return true\n}\n\nconst extendContextWithPromptFields = (\n data: object,\n ctx: PromptFieldGetterContext,\n pluginConfig: PluginConfig,\n) => {\n const { promptFields = [] } = pluginConfig\n const fieldsMap = new Map(\n promptFields\n .filter((f) => !f.collections || f.collections.includes(ctx.collection))\n .map((f) => [f.name, f]),\n )\n return new Proxy(data, {\n get: (target, prop: string) => {\n const field = fieldsMap.get(prop as string)\n if (field?.getter) {\n const value = field.getter(data, ctx)\n return Promise.resolve(value).then((v) => new asyncHandlebars.SafeString(v))\n }\n // {{prop}} escapes content by default. Here we make sure it won't be escaped.\n const value = typeof target === \"object\" ? (target as any)[prop] : undefined\n return typeof value === 'string' ? new asyncHandlebars.SafeString(value) : value\n },\n // It's used by the handlebars library to determine if the property is enumerable\n getOwnPropertyDescriptor: (target, prop) => {\n const field = fieldsMap.get(prop as string)\n if (field) {\n return {\n configurable: true,\n enumerable: true,\n }\n }\n return Object.getOwnPropertyDescriptor(target, prop)\n },\n has: (target, prop) => {\n return fieldsMap.has(prop as string) || prop in target\n },\n ownKeys: (target) => {\n return [...fieldsMap.keys(), ...Object.keys(target)]\n },\n })\n}\n\nconst assignPrompt = async (\n action: ActionMenuItems,\n {\n type,\n actionParams,\n collection,\n context,\n field,\n layout,\n locale,\n pluginConfig,\n systemPrompt = '',\n template,\n }: {\n actionParams: Record<any, any>\n collection: CollectionSlug\n context: object\n field: string\n layout: string\n locale: string\n pluginConfig: PluginConfig\n systemPrompt: string\n template: string\n type: string\n },\n) => {\n const extendedContext = extendContextWithPromptFields(context, { type, collection }, pluginConfig)\n const prompt = await replacePlaceholders(template, extendedContext)\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 if (locale && locale !== 'en') {\n /**\n * NOTE: Avoid using the \"system prompt\" for setting the output language,\n * as it causes quotation marks to appear in the output (Currently only tested with openai models).\n * Appending the language instruction directly to the prompt resolves this issue.\n **/\n assignedPrompts.prompt += `\n --- \n OUTPUT LANGUAGE: ${locale}\n `\n }\n\n return assignedPrompts\n }\n\n const prompts = [...(pluginConfig.prompts || []), ...defaultPrompts]\n const foundPrompt = prompts.find((p) => p.name === action)\n const getLayout = foundPrompt?.layout\n const getSystemPrompt = foundPrompt?.system\n\n let updatedLayout = layout\n if (getLayout) {\n updatedLayout = getLayout()\n }\n\n const system = getSystemPrompt\n ? getSystemPrompt({\n ...(actionParams || {}),\n prompt,\n systemPrompt,\n })\n : ''\n\n return {\n layout: updatedLayout,\n // TODO: revisit this toLexicalHTML\n prompt: await replacePlaceholders(`{{${toLexicalHTML} ${field}}}`, extendedContext),\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 try {\n // Check authentication and authorization first\n await checkAccess(req, pluginConfig)\n\n const data = await req.json?.()\n\n const { allowedEditorNodes = [], 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, or try again`,\n )\n }\n\n // Verify user has access to the specific instruction\n const instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n req, // Pass req to ensure access control is applied\n })\n\n const { collections } = req.payload.config\n const collection = collections.find(\n (collection) => collection.slug === PLUGIN_INSTRUCTIONS_TABLE,\n )\n\n if (!collection) {\n throw new Error('Collection not found')\n }\n\n const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin\n const { schema: editorSchema = {} } = editorConfig\n const { prompt: promptTemplate = '' } = instructions\n\n let allowedEditorSchema = editorSchema\n if (allowedEditorNodes.length) {\n allowedEditorSchema = filterEditorSchemaByNodes(editorSchema, allowedEditorNodes)\n }\n\n const schemaPath = instructions['schema-path'] as string\n const [collectionName, fieldName] = schemaPath?.split('.') || []\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 let localeInfo = locale\n if (\n localeData &&\n defaultLocale &&\n localeData.label &&\n typeof localeData.label === 'object' &&\n defaultLocale in localeData.label\n ) {\n localeInfo = localeData.label[defaultLocale]\n }\n\n const models = getGenerationModels(pluginConfig)\n const model =\n models && Array.isArray(models)\n ? models.find((model) => model.id === instructions['model-id'])\n : undefined\n\n if (!model) {\n throw new Error('Model not found')\n }\n\n // @ts-ignore\n const settingsName = model && model.settings ? model.settings.name : undefined\n if (!settingsName) {\n req.payload.logger.error('— AI Plugin: Error fetching settings name!')\n }\n\n const modelOptions = settingsName ? instructions[settingsName] || {} : {}\n\n const prompts = await assignPrompt(action, {\n type: String(instructions['field-type']),\n actionParams,\n collection: collectionName,\n context: contextData,\n field: fieldName || '',\n layout: instructions.layout,\n locale: localeInfo,\n pluginConfig,\n systemPrompt: instructions.system,\n template: String(promptTemplate),\n })\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n { prompts },\n `— AI Plugin: Executing text prompt on ${schemaPath} using ${model.id}`,\n )\n }\n\n return model.handler?.(prompts.prompt, {\n ...modelOptions,\n editorSchema: allowedEditorSchema,\n layout: prompts.layout,\n locale: localeInfo,\n system: prompts.system,\n })\n } catch (error) {\n req.payload.logger.error(error, 'Error generating content: ')\n const message =\n error && typeof error === 'object' && 'message' in error\n ? (error as any).message\n : String(error)\n return new Response(JSON.stringify({ error: message }), {\n headers: { 'Content-Type': 'application/json' },\n status:\n message.includes('Authentication required') ||\n message.includes('Insufficient permissions')\n ? 401\n : 500,\n })\n }\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE,\n },\n upload: {\n handler: async (req: PayloadRequest) => {\n try {\n // Check authentication and authorization first\n await checkAccess(req, pluginConfig)\n\n const data = await req.json?.()\n\n const { collectionSlug, documentId, options } = data\n const { instructionId } = options\n let docData = {}\n\n if (documentId) {\n try {\n docData = await req.payload.findByID({\n id: documentId,\n collection: collectionSlug,\n draft: true,\n req, // Pass req to ensure access control is applied\n })\n } catch (e) {\n req.payload.logger.error(\n e,\n '— AI Plugin: Error fetching document, you should try again after enabling drafts for this collection',\n )\n }\n }\n\n const contextData = {\n ...data.doc,\n ...docData,\n }\n\n let instructions: Record<string, any> = { images: [], 'model-id': '', prompt: '' }\n\n if (instructionId) {\n // Verify user has access to the specific instruction\n instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n req, // Pass req to ensure access control is applied\n })\n }\n\n const { images: sampleImages = [], prompt: promptTemplate = '' } = instructions\n const schemaPath = instructions['schema-path']\n\n registerEditorHelper(req.payload, schemaPath)\n\n const extendedContext = extendContextWithPromptFields(\n contextData,\n { type: instructions['field-type'], collection: collectionSlug },\n pluginConfig,\n )\n const text = await replacePlaceholders(promptTemplate, extendedContext)\n const modelId = instructions['model-id']\n const uploadCollectionSlug = instructions['relation-to']\n\n const images = [...extractImageData(text), ...sampleImages]\n\n const editImages = []\n for (const img of images) {\n try {\n const serverURL =\n req.payload.config?.serverURL ||\n process.env.SERVER_URL ||\n process.env.NEXT_PUBLIC_SERVER_URL\n\n const response = await fetch(`${serverURL}${img.image.url}`, {\n headers: {\n //TODO: Further testing needed or so find a proper way.\n Authorization: `Bearer ${req.headers.get('Authorization')?.split('Bearer ')[1] || ''}`,\n },\n method: 'GET',\n })\n\n const blob = await response.blob()\n editImages.push({\n name: img.image.name,\n type: img.image.type,\n data: blob,\n size: blob.size,\n url: `${serverURL}${img.image.url}`,\n })\n } catch (e) {\n req.payload.logger.error(e, 'Error fetching reference images!')\n throw Error(\n \"We couldn't fetch the images. Please ensure the images are accessible and hosted publicly.\",\n )\n }\n }\n\n const modelsUpload = getGenerationModels(pluginConfig)\n const model =\n modelsUpload && Array.isArray(modelsUpload)\n ? modelsUpload.find((model) => model.id === modelId)\n : undefined\n\n if (!model) {\n throw new Error('Model not found')\n }\n\n // @ts-ignore\n const settingsName = model && model.settings ? model.settings.name : undefined\n if (!settingsName) {\n req.payload.logger.error('— AI Plugin: Error fetching settings name!')\n }\n\n let modelOptions = settingsName ? instructions[settingsName] || {} : {}\n modelOptions = {\n ...modelOptions,\n images: editImages,\n }\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n { text },\n `— AI Plugin: Executing image prompt using ${model.id}`,\n )\n }\n\n const result = await model.handler?.(text, modelOptions)\n let assetData: { alt?: string; id: number | string }\n\n if (typeof pluginConfig.mediaUpload === 'function') {\n assetData = await pluginConfig.mediaUpload(result, {\n collection: uploadCollectionSlug,\n request: req,\n })\n } else {\n assetData = await req.payload.create({\n collection: uploadCollectionSlug,\n data: result.data,\n file: result.file,\n req, // Pass req to ensure access control is applied\n })\n }\n\n if (!assetData.id) {\n req.payload.logger.error(\n 'Error uploading generated media, is your media upload function correct?',\n )\n throw new Error('Error uploading generated media!')\n }\n\n return new Response(\n JSON.stringify({\n result: {\n id: assetData.id,\n alt: assetData.alt,\n },\n }),\n )\n } catch (error) {\n req.payload.logger.error(error, 'Error generating upload: ')\n const message =\n error && typeof error === 'object' && 'message' in error\n ? (error as any).message\n : String(error)\n return new Response(JSON.stringify({ error: message }), {\n headers: { 'Content-Type': 'application/json' },\n status:\n message.includes('Authentication required') ||\n message.includes('Insufficient permissions')\n ? 401\n : 500,\n })\n }\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n },\n }) satisfies Endpoints\n"],"names":["process","defaultPrompts","filterEditorSchemaByNodes","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","asyncHandlebars","registerEditorHelper","handlebarsHelpersMap","replacePlaceholders","extractImageData","getGenerationModels","requireAuthentication","req","user","Error","checkAccess","pluginConfig","access","generate","hasAccess","extendContextWithPromptFields","data","ctx","promptFields","fieldsMap","Map","filter","f","collections","includes","collection","map","name","Proxy","get","target","prop","field","getter","value","Promise","resolve","then","v","SafeString","undefined","getOwnPropertyDescriptor","configurable","enumerable","Object","has","ownKeys","keys","assignPrompt","action","type","actionParams","context","layout","locale","systemPrompt","template","extendedContext","prompt","toLexicalHTML","toHTML","assignedPrompts","system","prompts","foundPrompt","find","p","getLayout","getSystemPrompt","updatedLayout","endpoints","textarea","handler","json","allowedEditorNodes","options","instructionId","contextData","doc","instructions","payload","findByID","id","config","slug","custom","editorConfig","admin","schema","editorSchema","promptTemplate","allowedEditorSchema","length","schemaPath","collectionName","fieldName","split","defaultLocale","locales","localization","localeData","l","code","localeInfo","label","models","model","Array","isArray","settingsName","settings","logger","error","modelOptions","String","debugging","info","message","Response","JSON","stringify","headers","status","method","path","upload","collectionSlug","documentId","docData","draft","e","images","sampleImages","text","modelId","uploadCollectionSlug","editImages","img","serverURL","env","SERVER_URL","NEXT_PUBLIC_SERVER_URL","response","fetch","image","url","Authorization","blob","push","size","modelsUpload","result","assetData","mediaUpload","request","create","file","alt"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/endpoints/index.ts"],"sourcesContent":["import type { CollectionSlug, PayloadRequest } from 'payload'\n\nimport * as process from 'node:process'\n\nimport type {\n ActionMenuItems,\n Endpoints,\n PluginConfig,\n PromptFieldGetterContext,\n} from '../types.js'\n\nimport { defaultPrompts } from '../ai/prompts.js'\nimport { filterEditorSchemaByNodes } from '../ai/utils/filterEditorSchemaByNodes.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 { asyncHandlebars } from '../libraries/handlebars/asyncHandlebars.js'\nimport { registerEditorHelper } from '../libraries/handlebars/helpers.js'\nimport { handlebarsHelpersMap } from '../libraries/handlebars/helpersMap.js'\nimport { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js'\nimport { extractImageData } from '../utilities/extractImageData.js'\nimport { getGenerationModels } from '../utilities/getGenerationModels.js'\n\nconst requireAuthentication = (req: PayloadRequest) => {\n if (!req.user) {\n throw new Error('Authentication required. Please log in to use AI features.')\n }\n return true\n}\n\nconst checkAccess = async (req: PayloadRequest, pluginConfig: PluginConfig) => {\n requireAuthentication(req)\n\n if (pluginConfig.access?.generate) {\n const hasAccess = await pluginConfig.access.generate({ req })\n if (!hasAccess) {\n throw new Error('Insufficient permissions to use AI generation features.')\n }\n }\n\n return true\n}\n\nconst extendContextWithPromptFields = (\n data: object,\n ctx: PromptFieldGetterContext,\n pluginConfig: PluginConfig,\n) => {\n const { promptFields = [] } = pluginConfig\n const fieldsMap = new Map(\n promptFields\n .filter((f) => !f.collections || f.collections.includes(ctx.collection))\n .map((f) => [f.name, f]),\n )\n return new Proxy(data, {\n get: (target, prop: string) => {\n const field = fieldsMap.get(prop as string)\n if (field?.getter) {\n const value = field.getter(data, ctx)\n return Promise.resolve(value).then((v) => new asyncHandlebars.SafeString(v))\n }\n // {{prop}} escapes content by default. Here we make sure it won't be escaped.\n const value = typeof target === \"object\" ? (target as any)[prop] : undefined\n return typeof value === 'string' ? new asyncHandlebars.SafeString(value) : value\n },\n // It's used by the handlebars library to determine if the property is enumerable\n getOwnPropertyDescriptor: (target, prop) => {\n const field = fieldsMap.get(prop as string)\n if (field) {\n return {\n configurable: true,\n enumerable: true,\n }\n }\n return Object.getOwnPropertyDescriptor(target, prop)\n },\n has: (target, prop) => {\n return fieldsMap.has(prop as string) || (target && prop in target)\n },\n ownKeys: (target) => {\n return [...fieldsMap.keys(), ...Object.keys(target || {})]\n },\n })\n}\n\nconst assignPrompt = async (\n action: ActionMenuItems,\n {\n type,\n actionParams,\n collection,\n context,\n field,\n layout,\n locale,\n pluginConfig,\n systemPrompt = '',\n template,\n }: {\n actionParams: Record<any, any>\n collection: CollectionSlug\n context: object\n field: string\n layout: string\n locale: string\n pluginConfig: PluginConfig\n systemPrompt: string\n template: string\n type: string\n },\n) => {\n const extendedContext = extendContextWithPromptFields(context, { type, collection }, pluginConfig)\n const prompt = await replacePlaceholders(template, extendedContext)\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 if (locale && locale !== 'en') {\n /**\n * NOTE: Avoid using the \"system prompt\" for setting the output language,\n * as it causes quotation marks to appear in the output (Currently only tested with openai models).\n * Appending the language instruction directly to the prompt resolves this issue.\n **/\n assignedPrompts.prompt += `\n --- \n OUTPUT LANGUAGE: ${locale}\n `\n }\n\n return assignedPrompts\n }\n\n const prompts = [...(pluginConfig.prompts || []), ...defaultPrompts]\n const foundPrompt = prompts.find((p) => p.name === action)\n const getLayout = foundPrompt?.layout\n const getSystemPrompt = foundPrompt?.system\n\n let updatedLayout = layout\n if (getLayout) {\n updatedLayout = getLayout()\n }\n\n const system = getSystemPrompt\n ? getSystemPrompt({\n ...(actionParams || {}),\n prompt,\n systemPrompt,\n })\n : ''\n\n return {\n layout: updatedLayout,\n // TODO: revisit this toLexicalHTML\n prompt: await replacePlaceholders(`{{${toLexicalHTML} ${field}}}`, extendedContext),\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 try {\n // Check authentication and authorization first\n await checkAccess(req, pluginConfig)\n\n const data = await req.json?.()\n\n const { allowedEditorNodes = [], 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, or try again`,\n )\n }\n\n // Verify user has access to the specific instruction\n const instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n req, // Pass req to ensure access control is applied\n })\n\n const { collections } = req.payload.config\n const collection = collections.find(\n (collection) => collection.slug === PLUGIN_INSTRUCTIONS_TABLE,\n )\n\n if (!collection) {\n throw new Error('Collection not found')\n }\n\n const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin\n const { schema: editorSchema = {} } = editorConfig\n const { prompt: promptTemplate = '' } = instructions\n\n let allowedEditorSchema = editorSchema\n if (allowedEditorNodes.length) {\n allowedEditorSchema = filterEditorSchemaByNodes(editorSchema, allowedEditorNodes)\n }\n\n const schemaPath = instructions['schema-path'] as string\n const [collectionName, fieldName] = schemaPath?.split('.') || []\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 let localeInfo = locale\n if (\n localeData &&\n defaultLocale &&\n localeData.label &&\n typeof localeData.label === 'object' &&\n defaultLocale in localeData.label\n ) {\n localeInfo = localeData.label[defaultLocale]\n }\n\n const models = getGenerationModels(pluginConfig)\n const model =\n models && Array.isArray(models)\n ? models.find((model) => model.id === instructions['model-id'])\n : undefined\n\n if (!model) {\n throw new Error('Model not found')\n }\n\n // @ts-ignore\n const settingsName = model && model.settings ? model.settings.name : undefined\n if (!settingsName) {\n req.payload.logger.error('— AI Plugin: Error fetching settings name!')\n }\n\n const modelOptions = settingsName ? instructions[settingsName] || {} : {}\n\n const prompts = await assignPrompt(action, {\n type: String(instructions['field-type']),\n actionParams,\n collection: collectionName,\n context: contextData,\n field: fieldName || '',\n layout: instructions.layout,\n locale: localeInfo,\n pluginConfig,\n systemPrompt: instructions.system,\n template: String(promptTemplate),\n })\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n { prompts },\n `— AI Plugin: Executing text prompt on ${schemaPath} using ${model.id}`,\n )\n }\n\n return model.handler?.(prompts.prompt, {\n ...modelOptions,\n editorSchema: allowedEditorSchema,\n layout: prompts.layout,\n locale: localeInfo,\n system: prompts.system,\n })\n } catch (error) {\n req.payload.logger.error(error, 'Error generating content: ')\n const message =\n error && typeof error === 'object' && 'message' in error\n ? (error as any).message\n : String(error)\n return new Response(JSON.stringify({ error: message }), {\n headers: { 'Content-Type': 'application/json' },\n status:\n message.includes('Authentication required') ||\n message.includes('Insufficient permissions')\n ? 401\n : 500,\n })\n }\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE,\n },\n upload: {\n handler: async (req: PayloadRequest) => {\n try {\n // Check authentication and authorization first\n await checkAccess(req, pluginConfig)\n\n const data = await req.json?.()\n\n const { collectionSlug, documentId, options } = data\n const { instructionId } = options\n let docData = {}\n\n if (documentId) {\n try {\n docData = await req.payload.findByID({\n id: documentId,\n collection: collectionSlug,\n draft: true,\n req, // Pass req to ensure access control is applied\n })\n } catch (e) {\n req.payload.logger.error(\n e,\n '— AI Plugin: Error fetching document, you should try again after enabling drafts for this collection',\n )\n }\n }\n\n const contextData = {\n ...data.doc,\n ...docData,\n }\n\n let instructions: Record<string, any> = { images: [], 'model-id': '', prompt: '' }\n\n if (instructionId) {\n // Verify user has access to the specific instruction\n instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n req, // Pass req to ensure access control is applied\n })\n }\n\n const { images: sampleImages = [], prompt: promptTemplate = '' } = instructions\n const schemaPath = instructions['schema-path']\n\n registerEditorHelper(req.payload, schemaPath)\n\n const extendedContext = extendContextWithPromptFields(\n contextData,\n { type: instructions['field-type'], collection: collectionSlug },\n pluginConfig,\n )\n const text = await replacePlaceholders(promptTemplate, extendedContext)\n const modelId = instructions['model-id']\n const uploadCollectionSlug = instructions['relation-to']\n\n const images = [...extractImageData(text), ...sampleImages]\n\n const editImages = []\n for (const img of images) {\n const serverURL =\n req.payload.config?.serverURL ||\n process.env.SERVER_URL ||\n process.env.NEXT_PUBLIC_SERVER_URL\n\n let url = img.image.thumbnailURL || img.image.url\n if (!url.startsWith('http')) {\n url = `${serverURL}${url}`\n }\n\n try {\n\n const response = await fetch(url, {\n headers: {\n //TODO: Further testing needed or so find a proper way.\n Authorization: `Bearer ${req.headers.get('Authorization')?.split('Bearer ')[1] || ''}`,\n },\n method: 'GET',\n })\n\n const blob = await response.blob()\n editImages.push({\n name: img.image.name,\n type: img.image.type,\n data: blob,\n size: blob.size,\n url,\n })\n } catch (e) {\n req.payload.logger.error(e, `Error fetching reference image ${url}`)\n throw Error(\n \"We couldn't fetch the images. Please ensure the images are accessible and hosted publicly.\",\n )\n }\n }\n\n const modelsUpload = getGenerationModels(pluginConfig)\n const model =\n modelsUpload && Array.isArray(modelsUpload)\n ? modelsUpload.find((model) => model.id === modelId)\n : undefined\n\n if (!model) {\n throw new Error('Model not found')\n }\n\n // @ts-ignore\n const settingsName = model && model.settings ? model.settings.name : undefined\n if (!settingsName) {\n req.payload.logger.error('— AI Plugin: Error fetching settings name!')\n }\n\n let modelOptions = settingsName ? instructions[settingsName] || {} : {}\n modelOptions = {\n ...modelOptions,\n images: editImages,\n }\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n { text },\n `— AI Plugin: Executing image prompt using ${model.id}`,\n )\n }\n\n const result = await model.handler?.(text, modelOptions)\n let assetData: { alt?: string; id: number | string }\n\n if (typeof pluginConfig.mediaUpload === 'function') {\n assetData = await pluginConfig.mediaUpload(result, {\n collection: uploadCollectionSlug,\n request: req,\n })\n } else {\n assetData = await req.payload.create({\n collection: uploadCollectionSlug,\n data: result.data,\n file: result.file,\n req, // Pass req to ensure access control is applied\n })\n }\n\n if (!assetData.id) {\n req.payload.logger.error(\n 'Error uploading generated media, is your media upload function correct?',\n )\n throw new Error('Error uploading generated media!')\n }\n\n return new Response(\n JSON.stringify({\n result: {\n id: assetData.id,\n alt: assetData.alt,\n },\n }),\n )\n } catch (error) {\n req.payload.logger.error(error, 'Error generating upload: ')\n const message =\n error && typeof error === 'object' && 'message' in error\n ? (error as any).message\n : String(error)\n return new Response(JSON.stringify({ error: message }), {\n headers: { 'Content-Type': 'application/json' },\n status:\n message.includes('Authentication required') ||\n message.includes('Insufficient permissions')\n ? 401\n : 500,\n })\n }\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n },\n }) satisfies Endpoints\n"],"names":["process","defaultPrompts","filterEditorSchemaByNodes","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","asyncHandlebars","registerEditorHelper","handlebarsHelpersMap","replacePlaceholders","extractImageData","getGenerationModels","requireAuthentication","req","user","Error","checkAccess","pluginConfig","access","generate","hasAccess","extendContextWithPromptFields","data","ctx","promptFields","fieldsMap","Map","filter","f","collections","includes","collection","map","name","Proxy","get","target","prop","field","getter","value","Promise","resolve","then","v","SafeString","undefined","getOwnPropertyDescriptor","configurable","enumerable","Object","has","ownKeys","keys","assignPrompt","action","type","actionParams","context","layout","locale","systemPrompt","template","extendedContext","prompt","toLexicalHTML","toHTML","assignedPrompts","system","prompts","foundPrompt","find","p","getLayout","getSystemPrompt","updatedLayout","endpoints","textarea","handler","json","allowedEditorNodes","options","instructionId","contextData","doc","instructions","payload","findByID","id","config","slug","custom","editorConfig","admin","schema","editorSchema","promptTemplate","allowedEditorSchema","length","schemaPath","collectionName","fieldName","split","defaultLocale","locales","localization","localeData","l","code","localeInfo","label","models","model","Array","isArray","settingsName","settings","logger","error","modelOptions","String","debugging","info","message","Response","JSON","stringify","headers","status","method","path","upload","collectionSlug","documentId","docData","draft","e","images","sampleImages","text","modelId","uploadCollectionSlug","editImages","img","serverURL","env","SERVER_URL","NEXT_PUBLIC_SERVER_URL","url","image","thumbnailURL","startsWith","response","fetch","Authorization","blob","push","size","modelsUpload","result","assetData","mediaUpload","request","create","file","alt"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
1
  export type { payloadAiPlugin } from '../index.ts';
2
- export type { GenerationConfig, GenerationModel, PluginConfig } from '../types.ts';
2
+ export type { ActionMenuItems, ActionPrompt, ActionPromptOptions, GenerationConfig, GenerationModel, PluginConfig, PluginConfigAccess, PluginConfigMediaUploadFunction, PluginOptions, PromptField, PromptFieldGetterContext, SeedPromptData, SeedPromptFunction, SeedPromptOptions, SeedPromptResult, } from '../types.ts';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/types.ts"],"sourcesContent":["export type { payloadAiPlugin } from '../index.ts'\nexport type { GenerationConfig, GenerationModel, PluginConfig } from '../types.ts'\n"],"names":[],"mappings":"AACA,WAAkF"}
1
+ {"version":3,"sources":["../../src/exports/types.ts"],"sourcesContent":["export type { payloadAiPlugin } from '../index.ts'\nexport type { \n ActionMenuItems,\n ActionPrompt,\n ActionPromptOptions,\n GenerationConfig, \n GenerationModel,\n PluginConfig, \n PluginConfigAccess,\n PluginConfigMediaUploadFunction,\n PluginOptions,\n PromptField,\n PromptFieldGetterContext,\n SeedPromptData,\n SeedPromptFunction,\n SeedPromptOptions,\n SeedPromptResult,\n} from '../types.ts'"],"names":[],"mappings":"AACA,WAgBoB"}