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

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 (284) hide show
  1. package/{LICENSE.md → LICENSE} +1 -1
  2. package/README.md +218 -229
  3. package/dist/access/checkAccess.d.ts +4 -0
  4. package/dist/access/checkAccess.js +20 -0
  5. package/dist/access/checkAccess.js.map +1 -0
  6. package/dist/ai/core/generateObject.d.ts +7 -0
  7. package/dist/ai/core/generateObject.js +35 -0
  8. package/dist/ai/core/generateObject.js.map +1 -0
  9. package/dist/ai/core/generateText.d.ts +7 -0
  10. package/dist/ai/core/generateText.js +31 -0
  11. package/dist/ai/core/generateText.js.map +1 -0
  12. package/dist/ai/core/index.d.ts +11 -0
  13. package/dist/ai/core/index.js +10 -0
  14. package/dist/ai/core/index.js.map +1 -0
  15. package/dist/ai/core/media/generateMedia.d.ts +7 -0
  16. package/dist/ai/core/media/generateMedia.js +50 -0
  17. package/dist/ai/core/media/generateMedia.js.map +1 -0
  18. package/dist/ai/core/media/image/generateImage.d.ts +6 -0
  19. package/dist/ai/core/media/image/generateImage.js +41 -0
  20. package/dist/ai/core/media/image/generateImage.js.map +1 -0
  21. package/dist/ai/core/media/image/handlers/multimodal.d.ts +7 -0
  22. package/dist/ai/core/media/image/handlers/multimodal.js +95 -0
  23. package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -0
  24. package/dist/ai/core/media/image/handlers/standard.d.ts +7 -0
  25. package/dist/ai/core/media/image/handlers/standard.js +28 -0
  26. package/dist/ai/core/media/image/handlers/standard.js.map +1 -0
  27. package/dist/ai/core/media/image/index.d.ts +2 -0
  28. package/dist/ai/core/media/image/index.js +3 -0
  29. package/dist/ai/core/media/image/index.js.map +1 -0
  30. package/dist/ai/core/media/index.d.ts +2 -0
  31. package/dist/ai/core/media/index.js +3 -0
  32. package/dist/ai/core/media/index.js.map +1 -0
  33. package/dist/ai/core/media/speech/generateSpeech.d.ts +5 -0
  34. package/dist/ai/core/media/speech/generateSpeech.js +55 -0
  35. package/dist/ai/core/media/speech/generateSpeech.js.map +1 -0
  36. package/dist/ai/core/media/speech/index.d.ts +2 -0
  37. package/dist/ai/core/media/speech/index.js +3 -0
  38. package/dist/ai/core/media/speech/index.js.map +1 -0
  39. package/dist/ai/core/media/types.d.ts +74 -0
  40. package/dist/ai/core/media/types.js +5 -0
  41. package/dist/ai/core/media/types.js.map +1 -0
  42. package/dist/ai/core/media/utils.d.ts +11 -0
  43. package/dist/ai/core/media/utils.js +34 -0
  44. package/dist/ai/core/media/utils.js.map +1 -0
  45. package/dist/ai/core/media/video/generateVideo.d.ts +6 -0
  46. package/dist/ai/core/media/video/generateVideo.js +32 -0
  47. package/dist/ai/core/media/video/generateVideo.js.map +1 -0
  48. package/dist/ai/core/media/video/index.d.ts +2 -0
  49. package/dist/ai/core/media/video/index.js +3 -0
  50. package/dist/ai/core/media/video/index.js.map +1 -0
  51. package/dist/ai/core/streamObject.d.ts +7 -0
  52. package/dist/ai/core/streamObject.js +57 -0
  53. package/dist/ai/core/streamObject.js.map +1 -0
  54. package/dist/ai/core/streamText.d.ts +7 -0
  55. package/dist/ai/core/streamText.js +30 -0
  56. package/dist/ai/core/streamText.js.map +1 -0
  57. package/dist/ai/core/types.d.ts +85 -0
  58. package/dist/ai/core/types.js +5 -0
  59. package/dist/ai/core/types.js.map +1 -0
  60. package/dist/ai/index.d.ts +11 -0
  61. package/dist/ai/index.js +25 -0
  62. package/dist/ai/index.js.map +1 -0
  63. package/dist/ai/providers/blocks/anthropic.d.ts +2 -0
  64. package/dist/ai/providers/blocks/anthropic.js +222 -0
  65. package/dist/ai/providers/blocks/anthropic.js.map +1 -0
  66. package/dist/ai/providers/blocks/elevenlabs.d.ts +2 -0
  67. package/dist/ai/providers/blocks/elevenlabs.js +448 -0
  68. package/dist/ai/providers/blocks/elevenlabs.js.map +1 -0
  69. package/dist/ai/providers/blocks/fal.d.ts +2 -0
  70. package/dist/ai/providers/blocks/fal.js +311 -0
  71. package/dist/ai/providers/blocks/fal.js.map +1 -0
  72. package/dist/ai/providers/blocks/google.d.ts +2 -0
  73. package/dist/ai/providers/blocks/google.js +622 -0
  74. package/dist/ai/providers/blocks/google.js.map +1 -0
  75. package/dist/ai/providers/blocks/index.d.ts +2 -0
  76. package/dist/ai/providers/blocks/index.js +18 -0
  77. package/dist/ai/providers/blocks/index.js.map +1 -0
  78. package/dist/ai/providers/blocks/openai-compatible.d.ts +2 -0
  79. package/dist/ai/providers/blocks/openai-compatible.js +307 -0
  80. package/dist/ai/providers/blocks/openai-compatible.js.map +1 -0
  81. package/dist/ai/providers/blocks/openai.d.ts +2 -0
  82. package/dist/ai/providers/blocks/openai.js +599 -0
  83. package/dist/ai/providers/blocks/openai.js.map +1 -0
  84. package/dist/ai/providers/blocks/xai.d.ts +2 -0
  85. package/dist/ai/providers/blocks/xai.js +246 -0
  86. package/dist/ai/providers/blocks/xai.js.map +1 -0
  87. package/dist/ai/providers/index.d.ts +2 -0
  88. package/dist/ai/providers/index.js +6 -0
  89. package/dist/ai/providers/index.js.map +1 -0
  90. package/dist/ai/providers/registry.d.ts +40 -0
  91. package/dist/ai/providers/registry.js +256 -0
  92. package/dist/ai/providers/registry.js.map +1 -0
  93. package/dist/ai/providers/types.d.ts +115 -0
  94. package/dist/ai/providers/types.js +4 -0
  95. package/dist/ai/providers/types.js.map +1 -0
  96. package/dist/ai/utils/systemGenerate.d.ts +1 -1
  97. package/dist/ai/utils/systemGenerate.js +19 -19
  98. package/dist/ai/utils/systemGenerate.js.map +1 -1
  99. package/dist/collections/AIJobs.d.ts +2 -0
  100. package/dist/collections/AIJobs.js +81 -0
  101. package/dist/collections/AIJobs.js.map +1 -0
  102. package/dist/collections/AISettings.d.ts +2 -0
  103. package/dist/collections/AISettings.js +279 -0
  104. package/dist/collections/AISettings.js.map +1 -0
  105. package/dist/collections/Instructions.js +185 -37
  106. package/dist/collections/Instructions.js.map +1 -1
  107. package/dist/defaults.d.ts +3 -0
  108. package/dist/defaults.js +3 -0
  109. package/dist/defaults.js.map +1 -1
  110. package/dist/endpoints/buildPromptUtils.d.ts +19 -0
  111. package/dist/endpoints/buildPromptUtils.js +114 -0
  112. package/dist/endpoints/buildPromptUtils.js.map +1 -0
  113. package/dist/endpoints/chat.d.js +3 -0
  114. package/dist/endpoints/chat.d.js.map +1 -0
  115. package/dist/endpoints/fetchVoices.d.ts +2 -0
  116. package/dist/endpoints/fetchVoices.js +79 -0
  117. package/dist/endpoints/fetchVoices.js.map +1 -0
  118. package/dist/endpoints/index.js +253 -214
  119. package/dist/endpoints/index.js.map +1 -1
  120. package/dist/exports/client.d.ts +9 -0
  121. package/dist/exports/client.js +9 -0
  122. package/dist/exports/client.js.map +1 -1
  123. package/dist/fields/ComposeField/ComposeField.js +2 -2
  124. package/dist/fields/ComposeField/ComposeField.js.map +1 -1
  125. package/dist/fields/ComposeField/ComposeField.jsx +2 -2
  126. package/dist/fields/PromptEditorField/PromptEditorField.js +155 -14
  127. package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
  128. package/dist/fields/PromptEditorField/PromptEditorField.jsx +118 -3
  129. package/dist/index.d.ts +1 -0
  130. package/dist/index.js.map +1 -1
  131. package/dist/init.js +35 -13
  132. package/dist/init.js.map +1 -1
  133. package/dist/payload-ai.d.js +3 -0
  134. package/dist/payload-ai.d.js.map +1 -0
  135. package/dist/plugin.js +80 -9
  136. package/dist/plugin.js.map +1 -1
  137. package/dist/providers/InstructionsProvider/InstructionsProvider.js +35 -7
  138. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  139. package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +27 -4
  140. package/dist/providers/InstructionsProvider/context.d.ts +1 -0
  141. package/dist/providers/InstructionsProvider/context.js +1 -0
  142. package/dist/providers/InstructionsProvider/context.js.map +1 -1
  143. package/dist/providers/InstructionsProvider/useInstructions.js +13 -6
  144. package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
  145. package/dist/types.d.ts +7 -7
  146. package/dist/types.js.map +1 -1
  147. package/dist/ui/AIConfigDashboard/index.d.ts +2 -0
  148. package/dist/ui/AIConfigDashboard/index.js +46 -0
  149. package/dist/ui/AIConfigDashboard/index.js.map +1 -0
  150. package/dist/ui/AIConfigDashboard/index.jsx +24 -0
  151. package/dist/ui/ApiKeyStatusIndicator/index.d.ts +6 -0
  152. package/dist/ui/ApiKeyStatusIndicator/index.js +39 -0
  153. package/dist/ui/ApiKeyStatusIndicator/index.js.map +1 -0
  154. package/dist/ui/ApiKeyStatusIndicator/index.jsx +29 -0
  155. package/dist/ui/Compose/Compose.d.ts +1 -2
  156. package/dist/ui/Compose/Compose.js +116 -90
  157. package/dist/ui/Compose/Compose.js.map +1 -1
  158. package/dist/ui/Compose/Compose.jsx +111 -101
  159. package/dist/ui/Compose/ComposePlaceholder.d.ts +7 -0
  160. package/dist/ui/Compose/ComposePlaceholder.js +78 -0
  161. package/dist/ui/Compose/ComposePlaceholder.js.map +1 -0
  162. package/dist/ui/Compose/ComposePlaceholder.jsx +66 -0
  163. package/dist/ui/Compose/UndoRedoActions.js +3 -1
  164. package/dist/ui/Compose/UndoRedoActions.js.map +1 -1
  165. package/dist/ui/Compose/UndoRedoActions.jsx +2 -1
  166. package/dist/ui/Compose/compose.module.css +1 -1
  167. package/dist/ui/Compose/hooks/menu/itemsMap.js +1 -1
  168. package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
  169. package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -1
  170. package/dist/ui/Compose/hooks/menu/useMenu.js +2 -2
  171. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  172. package/dist/ui/Compose/hooks/menu/useMenu.jsx +2 -2
  173. package/dist/ui/Compose/hooks/useActiveFieldTracking.js +69 -10
  174. package/dist/ui/Compose/hooks/useActiveFieldTracking.js.map +1 -1
  175. package/dist/ui/Compose/hooks/useGenerate.d.ts +3 -0
  176. package/dist/ui/Compose/hooks/useGenerate.js +71 -11
  177. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
  178. package/dist/ui/Compose/hooks/useHistory.js +52 -5
  179. package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
  180. package/dist/ui/DynamicModelSelect/index.d.ts +7 -0
  181. package/dist/ui/DynamicModelSelect/index.js +231 -0
  182. package/dist/ui/DynamicModelSelect/index.js.map +1 -0
  183. package/dist/ui/DynamicModelSelect/index.jsx +207 -0
  184. package/dist/ui/DynamicProviderSelect/index.d.ts +7 -0
  185. package/dist/ui/DynamicProviderSelect/index.js +101 -0
  186. package/dist/ui/DynamicProviderSelect/index.js.map +1 -0
  187. package/dist/ui/DynamicProviderSelect/index.jsx +90 -0
  188. package/dist/ui/DynamicVoiceSelect/index.d.ts +7 -0
  189. package/dist/ui/DynamicVoiceSelect/index.js +104 -0
  190. package/dist/ui/DynamicVoiceSelect/index.js.map +1 -0
  191. package/dist/ui/DynamicVoiceSelect/index.jsx +69 -0
  192. package/dist/ui/EncryptedTextField/index.d.ts +8 -0
  193. package/dist/ui/EncryptedTextField/index.js +74 -0
  194. package/dist/ui/EncryptedTextField/index.js.map +1 -0
  195. package/dist/ui/EncryptedTextField/index.jsx +35 -0
  196. package/dist/ui/Icons/LottieAnimation.js +3 -1
  197. package/dist/ui/Icons/LottieAnimation.js.map +1 -1
  198. package/dist/ui/Icons/LottieAnimation.jsx +2 -1
  199. package/dist/ui/ModelRowLabel/index.d.ts +6 -0
  200. package/dist/ui/ModelRowLabel/index.js +41 -0
  201. package/dist/ui/ModelRowLabel/index.js.map +1 -0
  202. package/dist/ui/ModelRowLabel/index.jsx +26 -0
  203. package/dist/ui/ProviderOptionsEditor/index.d.ts +7 -0
  204. package/dist/ui/ProviderOptionsEditor/index.js +291 -0
  205. package/dist/ui/ProviderOptionsEditor/index.js.map +1 -0
  206. package/dist/ui/ProviderOptionsEditor/index.jsx +210 -0
  207. package/dist/ui/VoicesFetcher/index.d.ts +7 -0
  208. package/dist/ui/VoicesFetcher/index.js +72 -0
  209. package/dist/ui/VoicesFetcher/index.js.map +1 -0
  210. package/dist/ui/VoicesFetcher/index.jsx +56 -0
  211. package/dist/utilities/encryption.d.ts +2 -0
  212. package/dist/utilities/encryption.js +47 -0
  213. package/dist/utilities/encryption.js.map +1 -0
  214. package/dist/utilities/extractImageData.d.ts +9 -0
  215. package/dist/utilities/extractImageData.js +12 -2
  216. package/dist/utilities/extractImageData.js.map +1 -1
  217. package/dist/utilities/fetchImages.d.ts +14 -0
  218. package/dist/utilities/fetchImages.js +38 -0
  219. package/dist/utilities/fetchImages.js.map +1 -0
  220. package/dist/utilities/fieldToJsonSchema.d.ts +2 -1
  221. package/dist/utilities/fieldToJsonSchema.js +66 -3
  222. package/dist/utilities/fieldToJsonSchema.js.map +1 -1
  223. package/dist/utilities/getFieldBySchemaPath.js +15 -0
  224. package/dist/utilities/getFieldBySchemaPath.js.map +1 -1
  225. package/dist/utilities/getProviderOptionsFields.d.ts +16 -0
  226. package/dist/utilities/getProviderOptionsFields.js +80 -0
  227. package/dist/utilities/getProviderOptionsFields.js.map +1 -0
  228. package/dist/utilities/isPluginActivated.js +1 -2
  229. package/dist/utilities/isPluginActivated.js.map +1 -1
  230. package/dist/utilities/lexicalToHTML.js.map +1 -1
  231. package/dist/utilities/resolveImageReferences.d.ts +28 -0
  232. package/dist/utilities/resolveImageReferences.js +148 -0
  233. package/dist/utilities/resolveImageReferences.js.map +1 -0
  234. package/dist/utilities/schemaConverter.d.ts +3 -0
  235. package/dist/utilities/schemaConverter.js +93 -0
  236. package/dist/utilities/schemaConverter.js.map +1 -0
  237. package/dist/utilities/setSafeLexicalState.d.ts +1 -3
  238. package/dist/utilities/setSafeLexicalState.js +1 -1
  239. package/dist/utilities/setSafeLexicalState.js.map +1 -1
  240. package/package.json +38 -39
  241. package/dist/ai/models/anthropic/index.d.ts +0 -2
  242. package/dist/ai/models/anthropic/index.js +0 -129
  243. package/dist/ai/models/anthropic/index.js.map +0 -1
  244. package/dist/ai/models/elevenLabs/generateVoice.d.ts +0 -8
  245. package/dist/ai/models/elevenLabs/generateVoice.js +0 -20
  246. package/dist/ai/models/elevenLabs/generateVoice.js.map +0 -1
  247. package/dist/ai/models/elevenLabs/index.d.ts +0 -2
  248. package/dist/ai/models/elevenLabs/index.js +0 -133
  249. package/dist/ai/models/elevenLabs/index.js.map +0 -1
  250. package/dist/ai/models/elevenLabs/voices.d.ts +0 -8
  251. package/dist/ai/models/elevenLabs/voices.js +0 -24
  252. package/dist/ai/models/elevenLabs/voices.js.map +0 -1
  253. package/dist/ai/models/generateObject.d.ts +0 -11
  254. package/dist/ai/models/generateObject.js +0 -22
  255. package/dist/ai/models/generateObject.js.map +0 -1
  256. package/dist/ai/models/google/generateImage.d.ts +0 -9
  257. package/dist/ai/models/google/generateImage.js +0 -27
  258. package/dist/ai/models/google/generateImage.js.map +0 -1
  259. package/dist/ai/models/google/index.d.ts +0 -2
  260. package/dist/ai/models/google/index.js +0 -201
  261. package/dist/ai/models/google/index.js.map +0 -1
  262. package/dist/ai/models/index.d.ts +0 -2
  263. package/dist/ai/models/index.js +0 -13
  264. package/dist/ai/models/index.js.map +0 -1
  265. package/dist/ai/models/openai/generateImage.d.ts +0 -5
  266. package/dist/ai/models/openai/generateImage.js +0 -31
  267. package/dist/ai/models/openai/generateImage.js.map +0 -1
  268. package/dist/ai/models/openai/generateVoice.d.ts +0 -6
  269. package/dist/ai/models/openai/generateVoice.js +0 -19
  270. package/dist/ai/models/openai/generateVoice.js.map +0 -1
  271. package/dist/ai/models/openai/index.d.ts +0 -2
  272. package/dist/ai/models/openai/index.js +0 -428
  273. package/dist/ai/models/openai/index.js.map +0 -1
  274. package/dist/ai/models/openai/openai.d.ts +0 -1
  275. package/dist/ai/models/openai/openai.js +0 -8
  276. package/dist/ai/models/openai/openai.js.map +0 -1
  277. package/dist/ai/utils/editImagesWithOpenAI.d.ts +0 -10
  278. package/dist/ai/utils/editImagesWithOpenAI.js +0 -37
  279. package/dist/ai/utils/editImagesWithOpenAI.js.map +0 -1
  280. package/dist/types.d.js +0 -3
  281. package/dist/types.d.js.map +0 -1
  282. package/dist/utilities/getGenerationModels.d.ts +0 -2
  283. package/dist/utilities/getGenerationModels.js +0 -10
  284. package/dist/utilities/getGenerationModels.js.map +0 -1
