@ai-stack/payloadcms 3.68.0-beta.3 → 3.68.0-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/core/streamObject.js +3 -0
- package/dist/ai/core/streamObject.js.map +1 -1
- package/dist/ai/core/types.d.ts +3 -0
- package/dist/ai/core/types.js.map +1 -1
- package/dist/ai/prompts.d.ts +1 -2
- package/dist/ai/prompts.js +0 -110
- package/dist/ai/prompts.js.map +1 -1
- package/dist/ai/providers/registry.js +0 -1
- package/dist/ai/providers/registry.js.map +1 -1
- package/dist/ai/utils/filterEditorSchemaByNodes.d.ts +9 -0
- package/dist/ai/utils/filterEditorSchemaByNodes.js +30 -3
- package/dist/ai/utils/filterEditorSchemaByNodes.js.map +1 -1
- package/dist/ai/utils/nodeToSchemaMap.d.ts +22 -0
- package/dist/ai/utils/nodeToSchemaMap.js +72 -0
- package/dist/ai/utils/nodeToSchemaMap.js.map +1 -0
- package/dist/collections/AIJobs.js +1 -1
- package/dist/collections/AIJobs.js.map +1 -1
- package/dist/collections/AISettings.js +3 -3
- package/dist/collections/AISettings.js.map +1 -1
- package/dist/endpoints/fetchVoices.js +41 -24
- package/dist/endpoints/fetchVoices.js.map +1 -1
- package/dist/endpoints/index.js +108 -6
- package/dist/endpoints/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/payload-ai.d.ts +7 -4
- package/dist/plugin.js +1 -1
- package/dist/plugin.js.map +1 -1
- package/dist/types.d.ts +34 -2
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/dist/ui/Compose/Compose.js +23 -6
- package/dist/ui/Compose/Compose.js.map +1 -1
- package/dist/ui/Compose/Compose.jsx +23 -4
- package/dist/ui/Compose/hooks/useGenerate.js +21 -72
- package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
- package/dist/ui/Compose/hooks/useGenerateUpload.d.ts +3 -3
- package/dist/ui/Compose/hooks/useGenerateUpload.js +37 -10
- package/dist/ui/Compose/hooks/useGenerateUpload.js.map +1 -1
- package/dist/ui/Compose/hooks/useStreamingUpdate.js.map +1 -1
- package/dist/ui/VoicesFetcher/index.js +33 -61
- package/dist/ui/VoicesFetcher/index.js.map +1 -1
- package/dist/ui/VoicesFetcher/index.jsx +31 -37
- package/dist/utilities/buildSmartPrompt.js +4 -6
- package/dist/utilities/buildSmartPrompt.js.map +1 -1
- package/dist/utilities/encryption.js +2 -1
- package/dist/utilities/encryption.js.map +1 -1
- package/dist/utilities/seedProperties.js +7 -24
- package/dist/utilities/seedProperties.js.map +1 -1
- package/dist/utilities/setSafeLexicalState.js +1 -2
- package/dist/utilities/setSafeLexicalState.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/collections/AISettings.ts"],"sourcesContent":["import type { GlobalConfig } from 'payload'\n\nimport { allProviderBlocks } from '../ai/providers/blocks/index.js'\n\nexport const aiSettingsGlobal: GlobalConfig = {\n slug: 'ai-settings',\n access: {\n read: ({ req }) => !!req.user,\n update: ({ req }) => !!req.user,\n },\n // admin: {\n // description: 'Configure AI providers, models, and default settings',\n // },\n fields: [\n {\n name: 'providers',\n type: 'blocks',\n admin: {\n description: 'Configure which AI providers to use and their settings',\n initCollapsed: true,\n },\n blocks: allProviderBlocks,\n label: 'AI Providers',\n required: true,\n },\n {\n name: 'enabledCollections',\n type: 'json',\n admin: {\n hidden: true,\n },\n },\n {\n name: 'defaults',\n type: 'group',\n admin: {\n description: 'Please provide default provider/model behavior for each use case',\n },\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n fields: [\n {\n name: 'text',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'options',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Default options for this model (global)',\n },\n label: 'Global Model Options',\n },\n ],\n label: '',\n },\n ],\n label: 'Text Generation',\n },\n {\n fields: [\n {\n name: 'image',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'options',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Default options for this model (global)',\n },\n label: 'Global Model Options',\n },\n ],\n label: '',\n },\n ],\n label: 'Image Generation',\n },\n {\n fields: [\n {\n name: 'tts',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'voice',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicVoiceSelect',\n },\n },\n label: 'Default Voice',\n },\n {\n name: 'options',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Default options for this model (global)',\n },\n label: 'Global Model Options',\n },\n ],\n label: '',\n },\n ],\n label: 'Speech Generation',\n },\n {\n admin: {\n disabled: true,\n },\n fields: [\n {\n name: 'video',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'options',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Default options for this model (global)',\n },\n label: 'Global Model Options',\n },\n ],\n label: '',\n },\n ],\n label: 'Video Generation',\n },\n ],\n },\n ],\n label: 'Default Models',\n },\n ],\n hooks: {\n afterChange: [\n async ({ doc, req }) => {\n if (doc.enabledCollections && doc.enabledCollections.length > 0) {\n const { seedProperties } = await import('../utilities/seedProperties.js')\n await seedProperties({\n enabledCollections: doc.enabledCollections,\n req,\n })\n }\n return doc\n },\n ],\n afterRead: [\n async ({ context, doc, req }) => {\n if (!req.payload.secret) {\n return doc\n }\n\n const { decrypt } = await import('../utilities/encryption.js')\n\n if (doc.providers) {\n doc.providers = doc.providers.map((provider: any) => {\n if (provider.apiKey) {\n if (context.unsafe) {\n // Internal use: decrypt\n provider.apiKey = decrypt(provider.apiKey, req.payload.secret)\n } else {\n // Admin UI: mask\n // We can't easily check if it's valid without decrypting, but for UI we just show mask\n // If we want to show \"present\", we can return a mask\n provider.apiKey = 'sk-****' + provider.apiKey.slice(-4)\n }\n }\n return provider\n })\n }\n return doc\n },\n ],\n beforeChange: [\n async ({ data, originalDoc, req }) => {\n if (!req.payload.secret) {\n return data\n }\n\n const { encrypt } = await import('../utilities/encryption.js')\n\n // Iterate over providers and encrypt API keys\n if (data.providers) {\n data.providers = data.providers.map((provider: any) => {\n if (provider.apiKey) {\n const originalProvider = originalDoc?.providers?.find(\n (p: any) => p.id === provider.id,\n )\n\n // If the key strictly equals the existing one (e.g. partial update merge), do nothing.\n // This prevents re-encrypting an already encrypted key.\n if (originalProvider?.apiKey && provider.apiKey === originalProvider.apiKey) {\n return provider\n }\n\n // If it looks like a masked key, don't re-encrypt (it means it wasn't changed via UI)\n if (provider.apiKey.startsWith('sk-') && provider.apiKey.includes('****')) {\n // Restore the original encrypted key from originalDoc\n if (originalProvider?.apiKey) {\n provider.apiKey = originalProvider.apiKey\n }\n } else {\n // Encrypt new key\n provider.apiKey = encrypt(provider.apiKey, req.payload.secret)\n }\n }\n return provider\n })\n }\n return data\n },\n ],\n },\n label: 'AI Configuration',\n}\n"],"names":["allProviderBlocks","aiSettingsGlobal","slug","access","read","req","user","update","fields","name","type","admin","description","initCollapsed","blocks","label","required","hidden","tabs","components","Field","disabled","hooks","afterChange","doc","enabledCollections","length","seedProperties","afterRead","context","payload","secret","decrypt","providers","map","provider","apiKey","unsafe","slice","beforeChange","data","originalDoc","encrypt","originalProvider","find","p","id","startsWith","includes"],"mappings":"AAEA,SAASA,iBAAiB,QAAQ,kCAAiC;AAEnE,OAAO,MAAMC,mBAAiC;IAC5CC,MAAM;IACNC,QAAQ;QACNC,MAAM,CAAC,EAAEC,GAAG,EAAE,GAAK,CAAC,CAACA,IAAIC,IAAI;QAC7BC,QAAQ,CAAC,EAAEF,GAAG,EAAE,GAAK,CAAC,CAACA,IAAIC,IAAI;IACjC;IACA,WAAW;IACX,yEAAyE;IACzE,KAAK;IACLE,QAAQ;QACN;YACEC,MAAM;YACNC,MAAM;YACNC,OAAO;gBACLC,aAAa;gBACbC,eAAe;YACjB;YACAC,QAAQd;YACRe,OAAO;YACPC,UAAU;QACZ;QACA;YACEP,MAAM;YACNC,MAAM;YACNC,OAAO;gBACLM,QAAQ;YACV;QACF;QACA;YACER,MAAM;YACNC,MAAM;YACNC,OAAO;gBACLC,aAAa;YACf;YACAJ,QAAQ;gBACN;oBACEE,MAAM;oBACNQ,MAAM;wBACJ;4BACEV,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLQ,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEN,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLQ,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEN,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLQ,YAAY;oDACVC,OAAO;gDACT;gDACAR,aAAa;4CACf;4CACAG,OAAO;wCACT;qCACD;oCACDA,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;wBACA;4BACEP,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLQ,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEN,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLQ,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEN,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLQ,YAAY;oDACVC,OAAO;gDACT;gDACAR,aAAa;4CACf;4CACAG,OAAO;wCACT;qCACD;oCACDA,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;wBACA;4BACEP,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLQ,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEN,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLQ,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEN,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLQ,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEN,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLQ,YAAY;oDACVC,OAAO;gDACT;gDACAR,aAAa;4CACf;4CACAG,OAAO;wCACT;qCACD;oCACDA,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;wBACA;4BACEJ,OAAO;gCACLU,UAAU;4BACZ;4BACAb,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLQ,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEN,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLQ,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEN,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLQ,YAAY;oDACVC,OAAO;gDACT;gDACAR,aAAa;4CACf;4CACAG,OAAO;wCACT;qCACD;oCACDA,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;qBACD;gBACH;aACD;YACDA,OAAO;QACT;KACD;IACDO,OAAO;QACLC,aAAa;YACX,OAAO,EAAEC,GAAG,EAAEnB,GAAG,EAAE;gBACjB,IAAImB,IAAIC,kBAAkB,IAAID,IAAIC,kBAAkB,CAACC,MAAM,GAAG,GAAG;oBAC/D,MAAM,EAAEC,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC;oBACxC,MAAMA,eAAe;wBACnBF,oBAAoBD,IAAIC,kBAAkB;wBAC1CpB;oBACF;gBACF;gBACA,OAAOmB;YACT;SACD;QACDI,WAAW;YACT,OAAO,EAAEC,OAAO,EAAEL,GAAG,EAAEnB,GAAG,EAAE;gBAC1B,IAAI,CAACA,IAAIyB,OAAO,CAACC,MAAM,EAAE;oBACvB,OAAOP;gBACT;gBAEA,MAAM,EAAEQ,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC;gBAEjC,IAAIR,IAAIS,SAAS,EAAE;oBACjBT,IAAIS,SAAS,GAAGT,IAAIS,SAAS,CAACC,GAAG,CAAC,CAACC;wBACjC,IAAIA,SAASC,MAAM,EAAE;4BACnB,IAAIP,QAAQQ,MAAM,EAAE;gCAClB,wBAAwB;gCACxBF,SAASC,MAAM,GAAGJ,QAAQG,SAASC,MAAM,EAAE/B,IAAIyB,OAAO,CAACC,MAAM;4BAC/D,OAAO;gCACL,iBAAiB;gCACjB,uFAAuF;gCACvF,qDAAqD;gCACrDI,SAASC,MAAM,GAAG,YAAYD,SAASC,MAAM,CAACE,KAAK,CAAC,CAAC;4BACvD;wBACF;wBACA,OAAOH;oBACT;gBACF;gBACA,OAAOX;YACT;SACD;QACDe,cAAc;YACZ,OAAO,EAAEC,IAAI,EAAEC,WAAW,EAAEpC,GAAG,EAAE;gBAC/B,IAAI,CAACA,IAAIyB,OAAO,CAACC,MAAM,EAAE;oBACvB,OAAOS;gBACT;gBAEA,MAAM,EAAEE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC;gBAEjC,8CAA8C;gBAC9C,IAAIF,KAAKP,SAAS,EAAE;oBAClBO,KAAKP,SAAS,GAAGO,KAAKP,SAAS,CAACC,GAAG,CAAC,CAACC;wBACnC,IAAIA,SAASC,MAAM,EAAE;4BACnB,MAAMO,mBAAmBF,aAAaR,WAAWW,KAC/C,CAACC,IAAWA,EAAEC,EAAE,KAAKX,SAASW,EAAE;4BAGlC,uFAAuF;4BACvF,wDAAwD;4BACxD,IAAIH,kBAAkBP,UAAUD,SAASC,MAAM,KAAKO,iBAAiBP,MAAM,EAAE;gCAC3E,OAAOD;4BACT;4BAEA,sFAAsF;4BACtF,IAAIA,SAASC,MAAM,CAACW,UAAU,CAAC,UAAUZ,SAASC,MAAM,CAACY,QAAQ,CAAC,SAAS;gCACzE,sDAAsD;gCACtD,IAAIL,kBAAkBP,QAAQ;oCAC5BD,SAASC,MAAM,GAAGO,iBAAiBP,MAAM;gCAC3C;4BACF,OAAO;gCACL,kBAAkB;gCAClBD,SAASC,MAAM,GAAGM,QAAQP,SAASC,MAAM,EAAE/B,IAAIyB,OAAO,CAACC,MAAM;4BAC/D;wBACF;wBACA,OAAOI;oBACT;gBACF;gBACA,OAAOK;YACT;SACD;IACH;IACAzB,OAAO;AACT,EAAC"}
|
|
1
|
+
{"version":3,"sources":["../../src/collections/AISettings.ts"],"sourcesContent":["import type { GlobalConfig } from 'payload'\n\nimport { allProviderBlocks } from '../ai/providers/blocks/index.js'\n\nexport const aiSettingsGlobal: GlobalConfig = {\n slug: 'ai-settings',\n access: {\n read: ({ req }) => !!req.user,\n update: ({ req }) => !!req.user,\n },\n admin: {\n group: false,\n },\n fields: [\n {\n name: 'providers',\n type: 'blocks',\n admin: {\n description: 'Configure which AI providers to use and their settings',\n initCollapsed: true,\n },\n blocks: allProviderBlocks,\n label: 'AI Providers',\n required: true,\n },\n {\n name: 'enabledCollections',\n type: 'json',\n admin: {\n hidden: true,\n },\n },\n {\n name: 'defaults',\n type: 'group',\n admin: {\n description: 'Please provide default provider/model behavior for each use case',\n },\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n fields: [\n {\n name: 'text',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'options',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Default options for this model (global)',\n },\n label: 'Global Model Options',\n },\n ],\n label: '',\n },\n ],\n label: 'Text Generation',\n },\n {\n fields: [\n {\n name: 'image',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'options',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Default options for this model (global)',\n },\n label: 'Global Model Options',\n },\n ],\n label: '',\n },\n ],\n label: 'Image Generation',\n },\n {\n fields: [\n {\n name: 'tts',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'voice',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicVoiceSelect',\n },\n },\n label: 'Default Voice',\n },\n {\n name: 'options',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Default options for this model (global)',\n },\n label: 'Global Model Options',\n },\n ],\n label: '',\n },\n ],\n label: 'Speech Generation',\n },\n {\n admin: {\n disabled: true,\n },\n fields: [\n {\n name: 'video',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'options',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Default options for this model (global)',\n },\n label: 'Global Model Options',\n },\n ],\n label: '',\n },\n ],\n label: 'Video Generation',\n },\n ],\n },\n ],\n label: 'Default Models',\n },\n ],\n hooks: {\n afterChange: [\n async ({ doc, req }) => {\n if (doc.enabledCollections && doc.enabledCollections.length > 0) {\n const { seedProperties } = await import('../utilities/seedProperties.js')\n await seedProperties({\n enabledCollections: doc.enabledCollections,\n req,\n })\n }\n return doc\n },\n ],\n afterRead: [\n async ({ context, doc, req }) => {\n if (!req.payload.secret) {\n return doc\n }\n\n const { decrypt } = await import('../utilities/encryption.js')\n\n if (doc.providers) {\n doc.providers = doc.providers.map((provider: any) => {\n if (provider.apiKey) {\n if (context.unsafe) {\n // Internal use: decrypt\n provider.apiKey = decrypt(provider.apiKey, req.payload.secret)\n } else {\n // Admin UI: mask\n // We can't easily check if it's valid without decrypting, but for UI we just show mask\n // If we want to show \"present\", we can return a mask\n provider.apiKey = 'sk-****' + provider.apiKey.slice(-4)\n }\n }\n return provider\n })\n }\n return doc\n },\n ],\n beforeChange: [\n async ({ data, originalDoc, req }) => {\n if (!req.payload.secret) {\n return data\n }\n\n const { encrypt } = await import('../utilities/encryption.js')\n\n // Iterate over providers and encrypt API keys\n if (data.providers) {\n data.providers = data.providers.map((provider: any) => {\n if (provider.apiKey) {\n const originalProvider = originalDoc?.providers?.find(\n (p: any) => p.id === provider.id,\n )\n\n // If the key strictly equals the existing one (e.g. partial update merge), do nothing.\n // This prevents re-encrypting an already encrypted key.\n if (originalProvider?.apiKey && provider.apiKey === originalProvider.apiKey) {\n return provider\n }\n\n // If it looks like a masked key, don't re-encrypt (it means it wasn't changed via UI)\n if (provider.apiKey.startsWith('sk-') && provider.apiKey.includes('****')) {\n // Restore the original encrypted key from originalDoc\n if (originalProvider?.apiKey) {\n provider.apiKey = originalProvider.apiKey\n }\n } else {\n // Encrypt new key\n provider.apiKey = encrypt(provider.apiKey, req.payload.secret)\n }\n }\n return provider\n })\n }\n return data\n },\n ],\n },\n label: 'AI Configuration',\n}\n"],"names":["allProviderBlocks","aiSettingsGlobal","slug","access","read","req","user","update","admin","group","fields","name","type","description","initCollapsed","blocks","label","required","hidden","tabs","components","Field","disabled","hooks","afterChange","doc","enabledCollections","length","seedProperties","afterRead","context","payload","secret","decrypt","providers","map","provider","apiKey","unsafe","slice","beforeChange","data","originalDoc","encrypt","originalProvider","find","p","id","startsWith","includes"],"mappings":"AAEA,SAASA,iBAAiB,QAAQ,kCAAiC;AAEnE,OAAO,MAAMC,mBAAiC;IAC5CC,MAAM;IACNC,QAAQ;QACNC,MAAM,CAAC,EAAEC,GAAG,EAAE,GAAK,CAAC,CAACA,IAAIC,IAAI;QAC7BC,QAAQ,CAAC,EAAEF,GAAG,EAAE,GAAK,CAAC,CAACA,IAAIC,IAAI;IACjC;IACAE,OAAO;QACLC,OAAO;IACT;IACAC,QAAQ;QACN;YACEC,MAAM;YACNC,MAAM;YACNJ,OAAO;gBACLK,aAAa;gBACbC,eAAe;YACjB;YACAC,QAAQf;YACRgB,OAAO;YACPC,UAAU;QACZ;QACA;YACEN,MAAM;YACNC,MAAM;YACNJ,OAAO;gBACLU,QAAQ;YACV;QACF;QACA;YACEP,MAAM;YACNC,MAAM;YACNJ,OAAO;gBACLK,aAAa;YACf;YACAH,QAAQ;gBACN;oBACEE,MAAM;oBACNO,MAAM;wBACJ;4BACET,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNJ,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEL,MAAM;4CACNC,MAAM;4CACNJ,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEL,MAAM;4CACNC,MAAM;4CACNJ,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;gDACAR,aAAa;4CACf;4CACAG,OAAO;wCACT;qCACD;oCACDA,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;wBACA;4BACEN,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNJ,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEL,MAAM;4CACNC,MAAM;4CACNJ,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEL,MAAM;4CACNC,MAAM;4CACNJ,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;gDACAR,aAAa;4CACf;4CACAG,OAAO;wCACT;qCACD;oCACDA,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;wBACA;4BACEN,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNJ,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEL,MAAM;4CACNC,MAAM;4CACNJ,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEL,MAAM;4CACNC,MAAM;4CACNJ,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEL,MAAM;4CACNC,MAAM;4CACNJ,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;gDACAR,aAAa;4CACf;4CACAG,OAAO;wCACT;qCACD;oCACDA,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;wBACA;4BACER,OAAO;gCACLc,UAAU;4BACZ;4BACAZ,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNJ,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEL,MAAM;4CACNC,MAAM;4CACNJ,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEL,MAAM;4CACNC,MAAM;4CACNJ,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;gDACAR,aAAa;4CACf;4CACAG,OAAO;wCACT;qCACD;oCACDA,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;qBACD;gBACH;aACD;YACDA,OAAO;QACT;KACD;IACDO,OAAO;QACLC,aAAa;YACX,OAAO,EAAEC,GAAG,EAAEpB,GAAG,EAAE;gBACjB,IAAIoB,IAAIC,kBAAkB,IAAID,IAAIC,kBAAkB,CAACC,MAAM,GAAG,GAAG;oBAC/D,MAAM,EAAEC,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC;oBACxC,MAAMA,eAAe;wBACnBF,oBAAoBD,IAAIC,kBAAkB;wBAC1CrB;oBACF;gBACF;gBACA,OAAOoB;YACT;SACD;QACDI,WAAW;YACT,OAAO,EAAEC,OAAO,EAAEL,GAAG,EAAEpB,GAAG,EAAE;gBAC1B,IAAI,CAACA,IAAI0B,OAAO,CAACC,MAAM,EAAE;oBACvB,OAAOP;gBACT;gBAEA,MAAM,EAAEQ,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC;gBAEjC,IAAIR,IAAIS,SAAS,EAAE;oBACjBT,IAAIS,SAAS,GAAGT,IAAIS,SAAS,CAACC,GAAG,CAAC,CAACC;wBACjC,IAAIA,SAASC,MAAM,EAAE;4BACnB,IAAIP,QAAQQ,MAAM,EAAE;gCAClB,wBAAwB;gCACxBF,SAASC,MAAM,GAAGJ,QAAQG,SAASC,MAAM,EAAEhC,IAAI0B,OAAO,CAACC,MAAM;4BAC/D,OAAO;gCACL,iBAAiB;gCACjB,uFAAuF;gCACvF,qDAAqD;gCACrDI,SAASC,MAAM,GAAG,YAAYD,SAASC,MAAM,CAACE,KAAK,CAAC,CAAC;4BACvD;wBACF;wBACA,OAAOH;oBACT;gBACF;gBACA,OAAOX;YACT;SACD;QACDe,cAAc;YACZ,OAAO,EAAEC,IAAI,EAAEC,WAAW,EAAErC,GAAG,EAAE;gBAC/B,IAAI,CAACA,IAAI0B,OAAO,CAACC,MAAM,EAAE;oBACvB,OAAOS;gBACT;gBAEA,MAAM,EAAEE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC;gBAEjC,8CAA8C;gBAC9C,IAAIF,KAAKP,SAAS,EAAE;oBAClBO,KAAKP,SAAS,GAAGO,KAAKP,SAAS,CAACC,GAAG,CAAC,CAACC;wBACnC,IAAIA,SAASC,MAAM,EAAE;4BACnB,MAAMO,mBAAmBF,aAAaR,WAAWW,KAC/C,CAACC,IAAWA,EAAEC,EAAE,KAAKX,SAASW,EAAE;4BAGlC,uFAAuF;4BACvF,wDAAwD;4BACxD,IAAIH,kBAAkBP,UAAUD,SAASC,MAAM,KAAKO,iBAAiBP,MAAM,EAAE;gCAC3E,OAAOD;4BACT;4BAEA,sFAAsF;4BACtF,IAAIA,SAASC,MAAM,CAACW,UAAU,CAAC,UAAUZ,SAASC,MAAM,CAACY,QAAQ,CAAC,SAAS;gCACzE,sDAAsD;gCACtD,IAAIL,kBAAkBP,QAAQ;oCAC5BD,SAASC,MAAM,GAAGO,iBAAiBP,MAAM;gCAC3C;4BACF,OAAO;gCACL,kBAAkB;gCAClBD,SAASC,MAAM,GAAGM,QAAQP,SAASC,MAAM,EAAEhC,IAAI0B,OAAO,CAACC,MAAM;4BAC/D;wBACF;wBACA,OAAOI;oBACT;gBACF;gBACA,OAAOK;YACT;SACD;IACH;IACAzB,OAAO;AACT,EAAC"}
|
|
@@ -35,34 +35,51 @@ export const fetchVoices = {
|
|
|
35
35
|
status: 400
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
|
-
// Call ElevenLabs API to fetch voices
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
// Call ElevenLabs API to fetch voices with timeout
|
|
39
|
+
const controller = new AbortController();
|
|
40
|
+
const timeoutId = setTimeout(()=>controller.abort(), 15000) // 15s timeout
|
|
41
|
+
;
|
|
42
|
+
try {
|
|
43
|
+
const response = await fetch('https://api.elevenlabs.io/v1/voices', {
|
|
44
|
+
headers: {
|
|
45
|
+
'xi-api-key': apiKey
|
|
46
|
+
},
|
|
47
|
+
signal: controller.signal
|
|
48
|
+
});
|
|
49
|
+
clearTimeout(timeoutId);
|
|
50
|
+
if (!response.ok) {
|
|
51
|
+
const errorText = await response.text();
|
|
52
|
+
return Response.json({
|
|
53
|
+
message: `ElevenLabs API error: ${errorText}`
|
|
54
|
+
}, {
|
|
55
|
+
status: response.status
|
|
56
|
+
});
|
|
42
57
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const
|
|
58
|
+
const data = await response.json();
|
|
59
|
+
// Transform voices to match our schema
|
|
60
|
+
const voices = (data.voices || []).map((voice)=>({
|
|
61
|
+
id: voice.voice_id,
|
|
62
|
+
name: voice.name,
|
|
63
|
+
category: voice.category || 'premade',
|
|
64
|
+
enabled: true,
|
|
65
|
+
labels: voice.labels || {},
|
|
66
|
+
preview_url: voice.preview_url || ''
|
|
67
|
+
}));
|
|
46
68
|
return Response.json({
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
status: response.status
|
|
69
|
+
success: true,
|
|
70
|
+
voices
|
|
50
71
|
});
|
|
72
|
+
} catch (error) {
|
|
73
|
+
clearTimeout(timeoutId);
|
|
74
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
75
|
+
return Response.json({
|
|
76
|
+
message: 'ElevenLabs API request timed out'
|
|
77
|
+
}, {
|
|
78
|
+
status: 504
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
throw error;
|
|
51
82
|
}
|
|
52
|
-
const data = await response.json();
|
|
53
|
-
// Transform voices to match our schema
|
|
54
|
-
const voices = (data.voices || []).map((voice)=>({
|
|
55
|
-
id: voice.voice_id,
|
|
56
|
-
name: voice.name,
|
|
57
|
-
category: voice.category || 'premade',
|
|
58
|
-
enabled: true,
|
|
59
|
-
labels: voice.labels || {},
|
|
60
|
-
preview_url: voice.preview_url || ''
|
|
61
|
-
}));
|
|
62
|
-
return Response.json({
|
|
63
|
-
success: true,
|
|
64
|
-
voices
|
|
65
|
-
});
|
|
66
83
|
} catch (error) {
|
|
67
84
|
req.payload.logger.error(error, 'Error fetching ElevenLabs voices');
|
|
68
85
|
return Response.json({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/endpoints/fetchVoices.ts"],"sourcesContent":["import type { Endpoint, PayloadRequest } from 'payload'\n\nimport { PLUGIN_API_ENDPOINT_FETCH_VOICES } from '../defaults.js'\n\ninterface ElevenLabsVoice {\n category?: string\n labels?: Record<string, string>\n name: string\n preview_url?: string\n voice_id: string\n}\n\nexport const fetchVoices: Endpoint = {\n handler: async (req: PayloadRequest) => {\n try {\n // Check authentication\n if (!req.user) {\n return Response.json({ message: 'Authentication required' }, { status: 401 })\n }\n\n // Fetch AI Settings global to get the encrypted API key\n const aiSettings = await req.payload.findGlobal({\n slug: 'ai-settings',\n context: { unsafe: true },\n })\n\n // Find the ElevenLabs provider block\n const elevenlabsProvider = aiSettings?.providers?.find(\n (provider: any) => provider.blockType === 'elevenlabs' && provider.enabled,\n )\n\n if (!elevenlabsProvider) {\n return Response.json(\n { message: 'ElevenLabs provider not found or not enabled in AI Settings' },\n { status: 400 },\n )\n }\n\n // Get the API key (already decrypted by afterRead hook due to unsafe context)\n const apiKey = elevenlabsProvider.apiKey\n\n if (!apiKey) {\n return Response.json(\n {\n message: 'API key not found. Please configure your ElevenLabs API key in AI Settings.',\n },\n { status: 400 },\n )\n }\n\n // Call ElevenLabs API to fetch voices\n const response = await fetch('https://api.elevenlabs.io/v1/voices', {\n
|
|
1
|
+
{"version":3,"sources":["../../src/endpoints/fetchVoices.ts"],"sourcesContent":["import type { Endpoint, PayloadRequest } from 'payload'\n\nimport { PLUGIN_API_ENDPOINT_FETCH_VOICES } from '../defaults.js'\n\ninterface ElevenLabsVoice {\n category?: string\n labels?: Record<string, string>\n name: string\n preview_url?: string\n voice_id: string\n}\n\nexport const fetchVoices: Endpoint = {\n handler: async (req: PayloadRequest) => {\n try {\n // Check authentication\n if (!req.user) {\n return Response.json({ message: 'Authentication required' }, { status: 401 })\n }\n\n // Fetch AI Settings global to get the encrypted API key\n const aiSettings = await req.payload.findGlobal({\n slug: 'ai-settings',\n context: { unsafe: true },\n })\n\n // Find the ElevenLabs provider block\n const elevenlabsProvider = aiSettings?.providers?.find(\n (provider: any) => provider.blockType === 'elevenlabs' && provider.enabled,\n )\n\n if (!elevenlabsProvider) {\n return Response.json(\n { message: 'ElevenLabs provider not found or not enabled in AI Settings' },\n { status: 400 },\n )\n }\n\n // Get the API key (already decrypted by afterRead hook due to unsafe context)\n const apiKey = elevenlabsProvider.apiKey\n\n if (!apiKey) {\n return Response.json(\n {\n message: 'API key not found. Please configure your ElevenLabs API key in AI Settings.',\n },\n { status: 400 },\n )\n }\n\n // Call ElevenLabs API to fetch voices with timeout\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), 15000) // 15s timeout\n\n try {\n const response = await fetch('https://api.elevenlabs.io/v1/voices', {\n headers: {\n 'xi-api-key': apiKey,\n },\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n const errorText = await response.text()\n return Response.json(\n { message: `ElevenLabs API error: ${errorText}` },\n { status: response.status },\n )\n }\n\n const data = await response.json()\n\n // Transform voices to match our schema\n const voices = (data.voices || []).map((voice: ElevenLabsVoice) => ({\n id: voice.voice_id,\n name: voice.name,\n category: voice.category || 'premade',\n enabled: true,\n labels: voice.labels || {},\n preview_url: voice.preview_url || '',\n }))\n\n return Response.json({\n success: true,\n voices,\n })\n } catch (error: unknown) {\n clearTimeout(timeoutId)\n if (error instanceof Error && error.name === 'AbortError') {\n return Response.json({ message: 'ElevenLabs API request timed out' }, { status: 504 })\n }\n throw error\n }\n } catch (error) {\n req.payload.logger.error(error, 'Error fetching ElevenLabs voices')\n return Response.json(\n { message: error instanceof Error ? error.message : 'Internal server error' },\n { status: 500 },\n )\n }\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_FETCH_VOICES,\n}\n"],"names":["PLUGIN_API_ENDPOINT_FETCH_VOICES","fetchVoices","handler","req","user","Response","json","message","status","aiSettings","payload","findGlobal","slug","context","unsafe","elevenlabsProvider","providers","find","provider","blockType","enabled","apiKey","controller","AbortController","timeoutId","setTimeout","abort","response","fetch","headers","signal","clearTimeout","ok","errorText","text","data","voices","map","voice","id","voice_id","name","category","labels","preview_url","success","error","Error","logger","method","path"],"mappings":"AAEA,SAASA,gCAAgC,QAAQ,iBAAgB;AAUjE,OAAO,MAAMC,cAAwB;IACnCC,SAAS,OAAOC;QACd,IAAI;YACF,uBAAuB;YACvB,IAAI,CAACA,IAAIC,IAAI,EAAE;gBACb,OAAOC,SAASC,IAAI,CAAC;oBAAEC,SAAS;gBAA0B,GAAG;oBAAEC,QAAQ;gBAAI;YAC7E;YAEA,wDAAwD;YACxD,MAAMC,aAAa,MAAMN,IAAIO,OAAO,CAACC,UAAU,CAAC;gBAC9CC,MAAM;gBACNC,SAAS;oBAAEC,QAAQ;gBAAK;YAC1B;YAEA,qCAAqC;YACrC,MAAMC,qBAAqBN,YAAYO,WAAWC,KAChD,CAACC,WAAkBA,SAASC,SAAS,KAAK,gBAAgBD,SAASE,OAAO;YAG5E,IAAI,CAACL,oBAAoB;gBACvB,OAAOV,SAASC,IAAI,CAClB;oBAAEC,SAAS;gBAA8D,GACzE;oBAAEC,QAAQ;gBAAI;YAElB;YAEA,8EAA8E;YAC9E,MAAMa,SAASN,mBAAmBM,MAAM;YAExC,IAAI,CAACA,QAAQ;gBACX,OAAOhB,SAASC,IAAI,CAClB;oBACEC,SAAS;gBACX,GACA;oBAAEC,QAAQ;gBAAI;YAElB;YAEA,mDAAmD;YACnD,MAAMc,aAAa,IAAIC;YACvB,MAAMC,YAAYC,WAAW,IAAMH,WAAWI,KAAK,IAAI,OAAO,cAAc;;YAE5E,IAAI;gBACF,MAAMC,WAAW,MAAMC,MAAM,uCAAuC;oBAClEC,SAAS;wBACP,cAAcR;oBAChB;oBACAS,QAAQR,WAAWQ,MAAM;gBAC3B;gBAEAC,aAAaP;gBAEb,IAAI,CAACG,SAASK,EAAE,EAAE;oBAChB,MAAMC,YAAY,MAAMN,SAASO,IAAI;oBACrC,OAAO7B,SAASC,IAAI,CAClB;wBAAEC,SAAS,CAAC,sBAAsB,EAAE0B,UAAU,CAAC;oBAAC,GAChD;wBAAEzB,QAAQmB,SAASnB,MAAM;oBAAC;gBAE9B;gBAEA,MAAM2B,OAAO,MAAMR,SAASrB,IAAI;gBAEhC,uCAAuC;gBACvC,MAAM8B,SAAS,AAACD,CAAAA,KAAKC,MAAM,IAAI,EAAE,AAAD,EAAGC,GAAG,CAAC,CAACC,QAA4B,CAAA;wBAClEC,IAAID,MAAME,QAAQ;wBAClBC,MAAMH,MAAMG,IAAI;wBAChBC,UAAUJ,MAAMI,QAAQ,IAAI;wBAC5BtB,SAAS;wBACTuB,QAAQL,MAAMK,MAAM,IAAI,CAAC;wBACzBC,aAAaN,MAAMM,WAAW,IAAI;oBACpC,CAAA;gBAEA,OAAOvC,SAASC,IAAI,CAAC;oBACnBuC,SAAS;oBACTT;gBACF;YACF,EAAE,OAAOU,OAAgB;gBACvBf,aAAaP;gBACb,IAAIsB,iBAAiBC,SAASD,MAAML,IAAI,KAAK,cAAc;oBACzD,OAAOpC,SAASC,IAAI,CAAC;wBAAEC,SAAS;oBAAmC,GAAG;wBAAEC,QAAQ;oBAAI;gBACtF;gBACA,MAAMsC;YACR;QACF,EAAE,OAAOA,OAAO;YACd3C,IAAIO,OAAO,CAACsC,MAAM,CAACF,KAAK,CAACA,OAAO;YAChC,OAAOzC,SAASC,IAAI,CAClB;gBAAEC,SAASuC,iBAAiBC,QAAQD,MAAMvC,OAAO,GAAG;YAAwB,GAC5E;gBAAEC,QAAQ;YAAI;QAElB;IACF;IACAyC,QAAQ;IACRC,MAAMlD;AACR,EAAC"}
|
package/dist/endpoints/index.js
CHANGED
|
@@ -56,6 +56,13 @@ export const endpoints = (pluginConfig)=>({
|
|
|
56
56
|
let allowedEditorSchema = editorSchema;
|
|
57
57
|
if (allowedEditorNodes.length) {
|
|
58
58
|
allowedEditorSchema = filterEditorSchemaByNodes(editorSchema, allowedEditorNodes);
|
|
59
|
+
// Debug: Log what nodes were received and what definitions remain
|
|
60
|
+
if (pluginConfig.debugging) {
|
|
61
|
+
req.payload.logger.info({
|
|
62
|
+
receivedNodes: allowedEditorNodes,
|
|
63
|
+
remainingDefinitions: Object.keys(allowedEditorSchema.definitions || {})
|
|
64
|
+
}, '— AI Plugin: Schema filtering debug');
|
|
65
|
+
}
|
|
59
66
|
}
|
|
60
67
|
const schemaPath = String(instructions['schema-path']);
|
|
61
68
|
const parts = (schemaPath || '').split('.') || [];
|
|
@@ -89,10 +96,11 @@ export const endpoints = (pluginConfig)=>({
|
|
|
89
96
|
}
|
|
90
97
|
// Build per-field JSON schema for structured generation when applicable
|
|
91
98
|
let jsonSchema = allowedEditorSchema;
|
|
99
|
+
let targetField;
|
|
92
100
|
try {
|
|
93
101
|
const targetCollection = req.payload.config.collections.find((c)=>c.slug === collectionName);
|
|
94
102
|
if (targetCollection && fieldName) {
|
|
95
|
-
|
|
103
|
+
targetField = getFieldBySchemaPath(targetCollection, schemaPath);
|
|
96
104
|
const supported = [
|
|
97
105
|
'array',
|
|
98
106
|
'text',
|
|
@@ -151,16 +159,60 @@ export const endpoints = (pluginConfig)=>({
|
|
|
151
159
|
images = imageParts;
|
|
152
160
|
}
|
|
153
161
|
}
|
|
154
|
-
|
|
162
|
+
let promptToUse = processedPrompt;
|
|
163
|
+
let systemToUse = prompts.system;
|
|
164
|
+
// let messagesToUse: any = undefined
|
|
165
|
+
// Execute beforeGenerate hooks
|
|
166
|
+
if (targetField && targetField.custom?.ai?.beforeGenerate) {
|
|
167
|
+
const beforeHooks = targetField.custom.ai.beforeGenerate;
|
|
168
|
+
for (const hook of beforeHooks){
|
|
169
|
+
const result = await hook({
|
|
170
|
+
doc: contextData,
|
|
171
|
+
field: targetField,
|
|
172
|
+
headers: req.headers,
|
|
173
|
+
instructions,
|
|
174
|
+
payload: req.payload,
|
|
175
|
+
prompt: promptToUse,
|
|
176
|
+
req,
|
|
177
|
+
system: systemToUse
|
|
178
|
+
});
|
|
179
|
+
if (result) {
|
|
180
|
+
if (result.prompt) promptToUse = result.prompt;
|
|
181
|
+
if (result.system) systemToUse = result.system;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
155
185
|
const streamResult = await req.payload.ai.streamObject({
|
|
156
186
|
// extractAttachments: modelSettings.extractAttachments as boolean | undefined,
|
|
157
187
|
images,
|
|
158
188
|
maxTokens: modelSettings.maxTokens,
|
|
189
|
+
// messages: messagesToUse,
|
|
159
190
|
model: modelSettings.model,
|
|
191
|
+
onFinish: async ({ object })=>{
|
|
192
|
+
if (targetField && targetField.custom?.ai?.afterGenerate) {
|
|
193
|
+
const afterHooks = targetField.custom.ai.afterGenerate;
|
|
194
|
+
for (const hook of afterHooks){
|
|
195
|
+
await hook({
|
|
196
|
+
doc: contextData,
|
|
197
|
+
field: targetField,
|
|
198
|
+
headers: req.headers,
|
|
199
|
+
instructions,
|
|
200
|
+
payload: req.payload,
|
|
201
|
+
req,
|
|
202
|
+
result: object
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
},
|
|
160
207
|
prompt: processedPrompt,
|
|
161
208
|
provider: modelSettings.provider,
|
|
209
|
+
providerOptions: {
|
|
210
|
+
openai: {
|
|
211
|
+
strictJsonSchema: true
|
|
212
|
+
}
|
|
213
|
+
},
|
|
162
214
|
schema: jsonSchema,
|
|
163
|
-
system:
|
|
215
|
+
system: systemToUse,
|
|
164
216
|
temperature: modelSettings.temperature
|
|
165
217
|
});
|
|
166
218
|
return streamResult;
|
|
@@ -241,7 +293,6 @@ export const endpoints = (pluginConfig)=>({
|
|
|
241
293
|
collection: collectionSlug
|
|
242
294
|
}, pluginConfig);
|
|
243
295
|
const text = await replacePlaceholders(promptTemplate, extendedContext);
|
|
244
|
-
const modelId = instructions['model-id'];
|
|
245
296
|
const uploadCollectionSlug = instructions['relation-to'];
|
|
246
297
|
// Resolve @field:filename references from the prompt
|
|
247
298
|
const { images: resolvedImages, processedPrompt } = await resolveImageReferences(text, contextData, req, collectionSlug);
|
|
@@ -253,15 +304,52 @@ export const endpoints = (pluginConfig)=>({
|
|
|
253
304
|
];
|
|
254
305
|
// Process images - convert to ImagePart format using helper
|
|
255
306
|
const editImages = await fetchImages(req, images);
|
|
307
|
+
let promptToUse = text;
|
|
308
|
+
let targetField;
|
|
309
|
+
try {
|
|
310
|
+
const targetCollection = req.payload.config.collections.find((c)=>c.slug === collectionSlug);
|
|
311
|
+
if (targetCollection && schemaPath) {
|
|
312
|
+
targetField = getFieldBySchemaPath(targetCollection, schemaPath);
|
|
313
|
+
}
|
|
314
|
+
} catch (e) {
|
|
315
|
+
req.payload.logger.error(e, '— AI Plugin: Error finding field for hooks');
|
|
316
|
+
}
|
|
317
|
+
if (targetField && targetField.custom?.ai?.beforeGenerate) {
|
|
318
|
+
const beforeHooks = targetField.custom.ai.beforeGenerate;
|
|
319
|
+
for (const hook of beforeHooks){
|
|
320
|
+
const result = await hook({
|
|
321
|
+
doc: contextData,
|
|
322
|
+
field: targetField,
|
|
323
|
+
headers: req.headers,
|
|
324
|
+
instructions,
|
|
325
|
+
payload: req.payload,
|
|
326
|
+
prompt: promptToUse,
|
|
327
|
+
req
|
|
328
|
+
});
|
|
329
|
+
if (result) {
|
|
330
|
+
if (result.prompt) {
|
|
331
|
+
promptToUse = result.prompt;
|
|
332
|
+
}
|
|
333
|
+
if (result.instructions) {
|
|
334
|
+
instructions = {
|
|
335
|
+
...instructions,
|
|
336
|
+
...result.instructions
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
256
342
|
if (pluginConfig.debugging) {
|
|
257
343
|
req.payload.logger.info({
|
|
258
|
-
text
|
|
344
|
+
text: promptToUse
|
|
259
345
|
}, `— AI Plugin: Executing media generation`);
|
|
260
346
|
}
|
|
261
347
|
// Prepare callback URL for async jobs
|
|
262
348
|
const serverURL = req.payload.config?.serverURL || process.env.SERVER_URL || process.env.NEXT_PUBLIC_SERVER_URL;
|
|
263
349
|
const callbackUrl = serverURL ? `${serverURL.replace(/\/$/, '')}/api${PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK}?instructionId=${instructionId}` : undefined;
|
|
264
350
|
// Get model settings
|
|
351
|
+
// Re-evaluate settings name and settings in case instructions changed
|
|
352
|
+
const modelId = instructions['model-id'];
|
|
265
353
|
const settingsName = modelId === 'image' ? 'image-settings' : modelId === 'video' ? 'video-settings' : modelId === 'tts' ? 'tts-settings' : undefined;
|
|
266
354
|
if (!settingsName) {
|
|
267
355
|
throw new Error(`Unsupported model-id: ${modelId}`);
|
|
@@ -305,10 +393,24 @@ export const endpoints = (pluginConfig)=>({
|
|
|
305
393
|
images: editImages,
|
|
306
394
|
instructionId,
|
|
307
395
|
model: modelSettings.model,
|
|
308
|
-
prompt:
|
|
396
|
+
prompt: promptToUse,
|
|
309
397
|
provider: modelSettings.provider,
|
|
310
398
|
...modelSettings
|
|
311
399
|
});
|
|
400
|
+
if (targetField && targetField.custom?.ai?.afterGenerate) {
|
|
401
|
+
const afterHooks = targetField.custom.ai.afterGenerate;
|
|
402
|
+
for (const hook of afterHooks){
|
|
403
|
+
await hook({
|
|
404
|
+
doc: contextData,
|
|
405
|
+
field: targetField,
|
|
406
|
+
headers: req.headers,
|
|
407
|
+
instructions,
|
|
408
|
+
payload: req.payload,
|
|
409
|
+
req,
|
|
410
|
+
result
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
}
|
|
312
414
|
// If model returned a file immediately, proceed with upload
|
|
313
415
|
if (result && 'file' in result) {
|
|
314
416
|
let assetData;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/endpoints/index.ts"],"sourcesContent":["import type { ImagePart } from 'ai'\nimport type { PayloadRequest } from 'payload'\n\nimport * as process from 'node:process'\n\nimport type { Endpoints, PluginConfig } from '../types.js'\n\nimport { checkAccess } from '../access/checkAccess.js'\nimport { filterEditorSchemaByNodes } from '../ai/utils/filterEditorSchemaByNodes.js'\nimport {\n PLUGIN_AI_JOBS_TABLE,\n PLUGIN_API_ENDPOINT_GENERATE,\n PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK,\n PLUGIN_INSTRUCTIONS_TABLE,\n PLUGIN_NAME,\n} from '../defaults.js'\nimport { registerEditorHelper } from '../libraries/handlebars/helpers.js'\nimport { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js'\nimport { buildSmartPrompt, isGenericPrompt } from '../utilities/buildSmartPrompt.js'\nimport { extractImageData } from '../utilities/extractImageData.js'\nimport { type FetchableImage, fetchImages } from '../utilities/fetchImages.js'\nimport { fieldToJsonSchema } from '../utilities/fieldToJsonSchema.js'\nimport { getFieldBySchemaPath } from '../utilities/getFieldBySchemaPath.js'\nimport { resolveImageReferences } from '../utilities/resolveImageReferences.js'\nimport { assignPrompt, extendContextWithPromptFields } from './buildPromptUtils.js'\n\nexport const endpoints: (pluginConfig: PluginConfig) => Endpoints = (pluginConfig) =>\n ({\n textarea: {\n // Text/rich-text generation endpoint using payload.ai.streamObject\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 let { prompt: promptTemplate = '' } = instructions\n\n // Smart fallback: if prompt is generic, build a contextual prompt from field metadata\n if (isGenericPrompt(promptTemplate)) {\n const schemaPath = String(instructions['schema-path'])\n promptTemplate = buildSmartPrompt({\n documentData: contextData,\n payload: req.payload,\n schemaPath,\n })\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n { smartPrompt: promptTemplate },\n `— AI Plugin: Using smart fallback prompt for ${schemaPath}`,\n )\n }\n }\n\n let allowedEditorSchema = editorSchema\n if (allowedEditorNodes.length) {\n allowedEditorSchema = filterEditorSchemaByNodes(editorSchema, allowedEditorNodes)\n }\n\n const schemaPath = String(instructions['schema-path'])\n const parts = (schemaPath || '').split('.') || []\n const collectionName = parts[0]\n const fieldName = parts.length > 1 ? parts[parts.length - 1] : ''\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 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}`,\n )\n }\n\n // Build per-field JSON schema for structured generation when applicable\n let jsonSchema = allowedEditorSchema\n try {\n const targetCollection = req.payload.config.collections.find(\n (c) => c.slug === collectionName,\n )\n if (targetCollection && fieldName) {\n const targetField = getFieldBySchemaPath(targetCollection, schemaPath)\n const supported = [\n 'array',\n 'text',\n 'textarea',\n 'select',\n 'number',\n 'date',\n 'code',\n 'email',\n 'json',\n ]\n const t = String(targetField?.type || '')\n if (targetField && supported.includes(t)) {\n // For array fields, use count from array-settings if available\n if (t === 'array') {\n const arraySettings = (instructions['array-settings'] || {}) as Record<string, unknown>\n const count = (arraySettings.count as number) || 3\n // Override the field's maxRows with the requested count\n const modifiedField = {\n ...targetField,\n maxRows: count,\n minRows: count,\n } as typeof targetField\n jsonSchema = fieldToJsonSchema(modifiedField, { nameOverride: fieldName })\n } else {\n jsonSchema = fieldToJsonSchema(targetField, { nameOverride: fieldName })\n }\n }\n }\n } catch (e) {\n req.payload.logger.error(e, '— AI Plugin: Error building field JSON schema')\n }\n\n // Get model settings from instruction\n const settingsName =\n instructions['model-id'] === 'richtext'\n ? 'richtext-settings'\n : instructions['model-id'] === 'text'\n ? 'text-settings'\n : instructions['model-id'] === 'array'\n ? 'array-settings'\n : undefined\n\n if (!settingsName) {\n throw new Error(`Unsupported model-id: ${instructions['model-id']}`)\n }\n\n const modelSettings = instructions[settingsName] || {}\n\n // Resolve @field:filename references from the prompt\n const { images: resolvedImages, processedPrompt } = await resolveImageReferences(\n prompts.prompt,\n contextData,\n req,\n collectionName,\n )\n\n // Extract hardcoded URLs from the processed prompt\n const hardcodedImages = extractImageData(processedPrompt)\n\n // Combine images\n const allImages = [...hardcodedImages, ...resolvedImages] as FetchableImage[]\n\n let images: ImagePart[] | undefined\n\n if (allImages.length > 0) {\n const imageParts = await fetchImages(req, allImages)\n\n if (imageParts.length > 0) {\n images = imageParts\n }\n }\n\n // Use payload.ai.streamObject directly! 🎉\n const streamResult = await req.payload.ai.streamObject({\n // extractAttachments: modelSettings.extractAttachments as boolean | undefined,\n images,\n maxTokens: modelSettings.maxTokens as number | undefined,\n model: modelSettings.model as string,\n prompt: processedPrompt,\n provider: modelSettings.provider as string,\n schema: jsonSchema,\n system: prompts.system,\n temperature: modelSettings.temperature as number | undefined,\n })\n\n return streamResult\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 Error).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 // Image/video generation endpoint using payload.ai.generateMedia\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, unknown> = { 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 let { prompt: promptTemplate = '' } = instructions\n const { images: sampleImages = [] } = instructions\n const schemaPath = String(instructions['schema-path'])\n registerEditorHelper(req.payload, schemaPath)\n\n // Smart fallback: if prompt is generic, build a contextual prompt from field metadata\n if (isGenericPrompt(promptTemplate as string)) {\n promptTemplate = buildSmartPrompt({\n documentData: contextData,\n payload: req.payload,\n schemaPath,\n })\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n { smartPrompt: promptTemplate },\n `— AI Plugin: Using smart fallback prompt for ${schemaPath}`,\n )\n }\n }\n\n const extendedContext = extendContextWithPromptFields(\n contextData,\n { type: String(instructions['field-type']), collection: collectionSlug },\n pluginConfig,\n )\n const text = await replacePlaceholders(promptTemplate as string, extendedContext)\n const modelId = instructions['model-id']\n const uploadCollectionSlug = instructions['relation-to']\n\n // Resolve @field:filename references from the prompt\n const { images: resolvedImages, processedPrompt } = await resolveImageReferences(\n text,\n contextData,\n req,\n collectionSlug,\n )\n\n // Extract hardcoded URLs from the processed prompt and merge with resolved images and sample images\n const images = [\n ...extractImageData(processedPrompt),\n ...resolvedImages,\n ...(sampleImages as unknown[]),\n ] as FetchableImage[]\n\n // Process images - convert to ImagePart format using helper\n const editImages: ImagePart[] = await fetchImages(req, images)\n\n if (pluginConfig.debugging) {\n req.payload.logger.info({ text }, `— AI Plugin: Executing media generation`)\n }\n\n // Prepare callback URL for async jobs\n const serverURL =\n req.payload.config?.serverURL ||\n process.env.SERVER_URL ||\n process.env.NEXT_PUBLIC_SERVER_URL\n\n const callbackUrl = serverURL\n ? `${serverURL.replace(/\\/$/, '')}/api${PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK}?instructionId=${instructionId}`\n : undefined\n\n // Get model settings\n const settingsName =\n modelId === 'image'\n ? 'image-settings'\n : modelId === 'video'\n ? 'video-settings'\n : modelId === 'tts'\n ? 'tts-settings'\n : undefined\n if (!settingsName) {\n throw new Error(`Unsupported model-id: ${modelId}`)\n }\n\n // Get model settings from instruction\n const instructionSettings = (instructions[settingsName] || {}) as Record<string, unknown>\n\n // Fallback to AISettings global defaults if instruction-level settings are missing\n let globalDefaults: Record<string, unknown> = {}\n if (!instructionSettings.provider || !instructionSettings.model) {\n try {\n const aiSettings = await req.payload.findGlobal({\n slug: 'ai-settings',\n context: { unsafe: true }, // Get decrypted values for internal use\n })\n\n // Map modelId to the corresponding default settings key\n const defaultsKey =\n modelId === 'image'\n ? 'image'\n : modelId === 'video'\n ? 'video'\n : modelId === 'tts'\n ? 'tts'\n : undefined\n\n if (defaultsKey && aiSettings?.defaults?.[defaultsKey]) {\n globalDefaults = aiSettings.defaults[defaultsKey] as Record<string, unknown>\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n { globalDefaults },\n `— AI Plugin: Using AISettings defaults for ${modelId}`,\n )\n }\n }\n } catch (e) {\n req.payload.logger.error(e, '— AI Plugin: Error fetching AISettings defaults')\n }\n }\n\n // Merge: instruction settings take priority over global defaults\n // Filter out null/undefined values so they don't overwrite valid defaults\n const filteredInstructionSettings = Object.fromEntries(\n Object.entries(instructionSettings).filter(([_, v]) => v != null),\n )\n const modelSettings = {\n ...globalDefaults,\n ...filteredInstructionSettings,\n }\n\n // Use payload.ai.generateMedia directly! 🎉\n const result = await req.payload.ai.generateMedia({\n callbackUrl,\n images: editImages,\n instructionId,\n model: modelSettings.model as string,\n prompt: text,\n provider: modelSettings.provider as string,\n ...modelSettings,\n })\n\n // If model returned a file immediately, proceed with upload\n if (result && 'file' in result) {\n let assetData: { alt?: string; id: number | string }\n if (typeof pluginConfig.mediaUpload === 'function') {\n assetData = await pluginConfig.mediaUpload(result, {\n collection: uploadCollectionSlug as string,\n request: req,\n })\n } else {\n assetData = await req.payload.create({\n collection: uploadCollectionSlug as string,\n data: { alt: text },\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 }\n\n // Otherwise, assume async job launch\n if (result && ('jobId' in result || 'taskId' in result)) {\n const externalTaskId = result.jobId || result.taskId\n const status = result.status || 'queued'\n const progress = result.progress ?? 0\n\n // Create AI Job doc and return only its id\n const createdJob = await req.payload.create({\n collection: PLUGIN_AI_JOBS_TABLE,\n data: {\n instructionId,\n progress,\n status,\n task_id: externalTaskId,\n },\n overrideAccess: true,\n req,\n })\n\n return new Response(JSON.stringify({ job: { id: createdJob.id } }), {\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n throw new Error('Unexpected model response.')\n } catch (error) {\n req.payload.logger.error(\n // @ts-expect-error\n error?.type || (error as Error).message,\n 'Error generating upload: ',\n )\n const message =\n error && typeof error === 'object' && 'message' in error\n ? (error as Error).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 videogenWebhook: {\n handler: async (req: PayloadRequest) => {\n console.log('videogenWebhook --> ', req)\n try {\n const urlAll = new URL(req.url || '')\n const qpSecret = urlAll.searchParams.get('secret') || ''\n const headerSecret = req.headers.get('x-webhook-secret') || ''\n const falSecret = process.env.FAL_WEBHOOK_SECRET\n const legacySecret = process.env.VIDEOGEN_WEBHOOK_SECRET\n const provided = qpSecret || headerSecret\n // TODO: fal is failing because of auth but webhook seem to work\n if (!provided || (falSecret ? provided !== falSecret : provided !== legacySecret)) {\n return new Response('Unauthorized', { status: 401 })\n }\n\n const instructionId = urlAll.searchParams.get('instructionId')\n if (!instructionId) {\n throw new Error('instructionId missing')\n }\n\n const body = await req.json?.()\n // Normalize fal webhook payload\n const status: string | undefined =\n (body && (body.status || body.data?.status || body.response?.status)) || undefined\n const progress: number | undefined =\n (body && (body.progress ?? body.data?.progress ?? body.response?.progress)) ?? undefined\n const requestId: string | undefined =\n (body &&\n (body.taskId ||\n body.request_id ||\n body.gateway_request_id ||\n body.request?.request_id)) ||\n undefined\n const error = body?.error || body?.data?.error || body?.response?.error\n\n // Update AI Job row by task_id (and instructionId)\n const jobSearch = await req.payload.find({\n collection: PLUGIN_AI_JOBS_TABLE,\n depth: 0,\n limit: 1,\n where: {\n and: [\n { task_id: { equals: requestId } },\n { instructionId: { equals: instructionId } },\n ],\n },\n })\n\n const jobDoc = jobSearch.docs?.[0]\n if (jobDoc) {\n await req.payload.update({\n id: jobDoc.id,\n collection: PLUGIN_AI_JOBS_TABLE,\n data: {\n progress,\n status,\n task_id: requestId,\n },\n overrideAccess: true,\n req,\n })\n }\n\n console.log('fal webhook body: ', body)\n\n const videoUrl =\n body?.outputs?.[0]?.url ||\n body?.data?.outputs?.[0]?.url ||\n body?.video?.url ||\n body?.data?.video?.url ||\n body?.response?.video?.url ||\n body?.videos?.[0]?.url ||\n body?.data?.videos?.[0]?.url\n\n if (status === 'completed' && videoUrl) {\n // Fetch the related instruction to get upload collection\n const instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n req,\n })\n\n const uploadCollectionSlug = instructions['relation-to']\n\n const videoResp = await fetch(videoUrl)\n if (!videoResp.ok) {\n throw new Error(`Failed to fetch output: ${videoResp.status}`)\n }\n const buffer = Buffer.from(await videoResp.arrayBuffer())\n\n const created = await req.payload.create({\n collection: uploadCollectionSlug,\n data: { alt: 'video generation' },\n file: {\n name: 'video_generation.mp4',\n data: buffer,\n mimetype: 'video/mp4',\n size: buffer.byteLength,\n },\n overrideAccess: true,\n req,\n })\n\n // Persist the result on the AI Job record\n if (jobDoc) {\n await req.payload.update({\n id: jobDoc.id,\n collection: PLUGIN_AI_JOBS_TABLE,\n data: {\n progress: 100,\n result_id: created?.id,\n status: 'completed',\n },\n overrideAccess: true,\n req,\n })\n }\n }\n\n if (status === 'failed' && error) {\n req.payload.logger.error(error, 'Video generation failed: ')\n }\n\n return new Response(JSON.stringify({ ok: true }), {\n headers: { 'Content-Type': 'application/json' },\n })\n } catch (error) {\n req.payload.logger.error(error, 'Error in videogen webhook: ')\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: 500,\n })\n }\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK,\n },\n }) satisfies Endpoints\n"],"names":["process","checkAccess","filterEditorSchemaByNodes","PLUGIN_AI_JOBS_TABLE","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","registerEditorHelper","replacePlaceholders","buildSmartPrompt","isGenericPrompt","extractImageData","fetchImages","fieldToJsonSchema","getFieldBySchemaPath","resolveImageReferences","assignPrompt","extendContextWithPromptFields","endpoints","pluginConfig","textarea","handler","req","data","json","allowedEditorNodes","locale","options","action","actionParams","instructionId","contextData","doc","Error","instructions","payload","findByID","id","collection","collections","config","find","slug","custom","editorConfig","admin","schema","editorSchema","prompt","promptTemplate","schemaPath","String","documentData","debugging","logger","info","smartPrompt","allowedEditorSchema","length","parts","split","collectionName","fieldName","defaultLocale","locales","localization","localeData","l","code","localeInfo","label","prompts","type","context","field","layout","systemPrompt","system","template","jsonSchema","targetCollection","c","targetField","supported","t","includes","arraySettings","count","modifiedField","maxRows","minRows","nameOverride","e","error","settingsName","undefined","modelSettings","images","resolvedImages","processedPrompt","hardcodedImages","allImages","imageParts","streamResult","ai","streamObject","maxTokens","model","provider","temperature","message","Response","JSON","stringify","headers","status","method","path","upload","collectionSlug","documentId","docData","draft","sampleImages","extendedContext","text","modelId","uploadCollectionSlug","editImages","serverURL","env","SERVER_URL","NEXT_PUBLIC_SERVER_URL","callbackUrl","replace","instructionSettings","globalDefaults","aiSettings","findGlobal","unsafe","defaultsKey","defaults","filteredInstructionSettings","Object","fromEntries","entries","filter","_","v","result","generateMedia","assetData","mediaUpload","request","create","alt","file","externalTaskId","jobId","taskId","progress","createdJob","task_id","overrideAccess","job","videogenWebhook","console","log","urlAll","URL","url","qpSecret","searchParams","get","headerSecret","falSecret","FAL_WEBHOOK_SECRET","legacySecret","VIDEOGEN_WEBHOOK_SECRET","provided","body","response","requestId","request_id","gateway_request_id","jobSearch","depth","limit","where","and","equals","jobDoc","docs","update","videoUrl","outputs","video","videos","videoResp","fetch","ok","buffer","Buffer","from","arrayBuffer","created","name","mimetype","size","byteLength","result_id"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/endpoints/index.ts"],"sourcesContent":["import type { ImagePart } from 'ai'\nimport type { Field, PayloadRequest } from 'payload'\n\nimport * as process from 'node:process'\n\nimport type { Endpoints, PluginConfig } from '../types.js'\n\nimport { checkAccess } from '../access/checkAccess.js'\nimport { filterEditorSchemaByNodes } from '../ai/utils/filterEditorSchemaByNodes.js'\nimport {\n PLUGIN_AI_JOBS_TABLE,\n PLUGIN_API_ENDPOINT_GENERATE,\n PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK,\n PLUGIN_INSTRUCTIONS_TABLE,\n PLUGIN_NAME,\n} from '../defaults.js'\nimport { registerEditorHelper } from '../libraries/handlebars/helpers.js'\nimport { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js'\nimport { buildSmartPrompt, isGenericPrompt } from '../utilities/buildSmartPrompt.js'\nimport { extractImageData } from '../utilities/extractImageData.js'\nimport { type FetchableImage, fetchImages } from '../utilities/fetchImages.js'\nimport { fieldToJsonSchema } from '../utilities/fieldToJsonSchema.js'\nimport { getFieldBySchemaPath } from '../utilities/getFieldBySchemaPath.js'\nimport { resolveImageReferences } from '../utilities/resolveImageReferences.js'\nimport { assignPrompt, extendContextWithPromptFields } from './buildPromptUtils.js'\n\nexport const endpoints: (pluginConfig: PluginConfig) => Endpoints = (pluginConfig) =>\n ({\n textarea: {\n // Text/rich-text generation endpoint using payload.ai.streamObject\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 let { prompt: promptTemplate = '' } = instructions\n\n // Smart fallback: if prompt is generic, build a contextual prompt from field metadata\n if (isGenericPrompt(promptTemplate)) {\n const schemaPath = String(instructions['schema-path'])\n promptTemplate = buildSmartPrompt({\n documentData: contextData,\n payload: req.payload,\n schemaPath,\n })\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n { smartPrompt: promptTemplate },\n `— AI Plugin: Using smart fallback prompt for ${schemaPath}`,\n )\n }\n }\n\n let allowedEditorSchema = editorSchema\n if (allowedEditorNodes.length) {\n allowedEditorSchema = filterEditorSchemaByNodes(editorSchema, allowedEditorNodes)\n // Debug: Log what nodes were received and what definitions remain\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n {\n receivedNodes: allowedEditorNodes,\n remainingDefinitions: Object.keys(allowedEditorSchema.definitions || {}),\n },\n '— AI Plugin: Schema filtering debug',\n )\n }\n }\n\n const schemaPath = String(instructions['schema-path'])\n const parts = (schemaPath || '').split('.') || []\n const collectionName = parts[0]\n const fieldName = parts.length > 1 ? parts[parts.length - 1] : ''\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 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}`,\n )\n }\n\n // Build per-field JSON schema for structured generation when applicable\n let jsonSchema = allowedEditorSchema\n let targetField: Field | null | undefined\n\n try {\n const targetCollection = req.payload.config.collections.find(\n (c) => c.slug === collectionName,\n )\n if (targetCollection && fieldName) {\n targetField = getFieldBySchemaPath(targetCollection, schemaPath)\n const supported = [\n 'array',\n 'text',\n 'textarea',\n 'select',\n 'number',\n 'date',\n 'code',\n 'email',\n 'json',\n ]\n const t = String(targetField?.type || '')\n if (targetField && supported.includes(t)) {\n // For array fields, use count from array-settings if available\n if (t === 'array') {\n const arraySettings = (instructions['array-settings'] || {}) as Record<\n string,\n unknown\n >\n const count = (arraySettings.count as number) || 3\n // Override the field's maxRows with the requested count\n const modifiedField = {\n ...targetField,\n maxRows: count,\n minRows: count,\n } as typeof targetField\n jsonSchema = fieldToJsonSchema(modifiedField, { nameOverride: fieldName })\n } else {\n jsonSchema = fieldToJsonSchema(targetField, { nameOverride: fieldName })\n }\n }\n }\n } catch (e) {\n req.payload.logger.error(e, '— AI Plugin: Error building field JSON schema')\n }\n\n // Get model settings from instruction\n const settingsName =\n instructions['model-id'] === 'richtext'\n ? 'richtext-settings'\n : instructions['model-id'] === 'text'\n ? 'text-settings'\n : instructions['model-id'] === 'array'\n ? 'array-settings'\n : undefined\n\n if (!settingsName) {\n throw new Error(`Unsupported model-id: ${instructions['model-id']}`)\n }\n\n const modelSettings = instructions[settingsName] || {}\n\n // Resolve @field:filename references from the prompt\n const { images: resolvedImages, processedPrompt } = await resolveImageReferences(\n prompts.prompt,\n contextData,\n req,\n collectionName,\n )\n\n // Extract hardcoded URLs from the processed prompt\n const hardcodedImages = extractImageData(processedPrompt)\n\n // Combine images\n const allImages = [...hardcodedImages, ...resolvedImages] as FetchableImage[]\n\n let images: ImagePart[] | undefined\n\n if (allImages.length > 0) {\n const imageParts = await fetchImages(req, allImages)\n\n if (imageParts.length > 0) {\n images = imageParts\n }\n }\n\n let promptToUse = processedPrompt\n let systemToUse = prompts.system\n // let messagesToUse: any = undefined\n\n // Execute beforeGenerate hooks\n if (targetField && (targetField as any).custom?.ai?.beforeGenerate) {\n const beforeHooks = (targetField as any).custom.ai.beforeGenerate as Array<\n (args: any) => Promise<any>\n >\n for (const hook of beforeHooks) {\n const result = await hook({\n doc: contextData,\n field: targetField,\n headers: req.headers,\n instructions,\n payload: req.payload,\n prompt: promptToUse,\n req,\n system: systemToUse,\n })\n\n if (result) {\n if (result.prompt) promptToUse = result.prompt\n if (result.system) systemToUse = result.system\n }\n }\n }\n\n const streamResult = await req.payload.ai.streamObject({\n // extractAttachments: modelSettings.extractAttachments as boolean | undefined,\n images,\n maxTokens: modelSettings.maxTokens as number | undefined,\n // messages: messagesToUse,\n model: modelSettings.model as string,\n onFinish: async ({ object }) => {\n if (targetField && (targetField as any).custom?.ai?.afterGenerate) {\n const afterHooks = (targetField as any).custom.ai.afterGenerate as Array<\n (args: any) => Promise<any>\n >\n for (const hook of afterHooks) {\n await hook({\n doc: contextData,\n field: targetField,\n headers: req.headers,\n instructions,\n payload: req.payload,\n req,\n result: object,\n })\n }\n }\n },\n prompt: processedPrompt,\n provider: modelSettings.provider as string,\n providerOptions: {\n openai: {\n strictJsonSchema: true,\n },\n },\n schema: jsonSchema,\n system: systemToUse,\n temperature: modelSettings.temperature as number | undefined,\n })\n\n return streamResult\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 Error).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 // Image/video generation endpoint using payload.ai.generateMedia\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 as string,\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, unknown> = { 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 let { prompt: promptTemplate = '' } = instructions\n const { images: sampleImages = [] } = instructions\n const schemaPath = String(instructions['schema-path'])\n registerEditorHelper(req.payload, schemaPath)\n\n // Smart fallback: if prompt is generic, build a contextual prompt from field metadata\n if (isGenericPrompt(promptTemplate as string)) {\n promptTemplate = buildSmartPrompt({\n documentData: contextData,\n payload: req.payload,\n schemaPath,\n })\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n { smartPrompt: promptTemplate },\n `— AI Plugin: Using smart fallback prompt for ${schemaPath}`,\n )\n }\n }\n\n const extendedContext = extendContextWithPromptFields(\n contextData,\n { type: String(instructions['field-type']), collection: collectionSlug },\n pluginConfig,\n )\n const text = await replacePlaceholders(promptTemplate as string, extendedContext)\n const uploadCollectionSlug = instructions['relation-to']\n\n // Resolve @field:filename references from the prompt\n const { images: resolvedImages, processedPrompt } = await resolveImageReferences(\n text,\n contextData,\n req,\n collectionSlug,\n )\n\n // Extract hardcoded URLs from the processed prompt and merge with resolved images and sample images\n const images = [\n ...extractImageData(processedPrompt),\n ...resolvedImages,\n ...(sampleImages as unknown[]),\n ] as FetchableImage[]\n\n // Process images - convert to ImagePart format using helper\n const editImages: ImagePart[] = await fetchImages(req, images)\n\n let promptToUse = text\n let targetField: Field | null | undefined\n\n try {\n const targetCollection = req.payload.config.collections.find(\n (c) => c.slug === collectionSlug,\n )\n if (targetCollection && schemaPath) {\n targetField = getFieldBySchemaPath(targetCollection, schemaPath)\n }\n } catch (e) {\n req.payload.logger.error(e, '— AI Plugin: Error finding field for hooks')\n }\n\n if (targetField && (targetField as any).custom?.ai?.beforeGenerate) {\n const beforeHooks = (targetField as any).custom.ai.beforeGenerate as Array<\n (args: any) => Promise<any>\n >\n for (const hook of beforeHooks) {\n const result = await hook({\n doc: contextData,\n field: targetField,\n headers: req.headers,\n instructions,\n payload: req.payload,\n prompt: promptToUse,\n req,\n })\n\n if (result) {\n if (result.prompt) {\n promptToUse = result.prompt\n }\n if (result.instructions) {\n instructions = {\n ...instructions,\n ...result.instructions,\n }\n }\n }\n }\n }\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n { text: promptToUse },\n `— AI Plugin: Executing media generation`,\n )\n }\n\n // Prepare callback URL for async jobs\n const serverURL =\n req.payload.config?.serverURL ||\n process.env.SERVER_URL ||\n process.env.NEXT_PUBLIC_SERVER_URL\n\n const callbackUrl = serverURL\n ? `${serverURL.replace(/\\/$/, '')}/api${PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK}?instructionId=${instructionId}`\n : undefined\n\n // Get model settings\n // Re-evaluate settings name and settings in case instructions changed\n const modelId = instructions['model-id']\n const settingsName =\n modelId === 'image'\n ? 'image-settings'\n : modelId === 'video'\n ? 'video-settings'\n : modelId === 'tts'\n ? 'tts-settings'\n : undefined\n if (!settingsName) {\n throw new Error(`Unsupported model-id: ${modelId}`)\n }\n\n // Get model settings from instruction\n const instructionSettings = (instructions[settingsName] || {}) as Record<string, unknown>\n\n // Fallback to AISettings global defaults if instruction-level settings are missing\n let globalDefaults: Record<string, unknown> = {}\n if (!instructionSettings.provider || !instructionSettings.model) {\n try {\n const aiSettings = await req.payload.findGlobal({\n slug: 'ai-settings',\n context: { unsafe: true }, // Get decrypted values for internal use\n })\n\n // Map modelId to the corresponding default settings key\n const defaultsKey =\n modelId === 'image'\n ? 'image'\n : modelId === 'video'\n ? 'video'\n : modelId === 'tts'\n ? 'tts'\n : undefined\n\n if (defaultsKey && aiSettings?.defaults?.[defaultsKey]) {\n globalDefaults = aiSettings.defaults[defaultsKey] as Record<string, unknown>\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n { globalDefaults },\n `— AI Plugin: Using AISettings defaults for ${modelId}`,\n )\n }\n }\n } catch (e) {\n req.payload.logger.error(e, '— AI Plugin: Error fetching AISettings defaults')\n }\n }\n\n // Merge: instruction settings take priority over global defaults\n // Filter out null/undefined values so they don't overwrite valid defaults\n const filteredInstructionSettings = Object.fromEntries(\n Object.entries(instructionSettings).filter(([_, v]) => v != null),\n )\n const modelSettings = {\n ...globalDefaults,\n ...filteredInstructionSettings,\n }\n\n // Use payload.ai.generateMedia directly! 🎉\n const result = await req.payload.ai.generateMedia({\n callbackUrl,\n images: editImages,\n instructionId,\n model: modelSettings.model as string,\n prompt: promptToUse,\n provider: modelSettings.provider as string,\n ...modelSettings,\n })\n\n if (targetField && (targetField as any).custom?.ai?.afterGenerate) {\n const afterHooks = (targetField as any).custom.ai.afterGenerate as Array<\n (args: any) => Promise<any>\n >\n for (const hook of afterHooks) {\n await hook({\n doc: contextData,\n field: targetField,\n headers: req.headers,\n instructions,\n payload: req.payload,\n req,\n result,\n })\n }\n }\n\n // If model returned a file immediately, proceed with upload\n if (result && 'file' in result) {\n let assetData: { alt?: string; id: number | string }\n if (typeof pluginConfig.mediaUpload === 'function') {\n assetData = await pluginConfig.mediaUpload(result, {\n collection: uploadCollectionSlug as string,\n request: req,\n })\n } else {\n assetData = await req.payload.create({\n collection: uploadCollectionSlug as string,\n data: { alt: text },\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 }\n\n // Otherwise, assume async job launch\n if (result && ('jobId' in result || 'taskId' in result)) {\n const externalTaskId = result.jobId || result.taskId\n const status = result.status || 'queued'\n const progress = result.progress ?? 0\n\n // Create AI Job doc and return only its id\n const createdJob = await req.payload.create({\n collection: PLUGIN_AI_JOBS_TABLE,\n data: {\n instructionId,\n progress,\n status,\n task_id: externalTaskId,\n },\n overrideAccess: true,\n req,\n })\n\n return new Response(JSON.stringify({ job: { id: createdJob.id } }), {\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n throw new Error('Unexpected model response.')\n } catch (error) {\n req.payload.logger.error(\n // @ts-expect-error\n error?.type || (error as Error).message,\n 'Error generating upload: ',\n )\n const message =\n error && typeof error === 'object' && 'message' in error\n ? (error as Error).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 videogenWebhook: {\n handler: async (req: PayloadRequest) => {\n console.log('videogenWebhook --> ', req)\n try {\n const urlAll = new URL(req.url || '')\n const qpSecret = urlAll.searchParams.get('secret') || ''\n const headerSecret = req.headers.get('x-webhook-secret') || ''\n const falSecret = process.env.FAL_WEBHOOK_SECRET\n const legacySecret = process.env.VIDEOGEN_WEBHOOK_SECRET\n const provided = qpSecret || headerSecret\n // TODO: fal is failing because of auth but webhook seem to work\n if (!provided || (falSecret ? provided !== falSecret : provided !== legacySecret)) {\n return new Response('Unauthorized', { status: 401 })\n }\n\n const instructionId = urlAll.searchParams.get('instructionId')\n if (!instructionId) {\n throw new Error('instructionId missing')\n }\n\n const body = await req.json?.()\n // Normalize fal webhook payload\n const status: string | undefined =\n (body && (body.status || body.data?.status || body.response?.status)) || undefined\n const progress: number | undefined =\n (body && (body.progress ?? body.data?.progress ?? body.response?.progress)) ?? undefined\n const requestId: string | undefined =\n (body &&\n (body.taskId ||\n body.request_id ||\n body.gateway_request_id ||\n body.request?.request_id)) ||\n undefined\n const error = body?.error || body?.data?.error || body?.response?.error\n\n // Update AI Job row by task_id (and instructionId)\n const jobSearch = await req.payload.find({\n collection: PLUGIN_AI_JOBS_TABLE,\n depth: 0,\n limit: 1,\n where: {\n and: [\n { task_id: { equals: requestId } },\n { instructionId: { equals: instructionId } },\n ],\n },\n })\n\n const jobDoc = jobSearch.docs?.[0]\n if (jobDoc) {\n await req.payload.update({\n id: jobDoc.id,\n collection: PLUGIN_AI_JOBS_TABLE,\n data: {\n progress,\n status,\n task_id: requestId,\n },\n overrideAccess: true,\n req,\n })\n }\n\n console.log('fal webhook body: ', body)\n\n const videoUrl =\n body?.outputs?.[0]?.url ||\n body?.data?.outputs?.[0]?.url ||\n body?.video?.url ||\n body?.data?.video?.url ||\n body?.response?.video?.url ||\n body?.videos?.[0]?.url ||\n body?.data?.videos?.[0]?.url\n\n if (status === 'completed' && videoUrl) {\n // Fetch the related instruction to get upload collection\n const instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n req,\n })\n\n const uploadCollectionSlug = instructions['relation-to']\n\n const videoResp = await fetch(videoUrl)\n if (!videoResp.ok) {\n throw new Error(`Failed to fetch output: ${videoResp.status}`)\n }\n const buffer = Buffer.from(await videoResp.arrayBuffer())\n\n const created = await req.payload.create({\n collection: uploadCollectionSlug,\n data: { alt: 'video generation' },\n file: {\n name: 'video_generation.mp4',\n data: buffer,\n mimetype: 'video/mp4',\n size: buffer.byteLength,\n },\n overrideAccess: true,\n req,\n })\n\n // Persist the result on the AI Job record\n if (jobDoc) {\n await req.payload.update({\n id: jobDoc.id,\n collection: PLUGIN_AI_JOBS_TABLE,\n data: {\n progress: 100,\n result_id: created?.id,\n status: 'completed',\n },\n overrideAccess: true,\n req,\n })\n }\n }\n\n if (status === 'failed' && error) {\n req.payload.logger.error(error, 'Video generation failed: ')\n }\n\n return new Response(JSON.stringify({ ok: true }), {\n headers: { 'Content-Type': 'application/json' },\n })\n } catch (error) {\n req.payload.logger.error(error, 'Error in videogen webhook: ')\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: 500,\n })\n }\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK,\n },\n }) satisfies Endpoints\n"],"names":["process","checkAccess","filterEditorSchemaByNodes","PLUGIN_AI_JOBS_TABLE","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","registerEditorHelper","replacePlaceholders","buildSmartPrompt","isGenericPrompt","extractImageData","fetchImages","fieldToJsonSchema","getFieldBySchemaPath","resolveImageReferences","assignPrompt","extendContextWithPromptFields","endpoints","pluginConfig","textarea","handler","req","data","json","allowedEditorNodes","locale","options","action","actionParams","instructionId","contextData","doc","Error","instructions","payload","findByID","id","collection","collections","config","find","slug","custom","editorConfig","admin","schema","editorSchema","prompt","promptTemplate","schemaPath","String","documentData","debugging","logger","info","smartPrompt","allowedEditorSchema","length","receivedNodes","remainingDefinitions","Object","keys","definitions","parts","split","collectionName","fieldName","defaultLocale","locales","localization","localeData","l","code","localeInfo","label","prompts","type","context","field","layout","systemPrompt","system","template","jsonSchema","targetField","targetCollection","c","supported","t","includes","arraySettings","count","modifiedField","maxRows","minRows","nameOverride","e","error","settingsName","undefined","modelSettings","images","resolvedImages","processedPrompt","hardcodedImages","allImages","imageParts","promptToUse","systemToUse","ai","beforeGenerate","beforeHooks","hook","result","headers","streamResult","streamObject","maxTokens","model","onFinish","object","afterGenerate","afterHooks","provider","providerOptions","openai","strictJsonSchema","temperature","message","Response","JSON","stringify","status","method","path","upload","collectionSlug","documentId","docData","draft","sampleImages","extendedContext","text","uploadCollectionSlug","editImages","serverURL","env","SERVER_URL","NEXT_PUBLIC_SERVER_URL","callbackUrl","replace","modelId","instructionSettings","globalDefaults","aiSettings","findGlobal","unsafe","defaultsKey","defaults","filteredInstructionSettings","fromEntries","entries","filter","_","v","generateMedia","assetData","mediaUpload","request","create","alt","file","externalTaskId","jobId","taskId","progress","createdJob","task_id","overrideAccess","job","videogenWebhook","console","log","urlAll","URL","url","qpSecret","searchParams","get","headerSecret","falSecret","FAL_WEBHOOK_SECRET","legacySecret","VIDEOGEN_WEBHOOK_SECRET","provided","body","response","requestId","request_id","gateway_request_id","jobSearch","depth","limit","where","and","equals","jobDoc","docs","update","videoUrl","outputs","video","videos","videoResp","fetch","ok","buffer","Buffer","from","arrayBuffer","created","name","mimetype","size","byteLength","result_id"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type { GenerateArgs } from './ai/index.js';
|
|
2
|
-
export { defaultPrompts
|
|
2
|
+
export { defaultPrompts } from './ai/prompts.js';
|
|
3
3
|
export { PayloadAiPluginLexicalEditorFeature } from './fields/LexicalEditor/feature.server.js';
|
|
4
4
|
export type {} from './payload-ai.d.ts';
|
|
5
5
|
export { payloadAiPlugin } from './plugin.js';
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { defaultPrompts
|
|
1
|
+
export { defaultPrompts } from './ai/prompts.js';
|
|
2
2
|
export { PayloadAiPluginLexicalEditorFeature } from './fields/LexicalEditor/feature.server.js';
|
|
3
3
|
export { payloadAiPlugin } from './plugin.js';
|
|
4
4
|
export { fieldToJsonSchema } from './utilities/fieldToJsonSchema.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type { GenerateArgs } from './ai/index.js'\n\nexport { defaultPrompts
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type { GenerateArgs } from './ai/index.js'\n\nexport { defaultPrompts } from './ai/prompts.js'\n\nexport { PayloadAiPluginLexicalEditorFeature } from './fields/LexicalEditor/feature.server.js'\n// Re-export to ensure payload.ai module augmentation is included\nexport type {} from './payload-ai.d.ts'\n\nexport { payloadAiPlugin } from './plugin.js'\nexport { fieldToJsonSchema } from './utilities/fieldToJsonSchema.js'\n"],"names":["defaultPrompts","PayloadAiPluginLexicalEditorFeature","payloadAiPlugin","fieldToJsonSchema"],"mappings":"AAEA,SAASA,cAAc,QAAQ,kBAAiB;AAEhD,SAASC,mCAAmC,QAAQ,2CAA0C;AAI9F,SAASC,eAAe,QAAQ,cAAa;AAC7C,SAASC,iBAAiB,QAAQ,mCAAkC"}
|