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