@ai-stack/payloadcms 3.68.0-beta.1 → 3.68.0-beta.2

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 (97) hide show
  1. package/dist/ai/core/media/image/handlers/multimodal.js +5 -0
  2. package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -1
  3. package/dist/ai/core/streamObject.js +0 -3
  4. package/dist/ai/core/streamObject.js.map +1 -1
  5. package/dist/ai/providers/blocks/anthropic.js +2 -1
  6. package/dist/ai/providers/blocks/anthropic.js.map +1 -1
  7. package/dist/ai/providers/blocks/elevenlabs.js +2 -1
  8. package/dist/ai/providers/blocks/elevenlabs.js.map +1 -1
  9. package/dist/ai/providers/blocks/fal.js +2 -1
  10. package/dist/ai/providers/blocks/fal.js.map +1 -1
  11. package/dist/ai/providers/blocks/google.js +2 -1
  12. package/dist/ai/providers/blocks/google.js.map +1 -1
  13. package/dist/ai/providers/blocks/openai-compatible.js +2 -1
  14. package/dist/ai/providers/blocks/openai-compatible.js.map +1 -1
  15. package/dist/ai/providers/blocks/openai.js +2 -1
  16. package/dist/ai/providers/blocks/openai.js.map +1 -1
  17. package/dist/ai/providers/blocks/xai.js +2 -1
  18. package/dist/ai/providers/blocks/xai.js.map +1 -1
  19. package/dist/ai/providers/icons.d.ts +7 -0
  20. package/dist/ai/providers/icons.js +9 -0
  21. package/dist/ai/providers/icons.js.map +1 -0
  22. package/dist/ai/providers/registry.js +34 -23
  23. package/dist/ai/providers/registry.js.map +1 -1
  24. package/dist/collections/Instructions.js +37 -0
  25. package/dist/collections/Instructions.js.map +1 -1
  26. package/dist/endpoints/chat.d.ts +4 -0
  27. package/dist/endpoints/index.js +86 -10
  28. package/dist/endpoints/index.js.map +1 -1
  29. package/dist/exports/fields.d.ts +1 -0
  30. package/dist/exports/fields.js +1 -0
  31. package/dist/exports/fields.js.map +1 -1
  32. package/dist/fields/ArrayComposeField/ArrayComposeField.d.ts +15 -0
  33. package/dist/fields/ArrayComposeField/ArrayComposeField.js +87 -0
  34. package/dist/fields/ArrayComposeField/ArrayComposeField.js.map +1 -0
  35. package/dist/fields/ArrayComposeField/ArrayComposeField.jsx +73 -0
  36. package/dist/fields/PromptEditorField/PromptEditorField.js +7 -2
  37. package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
  38. package/dist/fields/PromptEditorField/PromptEditorField.jsx +5 -2
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.js +1 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/init.js +23 -6
  43. package/dist/init.js.map +1 -1
  44. package/dist/payload-ai.d.ts +149 -0
  45. package/dist/providers/InstructionsProvider/InstructionsProvider.js +3 -0
  46. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  47. package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +3 -0
  48. package/dist/providers/InstructionsProvider/useInstructions.js +18 -1
  49. package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
  50. package/dist/styles.d.ts +11 -0
  51. package/dist/types/handlebars-async-helpers.d.ts +1 -0
  52. package/dist/types/handlebars-dist-handlebars.d.ts +1 -0
  53. package/dist/types/react-mentions.d.ts +1 -0
  54. package/dist/ui/Compose/Compose.d.ts +1 -0
  55. package/dist/ui/Compose/Compose.js +2 -2
  56. package/dist/ui/Compose/Compose.js.map +1 -1
  57. package/dist/ui/Compose/Compose.jsx +2 -2
  58. package/dist/ui/Compose/UndoRedoActions.d.ts +2 -2
  59. package/dist/ui/Compose/UndoRedoActions.js +8 -5
  60. package/dist/ui/Compose/UndoRedoActions.js.map +1 -1
  61. package/dist/ui/Compose/UndoRedoActions.jsx +6 -5
  62. package/dist/ui/Compose/compose.module.css +56 -16
  63. package/dist/ui/Compose/hooks/menu/itemsMap.js +12 -6
  64. package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
  65. package/dist/ui/Compose/hooks/menu/useMenu.js +26 -15
  66. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  67. package/dist/ui/Compose/hooks/menu/useMenu.jsx +25 -12
  68. package/dist/ui/Compose/hooks/useHistory.d.ts +0 -1
  69. package/dist/ui/Compose/hooks/useHistory.js +65 -25
  70. package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
  71. package/dist/ui/DynamicVoiceSelect/index.js +63 -11
  72. package/dist/ui/DynamicVoiceSelect/index.js.map +1 -1
  73. package/dist/ui/DynamicVoiceSelect/index.jsx +47 -14
  74. package/dist/ui/VoicesFetcher/index.js +54 -8
  75. package/dist/ui/VoicesFetcher/index.js.map +1 -1
  76. package/dist/ui/VoicesFetcher/index.jsx +32 -9
  77. package/dist/utilities/buildSmartPrompt.d.ts +22 -0
  78. package/dist/utilities/buildSmartPrompt.js +143 -0
  79. package/dist/utilities/buildSmartPrompt.js.map +1 -0
  80. package/dist/utilities/resolveImageReferences.d.ts +3 -1
  81. package/dist/utilities/resolveImageReferences.js +21 -2
  82. package/dist/utilities/resolveImageReferences.js.map +1 -1
  83. package/dist/utilities/updateFieldsConfig.js +7 -1
  84. package/dist/utilities/updateFieldsConfig.js.map +1 -1
  85. package/package.json +3 -3
  86. package/dist/endpoints/chat.d.js +0 -3
  87. package/dist/endpoints/chat.d.js.map +0 -1
  88. package/dist/payload-ai.d.js +0 -3
  89. package/dist/payload-ai.d.js.map +0 -1
  90. package/dist/styles.d.js +0 -2
  91. package/dist/styles.d.js.map +0 -1
  92. package/dist/types/handlebars-async-helpers.d.js +0 -2
  93. package/dist/types/handlebars-async-helpers.d.js.map +0 -1
  94. package/dist/types/handlebars-dist-handlebars.d.js +0 -2
  95. package/dist/types/handlebars-dist-handlebars.d.js.map +0 -1
  96. package/dist/types/react-mentions.d.js +0 -2
  97. package/dist/types/react-mentions.d.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ai/providers/registry.ts"],"sourcesContent":["import type { LanguageModel } from 'ai'\nimport type { Payload } from 'payload'\n\nexport type { ProviderId } from './types.js'\n\nimport { createAnthropic } from '@ai-sdk/anthropic'\nimport { createElevenLabs } from '@ai-sdk/elevenlabs'\nimport { fal } from '@ai-sdk/fal'\nimport { createGoogleGenerativeAI } from '@ai-sdk/google'\nimport { createOpenAI } from '@ai-sdk/openai'\nimport { createOpenAICompatible } from '@ai-sdk/openai-compatible'\nimport { createXai } from '@ai-sdk/xai'\nimport * as process from 'node:process'\n\nimport type {\n AIProvider,\n AISettingsData,\n AnthropicBlockData,\n ElevenLabsBlockData,\n FalBlockData,\n GoogleBlockData,\n OpenAIBlockData,\n OpenAICompatibleBlockData,\n ProviderBlockData,\n ProviderRegistry,\n XAIBlockData,\n} from './types.js'\n\n// Type-safe provider factory functions\nconst providerFactories = {\n anthropic: (block: AnthropicBlockData) =>\n createAnthropic({\n apiKey: block.apiKey,\n }),\n\n elevenlabs: (block: ElevenLabsBlockData) =>\n createElevenLabs({\n apiKey: block.apiKey,\n }),\n\n fal: (block: FalBlockData) => {\n // Fal uses global instance, configure with apiKey\n process.env.FAL_KEY = block.apiKey\n if (block.webhookSecret) {\n process.env.FAL_WEBHOOK_SECRET = block.webhookSecret\n }\n return fal\n },\n\n google: (block: GoogleBlockData) =>\n createGoogleGenerativeAI({\n apiKey: block.apiKey,\n }),\n\n openai: (block: OpenAIBlockData) =>\n createOpenAI({\n apiKey: block.apiKey,\n baseURL: block.baseURL || 'https://api.openai.com/v1',\n organization: block.organization,\n }),\n\n 'openai-compatible': (block: OpenAICompatibleBlockData) => {\n console.log('OpenAI compatible, ', block)\n return createOpenAICompatible({\n name: block.providerName,\n apiKey: block.apiKey || '',\n baseURL: block.baseURL,\n })\n },\n\n xai: (block: XAIBlockData) =>\n createXai({\n apiKey: block.apiKey,\n }),\n}\n\n/**\n * Type guard to check provider block type\n */\nfunction isProviderBlock<T extends ProviderBlockData>(\n block: ProviderBlockData,\n blockType: T['blockType'],\n): block is T {\n return block.blockType === blockType\n}\n\n/**\n * Load provider registry from AI Settings (type-safe)\n */\nexport async function getProviderRegistry(payload: Payload): Promise<ProviderRegistry> {\n const settings = (await payload.findGlobal({\n slug: 'ai-settings',\n context: { unsafe: true },\n })) as unknown as AISettingsData\n\n const registry: ProviderRegistry = {}\n // console.log('settings - >', JSON.stringify(settings, null, 2))\n for (const providerBlock of settings.providers || []) {\n if (!providerBlock.enabled) {\n continue\n }\n\n const { blockType } = providerBlock\n\n // Type-safe factory lookup and invocation\n let factory: (() => any) | undefined\n\n if (isProviderBlock<OpenAIBlockData>(providerBlock, 'openai')) {\n factory = () => providerFactories.openai(providerBlock)\n } else if (isProviderBlock<AnthropicBlockData>(providerBlock, 'anthropic')) {\n factory = () => providerFactories.anthropic(providerBlock)\n } else if (isProviderBlock<GoogleBlockData>(providerBlock, 'google')) {\n factory = () => providerFactories.google(providerBlock)\n } else if (isProviderBlock<XAIBlockData>(providerBlock, 'xai')) {\n factory = () => providerFactories.xai(providerBlock)\n } else if (isProviderBlock<FalBlockData>(providerBlock, 'fal')) {\n factory = () => providerFactories.fal(providerBlock)\n } else if (isProviderBlock<ElevenLabsBlockData>(providerBlock, 'elevenlabs')) {\n factory = () => providerFactories.elevenlabs(providerBlock)\n } else if (isProviderBlock<OpenAICompatibleBlockData>(providerBlock, 'openai-compatible')) {\n factory = () => providerFactories['openai-compatible'](providerBlock)\n }\n\n if (!factory) {\n console.warn(`No factory for provider: ${blockType}`)\n continue\n }\n\n // Filter enabled models only\n const enabledModels = providerBlock.models.filter((m) => m.enabled)\n\n // Extract provider options\n const options = {\n image:\n 'imageProviderOptions' in providerBlock ? providerBlock.imageProviderOptions : undefined,\n text: 'textProviderOptions' in providerBlock ? providerBlock.textProviderOptions : undefined,\n tts: 'ttsProviderOptions' in providerBlock ? providerBlock.ttsProviderOptions : undefined,\n }\n\n registry[blockType] = {\n id: blockType,\n name: 'providerName' in providerBlock ? providerBlock.providerName : blockType,\n apiKey: 'apiKey' in providerBlock ? providerBlock.apiKey : undefined,\n enabled: true,\n factory,\n instance: blockType === 'fal' ? fal : undefined,\n models: enabledModels,\n options,\n }\n }\n\n return registry\n}\n\n/**\n * Get global defaults from AI Settings\n */\nexport async function getGlobalDefaults(payload: Payload) {\n const settings = (await payload.findGlobal({\n slug: 'ai-settings',\n })) as unknown as AISettingsData\n return settings.defaults\n}\n\n/**\n * Get language model (type-safe, async)\n */\nexport async function getLanguageModel(\n payload: Payload,\n providerId?: string,\n modelId?: string,\n options?: Record<string, any>,\n): Promise<LanguageModel> {\n if (!providerId || !modelId) {\n const defaults = await getGlobalDefaults(payload)\n if (!providerId) {\n providerId = defaults?.text?.provider\n }\n if (!modelId) {\n modelId = defaults?.text?.model\n }\n }\n\n // Extract global default options if we are using the default provider\n let globalDefaultOptions = {}\n if (providerId) {\n const defaults = await getGlobalDefaults(payload)\n if (defaults?.text?.provider === providerId) {\n globalDefaultOptions = defaults?.text?.options || {}\n }\n }\n\n if (!providerId || !modelId) {\n throw new Error('Provider and model must be specified or configured in defaults')\n }\n\n const registry = await getProviderRegistry(payload)\n const provider = registry[providerId]\n\n if (!provider) {\n throw new Error(`Provider ${providerId} not found in registry`)\n }\n\n if (!provider.enabled) {\n throw new Error(`Provider ${providerId} is not enabled`)\n }\n\n let providerInstance: any\n if (provider.instance) {\n providerInstance = provider.instance\n } else if (provider.factory) {\n providerInstance = provider.factory()\n } else {\n throw new Error(`Provider ${providerId} has no factory or instance`)\n }\n\n // Merge default settings with override options\n const finalOptions = {\n ...(provider.options?.text || {}),\n ...globalDefaultOptions,\n ...(options || {}),\n }\n\n return providerInstance(modelId, finalOptions)\n}\n\nexport async function getImageModel(\n payload: Payload,\n providerId?: string,\n modelId?: string,\n options?: Record<string, any>,\n isMultimodalText?: boolean,\n) {\n if (!providerId || !modelId) {\n const defaults = await getGlobalDefaults(payload)\n if (!providerId) {\n providerId = defaults?.image?.provider\n }\n if (!modelId) {\n modelId = defaults?.image?.model\n }\n }\n\n // Extract global default options if we are using the default provider\n let globalDefaultOptions = {}\n if (providerId) {\n const defaults = await getGlobalDefaults(payload)\n if (defaults?.image?.provider === providerId) {\n globalDefaultOptions = defaults?.image?.options || {}\n }\n }\n\n if (!providerId || !modelId) {\n throw new Error('Provider and model must be specified or configured in defaults')\n }\n\n const registry = await getProviderRegistry(payload)\n const provider = registry[providerId]\n\n if (!provider) {\n throw new Error(`Provider ${providerId} not found`)\n }\n\n // Merge default settings with override options\n const finalOptions = {\n ...(provider.options?.image || {}),\n ...globalDefaultOptions,\n ...(options || {}),\n }\n\n if (provider.instance) {\n return provider.instance\n }\n\n if (provider.factory) {\n console.log('modelId: ', modelId)\n const instance = provider.factory()\n\n // Type-safe check for image support\n if (\n !isMultimodalText &&\n typeof instance === 'function' &&\n 'image' in instance &&\n typeof instance.image === 'function'\n ) {\n return instance.image(modelId, finalOptions)\n }\n\n // Also check if instance is an object with image method\n if (\n typeof instance === 'object' &&\n instance !== null &&\n 'image' in instance &&\n !isMultimodalText\n ) {\n return (instance as AIProvider).image?.(modelId, finalOptions)\n }\n\n // Fallback for providers that might return the model directly or use the default factory\n return typeof instance === 'function' ? instance(modelId, finalOptions) : instance\n }\n\n throw new Error(`Invalid provider configuration for ${providerId}`)\n}\n\nexport async function getTTSModel(\n payload: Payload,\n providerId?: string,\n modelId?: string,\n options?: Record<string, any>,\n) {\n if (!providerId || !modelId) {\n const defaults = await getGlobalDefaults(payload)\n if (!providerId) {\n providerId = defaults?.tts?.provider\n }\n if (!modelId) {\n modelId = defaults?.tts?.model\n }\n }\n\n // Extract global default options if we are using the default provider\n let globalDefaultOptions = {}\n if (providerId) {\n const defaults = await getGlobalDefaults(payload)\n if (defaults?.tts?.provider === providerId) {\n globalDefaultOptions = defaults?.tts?.options || {}\n }\n }\n\n if (!providerId || !modelId) {\n throw new Error('Provider and model must be specified or configured in defaults')\n }\n\n const registry = await getProviderRegistry(payload)\n const provider = registry[providerId]\n\n if (!provider) {\n throw new Error(`Provider ${providerId} not found`)\n }\n\n // Merge default settings with override options\n const finalOptions = {\n ...(provider.options?.tts || {}),\n ...globalDefaultOptions,\n ...(options || {}),\n }\n\n if (provider.factory) {\n const instance = provider.factory()\n if (instance?.speech) {\n return instance.speech(modelId, finalOptions)\n }\n return typeof instance === 'function' ? instance(modelId, finalOptions) : instance\n }\n\n throw new Error(`Invalid provider configuration for ${providerId}`)\n}\n"],"names":["createAnthropic","createElevenLabs","fal","createGoogleGenerativeAI","createOpenAI","createOpenAICompatible","createXai","process","providerFactories","anthropic","block","apiKey","elevenlabs","env","FAL_KEY","webhookSecret","FAL_WEBHOOK_SECRET","google","openai","baseURL","organization","console","log","name","providerName","xai","isProviderBlock","blockType","getProviderRegistry","payload","settings","findGlobal","slug","context","unsafe","registry","providerBlock","providers","enabled","factory","warn","enabledModels","models","filter","m","options","image","imageProviderOptions","undefined","text","textProviderOptions","tts","ttsProviderOptions","id","instance","getGlobalDefaults","defaults","getLanguageModel","providerId","modelId","provider","model","globalDefaultOptions","Error","providerInstance","finalOptions","getImageModel","isMultimodalText","getTTSModel","speech"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/ai/providers/registry.ts"],"sourcesContent":["import type { LanguageModel } from 'ai'\nimport type { Payload } from 'payload'\n\nexport type { ProviderId } from './types.js'\n\nimport * as process from 'node:process'\n\nimport type {\n AIProvider,\n AISettingsData,\n AnthropicBlockData,\n ElevenLabsBlockData,\n FalBlockData,\n GoogleBlockData,\n OpenAIBlockData,\n OpenAICompatibleBlockData,\n ProviderBlockData,\n ProviderRegistry,\n XAIBlockData,\n} from './types.js'\n\n// Type-safe provider factory functions\nconst providerFactories = {\n anthropic: async (block: AnthropicBlockData) => {\n const { createAnthropic } = await import('@ai-sdk/anthropic')\n return createAnthropic({\n apiKey: block.apiKey,\n })\n },\n\n elevenlabs: async (block: ElevenLabsBlockData) => {\n const { createElevenLabs } = await import('@ai-sdk/elevenlabs')\n return createElevenLabs({\n apiKey: block.apiKey,\n })\n },\n\n fal: async (block: FalBlockData) => {\n const { fal } = await import('@ai-sdk/fal')\n // Fal uses global instance, configure with apiKey\n process.env.FAL_KEY = block.apiKey\n if (block.webhookSecret) {\n process.env.FAL_WEBHOOK_SECRET = block.webhookSecret\n }\n return fal\n },\n\n google: async (block: GoogleBlockData) => {\n const { createGoogleGenerativeAI } = await import('@ai-sdk/google')\n return createGoogleGenerativeAI({\n apiKey: block.apiKey,\n })\n },\n\n openai: async (block: OpenAIBlockData) => {\n const { createOpenAI } = await import('@ai-sdk/openai')\n return createOpenAI({\n apiKey: block.apiKey,\n baseURL: block.baseURL || 'https://api.openai.com/v1',\n organization: block.organization,\n })\n },\n\n 'openai-compatible': async (block: OpenAICompatibleBlockData) => {\n console.log('OpenAI compatible, ', block)\n const { createOpenAICompatible } = await import('@ai-sdk/openai-compatible')\n return createOpenAICompatible({\n name: block.providerName,\n apiKey: block.apiKey || '',\n baseURL: block.baseURL,\n })\n },\n\n xai: async (block: XAIBlockData) => {\n const { createXai } = await import('@ai-sdk/xai')\n return createXai({\n apiKey: block.apiKey,\n })\n },\n}\n\n/**\n * Type guard to check provider block type\n */\nfunction isProviderBlock<T extends ProviderBlockData>(\n block: ProviderBlockData,\n blockType: T['blockType'],\n): block is T {\n return block.blockType === blockType\n}\n\n/**\n * Load provider registry from AI Settings (type-safe)\n */\nexport async function getProviderRegistry(payload: Payload): Promise<ProviderRegistry> {\n const settings = (await payload.findGlobal({\n slug: 'ai-settings',\n context: { unsafe: true },\n })) as unknown as AISettingsData\n\n const registry: ProviderRegistry = {}\n // console.log('settings - >', JSON.stringify(settings, null, 2))\n for (const providerBlock of settings.providers || []) {\n if (!providerBlock.enabled) {\n continue\n }\n\n const { blockType } = providerBlock\n\n // Type-safe factory lookup and invocation\n let factory: (() => Promise<any>) | undefined\n\n if (isProviderBlock<OpenAIBlockData>(providerBlock, 'openai')) {\n factory = () => providerFactories.openai(providerBlock)\n } else if (isProviderBlock<AnthropicBlockData>(providerBlock, 'anthropic')) {\n factory = () => providerFactories.anthropic(providerBlock)\n } else if (isProviderBlock<GoogleBlockData>(providerBlock, 'google')) {\n factory = () => providerFactories.google(providerBlock)\n } else if (isProviderBlock<XAIBlockData>(providerBlock, 'xai')) {\n factory = () => providerFactories.xai(providerBlock)\n } else if (isProviderBlock<FalBlockData>(providerBlock, 'fal')) {\n factory = () => providerFactories.fal(providerBlock)\n } else if (isProviderBlock<ElevenLabsBlockData>(providerBlock, 'elevenlabs')) {\n factory = () => providerFactories.elevenlabs(providerBlock)\n } else if (isProviderBlock<OpenAICompatibleBlockData>(providerBlock, 'openai-compatible')) {\n factory = () => providerFactories['openai-compatible'](providerBlock)\n }\n\n if (!factory) {\n console.warn(`No factory for provider: ${blockType}`)\n continue\n }\n\n // Filter enabled models only\n const enabledModels = providerBlock.models.filter((m) => m.enabled)\n\n // Extract provider options\n const options = {\n image:\n 'imageProviderOptions' in providerBlock ? providerBlock.imageProviderOptions : undefined,\n text: 'textProviderOptions' in providerBlock ? providerBlock.textProviderOptions : undefined,\n tts: 'ttsProviderOptions' in providerBlock ? providerBlock.ttsProviderOptions : undefined,\n }\n\n registry[blockType] = {\n id: blockType,\n name: 'providerName' in providerBlock ? providerBlock.providerName : blockType,\n apiKey: 'apiKey' in providerBlock ? providerBlock.apiKey : undefined,\n enabled: true,\n factory,\n instance: undefined, // Fal is now loaded dynamically via factory\n models: enabledModels,\n options,\n }\n }\n\n return registry\n}\n\n/**\n * Get global defaults from AI Settings\n */\nexport async function getGlobalDefaults(payload: Payload) {\n const settings = (await payload.findGlobal({\n slug: 'ai-settings',\n })) as unknown as AISettingsData\n return settings.defaults\n}\n\n/**\n * Get language model (type-safe, async)\n */\nexport async function getLanguageModel(\n payload: Payload,\n providerId?: string,\n modelId?: string,\n options?: Record<string, any>,\n): Promise<LanguageModel> {\n if (!providerId || !modelId) {\n const defaults = await getGlobalDefaults(payload)\n if (!providerId) {\n providerId = defaults?.text?.provider\n }\n if (!modelId) {\n modelId = defaults?.text?.model\n }\n }\n\n // Extract global default options if we are using the default provider\n let globalDefaultOptions = {}\n if (providerId) {\n const defaults = await getGlobalDefaults(payload)\n if (defaults?.text?.provider === providerId) {\n globalDefaultOptions = defaults?.text?.options || {}\n }\n }\n\n if (!providerId || !modelId) {\n throw new Error('Provider and model must be specified or configured in defaults')\n }\n\n const registry = await getProviderRegistry(payload)\n const provider = registry[providerId]\n\n if (!provider) {\n throw new Error(`Provider ${providerId} not found in registry`)\n }\n\n if (!provider.enabled) {\n throw new Error(`Provider ${providerId} is not enabled`)\n }\n\n // We only support factory now for dynamic loading, instance is legacy/cache\n let providerInstance: any\n if (provider.instance) {\n providerInstance = provider.instance\n } else if (provider.factory) {\n providerInstance = await provider.factory()\n } else {\n throw new Error(`Provider ${providerId} has no factory or instance`)\n }\n\n // Merge default settings with override options\n const finalOptions = {\n ...(provider.options?.text || {}),\n ...globalDefaultOptions,\n ...(options || {}),\n }\n\n return providerInstance(modelId, finalOptions)\n}\n\nexport async function getImageModel(\n payload: Payload,\n providerId?: string,\n modelId?: string,\n options?: Record<string, any>,\n isMultimodalText?: boolean,\n) {\n if (!providerId || !modelId) {\n const defaults = await getGlobalDefaults(payload)\n if (!providerId) {\n providerId = defaults?.image?.provider\n }\n if (!modelId) {\n modelId = defaults?.image?.model\n }\n }\n\n // Extract global default options if we are using the default provider\n let globalDefaultOptions = {}\n if (providerId) {\n const defaults = await getGlobalDefaults(payload)\n if (defaults?.image?.provider === providerId) {\n globalDefaultOptions = defaults?.image?.options || {}\n }\n }\n\n if (!providerId || !modelId) {\n throw new Error('Provider and model must be specified or configured in defaults')\n }\n\n const registry = await getProviderRegistry(payload)\n const provider = registry[providerId]\n\n if (!provider) {\n throw new Error(`Provider ${providerId} not found`)\n }\n\n // Merge default settings with override options\n const finalOptions = {\n ...(provider.options?.image || {}),\n ...globalDefaultOptions,\n ...(options || {}),\n }\n\n if (provider.instance) {\n return provider.instance\n }\n\n if (provider.factory) {\n console.log('modelId: ', modelId)\n const instance = await provider.factory()\n\n // Type-safe check for image support\n if (\n !isMultimodalText &&\n typeof instance === 'function' &&\n 'image' in instance &&\n typeof instance.image === 'function'\n ) {\n return instance.image(modelId, finalOptions)\n }\n\n // Also check if instance is an object with image method\n if (\n typeof instance === 'object' &&\n instance !== null &&\n 'image' in instance &&\n !isMultimodalText\n ) {\n return (instance as AIProvider).image?.(modelId, finalOptions)\n }\n\n // Fallback for providers that might return the model directly or use the default factory\n return typeof instance === 'function' ? instance(modelId, finalOptions) : instance\n }\n\n throw new Error(`Invalid provider configuration for ${providerId}`)\n}\n\nexport async function getTTSModel(\n payload: Payload,\n providerId?: string,\n modelId?: string,\n options?: Record<string, any>,\n) {\n if (!providerId || !modelId) {\n const defaults = await getGlobalDefaults(payload)\n if (!providerId) {\n providerId = defaults?.tts?.provider\n }\n if (!modelId) {\n modelId = defaults?.tts?.model\n }\n }\n\n // Extract global default options if we are using the default provider\n let globalDefaultOptions = {}\n if (providerId) {\n const defaults = await getGlobalDefaults(payload)\n if (defaults?.tts?.provider === providerId) {\n globalDefaultOptions = defaults?.tts?.options || {}\n }\n }\n\n if (!providerId || !modelId) {\n throw new Error('Provider and model must be specified or configured in defaults')\n }\n\n const registry = await getProviderRegistry(payload)\n const provider = registry[providerId]\n\n if (!provider) {\n throw new Error(`Provider ${providerId} not found`)\n }\n\n // Merge default settings with override options\n const finalOptions = {\n ...(provider.options?.tts || {}),\n ...globalDefaultOptions,\n ...(options || {}),\n }\n\n if (provider.factory) {\n const instance = await provider.factory()\n if (instance?.speech) {\n return instance.speech(modelId, finalOptions)\n }\n return typeof instance === 'function' ? instance(modelId, finalOptions) : instance\n }\n\n throw new Error(`Invalid provider configuration for ${providerId}`)\n}\n"],"names":["process","providerFactories","anthropic","block","createAnthropic","apiKey","elevenlabs","createElevenLabs","fal","env","FAL_KEY","webhookSecret","FAL_WEBHOOK_SECRET","google","createGoogleGenerativeAI","openai","createOpenAI","baseURL","organization","console","log","createOpenAICompatible","name","providerName","xai","createXai","isProviderBlock","blockType","getProviderRegistry","payload","settings","findGlobal","slug","context","unsafe","registry","providerBlock","providers","enabled","factory","warn","enabledModels","models","filter","m","options","image","imageProviderOptions","undefined","text","textProviderOptions","tts","ttsProviderOptions","id","instance","getGlobalDefaults","defaults","getLanguageModel","providerId","modelId","provider","model","globalDefaultOptions","Error","providerInstance","finalOptions","getImageModel","isMultimodalText","getTTSModel","speech"],"mappings":"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"}