@@ -0,0 +1,115 @@
1
+ import type { LanguageModel } from 'ai';
2
+ export type UseCase = 'image' | 'text' | 'tts' | 'video';
3
+ export type ProviderId = 'anthropic' | 'elevenlabs' | 'fal' | 'google' | 'openai' | 'openai-compatible' | 'xai';
4
+ export interface BaseProviderBlock {
5
+ blockType: string;
6
+ enabled: boolean;
7
+ models: ProviderModel[];
8
+ }
9
+ export interface ProviderModel {
10
+ enabled: boolean;
11
+ id: string;
12
+ name: string;
13
+ responseModalities?: string[];
14
+ useCase: UseCase;
15
+ }
16
+ export interface OpenAIBlockData extends BaseProviderBlock {
17
+ apiKey: string;
18
+ baseURL?: string;
19
+ blockType: 'openai';
20
+ imageProviderOptions?: Record<string, any>;
21
+ organization?: string;
22
+ supportedUseCases: UseCase[];
23
+ textProviderOptions?: Record<string, any>;
24
+ ttsProviderOptions?: Record<string, any>;
25
+ voices?: any[];
26
+ }
27
+ export interface AnthropicBlockData extends BaseProviderBlock {
28
+ apiKey: string;
29
+ blockType: 'anthropic';
30
+ supportedUseCases: ['text'];
31
+ }
32
+ export interface GoogleBlockData extends BaseProviderBlock {
33
+ apiKey: string;
34
+ blockType: 'google';
35
+ imageProviderOptions?: Record<string, any>;
36
+ supportedUseCases: ('image' | 'text' | 'tts')[];
37
+ textProviderOptions?: Record<string, any>;
38
+ ttsProviderOptions?: Record<string, any>;
39
+ }
40
+ export interface XAIBlockData extends BaseProviderBlock {
41
+ apiKey: string;
42
+ blockType: 'xai';
43
+ supportedUseCases: ('image' | 'text')[];
44
+ }
45
+ export interface FalBlockData extends BaseProviderBlock {
46
+ apiKey: string;
47
+ blockType: 'fal';
48
+ supportedUseCases: ('image' | 'video')[];
49
+ webhookSecret?: string;
50
+ }
51
+ export interface ElevenLabsBlockData extends BaseProviderBlock {
52
+ apiKey: string;
53
+ blockType: 'elevenlabs';
54
+ supportedUseCases: ['tts'];
55
+ ttsProviderOptions?: Record<string, any>;
56
+ voices?: any[];
57
+ }
58
+ export interface OpenAICompatibleBlockData extends BaseProviderBlock {
59
+ apiKey?: string;
60
+ baseURL: string;
61
+ blockType: 'openai-compatible';
62
+ providerName: string;
63
+ supportedUseCases: UseCase[];
64
+ }
65
+ export type ProviderBlockData = AnthropicBlockData | ElevenLabsBlockData | FalBlockData | GoogleBlockData | OpenAIBlockData | OpenAICompatibleBlockData | XAIBlockData;
66
+ export interface AIProvider {
67
+ (modelId: string, settings?: any): LanguageModel;
68
+ chat?: (modelId: string, settings?: any) => LanguageModel;
69
+ completion?: (modelId: string, settings?: any) => LanguageModel;
70
+ embedding?: (modelId: string, settings?: any) => any;
71
+ image?: (modelId: string, settings?: any) => any;
72
+ languageModel?: (modelId: string, settings?: any) => LanguageModel;
73
+ textEmbedding?: (modelId: string, settings?: any) => any;
74
+ }
75
+ export interface ProviderConfig {
76
+ apiKey?: string;
77
+ enabled: boolean;
78
+ factory: () => AIProvider | any;
79
+ id: string;
80
+ instance?: any;
81
+ models: ProviderModel[];
82
+ name: string;
83
+ options?: {
84
+ image?: Record<string, any>;
85
+ text?: Record<string, any>;
86
+ tts?: Record<string, any>;
87
+ };
88
+ }
89
+ export type ProviderRegistry = Record<string, ProviderConfig>;
90
+ export interface AISettingsData {
91
+ 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
+ };
113
+ };
114
+ providers: ProviderBlockData[];
115
+ }
@@ -0,0 +1,4 @@
1
+ // AI Settings global data structure
2
+ export { };
3
+
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +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,4 +1,4 @@
1
1
  export declare const systemGenerate: (data: {
2
2
  prompt: string;
3
3
  system: string;
4
- }, generateTextFn?: (prompt: string, system: string) => Promise<string>) => Promise<string>;
4
+ }, generateTextFn?: (prompt: string, system: string) => Promise<string>) => Promise<string | undefined>;
@@ -1,27 +1,27 @@
1
- import { anthropic } from '@ai-sdk/anthropic';
2
- import { generateText } from 'ai';
3
- import { PLUGIN_DEFAULT_ANTHROPIC_MODEL, PLUGIN_DEFAULT_OPENAI_MODEL } from '../../defaults.js';
4
- import { openai } from '../models/openai/openai.js';
1
+ // import { openai } from '../models/openai/openai.js'
5
2
  export const systemGenerate = async (data, generateTextFn)=>{
6
3
  const { prompt, system } = data;
7
4
  if (generateTextFn) {
8
5
  return generateTextFn(prompt, system);
9
6
  }
10
- let model = null;
11
- // If the generateTextFn is not provided, still need OPENAI_API_KEY or ANTHROPIC_API_KEY to initialize
12
- if (process.env.OPENAI_API_KEY) {
13
- model = openai(PLUGIN_DEFAULT_OPENAI_MODEL);
14
- } else if (process.env.ANTHROPIC_API_KEY) {
15
- model = anthropic(PLUGIN_DEFAULT_ANTHROPIC_MODEL);
16
- } else {
17
- throw new Error('- AI Plugin: Please check your environment variables!');
18
- }
19
- const { text } = await generateText({
20
- model,
21
- prompt,
22
- system
23
- });
24
- return text;
7
+ // TODO: to be re-evaluate and implemented in a way that admin ui can generate when needed
8
+ // let model = null
9
+ // If the generateTextFn is not provided, still need OPENAI_API_KEY or ANTHROPIC_API_KEY to initialize
10
+ // if (process.env.OPENAI_API_KEY) {
11
+ // model = openai(PLUGIN_DEFAULT_OPENAI_MODEL)
12
+ // } else if (process.env.ANTHROPIC_API_KEY) {
13
+ // model = anthropic(PLUGIN_DEFAULT_ANTHROPIC_MODEL)
14
+ // } else {
15
+ // throw new Error('- AI Plugin: Please check your environment variables!')
16
+ // }
17
+ //
18
+ // const { text } = await generateText({
19
+ // model,
20
+ // prompt,
21
+ // system,
22
+ // })
23
+ //
24
+ // return text
25
25
  };
