@ai-stack/payloadcms 3.76.0-beta.1 → 3.76.0-beta.3

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 (341) hide show
  1. package/dist/ai/core/generateObject.js +1 -4
  2. package/dist/ai/core/generateObject.js.map +1 -1
  3. package/dist/ai/core/generateText.js +1 -5
  4. package/dist/ai/core/generateText.js.map +1 -1
  5. package/dist/ai/core/media/generateMedia.js +1 -4
  6. package/dist/ai/core/media/generateMedia.js.map +1 -1
  7. package/dist/ai/core/media/image/generateImage.js +4 -14
  8. package/dist/ai/core/media/image/generateImage.js.map +1 -1
  9. package/dist/ai/core/media/image/handlers/multimodal.js +7 -24
  10. package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -1
  11. package/dist/ai/core/media/image/handlers/standard.js +7 -2
  12. package/dist/ai/core/media/image/handlers/standard.js.map +1 -1
  13. package/dist/ai/core/media/speech/generateSpeech.js +2 -3
  14. package/dist/ai/core/media/speech/generateSpeech.js.map +1 -1
  15. package/dist/ai/core/media/types.d.ts +2 -3
  16. package/dist/ai/core/media/types.js.map +1 -1
  17. package/dist/ai/core/streamObject.js +0 -3
  18. package/dist/ai/core/streamObject.js.map +1 -1
  19. package/dist/ai/core/streamText.js +1 -4
  20. package/dist/ai/core/streamText.js.map +1 -1
  21. package/dist/ai/core/types.d.ts +2 -2
  22. package/dist/ai/core/types.js.map +1 -1
  23. package/dist/ai/providers/blocks/anthropic.js +2 -44
  24. package/dist/ai/providers/blocks/anthropic.js.map +1 -1
  25. package/dist/ai/providers/blocks/elevenlabs.js +4 -109
  26. package/dist/ai/providers/blocks/elevenlabs.js.map +1 -1
  27. package/dist/ai/providers/blocks/fal.js +2 -120
  28. package/dist/ai/providers/blocks/fal.js.map +1 -1
  29. package/dist/ai/providers/blocks/google.js +6 -240
  30. package/dist/ai/providers/blocks/google.js.map +1 -1
  31. package/dist/ai/providers/blocks/openai-compatible.js +2 -146
  32. package/dist/ai/providers/blocks/openai-compatible.js.map +1 -1
  33. package/dist/ai/providers/blocks/openai.js +2 -202
  34. package/dist/ai/providers/blocks/openai.js.map +1 -1
  35. package/dist/ai/providers/blocks/xai.js +2 -55
  36. package/dist/ai/providers/blocks/xai.js.map +1 -1
  37. package/dist/ai/providers/index.d.ts +1 -1
  38. package/dist/ai/providers/index.js +0 -2
  39. package/dist/ai/providers/index.js.map +1 -1
  40. package/dist/ai/providers/registry.d.ts +24 -28
  41. package/dist/ai/providers/registry.js +184 -138
  42. package/dist/ai/providers/registry.js.map +1 -1
  43. package/dist/ai/providers/types.d.ts +12 -33
  44. package/dist/ai/providers/types.js +0 -1
  45. package/dist/ai/providers/types.js.map +1 -1
  46. package/dist/ai/schemas/lexicalJsonSchema.js +1 -1
  47. package/dist/ai/schemas/lexicalJsonSchema.js.map +1 -1
  48. package/dist/ai/utilities/filterEditorSchemaByNodes.js.map +1 -0
  49. package/dist/ai/utilities/generateFileNameByPrompt.js.map +1 -0
  50. package/dist/ai/utilities/isObjectSchema.js.map +1 -0
  51. package/dist/ai/{utils → utilities}/nodeToSchemaMap.js +6 -6
  52. package/dist/ai/utilities/nodeToSchemaMap.js.map +1 -0
  53. package/dist/ai/{prompts.d.ts → utilities/prompts.d.ts} +1 -1
  54. package/dist/ai/utilities/prompts.js.map +1 -0
  55. package/dist/ai/utilities/systemGenerate.js.map +1 -0
  56. package/dist/collections/AIJobs.js +3 -12
  57. package/dist/collections/AIJobs.js.map +1 -1
  58. package/dist/collections/AIProviders.js +56 -29
  59. package/dist/collections/AIProviders.js.map +1 -1
  60. package/dist/collections/Instructions.js +91 -59
  61. package/dist/collections/Instructions.js.map +1 -1
  62. package/dist/collections/shared.d.ts +30 -0
  63. package/dist/collections/shared.js +15 -0
  64. package/dist/collections/shared.js.map +1 -0
  65. package/dist/endpoints/fetchFields.js +14 -6
  66. package/dist/endpoints/fetchFields.js.map +1 -1
  67. package/dist/endpoints/fetchVoices.js +1 -1
  68. package/dist/endpoints/fetchVoices.js.map +1 -1
  69. package/dist/endpoints/generate.d.ts +7 -0
  70. package/dist/endpoints/generate.js +268 -0
  71. package/dist/endpoints/generate.js.map +1 -0
  72. package/dist/endpoints/index.js +9 -639
  73. package/dist/endpoints/index.js.map +1 -1
  74. package/dist/endpoints/promptMentions.d.ts +2 -0
  75. package/dist/endpoints/promptMentions.js +166 -0
  76. package/dist/endpoints/promptMentions.js.map +1 -0
  77. package/dist/endpoints/upload.d.ts +7 -0
  78. package/dist/endpoints/upload.js +294 -0
  79. package/dist/endpoints/upload.js.map +1 -0
  80. package/dist/endpoints/videogenWebhook.d.ts +7 -0
  81. package/dist/endpoints/videogenWebhook.js +132 -0
  82. package/dist/endpoints/videogenWebhook.js.map +1 -0
  83. package/dist/exports/client.d.ts +2 -1
  84. package/dist/exports/client.js +2 -1
  85. package/dist/exports/client.js.map +1 -1
  86. package/dist/exports/fields.d.ts +2 -1
  87. package/dist/exports/fields.js +2 -1
  88. package/dist/exports/fields.js.map +1 -1
  89. package/dist/fields/ArrayComposeField/ArrayComposeField.js +1 -1
  90. package/dist/fields/ArrayComposeField/ArrayComposeField.js.map +1 -1
  91. package/dist/fields/ArrayComposeField/ArrayComposeField.jsx +1 -1
  92. package/dist/fields/ComposeField/ComposeField.d.ts +1 -0
  93. package/dist/fields/ComposeField/ComposeField.js +18 -8
  94. package/dist/fields/ComposeField/ComposeField.js.map +1 -1
  95. package/dist/fields/ComposeField/ComposeField.jsx +12 -7
  96. package/dist/fields/LexicalEditor/feature.server.js +1 -1
  97. package/dist/fields/LexicalEditor/feature.server.js.map +1 -1
  98. package/dist/fields/PromptEditorField/feature.client.d.ts +1 -0
  99. package/dist/fields/PromptEditorField/feature.client.js +173 -0
  100. package/dist/fields/PromptEditorField/feature.client.js.map +1 -0
  101. package/dist/fields/PromptEditorField/feature.client.jsx +148 -0
  102. package/dist/fields/PromptEditorField/feature.server.d.ts +1 -0
  103. package/dist/fields/PromptEditorField/feature.server.js +30 -0
  104. package/dist/fields/PromptEditorField/feature.server.js.map +1 -0
  105. package/dist/fields/PromptField.d.ts +4 -0
  106. package/dist/fields/PromptField.js +18 -0
  107. package/dist/fields/PromptField.js.map +1 -0
  108. package/dist/fields/SelectField/SelectField.js +0 -1
  109. package/dist/fields/SelectField/SelectField.js.map +1 -1
  110. package/dist/fields/SelectField/SelectField.jsx +0 -1
  111. package/dist/index.d.ts +4 -3
  112. package/dist/index.js +4 -2
  113. package/dist/index.js.map +1 -1
  114. package/dist/libraries/handlebars/helpers.js +2 -2
  115. package/dist/libraries/handlebars/helpers.js.map +1 -1
  116. package/dist/libraries/handlebars/replacePlaceholders.js +5 -1
  117. package/dist/libraries/handlebars/replacePlaceholders.js.map +1 -1
  118. package/dist/payload-ai.d.ts +5 -19
  119. package/dist/plugin.js +18 -21
  120. package/dist/plugin.js.map +1 -1
  121. package/dist/providers/FieldProvider/FieldProvider.js +11 -20
  122. package/dist/providers/FieldProvider/FieldProvider.js.map +1 -1
  123. package/dist/providers/FieldProvider/FieldProvider.jsx +8 -18
  124. package/dist/providers/InstructionsProvider/InstructionsProvider.js +5 -2
  125. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  126. package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +5 -2
  127. package/dist/translations/de.json +47 -0
  128. package/dist/translations/en.json +45 -2
  129. package/dist/translations/es.json +45 -2
  130. package/dist/translations/fa.json +45 -2
  131. package/dist/translations/fr.json +46 -3
  132. package/dist/translations/hi.json +47 -0
  133. package/dist/translations/index.d.ts +88 -26
  134. package/dist/translations/index.js +18 -32
  135. package/dist/translations/index.js.map +1 -1
  136. package/dist/translations/ja.json +47 -0
  137. package/dist/translations/nb.json +47 -0
  138. package/dist/translations/nl.json +47 -0
  139. package/dist/translations/pl.json +45 -2
  140. package/dist/translations/pt.json +47 -0
  141. package/dist/translations/ru.json +45 -2
  142. package/dist/translations/th.json +47 -0
  143. package/dist/translations/translation-schema.json +184 -11
  144. package/dist/translations/uk.json +45 -2
  145. package/dist/translations/zh.json +47 -0
  146. package/dist/types.d.ts +64 -28
  147. package/dist/types.js.map +1 -1
  148. package/dist/ui/Compose/Compose.js +42 -79
  149. package/dist/ui/Compose/Compose.js.map +1 -1
  150. package/dist/ui/Compose/Compose.jsx +32 -86
  151. package/dist/ui/Compose/ComposePlaceholder.js +1 -1
  152. package/dist/ui/Compose/ComposePlaceholder.js.map +1 -1
  153. package/dist/ui/Compose/ComposePlaceholder.jsx +1 -1
  154. package/dist/ui/Compose/{compose.module.css → compose.module.scss} +3 -5
  155. package/dist/ui/Compose/hooks/menu/Item.d.ts +1 -1
  156. package/dist/ui/Compose/hooks/menu/Item.js +7 -3
  157. package/dist/ui/Compose/hooks/menu/Item.js.map +1 -1
  158. package/dist/ui/Compose/hooks/menu/Item.jsx +11 -5
  159. package/dist/ui/Compose/hooks/menu/TranslateMenu.js +15 -5
  160. package/dist/ui/Compose/hooks/menu/TranslateMenu.js.map +1 -1
  161. package/dist/ui/Compose/hooks/menu/TranslateMenu.jsx +11 -5
  162. package/dist/ui/Compose/hooks/menu/items.d.ts +8 -8
  163. package/dist/ui/Compose/hooks/menu/itemsMap.d.ts +2 -1
  164. package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
  165. package/dist/ui/Compose/hooks/menu/types.d.ts +21 -0
  166. package/dist/ui/Compose/hooks/menu/types.js +3 -0
  167. package/dist/ui/Compose/hooks/menu/types.js.map +1 -0
  168. package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -2
  169. package/dist/ui/Compose/hooks/menu/useMenu.js +45 -23
  170. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  171. package/dist/ui/Compose/hooks/menu/useMenu.jsx +43 -23
  172. package/dist/ui/Compose/hooks/mergeGeneratedValue.d.ts +14 -0
  173. package/dist/ui/Compose/hooks/mergeGeneratedValue.js +38 -0
  174. package/dist/ui/Compose/hooks/mergeGeneratedValue.js.map +1 -0
  175. package/dist/ui/Compose/hooks/useGenerate.js +37 -12
  176. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
  177. package/dist/ui/Compose/hooks/useGenerateUpload.js +66 -24
  178. package/dist/ui/Compose/hooks/useGenerateUpload.js.map +1 -1
  179. package/dist/ui/Compose/hooks/useHistory.js +1 -1
  180. package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
  181. package/dist/ui/Compose/hooks/useStreamingUpdate.js +4 -4
  182. package/dist/ui/Compose/hooks/useStreamingUpdate.js.map +1 -1
  183. package/dist/ui/ConfigDashboard/configDashboard.module.css +94 -0
  184. package/dist/ui/ConfigDashboard/index.js +27 -92
  185. package/dist/ui/ConfigDashboard/index.js.map +1 -1
  186. package/dist/ui/ConfigDashboard/index.jsx +24 -77
  187. package/dist/ui/DynamicModelSelect/index.js +6 -27
  188. package/dist/ui/DynamicModelSelect/index.js.map +1 -1
  189. package/dist/ui/DynamicModelSelect/index.jsx +6 -29
  190. package/dist/ui/DynamicProviderSelect/index.js +6 -27
  191. package/dist/ui/DynamicProviderSelect/index.js.map +1 -1
  192. package/dist/ui/DynamicProviderSelect/index.jsx +6 -29
  193. package/dist/ui/DynamicVoiceSelect/index.js +34 -83
  194. package/dist/ui/DynamicVoiceSelect/index.js.map +1 -1
  195. package/dist/ui/DynamicVoiceSelect/index.jsx +16 -53
  196. package/dist/ui/GlobalProviderOptions/index.d.ts +2 -0
  197. package/dist/ui/GlobalProviderOptions/index.js +118 -0
  198. package/dist/ui/GlobalProviderOptions/index.js.map +1 -0
  199. package/dist/ui/GlobalProviderOptions/index.jsx +60 -0
  200. package/dist/ui/Icons/Icons.js +1 -1
  201. package/dist/ui/Icons/Icons.js.map +1 -1
  202. package/dist/ui/Icons/Icons.jsx +1 -1
  203. package/dist/ui/Icons/LottieAnimation.js +1 -1
  204. package/dist/ui/Icons/LottieAnimation.js.map +1 -1
  205. package/dist/ui/Icons/LottieAnimation.jsx +1 -1
  206. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.d.ts +12 -0
  207. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.js +166 -0
  208. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.js.map +1 -0
  209. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.jsx +83 -0
  210. package/dist/ui/InstructionProviderOptions/index.d.ts +2 -0
  211. package/dist/ui/InstructionProviderOptions/index.js +157 -0
  212. package/dist/ui/InstructionProviderOptions/index.js.map +1 -0
  213. package/dist/ui/InstructionProviderOptions/index.jsx +92 -0
  214. package/dist/ui/VoicesFetcher/index.js.map +1 -1
  215. package/dist/ui/hooks/useAISettings.d.ts +26 -0
  216. package/dist/ui/hooks/useAISettings.js +73 -0
  217. package/dist/ui/hooks/useAISettings.js.map +1 -0
  218. package/dist/ui/providerOptions/updateProviderOptionsValue.d.ts +6 -0
  219. package/dist/ui/providerOptions/updateProviderOptionsValue.js +50 -0
  220. package/dist/ui/providerOptions/updateProviderOptionsValue.js.map +1 -0
  221. package/dist/ui/shared/handleSelectChange.d.ts +5 -0
  222. package/dist/ui/shared/handleSelectChange.js +12 -0
  223. package/dist/ui/shared/handleSelectChange.js.map +1 -0
  224. package/dist/ui/shared/types.d.ts +11 -0
  225. package/dist/ui/shared/types.js +5 -0
  226. package/dist/ui/shared/types.js.map +1 -0
  227. package/dist/utilities/ai/resolveEffectiveInstructionSettings.d.ts +15 -0
  228. package/dist/utilities/ai/resolveEffectiveInstructionSettings.js +136 -0
  229. package/dist/utilities/ai/resolveEffectiveInstructionSettings.js.map +1 -0
  230. package/dist/{endpoints → utilities}/buildPromptUtils.js +14 -5
  231. package/dist/utilities/buildPromptUtils.js.map +1 -0
  232. package/dist/utilities/buildSmartPrompt.js +3 -3
  233. package/dist/utilities/buildSmartPrompt.js.map +1 -1
  234. package/dist/utilities/fields/fieldToJsonSchema.js.map +1 -0
  235. package/dist/utilities/fields/getFieldBySchemaPath.js.map +1 -0
  236. package/dist/utilities/fields/getFieldInfo.js.map +1 -0
  237. package/dist/utilities/{updateFieldsConfig.js → fields/updateFieldsConfig.js} +8 -3
  238. package/dist/utilities/fields/updateFieldsConfig.js.map +1 -0
  239. package/dist/utilities/images/extractImageData.js.map +1 -0
  240. package/dist/utilities/images/extractPromptAttachments.js.map +1 -0
  241. package/dist/utilities/{fetchImages.d.ts → images/fetchImages.d.ts} +1 -1
  242. package/dist/utilities/images/fetchImages.js +49 -0
  243. package/dist/utilities/images/fetchImages.js.map +1 -0
  244. package/dist/utilities/images/resolveImageReferences.js +183 -0
  245. package/dist/utilities/images/resolveImageReferences.js.map +1 -0
  246. package/dist/utilities/init/autoSetupProviders.d.ts +3 -0
  247. package/dist/utilities/init/autoSetupProviders.js +216 -0
  248. package/dist/utilities/init/autoSetupProviders.js.map +1 -0
  249. package/dist/utilities/lexical/editorSchemaValidator.js.map +1 -0
  250. package/dist/utilities/lexical/lexicalToHTML.js.map +1 -0
  251. package/dist/utilities/lexical/lexicalToPromptTemplate.d.ts +2 -0
  252. package/dist/utilities/lexical/lexicalToPromptTemplate.js +50 -0
  253. package/dist/utilities/lexical/lexicalToPromptTemplate.js.map +1 -0
  254. package/dist/utilities/lexical/setSafeLexicalState.js.map +1 -0
  255. package/dist/utilities/lexical/stringToLexicalJSON.d.ts +2 -0
  256. package/dist/utilities/lexical/stringToLexicalJSON.js +39 -0
  257. package/dist/utilities/lexical/stringToLexicalJSON.js.map +1 -0
  258. package/dist/utilities/sanitizeLog.d.ts +1 -0
  259. package/dist/utilities/sanitizeLog.js +39 -0
  260. package/dist/utilities/sanitizeLog.js.map +1 -0
  261. package/dist/utilities/seedProperties.js +54 -22
  262. package/dist/utilities/seedProperties.js.map +1 -1
  263. package/package.json +36 -2
  264. package/dist/ai/analyse.d.ts +0 -1
  265. package/dist/ai/analyse.js +0 -3
  266. package/dist/ai/analyse.js.map +0 -1
  267. package/dist/ai/index.d.ts +0 -11
  268. package/dist/ai/index.js +0 -25
  269. package/dist/ai/index.js.map +0 -1
  270. package/dist/ai/prompts.js.map +0 -1
  271. package/dist/ai/utils/filterEditorSchemaByNodes.js.map +0 -1
  272. package/dist/ai/utils/generateFileNameByPrompt.js.map +0 -1
  273. package/dist/ai/utils/isObjectSchema.js.map +0 -1
  274. package/dist/ai/utils/nodeToSchemaMap.js.map +0 -1
  275. package/dist/ai/utils/systemGenerate.js.map +0 -1
  276. package/dist/endpoints/buildPromptUtils.js.map +0 -1
  277. package/dist/endpoints/chat.d.ts +0 -4
  278. package/dist/fields/PromptEditorField/PromptEditorField.d.ts +0 -3
  279. package/dist/fields/PromptEditorField/PromptEditorField.js +0 -217
  280. package/dist/fields/PromptEditorField/PromptEditorField.js.map +0 -1
  281. package/dist/fields/PromptEditorField/PromptEditorField.jsx +0 -160
  282. package/dist/ui/AIConfigDashboard/index.d.ts +0 -2
  283. package/dist/ui/AIConfigDashboard/index.js +0 -224
  284. package/dist/ui/AIConfigDashboard/index.js.map +0 -1
  285. package/dist/ui/AIConfigDashboard/index.jsx +0 -175
  286. package/dist/ui/ProviderOptionsEditor/index.d.ts +0 -7
  287. package/dist/ui/ProviderOptionsEditor/index.js +0 -291
  288. package/dist/ui/ProviderOptionsEditor/index.js.map +0 -1
  289. package/dist/ui/ProviderOptionsEditor/index.jsx +0 -210
  290. package/dist/utilities/editorSchemaValidator.js.map +0 -1
  291. package/dist/utilities/extractImageData.js.map +0 -1
  292. package/dist/utilities/extractPromptAttachments.js.map +0 -1
  293. package/dist/utilities/fetchImages.js +0 -38
  294. package/dist/utilities/fetchImages.js.map +0 -1
  295. package/dist/utilities/fieldToJsonSchema.js.map +0 -1
  296. package/dist/utilities/getFieldBySchemaPath.js.map +0 -1
  297. package/dist/utilities/getFieldInfo.js.map +0 -1
  298. package/dist/utilities/getProviderOptionsFields.d.ts +0 -16
  299. package/dist/utilities/getProviderOptionsFields.js +0 -80
  300. package/dist/utilities/getProviderOptionsFields.js.map +0 -1
  301. package/dist/utilities/isPluginActivated.d.ts +0 -2
  302. package/dist/utilities/isPluginActivated.js +0 -5
  303. package/dist/utilities/isPluginActivated.js.map +0 -1
  304. package/dist/utilities/lexicalToHTML.js.map +0 -1
  305. package/dist/utilities/resolveImageReferences.js +0 -167
  306. package/dist/utilities/resolveImageReferences.js.map +0 -1
  307. package/dist/utilities/schemaConverter.d.ts +0 -3
  308. package/dist/utilities/schemaConverter.js +0 -93
  309. package/dist/utilities/schemaConverter.js.map +0 -1
  310. package/dist/utilities/setSafeLexicalState.js.map +0 -1
  311. package/dist/utilities/updateFieldsConfig.js.map +0 -1
  312. /package/dist/ai/{utils → utilities}/filterEditorSchemaByNodes.d.ts +0 -0
  313. /package/dist/ai/{utils → utilities}/filterEditorSchemaByNodes.js +0 -0
  314. /package/dist/ai/{utils → utilities}/generateFileNameByPrompt.d.ts +0 -0
  315. /package/dist/ai/{utils → utilities}/generateFileNameByPrompt.js +0 -0
  316. /package/dist/ai/{utils → utilities}/isObjectSchema.d.ts +0 -0
  317. /package/dist/ai/{utils → utilities}/isObjectSchema.js +0 -0
  318. /package/dist/ai/{utils → utilities}/nodeToSchemaMap.d.ts +0 -0
  319. /package/dist/ai/{prompts.js → utilities/prompts.js} +0 -0
  320. /package/dist/ai/{utils → utilities}/systemGenerate.d.ts +0 -0
  321. /package/dist/ai/{utils → utilities}/systemGenerate.js +0 -0
  322. /package/dist/ui/Icons/{icons.module.css → icons.module.scss} +0 -0
  323. /package/dist/{endpoints → utilities}/buildPromptUtils.d.ts +0 -0
  324. /package/dist/utilities/{fieldToJsonSchema.d.ts → fields/fieldToJsonSchema.d.ts} +0 -0
  325. /package/dist/utilities/{fieldToJsonSchema.js → fields/fieldToJsonSchema.js} +0 -0
  326. /package/dist/utilities/{getFieldBySchemaPath.d.ts → fields/getFieldBySchemaPath.d.ts} +0 -0
  327. /package/dist/utilities/{getFieldBySchemaPath.js → fields/getFieldBySchemaPath.js} +0 -0
  328. /package/dist/utilities/{getFieldInfo.d.ts → fields/getFieldInfo.d.ts} +0 -0
  329. /package/dist/utilities/{getFieldInfo.js → fields/getFieldInfo.js} +0 -0
  330. /package/dist/utilities/{updateFieldsConfig.d.ts → fields/updateFieldsConfig.d.ts} +0 -0
  331. /package/dist/utilities/{extractImageData.d.ts → images/extractImageData.d.ts} +0 -0
  332. /package/dist/utilities/{extractImageData.js → images/extractImageData.js} +0 -0
  333. /package/dist/utilities/{extractPromptAttachments.d.ts → images/extractPromptAttachments.d.ts} +0 -0
  334. /package/dist/utilities/{extractPromptAttachments.js → images/extractPromptAttachments.js} +0 -0
  335. /package/dist/utilities/{resolveImageReferences.d.ts → images/resolveImageReferences.d.ts} +0 -0
  336. /package/dist/utilities/{editorSchemaValidator.d.ts → lexical/editorSchemaValidator.d.ts} +0 -0
  337. /package/dist/utilities/{editorSchemaValidator.js → lexical/editorSchemaValidator.js} +0 -0
  338. /package/dist/utilities/{lexicalToHTML.d.ts → lexical/lexicalToHTML.d.ts} +0 -0
  339. /package/dist/utilities/{lexicalToHTML.js → lexical/lexicalToHTML.js} +0 -0
  340. /package/dist/utilities/{setSafeLexicalState.d.ts → lexical/setSafeLexicalState.d.ts} +0 -0
  341. /package/dist/utilities/{setSafeLexicalState.js → lexical/setSafeLexicalState.js} +0 -0