@@ -30,6 +30,13 @@ const CAPABILITIES = [
30
30
  fields: [
31
31
  'upload'
32
32
  ]
33
+ },
34
+ {
35
+ id: 'array',
36
+ name: 'Array Generation',
37
+ fields: [
38
+ 'array'
39
+ ]
33
40
  }
34
41
  ];
35
42
  const defaultAccessConfig = {
@@ -174,6 +181,10 @@ export const instructionsCollection = (pluginConfig)=>({
174
181
  {
175
182
  label: 'richText',
176
183
  value: 'richText'
184
+ },
185
+ {
186
+ label: 'array',
187
+ value: 'array'
177
188
  }
178
189
  ]
179
190
  },
@@ -391,6 +402,32 @@ informative and accurate but also captivating and beautifully structured.`,
391
402
  providerOptionsJson
392
403
  ],
393
404
  label: 'TTS Settings'
405
+ },
406
+ // Array Settings
407
+ // Array Settings
408
+ {
409
+ name: 'array-settings',
410
+ type: 'group',
411
+ admin: {
412
+ condition: (data)=>data['model-id'] === 'array'
413
+ },
414
+ fields: [
415
+ providerSelect,
416
+ modelSelect,
417
+ {
418
+ name: 'count',
419
+ type: 'number',
420
+ admin: {
421
+ description: 'Number of items to generate'
422
+ },
423
+ defaultValue: 3,
424
+ label: 'Items to Generate',
425
+ max: 20,
426
+ min: 1
427
+ },
428
+ providerOptionsJson
429
+ ],
430
+ label: 'Array Settings'
394
431
  }
395
432
  ]
396
433
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/collections/Instructions.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\nimport type { PluginConfig } from 'src/types.js'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\n\n// Defined capabilities replacing src/ai/models/\nconst CAPABILITIES = [\n {\n id: 'text',\n name: 'Text Generation',\n fields: ['text', 'textarea'],\n },\n {\n id: 'richtext',\n name: 'Rich Text Generation',\n fields: ['richText'],\n },\n {\n id: 'image',\n name: 'Image Generation',\n fields: ['upload'],\n },\n {\n id: 'tts',\n name: 'Text to Speech',\n fields: ['upload'],\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\nconst providerSelect = {\n name: 'provider',\n type: 'text' as const,\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Provider',\n}\n\nconst modelSelect = {\n name: 'model',\n type: 'text' as const,\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Model',\n}\n\nconst providerOptionsJson = {\n name: 'providerOptions',\n type: 'json' as const,\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Provider-specific options. Defaults are inherited from AI Settings.',\n },\n label: 'Provider Options',\n}\n\nconst commonTextParams = [\n {\n type: 'row' as const,\n fields: [\n {\n name: 'maxTokens',\n type: 'number' as const,\n admin: {\n placeholder: 'Model Default',\n },\n label: 'Max Tokens',\n },\n {\n name: 'temperature',\n type: 'number' as const,\n defaultValue: 0.7,\n label: 'Temperature',\n max: 1,\n min: 0,\n },\n ],\n },\n {\n name: 'extractAttachments',\n type: 'checkbox' as const,\n label: 'Extract Attachments',\n },\n]\n\nexport const instructionsCollection = (pluginConfig: PluginConfig) =>\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 components: {\n beforeList: ['@ai-stack/payloadcms/client#AIConfigDashboard'],\n },\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: CAPABILITIES.map((c) => ({\n fields: c.fields,\n label: c.name,\n value: c.id,\n })),\n },\n path: '@ai-stack/payloadcms/fields#SelectField',\n },\n },\n },\n label: 'Capability',\n options: CAPABILITIES.map((c) => ({\n label: c.name,\n value: c.id,\n })),\n },\n {\n name: 'disabled',\n type: 'checkbox',\n admin: {\n description: 'Please reload your collection after applying the changes',\n },\n defaultValue: false,\n label: 'Hide Compose button for this field',\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'] === 'image'\n },\n },\n description:\n 'These images will be used to generate new visuals in a similar style, layout, or content.',\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 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 \n // Inline Settings Groups by Capability\n \n // Text Settings\n {\n name: 'text-settings',\n type: 'group',\n admin: {\n condition: (data) => data['model-id'] === 'text',\n },\n fields: [\n providerSelect,\n modelSelect,\n ...commonTextParams,\n providerOptionsJson,\n ],\n label: 'Text Settings',\n },\n \n // Rich Text Settings\n {\n name: 'richtext-settings',\n type: 'group',\n admin: {\n condition: (data) => data['model-id'] === 'richtext',\n },\n fields: [\n providerSelect,\n modelSelect,\n ...commonTextParams,\n providerOptionsJson,\n ],\n label: 'Rich Text Settings',\n },\n \n // Image Settings\n {\n name: 'image-settings',\n type: 'group',\n admin: {\n condition: (data) => data['model-id'] === 'image',\n },\n fields: [\n providerSelect,\n modelSelect,\n providerOptionsJson,\n ],\n label: 'Image Settings',\n },\n \n // TTS Settings\n {\n name: 'tts-settings',\n type: 'group',\n admin: {\n condition: (data) => data['model-id'] === 'tts',\n },\n fields: [\n providerSelect,\n modelSelect,\n {\n name: 'voice',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicVoiceSelect',\n },\n },\n label: 'Voice',\n },\n providerOptionsJson,\n ],\n label: 'TTS Settings',\n },\n ],\n }\n"],"names":["PLUGIN_INSTRUCTIONS_TABLE","CAPABILITIES","id","name","fields","defaultAccessConfig","create","req","user","delete","read","update","defaultAdminConfig","group","hidden","providerSelect","type","admin","components","Field","label","modelSelect","providerOptionsJson","description","commonTextParams","placeholder","defaultValue","max","min","instructionsCollection","pluginConfig","labels","plural","singular","overrideInstructions","slug","access","beforeList","unique","options","value","condition","_","current","clientProps","filterByField","map","c","path","tabs","relationTo","uploadCollectionSlug","data"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/collections/Instructions.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\nimport type { PluginConfig } from 'src/types.js'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\n\n// Defined capabilities replacing src/ai/models/\nconst CAPABILITIES = [\n {\n id: 'text',\n name: 'Text Generation',\n fields: ['text', 'textarea'],\n },\n {\n id: 'richtext',\n name: 'Rich Text Generation',\n fields: ['richText'],\n },\n {\n id: 'image',\n name: 'Image Generation',\n fields: ['upload'],\n },\n {\n id: 'tts',\n name: 'Text to Speech',\n fields: ['upload'],\n },\n {\n id: 'array',\n name: 'Array Generation',\n fields: ['array'],\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\nconst providerSelect = {\n name: 'provider',\n type: 'text' as const,\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Provider',\n}\n\nconst modelSelect = {\n name: 'model',\n type: 'text' as const,\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Model',\n}\n\nconst providerOptionsJson = {\n name: 'providerOptions',\n type: 'json' as const,\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Provider-specific options. Defaults are inherited from AI Settings.',\n },\n label: 'Provider Options',\n}\n\nconst commonTextParams = [\n {\n type: 'row' as const,\n fields: [\n {\n name: 'maxTokens',\n type: 'number' as const,\n admin: {\n placeholder: 'Model Default',\n },\n label: 'Max Tokens',\n },\n {\n name: 'temperature',\n type: 'number' as const,\n defaultValue: 0.7,\n label: 'Temperature',\n max: 1,\n min: 0,\n },\n ],\n },\n {\n name: 'extractAttachments',\n type: 'checkbox' as const,\n label: 'Extract Attachments',\n },\n]\n\nexport const instructionsCollection = (pluginConfig: PluginConfig) =>\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 components: {\n beforeList: ['@ai-stack/payloadcms/client#AIConfigDashboard'],\n },\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 label: 'array',\n value: 'array',\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: CAPABILITIES.map((c) => ({\n fields: c.fields,\n label: c.name,\n value: c.id,\n })),\n },\n path: '@ai-stack/payloadcms/fields#SelectField',\n },\n },\n },\n label: 'Capability',\n options: CAPABILITIES.map((c) => ({\n label: c.name,\n value: c.id,\n })),\n },\n {\n name: 'disabled',\n type: 'checkbox',\n admin: {\n description: 'Please reload your collection after applying the changes',\n },\n defaultValue: false,\n label: 'Hide Compose button for this field',\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'] === 'image'\n },\n },\n description:\n 'These images will be used to generate new visuals in a similar style, layout, or content.',\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 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 \n // Inline Settings Groups by Capability\n \n // Text Settings\n {\n name: 'text-settings',\n type: 'group',\n admin: {\n condition: (data) => data['model-id'] === 'text',\n },\n fields: [\n providerSelect,\n modelSelect,\n ...commonTextParams,\n providerOptionsJson,\n ],\n label: 'Text Settings',\n },\n \n // Rich Text Settings\n {\n name: 'richtext-settings',\n type: 'group',\n admin: {\n condition: (data) => data['model-id'] === 'richtext',\n },\n fields: [\n providerSelect,\n modelSelect,\n ...commonTextParams,\n providerOptionsJson,\n ],\n label: 'Rich Text Settings',\n },\n \n // Image Settings\n {\n name: 'image-settings',\n type: 'group',\n admin: {\n condition: (data) => data['model-id'] === 'image',\n },\n fields: [\n providerSelect,\n modelSelect,\n providerOptionsJson,\n ],\n label: 'Image Settings',\n },\n \n // TTS Settings\n {\n name: 'tts-settings',\n type: 'group',\n admin: {\n condition: (data) => data['model-id'] === 'tts',\n },\n fields: [\n providerSelect,\n modelSelect,\n {\n name: 'voice',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicVoiceSelect',\n },\n },\n label: 'Voice',\n },\n providerOptionsJson,\n ],\n label: 'TTS Settings',\n },\n \n // Array Settings\n {\n name: 'array-settings',\n type: 'group',\n admin: {\n condition: (data) => data['model-id'] === 'array',\n },\n fields: [\n providerSelect,\n modelSelect,\n {\n name: 'count',\n type: 'number',\n admin: {\n description: 'Number of items to generate',\n },\n defaultValue: 3,\n label: 'Items to Generate',\n max: 20,\n min: 1,\n },\n providerOptionsJson,\n ],\n label: 'Array Settings',\n },\n ],\n }\n"],"names":["PLUGIN_INSTRUCTIONS_TABLE","CAPABILITIES","id","name","fields","defaultAccessConfig","create","req","user","delete","read","update","defaultAdminConfig","group","hidden","providerSelect","type","admin","components","Field","label","modelSelect","providerOptionsJson","description","commonTextParams","placeholder","defaultValue","max","min","instructionsCollection","pluginConfig","labels","plural","singular","overrideInstructions","slug","access","beforeList","unique","options","value","condition","_","current","clientProps","filterByField","map","c","path","tabs","relationTo","uploadCollectionSlug","data"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Endpoint } from 'payload';
2
+
3
+ import type { PluginConfig } from '../types.js';
4
+ export declare const Chat: (pluginConfig: PluginConfig) => Endpoint;
@@ -4,6 +4,7 @@ import { filterEditorSchemaByNodes } from '../ai/utils/filterEditorSchemaByNodes
4
4
  import { PLUGIN_AI_JOBS_TABLE, PLUGIN_API_ENDPOINT_GENERATE, PLUGIN_API_ENDPOINT_GENERATE_UPLOAD, PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK, PLUGIN_INSTRUCTIONS_TABLE, PLUGIN_NAME } from '../defaults.js';
5
5
  import { registerEditorHelper } from '../libraries/handlebars/helpers.js';
6
6
  import { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js';
7
+ import { buildSmartPrompt, isGenericPrompt } from '../utilities/buildSmartPrompt.js';
7
8
  import { extractImageData } from '../utilities/extractImageData.js';
8
9
  import { fetchImages } from '../utilities/fetchImages.js';
9
10
  import { fieldToJsonSchema } from '../utilities/fieldToJsonSchema.js';
@@ -37,7 +38,21 @@ export const endpoints = (pluginConfig)=>({
37
38
  }
38
39
  const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin;
39
40
  const { schema: editorSchema = {} } = editorConfig;
40
- const { prompt: promptTemplate = '' } = instructions;
41
+ let { prompt: promptTemplate = '' } = instructions;
42
+ // Smart fallback: if prompt is generic, build a contextual prompt from field metadata
43
+ if (isGenericPrompt(promptTemplate)) {
44
+ const schemaPath = String(instructions['schema-path']);
45
+ promptTemplate = buildSmartPrompt({
46
+ documentData: contextData,
47
+ payload: req.payload,
48
+ schemaPath
49
+ });
50
+ if (pluginConfig.debugging) {
51
+ req.payload.logger.info({
52
+ smartPrompt: promptTemplate
53
+ }, `— AI Plugin: Using smart fallback prompt for ${schemaPath}`);
54
+ }
55
+ }
41
56
  let allowedEditorSchema = editorSchema;
42
57
  if (allowedEditorNodes.length) {
43
58
  allowedEditorSchema = filterEditorSchemaByNodes(editorSchema, allowedEditorNodes);
@@ -79,6 +94,7 @@ export const endpoints = (pluginConfig)=>({
79
94
  if (targetCollection && fieldName) {
80
95
  const targetField = getFieldBySchemaPath(targetCollection, schemaPath);
81
96
  const supported = [
97
+ 'array',
82
98
  'text',
83
99
  'textarea',
84
100
  'select',
@@ -90,23 +106,37 @@ export const endpoints = (pluginConfig)=>({
90
106
  ];
91
107
  const t = String(targetField?.type || '');
92
108
  if (targetField && supported.includes(t)) {
93
- jsonSchema = fieldToJsonSchema(targetField, {
94
- nameOverride: fieldName
95
- });
109
+ // For array fields, use count from array-settings if available
110
+ if (t === 'array') {
111
+ const arraySettings = instructions['array-settings'] || {};
112
+ const count = arraySettings.count || 3;
113
+ // Override the field's maxRows with the requested count
114
+ const modifiedField = {
115
+ ...targetField,
116
+ maxRows: count,
117
+ minRows: count
118
+ };
119
+ jsonSchema = fieldToJsonSchema(modifiedField, {
120
+ nameOverride: fieldName
121
+ });
122
+ } else {
123
+ jsonSchema = fieldToJsonSchema(targetField, {
124
+ nameOverride: fieldName
125
+ });
126
+ }
96
127
  }
97
128
  }
98
129
  } catch (e) {
99
130
  req.payload.logger.error(e, '— AI Plugin: Error building field JSON schema');
100
131
  }
101
132
  // Get model settings from instruction
102
- const settingsName = instructions['model-id'] === 'richtext' ? 'richtext-settings' : instructions['model-id'] === 'text' ? 'text-settings' : undefined;
133
+ const settingsName = instructions['model-id'] === 'richtext' ? 'richtext-settings' : instructions['model-id'] === 'text' ? 'text-settings' : instructions['model-id'] === 'array' ? 'array-settings' : undefined;
103
134
  if (!settingsName) {
104
135
  throw new Error(`Unsupported model-id: ${instructions['model-id']}`);
105
136
  }
106
137
  const modelSettings = instructions[settingsName] || {};
107
138
  // Resolve @field:filename references from the prompt
108
- const { images: resolvedImages, processedPrompt } = await resolveImageReferences(prompts.prompt, contextData, req);
109
- console.log('resolvedImagesL ', resolvedImages);
139
+ const { images: resolvedImages, processedPrompt } = await resolveImageReferences(prompts.prompt, contextData, req, collectionName);
110
140
  // Extract hardcoded URLs from the processed prompt
111
141
  const hardcodedImages = extractImageData(processedPrompt);
112
142
  // Combine images
@@ -189,9 +219,23 @@ export const endpoints = (pluginConfig)=>({
189
219
  req
190
220
  });
191
221
  }
192
- const { images: sampleImages = [], prompt: promptTemplate = '' } = instructions;
222
+ let { prompt: promptTemplate = '' } = instructions;
223
+ const { images: sampleImages = [] } = instructions;
193
224
  const schemaPath = String(instructions['schema-path']);
194
225
  registerEditorHelper(req.payload, schemaPath);
226
+ // Smart fallback: if prompt is generic, build a contextual prompt from field metadata
227
+ if (isGenericPrompt(promptTemplate)) {
228
+ promptTemplate = buildSmartPrompt({
229
+ documentData: contextData,
230
+ payload: req.payload,
231
+ schemaPath
232
+ });
233
+ if (pluginConfig.debugging) {
234
+ req.payload.logger.info({
235
+ smartPrompt: promptTemplate
236
+ }, `— AI Plugin: Using smart fallback prompt for ${schemaPath}`);
237
+ }
238
+ }
195
239
  const extendedContext = extendContextWithPromptFields(contextData, {
196
240
  type: String(instructions['field-type']),
197
241
  collection: collectionSlug
@@ -200,7 +244,7 @@ export const endpoints = (pluginConfig)=>({
200
244
  const modelId = instructions['model-id'];
201
245
  const uploadCollectionSlug = instructions['relation-to'];
202
246
  // Resolve @field:filename references from the prompt
203
- const { images: resolvedImages, processedPrompt } = await resolveImageReferences(text, contextData, req);
247
+ const { images: resolvedImages, processedPrompt } = await resolveImageReferences(text, contextData, req, collectionSlug);
204
248
  // Extract hardcoded URLs from the processed prompt and merge with resolved images and sample images
205
249
  const images = [
206
250
  ...extractImageData(processedPrompt),
@@ -222,7 +266,39 @@ export const endpoints = (pluginConfig)=>({
222
266
  if (!settingsName) {
223
267
  throw new Error(`Unsupported model-id: ${modelId}`);
224
268
  }
225
- const modelSettings = instructions[settingsName] || {};
269
+ // Get model settings from instruction
270
+ const instructionSettings = instructions[settingsName] || {};
271
+ // Fallback to AISettings global defaults if instruction-level settings are missing
272
+ let globalDefaults = {};
273
+ if (!instructionSettings.provider || !instructionSettings.model) {
274
+ try {
275
+ const aiSettings = await req.payload.findGlobal({
276
+ slug: 'ai-settings',
277
+ context: {
278
+ unsafe: true
279
+ }
280
+ });
281
+ // Map modelId to the corresponding default settings key
282
+ const defaultsKey = modelId === 'image' ? 'image' : modelId === 'video' ? 'video' : modelId === 'tts' ? 'tts' : undefined;
283
+ if (defaultsKey && aiSettings?.defaults?.[defaultsKey]) {
284
+ globalDefaults = aiSettings.defaults[defaultsKey];
285
+ if (pluginConfig.debugging) {
286
+ req.payload.logger.info({
287
+ globalDefaults
288
+ }, `— AI Plugin: Using AISettings defaults for ${modelId}`);
289
+ }
290
+ }
291
+ } catch (e) {
292
+ req.payload.logger.error(e, '— AI Plugin: Error fetching AISettings defaults');
293
+ }
294
+ }
295
+ // Merge: instruction settings take priority over global defaults
296
+ // Filter out null/undefined values so they don't overwrite valid defaults
297
+ const filteredInstructionSettings = Object.fromEntries(Object.entries(instructionSettings).filter(([_, v])=>v != null));
298
+ const modelSettings = {
299
+ ...globalDefaults,
300
+ ...filteredInstructionSettings
301
+ };
226
302
  // Use payload.ai.generateMedia directly! 🎉
227
303
  const result = await req.payload.ai.generateMedia({
228
304
  callbackUrl,
@@ -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 { 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 const { prompt: promptTemplate = '' } = instructions\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 '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 jsonSchema = fieldToJsonSchema(targetField, { nameOverride: fieldName })\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 : 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 )\n\n console.log('resolvedImagesL ', resolvedImages)\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 const { images: sampleImages = [], prompt: promptTemplate = '' } = instructions\n const schemaPath = String(instructions['schema-path'])\n registerEditorHelper(req.payload, schemaPath)\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 )\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 const modelSettings = instructions[settingsName] || {}\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 as Record<string, unknown>).model as string,\n prompt: text,\n provider: (modelSettings as Record<string, unknown>).provider as string,\n ...(modelSettings as Record<string, unknown>),\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(\n result,\n {\n collection: uploadCollectionSlug as string,\n request: req,\n },\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","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","allowedEditorSchema","length","schemaPath","String","parts","split","collectionName","fieldName","defaultLocale","locales","localization","localeData","l","code","localeInfo","label","prompts","type","context","field","layout","systemPrompt","system","template","debugging","logger","info","jsonSchema","targetCollection","c","targetField","supported","t","includes","nameOverride","e","error","settingsName","undefined","modelSettings","images","resolvedImages","processedPrompt","console","log","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","result","generateMedia","assetData","mediaUpload","request","create","alt","file","externalTaskId","jobId","taskId","progress","createdJob","task_id","overrideAccess","job","videogenWebhook","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 { 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,3 +1,4 @@
1
+ export { ArrayComposeField } from '../fields/ArrayComposeField/ArrayComposeField.js';
1
2
  export { ComposeField } from '../fields/ComposeField/ComposeField.js';
2
3
  export { PromptEditorField } from '../fields/PromptEditorField/PromptEditorField.js';
3
4
  export { SelectField } from '../fields/SelectField/SelectField.js';
@@ -1,3 +1,4 @@
1
+ export { ArrayComposeField } from '../fields/ArrayComposeField/ArrayComposeField.js';
1
2
  export { ComposeField } from '../fields/ComposeField/ComposeField.js';
2
3
  export { PromptEditorField } from '../fields/PromptEditorField/PromptEditorField.js';
3
4
  export { SelectField } from '../fields/SelectField/SelectField.js';