26
26
 
27
27
  //# sourceMappingURL=systemGenerate.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ai/utils/systemGenerate.ts"],"sourcesContent":["import { anthropic } from '@ai-sdk/anthropic'\nimport { generateText } from 'ai'\n\nimport { PLUGIN_DEFAULT_ANTHROPIC_MODEL, PLUGIN_DEFAULT_OPENAI_MODEL } from '../../defaults.js'\nimport { openai } from '../models/openai/openai.js'\n\nexport const systemGenerate = async (\n data: { prompt: string; system: string },\n generateTextFn?: (prompt: string, system: string) => Promise<string>,\n) => {\n const { prompt, system } = data\n\n if (generateTextFn) {\n return generateTextFn(prompt, system)\n }\n\n let model = null\n\n // If the generateTextFn is not provided, still need OPENAI_API_KEY or ANTHROPIC_API_KEY to initialize\n if (process.env.OPENAI_API_KEY) {\n model = openai(PLUGIN_DEFAULT_OPENAI_MODEL)\n } else if (process.env.ANTHROPIC_API_KEY) {\n model = anthropic(PLUGIN_DEFAULT_ANTHROPIC_MODEL)\n } else {\n throw new Error('- AI Plugin: Please check your environment variables!')\n }\n\n const { text } = await generateText({\n model,\n prompt,\n system,\n })\n\n return text\n}\n"],"names":["anthropic","generateText","PLUGIN_DEFAULT_ANTHROPIC_MODEL","PLUGIN_DEFAULT_OPENAI_MODEL","openai","systemGenerate","data","generateTextFn","prompt","system","model","process","env","OPENAI_API_KEY","ANTHROPIC_API_KEY","Error","text"],"mappings":"AAAA,SAASA,SAAS,QAAQ,oBAAmB;AAC7C,SAASC,YAAY,QAAQ,KAAI;AAEjC,SAASC,8BAA8B,EAAEC,2BAA2B,QAAQ,oBAAmB;AAC/F,SAASC,MAAM,QAAQ,6BAA4B;AAEnD,OAAO,MAAMC,iBAAiB,OAC5BC,MACAC;IAEA,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAE,GAAGH;IAE3B,IAAIC,gBAAgB;QAClB,OAAOA,eAAeC,QAAQC;IAChC;IAEA,IAAIC,QAAQ;IAEZ,sGAAsG;IACtG,IAAIC,QAAQC,GAAG,CAACC,cAAc,EAAE;QAC9BH,QAAQN,OAAOD;IACjB,OAAO,IAAIQ,QAAQC,GAAG,CAACE,iBAAiB,EAAE;QACxCJ,QAAQV,UAAUE;IACpB,OAAO;QACL,MAAM,IAAIa,MAAM;IAClB;IAEA,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMf,aAAa;QAClCS;QACAF;QACAC;IACF;IAEA,OAAOO;AACT,EAAC"}