@@ -1,5 +1,68 @@
1
1
  import * as process from 'node:process';
2
- // Type-safe provider factory functions
2
+ function isRecord(value) {
3
+ return !!value && typeof value === 'object' && !Array.isArray(value);
4
+ }
5
+ function resolveProviderOptions(settingsForUseCase) {
6
+ if (!settingsForUseCase) {
7
+ return {};
8
+ }
9
+ const provider = settingsForUseCase.provider;
10
+ if (provider) {
11
+ const allOptions = settingsForUseCase.providerOptions;
12
+ return allOptions?.[provider] || {};
13
+ }
14
+ return {};
15
+ }
16
+ function deepMergeOptions(base, override) {
17
+ const merged = {
18
+ ...base
19
+ };
20
+ for (const [key, value] of Object.entries(override)){
21
+ const current = merged[key];
22
+ if (current && value && typeof current === 'object' && typeof value === 'object' && !Array.isArray(current) && !Array.isArray(value)) {
23
+ merged[key] = deepMergeOptions(current, value);
24
+ continue;
25
+ }
26
+ merged[key] = value;
27
+ }
28
+ return merged;
29
+ }
30
+ function resolveEffectiveProviderOptions({ defaultsForUseCase, providerId, settingsOverride }) {
31
+ const preNormalizedOptions = providerId && isRecord(settingsOverride) && isRecord(settingsOverride[providerId]) ? settingsOverride[providerId] : {};
32
+ const globalDefaultOptions = defaultsForUseCase?.provider === providerId ? resolveProviderOptions(defaultsForUseCase) : {};
33
+ const overrideOptions = Object.keys(preNormalizedOptions).length > 0 ? preNormalizedOptions : settingsOverride?.provider === providerId ? resolveProviderOptions(settingsOverride) : {};
34
+ return deepMergeOptions(globalDefaultOptions, overrideOptions);
35
+ }
36
+ export function toAISDKProviderOptions({ defaultsForUseCase, providerId, settingsOverride }) {
37
+ if (!providerId) {
38
+ return undefined;
39
+ }
40
+ const resolved = resolveEffectiveProviderOptions({
41
+ defaultsForUseCase,
42
+ providerId,
43
+ settingsOverride
44
+ });
45
+ if (Object.keys(resolved).length === 0) {
46
+ return undefined;
47
+ }
48
+ return {
49
+ [providerId]: resolved
50
+ };
51
+ }
52
+ // ─── Cache layer ────────────────────────────────────────────────
53
+ // Module-level caches with TTL to avoid redundant DB queries.
54
+ // A single text-generation request previously triggered 3 findGlobal
55
+ // calls; with this cache the DB is hit at most once per TTL window.
56
+ const CACHE_TTL = 60_000 // 60 seconds
57
+ ;
58
+ let registryCache = null;
59
+ let defaultsCache = null;
60
+ // Allow external invalidation (e.g. after saving AISettings)
61
+ export function invalidateProviderCache() {
62
+ registryCache = null;
63
+ defaultsCache = null;
64
+ }
65
+ // ─── Provider factory functions ─────────────────────────────────
3
66
  const providerFactories = {
4
67
  anthropic: async (block)=>{
5
68
  const { createAnthropic } = await import('@ai-sdk/anthropic');
@@ -15,7 +78,6 @@ const providerFactories = {
15
78
  },
16
79
  fal: async (block)=>{
17
80
  const { fal } = await import('@ai-sdk/fal');
18
- // Fal uses global instance, configure with apiKey
19
81
  process.env.FAL_KEY = block.apiKey;
20
82
  if (block.webhookSecret) {
21
83
  process.env.FAL_WEBHOOK_SECRET = block.webhookSecret;
@@ -37,7 +99,6 @@ const providerFactories = {
37
99
  });
38
100
  },
39
101
  'openai-compatible': async (block)=>{
40
- console.log('OpenAI compatible, ', block);
41
102
  const { createOpenAICompatible } = await import('@ai-sdk/openai-compatible');
42
103
  return createOpenAICompatible({
43
104
  name: block.providerName,
@@ -52,14 +113,54 @@ const providerFactories = {
52
113
  });
53
114
  }
54
115
  };
55
- /**
56
- * Type guard to check provider block type
57
- */ function isProviderBlock(block, blockType) {
116
+ // ─── Helpers ────────────────────────────────────────────────────
117
+ function isProviderBlock(block, blockType) {
58
118
  return block.blockType === blockType;
59
119
  }
120
+ function getFactoryForBlock(providerBlock) {
121
+ if (isProviderBlock(providerBlock, 'openai')) {
122
+ return ()=>providerFactories.openai(providerBlock);
123
+ }
124
+ if (isProviderBlock(providerBlock, 'anthropic')) {
125
+ return ()=>providerFactories.anthropic(providerBlock);
126
+ }
127
+ if (isProviderBlock(providerBlock, 'google')) {
128
+ return ()=>providerFactories.google(providerBlock);
129
+ }
130
+ if (isProviderBlock(providerBlock, 'xai')) {
131
+ return ()=>providerFactories.xai(providerBlock);
132
+ }
133
+ if (isProviderBlock(providerBlock, 'fal')) {
134
+ return ()=>providerFactories.fal(providerBlock);
135
+ }
136
+ if (isProviderBlock(providerBlock, 'elevenlabs')) {
137
+ return ()=>providerFactories.elevenlabs(providerBlock);
138
+ }
139
+ if (isProviderBlock(providerBlock, 'openai-compatible')) {
140
+ return ()=>providerFactories['openai-compatible'](providerBlock);
141
+ }
142
+ return undefined;
143
+ }
60
144
  /**
61
- * Load provider registry from AI Settings (type-safe)
145
+ * Resolve the provider SDK instance, caching after first call.
146
+ */ async function resolveProviderInstance(provider) {
147
+ if (provider.instance) {
148
+ return provider.instance;
149
+ }
150
+ if (!provider.factory) {
151
+ throw new Error(`Provider ${provider.id} has no factory or instance`);
152
+ }
153
+ const instance = await provider.factory();
154
+ provider.instance = instance;
155
+ return instance;
156
+ }
157
+ // ─── Public API ─────────────────────────────────────────────────
158
+ /**
159
+ * Load provider registry from AI Settings (cached with TTL).
62
160
  */ export async function getProviderRegistry(payload) {
161
+ if (registryCache && Date.now() - registryCache.timestamp < CACHE_TTL) {
162
+ return registryCache.data;
163
+ }
63
164
  const settings = await payload.findGlobal({
64
165
  slug: 'ai-providers',
65
166
  context: {
@@ -67,41 +168,17 @@ const providerFactories = {
67
168
  }
68
169
  });
69
170
  const registry = {};
70
- // console.log('settings - >', JSON.stringify(settings, null, 2))
71
171
  for (const providerBlock of settings.providers || []){
72
172
  if (!providerBlock.enabled) {
73
173
  continue;
74
174
  }
75
175
  const { blockType } = providerBlock;
76
- // Type-safe factory lookup and invocation
77
- let factory;
78
- if (isProviderBlock(providerBlock, 'openai')) {
79
- factory = ()=>providerFactories.openai(providerBlock);
80
- } else if (isProviderBlock(providerBlock, 'anthropic')) {
81
- factory = ()=>providerFactories.anthropic(providerBlock);
82
- } else if (isProviderBlock(providerBlock, 'google')) {
83
- factory = ()=>providerFactories.google(providerBlock);
84
- } else if (isProviderBlock(providerBlock, 'xai')) {
85
- factory = ()=>providerFactories.xai(providerBlock);
86
- } else if (isProviderBlock(providerBlock, 'fal')) {
87
- factory = ()=>providerFactories.fal(providerBlock);
88
- } else if (isProviderBlock(providerBlock, 'elevenlabs')) {
89
- factory = ()=>providerFactories.elevenlabs(providerBlock);
90
- } else if (isProviderBlock(providerBlock, 'openai-compatible')) {
91
- factory = ()=>providerFactories['openai-compatible'](providerBlock);
92
- }
176
+ const factory = getFactoryForBlock(providerBlock);
93
177
  if (!factory) {
94
- console.warn(`No factory for provider: ${blockType}`);
178
+ payload.logger.warn(`— AI Plugin: No factory for provider: ${blockType}`);
95
179
  continue;
96
180
  }
97
- // Filter enabled models only
98
181
  const enabledModels = providerBlock.models.filter((m)=>m.enabled);
99
- // Extract provider options
100
- const options = {
101
- image: 'imageProviderOptions' in providerBlock ? providerBlock.imageProviderOptions : undefined,
102
- text: 'textProviderOptions' in providerBlock ? providerBlock.textProviderOptions : undefined,
103
- tts: 'ttsProviderOptions' in providerBlock ? providerBlock.ttsProviderOptions : undefined
104
- };
105
182
  registry[blockType] = {
106
183
  id: blockType,
107
184
  name: 'providerName' in providerBlock ? providerBlock.providerName : blockType,
@@ -109,44 +186,49 @@ const providerFactories = {
109
186
  enabled: true,
110
187
  factory,
111
188
  instance: undefined,
112
- models: enabledModels,
113
- options
189
+ models: enabledModels
114
190
  };
115
191
  }
192
+ // Also cache defaults from the same settings fetch to save a second query
193
+ defaultsCache = {
194
+ data: settings.defaults,
195
+ timestamp: Date.now()
196
+ };
197
+ registryCache = {
198
+ data: registry,
199
+ timestamp: Date.now()
200
+ };
116
201
  return registry;
117
202
  }
118
203
  /**
119
- * Get global defaults from AI Settings
204
+ * Get global defaults from AI Settings (cached with TTL).
120
205
  */ export async function getGlobalDefaults(payload) {
206
+ if (defaultsCache && Date.now() - defaultsCache.timestamp < CACHE_TTL) {
207
+ return defaultsCache.data;
208
+ }
121
209
  const settings = await payload.findGlobal({
122
210
  slug: 'ai-providers'
123
211
  });
212
+ defaultsCache = {
213
+ data: settings.defaults,
214
+ timestamp: Date.now()
215
+ };
124
216
  return settings.defaults;
125
217
  }
126
218
  /**
127
- * Get language model (type-safe, async)
128
- */ export async function getLanguageModel(payload, providerId, modelId, options) {
129
- if (!providerId || !modelId) {
130
- const defaults = await getGlobalDefaults(payload);
131
- if (!providerId) {
132
- providerId = defaults?.text?.provider;
133
- }
134
- if (!modelId) {
135
- modelId = defaults?.text?.model;
136
- }
219
+ * Get language model (cached registry + single defaults call).
220
+ */ export async function getLanguageModel(payload, providerId, modelId, settingsOverride) {
221
+ const registry = await getProviderRegistry(payload);
222
+ const defaults = await getGlobalDefaults(payload);
223
+ if (!providerId) {
224
+ providerId = defaults?.text?.provider;
137
225
  }
138
- // Extract global default options if we are using the default provider
139
- let globalDefaultOptions = {};
140
- if (providerId) {
141
- const defaults = await getGlobalDefaults(payload);
142
- if (defaults?.text?.provider === providerId) {
143
- globalDefaultOptions = defaults?.text?.options || {};
144
- }
226
+ if (!modelId) {
227
+ modelId = defaults?.text?.model;
145
228
  }
146
229
  if (!providerId || !modelId) {
147
230
  throw new Error('Provider and model must be specified or configured in defaults');
148
231
  }
149
- const registry = await getProviderRegistry(payload);
150
232
  const provider = registry[providerId];
151
233
  if (!provider) {
152
234
  throw new Error(`Provider ${providerId} not found in registry`);
@@ -154,113 +236,77 @@ const providerFactories = {
154
236
  if (!provider.enabled) {
155
237
  throw new Error(`Provider ${providerId} is not enabled`);
156
238
  }
157
- // We only support factory now for dynamic loading, instance is legacy/cache
158
- let providerInstance;
159
- if (provider.instance) {
160
- providerInstance = provider.instance;
161
- } else if (provider.factory) {
162
- providerInstance = await provider.factory();
163
- } else {
164
- throw new Error(`Provider ${providerId} has no factory or instance`);
165
- }
166
- // Merge default settings with override options
167
- const finalOptions = {
168
- ...provider.options?.text || {},
169
- ...globalDefaultOptions,
170
- ...options || {}
171
- };
172
- return providerInstance(modelId, finalOptions);
239
+ const options = resolveEffectiveProviderOptions({
240
+ defaultsForUseCase: defaults?.text,
241
+ providerId,
242
+ settingsOverride
243
+ });
244
+ const providerInstance = await resolveProviderInstance(provider);
245
+ return providerInstance(modelId, options);
173
246
  }
174
- export async function getImageModel(payload, providerId, modelId, options, isMultimodalText) {
175
- if (!providerId || !modelId) {
176
- const defaults = await getGlobalDefaults(payload);
177
- if (!providerId) {
178
- providerId = defaults?.image?.provider;
179
- }
180
- if (!modelId) {
181
- modelId = defaults?.image?.model;
182
- }
247
+ /**
248
+ * Get image model (cached registry + single defaults call).
249
+ */ export async function getImageModel(payload, providerId, modelId, isMultimodalText, settingsOverride) {
250
+ const registry = await getProviderRegistry(payload);
251
+ const defaults = await getGlobalDefaults(payload);
252
+ if (!providerId) {
253
+ providerId = defaults?.image?.provider;
183
254
  }
184
- // Extract global default options if we are using the default provider
185
- let globalDefaultOptions = {};
186
- if (providerId) {
187
- const defaults = await getGlobalDefaults(payload);
188
- if (defaults?.image?.provider === providerId) {
189
- globalDefaultOptions = defaults?.image?.options || {};
190
- }
255
+ if (!modelId) {
256
+ modelId = defaults?.image?.model;
191
257
  }
192
258
  if (!providerId || !modelId) {
193
259
  throw new Error('Provider and model must be specified or configured in defaults');
194
260
  }
195
- const registry = await getProviderRegistry(payload);
196
261
  const provider = registry[providerId];
197
262
  if (!provider) {
198
263
  throw new Error(`Provider ${providerId} not found`);
199
264
  }
200
- // Merge default settings with override options
201
- const finalOptions = {
202
- ...provider.options?.image || {},
203
- ...globalDefaultOptions,
204
- ...options || {}
205
- };
206
- if (provider.instance) {
207
- return provider.instance;
265
+ const options = resolveEffectiveProviderOptions({
266
+ defaultsForUseCase: defaults?.image,
267
+ providerId,
268
+ settingsOverride
269
+ });
270
+ const instance = await resolveProviderInstance(provider);
271
+ // Type-safe check for image support
272
+ if (!isMultimodalText && typeof instance === 'function' && 'image' in instance && typeof instance.image === 'function') {
273
+ return instance.image(modelId, options);
208
274
  }
209
- if (provider.factory) {
210
- const instance = await provider.factory();
211
- // Type-safe check for image support
212
- if (!isMultimodalText && typeof instance === 'function' && 'image' in instance && typeof instance.image === 'function') {
213
- return instance.image(modelId, finalOptions);
214
- }
215
- // Also check if instance is an object with image method
216
- if (typeof instance === 'object' && instance !== null && 'image' in instance && !isMultimodalText) {
217
- return instance.image?.(modelId, finalOptions);
218
- }
219
- // Fallback for providers that might return the model directly or use the default factory
220
- return typeof instance === 'function' ? instance(modelId, finalOptions) : instance;
275
+ // Also check if instance is an object with image method
276
+ if (typeof instance === 'object' && instance !== null && 'image' in instance && !isMultimodalText) {
277
+ return instance.image?.(modelId, options);
221
278
  }
222
- throw new Error(`Invalid provider configuration for ${providerId}`);
279
+ // Fallback for providers that might return the model directly
280
+ return typeof instance === 'function' ? instance(modelId, options) : instance;
223
281
  }
224
- export async function getTTSModel(payload, providerId, modelId, options) {
225
- if (!providerId || !modelId) {
226
- const defaults = await getGlobalDefaults(payload);
227
- if (!providerId) {
228
- providerId = defaults?.tts?.provider;
229
- }
230
- if (!modelId) {
231
- modelId = defaults?.tts?.model;
232
- }
282
+ /**
283
+ * Get TTS model (cached registry + single defaults call).
284
+ */ export async function getTTSModel(payload, providerId, modelId, settingsOverride) {
285
+ const registry = await getProviderRegistry(payload);
286
+ const defaults = await getGlobalDefaults(payload);
287
+ if (!providerId) {
288
+ providerId = defaults?.tts?.provider;
233
289
  }
234
- // Extract global default options if we are using the default provider
235
- let globalDefaultOptions = {};
236
- if (providerId) {
237
- const defaults = await getGlobalDefaults(payload);
238
- if (defaults?.tts?.provider === providerId) {
239
- globalDefaultOptions = defaults?.tts?.options || {};
240
- }
290
+ if (!modelId) {
291
+ modelId = defaults?.tts?.model;
241
292
  }
242
293
  if (!providerId || !modelId) {
243
294
  throw new Error('Provider and model must be specified or configured in defaults');
244
295
  }
245
- const registry = await getProviderRegistry(payload);
246
296
  const provider = registry[providerId];
247
297
  if (!provider) {
248
298
  throw new Error(`Provider ${providerId} not found`);
249
299
  }
250
- // Merge default settings with override options
251
- const finalOptions = {
252
- ...provider.options?.tts || {},
253
- ...globalDefaultOptions,
254
- ...options || {}
255
- };
256
- if (provider.factory) {
257
- const instance = await provider.factory();
258
- if (instance?.speech) {
259
- return instance.speech(modelId, finalOptions);
260
- }
261
- return typeof instance === 'function' ? instance(modelId, finalOptions) : instance;
300
+ const options = resolveEffectiveProviderOptions({
301
+ defaultsForUseCase: defaults?.tts,
302
+ providerId,
303
+ settingsOverride
304
+ });
305
+ const instance = await resolveProviderInstance(provider);
306
+ if (instance?.speech) {
307
+ return instance.speech(modelId, options);
262
308
  }
263
- throw new Error(`Invalid provider configuration for ${providerId}`);
309
+ return typeof instance === 'function' ? instance(modelId, options) : instance;
264
310
  }
265
311
 
266
312
  //# sourceMappingURL=registry.js.map
@@ -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 * 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-providers',\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-providers',\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 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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"}
1
+ {"version":3,"sources":["../../../src/ai/providers/registry.ts"],"sourcesContent":["import type { LanguageModel } from 'ai'\nimport type { Payload } from 'payload'\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\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction resolveProviderOptions(\n settingsForUseCase:\n | {\n provider?: string\n providerOptions?: Record<string, unknown>\n }\n | undefined,\n): Record<string, unknown> {\n if (!settingsForUseCase) {\n return {}\n }\n\n const provider = settingsForUseCase.provider\n if (provider) {\n const allOptions = settingsForUseCase.providerOptions as Record<string, any> | undefined\n return allOptions?.[provider] || {}\n }\n\n return {}\n}\n\nfunction deepMergeOptions(\n base: Record<string, any>,\n override: Record<string, any>,\n): Record<string, any> {\n const merged = { ...base }\n\n for (const [key, value] of Object.entries(override)) {\n const current = merged[key]\n if (\n current &&\n value &&\n typeof current === 'object' &&\n typeof value === 'object' &&\n !Array.isArray(current) &&\n !Array.isArray(value)\n ) {\n merged[key] = deepMergeOptions(current, value)\n continue\n }\n merged[key] = value\n }\n\n return merged\n}\n\nfunction resolveEffectiveProviderOptions({\n defaultsForUseCase,\n providerId,\n settingsOverride,\n}: {\n defaultsForUseCase?: { provider?: string }\n providerId?: string\n settingsOverride?: Record<string, unknown>\n}): Record<string, any> {\n const preNormalizedOptions =\n providerId && isRecord(settingsOverride) && isRecord(settingsOverride[providerId])\n ? (settingsOverride[providerId] as Record<string, any>)\n : {}\n\n const globalDefaultOptions =\n defaultsForUseCase?.provider === providerId\n ? resolveProviderOptions(defaultsForUseCase)\n : {}\n const overrideOptions =\n Object.keys(preNormalizedOptions).length > 0\n ? preNormalizedOptions\n : settingsOverride?.provider === providerId\n ? resolveProviderOptions(settingsOverride as { provider?: string })\n : {}\n\n return deepMergeOptions(globalDefaultOptions, overrideOptions)\n}\n\nexport function toAISDKProviderOptions({\n defaultsForUseCase,\n providerId,\n settingsOverride,\n}: {\n defaultsForUseCase?: { provider?: string }\n providerId?: string\n settingsOverride?: Record<string, unknown>\n}): Record<string, Record<string, any>> | undefined {\n if (!providerId) {\n return undefined\n }\n\n const resolved = resolveEffectiveProviderOptions({\n defaultsForUseCase,\n providerId,\n settingsOverride,\n })\n\n if (Object.keys(resolved).length === 0) {\n return undefined\n }\n\n return {\n [providerId]: resolved,\n }\n}\n\n// ─── Cache layer ────────────────────────────────────────────────\n// Module-level caches with TTL to avoid redundant DB queries.\n// A single text-generation request previously triggered 3 findGlobal\n// calls; with this cache the DB is hit at most once per TTL window.\n\nconst CACHE_TTL = 60_000 // 60 seconds\n\ninterface CacheEntry<T> {\n data: T\n timestamp: number\n}\n\nlet registryCache: CacheEntry<ProviderRegistry> | null = null\nlet defaultsCache: CacheEntry<AISettingsData['defaults']> | null = null\n\n// Allow external invalidation (e.g. after saving AISettings)\nexport function invalidateProviderCache(): void {\n registryCache = null\n defaultsCache = null\n}\n\n// ─── Provider factory functions ─────────────────────────────────\n\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 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 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// ─── Helpers ────────────────────────────────────────────────────\n\nfunction isProviderBlock<T extends ProviderBlockData>(\n block: ProviderBlockData,\n blockType: T['blockType'],\n): block is T {\n return block.blockType === blockType\n}\n\nfunction getFactoryForBlock(providerBlock: ProviderBlockData): (() => Promise<any>) | undefined {\n if (isProviderBlock<OpenAIBlockData>(providerBlock, 'openai')) {\n return () => providerFactories.openai(providerBlock)\n }\n if (isProviderBlock<AnthropicBlockData>(providerBlock, 'anthropic')) {\n return () => providerFactories.anthropic(providerBlock)\n }\n if (isProviderBlock<GoogleBlockData>(providerBlock, 'google')) {\n return () => providerFactories.google(providerBlock)\n }\n if (isProviderBlock<XAIBlockData>(providerBlock, 'xai')) {\n return () => providerFactories.xai(providerBlock)\n }\n if (isProviderBlock<FalBlockData>(providerBlock, 'fal')) {\n return () => providerFactories.fal(providerBlock)\n }\n if (isProviderBlock<ElevenLabsBlockData>(providerBlock, 'elevenlabs')) {\n return () => providerFactories.elevenlabs(providerBlock)\n }\n if (isProviderBlock<OpenAICompatibleBlockData>(providerBlock, 'openai-compatible')) {\n return () => providerFactories['openai-compatible'](providerBlock)\n }\n return undefined\n}\n\n/**\n * Resolve the provider SDK instance, caching after first call.\n */\nasync function resolveProviderInstance(provider: ProviderRegistry[string]): Promise<any> {\n if (provider.instance) {\n return provider.instance\n }\n if (!provider.factory) {\n throw new Error(`Provider ${provider.id} has no factory or instance`)\n }\n const instance = await provider.factory()\n provider.instance = instance\n return instance\n}\n\n// ─── Public API ─────────────────────────────────────────────────\n\n/**\n * Load provider registry from AI Settings (cached with TTL).\n */\nexport async function getProviderRegistry(payload: Payload): Promise<ProviderRegistry> {\n if (registryCache && Date.now() - registryCache.timestamp < CACHE_TTL) {\n return registryCache.data\n }\n\n const settings = (await payload.findGlobal({\n slug: 'ai-providers',\n context: { unsafe: true },\n })) as unknown as AISettingsData\n\n const registry: ProviderRegistry = {}\n\n for (const providerBlock of settings.providers || []) {\n if (!providerBlock.enabled) {\n continue\n }\n\n const { blockType } = providerBlock\n const factory = getFactoryForBlock(providerBlock)\n\n if (!factory) {\n payload.logger.warn(`— AI Plugin: No factory for provider: ${blockType}`)\n continue\n }\n\n const enabledModels = providerBlock.models.filter((m) => m.enabled)\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,\n models: enabledModels,\n }\n }\n\n // Also cache defaults from the same settings fetch to save a second query\n defaultsCache = { data: settings.defaults, timestamp: Date.now() }\n registryCache = { data: registry, timestamp: Date.now() }\n\n return registry\n}\n\n/**\n * Get global defaults from AI Settings (cached with TTL).\n */\nexport async function getGlobalDefaults(payload: Payload) {\n if (defaultsCache && Date.now() - defaultsCache.timestamp < CACHE_TTL) {\n return defaultsCache.data\n }\n\n const settings = (await payload.findGlobal({\n slug: 'ai-providers',\n })) as unknown as AISettingsData\n\n defaultsCache = { data: settings.defaults, timestamp: Date.now() }\n return settings.defaults\n}\n\n/**\n * Get language model (cached registry + single defaults call).\n */\nexport async function getLanguageModel(\n payload: Payload,\n providerId?: string,\n modelId?: string,\n settingsOverride?: Record<string, unknown>,\n): Promise<LanguageModel> {\n const registry = await getProviderRegistry(payload)\n const defaults = await getGlobalDefaults(payload)\n\n if (!providerId) {\n providerId = defaults?.text?.provider\n }\n if (!modelId) {\n modelId = defaults?.text?.model\n }\n\n if (!providerId || !modelId) {\n throw new Error('Provider and model must be specified or configured in defaults')\n }\n\n const provider = registry[providerId]\n\n if (!provider) {\n throw new Error(`Provider ${providerId} not found in registry`)\n }\n if (!provider.enabled) {\n throw new Error(`Provider ${providerId} is not enabled`)\n }\n\n const options = resolveEffectiveProviderOptions({\n defaultsForUseCase: defaults?.text,\n providerId,\n settingsOverride,\n })\n\n const providerInstance = await resolveProviderInstance(provider)\n return providerInstance(modelId, options)\n}\n\n/**\n * Get image model (cached registry + single defaults call).\n */\nexport async function getImageModel(\n payload: Payload,\n providerId?: string,\n modelId?: string,\n isMultimodalText?: boolean,\n settingsOverride?: Record<string, unknown>,\n) {\n const registry = await getProviderRegistry(payload)\n const defaults = await getGlobalDefaults(payload)\n\n if (!providerId) {\n providerId = defaults?.image?.provider\n }\n if (!modelId) {\n modelId = defaults?.image?.model\n }\n\n if (!providerId || !modelId) {\n throw new Error('Provider and model must be specified or configured in defaults')\n }\n\n const provider = registry[providerId]\n\n if (!provider) {\n throw new Error(`Provider ${providerId} not found`)\n }\n\n const options = resolveEffectiveProviderOptions({\n defaultsForUseCase: defaults?.image,\n providerId,\n settingsOverride,\n })\n\n const instance = await resolveProviderInstance(provider)\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, options)\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, options)\n }\n\n // Fallback for providers that might return the model directly\n return typeof instance === 'function' ? instance(modelId, options) : instance\n}\n\n/**\n * Get TTS model (cached registry + single defaults call).\n */\nexport async function getTTSModel(\n payload: Payload,\n providerId?: string,\n modelId?: string,\n settingsOverride?: Record<string, unknown>,\n) {\n const registry = await getProviderRegistry(payload)\n const defaults = await getGlobalDefaults(payload)\n\n if (!providerId) {\n providerId = defaults?.tts?.provider\n }\n if (!modelId) {\n modelId = defaults?.tts?.model\n }\n\n if (!providerId || !modelId) {\n throw new Error('Provider and model must be specified or configured in defaults')\n }\n\n const provider = registry[providerId]\n\n if (!provider) {\n throw new Error(`Provider ${providerId} not found`)\n }\n\n const options = resolveEffectiveProviderOptions({\n defaultsForUseCase: defaults?.tts,\n providerId,\n settingsOverride,\n })\n\n const instance = await resolveProviderInstance(provider)\n\n if (instance?.speech) {\n return instance.speech(modelId, options)\n }\n return typeof instance === 'function' ? instance(modelId, options) : instance\n}\n"],"names":["process","isRecord","value","Array","isArray","resolveProviderOptions","settingsForUseCase","provider","allOptions","providerOptions","deepMergeOptions","base","override","merged","key","Object","entries","current","resolveEffectiveProviderOptions","defaultsForUseCase","providerId","settingsOverride","preNormalizedOptions","globalDefaultOptions","overrideOptions","keys","length","toAISDKProviderOptions","undefined","resolved","CACHE_TTL","registryCache","defaultsCache","invalidateProviderCache","providerFactories","anthropic","block","createAnthropic","apiKey","elevenlabs","createElevenLabs","fal","env","FAL_KEY","webhookSecret","FAL_WEBHOOK_SECRET","google","createGoogleGenerativeAI","openai","createOpenAI","baseURL","organization","createOpenAICompatible","name","providerName","xai","createXai","isProviderBlock","blockType","getFactoryForBlock","providerBlock","resolveProviderInstance","instance","factory","Error","id","getProviderRegistry","payload","Date","now","timestamp","data","settings","findGlobal","slug","context","unsafe","registry","providers","enabled","logger","warn","enabledModels","models","filter","m","defaults","getGlobalDefaults","getLanguageModel","modelId","text","model","options","providerInstance","getImageModel","isMultimodalText","image","getTTSModel","tts","speech"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { LanguageModel } from 'ai';
2
2
  export type UseCase = 'image' | 'text' | 'tts' | 'video';
3
+ export type ProviderOptionsByProvider = Record<string, Record<string, unknown>>;
3
4
  export type ProviderId = 'anthropic' | 'elevenlabs' | 'fal' | 'google' | 'openai' | 'openai-compatible' | 'xai';
4
5
  export interface BaseProviderBlock {
5
6
  blockType: string;
@@ -17,11 +18,8 @@ export interface OpenAIBlockData extends BaseProviderBlock {
17
18
  apiKey: string;
18
19
  baseURL?: string;
19
20
  blockType: 'openai';
20
- imageProviderOptions?: Record<string, any>;
21
21
  organization?: string;
22
22
  supportedUseCases: UseCase[];
23
- textProviderOptions?: Record<string, any>;
24
- ttsProviderOptions?: Record<string, any>;
25
23
  voices?: any[];
26
24
  }
27
25
  export interface AnthropicBlockData extends BaseProviderBlock {
@@ -32,10 +30,7 @@ export interface AnthropicBlockData extends BaseProviderBlock {
32
30
  export interface GoogleBlockData extends BaseProviderBlock {
33
31
  apiKey: string;
34
32
  blockType: 'google';
35
- imageProviderOptions?: Record<string, any>;
36
33
  supportedUseCases: ('image' | 'text' | 'tts')[];
37
- textProviderOptions?: Record<string, any>;
38
- ttsProviderOptions?: Record<string, any>;
39
34
  }
40
35
  export interface XAIBlockData extends BaseProviderBlock {
41
36
  apiKey: string;
@@ -52,7 +47,6 @@ export interface ElevenLabsBlockData extends BaseProviderBlock {
52
47
  apiKey: string;
53
48
  blockType: 'elevenlabs';
54
49
  supportedUseCases: ['tts'];
55
- ttsProviderOptions?: Record<string, any>;
56
50
  voices?: any[];
57
51
  }
58
52
  export interface OpenAICompatibleBlockData extends BaseProviderBlock {
@@ -80,36 +74,21 @@ export interface ProviderConfig {
80
74
  instance?: any;
81
75
  models: ProviderModel[];
82
76
  name: string;
83
- options?: {
84
- image?: Record<string, any>;
85
- text?: Record<string, any>;
86
- tts?: Record<string, any>;
87
- };
88
77
  }
89
78
  export type ProviderRegistry = Record<string, ProviderConfig>;
79
+ export interface UseCaseDefaults {
80
+ model?: string;
81
+ provider?: string;
82
+ providerOptions?: ProviderOptionsByProvider;
83
+ schema?: ProviderOptionsByProvider;
84
+ voice?: string;
85
+ }
90
86
  export interface AISettingsData {
91
87
  defaults: {
92
- image?: {
93
- model: string;
94
- options?: Record<string, any>;
95
- provider: string;
96
- };
97
- text?: {
98
- model: string;
99
- options?: Record<string, any>;
100
- provider: string;
101
- };
102
- tts?: {
103
- model: string;
104
- options?: Record<string, any>;
105
- provider: string;
106
- voice?: string;
107
- };
108
- video?: {
109
- model: string;
110
- options?: Record<string, any>;
111
- provider: string;
112
- };
88
+ image?: UseCaseDefaults;
89
+ text?: UseCaseDefaults;
90
+ tts?: UseCaseDefaults;
91
+ video?: UseCaseDefaults;
113
92
  };
114
93
  providers: ProviderBlockData[];
115
94
  }
@@ -1,4 +1,3 @@
1
- // AI Settings global data structure
2
1
  export { };
3
2
 
4
3
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ai/providers/types.ts"],"sourcesContent":["import type { LanguageModel } from 'ai'\n\nexport type UseCase = 'image' | 'text' | 'tts' | 'video'\n\nexport type ProviderId =\n | 'anthropic'\n | 'elevenlabs'\n | 'fal'\n | 'google'\n | 'openai'\n | 'openai-compatible'\n | 'xai'\n\n// Base block data structure\nexport interface BaseProviderBlock {\n blockType: string\n enabled: boolean\n models: ProviderModel[]\n}\n\nexport interface ProviderModel {\n enabled: boolean\n id: string\n name: string\n responseModalities?: string[]\n useCase: UseCase\n}\n\n// Provider-specific block types\nexport interface OpenAIBlockData extends BaseProviderBlock {\n apiKey: string\n baseURL?: string\n blockType: 'openai'\n imageProviderOptions?: Record<string, any>\n organization?: string\n supportedUseCases: UseCase[]\n textProviderOptions?: Record<string, any>\n ttsProviderOptions?: Record<string, any>\n voices?: any[]\n}\n\nexport interface AnthropicBlockData extends BaseProviderBlock {\n apiKey: string\n blockType: 'anthropic'\n supportedUseCases: ['text']\n}\n\nexport interface GoogleBlockData extends BaseProviderBlock {\n apiKey: string\n blockType: 'google'\n imageProviderOptions?: Record<string, any>\n supportedUseCases: ('image' | 'text' | 'tts')[]\n textProviderOptions?: Record<string, any>\n ttsProviderOptions?: Record<string, any>\n}\n\nexport interface XAIBlockData extends BaseProviderBlock {\n apiKey: string\n blockType: 'xai'\n supportedUseCases: ('image' | 'text')[]\n}\n\nexport interface FalBlockData extends BaseProviderBlock {\n apiKey: string\n blockType: 'fal'\n supportedUseCases: ('image' | 'video')[]\n webhookSecret?: string\n}\n\nexport interface ElevenLabsBlockData extends BaseProviderBlock {\n apiKey: string\n blockType: 'elevenlabs'\n supportedUseCases: ['tts']\n ttsProviderOptions?: Record<string, any>\n voices?: any[]\n}\n\nexport interface OpenAICompatibleBlockData extends BaseProviderBlock {\n apiKey?: string\n baseURL: string\n blockType: 'openai-compatible'\n providerName: string\n supportedUseCases: UseCase[]\n}\n\n// Union type for all provider blocks\nexport type ProviderBlockData =\n | AnthropicBlockData\n | ElevenLabsBlockData\n | FalBlockData\n | GoogleBlockData\n | OpenAIBlockData\n | OpenAICompatibleBlockData\n | XAIBlockData\n\n// Generic AI Provider interface matching Vercel AI SDK structure\nexport interface AIProvider {\n (modelId: string, settings?: any): LanguageModel\n chat?: (modelId: string, settings?: any) => LanguageModel\n completion?: (modelId: string, settings?: any) => LanguageModel\n embedding?: (modelId: string, settings?: any) => any\n image?: (modelId: string, settings?: any) => any\n languageModel?: (modelId: string, settings?: any) => LanguageModel\n textEmbedding?: (modelId: string, settings?: any) => any\n}\n\n// Provider registry types\nexport interface ProviderConfig {\n apiKey?: string\n enabled: boolean\n factory: () => AIProvider | any // Provider instance factory\n id: string\n instance?: any // For providers like fal that use singleton\n models: ProviderModel[]\n name: string\n options?: {\n image?: Record<string, any>\n text?: Record<string, any>\n tts?: Record<string, any>\n }\n}\n\nexport type ProviderRegistry = Record<string, ProviderConfig>\n\n// AI Settings global data structure\nexport interface AISettingsData {\n defaults: {\n image?: { model: string; options?: Record<string, any>; provider: string }\n text?: { model: string; options?: Record<string, any>; provider: string }\n tts?: { model: string; options?: Record<string, any>; provider: string; voice?: string }\n video?: { model: string; options?: Record<string, any>; provider: string }\n }\n providers: ProviderBlockData[]\n}\n"],"names":[],"mappings":"AA4HA,oCAAoC;AACpC,WAQC"}
1
+ {"version":3,"sources":["../../../src/ai/providers/types.ts"],"sourcesContent":["import type { LanguageModel } from 'ai'\n\nexport type UseCase = 'image' | 'text' | 'tts' | 'video'\n\nexport type ProviderOptionsByProvider = Record<string, Record<string, unknown>>\n\nexport type ProviderId =\n | 'anthropic'\n | 'elevenlabs'\n | 'fal'\n | 'google'\n | 'openai'\n | 'openai-compatible'\n | 'xai'\n\n// Base block data structure\nexport interface BaseProviderBlock {\n blockType: string\n enabled: boolean\n models: ProviderModel[]\n}\n\nexport interface ProviderModel {\n enabled: boolean\n id: string\n name: string\n responseModalities?: string[]\n useCase: UseCase\n}\n\n// Provider-specific block types\nexport interface OpenAIBlockData extends BaseProviderBlock {\n apiKey: string\n baseURL?: string\n blockType: 'openai'\n organization?: string\n supportedUseCases: UseCase[]\n voices?: any[]\n}\n\nexport interface AnthropicBlockData extends BaseProviderBlock {\n apiKey: string\n blockType: 'anthropic'\n supportedUseCases: ['text']\n}\n\nexport interface GoogleBlockData extends BaseProviderBlock {\n apiKey: string\n blockType: 'google'\n supportedUseCases: ('image' | 'text' | 'tts')[]\n}\n\nexport interface XAIBlockData extends BaseProviderBlock {\n apiKey: string\n blockType: 'xai'\n supportedUseCases: ('image' | 'text')[]\n}\n\nexport interface FalBlockData extends BaseProviderBlock {\n apiKey: string\n blockType: 'fal'\n supportedUseCases: ('image' | 'video')[]\n webhookSecret?: string\n}\n\nexport interface ElevenLabsBlockData extends BaseProviderBlock {\n apiKey: string\n blockType: 'elevenlabs'\n supportedUseCases: ['tts']\n voices?: any[]\n}\n\nexport interface OpenAICompatibleBlockData extends BaseProviderBlock {\n apiKey?: string\n baseURL: string\n blockType: 'openai-compatible'\n providerName: string\n supportedUseCases: UseCase[]\n}\n\n// Union type for all provider blocks\nexport type ProviderBlockData =\n | AnthropicBlockData\n | ElevenLabsBlockData\n | FalBlockData\n | GoogleBlockData\n | OpenAIBlockData\n | OpenAICompatibleBlockData\n | XAIBlockData\n\n// Generic AI Provider interface matching Vercel AI SDK structure\nexport interface AIProvider {\n (modelId: string, settings?: any): LanguageModel\n chat?: (modelId: string, settings?: any) => LanguageModel\n completion?: (modelId: string, settings?: any) => LanguageModel\n embedding?: (modelId: string, settings?: any) => any\n image?: (modelId: string, settings?: any) => any\n languageModel?: (modelId: string, settings?: any) => LanguageModel\n textEmbedding?: (modelId: string, settings?: any) => any\n}\n\n// Provider registry types\nexport interface ProviderConfig {\n apiKey?: string\n enabled: boolean\n factory: () => AIProvider | any // Provider instance factory\n id: string\n instance?: any // For providers like fal that use singleton\n models: ProviderModel[]\n name: string\n}\n\nexport type ProviderRegistry = Record<string, ProviderConfig>\n\nexport interface UseCaseDefaults {\n model?: string\n provider?: string\n providerOptions?: ProviderOptionsByProvider\n schema?: ProviderOptionsByProvider\n voice?: string\n}\n\nexport interface AISettingsData {\n defaults: {\n image?: UseCaseDefaults\n text?: UseCaseDefaults\n tts?: UseCaseDefaults\n video?: UseCaseDefaults\n }\n providers: ProviderBlockData[]\n}\n"],"names":[],"mappings":"AA0HA,WAQC"}
@@ -1,4 +1,4 @@
1
- import { isObjectSchema } from '../utils/isObjectSchema.js';
1
+ import { isObjectSchema } from '../utilities/isObjectSchema.js';
2
2
  export const documentSchema = {
3
3
  type: 'object',
4
4
  $schema: 'http://json-schema.org/draft-07/schema#',