@ai-stack/payloadcms 3.2.24-beta → 3.68.0

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 +19 -21
  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
@@ -1,18 +1,37 @@
1
1
  import { PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js';
2
- import { getGenerationModels } from '../utilities/getGenerationModels.js';
3
- const groupSettings = (pluginConfig)=>(getGenerationModels(pluginConfig) ?? []).reduce((fields, model)=>{
4
- if (model.settings) {
5
- fields.push(model.settings);
6
- }
7
- return fields;
8
- }, []);
9
- const modelOptions = (pluginConfig)=>(getGenerationModels(pluginConfig) ?? []).map((model)=>{
10
- return {
11
- fields: model.fields,
12
- label: model.name,
13
- value: model.id
14
- };
15
- });
2
+ // Defined capabilities replacing src/ai/models/
3
+ // Defined capabilities replacing src/ai/models/
4
+ const CAPABILITIES = [
5
+ {
6
+ id: 'text',
7
+ name: 'Text Generation',
8
+ fields: [
9
+ 'text',
10
+ 'textarea'
11
+ ]
12
+ },
13
+ {
14
+ id: 'richtext',
15
+ name: 'Rich Text Generation',
16
+ fields: [
17
+ 'richText'
18
+ ]
19
+ },
20
+ {
21
+ id: 'image',
22
+ name: 'Image Generation',
23
+ fields: [
24
+ 'upload'
25
+ ]
26
+ },
27
+ {
28
+ id: 'tts',
29
+ name: 'Text to Speech',
30
+ fields: [
31
+ 'upload'
32
+ ]
33
+ }
34
+ ];
16
35
  const defaultAccessConfig = {
17
36
  create: ({ req })=>{
18
37
  if (!req.user) {
@@ -43,6 +62,65 @@ const defaultAdminConfig = {
43
62
  group: 'Plugins',
44
63
  hidden: true
45
64
  };
65
+ const providerSelect = {
66
+ name: 'provider',
67
+ type: 'text',
68
+ admin: {
69
+ components: {
70
+ Field: '@ai-stack/payloadcms/client#DynamicProviderSelect'
71
+ }
72
+ },
73
+ label: 'Provider'
74
+ };
75
+ const modelSelect = {
76
+ name: 'model',
77
+ type: 'text',
78
+ admin: {
79
+ components: {
80
+ Field: '@ai-stack/payloadcms/client#DynamicModelSelect'
81
+ }
82
+ },
83
+ label: 'Model'
84
+ };
85
+ const providerOptionsJson = {
86
+ name: 'providerOptions',
87
+ type: 'json',
88
+ admin: {
89
+ components: {
90
+ Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor'
91
+ },
92
+ description: 'Provider-specific options. Defaults are inherited from AI Settings.'
93
+ },
94
+ label: 'Provider Options'
95
+ };
96
+ const commonTextParams = [
97
+ {
98
+ type: 'row',
99
+ fields: [
100
+ {
101
+ name: 'maxTokens',
102
+ type: 'number',
103
+ admin: {
104
+ placeholder: 'Model Default'
105
+ },
106
+ label: 'Max Tokens'
107
+ },
108
+ {
109
+ name: 'temperature',
110
+ type: 'number',
111
+ defaultValue: 0.7,
112
+ label: 'Temperature',
113
+ max: 1,
114
+ min: 0
115
+ }
116
+ ]
117
+ },
118
+ {
119
+ name: 'extractAttachments',
120
+ type: 'checkbox',
121
+ label: 'Extract Attachments'
122
+ }
123
+ ];
46
124
  export const instructionsCollection = (pluginConfig)=>({
47
125
  labels: {
48
126
  plural: 'Compose Settings',
@@ -56,7 +134,12 @@ export const instructionsCollection = (pluginConfig)=>({
56
134
  },
57
135
  admin: {
58
136
  ...defaultAdminConfig,
59
- ...pluginConfig.overrideInstructions?.admin
137
+ ...pluginConfig.overrideInstructions?.admin,
138
+ components: {
139
+ beforeList: [
140
+ '@ai-stack/payloadcms/client#AIConfigDashboard'
141
+ ]
142
+ }
60
143
  },
61
144
  fields: [
62
145
  {
@@ -112,19 +195,21 @@ export const instructionsCollection = (pluginConfig)=>({
112
195
  Field: {
113
196
  clientProps: {
114
197
  filterByField: 'field-type',
115
- options: modelOptions(pluginConfig)
198
+ options: CAPABILITIES.map((c)=>({
199
+ fields: c.fields,
200
+ label: c.name,
201
+ value: c.id
202
+ }))
116
203
  },
117
204
  path: '@ai-stack/payloadcms/fields#SelectField'
118
205
  }
119
206
  }
120
207
  },
121
- label: 'Model',
122
- options: modelOptions(pluginConfig).map((option)=>{
123
- return {
124
- label: option.label,
125
- value: option.value
126
- };
127
- })
208
+ label: 'Capability',
209
+ options: CAPABILITIES.map((c)=>({
210
+ label: c.name,
211
+ value: c.id
212
+ }))
128
213
  },
129
214
  {
130
215
  name: 'disabled',
@@ -159,10 +244,10 @@ export const instructionsCollection = (pluginConfig)=>({
159
244
  {
160
245
  admin: {
161
246
  condition: (_, current)=>{
162
- return current['field-type'] === 'upload' && current['model-id'] === 'gpt-image-1';
247
+ return current['field-type'] === 'upload' && current['model-id'] === 'image';
163
248
  }
164
249
  },
165
- description: 'These images will be used to generate new visuals in a similar style, layout, or content. You can combine multiple references for more controlled results.',
250
+ description: 'These images will be used to generate new visuals in a similar style, layout, or content.',
166
251
  fields: [
167
252
  {
168
253
  name: 'images',
@@ -211,17 +296,7 @@ informative and accurate but also captivating and beautifully structured.`,
211
296
  description: '',
212
297
  fields: [
213
298
  {
214
- /** TODO:
215
- * - Layouts can be saved in as an array
216
- * - User can add their own layout to collections and use it later for generate specific rich text
217
- * - User can select previously added layout
218
- * - IMP: Remove layout from default, this seem to affect other functions like rephrase etc.
219
- */ /** TODO:
220
- * - Layouts can be saved in as an array
221
- * - User can add their own layout to collections and use it later for generate specific rich text
222
- * - User can select previously added layout
223
- * - IMP: Remove layout from default, this seem to affect other functions like rephrase etc.
224
- */ name: 'layout',
299
+ name: 'layout',
225
300
  type: 'textarea',
226
301
  admin: {
227
302
  condition: (_, current)=>{
@@ -243,7 +318,80 @@ informative and accurate but also captivating and beautifully structured.`,
243
318
  }
244
319
  ]
245
320
  },
246
- ...groupSettings(pluginConfig)
321
+ // Inline Settings Groups by Capability
322
+ // Text Settings
323
+ // Inline Settings Groups by Capability
324
+ // Text Settings
325
+ {
326
+ name: 'text-settings',
327
+ type: 'group',
328
+ admin: {
329
+ condition: (data)=>data['model-id'] === 'text'
330
+ },
331
+ fields: [
332
+ providerSelect,
333
+ modelSelect,
334
+ ...commonTextParams,
335
+ providerOptionsJson
336
+ ],
337
+ label: 'Text Settings'
338
+ },
339
+ // Rich Text Settings
340
+ // Rich Text Settings
341
+ {
342
+ name: 'richtext-settings',
343
+ type: 'group',
344
+ admin: {
345
+ condition: (data)=>data['model-id'] === 'richtext'
346
+ },
347
+ fields: [
348
+ providerSelect,
349
+ modelSelect,
350
+ ...commonTextParams,
351
+ providerOptionsJson
352
+ ],
353
+ label: 'Rich Text Settings'
354
+ },
355
+ // Image Settings
356
+ // Image Settings
357
+ {
358
+ name: 'image-settings',
359
+ type: 'group',
360
+ admin: {
361
+ condition: (data)=>data['model-id'] === 'image'
362
+ },
363
+ fields: [
364
+ providerSelect,
365
+ modelSelect,
366
+ providerOptionsJson
367
+ ],
368
+ label: 'Image Settings'
369
+ },
370
+ // TTS Settings
371
+ // TTS Settings
372
+ {
373
+ name: 'tts-settings',
374
+ type: 'group',
375
+ admin: {
376
+ condition: (data)=>data['model-id'] === 'tts'
377
+ },
378
+ fields: [
379
+ providerSelect,
380
+ modelSelect,
381
+ {
382
+ name: 'voice',
383
+ type: 'text',
384
+ admin: {
385
+ components: {
386
+ Field: '@ai-stack/payloadcms/client#DynamicVoiceSelect'
387
+ }
388
+ },
389
+ label: 'Voice'
390
+ },
391
+ providerOptionsJson
392
+ ],
393
+ label: 'TTS Settings'
394
+ }
247
395
  ]
248
396
  });
249
397
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/collections/Instructions.ts"],"sourcesContent":["import type { CollectionConfig, GroupField } from 'payload'\nimport type { PluginConfig } from 'src/types.js'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\nimport { getGenerationModels } from '../utilities/getGenerationModels.js'\n\nconst groupSettings = (pluginConfig: PluginConfig) =>\n (getGenerationModels(pluginConfig) ?? []).reduce((fields, model) => {\n if (model.settings) {\n fields.push(model.settings)\n }\n return fields\n }, [] as GroupField[])\n\nconst modelOptions = (pluginConfig: PluginConfig) =>\n (getGenerationModels(pluginConfig) ?? []).map((model) => {\n return {\n fields: model.fields,\n label: model.name,\n value: model.id,\n }\n })\n\nconst defaultAccessConfig = {\n create: ({ req }: { req: { user?: any } }) => {\n if (!req.user) {\n return false\n }\n return true\n },\n delete: ({ req }: { req: { user?: any } }) => {\n if (!req.user) {\n return false\n }\n return true\n },\n read: ({ req }: { req: { user?: any } }) => {\n if (!req.user) {\n return false\n }\n return true\n },\n update: ({ req }: { req: { user?: any } }) => {\n if (!req.user) {\n return false\n }\n return true\n },\n}\n\nconst defaultAdminConfig = {\n group: 'Plugins',\n hidden: true,\n}\n\nexport const instructionsCollection = (pluginConfig: PluginConfig) =>\n <CollectionConfig>{\n labels: {\n plural: 'Compose Settings',\n singular: 'Compose Setting',\n },\n ...pluginConfig.overrideInstructions,\n slug: PLUGIN_INSTRUCTIONS_TABLE,\n access: {\n ...defaultAccessConfig,\n ...pluginConfig.overrideInstructions?.access,\n },\n admin: {\n ...defaultAdminConfig,\n ...pluginConfig.overrideInstructions?.admin,\n },\n fields: [\n {\n name: 'schema-path',\n type: 'text',\n admin: {\n description: \"Please don't change this unless you're sure of what you're doing\",\n },\n unique: true,\n },\n {\n name: 'field-type',\n type: 'select',\n admin: {\n description: \"Please don't change this unless you're sure of what you're doing\",\n },\n defaultValue: 'text',\n label: 'Field type',\n options: [\n {\n label: 'text',\n value: 'text',\n },\n {\n label: 'textarea',\n value: 'textarea',\n },\n {\n label: 'upload',\n value: 'upload',\n },\n {\n label: 'richText',\n value: 'richText',\n },\n ],\n },\n {\n name: 'relation-to',\n type: 'text',\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'upload'\n },\n },\n label: 'Relation to',\n },\n {\n name: 'model-id',\n type: 'select',\n admin: {\n components: {\n Field: {\n clientProps: {\n filterByField: 'field-type',\n options: modelOptions(pluginConfig),\n },\n path: '@ai-stack/payloadcms/fields#SelectField',\n },\n },\n },\n label: 'Model',\n options: modelOptions(pluginConfig).map((option) => {\n return {\n label: option.label,\n value: option.value,\n }\n }),\n },\n {\n name: 'disabled',\n type: 'checkbox',\n admin: {\n description: 'Please reload your collection after applying the changes',\n },\n defaultValue: false,\n label: 'Hide Compose button for this field',\n },\n {\n id: 'ai-prompts-tabs',\n type: 'tabs',\n tabs: [\n {\n description:\n 'Define dynamic templates using {{ fieldName }}. Type { to see available field suggestions.',\n fields: [\n {\n name: 'prompt',\n type: 'textarea',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/fields#PromptEditorField',\n },\n description: \"Click 'Compose' to run this custom prompt and generate content\",\n },\n label: '',\n },\n ],\n label: 'Prompt',\n },\n {\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'upload' && current['model-id'] === 'gpt-image-1'\n },\n },\n description:\n 'These images will be used to generate new visuals in a similar style, layout, or content. You can combine multiple references for more controlled results.',\n fields: [\n {\n name: 'images',\n type: 'array',\n fields: [\n {\n name: 'image',\n type: 'upload',\n admin: {\n description: 'Please make sure the image is publicly accessible.',\n },\n relationTo: pluginConfig.uploadCollectionSlug\n ? pluginConfig.uploadCollectionSlug\n : 'media',\n },\n ],\n },\n ],\n label: 'Sample Images',\n },\n {\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'richText'\n },\n },\n description: '',\n fields: [\n {\n name: 'system',\n type: 'textarea',\n defaultValue: `INSTRUCTIONS:\nYou are a highly skilled and professional blog writer,\nrenowned for crafting engaging and well-organized articles.\nWhen given a title, you meticulously create blogs that are not only\ninformative and accurate but also captivating and beautifully structured.`,\n label: '',\n },\n ],\n label: 'System prompt',\n },\n {\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'richText'\n },\n },\n description: '',\n fields: [\n {\n /** TODO:\n * - Layouts can be saved in as an array\n * - User can add their own layout to collections and use it later for generate specific rich text\n * - User can select previously added layout\n * - IMP: Remove layout from default, this seem to affect other functions like rephrase etc.\n */\n name: 'layout',\n type: 'textarea',\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'richText'\n },\n },\n defaultValue: `[paragraph] - Write a concise introduction (2-3 sentences) that outlines the main topic.\n[horizontalrule] - Insert a horizontal rule to separate the introduction from the main content.\n[list] - Create a list with 3-5 items. Each list item should contain:\n a. [heading] - A brief, descriptive heading (up to 5 words)\n b. [paragraph] - A short explanation or elaboration (1-2 sentences)\n[horizontalrule] - Insert another horizontal rule to separate the main content from the conclusion.\n[paragraph] - Compose a brief conclusion (2-3 sentences) summarizing the key points.\n[quote] - Include a relevant quote from a famous person, directly related to the topic. Format: \"Quote text.\" - Author Name`,\n label: '',\n },\n ],\n label: 'Layout',\n },\n ],\n },\n ...groupSettings(pluginConfig),\n ],\n }\n"],"names":["PLUGIN_INSTRUCTIONS_TABLE","getGenerationModels","groupSettings","pluginConfig","reduce","fields","model","settings","push","modelOptions","map","label","name","value","id","defaultAccessConfig","create","req","user","delete","read","update","defaultAdminConfig","group","hidden","instructionsCollection","labels","plural","singular","overrideInstructions","slug","access","admin","type","description","unique","defaultValue","options","condition","_","current","components","Field","clientProps","filterByField","path","option","tabs","relationTo","uploadCollectionSlug"],"mappings":"AAGA,SAASA,yBAAyB,QAAQ,iBAAgB;AAC1D,SAASC,mBAAmB,QAAQ,sCAAqC;AAEzE,MAAMC,gBAAgB,CAACC,eACrB,AAACF,CAAAA,oBAAoBE,iBAAiB,EAAE,AAAD,EAAGC,MAAM,CAAC,CAACC,QAAQC;QACxD,IAAIA,MAAMC,QAAQ,EAAE;YAClBF,OAAOG,IAAI,CAACF,MAAMC,QAAQ;QAC5B;QACA,OAAOF;IACT,GAAG,EAAE;AAEP,MAAMI,eAAe,CAACN,eACpB,AAACF,CAAAA,oBAAoBE,iBAAiB,EAAE,AAAD,EAAGO,GAAG,CAAC,CAACJ;QAC7C,OAAO;YACLD,QAAQC,MAAMD,MAAM;YACpBM,OAAOL,MAAMM,IAAI;YACjBC,OAAOP,MAAMQ,EAAE;QACjB;IACF;AAEF,MAAMC,sBAAsB;IAC1BC,QAAQ,CAAC,EAAEC,GAAG,EAA2B;QACvC,IAAI,CAACA,IAAIC,IAAI,EAAE;YACb,OAAO;QACT;QACA,OAAO;IACT;IACAC,QAAQ,CAAC,EAAEF,GAAG,EAA2B;QACvC,IAAI,CAACA,IAAIC,IAAI,EAAE;YACb,OAAO;QACT;QACA,OAAO;IACT;IACAE,MAAM,CAAC,EAAEH,GAAG,EAA2B;QACrC,IAAI,CAACA,IAAIC,IAAI,EAAE;YACb,OAAO;QACT;QACA,OAAO;IACT;IACAG,QAAQ,CAAC,EAAEJ,GAAG,EAA2B;QACvC,IAAI,CAACA,IAAIC,IAAI,EAAE;YACb,OAAO;QACT;QACA,OAAO;IACT;AACF;AAEA,MAAMI,qBAAqB;IACzBC,OAAO;IACPC,QAAQ;AACV;AAEA,OAAO,MAAMC,yBAAyB,CAACtB,eACnB,CAAA;QAChBuB,QAAQ;YACNC,QAAQ;YACRC,UAAU;QACZ;QACA,GAAGzB,aAAa0B,oBAAoB;QACpCC,MAAM9B;QACN+B,QAAQ;YACN,GAAGhB,mBAAmB;YACtB,GAAGZ,aAAa0B,oBAAoB,EAAEE,MAAM;QAC9C;QACAC,OAAO;YACL,GAAGV,kBAAkB;YACrB,GAAGnB,aAAa0B,oBAAoB,EAAEG,KAAK;QAC7C;QACA3B,QAAQ;YACN;gBACEO,MAAM;gBACNqB,MAAM;gBACND,OAAO;oBACLE,aAAa;gBACf;gBACAC,QAAQ;YACV;YACA;gBACEvB,MAAM;gBACNqB,MAAM;gBACND,OAAO;oBACLE,aAAa;gBACf;gBACAE,cAAc;gBACdzB,OAAO;gBACP0B,SAAS;oBACP;wBACE1B,OAAO;wBACPE,OAAO;oBACT;oBACA;wBACEF,OAAO;wBACPE,OAAO;oBACT;oBACA;wBACEF,OAAO;wBACPE,OAAO;oBACT;oBACA;wBACEF,OAAO;wBACPE,OAAO;oBACT;iBACD;YACH;YACA;gBACED,MAAM;gBACNqB,MAAM;gBACND,OAAO;oBACLM,WAAW,CAACC,GAAGC;wBACb,OAAOA,OAAO,CAAC,aAAa,KAAK;oBACnC;gBACF;gBACA7B,OAAO;YACT;YACA;gBACEC,MAAM;gBACNqB,MAAM;gBACND,OAAO;oBACLS,YAAY;wBACVC,OAAO;4BACLC,aAAa;gCACXC,eAAe;gCACfP,SAAS5B,aAAaN;4BACxB;4BACA0C,MAAM;wBACR;oBACF;gBACF;gBACAlC,OAAO;gBACP0B,SAAS5B,aAAaN,cAAcO,GAAG,CAAC,CAACoC;oBACvC,OAAO;wBACLnC,OAAOmC,OAAOnC,KAAK;wBACnBE,OAAOiC,OAAOjC,KAAK;oBACrB;gBACF;YACF;YACA;gBACED,MAAM;gBACNqB,MAAM;gBACND,OAAO;oBACLE,aAAa;gBACf;gBACAE,cAAc;gBACdzB,OAAO;YACT;YACA;gBACEG,IAAI;gBACJmB,MAAM;gBACNc,MAAM;oBACJ;wBACEb,aACE;wBACF7B,QAAQ;4BACN;gCACEO,MAAM;gCACNqB,MAAM;gCACND,OAAO;oCACLS,YAAY;wCACVC,OAAO;oCACT;oCACAR,aAAa;gCACf;gCACAvB,OAAO;4BACT;yBACD;wBACDA,OAAO;oBACT;oBACA;wBACEqB,OAAO;4BACLM,WAAW,CAACC,GAAGC;gCACb,OAAOA,OAAO,CAAC,aAAa,KAAK,YAAYA,OAAO,CAAC,WAAW,KAAK;4BACvE;wBACF;wBACAN,aACE;wBACF7B,QAAQ;4BACN;gCACEO,MAAM;gCACNqB,MAAM;gCACN5B,QAAQ;oCACN;wCACEO,MAAM;wCACNqB,MAAM;wCACND,OAAO;4CACLE,aAAa;wCACf;wCACAc,YAAY7C,aAAa8C,oBAAoB,GACzC9C,aAAa8C,oBAAoB,GACjC;oCACN;iCACD;4BACH;yBACD;wBACDtC,OAAO;oBACT;oBACA;wBACEqB,OAAO;4BACLM,WAAW,CAACC,GAAGC;gCACb,OAAOA,OAAO,CAAC,aAAa,KAAK;4BACnC;wBACF;wBACAN,aAAa;wBACb7B,QAAQ;4BACN;gCACEO,MAAM;gCACNqB,MAAM;gCACNG,cAAc,CAAC;;;;yEAI0C,CAAC;gCAC1DzB,OAAO;4BACT;yBACD;wBACDA,OAAO;oBACT;oBACA;wBACEqB,OAAO;4BACLM,WAAW,CAACC,GAAGC;gCACb,OAAOA,OAAO,CAAC,aAAa,KAAK;4BACnC;wBACF;wBACAN,aAAa;wBACb7B,QAAQ;4BACN;gCACE;;;;;iBAKC,GALD;;;;;iBAKC,GACDO,MAAM;gCACNqB,MAAM;gCACND,OAAO;oCACLM,WAAW,CAACC,GAAGC;wCACb,OAAOA,OAAO,CAAC,aAAa,KAAK;oCACnC;gCACF;gCACAJ,cAAc,CAAC;;;;;;;2HAO4F,CAAC;gCAC5GzB,OAAO;4BACT;yBACD;wBACDA,OAAO;oBACT;iBACD;YACH;eACGT,cAAcC;SAClB;IACH,CAAA,EAAC"}
1
+ {"version":3,"sources":["../../src/collections/Instructions.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\nimport type { PluginConfig } from 'src/types.js'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\n\n// Defined capabilities replacing src/ai/models/\nconst CAPABILITIES = [\n {\n id: 'text',\n name: 'Text Generation',\n fields: ['text', 'textarea'],\n },\n {\n id: 'richtext',\n name: 'Rich Text Generation',\n fields: ['richText'],\n },\n {\n id: 'image',\n name: 'Image Generation',\n fields: ['upload'],\n },\n {\n id: 'tts',\n name: 'Text to Speech',\n fields: ['upload'],\n },\n]\n\nconst defaultAccessConfig = {\n create: ({ req }: { req: { user?: any } }) => {\n if (!req.user) {\n return false\n }\n return true\n },\n delete: ({ req }: { req: { user?: any } }) => {\n if (!req.user) {\n return false\n }\n return true\n },\n read: ({ req }: { req: { user?: any } }) => {\n if (!req.user) {\n return false\n }\n return true\n },\n update: ({ req }: { req: { user?: any } }) => {\n if (!req.user) {\n return false\n }\n return true\n },\n}\n\nconst defaultAdminConfig = {\n group: 'Plugins',\n hidden: true,\n}\n\nconst providerSelect = {\n name: 'provider',\n type: 'text' as const,\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Provider',\n}\n\nconst modelSelect = {\n name: 'model',\n type: 'text' as const,\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Model',\n}\n\nconst providerOptionsJson = {\n name: 'providerOptions',\n type: 'json' as const,\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Provider-specific options. Defaults are inherited from AI Settings.',\n },\n label: 'Provider Options',\n}\n\nconst commonTextParams = [\n {\n type: 'row' as const,\n fields: [\n {\n name: 'maxTokens',\n type: 'number' as const,\n admin: {\n placeholder: 'Model Default',\n },\n label: 'Max Tokens',\n },\n {\n name: 'temperature',\n type: 'number' as const,\n defaultValue: 0.7,\n label: 'Temperature',\n max: 1,\n min: 0,\n },\n ],\n },\n {\n name: 'extractAttachments',\n type: 'checkbox' as const,\n label: 'Extract Attachments',\n },\n]\n\nexport const instructionsCollection = (pluginConfig: PluginConfig) =>\n <CollectionConfig>{\n labels: {\n plural: 'Compose Settings',\n singular: 'Compose Setting',\n },\n ...pluginConfig.overrideInstructions,\n slug: PLUGIN_INSTRUCTIONS_TABLE,\n access: {\n ...defaultAccessConfig,\n ...pluginConfig.overrideInstructions?.access,\n },\n admin: {\n ...defaultAdminConfig,\n ...pluginConfig.overrideInstructions?.admin,\n components: {\n beforeList: ['@ai-stack/payloadcms/client#AIConfigDashboard'],\n },\n },\n fields: [\n {\n name: 'schema-path',\n type: 'text',\n admin: {\n description: \"Please don't change this unless you're sure of what you're doing\",\n },\n unique: true,\n },\n {\n name: 'field-type',\n type: 'select',\n admin: {\n description: \"Please don't change this unless you're sure of what you're doing\",\n },\n defaultValue: 'text',\n label: 'Field type',\n options: [\n {\n label: 'text',\n value: 'text',\n },\n {\n label: 'textarea',\n value: 'textarea',\n },\n {\n label: 'upload',\n value: 'upload',\n },\n {\n label: 'richText',\n value: 'richText',\n },\n ],\n },\n {\n name: 'relation-to',\n type: 'text',\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'upload'\n },\n },\n label: 'Relation to',\n },\n {\n name: 'model-id',\n type: 'select',\n admin: {\n components: {\n Field: {\n clientProps: {\n filterByField: 'field-type',\n options: CAPABILITIES.map((c) => ({\n fields: c.fields,\n label: c.name,\n value: c.id,\n })),\n },\n path: '@ai-stack/payloadcms/fields#SelectField',\n },\n },\n },\n label: 'Capability',\n options: CAPABILITIES.map((c) => ({\n label: c.name,\n value: c.id,\n })),\n },\n {\n name: 'disabled',\n type: 'checkbox',\n admin: {\n description: 'Please reload your collection after applying the changes',\n },\n defaultValue: false,\n label: 'Hide Compose button for this field',\n },\n {\n id: 'ai-prompts-tabs',\n type: 'tabs',\n tabs: [\n {\n description:\n 'Define dynamic templates using {{ fieldName }}. Type { to see available field suggestions.',\n fields: [\n {\n name: 'prompt',\n type: 'textarea',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/fields#PromptEditorField',\n },\n description: \"Click 'Compose' to run this custom prompt and generate content\",\n },\n label: '',\n },\n ],\n label: 'Prompt',\n },\n {\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'upload' && current['model-id'] === 'image'\n },\n },\n description:\n 'These images will be used to generate new visuals in a similar style, layout, or content.',\n fields: [\n {\n name: 'images',\n type: 'array',\n fields: [\n {\n name: 'image',\n type: 'upload',\n admin: {\n description: 'Please make sure the image is publicly accessible.',\n },\n relationTo: pluginConfig.uploadCollectionSlug\n ? pluginConfig.uploadCollectionSlug\n : 'media',\n },\n ],\n },\n ],\n label: 'Sample Images',\n },\n {\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'richText'\n },\n },\n description: '',\n fields: [\n {\n name: 'system',\n type: 'textarea',\n defaultValue: `INSTRUCTIONS:\nYou are a highly skilled and professional blog writer,\nrenowned for crafting engaging and well-organized articles.\nWhen given a title, you meticulously create blogs that are not only\ninformative and accurate but also captivating and beautifully structured.`,\n label: '',\n },\n ],\n label: 'System prompt',\n },\n {\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'richText'\n },\n },\n description: '',\n fields: [\n {\n name: 'layout',\n type: 'textarea',\n admin: {\n condition: (_, current) => {\n return current['field-type'] === 'richText'\n },\n },\n defaultValue: `[paragraph] - Write a concise introduction (2-3 sentences) that outlines the main topic.\n[horizontalrule] - Insert a horizontal rule to separate the introduction from the main content.\n[list] - Create a list with 3-5 items. Each list item should contain:\n a. [heading] - A brief, descriptive heading (up to 5 words)\n b. [paragraph] - A short explanation or elaboration (1-2 sentences)\n[horizontalrule] - Insert another horizontal rule to separate the main content from the conclusion.\n[paragraph] - Compose a brief conclusion (2-3 sentences) summarizing the key points.\n[quote] - Include a relevant quote from a famous person, directly related to the topic. Format: \"Quote text.\" - Author Name`,\n label: '',\n },\n ],\n label: 'Layout',\n },\n ],\n },\n \n // Inline Settings Groups by Capability\n \n // Text Settings\n {\n name: 'text-settings',\n type: 'group',\n admin: {\n condition: (data) => data['model-id'] === 'text',\n },\n fields: [\n providerSelect,\n modelSelect,\n ...commonTextParams,\n providerOptionsJson,\n ],\n label: 'Text Settings',\n },\n \n // Rich Text Settings\n {\n name: 'richtext-settings',\n type: 'group',\n admin: {\n condition: (data) => data['model-id'] === 'richtext',\n },\n fields: [\n providerSelect,\n modelSelect,\n ...commonTextParams,\n providerOptionsJson,\n ],\n label: 'Rich Text Settings',\n },\n \n // Image Settings\n {\n name: 'image-settings',\n type: 'group',\n admin: {\n condition: (data) => data['model-id'] === 'image',\n },\n fields: [\n providerSelect,\n modelSelect,\n providerOptionsJson,\n ],\n label: 'Image Settings',\n },\n \n // TTS Settings\n {\n name: 'tts-settings',\n type: 'group',\n admin: {\n condition: (data) => data['model-id'] === 'tts',\n },\n fields: [\n providerSelect,\n modelSelect,\n {\n name: 'voice',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicVoiceSelect',\n },\n },\n label: 'Voice',\n },\n providerOptionsJson,\n ],\n label: 'TTS Settings',\n },\n ],\n }\n"],"names":["PLUGIN_INSTRUCTIONS_TABLE","CAPABILITIES","id","name","fields","defaultAccessConfig","create","req","user","delete","read","update","defaultAdminConfig","group","hidden","providerSelect","type","admin","components","Field","label","modelSelect","providerOptionsJson","description","commonTextParams","placeholder","defaultValue","max","min","instructionsCollection","pluginConfig","labels","plural","singular","overrideInstructions","slug","access","beforeList","unique","options","value","condition","_","current","clientProps","filterByField","map","c","path","tabs","relationTo","uploadCollectionSlug","data"],"mappings":"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"}
@@ -1,9 +1,12 @@
1
1
  export declare const PLUGIN_NAME = "plugin-ai";
2
2
  export declare const PLUGIN_INSTRUCTIONS_TABLE = "plugin-ai-instructions";
3
+ export declare const PLUGIN_AI_JOBS_TABLE = "plugin-ai-ai-jobs";
3
4
  export declare const PLUGIN_LEXICAL_EDITOR_FEATURE = "plugin-ai-actions-feature";
4
5
  export declare const PLUGIN_API_ENDPOINT_BASE = "/plugin-ai";
5
6
  export declare const PLUGIN_API_ENDPOINT_GENERATE = "/plugin-ai/generate";
6
7
  export declare const PLUGIN_API_ENDPOINT_GENERATE_UPLOAD = "/plugin-ai/generate/upload";
7
8
  export declare const PLUGIN_FETCH_FIELDS_ENDPOINT = "/plugin-ai/fetch-fields";
9
+ export declare const PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK = "/plugin-ai/videogen/webhook";
10
+ export declare const PLUGIN_API_ENDPOINT_FETCH_VOICES = "/plugin-ai/elevenlabs/fetch-voices";
8
11
  export declare const PLUGIN_DEFAULT_OPENAI_MODEL = "gpt-4o-mini";
9
12
  export declare const PLUGIN_DEFAULT_ANTHROPIC_MODEL = "claude-3-5-sonnet-latest";
package/dist/defaults.js CHANGED
@@ -1,11 +1,14 @@
1
1
  export const PLUGIN_NAME = 'plugin-ai';
2
2
  export const PLUGIN_INSTRUCTIONS_TABLE = `${PLUGIN_NAME}-instructions`;
3
+ export const PLUGIN_AI_JOBS_TABLE = `${PLUGIN_NAME}-ai-jobs`;
3
4
  export const PLUGIN_LEXICAL_EDITOR_FEATURE = `${PLUGIN_NAME}-actions-feature`;
4
5
  // Endpoint defaults
5
6
  export const PLUGIN_API_ENDPOINT_BASE = `/${PLUGIN_NAME}`;
6
7
  export const PLUGIN_API_ENDPOINT_GENERATE = `${PLUGIN_API_ENDPOINT_BASE}/generate`;
7
8
  export const PLUGIN_API_ENDPOINT_GENERATE_UPLOAD = `${PLUGIN_API_ENDPOINT_GENERATE}/upload`;
8
9
  export const PLUGIN_FETCH_FIELDS_ENDPOINT = `${PLUGIN_API_ENDPOINT_BASE}/fetch-fields`;
10
+ export const PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK = `${PLUGIN_API_ENDPOINT_BASE}/videogen/webhook`;
11
+ export const PLUGIN_API_ENDPOINT_FETCH_VOICES = `${PLUGIN_API_ENDPOINT_BASE}/elevenlabs/fetch-voices`;
9
12
  // LLM Settings
10
13
  export const PLUGIN_DEFAULT_OPENAI_MODEL = `gpt-4o-mini`;
11
14
  export const PLUGIN_DEFAULT_ANTHROPIC_MODEL = `claude-3-5-sonnet-latest`;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/defaults.ts"],"sourcesContent":["export const PLUGIN_NAME = 'plugin-ai'\nexport const PLUGIN_INSTRUCTIONS_TABLE = `${PLUGIN_NAME}-instructions`\nexport const PLUGIN_LEXICAL_EDITOR_FEATURE = `${PLUGIN_NAME}-actions-feature`\n\n// Endpoint defaults\nexport const PLUGIN_API_ENDPOINT_BASE = `/${PLUGIN_NAME}`\nexport const PLUGIN_API_ENDPOINT_GENERATE = `${PLUGIN_API_ENDPOINT_BASE}/generate`\nexport const PLUGIN_API_ENDPOINT_GENERATE_UPLOAD = `${PLUGIN_API_ENDPOINT_GENERATE}/upload`\nexport const PLUGIN_FETCH_FIELDS_ENDPOINT = `${PLUGIN_API_ENDPOINT_BASE}/fetch-fields`\n\n// LLM Settings\nexport const PLUGIN_DEFAULT_OPENAI_MODEL = `gpt-4o-mini`\nexport const PLUGIN_DEFAULT_ANTHROPIC_MODEL = `claude-3-5-sonnet-latest`\n"],"names":["PLUGIN_NAME","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_LEXICAL_EDITOR_FEATURE","PLUGIN_API_ENDPOINT_BASE","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_FETCH_FIELDS_ENDPOINT","PLUGIN_DEFAULT_OPENAI_MODEL","PLUGIN_DEFAULT_ANTHROPIC_MODEL"],"mappings":"AAAA,OAAO,MAAMA,cAAc,YAAW;AACtC,OAAO,MAAMC,4BAA4B,CAAC,EAAED,YAAY,aAAa,CAAC,CAAA;AACtE,OAAO,MAAME,gCAAgC,CAAC,EAAEF,YAAY,gBAAgB,CAAC,CAAA;AAE7E,oBAAoB;AACpB,OAAO,MAAMG,2BAA2B,CAAC,CAAC,EAAEH,YAAY,CAAC,CAAA;AACzD,OAAO,MAAMI,+BAA+B,CAAC,EAAED,yBAAyB,SAAS,CAAC,CAAA;AAClF,OAAO,MAAME,sCAAsC,CAAC,EAAED,6BAA6B,OAAO,CAAC,CAAA;AAC3F,OAAO,MAAME,+BAA+B,CAAC,EAAEH,yBAAyB,aAAa,CAAC,CAAA;AAEtF,eAAe;AACf,OAAO,MAAMI,8BAA8B,CAAC,WAAW,CAAC,CAAA;AACxD,OAAO,MAAMC,iCAAiC,CAAC,wBAAwB,CAAC,CAAA"}
1
+ {"version":3,"sources":["../src/defaults.ts"],"sourcesContent":["export const PLUGIN_NAME = 'plugin-ai'\nexport const PLUGIN_INSTRUCTIONS_TABLE = `${PLUGIN_NAME}-instructions`\nexport const PLUGIN_AI_JOBS_TABLE = `${PLUGIN_NAME}-ai-jobs`\nexport const PLUGIN_LEXICAL_EDITOR_FEATURE = `${PLUGIN_NAME}-actions-feature`\n\n// Endpoint defaults\nexport const PLUGIN_API_ENDPOINT_BASE = `/${PLUGIN_NAME}`\nexport const PLUGIN_API_ENDPOINT_GENERATE = `${PLUGIN_API_ENDPOINT_BASE}/generate`\nexport const PLUGIN_API_ENDPOINT_GENERATE_UPLOAD = `${PLUGIN_API_ENDPOINT_GENERATE}/upload`\nexport const PLUGIN_FETCH_FIELDS_ENDPOINT = `${PLUGIN_API_ENDPOINT_BASE}/fetch-fields`\nexport const PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK = `${PLUGIN_API_ENDPOINT_BASE}/videogen/webhook`\nexport const PLUGIN_API_ENDPOINT_FETCH_VOICES = `${PLUGIN_API_ENDPOINT_BASE}/elevenlabs/fetch-voices`\n\n// LLM Settings\nexport const PLUGIN_DEFAULT_OPENAI_MODEL = `gpt-4o-mini`\nexport const PLUGIN_DEFAULT_ANTHROPIC_MODEL = `claude-3-5-sonnet-latest`\n"],"names":["PLUGIN_NAME","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_AI_JOBS_TABLE","PLUGIN_LEXICAL_EDITOR_FEATURE","PLUGIN_API_ENDPOINT_BASE","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_FETCH_FIELDS_ENDPOINT","PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK","PLUGIN_API_ENDPOINT_FETCH_VOICES","PLUGIN_DEFAULT_OPENAI_MODEL","PLUGIN_DEFAULT_ANTHROPIC_MODEL"],"mappings":"AAAA,OAAO,MAAMA,cAAc,YAAW;AACtC,OAAO,MAAMC,4BAA4B,CAAC,EAAED,YAAY,aAAa,CAAC,CAAA;AACtE,OAAO,MAAME,uBAAuB,CAAC,EAAEF,YAAY,QAAQ,CAAC,CAAA;AAC5D,OAAO,MAAMG,gCAAgC,CAAC,EAAEH,YAAY,gBAAgB,CAAC,CAAA;AAE7E,oBAAoB;AACpB,OAAO,MAAMI,2BAA2B,CAAC,CAAC,EAAEJ,YAAY,CAAC,CAAA;AACzD,OAAO,MAAMK,+BAA+B,CAAC,EAAED,yBAAyB,SAAS,CAAC,CAAA;AAClF,OAAO,MAAME,sCAAsC,CAAC,EAAED,6BAA6B,OAAO,CAAC,CAAA;AAC3F,OAAO,MAAME,+BAA+B,CAAC,EAAEH,yBAAyB,aAAa,CAAC,CAAA;AACtF,OAAO,MAAMI,uCAAuC,CAAC,EAAEJ,yBAAyB,iBAAiB,CAAC,CAAA;AAClG,OAAO,MAAMK,mCAAmC,CAAC,EAAEL,yBAAyB,wBAAwB,CAAC,CAAA;AAErG,eAAe;AACf,OAAO,MAAMM,8BAA8B,CAAC,WAAW,CAAC,CAAA;AACxD,OAAO,MAAMC,iCAAiC,CAAC,wBAAwB,CAAC,CAAA"}
@@ -0,0 +1,19 @@
1
+ import type { CollectionSlug } from 'payload';
2
+ import type { ActionMenuItems, PluginConfig, PromptFieldGetterContext } from '../types.js';
3
+ export declare const assignPrompt: (action: ActionMenuItems, { type, actionParams, collection, context, field, layout, locale, pluginConfig, systemPrompt, template, }: {
4
+ actionParams: Record<any, any>;
5
+ collection: CollectionSlug;
6
+ context: object;
7
+ field: string;
8
+ layout: string;
9
+ locale: string;
10
+ pluginConfig: PluginConfig;
11
+ systemPrompt: string;
12
+ template: string;
13
+ type: string;
14
+ }) => Promise<{
15
+ layout: string | undefined;
16
+ prompt: string;
17
+ system: string | undefined;
18
+ }>;
19
+ export declare const extendContextWithPromptFields: (data: object, ctx: PromptFieldGetterContext, pluginConfig: PluginConfig) => object;
@@ -0,0 +1,114 @@
1
+ import { defaultPrompts } from '../ai/prompts.js';
2
+ import { asyncHandlebars } from '../libraries/handlebars/asyncHandlebars.js';
3
+ import { handlebarsHelpersMap } from '../libraries/handlebars/helpersMap.js';
4
+ import { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js';
5
+ const buildRichTextSystem = (baseSystem, layout)=>{
6
+ return `${baseSystem}
7
+
8
+ RULES:
9
+ - Generate original and unique content based on the given topic.
10
+ - Strictly adhere to the specified layout and formatting instructions.
11
+ - Utilize the provided rich text editor tools for appropriate formatting.
12
+ - Ensure the output follows the structure of the sample output object.
13
+ - Produce valid JSON with no undefined or null values.
14
+ ---
15
+ LAYOUT INSTRUCTIONS:
16
+ ${layout}
17
+
18
+ ---
19
+ ADDITIONAL GUIDELINES:
20
+ - Ensure coherence and logical flow between all sections.
21
+ - Maintain a consistent tone and style throughout the content.
22
+ - Use clear and concise language appropriate for the target audience.
23
+ `;
24
+ };
25
+ export const assignPrompt = async (action, { type, actionParams, collection, context, field, layout, locale, pluginConfig, systemPrompt = '', template })=>{
26
+ const extendedContext = extendContextWithPromptFields(context, {
27
+ type,
28
+ collection
29
+ }, pluginConfig);
30
+ const prompt = await replacePlaceholders(template, extendedContext);
31
+ const toLexicalHTML = type === 'richText' ? handlebarsHelpersMap.toHTML.name : '';
32
+ const assignedPrompts = {
33
+ layout: type === 'richText' ? layout : undefined,
34
+ prompt,
35
+ //TODO: Define only once on a collection level
36
+ system: type === 'richText' ? buildRichTextSystem(systemPrompt, layout) : undefined
37
+ };
38
+ if (action === 'Compose') {
39
+ if (locale && locale !== 'en') {
40
+ /**
41
+ * NOTE: Avoid using the "system prompt" for setting the output language,
42
+ * as it causes quotation marks to appear in the output (Currently only tested with openai models).
43
+ * Appending the language instruction directly to the prompt resolves this issue. - revalidate
44
+ **/ assignedPrompts.prompt += `
45
+ ---
46
+ OUTPUT LANGUAGE: ${locale}
47
+ `;
48
+ }
49
+ return assignedPrompts;
50
+ }
51
+ const prompts = [
52
+ ...pluginConfig.prompts || [],
53
+ ...defaultPrompts
54
+ ];
55
+ const foundPrompt = prompts.find((p)=>p.name === action);
56
+ const getLayout = foundPrompt?.layout;
57
+ const getSystemPrompt = foundPrompt?.system;
58
+ let updatedLayout = layout;
59
+ if (getLayout) {
60
+ updatedLayout = getLayout();
61
+ }
62
+ const system = getSystemPrompt ? getSystemPrompt({
63
+ ...actionParams || {},
64
+ prompt,
65
+ systemPrompt
66
+ }) : '';
67
+ return {
68
+ layout: updatedLayout,
69
+ // TODO: revisit this toLexicalHTML
70
+ prompt: await replacePlaceholders(`{{${toLexicalHTML} ${field}}}`, extendedContext),
71
+ system: type === 'richText' ? buildRichTextSystem(system, updatedLayout) : system
72
+ };
73
+ };
74
+ export const extendContextWithPromptFields = (data, ctx, pluginConfig)=>{
75
+ const { promptFields = [] } = pluginConfig;
76
+ const fieldsMap = new Map(promptFields.filter((f)=>!f.collections || f.collections.includes(ctx.collection)).map((f)=>[
77
+ f.name,
78
+ f
79
+ ]));
80
+ return new Proxy(data, {
81
+ get: (target, prop)=>{
82
+ const field = fieldsMap.get(prop);
83
+ if (field?.getter) {
84
+ const value = field.getter(data, ctx);
85
+ return Promise.resolve(value).then((v)=>new asyncHandlebars.SafeString(v));
86
+ }
87
+ // {{prop}} escapes content by default. Here we make sure it won't be escaped.
88
+ const value = typeof target === 'object' ? target[prop] : undefined;
89
+ return typeof value === 'string' ? new asyncHandlebars.SafeString(value) : value;
90
+ },
91
+ // It's used by the handlebars library to determine if the property is enumerable
92
+ getOwnPropertyDescriptor: (target, prop)=>{
93
+ const field = fieldsMap.get(prop);
94
+ if (field) {
95
+ return {
96
+ configurable: true,
97
+ enumerable: true
98
+ };
99
+ }
100
+ return Object.getOwnPropertyDescriptor(target, prop);
101
+ },
102
+ has: (target, prop)=>{
103
+ return fieldsMap.has(prop) || target && prop in target;
104
+ },
105
+ ownKeys: (target)=>{
106
+ return [
107
+ ...fieldsMap.keys(),
108
+ ...Object.keys(target || {})
109
+ ];
110
+ }
111
+ });
112
+ };
113
+
114
+ //# sourceMappingURL=buildPromptUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/endpoints/buildPromptUtils.ts"],"sourcesContent":["import type { CollectionSlug } from 'payload'\n\nimport type {\n ActionMenuItems,\n PluginConfig,\n PromptFieldGetterContext,\n} from '../types.js'\n\nimport { defaultPrompts } from '../ai/prompts.js'\nimport { asyncHandlebars } from '../libraries/handlebars/asyncHandlebars.js'\nimport { handlebarsHelpersMap } from '../libraries/handlebars/helpersMap.js'\nimport { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js'\n\nconst buildRichTextSystem = (baseSystem: string, layout: string) => {\n return `${baseSystem}\n\nRULES:\n- Generate original and unique content based on the given topic.\n- Strictly adhere to the specified layout and formatting instructions.\n- Utilize the provided rich text editor tools for appropriate formatting.\n- Ensure the output follows the structure of the sample output object.\n- Produce valid JSON with no undefined or null values.\n---\nLAYOUT INSTRUCTIONS:\n${layout}\n\n---\nADDITIONAL GUIDELINES:\n- Ensure coherence and logical flow between all sections.\n- Maintain a consistent tone and style throughout the content.\n- Use clear and concise language appropriate for the target audience.\n`\n}\n\nexport const assignPrompt = async (\n action: ActionMenuItems,\n {\n type,\n actionParams,\n collection,\n context,\n field,\n layout,\n locale,\n pluginConfig,\n systemPrompt = '',\n template,\n }: {\n actionParams: Record<any, any>\n collection: CollectionSlug\n context: object\n field: string\n layout: string\n locale: string\n pluginConfig: PluginConfig\n systemPrompt: string\n template: string\n type: string\n },\n) => {\n const extendedContext = extendContextWithPromptFields(context, { type, collection }, pluginConfig)\n const prompt = await replacePlaceholders(template, extendedContext)\n const toLexicalHTML = type === 'richText' ? handlebarsHelpersMap.toHTML.name : ''\n\n const assignedPrompts = {\n layout: type === 'richText' ? layout : undefined,\n prompt,\n //TODO: Define only once on a collection level\n system: type === 'richText' ? buildRichTextSystem(systemPrompt, layout) : undefined,\n }\n\n if (action === 'Compose') {\n if (locale && locale !== 'en') {\n /**\n * NOTE: Avoid using the \"system prompt\" for setting the output language,\n * as it causes quotation marks to appear in the output (Currently only tested with openai models).\n * Appending the language instruction directly to the prompt resolves this issue. - revalidate\n **/\n assignedPrompts.prompt += `\n --- \n OUTPUT LANGUAGE: ${locale}\n `\n }\n\n return assignedPrompts\n }\n\n const prompts = [...(pluginConfig.prompts || []), ...defaultPrompts]\n const foundPrompt = prompts.find((p) => p.name === action)\n const getLayout = foundPrompt?.layout\n const getSystemPrompt = foundPrompt?.system\n\n let updatedLayout = layout\n if (getLayout) {\n updatedLayout = getLayout()\n }\n\n const system = getSystemPrompt\n ? getSystemPrompt({\n ...(actionParams || {}),\n prompt,\n systemPrompt,\n })\n : ''\n\n return {\n layout: updatedLayout,\n // TODO: revisit this toLexicalHTML\n prompt: await replacePlaceholders(`{{${toLexicalHTML} ${field}}}`, extendedContext),\n system: type === 'richText' ? buildRichTextSystem(system, updatedLayout) : system,\n }\n}\n\nexport const extendContextWithPromptFields = (\n data: object,\n ctx: PromptFieldGetterContext,\n pluginConfig: PluginConfig,\n) => {\n const { promptFields = [] } = pluginConfig\n const fieldsMap = new Map(\n promptFields\n .filter((f) => !f.collections || f.collections.includes(ctx.collection))\n .map((f) => [f.name, f]),\n )\n return new Proxy(data, {\n get: (target, prop: string) => {\n const field = fieldsMap.get(prop)\n if (field?.getter) {\n const value = field.getter(data, ctx)\n return Promise.resolve(value).then((v) => new asyncHandlebars.SafeString(v))\n }\n // {{prop}} escapes content by default. Here we make sure it won't be escaped.\n const value = typeof target === 'object' ? (target as any)[prop] : undefined\n return typeof value === 'string' ? new asyncHandlebars.SafeString(value) : value\n },\n // It's used by the handlebars library to determine if the property is enumerable\n getOwnPropertyDescriptor: (target, prop) => {\n const field = fieldsMap.get(prop as string)\n if (field) {\n return {\n configurable: true,\n enumerable: true,\n }\n }\n return Object.getOwnPropertyDescriptor(target, prop)\n },\n has: (target, prop) => {\n return fieldsMap.has(prop as string) || (target && prop in target)\n },\n ownKeys: (target) => {\n return [...fieldsMap.keys(), ...Object.keys(target || {})]\n },\n })\n}\n"],"names":["defaultPrompts","asyncHandlebars","handlebarsHelpersMap","replacePlaceholders","buildRichTextSystem","baseSystem","layout","assignPrompt","action","type","actionParams","collection","context","field","locale","pluginConfig","systemPrompt","template","extendedContext","extendContextWithPromptFields","prompt","toLexicalHTML","toHTML","name","assignedPrompts","undefined","system","prompts","foundPrompt","find","p","getLayout","getSystemPrompt","updatedLayout","data","ctx","promptFields","fieldsMap","Map","filter","f","collections","includes","map","Proxy","get","target","prop","getter","value","Promise","resolve","then","v","SafeString","getOwnPropertyDescriptor","configurable","enumerable","Object","has","ownKeys","keys"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { };
2
+
3
+ //# sourceMappingURL=chat.d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/endpoints/chat.d.ts"],"sourcesContent":["import type { Endpoint } from 'payload';\n\nimport type { PluginConfig } from '../types.js';\nexport declare const Chat: (pluginConfig: PluginConfig) => Endpoint;\n"],"names":[],"mappings":"AAGA,WAAoE"}
@@ -0,0 +1,2 @@
1
+ import type { Endpoint } from 'payload';
2
+ export declare const fetchVoices: Endpoint;
@@ -0,0 +1,79 @@
1
+ import { PLUGIN_API_ENDPOINT_FETCH_VOICES } from '../defaults.js';
2
+ export const fetchVoices = {
3
+ handler: async (req)=>{
4
+ try {
5
+ // Check authentication
6
+ if (!req.user) {
7
+ return Response.json({
8
+ message: 'Authentication required'
9
+ }, {
10
+ status: 401
11
+ });
12
+ }
13
+ // Fetch AI Settings global to get the encrypted API key
14
+ const aiSettings = await req.payload.findGlobal({
15
+ slug: 'ai-settings',
16
+ context: {
17
+ unsafe: true
18
+ }
19
+ });
20
+ // Find the ElevenLabs provider block
21
+ const elevenlabsProvider = aiSettings?.providers?.find((provider)=>provider.blockType === 'elevenlabs' && provider.enabled);
22
+ if (!elevenlabsProvider) {
23
+ return Response.json({
24
+ message: 'ElevenLabs provider not found or not enabled in AI Settings'
25
+ }, {
26
+ status: 400
27
+ });
28
+ }
29
+ // Get the API key (already decrypted by afterRead hook due to unsafe context)
30
+ const apiKey = elevenlabsProvider.apiKey;
31
+ if (!apiKey) {
32
+ return Response.json({
33
+ message: 'API key not found. Please configure your ElevenLabs API key in AI Settings.'
34
+ }, {
35
+ status: 400
36
+ });
37
+ }
38
+ // Call ElevenLabs API to fetch voices
39
+ const response = await fetch('https://api.elevenlabs.io/v1/voices', {
40
+ headers: {
41
+ 'xi-api-key': apiKey
42
+ }
43
+ });
44
+ if (!response.ok) {
45
+ const errorText = await response.text();
46
+ return Response.json({
47
+ message: `ElevenLabs API error: ${errorText}`
48
+ }, {
49
+ status: response.status
50
+ });
51
+ }
52
+ const data = await response.json();
53
+ // Transform voices to match our schema
54
+ const voices = (data.voices || []).map((voice)=>({
55
+ id: voice.voice_id,
56
+ name: voice.name,
57
+ category: voice.category || 'premade',
58
+ enabled: true,
59
+ labels: voice.labels || {},
60
+ preview_url: voice.preview_url || ''
61
+ }));
62
+ return Response.json({
63
+ success: true,
64
+ voices
65
+ });
66
+ } catch (error) {
67
+ req.payload.logger.error(error, 'Error fetching ElevenLabs voices');
68
+ return Response.json({
69
+ message: error instanceof Error ? error.message : 'Internal server error'
70
+ }, {
71
+ status: 500
72
+ });
73
+ }
74
+ },
75
+ method: 'post',
76
+ path: PLUGIN_API_ENDPOINT_FETCH_VOICES
77
+ };
78
+
79
+ //# sourceMappingURL=fetchVoices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/endpoints/fetchVoices.ts"],"sourcesContent":["import type { Endpoint, PayloadRequest } from 'payload'\n\nimport { PLUGIN_API_ENDPOINT_FETCH_VOICES } from '../defaults.js'\n\ninterface ElevenLabsVoice {\n category?: string\n labels?: Record<string, string>\n name: string\n preview_url?: string\n voice_id: string\n}\n\nexport const fetchVoices: Endpoint = {\n handler: async (req: PayloadRequest) => {\n try {\n // Check authentication\n if (!req.user) {\n return Response.json({ message: 'Authentication required' }, { status: 401 })\n }\n\n // Fetch AI Settings global to get the encrypted API key\n const aiSettings = await req.payload.findGlobal({\n slug: 'ai-settings',\n context: { unsafe: true },\n })\n\n // Find the ElevenLabs provider block\n const elevenlabsProvider = aiSettings?.providers?.find(\n (provider: any) => provider.blockType === 'elevenlabs' && provider.enabled,\n )\n\n if (!elevenlabsProvider) {\n return Response.json(\n { message: 'ElevenLabs provider not found or not enabled in AI Settings' },\n { status: 400 },\n )\n }\n\n // Get the API key (already decrypted by afterRead hook due to unsafe context)\n const apiKey = elevenlabsProvider.apiKey\n\n if (!apiKey) {\n return Response.json(\n {\n message: 'API key not found. Please configure your ElevenLabs API key in AI Settings.',\n },\n { status: 400 },\n )\n }\n\n // Call ElevenLabs API to fetch voices\n const response = await fetch('https://api.elevenlabs.io/v1/voices', {\n headers: {\n 'xi-api-key': apiKey,\n },\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n return Response.json(\n { message: `ElevenLabs API error: ${errorText}` },\n { status: response.status },\n )\n }\n\n const data = await response.json()\n\n // Transform voices to match our schema\n const voices = (data.voices || []).map((voice: ElevenLabsVoice) => ({\n id: voice.voice_id,\n name: voice.name,\n category: voice.category || 'premade',\n enabled: true,\n labels: voice.labels || {},\n preview_url: voice.preview_url || '',\n }))\n\n return Response.json({\n success: true,\n voices,\n })\n } catch (error) {\n req.payload.logger.error(error, 'Error fetching ElevenLabs voices')\n return Response.json(\n { message: error instanceof Error ? error.message : 'Internal server error' },\n { status: 500 },\n )\n }\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_FETCH_VOICES,\n}\n"],"names":["PLUGIN_API_ENDPOINT_FETCH_VOICES","fetchVoices","handler","req","user","Response","json","message","status","aiSettings","payload","findGlobal","slug","context","unsafe","elevenlabsProvider","providers","find","provider","blockType","enabled","apiKey","response","fetch","headers","ok","errorText","text","data","voices","map","voice","id","voice_id","name","category","labels","preview_url","success","error","logger","Error","method","path"],"mappings":"AAEA,SAASA,gCAAgC,QAAQ,iBAAgB;AAUjE,OAAO,MAAMC,cAAwB;IACnCC,SAAS,OAAOC;QACd,IAAI;YACF,uBAAuB;YACvB,IAAI,CAACA,IAAIC,IAAI,EAAE;gBACb,OAAOC,SAASC,IAAI,CAAC;oBAAEC,SAAS;gBAA0B,GAAG;oBAAEC,QAAQ;gBAAI;YAC7E;YAEA,wDAAwD;YACxD,MAAMC,aAAa,MAAMN,IAAIO,OAAO,CAACC,UAAU,CAAC;gBAC9CC,MAAM;gBACNC,SAAS;oBAAEC,QAAQ;gBAAK;YAC1B;YAEA,qCAAqC;YACrC,MAAMC,qBAAqBN,YAAYO,WAAWC,KAChD,CAACC,WAAkBA,SAASC,SAAS,KAAK,gBAAgBD,SAASE,OAAO;YAG5E,IAAI,CAACL,oBAAoB;gBACvB,OAAOV,SAASC,IAAI,CAClB;oBAAEC,SAAS;gBAA8D,GACzE;oBAAEC,QAAQ;gBAAI;YAElB;YAEA,8EAA8E;YAC9E,MAAMa,SAASN,mBAAmBM,MAAM;YAExC,IAAI,CAACA,QAAQ;gBACX,OAAOhB,SAASC,IAAI,CAClB;oBACEC,SAAS;gBACX,GACA;oBAAEC,QAAQ;gBAAI;YAElB;YAEA,sCAAsC;YACtC,MAAMc,WAAW,MAAMC,MAAM,uCAAuC;gBAClEC,SAAS;oBACP,cAAcH;gBAChB;YACF;YAEA,IAAI,CAACC,SAASG,EAAE,EAAE;gBAChB,MAAMC,YAAY,MAAMJ,SAASK,IAAI;gBACrC,OAAOtB,SAASC,IAAI,CAClB;oBAAEC,SAAS,CAAC,sBAAsB,EAAEmB,UAAU,CAAC;gBAAC,GAChD;oBAAElB,QAAQc,SAASd,MAAM;gBAAC;YAE9B;YAEA,MAAMoB,OAAO,MAAMN,SAAShB,IAAI;YAEhC,uCAAuC;YACvC,MAAMuB,SAAS,AAACD,CAAAA,KAAKC,MAAM,IAAI,EAAE,AAAD,EAAGC,GAAG,CAAC,CAACC,QAA4B,CAAA;oBAClEC,IAAID,MAAME,QAAQ;oBAClBC,MAAMH,MAAMG,IAAI;oBAChBC,UAAUJ,MAAMI,QAAQ,IAAI;oBAC5Bf,SAAS;oBACTgB,QAAQL,MAAMK,MAAM,IAAI,CAAC;oBACzBC,aAAaN,MAAMM,WAAW,IAAI;gBACpC,CAAA;YAEA,OAAOhC,SAASC,IAAI,CAAC;gBACnBgC,SAAS;gBACTT;YACF;QACF,EAAE,OAAOU,OAAO;YACdpC,IAAIO,OAAO,CAAC8B,MAAM,CAACD,KAAK,CAACA,OAAO;YAChC,OAAOlC,SAASC,IAAI,CAClB;gBAAEC,SAASgC,iBAAiBE,QAAQF,MAAMhC,OAAO,GAAG;YAAwB,GAC5E;gBAAEC,QAAQ;YAAI;QAElB;IACF;IACAkC,QAAQ;IACRC,MAAM3C;AACR,EAAC"}