1
+ {"version":3,"sources":["../../../src/ai/utils/systemGenerate.ts"],"sourcesContent":["import { anthropic } from '@ai-sdk/anthropic'\nimport { generateText } from 'ai'\n\nimport { PLUGIN_DEFAULT_ANTHROPIC_MODEL, PLUGIN_DEFAULT_OPENAI_MODEL } from '../../defaults.js'\n// import { openai } from '../models/openai/openai.js'\n\nexport const systemGenerate = async (\n data: { prompt: string; system: string },\n generateTextFn?: (prompt: string, system: string) => Promise<string>,\n) => {\n const { prompt, system } = data\n\n if (generateTextFn) {\n return generateTextFn(prompt, system)\n }\n\n // TODO: to be re-evaluate and implemented in a way that admin ui can generate when needed\n\n // let model = null\n\n\n // If the generateTextFn is not provided, still need OPENAI_API_KEY or ANTHROPIC_API_KEY to initialize\n // if (process.env.OPENAI_API_KEY) {\n // model = openai(PLUGIN_DEFAULT_OPENAI_MODEL)\n // } else if (process.env.ANTHROPIC_API_KEY) {\n // model = anthropic(PLUGIN_DEFAULT_ANTHROPIC_MODEL)\n // } else {\n // throw new Error('- AI Plugin: Please check your environment variables!')\n // }\n //\n // const { text } = await generateText({\n // model,\n // prompt,\n // system,\n // })\n //\n // return text\n}\n"],"names":["systemGenerate","data","generateTextFn","prompt","system"],"mappings":"AAIA,sDAAsD;AAEtD,OAAO,MAAMA,iBAAiB,OAC5BC,MACAC;IAEA,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAE,GAAGH;IAE3B,IAAIC,gBAAgB;QAClB,OAAOA,eAAeC,QAAQC;IAChC;AAEA,0FAA0F;AAE1F,mBAAmB;AAGnB,sGAAsG;AACtG,oCAAoC;AACpC,gDAAgD;AAChD,8CAA8C;AAC9C,sDAAsD;AACtD,WAAW;AACX,6EAA6E;AAC7E,IAAI;AACJ,EAAE;AACF,wCAAwC;AACxC,WAAW;AACX,YAAY;AACZ,YAAY;AACZ,KAAK;AACL,EAAE;AACF,cAAc;AAChB,EAAC"}
@@ -0,0 +1,2 @@
1
+ import type { CollectionConfig } from 'payload';
2
+ export declare const aiJobsCollection: () => CollectionConfig;
@@ -0,0 +1,81 @@
1
+ import { PLUGIN_AI_JOBS_TABLE, PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js';
2
+ const defaultAccessConfig = {
3
+ create: ({ req })=>!!req.user,
4
+ delete: ({ req })=>!!req.user,
5
+ read: ({ req })=>!!req.user,
6
+ update: ({ req })=>!!req.user
7
+ };
8
+ const defaultAdminConfig = {
9
+ group: 'Plugins',
10
+ hidden: false
11
+ };
12
+ export const aiJobsCollection = ()=>({
13
+ slug: PLUGIN_AI_JOBS_TABLE,
14
+ access: defaultAccessConfig,
15
+ admin: defaultAdminConfig,
16
+ fields: [
17
+ {
18
+ name: 'instructionId',
19
+ type: 'relationship',
20
+ relationTo: PLUGIN_INSTRUCTIONS_TABLE,
21
+ required: true
22
+ },
23
+ {
24
+ name: 'task_id',
25
+ type: 'text',
26
+ required: true,
27
+ unique: true
28
+ },
29
+ {
30
+ name: 'status',
31
+ type: 'select',
32
+ defaultValue: 'queued',
33
+ options: [
34
+ {
35
+ label: 'Queued',
36
+ value: 'queued'
37
+ },
38
+ {
39
+ label: 'Running',
40
+ value: 'running'
41
+ },
42
+ {
43
+ label: 'Completed',
44
+ value: 'completed'
45
+ },
46
+ {
47
+ label: 'Failed',
48
+ value: 'failed'
49
+ },
50
+ {
51
+ label: 'Canceled',
52
+ value: 'canceled'
53
+ }
54
+ ]
55
+ },
56
+ {
57
+ name: 'progress',
58
+ type: 'number',
59
+ max: 100,
60
+ min: 0
61
+ },
62
+ {
63
+ name: 'result_id',
64
+ type: 'text'
65
+ },
66
+ {
67
+ name: 'error',
68
+ type: 'textarea'
69
+ },
70
+ {
71
+ name: 'meta',
72
+ type: 'json'
73
+ }
74
+ ],
75
+ labels: {
76
+ plural: 'AI Jobs',
77
+ singular: 'AI Job'
78
+ }
79
+ });
80
+
81
+ //# sourceMappingURL=AIJobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/collections/AIJobs.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\nimport { PLUGIN_AI_JOBS_TABLE, PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\n\nconst defaultAccessConfig = {\n create: ({ req }: { req: { user?: any } }) => !!req.user,\n delete: ({ req }: { req: { user?: any } }) => !!req.user,\n read: ({ req }: { req: { user?: any } }) => !!req.user,\n update: ({ req }: { req: { user?: any } }) => !!req.user,\n}\n\nconst defaultAdminConfig = {\n group: 'Plugins',\n hidden: false,\n}\n\nexport const aiJobsCollection = (): CollectionConfig => ({\n slug: PLUGIN_AI_JOBS_TABLE,\n access: defaultAccessConfig,\n admin: defaultAdminConfig,\n fields: [\n {\n name: 'instructionId',\n type: 'relationship',\n relationTo: PLUGIN_INSTRUCTIONS_TABLE,\n required: true,\n },\n {\n name: 'task_id',\n type: 'text',\n required: true,\n unique: true,\n },\n {\n name: 'status',\n type: 'select',\n defaultValue: 'queued',\n options: [\n { label: 'Queued', value: 'queued' },\n { label: 'Running', value: 'running' },\n { label: 'Completed', value: 'completed' },\n { label: 'Failed', value: 'failed' },\n { label: 'Canceled', value: 'canceled' },\n ],\n },\n {\n name: 'progress',\n type: 'number',\n max: 100,\n min: 0,\n },\n {\n name: 'result_id',\n type: 'text',\n },\n {\n name: 'error',\n type: 'textarea',\n },\n {\n name: 'meta',\n type: 'json',\n },\n ],\n labels: {\n plural: 'AI Jobs',\n singular: 'AI Job',\n },\n})\n"],"names":["PLUGIN_AI_JOBS_TABLE","PLUGIN_INSTRUCTIONS_TABLE","defaultAccessConfig","create","req","user","delete","read","update","defaultAdminConfig","group","hidden","aiJobsCollection","slug","access","admin","fields","name","type","relationTo","required","unique","defaultValue","options","label","value","max","min","labels","plural","singular"],"mappings":"AAEA,SAASA,oBAAoB,EAAEC,yBAAyB,QAAQ,iBAAgB;AAEhF,MAAMC,sBAAsB;IAC1BC,QAAQ,CAAC,EAAEC,GAAG,EAA2B,GAAK,CAAC,CAACA,IAAIC,IAAI;IACxDC,QAAQ,CAAC,EAAEF,GAAG,EAA2B,GAAK,CAAC,CAACA,IAAIC,IAAI;IACxDE,MAAM,CAAC,EAAEH,GAAG,EAA2B,GAAK,CAAC,CAACA,IAAIC,IAAI;IACtDG,QAAQ,CAAC,EAAEJ,GAAG,EAA2B,GAAK,CAAC,CAACA,IAAIC,IAAI;AAC1D;AAEA,MAAMI,qBAAqB;IACzBC,OAAO;IACPC,QAAQ;AACV;AAEA,OAAO,MAAMC,mBAAmB,IAAyB,CAAA;QACvDC,MAAMb;QACNc,QAAQZ;QACRa,OAAON;QACPO,QAAQ;YACN;gBACEC,MAAM;gBACNC,MAAM;gBACNC,YAAYlB;gBACZmB,UAAU;YACZ;YACA;gBACEH,MAAM;gBACNC,MAAM;gBACNE,UAAU;gBACVC,QAAQ;YACV;YACA;gBACEJ,MAAM;gBACNC,MAAM;gBACNI,cAAc;gBACdC,SAAS;oBACP;wBAAEC,OAAO;wBAAUC,OAAO;oBAAS;oBACnC;wBAAED,OAAO;wBAAWC,OAAO;oBAAU;oBACrC;wBAAED,OAAO;wBAAaC,OAAO;oBAAY;oBACzC;wBAAED,OAAO;wBAAUC,OAAO;oBAAS;oBACnC;wBAAED,OAAO;wBAAYC,OAAO;oBAAW;iBACxC;YACH;YACA;gBACER,MAAM;gBACNC,MAAM;gBACNQ,KAAK;gBACLC,KAAK;YACP;YACA;gBACEV,MAAM;gBACNC,MAAM;YACR;YACA;gBACED,MAAM;gBACNC,MAAM;YACR;YACA;gBACED,MAAM;gBACNC,MAAM;YACR;SACD;QACDU,QAAQ;YACNC,QAAQ;YACRC,UAAU;QACZ;IACF,CAAA,EAAE"}
@@ -0,0 +1,2 @@
1
+ import type { GlobalConfig } from 'payload';
2
+ export declare const aiSettingsGlobal: GlobalConfig;
@@ -0,0 +1,279 @@
1
+ import { allProviderBlocks } from '../ai/providers/blocks/index.js';
2
+ export const aiSettingsGlobal = {
3
+ slug: 'ai-settings',
4
+ access: {
5
+ read: ({ req })=>!!req.user,
6
+ update: ({ req })=>!!req.user
7
+ },
8
+ // admin: {
9
+ // description: 'Configure AI providers, models, and default settings',
10
+ // },
11
+ fields: [
12
+ {
13
+ name: 'providers',
14
+ type: 'blocks',
15
+ admin: {
16
+ description: 'Configure which AI providers to use and their settings',
17
+ initCollapsed: true
18
+ },
19
+ blocks: allProviderBlocks,
20
+ label: 'AI Providers',
21
+ required: true
22
+ },
23
+ {
24
+ name: 'defaults',
25
+ type: 'group',
26
+ admin: {
27
+ description: 'Default provider/model behavior for each use case'
28
+ },
29
+ fields: [
30
+ {
31
+ type: 'tabs',
32
+ tabs: [
33
+ {
34
+ fields: [
35
+ {
36
+ name: 'text',
37
+ type: 'group',
38
+ fields: [
39
+ {
40
+ name: 'provider',
41
+ type: 'text',
42
+ admin: {
43
+ components: {
44
+ Field: '@ai-stack/payloadcms/client#DynamicProviderSelect'
45
+ }
46
+ },
47
+ label: 'Default Provider'
48
+ },
49
+ {
50
+ name: 'model',
51
+ type: 'text',
52
+ admin: {
53
+ components: {
54
+ Field: '@ai-stack/payloadcms/client#DynamicModelSelect'
55
+ }
56
+ },
57
+ label: 'Default Model'
58
+ },
59
+ {
60
+ name: 'options',
61
+ type: 'json',
62
+ admin: {
63
+ components: {
64
+ Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor'
65
+ },
66
+ description: 'Default options for this model (global)'
67
+ },
68
+ label: 'Global Model Options'
69
+ }
70
+ ],
71
+ label: ''
72
+ }
73
+ ],
74
+ label: 'Text Generation'
75
+ },
76
+ {
77
+ fields: [
78
+ {
79
+ name: 'image',
80
+ type: 'group',
81
+ fields: [
82
+ {
83
+ name: 'provider',
84
+ type: 'text',
85
+ admin: {
86
+ components: {
87
+ Field: '@ai-stack/payloadcms/client#DynamicProviderSelect'
88
+ }
89
+ },
90
+ label: 'Default Provider'
91
+ },
92
+ {
93
+ name: 'model',
94
+ type: 'text',
95
+ admin: {
96
+ components: {
97
+ Field: '@ai-stack/payloadcms/client#DynamicModelSelect'
98
+ }
99
+ },
100
+ label: 'Default Model'
101
+ },
102
+ {
103
+ name: 'options',
104
+ type: 'json',
105
+ admin: {
106
+ components: {
107
+ Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor'
108
+ },
109
+ description: 'Default options for this model (global)'
110
+ },
111
+ label: 'Global Model Options'
112
+ }
113
+ ],
114
+ label: ''
115
+ }
116
+ ],
117
+ label: 'Image Generation'
118
+ },
119
+ {
120
+ fields: [
121
+ {
122
+ name: 'video',
123
+ type: 'group',
124
+ fields: [
125
+ {
126
+ name: 'provider',
127
+ type: 'text',
128
+ admin: {
129
+ components: {
130
+ Field: '@ai-stack/payloadcms/client#DynamicProviderSelect'
131
+ }
132
+ },
133
+ label: 'Default Provider'
134
+ },
135
+ {
136
+ name: 'model',
137
+ type: 'text',
138
+ admin: {
139
+ components: {
140
+ Field: '@ai-stack/payloadcms/client#DynamicModelSelect'
141
+ }
142
+ },
143
+ label: 'Default Model'
144
+ },
145
+ {
146
+ name: 'options',
147
+ type: 'json',
148
+ admin: {
149
+ components: {
150
+ Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor'
151
+ },
152
+ description: 'Default options for this model (global)'
153
+ },
154
+ label: 'Global Model Options'
155
+ }
156
+ ],
157
+ label: ''
158
+ }
159
+ ],
160
+ label: 'Video Generation'
161
+ },
162
+ {
163
+ fields: [
164
+ {
165
+ name: 'tts',
166
+ type: 'group',
167
+ fields: [
168
+ {
169
+ name: 'provider',
170
+ type: 'text',
171
+ admin: {
172
+ components: {
173
+ Field: '@ai-stack/payloadcms/client#DynamicProviderSelect'
174
+ }
175
+ },
176
+ label: 'Default Provider'
177
+ },
178
+ {
179
+ name: 'model',
180
+ type: 'text',
181
+ admin: {
182
+ components: {
183
+ Field: '@ai-stack/payloadcms/client#DynamicModelSelect'
184
+ }
185
+ },
186
+ label: 'Default Model'
187
+ },
188
+ {
189
+ name: 'voice',
190
+ type: 'text',
191
+ admin: {
192
+ components: {
193
+ Field: '@ai-stack/payloadcms/client#DynamicVoiceSelect'
194
+ }
195
+ },
196
+ label: 'Default Voice'
197
+ },
198
+ {
199
+ name: 'options',
200
+ type: 'json',
201
+ admin: {
202
+ components: {
203
+ Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor'
204
+ },
205
+ description: 'Default options for this model (global)'
206
+ },
207
+ label: 'Global Model Options'
208
+ }
209
+ ],
210
+ label: ''
211
+ }
212
+ ],
213
+ label: 'Text-to-Speech'
214
+ }
215
+ ]
216
+ }
217
+ ],
218
+ label: 'Default Models'
219
+ }
220
+ ],
221
+ hooks: {
222
+ afterRead: [
223
+ async ({ context, doc, req })=>{
224
+ if (!req.payload.secret) {
225
+ return doc;
226
+ }
227
+ const { decrypt } = await import('../utilities/encryption.js');
228
+ if (doc.providers) {
229
+ doc.providers = doc.providers.map((provider)=>{
230
+ if (provider.apiKey) {
231
+ if (context.unsafe) {
232
+ // Internal use: decrypt
233
+ provider.apiKey = decrypt(provider.apiKey, req.payload.secret);
234
+ } else {
235
+ // Admin UI: mask
236
+ // We can't easily check if it's valid without decrypting, but for UI we just show mask
237
+ // If we want to show "present", we can return a mask
238
+ provider.apiKey = 'sk-****' + provider.apiKey.slice(-4);
239
+ }
240
+ }
241
+ return provider;
242
+ });
243
+ }
244
+ return doc;
245
+ }
246
+ ],
247
+ beforeChange: [
248
+ async ({ data, originalDoc, req })=>{
249
+ if (!req.payload.secret) {
250
+ return data;
251
+ }
252
+ const { encrypt } = await import('../utilities/encryption.js');
253
+ // Iterate over providers and encrypt API keys
254
+ if (data.providers) {
255
+ data.providers = data.providers.map((provider)=>{
256
+ if (provider.apiKey) {
257
+ // If it looks like a masked key, don't re-encrypt (it means it wasn't changed)
258
+ if (provider.apiKey.startsWith('sk-') && provider.apiKey.includes('****')) {
259
+ // Restore the original encrypted key from originalDoc
260
+ const originalProvider = originalDoc?.providers?.find((p)=>p.id === provider.id);
261
+ if (originalProvider?.apiKey) {
262
+ provider.apiKey = originalProvider.apiKey;
263
+ }
264
+ } else {
265
+ // Encrypt new key
266
+ provider.apiKey = encrypt(provider.apiKey, req.payload.secret);
267
+ }
268
+ }
269
+ return provider;
270
+ });
271
+ }
272
+ return data;
273
+ }
274
+ ]
275
+ },
276
+ label: 'AI Configuration'
277
+ };
278
+
279
+ //# sourceMappingURL=AISettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/collections/AISettings.ts"],"sourcesContent":["import type { GlobalConfig } from 'payload'\n\nimport { allProviderBlocks } from '../ai/providers/blocks/index.js'\n\nexport const aiSettingsGlobal: GlobalConfig = {\n slug: 'ai-settings',\n access: {\n read: ({ req }) => !!req.user,\n update: ({ req }) => !!req.user,\n },\n // admin: {\n // description: 'Configure AI providers, models, and default settings',\n // },\n fields: [\n {\n name: 'providers',\n type: 'blocks',\n admin: {\n description: 'Configure which AI providers to use and their settings',\n initCollapsed: true,\n },\n blocks: allProviderBlocks,\n label: 'AI Providers',\n required: true,\n },\n {\n name: 'defaults',\n type: 'group',\n admin: {\n description: 'Default provider/model behavior for each use case',\n },\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n fields: [\n {\n name: 'text',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'options',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Default options for this model (global)',\n },\n label: 'Global Model Options',\n },\n ],\n label: '',\n },\n ],\n label: 'Text Generation',\n },\n {\n fields: [\n {\n name: 'image',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'options',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Default options for this model (global)',\n },\n label: 'Global Model Options',\n },\n ],\n label: '',\n },\n ],\n label: 'Image Generation',\n },\n {\n fields: [\n {\n name: 'video',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'options',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Default options for this model (global)',\n },\n label: 'Global Model Options',\n },\n ],\n label: '',\n },\n ],\n label: 'Video Generation',\n },\n {\n fields: [\n {\n name: 'tts',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'voice',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicVoiceSelect',\n },\n },\n label: 'Default Voice',\n },\n {\n name: 'options',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Default options for this model (global)',\n },\n label: 'Global Model Options',\n },\n ],\n label: '',\n },\n ],\n label: 'Text-to-Speech',\n },\n ],\n },\n ],\n label: 'Default Models',\n },\n ],\n hooks: {\n afterRead: [\n async ({ context, doc, req }) => {\n if (!req.payload.secret) {\n return doc\n }\n\n const { decrypt } = await import('../utilities/encryption.js')\n\n if (doc.providers) {\n doc.providers = doc.providers.map((provider: any) => {\n if (provider.apiKey) {\n if (context.unsafe) {\n // Internal use: decrypt\n provider.apiKey = decrypt(provider.apiKey, req.payload.secret)\n } else {\n // Admin UI: mask\n // We can't easily check if it's valid without decrypting, but for UI we just show mask\n // If we want to show \"present\", we can return a mask\n provider.apiKey = 'sk-****' + provider.apiKey.slice(-4)\n }\n }\n return provider\n })\n }\n return doc\n },\n ],\n beforeChange: [\n async ({ data, originalDoc, req }) => {\n if (!req.payload.secret) {\n return data\n }\n\n const { encrypt } = await import('../utilities/encryption.js')\n\n // Iterate over providers and encrypt API keys\n if (data.providers) {\n data.providers = data.providers.map((provider: any) => {\n if (provider.apiKey) {\n // If it looks like a masked key, don't re-encrypt (it means it wasn't changed)\n if (provider.apiKey.startsWith('sk-') && provider.apiKey.includes('****')) {\n // Restore the original encrypted key from originalDoc\n const originalProvider = originalDoc?.providers?.find(\n (p: any) => p.id === provider.id,\n )\n if (originalProvider?.apiKey) {\n provider.apiKey = originalProvider.apiKey\n }\n } else {\n // Encrypt new key\n provider.apiKey = encrypt(provider.apiKey, req.payload.secret)\n }\n }\n return provider\n })\n }\n return data\n },\n ],\n },\n label: 'AI Configuration',\n}\n"],"names":["allProviderBlocks","aiSettingsGlobal","slug","access","read","req","user","update","fields","name","type","admin","description","initCollapsed","blocks","label","required","tabs","components","Field","hooks","afterRead","context","doc","payload","secret","decrypt","providers","map","provider","apiKey","unsafe","slice","beforeChange","data","originalDoc","encrypt","startsWith","includes","originalProvider","find","p","id"],"mappings":"AAEA,SAASA,iBAAiB,QAAQ,kCAAiC;AAEnE,OAAO,MAAMC,mBAAiC;IAC5CC,MAAM;IACNC,QAAQ;QACNC,MAAM,CAAC,EAAEC,GAAG,EAAE,GAAK,CAAC,CAACA,IAAIC,IAAI;QAC7BC,QAAQ,CAAC,EAAEF,GAAG,EAAE,GAAK,CAAC,CAACA,IAAIC,IAAI;IACjC;IACA,WAAW;IACX,yEAAyE;IACzE,KAAK;IACLE,QAAQ;QACN;YACEC,MAAM;YACNC,MAAM;YACNC,OAAO;gBACLC,aAAa;gBACbC,eAAe;YACjB;YACAC,QAAQd;YACRe,OAAO;YACPC,UAAU;QACZ;QACA;YACEP,MAAM;YACNC,MAAM;YACNC,OAAO;gBACLC,aAAa;YACf;YACAJ,QAAQ;gBACN;oBACEE,MAAM;oBACNO,MAAM;wBACJ;4BACET,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLO,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAJ,OAAO;wCACT;wCACA;4CACEN,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLO,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAJ,OAAO;wCACT;wCACA;4CACEN,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLO,YAAY;oDACVC,OAAO;gDACT;gDACAP,aAAa;4CACf;4CACAG,OAAO;wCACT;qCACD;oCACDA,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;wBACA;4BACEP,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLO,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAJ,OAAO;wCACT;wCACA;4CACEN,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLO,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAJ,OAAO;wCACT;wCACA;4CACEN,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLO,YAAY;oDACVC,OAAO;gDACT;gDACAP,aAAa;4CACf;4CACAG,OAAO;wCACT;qCACD;oCACDA,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;wBACA;4BACEP,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLO,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAJ,OAAO;wCACT;wCACA;4CACEN,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLO,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAJ,OAAO;wCACT;wCACA;4CACEN,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLO,YAAY;oDACVC,OAAO;gDACT;gDACAP,aAAa;4CACf;4CACAG,OAAO;wCACT;qCACD;oCACDA,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;wBACA;4BACEP,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLO,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAJ,OAAO;wCACT;wCACA;4CACEN,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLO,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAJ,OAAO;wCACT;wCACA;4CACEN,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLO,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAJ,OAAO;wCACT;wCACA;4CACEN,MAAM;4CACNC,MAAM;4CACNC,OAAO;gDACLO,YAAY;oDACVC,OAAO;gDACT;gDACAP,aAAa;4CACf;4CACAG,OAAO;wCACT;qCACD;oCACDA,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;qBACD;gBACH;aACD;YACDA,OAAO;QACT;KACD;IACDK,OAAO;QACLC,WAAW;YACT,OAAO,EAAEC,OAAO,EAAEC,GAAG,EAAElB,GAAG,EAAE;gBAC1B,IAAI,CAACA,IAAImB,OAAO,CAACC,MAAM,EAAE;oBACvB,OAAOF;gBACT;gBAEA,MAAM,EAAEG,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC;gBAEjC,IAAIH,IAAII,SAAS,EAAE;oBACjBJ,IAAII,SAAS,GAAGJ,IAAII,SAAS,CAACC,GAAG,CAAC,CAACC;wBACjC,IAAIA,SAASC,MAAM,EAAE;4BACnB,IAAIR,QAAQS,MAAM,EAAE;gCAClB,wBAAwB;gCACxBF,SAASC,MAAM,GAAGJ,QAAQG,SAASC,MAAM,EAAEzB,IAAImB,OAAO,CAACC,MAAM;4BAC/D,OAAO;gCACL,iBAAiB;gCACjB,uFAAuF;gCACvF,qDAAqD;gCACrDI,SAASC,MAAM,GAAG,YAAYD,SAASC,MAAM,CAACE,KAAK,CAAC,CAAC;4BACvD;wBACF;wBACA,OAAOH;oBACT;gBACF;gBACA,OAAON;YACT;SACD;QACDU,cAAc;YACZ,OAAO,EAAEC,IAAI,EAAEC,WAAW,EAAE9B,GAAG,EAAE;gBAC/B,IAAI,CAACA,IAAImB,OAAO,CAACC,MAAM,EAAE;oBACvB,OAAOS;gBACT;gBAEA,MAAM,EAAEE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC;gBAEjC,8CAA8C;gBAC9C,IAAIF,KAAKP,SAAS,EAAE;oBAClBO,KAAKP,SAAS,GAAGO,KAAKP,SAAS,CAACC,GAAG,CAAC,CAACC;wBACnC,IAAIA,SAASC,MAAM,EAAE;4BACnB,+EAA+E;4BAC/E,IAAID,SAASC,MAAM,CAACO,UAAU,CAAC,UAAUR,SAASC,MAAM,CAACQ,QAAQ,CAAC,SAAS;gCACzE,sDAAsD;gCACtD,MAAMC,mBAAmBJ,aAAaR,WAAWa,KAC/C,CAACC,IAAWA,EAAEC,EAAE,KAAKb,SAASa,EAAE;gCAElC,IAAIH,kBAAkBT,QAAQ;oCAC5BD,SAASC,MAAM,GAAGS,iBAAiBT,MAAM;gCAC3C;4BACF,OAAO;gCACL,kBAAkB;gCAClBD,SAASC,MAAM,GAAGM,QAAQP,SAASC,MAAM,EAAEzB,IAAImB,OAAO,CAACC,MAAM;4BAC/D;wBACF;wBACA,OAAOI;oBACT;gBACF;gBACA,OAAOK;YACT;SACD;IACH;IACAnB,OAAO;AACT,EAAC"}