@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.
- package/{LICENSE.md → LICENSE} +1 -1
- package/README.md +218 -229
- package/dist/access/checkAccess.d.ts +4 -0
- package/dist/access/checkAccess.js +20 -0
- package/dist/access/checkAccess.js.map +1 -0
- package/dist/ai/core/generateObject.d.ts +7 -0
- package/dist/ai/core/generateObject.js +35 -0
- package/dist/ai/core/generateObject.js.map +1 -0
- package/dist/ai/core/generateText.d.ts +7 -0
- package/dist/ai/core/generateText.js +31 -0
- package/dist/ai/core/generateText.js.map +1 -0
- package/dist/ai/core/index.d.ts +11 -0
- package/dist/ai/core/index.js +10 -0
- package/dist/ai/core/index.js.map +1 -0
- package/dist/ai/core/media/generateMedia.d.ts +7 -0
- package/dist/ai/core/media/generateMedia.js +50 -0
- package/dist/ai/core/media/generateMedia.js.map +1 -0
- package/dist/ai/core/media/image/generateImage.d.ts +6 -0
- package/dist/ai/core/media/image/generateImage.js +41 -0
- package/dist/ai/core/media/image/generateImage.js.map +1 -0
- package/dist/ai/core/media/image/handlers/multimodal.d.ts +7 -0
- package/dist/ai/core/media/image/handlers/multimodal.js +95 -0
- package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -0
- package/dist/ai/core/media/image/handlers/standard.d.ts +7 -0
- package/dist/ai/core/media/image/handlers/standard.js +28 -0
- package/dist/ai/core/media/image/handlers/standard.js.map +1 -0
- package/dist/ai/core/media/image/index.d.ts +2 -0
- package/dist/ai/core/media/image/index.js +3 -0
- package/dist/ai/core/media/image/index.js.map +1 -0
- package/dist/ai/core/media/index.d.ts +2 -0
- package/dist/ai/core/media/index.js +3 -0
- package/dist/ai/core/media/index.js.map +1 -0
- package/dist/ai/core/media/speech/generateSpeech.d.ts +5 -0
- package/dist/ai/core/media/speech/generateSpeech.js +55 -0
- package/dist/ai/core/media/speech/generateSpeech.js.map +1 -0
- package/dist/ai/core/media/speech/index.d.ts +2 -0
- package/dist/ai/core/media/speech/index.js +3 -0
- package/dist/ai/core/media/speech/index.js.map +1 -0
- package/dist/ai/core/media/types.d.ts +74 -0
- package/dist/ai/core/media/types.js +5 -0
- package/dist/ai/core/media/types.js.map +1 -0
- package/dist/ai/core/media/utils.d.ts +11 -0
- package/dist/ai/core/media/utils.js +34 -0
- package/dist/ai/core/media/utils.js.map +1 -0
- package/dist/ai/core/media/video/generateVideo.d.ts +6 -0
- package/dist/ai/core/media/video/generateVideo.js +32 -0
- package/dist/ai/core/media/video/generateVideo.js.map +1 -0
- package/dist/ai/core/media/video/index.d.ts +2 -0
- package/dist/ai/core/media/video/index.js +3 -0
- package/dist/ai/core/media/video/index.js.map +1 -0
- package/dist/ai/core/streamObject.d.ts +7 -0
- package/dist/ai/core/streamObject.js +57 -0
- package/dist/ai/core/streamObject.js.map +1 -0
- package/dist/ai/core/streamText.d.ts +7 -0
- package/dist/ai/core/streamText.js +30 -0
- package/dist/ai/core/streamText.js.map +1 -0
- package/dist/ai/core/types.d.ts +85 -0
- package/dist/ai/core/types.js +5 -0
- package/dist/ai/core/types.js.map +1 -0
- package/dist/ai/index.d.ts +11 -0
- package/dist/ai/index.js +25 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/providers/blocks/anthropic.d.ts +2 -0
- package/dist/ai/providers/blocks/anthropic.js +222 -0
- package/dist/ai/providers/blocks/anthropic.js.map +1 -0
- package/dist/ai/providers/blocks/elevenlabs.d.ts +2 -0
- package/dist/ai/providers/blocks/elevenlabs.js +448 -0
- package/dist/ai/providers/blocks/elevenlabs.js.map +1 -0
- package/dist/ai/providers/blocks/fal.d.ts +2 -0
- package/dist/ai/providers/blocks/fal.js +311 -0
- package/dist/ai/providers/blocks/fal.js.map +1 -0
- package/dist/ai/providers/blocks/google.d.ts +2 -0
- package/dist/ai/providers/blocks/google.js +622 -0
- package/dist/ai/providers/blocks/google.js.map +1 -0
- package/dist/ai/providers/blocks/index.d.ts +2 -0
- package/dist/ai/providers/blocks/index.js +18 -0
- package/dist/ai/providers/blocks/index.js.map +1 -0
- package/dist/ai/providers/blocks/openai-compatible.d.ts +2 -0
- package/dist/ai/providers/blocks/openai-compatible.js +307 -0
- package/dist/ai/providers/blocks/openai-compatible.js.map +1 -0
- package/dist/ai/providers/blocks/openai.d.ts +2 -0
- package/dist/ai/providers/blocks/openai.js +599 -0
- package/dist/ai/providers/blocks/openai.js.map +1 -0
- package/dist/ai/providers/blocks/xai.d.ts +2 -0
- package/dist/ai/providers/blocks/xai.js +246 -0
- package/dist/ai/providers/blocks/xai.js.map +1 -0
- package/dist/ai/providers/index.d.ts +2 -0
- package/dist/ai/providers/index.js +6 -0
- package/dist/ai/providers/index.js.map +1 -0
- package/dist/ai/providers/registry.d.ts +40 -0
- package/dist/ai/providers/registry.js +256 -0
- package/dist/ai/providers/registry.js.map +1 -0
- package/dist/ai/providers/types.d.ts +115 -0
- package/dist/ai/providers/types.js +4 -0
- package/dist/ai/providers/types.js.map +1 -0
- package/dist/ai/utils/systemGenerate.d.ts +1 -1
- package/dist/ai/utils/systemGenerate.js +19 -19
- package/dist/ai/utils/systemGenerate.js.map +1 -1
- package/dist/collections/AIJobs.d.ts +2 -0
- package/dist/collections/AIJobs.js +81 -0
- package/dist/collections/AIJobs.js.map +1 -0
- package/dist/collections/AISettings.d.ts +2 -0
- package/dist/collections/AISettings.js +279 -0
- package/dist/collections/AISettings.js.map +1 -0
- package/dist/collections/Instructions.js +185 -37
- package/dist/collections/Instructions.js.map +1 -1
- package/dist/defaults.d.ts +3 -0
- package/dist/defaults.js +3 -0
- package/dist/defaults.js.map +1 -1
- package/dist/endpoints/buildPromptUtils.d.ts +19 -0
- package/dist/endpoints/buildPromptUtils.js +114 -0
- package/dist/endpoints/buildPromptUtils.js.map +1 -0
- package/dist/endpoints/chat.d.js +3 -0
- package/dist/endpoints/chat.d.js.map +1 -0
- package/dist/endpoints/fetchVoices.d.ts +2 -0
- package/dist/endpoints/fetchVoices.js +79 -0
- package/dist/endpoints/fetchVoices.js.map +1 -0
- package/dist/endpoints/index.js +253 -214
- package/dist/endpoints/index.js.map +1 -1
- package/dist/exports/client.d.ts +9 -0
- package/dist/exports/client.js +9 -0
- package/dist/exports/client.js.map +1 -1
- package/dist/fields/ComposeField/ComposeField.js +2 -2
- package/dist/fields/ComposeField/ComposeField.js.map +1 -1
- package/dist/fields/ComposeField/ComposeField.jsx +2 -2
- package/dist/fields/PromptEditorField/PromptEditorField.js +155 -14
- package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
- package/dist/fields/PromptEditorField/PromptEditorField.jsx +118 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init.js +35 -13
- package/dist/init.js.map +1 -1
- package/dist/payload-ai.d.js +3 -0
- package/dist/payload-ai.d.js.map +1 -0
- package/dist/plugin.js +80 -9
- package/dist/plugin.js.map +1 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.js +35 -7
- package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +27 -4
- package/dist/providers/InstructionsProvider/context.d.ts +1 -0
- package/dist/providers/InstructionsProvider/context.js +1 -0
- package/dist/providers/InstructionsProvider/context.js.map +1 -1
- package/dist/providers/InstructionsProvider/useInstructions.js +13 -6
- package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
- package/dist/types.d.ts +7 -7
- package/dist/types.js.map +1 -1
- package/dist/ui/AIConfigDashboard/index.d.ts +2 -0
- package/dist/ui/AIConfigDashboard/index.js +46 -0
- package/dist/ui/AIConfigDashboard/index.js.map +1 -0
- package/dist/ui/AIConfigDashboard/index.jsx +24 -0
- package/dist/ui/ApiKeyStatusIndicator/index.d.ts +6 -0
- package/dist/ui/ApiKeyStatusIndicator/index.js +39 -0
- package/dist/ui/ApiKeyStatusIndicator/index.js.map +1 -0
- package/dist/ui/ApiKeyStatusIndicator/index.jsx +29 -0
- package/dist/ui/Compose/Compose.d.ts +1 -2
- package/dist/ui/Compose/Compose.js +116 -90
- package/dist/ui/Compose/Compose.js.map +1 -1
- package/dist/ui/Compose/Compose.jsx +111 -101
- package/dist/ui/Compose/ComposePlaceholder.d.ts +7 -0
- package/dist/ui/Compose/ComposePlaceholder.js +78 -0
- package/dist/ui/Compose/ComposePlaceholder.js.map +1 -0
- package/dist/ui/Compose/ComposePlaceholder.jsx +66 -0
- package/dist/ui/Compose/UndoRedoActions.js +3 -1
- package/dist/ui/Compose/UndoRedoActions.js.map +1 -1
- package/dist/ui/Compose/UndoRedoActions.jsx +2 -1
- package/dist/ui/Compose/compose.module.css +1 -1
- package/dist/ui/Compose/hooks/menu/itemsMap.js +1 -1
- package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -1
- package/dist/ui/Compose/hooks/menu/useMenu.js +2 -2
- package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/useMenu.jsx +2 -2
- package/dist/ui/Compose/hooks/useActiveFieldTracking.js +69 -10
- package/dist/ui/Compose/hooks/useActiveFieldTracking.js.map +1 -1
- package/dist/ui/Compose/hooks/useGenerate.d.ts +3 -0
- package/dist/ui/Compose/hooks/useGenerate.js +71 -11
- package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
- package/dist/ui/Compose/hooks/useHistory.js +52 -5
- package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
- package/dist/ui/DynamicModelSelect/index.d.ts +7 -0
- package/dist/ui/DynamicModelSelect/index.js +231 -0
- package/dist/ui/DynamicModelSelect/index.js.map +1 -0
- package/dist/ui/DynamicModelSelect/index.jsx +207 -0
- package/dist/ui/DynamicProviderSelect/index.d.ts +7 -0
- package/dist/ui/DynamicProviderSelect/index.js +101 -0
- package/dist/ui/DynamicProviderSelect/index.js.map +1 -0
- package/dist/ui/DynamicProviderSelect/index.jsx +90 -0
- package/dist/ui/DynamicVoiceSelect/index.d.ts +7 -0
- package/dist/ui/DynamicVoiceSelect/index.js +104 -0
- package/dist/ui/DynamicVoiceSelect/index.js.map +1 -0
- package/dist/ui/DynamicVoiceSelect/index.jsx +69 -0
- package/dist/ui/EncryptedTextField/index.d.ts +8 -0
- package/dist/ui/EncryptedTextField/index.js +74 -0
- package/dist/ui/EncryptedTextField/index.js.map +1 -0
- package/dist/ui/EncryptedTextField/index.jsx +35 -0
- package/dist/ui/Icons/LottieAnimation.js +3 -1
- package/dist/ui/Icons/LottieAnimation.js.map +1 -1
- package/dist/ui/Icons/LottieAnimation.jsx +2 -1
- package/dist/ui/ModelRowLabel/index.d.ts +6 -0
- package/dist/ui/ModelRowLabel/index.js +41 -0
- package/dist/ui/ModelRowLabel/index.js.map +1 -0
- package/dist/ui/ModelRowLabel/index.jsx +26 -0
- package/dist/ui/ProviderOptionsEditor/index.d.ts +7 -0
- package/dist/ui/ProviderOptionsEditor/index.js +291 -0
- package/dist/ui/ProviderOptionsEditor/index.js.map +1 -0
- package/dist/ui/ProviderOptionsEditor/index.jsx +210 -0
- package/dist/ui/VoicesFetcher/index.d.ts +7 -0
- package/dist/ui/VoicesFetcher/index.js +72 -0
- package/dist/ui/VoicesFetcher/index.js.map +1 -0
- package/dist/ui/VoicesFetcher/index.jsx +56 -0
- package/dist/utilities/encryption.d.ts +2 -0
- package/dist/utilities/encryption.js +47 -0
- package/dist/utilities/encryption.js.map +1 -0
- package/dist/utilities/extractImageData.d.ts +9 -0
- package/dist/utilities/extractImageData.js +12 -2
- package/dist/utilities/extractImageData.js.map +1 -1
- package/dist/utilities/fetchImages.d.ts +14 -0
- package/dist/utilities/fetchImages.js +38 -0
- package/dist/utilities/fetchImages.js.map +1 -0
- package/dist/utilities/fieldToJsonSchema.d.ts +2 -1
- package/dist/utilities/fieldToJsonSchema.js +66 -3
- package/dist/utilities/fieldToJsonSchema.js.map +1 -1
- package/dist/utilities/getFieldBySchemaPath.js +15 -0
- package/dist/utilities/getFieldBySchemaPath.js.map +1 -1
- package/dist/utilities/getProviderOptionsFields.d.ts +16 -0
- package/dist/utilities/getProviderOptionsFields.js +80 -0
- package/dist/utilities/getProviderOptionsFields.js.map +1 -0
- package/dist/utilities/isPluginActivated.js +1 -2
- package/dist/utilities/isPluginActivated.js.map +1 -1
- package/dist/utilities/lexicalToHTML.js.map +1 -1
- package/dist/utilities/resolveImageReferences.d.ts +28 -0
- package/dist/utilities/resolveImageReferences.js +148 -0
- package/dist/utilities/resolveImageReferences.js.map +1 -0
- package/dist/utilities/schemaConverter.d.ts +3 -0
- package/dist/utilities/schemaConverter.js +93 -0
- package/dist/utilities/schemaConverter.js.map +1 -0
- package/dist/utilities/setSafeLexicalState.d.ts +1 -3
- package/dist/utilities/setSafeLexicalState.js +1 -1
- package/dist/utilities/setSafeLexicalState.js.map +1 -1
- package/package.json +19 -21
- package/dist/ai/models/anthropic/index.d.ts +0 -2
- package/dist/ai/models/anthropic/index.js +0 -129
- package/dist/ai/models/anthropic/index.js.map +0 -1
- package/dist/ai/models/elevenLabs/generateVoice.d.ts +0 -8
- package/dist/ai/models/elevenLabs/generateVoice.js +0 -20
- package/dist/ai/models/elevenLabs/generateVoice.js.map +0 -1
- package/dist/ai/models/elevenLabs/index.d.ts +0 -2
- package/dist/ai/models/elevenLabs/index.js +0 -133
- package/dist/ai/models/elevenLabs/index.js.map +0 -1
- package/dist/ai/models/elevenLabs/voices.d.ts +0 -8
- package/dist/ai/models/elevenLabs/voices.js +0 -24
- package/dist/ai/models/elevenLabs/voices.js.map +0 -1
- package/dist/ai/models/generateObject.d.ts +0 -11
- package/dist/ai/models/generateObject.js +0 -22
- package/dist/ai/models/generateObject.js.map +0 -1
- package/dist/ai/models/google/generateImage.d.ts +0 -9
- package/dist/ai/models/google/generateImage.js +0 -27
- package/dist/ai/models/google/generateImage.js.map +0 -1
- package/dist/ai/models/google/index.d.ts +0 -2
- package/dist/ai/models/google/index.js +0 -201
- package/dist/ai/models/google/index.js.map +0 -1
- package/dist/ai/models/index.d.ts +0 -2
- package/dist/ai/models/index.js +0 -13
- package/dist/ai/models/index.js.map +0 -1
- package/dist/ai/models/openai/generateImage.d.ts +0 -5
- package/dist/ai/models/openai/generateImage.js +0 -31
- package/dist/ai/models/openai/generateImage.js.map +0 -1
- package/dist/ai/models/openai/generateVoice.d.ts +0 -6
- package/dist/ai/models/openai/generateVoice.js +0 -19
- package/dist/ai/models/openai/generateVoice.js.map +0 -1
- package/dist/ai/models/openai/index.d.ts +0 -2
- package/dist/ai/models/openai/index.js +0 -428
- package/dist/ai/models/openai/index.js.map +0 -1
- package/dist/ai/models/openai/openai.d.ts +0 -1
- package/dist/ai/models/openai/openai.js +0 -8
- package/dist/ai/models/openai/openai.js.map +0 -1
- package/dist/ai/utils/editImagesWithOpenAI.d.ts +0 -10
- package/dist/ai/utils/editImagesWithOpenAI.js +0 -37
- package/dist/ai/utils/editImagesWithOpenAI.js.map +0 -1
- package/dist/types.d.js +0 -3
- package/dist/types.d.js.map +0 -1
- package/dist/utilities/getGenerationModels.d.ts +0 -2
- package/dist/utilities/getGenerationModels.js +0 -10
- package/dist/utilities/getGenerationModels.js.map +0 -1
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
export const xaiBlock = {
|
|
2
|
+
slug: 'xai',
|
|
3
|
+
fields: [
|
|
4
|
+
{
|
|
5
|
+
type: 'tabs',
|
|
6
|
+
tabs: [
|
|
7
|
+
// 1. Setup tab
|
|
8
|
+
{
|
|
9
|
+
fields: [
|
|
10
|
+
{
|
|
11
|
+
name: 'enabled',
|
|
12
|
+
type: 'checkbox',
|
|
13
|
+
defaultValue: true,
|
|
14
|
+
label: 'Enabled'
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: 'apiKey',
|
|
18
|
+
type: 'text',
|
|
19
|
+
admin: {
|
|
20
|
+
components: {
|
|
21
|
+
Field: '@ai-stack/payloadcms/client#EncryptedTextField'
|
|
22
|
+
},
|
|
23
|
+
description: 'Your xAI API key. Will be encrypted in the database.'
|
|
24
|
+
},
|
|
25
|
+
label: 'API Key',
|
|
26
|
+
required: true
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
label: 'Setup'
|
|
30
|
+
},
|
|
31
|
+
// 2. Provider Options tab
|
|
32
|
+
{
|
|
33
|
+
fields: [
|
|
34
|
+
{
|
|
35
|
+
name: 'textProviderOptions',
|
|
36
|
+
type: 'group',
|
|
37
|
+
admin: {
|
|
38
|
+
description: 'Default provider options for text generation models.'
|
|
39
|
+
},
|
|
40
|
+
fields: [
|
|
41
|
+
{
|
|
42
|
+
name: 'temperature',
|
|
43
|
+
type: 'number',
|
|
44
|
+
defaultValue: 1.0,
|
|
45
|
+
label: 'Default Temperature',
|
|
46
|
+
max: 2.0,
|
|
47
|
+
min: 0.0
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'max_tokens',
|
|
51
|
+
type: 'number',
|
|
52
|
+
label: 'Max Tokens'
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'top_p',
|
|
56
|
+
type: 'number',
|
|
57
|
+
defaultValue: 1.0,
|
|
58
|
+
label: 'Top P',
|
|
59
|
+
max: 1.0,
|
|
60
|
+
min: 0.0
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'frequency_penalty',
|
|
64
|
+
type: 'number',
|
|
65
|
+
defaultValue: 0,
|
|
66
|
+
label: 'Frequency Penalty',
|
|
67
|
+
max: 2,
|
|
68
|
+
min: -2
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: 'presence_penalty',
|
|
72
|
+
type: 'number',
|
|
73
|
+
defaultValue: 0,
|
|
74
|
+
label: 'Presence Penalty',
|
|
75
|
+
max: 2,
|
|
76
|
+
min: -2
|
|
77
|
+
}
|
|
78
|
+
],
|
|
79
|
+
label: 'Text Provider Options'
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
label: 'Provider Options'
|
|
83
|
+
},
|
|
84
|
+
// 3. Models tab
|
|
85
|
+
{
|
|
86
|
+
fields: [
|
|
87
|
+
{
|
|
88
|
+
name: 'models',
|
|
89
|
+
type: 'array',
|
|
90
|
+
admin: {
|
|
91
|
+
components: {
|
|
92
|
+
RowLabel: '@ai-stack/payloadcms/client#ModelRowLabel'
|
|
93
|
+
},
|
|
94
|
+
initCollapsed: true
|
|
95
|
+
},
|
|
96
|
+
defaultValue: [
|
|
97
|
+
{
|
|
98
|
+
id: 'grok-4',
|
|
99
|
+
name: 'Grok 4',
|
|
100
|
+
enabled: true,
|
|
101
|
+
responseModalities: [
|
|
102
|
+
'TEXT'
|
|
103
|
+
],
|
|
104
|
+
useCase: 'text'
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
id: 'grok-3',
|
|
108
|
+
name: 'Grok 3',
|
|
109
|
+
enabled: true,
|
|
110
|
+
responseModalities: [
|
|
111
|
+
'TEXT'
|
|
112
|
+
],
|
|
113
|
+
useCase: 'text'
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
id: 'grok-3-fast',
|
|
117
|
+
name: 'Grok 3 Fast',
|
|
118
|
+
enabled: true,
|
|
119
|
+
responseModalities: [
|
|
120
|
+
'TEXT'
|
|
121
|
+
],
|
|
122
|
+
useCase: 'text'
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
id: 'grok-2-1212',
|
|
126
|
+
name: 'Grok 2',
|
|
127
|
+
enabled: true,
|
|
128
|
+
responseModalities: [
|
|
129
|
+
'TEXT'
|
|
130
|
+
],
|
|
131
|
+
useCase: 'text'
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
id: 'grok-2-vision-1212',
|
|
135
|
+
name: 'Grok 2 Vision',
|
|
136
|
+
enabled: true,
|
|
137
|
+
responseModalities: [
|
|
138
|
+
'TEXT'
|
|
139
|
+
],
|
|
140
|
+
useCase: 'image'
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
id: 'grok-vision-beta',
|
|
144
|
+
name: 'Grok Vision Beta',
|
|
145
|
+
enabled: true,
|
|
146
|
+
responseModalities: [
|
|
147
|
+
'TEXT'
|
|
148
|
+
],
|
|
149
|
+
useCase: 'image'
|
|
150
|
+
}
|
|
151
|
+
],
|
|
152
|
+
fields: [
|
|
153
|
+
{
|
|
154
|
+
type: 'row',
|
|
155
|
+
fields: [
|
|
156
|
+
{
|
|
157
|
+
name: 'id',
|
|
158
|
+
type: 'text',
|
|
159
|
+
admin: {
|
|
160
|
+
width: '33%'
|
|
161
|
+
},
|
|
162
|
+
label: 'Model ID',
|
|
163
|
+
required: true
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
name: 'name',
|
|
167
|
+
type: 'text',
|
|
168
|
+
admin: {
|
|
169
|
+
width: '33%'
|
|
170
|
+
},
|
|
171
|
+
label: 'Display Name',
|
|
172
|
+
required: true
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: 'useCase',
|
|
176
|
+
type: 'select',
|
|
177
|
+
admin: {
|
|
178
|
+
width: '33%'
|
|
179
|
+
},
|
|
180
|
+
dbName: 'xai-model-useCase',
|
|
181
|
+
label: 'Use Case',
|
|
182
|
+
options: [
|
|
183
|
+
{
|
|
184
|
+
label: 'Text Generation',
|
|
185
|
+
value: 'text'
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
label: 'Image Generation',
|
|
189
|
+
value: 'image'
|
|
190
|
+
}
|
|
191
|
+
],
|
|
192
|
+
required: true
|
|
193
|
+
}
|
|
194
|
+
]
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
name: 'responseModalities',
|
|
198
|
+
type: 'select',
|
|
199
|
+
admin: {
|
|
200
|
+
description: 'Output capabilities of this model',
|
|
201
|
+
width: '50%'
|
|
202
|
+
},
|
|
203
|
+
dbName: 'xai-model-modalities',
|
|
204
|
+
hasMany: true,
|
|
205
|
+
label: 'Response Modalities',
|
|
206
|
+
options: [
|
|
207
|
+
{
|
|
208
|
+
label: 'Text',
|
|
209
|
+
value: 'TEXT'
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
label: 'Image',
|
|
213
|
+
value: 'IMAGE'
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
label: 'Audio',
|
|
217
|
+
value: 'AUDIO'
|
|
218
|
+
}
|
|
219
|
+
]
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
name: 'enabled',
|
|
223
|
+
type: 'checkbox',
|
|
224
|
+
admin: {
|
|
225
|
+
width: '50%'
|
|
226
|
+
},
|
|
227
|
+
defaultValue: true,
|
|
228
|
+
label: 'Enabled'
|
|
229
|
+
}
|
|
230
|
+
],
|
|
231
|
+
label: 'Available Models'
|
|
232
|
+
}
|
|
233
|
+
],
|
|
234
|
+
label: 'Models'
|
|
235
|
+
}
|
|
236
|
+
]
|
|
237
|
+
}
|
|
238
|
+
],
|
|
239
|
+
imageURL: '/provider-icons/xai-grok.webp',
|
|
240
|
+
labels: {
|
|
241
|
+
plural: 'xAI Providers',
|
|
242
|
+
singular: 'xAI Grok'
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
//# sourceMappingURL=xai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/ai/providers/blocks/xai.ts"],"sourcesContent":["import type { Block } from 'payload'\n\nexport const xaiBlock: Block = {\n slug: 'xai',\n fields: [\n {\n type: 'tabs',\n tabs: [\n // 1. Setup tab\n {\n fields: [\n {\n name: 'enabled',\n type: 'checkbox',\n defaultValue: true,\n label: 'Enabled',\n },\n {\n name: 'apiKey',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#EncryptedTextField',\n },\n description: 'Your xAI API key. Will be encrypted in the database.',\n },\n label: 'API Key',\n required: true,\n },\n ],\n label: 'Setup',\n },\n\n // 2. Provider Options tab\n {\n fields: [\n {\n name: 'textProviderOptions',\n type: 'group',\n admin: {\n description: 'Default provider options for text generation models.',\n },\n fields: [\n {\n name: 'temperature',\n type: 'number',\n defaultValue: 1.0,\n label: 'Default Temperature',\n max: 2.0,\n min: 0.0,\n },\n {\n name: 'max_tokens',\n type: 'number',\n label: 'Max Tokens',\n },\n {\n name: 'top_p',\n type: 'number',\n defaultValue: 1.0,\n label: 'Top P',\n max: 1.0,\n min: 0.0,\n },\n {\n name: 'frequency_penalty',\n type: 'number',\n defaultValue: 0,\n label: 'Frequency Penalty',\n max: 2,\n min: -2,\n },\n {\n name: 'presence_penalty',\n type: 'number',\n defaultValue: 0,\n label: 'Presence Penalty',\n max: 2,\n min: -2,\n },\n ],\n label: 'Text Provider Options',\n },\n ],\n label: 'Provider Options',\n },\n\n // 3. Models tab\n {\n fields: [\n {\n name: 'models',\n type: 'array',\n admin: {\n components: {\n RowLabel: '@ai-stack/payloadcms/client#ModelRowLabel',\n },\n initCollapsed: true,\n },\n defaultValue: [\n { id: 'grok-4', name: 'Grok 4', enabled: true, responseModalities: ['TEXT'], useCase: 'text' },\n { id: 'grok-3', name: 'Grok 3', enabled: true, responseModalities: ['TEXT'], useCase: 'text' },\n { id: 'grok-3-fast', name: 'Grok 3 Fast', enabled: true, responseModalities: ['TEXT'], useCase: 'text' },\n { id: 'grok-2-1212', name: 'Grok 2', enabled: true, responseModalities: ['TEXT'], useCase: 'text' },\n { id: 'grok-2-vision-1212', name: 'Grok 2 Vision', enabled: true, responseModalities: ['TEXT'], useCase: 'image' },\n { id: 'grok-vision-beta', name: 'Grok Vision Beta', enabled: true, responseModalities: ['TEXT'], useCase: 'image' },\n ],\n fields: [\n {\n type: 'row',\n fields: [\n {\n name: 'id',\n type: 'text',\n admin: { width: '33%' },\n label: 'Model ID',\n required: true,\n },\n {\n name: 'name',\n type: 'text',\n admin: { width: '33%' },\n label: 'Display Name',\n required: true,\n },\n {\n name: 'useCase',\n type: 'select',\n admin: { width: '33%' },\n dbName: 'xai-model-useCase',\n label: 'Use Case',\n options: [\n { label: 'Text Generation', value: 'text' },\n { label: 'Image Generation', value: 'image' },\n ],\n required: true,\n },\n ],\n },\n {\n name: 'responseModalities',\n type: 'select',\n admin: {\n description: 'Output capabilities of this model',\n width: '50%',\n },\n dbName: 'xai-model-modalities',\n hasMany: true,\n label: 'Response Modalities',\n options: [\n { label: 'Text', value: 'TEXT' },\n { label: 'Image', value: 'IMAGE' },\n { label: 'Audio', value: 'AUDIO' },\n ],\n },\n {\n name: 'enabled',\n type: 'checkbox',\n admin: {\n width: '50%',\n },\n defaultValue: true,\n label: 'Enabled',\n },\n ],\n label: 'Available Models',\n },\n ],\n label: 'Models',\n },\n ],\n },\n ],\n imageURL: '/provider-icons/xai-grok.webp',\n labels: {\n plural: 'xAI Providers',\n singular: 'xAI Grok',\n },\n}\n\n"],"names":["xaiBlock","slug","fields","type","tabs","name","defaultValue","label","admin","components","Field","description","required","max","min","RowLabel","initCollapsed","id","enabled","responseModalities","useCase","width","dbName","options","value","hasMany","imageURL","labels","plural","singular"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/providers/index.ts"],"sourcesContent":["// Re-export everything from registry\nexport * from './registry.js'\n\n// Export types\nexport type { ProviderId } from './registry.js'\n\n// NOTE: Static TEXT_MODEL_OPTIONS and availableTextProviders have been removed\n// in favor of dynamic loading from AI Settings.\n\n\n"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,cAAc,gBAAe;CAK7B,+EAA+E;CAC/E,gDAAgD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { LanguageModel } from 'ai';
|
|
2
|
+
import type { Payload } from 'payload';
|
|
3
|
+
export type { ProviderId } from './types.js';
|
|
4
|
+
import type { ProviderRegistry } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Load provider registry from AI Settings (type-safe)
|
|
7
|
+
*/
|
|
8
|
+
export declare function getProviderRegistry(payload: Payload): Promise<ProviderRegistry>;
|
|
9
|
+
/**
|
|
10
|
+
* Get global defaults from AI Settings
|
|
11
|
+
*/
|
|
12
|
+
export declare function getGlobalDefaults(payload: Payload): Promise<{
|
|
13
|
+
image?: {
|
|
14
|
+
model: string;
|
|
15
|
+
options?: Record<string, any>;
|
|
16
|
+
provider: string;
|
|
17
|
+
};
|
|
18
|
+
text?: {
|
|
19
|
+
model: string;
|
|
20
|
+
options?: Record<string, any>;
|
|
21
|
+
provider: string;
|
|
22
|
+
};
|
|
23
|
+
tts?: {
|
|
24
|
+
model: string;
|
|
25
|
+
options?: Record<string, any>;
|
|
26
|
+
provider: string;
|
|
27
|
+
voice?: string;
|
|
28
|
+
};
|
|
29
|
+
video?: {
|
|
30
|
+
model: string;
|
|
31
|
+
options?: Record<string, any>;
|
|
32
|
+
provider: string;
|
|
33
|
+
};
|
|
34
|
+
}>;
|
|
35
|
+
/**
|
|
36
|
+
* Get language model (type-safe, async)
|
|
37
|
+
*/
|
|
38
|
+
export declare function getLanguageModel(payload: Payload, providerId?: string, modelId?: string, options?: Record<string, any>): Promise<LanguageModel>;
|
|
39
|
+
export declare function getImageModel(payload: Payload, providerId?: string, modelId?: string, options?: Record<string, any>, isMultimodalText?: boolean): Promise<any>;
|
|
40
|
+
export declare function getTTSModel(payload: Payload, providerId?: string, modelId?: string, options?: Record<string, any>): Promise<any>;
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { createAnthropic } from '@ai-sdk/anthropic';
|
|
2
|
+
import { createElevenLabs } from '@ai-sdk/elevenlabs';
|
|
3
|
+
import { fal } from '@ai-sdk/fal';
|
|
4
|
+
import { createGoogleGenerativeAI } from '@ai-sdk/google';
|
|
5
|
+
import { createOpenAI } from '@ai-sdk/openai';
|
|
6
|
+
import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
|
|
7
|
+
import { createXai } from '@ai-sdk/xai';
|
|
8
|
+
import * as process from 'node:process';
|
|
9
|
+
// Type-safe provider factory functions
|
|
10
|
+
const providerFactories = {
|
|
11
|
+
anthropic: (block)=>createAnthropic({
|
|
12
|
+
apiKey: block.apiKey
|
|
13
|
+
}),
|
|
14
|
+
elevenlabs: (block)=>createElevenLabs({
|
|
15
|
+
apiKey: block.apiKey
|
|
16
|
+
}),
|
|
17
|
+
fal: (block)=>{
|
|
18
|
+
// Fal uses global instance, configure with apiKey
|
|
19
|
+
process.env.FAL_KEY = block.apiKey;
|
|
20
|
+
if (block.webhookSecret) {
|
|
21
|
+
process.env.FAL_WEBHOOK_SECRET = block.webhookSecret;
|
|
22
|
+
}
|
|
23
|
+
return fal;
|
|
24
|
+
},
|
|
25
|
+
google: (block)=>createGoogleGenerativeAI({
|
|
26
|
+
apiKey: block.apiKey
|
|
27
|
+
}),
|
|
28
|
+
openai: (block)=>createOpenAI({
|
|
29
|
+
apiKey: block.apiKey,
|
|
30
|
+
baseURL: block.baseURL || 'https://api.openai.com/v1',
|
|
31
|
+
organization: block.organization
|
|
32
|
+
}),
|
|
33
|
+
'openai-compatible': (block)=>{
|
|
34
|
+
console.log('OpenAI compatible, ', block);
|
|
35
|
+
return createOpenAICompatible({
|
|
36
|
+
name: block.providerName,
|
|
37
|
+
apiKey: block.apiKey || '',
|
|
38
|
+
baseURL: block.baseURL
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
xai: (block)=>createXai({
|
|
42
|
+
apiKey: block.apiKey
|
|
43
|
+
})
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Type guard to check provider block type
|
|
47
|
+
*/ function isProviderBlock(block, blockType) {
|
|
48
|
+
return block.blockType === blockType;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Load provider registry from AI Settings (type-safe)
|
|
52
|
+
*/ export async function getProviderRegistry(payload) {
|
|
53
|
+
const settings = await payload.findGlobal({
|
|
54
|
+
slug: 'ai-settings',
|
|
55
|
+
context: {
|
|
56
|
+
unsafe: true
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
const registry = {};
|
|
60
|
+
// console.log('settings - >', JSON.stringify(settings, null, 2))
|
|
61
|
+
for (const providerBlock of settings.providers || []){
|
|
62
|
+
if (!providerBlock.enabled) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const { blockType } = providerBlock;
|
|
66
|
+
// Type-safe factory lookup and invocation
|
|
67
|
+
let factory;
|
|
68
|
+
if (isProviderBlock(providerBlock, 'openai')) {
|
|
69
|
+
factory = ()=>providerFactories.openai(providerBlock);
|
|
70
|
+
} else if (isProviderBlock(providerBlock, 'anthropic')) {
|
|
71
|
+
factory = ()=>providerFactories.anthropic(providerBlock);
|
|
72
|
+
} else if (isProviderBlock(providerBlock, 'google')) {
|
|
73
|
+
factory = ()=>providerFactories.google(providerBlock);
|
|
74
|
+
} else if (isProviderBlock(providerBlock, 'xai')) {
|
|
75
|
+
factory = ()=>providerFactories.xai(providerBlock);
|
|
76
|
+
} else if (isProviderBlock(providerBlock, 'fal')) {
|
|
77
|
+
factory = ()=>providerFactories.fal(providerBlock);
|
|
78
|
+
} else if (isProviderBlock(providerBlock, 'elevenlabs')) {
|
|
79
|
+
factory = ()=>providerFactories.elevenlabs(providerBlock);
|
|
80
|
+
} else if (isProviderBlock(providerBlock, 'openai-compatible')) {
|
|
81
|
+
factory = ()=>providerFactories['openai-compatible'](providerBlock);
|
|
82
|
+
}
|
|
83
|
+
if (!factory) {
|
|
84
|
+
console.warn(`No factory for provider: ${blockType}`);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
// Filter enabled models only
|
|
88
|
+
const enabledModels = providerBlock.models.filter((m)=>m.enabled);
|
|
89
|
+
// Extract provider options
|
|
90
|
+
const options = {
|
|
91
|
+
image: 'imageProviderOptions' in providerBlock ? providerBlock.imageProviderOptions : undefined,
|
|
92
|
+
text: 'textProviderOptions' in providerBlock ? providerBlock.textProviderOptions : undefined,
|
|
93
|
+
tts: 'ttsProviderOptions' in providerBlock ? providerBlock.ttsProviderOptions : undefined
|
|
94
|
+
};
|
|
95
|
+
registry[blockType] = {
|
|
96
|
+
id: blockType,
|
|
97
|
+
name: 'providerName' in providerBlock ? providerBlock.providerName : blockType,
|
|
98
|
+
apiKey: 'apiKey' in providerBlock ? providerBlock.apiKey : undefined,
|
|
99
|
+
enabled: true,
|
|
100
|
+
factory,
|
|
101
|
+
instance: blockType === 'fal' ? fal : undefined,
|
|
102
|
+
models: enabledModels,
|
|
103
|
+
options
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return registry;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get global defaults from AI Settings
|
|
110
|
+
*/ export async function getGlobalDefaults(payload) {
|
|
111
|
+
const settings = await payload.findGlobal({
|
|
112
|
+
slug: 'ai-settings'
|
|
113
|
+
});
|
|
114
|
+
return settings.defaults;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get language model (type-safe, async)
|
|
118
|
+
*/ export async function getLanguageModel(payload, providerId, modelId, options) {
|
|
119
|
+
if (!providerId || !modelId) {
|
|
120
|
+
const defaults = await getGlobalDefaults(payload);
|
|
121
|
+
if (!providerId) {
|
|
122
|
+
providerId = defaults?.text?.provider;
|
|
123
|
+
}
|
|
124
|
+
if (!modelId) {
|
|
125
|
+
modelId = defaults?.text?.model;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Extract global default options if we are using the default provider
|
|
129
|
+
let globalDefaultOptions = {};
|
|
130
|
+
if (providerId) {
|
|
131
|
+
const defaults = await getGlobalDefaults(payload);
|
|
132
|
+
if (defaults?.text?.provider === providerId) {
|
|
133
|
+
globalDefaultOptions = defaults?.text?.options || {};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (!providerId || !modelId) {
|
|
137
|
+
throw new Error('Provider and model must be specified or configured in defaults');
|
|
138
|
+
}
|
|
139
|
+
const registry = await getProviderRegistry(payload);
|
|
140
|
+
const provider = registry[providerId];
|
|
141
|
+
if (!provider) {
|
|
142
|
+
throw new Error(`Provider ${providerId} not found in registry`);
|
|
143
|
+
}
|
|
144
|
+
if (!provider.enabled) {
|
|
145
|
+
throw new Error(`Provider ${providerId} is not enabled`);
|
|
146
|
+
}
|
|
147
|
+
let providerInstance;
|
|
148
|
+
if (provider.instance) {
|
|
149
|
+
providerInstance = provider.instance;
|
|
150
|
+
} else if (provider.factory) {
|
|
151
|
+
providerInstance = provider.factory();
|
|
152
|
+
} else {
|
|
153
|
+
throw new Error(`Provider ${providerId} has no factory or instance`);
|
|
154
|
+
}
|
|
155
|
+
// Merge default settings with override options
|
|
156
|
+
const finalOptions = {
|
|
157
|
+
...provider.options?.text || {},
|
|
158
|
+
...globalDefaultOptions,
|
|
159
|
+
...options || {}
|
|
160
|
+
};
|
|
161
|
+
return providerInstance(modelId, finalOptions);
|
|
162
|
+
}
|
|
163
|
+
export async function getImageModel(payload, providerId, modelId, options, isMultimodalText) {
|
|
164
|
+
if (!providerId || !modelId) {
|
|
165
|
+
const defaults = await getGlobalDefaults(payload);
|
|
166
|
+
if (!providerId) {
|
|
167
|
+
providerId = defaults?.image?.provider;
|
|
168
|
+
}
|
|
169
|
+
if (!modelId) {
|
|
170
|
+
modelId = defaults?.image?.model;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Extract global default options if we are using the default provider
|
|
174
|
+
let globalDefaultOptions = {};
|
|
175
|
+
if (providerId) {
|
|
176
|
+
const defaults = await getGlobalDefaults(payload);
|
|
177
|
+
if (defaults?.image?.provider === providerId) {
|
|
178
|
+
globalDefaultOptions = defaults?.image?.options || {};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (!providerId || !modelId) {
|
|
182
|
+
throw new Error('Provider and model must be specified or configured in defaults');
|
|
183
|
+
}
|
|
184
|
+
const registry = await getProviderRegistry(payload);
|
|
185
|
+
const provider = registry[providerId];
|
|
186
|
+
if (!provider) {
|
|
187
|
+
throw new Error(`Provider ${providerId} not found`);
|
|
188
|
+
}
|
|
189
|
+
// Merge default settings with override options
|
|
190
|
+
const finalOptions = {
|
|
191
|
+
...provider.options?.image || {},
|
|
192
|
+
...globalDefaultOptions,
|
|
193
|
+
...options || {}
|
|
194
|
+
};
|
|
195
|
+
if (provider.instance) {
|
|
196
|
+
return provider.instance;
|
|
197
|
+
}
|
|
198
|
+
if (provider.factory) {
|
|
199
|
+
console.log('modelId: ', modelId);
|
|
200
|
+
const instance = provider.factory();
|
|
201
|
+
// Type-safe check for image support
|
|
202
|
+
if (!isMultimodalText && typeof instance === 'function' && 'image' in instance && typeof instance.image === 'function') {
|
|
203
|
+
return instance.image(modelId, finalOptions);
|
|
204
|
+
}
|
|
205
|
+
// Also check if instance is an object with image method
|
|
206
|
+
if (typeof instance === 'object' && instance !== null && 'image' in instance && !isMultimodalText) {
|
|
207
|
+
return instance.image?.(modelId, finalOptions);
|
|
208
|
+
}
|
|
209
|
+
// Fallback for providers that might return the model directly or use the default factory
|
|
210
|
+
return typeof instance === 'function' ? instance(modelId, finalOptions) : instance;
|
|
211
|
+
}
|
|
212
|
+
throw new Error(`Invalid provider configuration for ${providerId}`);
|
|
213
|
+
}
|
|
214
|
+
export async function getTTSModel(payload, providerId, modelId, options) {
|
|
215
|
+
if (!providerId || !modelId) {
|
|
216
|
+
const defaults = await getGlobalDefaults(payload);
|
|
217
|
+
if (!providerId) {
|
|
218
|
+
providerId = defaults?.tts?.provider;
|
|
219
|
+
}
|
|
220
|
+
if (!modelId) {
|
|
221
|
+
modelId = defaults?.tts?.model;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// Extract global default options if we are using the default provider
|
|
225
|
+
let globalDefaultOptions = {};
|
|
226
|
+
if (providerId) {
|
|
227
|
+
const defaults = await getGlobalDefaults(payload);
|
|
228
|
+
if (defaults?.tts?.provider === providerId) {
|
|
229
|
+
globalDefaultOptions = defaults?.tts?.options || {};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
if (!providerId || !modelId) {
|
|
233
|
+
throw new Error('Provider and model must be specified or configured in defaults');
|
|
234
|
+
}
|
|
235
|
+
const registry = await getProviderRegistry(payload);
|
|
236
|
+
const provider = registry[providerId];
|
|
237
|
+
if (!provider) {
|
|
238
|
+
throw new Error(`Provider ${providerId} not found`);
|
|
239
|
+
}
|
|
240
|
+
// Merge default settings with override options
|
|
241
|
+
const finalOptions = {
|
|
242
|
+
...provider.options?.tts || {},
|
|
243
|
+
...globalDefaultOptions,
|
|
244
|
+
...options || {}
|
|
245
|
+
};
|
|
246
|
+
if (provider.factory) {
|
|
247
|
+
const instance = provider.factory();
|
|
248
|
+
if (instance?.speech) {
|
|
249
|
+
return instance.speech(modelId, finalOptions);
|
|
250
|
+
}
|
|
251
|
+
return typeof instance === 'function' ? instance(modelId, finalOptions) : instance;
|
|
252
|
+
}
|
|
253
|
+
throw new Error(`Invalid provider configuration for ${providerId}`);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/providers/registry.ts"],"sourcesContent":["import type { LanguageModel } from 'ai'\nimport type { Payload } from 'payload'\n\nexport type { ProviderId } from './types.js'\n\nimport { createAnthropic } from '@ai-sdk/anthropic'\nimport { createElevenLabs } from '@ai-sdk/elevenlabs'\nimport { fal } from '@ai-sdk/fal'\nimport { createGoogleGenerativeAI } from '@ai-sdk/google'\nimport { createOpenAI } from '@ai-sdk/openai'\nimport { createOpenAICompatible } from '@ai-sdk/openai-compatible'\nimport { createXai } from '@ai-sdk/xai'\nimport * as process from 'node:process'\n\nimport type {\n AIProvider,\n AISettingsData,\n AnthropicBlockData,\n ElevenLabsBlockData,\n FalBlockData,\n GoogleBlockData,\n OpenAIBlockData,\n OpenAICompatibleBlockData,\n ProviderBlockData,\n ProviderRegistry,\n XAIBlockData,\n} from './types.js'\n\n// Type-safe provider factory functions\nconst providerFactories = {\n anthropic: (block: AnthropicBlockData) =>\n createAnthropic({\n apiKey: block.apiKey,\n }),\n\n elevenlabs: (block: ElevenLabsBlockData) =>\n createElevenLabs({\n apiKey: block.apiKey,\n }),\n\n fal: (block: FalBlockData) => {\n // Fal uses global instance, configure with apiKey\n process.env.FAL_KEY = block.apiKey\n if (block.webhookSecret) {\n process.env.FAL_WEBHOOK_SECRET = block.webhookSecret\n }\n return fal\n },\n\n google: (block: GoogleBlockData) =>\n createGoogleGenerativeAI({\n apiKey: block.apiKey,\n }),\n\n openai: (block: OpenAIBlockData) =>\n createOpenAI({\n apiKey: block.apiKey,\n baseURL: block.baseURL || 'https://api.openai.com/v1',\n organization: block.organization,\n }),\n\n 'openai-compatible': (block: OpenAICompatibleBlockData) => {\n console.log('OpenAI compatible, ', block)\n return createOpenAICompatible({\n name: block.providerName,\n apiKey: block.apiKey || '',\n baseURL: block.baseURL,\n })\n },\n\n xai: (block: XAIBlockData) =>\n createXai({\n apiKey: block.apiKey,\n }),\n}\n\n/**\n * Type guard to check provider block type\n */\nfunction isProviderBlock<T extends ProviderBlockData>(\n block: ProviderBlockData,\n blockType: T['blockType'],\n): block is T {\n return block.blockType === blockType\n}\n\n/**\n * Load provider registry from AI Settings (type-safe)\n */\nexport async function getProviderRegistry(payload: Payload): Promise<ProviderRegistry> {\n const settings = (await payload.findGlobal({\n slug: 'ai-settings',\n context: { unsafe: true },\n })) as unknown as AISettingsData\n\n const registry: ProviderRegistry = {}\n // console.log('settings - >', JSON.stringify(settings, null, 2))\n for (const providerBlock of settings.providers || []) {\n if (!providerBlock.enabled) {\n continue\n }\n\n const { blockType } = providerBlock\n\n // Type-safe factory lookup and invocation\n let factory: (() => any) | undefined\n\n if (isProviderBlock<OpenAIBlockData>(providerBlock, 'openai')) {\n factory = () => providerFactories.openai(providerBlock)\n } else if (isProviderBlock<AnthropicBlockData>(providerBlock, 'anthropic')) {\n factory = () => providerFactories.anthropic(providerBlock)\n } else if (isProviderBlock<GoogleBlockData>(providerBlock, 'google')) {\n factory = () => providerFactories.google(providerBlock)\n } else if (isProviderBlock<XAIBlockData>(providerBlock, 'xai')) {\n factory = () => providerFactories.xai(providerBlock)\n } else if (isProviderBlock<FalBlockData>(providerBlock, 'fal')) {\n factory = () => providerFactories.fal(providerBlock)\n } else if (isProviderBlock<ElevenLabsBlockData>(providerBlock, 'elevenlabs')) {\n factory = () => providerFactories.elevenlabs(providerBlock)\n } else if (isProviderBlock<OpenAICompatibleBlockData>(providerBlock, 'openai-compatible')) {\n factory = () => providerFactories['openai-compatible'](providerBlock)\n }\n\n if (!factory) {\n console.warn(`No factory for provider: ${blockType}`)\n continue\n }\n\n // Filter enabled models only\n const enabledModels = providerBlock.models.filter((m) => m.enabled)\n\n // Extract provider options\n const options = {\n image:\n 'imageProviderOptions' in providerBlock ? providerBlock.imageProviderOptions : undefined,\n text: 'textProviderOptions' in providerBlock ? providerBlock.textProviderOptions : undefined,\n tts: 'ttsProviderOptions' in providerBlock ? providerBlock.ttsProviderOptions : undefined,\n }\n\n registry[blockType] = {\n id: blockType,\n name: 'providerName' in providerBlock ? providerBlock.providerName : blockType,\n apiKey: 'apiKey' in providerBlock ? providerBlock.apiKey : undefined,\n enabled: true,\n factory,\n instance: blockType === 'fal' ? fal : undefined,\n models: enabledModels,\n options,\n }\n }\n\n return registry\n}\n\n/**\n * Get global defaults from AI Settings\n */\nexport async function getGlobalDefaults(payload: Payload) {\n const settings = (await payload.findGlobal({\n slug: 'ai-settings',\n })) as unknown as AISettingsData\n return settings.defaults\n}\n\n/**\n * Get language model (type-safe, async)\n */\nexport async function getLanguageModel(\n payload: Payload,\n providerId?: string,\n modelId?: string,\n options?: Record<string, any>,\n): Promise<LanguageModel> {\n if (!providerId || !modelId) {\n const defaults = await getGlobalDefaults(payload)\n if (!providerId) {\n providerId = defaults?.text?.provider\n }\n if (!modelId) {\n modelId = defaults?.text?.model\n }\n }\n\n // Extract global default options if we are using the default provider\n let globalDefaultOptions = {}\n if (providerId) {\n const defaults = await getGlobalDefaults(payload)\n if (defaults?.text?.provider === providerId) {\n globalDefaultOptions = defaults?.text?.options || {}\n }\n }\n\n if (!providerId || !modelId) {\n throw new Error('Provider and model must be specified or configured in defaults')\n }\n\n const registry = await getProviderRegistry(payload)\n const provider = registry[providerId]\n\n if (!provider) {\n throw new Error(`Provider ${providerId} not found in registry`)\n }\n\n if (!provider.enabled) {\n throw new Error(`Provider ${providerId} is not enabled`)\n }\n\n let providerInstance: any\n if (provider.instance) {\n providerInstance = provider.instance\n } else if (provider.factory) {\n providerInstance = provider.factory()\n } else {\n throw new Error(`Provider ${providerId} has no factory or instance`)\n }\n\n // Merge default settings with override options\n const finalOptions = {\n ...(provider.options?.text || {}),\n ...globalDefaultOptions,\n ...(options || {}),\n }\n\n return providerInstance(modelId, finalOptions)\n}\n\nexport async function getImageModel(\n payload: Payload,\n providerId?: string,\n modelId?: string,\n options?: Record<string, any>,\n isMultimodalText?: boolean,\n) {\n if (!providerId || !modelId) {\n const defaults = await getGlobalDefaults(payload)\n if (!providerId) {\n providerId = defaults?.image?.provider\n }\n if (!modelId) {\n modelId = defaults?.image?.model\n }\n }\n\n // Extract global default options if we are using the default provider\n let globalDefaultOptions = {}\n if (providerId) {\n const defaults = await getGlobalDefaults(payload)\n if (defaults?.image?.provider === providerId) {\n globalDefaultOptions = defaults?.image?.options || {}\n }\n }\n\n if (!providerId || !modelId) {\n throw new Error('Provider and model must be specified or configured in defaults')\n }\n\n const registry = await getProviderRegistry(payload)\n const provider = registry[providerId]\n\n if (!provider) {\n throw new Error(`Provider ${providerId} not found`)\n }\n\n // Merge default settings with override options\n const finalOptions = {\n ...(provider.options?.image || {}),\n ...globalDefaultOptions,\n ...(options || {}),\n }\n\n if (provider.instance) {\n return provider.instance\n }\n\n if (provider.factory) {\n console.log('modelId: ', modelId)\n const instance = provider.factory()\n\n // Type-safe check for image support\n if (\n !isMultimodalText &&\n typeof instance === 'function' &&\n 'image' in instance &&\n typeof instance.image === 'function'\n ) {\n return instance.image(modelId, finalOptions)\n }\n\n // Also check if instance is an object with image method\n if (\n typeof instance === 'object' &&\n instance !== null &&\n 'image' in instance &&\n !isMultimodalText\n ) {\n return (instance as AIProvider).image?.(modelId, finalOptions)\n }\n\n // Fallback for providers that might return the model directly or use the default factory\n return typeof instance === 'function' ? instance(modelId, finalOptions) : instance\n }\n\n throw new Error(`Invalid provider configuration for ${providerId}`)\n}\n\nexport async function getTTSModel(\n payload: Payload,\n providerId?: string,\n modelId?: string,\n options?: Record<string, any>,\n) {\n if (!providerId || !modelId) {\n const defaults = await getGlobalDefaults(payload)\n if (!providerId) {\n providerId = defaults?.tts?.provider\n }\n if (!modelId) {\n modelId = defaults?.tts?.model\n }\n }\n\n // Extract global default options if we are using the default provider\n let globalDefaultOptions = {}\n if (providerId) {\n const defaults = await getGlobalDefaults(payload)\n if (defaults?.tts?.provider === providerId) {\n globalDefaultOptions = defaults?.tts?.options || {}\n }\n }\n\n if (!providerId || !modelId) {\n throw new Error('Provider and model must be specified or configured in defaults')\n }\n\n const registry = await getProviderRegistry(payload)\n const provider = registry[providerId]\n\n if (!provider) {\n throw new Error(`Provider ${providerId} not found`)\n }\n\n // Merge default settings with override options\n const finalOptions = {\n ...(provider.options?.tts || {}),\n ...globalDefaultOptions,\n ...(options || {}),\n }\n\n if (provider.factory) {\n const instance = provider.factory()\n if (instance?.speech) {\n return instance.speech(modelId, finalOptions)\n }\n return typeof instance === 'function' ? instance(modelId, finalOptions) : instance\n }\n\n throw new Error(`Invalid provider configuration for ${providerId}`)\n}\n"],"names":["createAnthropic","createElevenLabs","fal","createGoogleGenerativeAI","createOpenAI","createOpenAICompatible","createXai","process","providerFactories","anthropic","block","apiKey","elevenlabs","env","FAL_KEY","webhookSecret","FAL_WEBHOOK_SECRET","google","openai","baseURL","organization","console","log","name","providerName","xai","isProviderBlock","blockType","getProviderRegistry","payload","settings","findGlobal","slug","context","unsafe","registry","providerBlock","providers","enabled","factory","warn","enabledModels","models","filter","m","options","image","imageProviderOptions","undefined","text","textProviderOptions","tts","ttsProviderOptions","id","instance","getGlobalDefaults","defaults","getLanguageModel","providerId","modelId","provider","model","globalDefaultOptions","Error","providerInstance","finalOptions","getImageModel","isMultimodalText","getTTSModel","speech"],"mappings":"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"}
|