@ai-stack/payloadcms 3.76.0-beta.1 → 3.76.0-beta.2
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 +8 -25
- 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 +0 -42
- package/dist/ai/providers/blocks/anthropic.js.map +1 -1
- package/dist/ai/providers/blocks/elevenlabs.js +1 -106
- package/dist/ai/providers/blocks/elevenlabs.js.map +1 -1
- package/dist/ai/providers/blocks/fal.js +0 -118
- package/dist/ai/providers/blocks/fal.js.map +1 -1
- package/dist/ai/providers/blocks/google.js +2 -237
- package/dist/ai/providers/blocks/google.js.map +1 -1
- package/dist/ai/providers/blocks/openai-compatible.js +0 -144
- package/dist/ai/providers/blocks/openai-compatible.js.map +1 -1
- package/dist/ai/providers/blocks/openai.js +0 -200
- package/dist/ai/providers/blocks/openai.js.map +1 -1
- package/dist/ai/providers/blocks/xai.js +0 -53
- 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/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 +47 -20
- package/dist/collections/AIProviders.js.map +1 -1
- package/dist/collections/Instructions.js +86 -54
- 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/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 +17 -20
- package/dist/plugin.js.map +1 -1
- package/dist/providers/FieldProvider/FieldProvider.js +10 -19
- package/dist/providers/FieldProvider/FieldProvider.js.map +1 -1
- package/dist/providers/FieldProvider/FieldProvider.jsx +7 -17
- package/dist/providers/InstructionsProvider/InstructionsProvider.js +4 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +3 -0
- 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 +54 -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 +3 -1
- package/dist/ui/Compose/hooks/menu/TranslateMenu.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/TranslateMenu.jsx +3 -1
- 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/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} +7 -2
- 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 +37 -22
- package/dist/utilities/seedProperties.js.map +1 -1
- package/package.json +5 -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/{utils → utilities}/nodeToSchemaMap.js +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 +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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/ai/schemas/lexicalJsonSchema.ts"],"sourcesContent":["import type { JSONSchema } from 'openai/lib/jsonschema'\n\nimport { isObjectSchema } from '../utils/isObjectSchema.js'\n\nexport interface LexicalNodeSchema extends JSONSchema {\n $schema?: string\n additionalProperties?: boolean\n definitions?: Record<string, any>\n properties: {\n [key: string]: any\n children?: {\n items: {\n $ref?: string\n anyOf?: { $ref: string }[]\n }\n type: 'array'\n }\n type?: {\n enum: string[]\n type: 'string'\n }\n }\n required?: string[]\n type: 'object'\n}\n\nexport const documentSchema: LexicalNodeSchema = {\n type: 'object',\n $schema: 'http://json-schema.org/draft-07/schema#',\n additionalProperties: false,\n definitions: {\n LineBreakNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['linebreak'] },\n version: { type: 'number' },\n },\n required: ['type', 'version'],\n },\n TabNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['tab'] },\n version: { type: 'number' },\n },\n required: ['type', 'version'],\n },\n // Text Node (Leaf Node)\n TextNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['text'] },\n detail: {\n type: 'number',\n description: 'Text detail flags',\n enum: [\n 0, // No details\n 1, // IS_DIRECTIONLESS\n 2, // IS_UNMERGEABLE\n 3, // IS_DIRECTIONLESS + IS_UNMERGEABLE\n ],\n examples: [\n { description: 'No special details', value: 0 },\n { description: 'Directionless', value: 1 },\n { description: 'Unmergeable', value: 2 },\n { description: 'Directionless + Unmergeable', value: 3 },\n ],\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n format: {\n type: 'number',\n description: `Format flags for text:\n 0 = No format\n 1 = Bold\n 2 = Italic\n 3 = Bold + Italic (1|2)\n 4 = Strikethrough\n 8 = Underline\n 9 = Bold + Underline (1|8)\n 16 = Code\n 32 = Subscript\n 64 = Superscript\n 128 = Highlight\n \n Formats can be combined using binary OR (|).\n Example combinations:\n - Bold + Italic = 1|2 = 3\n - Bold + Underline = 1|8 = 9\n - Italic + Underline = 2|8 = 10\n - Bold + Italic + Underline = 1|2|8 = 11`,\n },\n indent: { type: 'number' },\n mode: {\n type: 'number',\n description: 'Text mode flags',\n enum: [\n 0, // Normal\n 1, // Token\n 2, // Segmented\n ],\n examples: [\n { description: 'Normal text', value: 0 },\n { description: 'Token text', value: 1 },\n { description: 'Segmented text', value: 2 },\n ],\n },\n style: {\n type: 'string',\n description: 'CSS style string (e.g., \"color: red; font-size: 12px;\")',\n },\n text: { type: 'string' },\n version: { type: 'number' },\n },\n required: [\n 'type',\n 'text',\n 'format',\n 'style',\n 'mode',\n 'detail',\n 'direction',\n 'indent',\n 'version',\n ],\n },\n // Styled Table Cell Node\n TableCellNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['tablecell'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TextNode',\n },\n },\n colSpan: { type: 'number' },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n headerState: { type: 'number' },\n indent: { type: 'number' },\n version: { type: 'number' },\n width: {\n type: ['null'],\n enum: [null],\n },\n },\n required: [\n 'type',\n 'children',\n 'headerState',\n 'colSpan',\n 'width',\n 'direction',\n 'indent',\n 'version',\n ],\n },\n // Styled Table Row Node\n TableRowNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['tablerow'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TableCellNode',\n },\n },\n height: { type: 'number' },\n },\n required: ['type', 'children', 'height'],\n },\n // Styled Table Node\n TableNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['table'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TableRowNode',\n },\n },\n },\n required: ['type', 'children'],\n },\n // Heading Node\n HeadingNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['heading'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/LinkNode' },\n { $ref: '#/definitions/LineBreakNode' },\n { $ref: '#/definitions/TabNode' },\n ],\n },\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n indent: { type: 'number' },\n tag: { type: 'string', enum: ['h1', 'h2', 'h3'] },\n version: { type: 'number' },\n },\n required: ['type', 'tag', 'children', 'direction', 'indent', 'version'],\n },\n // Paragraph Node\n ParagraphNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['paragraph'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/LinkNode' },\n { $ref: '#/definitions/CodeNode' },\n { $ref: '#/definitions/LineBreakNode' },\n { $ref: '#/definitions/TabNode' },\n ],\n },\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n format: {\n type: 'string',\n description:\n 'Format alignment based on content. Prioritize \"start\", then \"center\", and use \"right\" only when appropriate.',\n enum: ['start', 'center', 'right'],\n },\n indent: { type: 'number' },\n textFormat: { type: 'number' },\n textStyle: {\n type: 'string',\n description: 'CSS style string (e.g., \"color: red; font-size: 12px;\")',\n },\n version: { type: 'number' },\n },\n required: [\n 'type',\n 'children',\n 'direction',\n 'format',\n 'indent',\n 'textFormat',\n 'textStyle',\n 'version',\n ],\n },\n // Link Node\n LinkNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['link'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TextNode',\n },\n },\n url: { type: 'string' },\n },\n required: ['type', 'url', 'children'],\n },\n // List Item Node\n ListItemNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n // NOTE: Do not change the position of \"indent\", models like gpt generate properties as they are\n // defined in schema, moving the position of property \"indent\"\n // can cause issue with schema validation while streaming generated json to lexical editor\n indent: { type: 'number', enum: [0, 1] },\n\n type: { type: 'string', enum: ['listitem'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/ParagraphNode' },\n { $ref: '#/definitions/ListNode' },\n { $ref: '#/definitions/LineBreakNode' },\n ],\n },\n },\n },\n required: ['indent', 'type', 'children'],\n },\n // List Node\n ListNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['list'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/ListItemNode',\n },\n },\n listType: { type: 'string', enum: ['bullet', 'number'] },\n },\n required: ['type', 'listType', 'children'],\n },\n // Quote Node\n QuoteNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['quote'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/ParagraphNode' },\n { $ref: '#/definitions/LineBreakNode' },\n { $ref: '#/definitions/TabNode' },\n ],\n },\n },\n },\n required: ['type', 'children'],\n },\n // Code Node\n CodeNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['code'] },\n code: { type: 'string' },\n language: { type: 'string' },\n },\n required: ['type', 'code', 'language'],\n },\n // Horizontal Rule Node\n HorizontalRuleNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['horizontalrule'] },\n },\n required: ['type'],\n },\n // Image Node\n ImageNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['image'] },\n alt: { type: 'string' },\n caption: {\n type: 'array',\n items: {\n $ref: '#/definitions/TextNode',\n },\n },\n src: { type: 'string' },\n },\n required: ['type', 'src', 'alt', 'caption'],\n },\n // Root Node\n RootNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['root'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/HeadingNode' },\n { $ref: '#/definitions/ParagraphNode' },\n { $ref: '#/definitions/LinkNode' },\n { $ref: '#/definitions/ListNode' },\n { $ref: '#/definitions/QuoteNode' },\n { $ref: '#/definitions/CodeNode' },\n { $ref: '#/definitions/HorizontalRuleNode' },\n { $ref: '#/definitions/ImageNode' },\n { $ref: '#/definitions/TableNode' },\n ],\n },\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n indent: { type: 'number' },\n version: { type: 'number' },\n },\n required: ['type', 'children', 'direction', 'indent', 'version'],\n },\n },\n properties: {\n root: {\n $ref: '#/definitions/RootNode',\n },\n },\n required: ['root'],\n}\n\nexport const lexicalJsonSchema = (customNodes: JSONSchema[] | undefined) => {\n const schema = structuredClone(documentSchema)\n\n if (Array.isArray(customNodes) && customNodes.length > 0) {\n customNodes.forEach((nodeObj) => {\n for (const [nodeName, nodeDefinition] of Object.entries(nodeObj)) {\n // @ts-ignore\n schema.definitions[nodeName] = nodeDefinition\n\n // @ts-ignore\n const rootNode = schema.definitions['RootNode']\n if (isObjectSchema(rootNode)) {\n const children = rootNode.properties?.children\n const items = children?.items\n const anyOfList = (items as any)?.anyOf\n\n if (Array.isArray(anyOfList)) {\n anyOfList.push({ $ref: `#/definitions/${nodeName}` })\n }\n }\n }\n })\n }\n\n return schema\n}\n"],"names":["isObjectSchema","documentSchema","type","$schema","additionalProperties","definitions","LineBreakNode","properties","enum","version","required","TabNode","TextNode","detail","description","examples","value","direction","format","indent","mode","style","text","TableCellNode","children","items","$ref","colSpan","headerState","width","TableRowNode","height","TableNode","HeadingNode","anyOf","tag","ParagraphNode","textFormat","textStyle","LinkNode","url","ListItemNode","ListNode","listType","QuoteNode","CodeNode","code","language","HorizontalRuleNode","ImageNode","alt","caption","src","RootNode","root","lexicalJsonSchema","customNodes","schema","structuredClone","Array","isArray","length","forEach","nodeObj","nodeName","nodeDefinition","Object","entries","rootNode","anyOfList","push"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/schemas/lexicalJsonSchema.ts"],"sourcesContent":["import type { JSONSchema } from 'openai/lib/jsonschema'\n\nimport { isObjectSchema } from '../utilities/isObjectSchema.js'\n\nexport interface LexicalNodeSchema extends JSONSchema {\n $schema?: string\n additionalProperties?: boolean\n definitions?: Record<string, any>\n properties: {\n [key: string]: any\n children?: {\n items: {\n $ref?: string\n anyOf?: { $ref: string }[]\n }\n type: 'array'\n }\n type?: {\n enum: string[]\n type: 'string'\n }\n }\n required?: string[]\n type: 'object'\n}\n\nexport const documentSchema: LexicalNodeSchema = {\n type: 'object',\n $schema: 'http://json-schema.org/draft-07/schema#',\n additionalProperties: false,\n definitions: {\n LineBreakNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['linebreak'] },\n version: { type: 'number' },\n },\n required: ['type', 'version'],\n },\n TabNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['tab'] },\n version: { type: 'number' },\n },\n required: ['type', 'version'],\n },\n // Text Node (Leaf Node)\n TextNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['text'] },\n detail: {\n type: 'number',\n description: 'Text detail flags',\n enum: [\n 0, // No details\n 1, // IS_DIRECTIONLESS\n 2, // IS_UNMERGEABLE\n 3, // IS_DIRECTIONLESS + IS_UNMERGEABLE\n ],\n examples: [\n { description: 'No special details', value: 0 },\n { description: 'Directionless', value: 1 },\n { description: 'Unmergeable', value: 2 },\n { description: 'Directionless + Unmergeable', value: 3 },\n ],\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n format: {\n type: 'number',\n description: `Format flags for text:\n 0 = No format\n 1 = Bold\n 2 = Italic\n 3 = Bold + Italic (1|2)\n 4 = Strikethrough\n 8 = Underline\n 9 = Bold + Underline (1|8)\n 16 = Code\n 32 = Subscript\n 64 = Superscript\n 128 = Highlight\n \n Formats can be combined using binary OR (|).\n Example combinations:\n - Bold + Italic = 1|2 = 3\n - Bold + Underline = 1|8 = 9\n - Italic + Underline = 2|8 = 10\n - Bold + Italic + Underline = 1|2|8 = 11`,\n },\n indent: { type: 'number' },\n mode: {\n type: 'number',\n description: 'Text mode flags',\n enum: [\n 0, // Normal\n 1, // Token\n 2, // Segmented\n ],\n examples: [\n { description: 'Normal text', value: 0 },\n { description: 'Token text', value: 1 },\n { description: 'Segmented text', value: 2 },\n ],\n },\n style: {\n type: 'string',\n description: 'CSS style string (e.g., \"color: red; font-size: 12px;\")',\n },\n text: { type: 'string' },\n version: { type: 'number' },\n },\n required: [\n 'type',\n 'text',\n 'format',\n 'style',\n 'mode',\n 'detail',\n 'direction',\n 'indent',\n 'version',\n ],\n },\n // Styled Table Cell Node\n TableCellNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['tablecell'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TextNode',\n },\n },\n colSpan: { type: 'number' },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n headerState: { type: 'number' },\n indent: { type: 'number' },\n version: { type: 'number' },\n width: {\n type: ['null'],\n enum: [null],\n },\n },\n required: [\n 'type',\n 'children',\n 'headerState',\n 'colSpan',\n 'width',\n 'direction',\n 'indent',\n 'version',\n ],\n },\n // Styled Table Row Node\n TableRowNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['tablerow'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TableCellNode',\n },\n },\n height: { type: 'number' },\n },\n required: ['type', 'children', 'height'],\n },\n // Styled Table Node\n TableNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['table'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TableRowNode',\n },\n },\n },\n required: ['type', 'children'],\n },\n // Heading Node\n HeadingNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['heading'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/LinkNode' },\n { $ref: '#/definitions/LineBreakNode' },\n { $ref: '#/definitions/TabNode' },\n ],\n },\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n indent: { type: 'number' },\n tag: { type: 'string', enum: ['h1', 'h2', 'h3'] },\n version: { type: 'number' },\n },\n required: ['type', 'tag', 'children', 'direction', 'indent', 'version'],\n },\n // Paragraph Node\n ParagraphNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['paragraph'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/LinkNode' },\n { $ref: '#/definitions/CodeNode' },\n { $ref: '#/definitions/LineBreakNode' },\n { $ref: '#/definitions/TabNode' },\n ],\n },\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n format: {\n type: 'string',\n description:\n 'Format alignment based on content. Prioritize \"start\", then \"center\", and use \"right\" only when appropriate.',\n enum: ['start', 'center', 'right'],\n },\n indent: { type: 'number' },\n textFormat: { type: 'number' },\n textStyle: {\n type: 'string',\n description: 'CSS style string (e.g., \"color: red; font-size: 12px;\")',\n },\n version: { type: 'number' },\n },\n required: [\n 'type',\n 'children',\n 'direction',\n 'format',\n 'indent',\n 'textFormat',\n 'textStyle',\n 'version',\n ],\n },\n // Link Node\n LinkNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['link'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TextNode',\n },\n },\n url: { type: 'string' },\n },\n required: ['type', 'url', 'children'],\n },\n // List Item Node\n ListItemNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n // NOTE: Do not change the position of \"indent\", models like gpt generate properties as they are\n // defined in schema, moving the position of property \"indent\"\n // can cause issue with schema validation while streaming generated json to lexical editor\n indent: { type: 'number', enum: [0, 1] },\n\n type: { type: 'string', enum: ['listitem'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/ParagraphNode' },\n { $ref: '#/definitions/ListNode' },\n { $ref: '#/definitions/LineBreakNode' },\n ],\n },\n },\n },\n required: ['indent', 'type', 'children'],\n },\n // List Node\n ListNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['list'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/ListItemNode',\n },\n },\n listType: { type: 'string', enum: ['bullet', 'number'] },\n },\n required: ['type', 'listType', 'children'],\n },\n // Quote Node\n QuoteNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['quote'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/ParagraphNode' },\n { $ref: '#/definitions/LineBreakNode' },\n { $ref: '#/definitions/TabNode' },\n ],\n },\n },\n },\n required: ['type', 'children'],\n },\n // Code Node\n CodeNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['code'] },\n code: { type: 'string' },\n language: { type: 'string' },\n },\n required: ['type', 'code', 'language'],\n },\n // Horizontal Rule Node\n HorizontalRuleNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['horizontalrule'] },\n },\n required: ['type'],\n },\n // Image Node\n ImageNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['image'] },\n alt: { type: 'string' },\n caption: {\n type: 'array',\n items: {\n $ref: '#/definitions/TextNode',\n },\n },\n src: { type: 'string' },\n },\n required: ['type', 'src', 'alt', 'caption'],\n },\n // Root Node\n RootNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['root'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/HeadingNode' },\n { $ref: '#/definitions/ParagraphNode' },\n { $ref: '#/definitions/LinkNode' },\n { $ref: '#/definitions/ListNode' },\n { $ref: '#/definitions/QuoteNode' },\n { $ref: '#/definitions/CodeNode' },\n { $ref: '#/definitions/HorizontalRuleNode' },\n { $ref: '#/definitions/ImageNode' },\n { $ref: '#/definitions/TableNode' },\n ],\n },\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n indent: { type: 'number' },\n version: { type: 'number' },\n },\n required: ['type', 'children', 'direction', 'indent', 'version'],\n },\n },\n properties: {\n root: {\n $ref: '#/definitions/RootNode',\n },\n },\n required: ['root'],\n}\n\nexport const lexicalJsonSchema = (customNodes: JSONSchema[] | undefined) => {\n const schema = structuredClone(documentSchema)\n\n if (Array.isArray(customNodes) && customNodes.length > 0) {\n customNodes.forEach((nodeObj) => {\n for (const [nodeName, nodeDefinition] of Object.entries(nodeObj)) {\n // @ts-ignore\n schema.definitions[nodeName] = nodeDefinition\n\n // @ts-ignore\n const rootNode = schema.definitions['RootNode']\n if (isObjectSchema(rootNode)) {\n const children = rootNode.properties?.children\n const items = children?.items\n const anyOfList = (items as any)?.anyOf\n\n if (Array.isArray(anyOfList)) {\n anyOfList.push({ $ref: `#/definitions/${nodeName}` })\n }\n }\n }\n })\n }\n\n return schema\n}\n"],"names":["isObjectSchema","documentSchema","type","$schema","additionalProperties","definitions","LineBreakNode","properties","enum","version","required","TabNode","TextNode","detail","description","examples","value","direction","format","indent","mode","style","text","TableCellNode","children","items","$ref","colSpan","headerState","width","TableRowNode","height","TableNode","HeadingNode","anyOf","tag","ParagraphNode","textFormat","textStyle","LinkNode","url","ListItemNode","ListNode","listType","QuoteNode","CodeNode","code","language","HorizontalRuleNode","ImageNode","alt","caption","src","RootNode","root","lexicalJsonSchema","customNodes","schema","structuredClone","Array","isArray","length","forEach","nodeObj","nodeName","nodeDefinition","Object","entries","rootNode","anyOfList","push"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/utilities/filterEditorSchemaByNodes.ts"],"sourcesContent":["import type { LexicalNodeSchema } from '../schemas/lexicalJsonSchema.js'\n\nimport { isObjectSchema } from './isObjectSchema.js'\nimport { coreNodeTypes, nodeClassToType, nodeTypeToSchemaMap } from './nodeToSchemaMap.js'\n\n/**\n * Filters the Lexical JSON schema to only include definitions for allowed nodes.\n *\n * @param schema - The full Lexical JSON schema\n * @param allowedNodes - Array of allowed node types. Can be either:\n * - Node class names (e.g., 'HeadingNode', 'ParagraphNode')\n * - Type values (e.g., 'heading', 'paragraph')\n * @returns A filtered schema containing only the allowed definitions\n */\nexport function filterEditorSchemaByNodes(schema: LexicalNodeSchema, allowedNodes: string[]) {\n // Normalize node names to lowercase type values\n const normalizedTypes = new Set<string>()\n\n // Always include core nodes\n for (const coreType of coreNodeTypes) {\n normalizedTypes.add(coreType)\n }\n\n // Add user-specified allowed nodes\n for (const node of allowedNodes) {\n // Handle both formats: 'HeadingNode' and 'heading'\n const normalized = node.includes('Node') ? nodeClassToType(node) : node.toLowerCase()\n normalizedTypes.add(normalized)\n }\n\n const filteredDefinitions: Record<string, any> = {}\n\n // First pass: collect definitions whose \"type.enum\" includes an allowed type\n for (const [key, def] of Object.entries(schema.definitions ?? {})) {\n if (isObjectSchema(def)) {\n const typeEnum = def.properties?.type?.enum\n if (typeEnum && typeEnum.some((t) => normalizedTypes.has(t))) {\n filteredDefinitions[key] = JSON.parse(JSON.stringify(def)) // Deep copy to safely mutate\n }\n }\n }\n\n // Ensure core schema definitions are included by checking the map\n for (const coreType of coreNodeTypes) {\n const defName = nodeTypeToSchemaMap[coreType]\n if (defName && schema.definitions?.[defName] && !filteredDefinitions[defName]) {\n filteredDefinitions[defName] = JSON.parse(JSON.stringify(schema.definitions[defName]))\n }\n }\n\n // Helper to check if a $ref points to an allowed definition\n const isAllowedRef = (ref: string) => {\n if (typeof ref !== 'string') {\n return false\n }\n const defName = ref.replace('#/definitions/', '')\n return defName in filteredDefinitions\n }\n\n // Second pass: update \"children\" in each definition to only include allowed refs\n for (const def of Object.values(filteredDefinitions)) {\n if (isObjectSchema(def) && def.properties?.children?.items) {\n const items = def.properties.children.items\n\n if (Array.isArray(items.anyOf)) {\n // Filter anyOf to only allowed $refs\n items.anyOf = items.anyOf.filter((entry) => isAllowedRef(entry.$ref))\n if (items.anyOf.length === 0) {\n delete def.properties.children\n }\n } else if (items.$ref && !isAllowedRef(items.$ref)) {\n delete def.properties.children\n }\n }\n }\n\n // Return the new schema with pruned definitions\n return {\n ...schema,\n definitions: filteredDefinitions,\n }\n}\n"],"names":["isObjectSchema","coreNodeTypes","nodeClassToType","nodeTypeToSchemaMap","filterEditorSchemaByNodes","schema","allowedNodes","normalizedTypes","Set","coreType","add","node","normalized","includes","toLowerCase","filteredDefinitions","key","def","Object","entries","definitions","typeEnum","properties","type","enum","some","t","has","JSON","parse","stringify","defName","isAllowedRef","ref","replace","values","children","items","Array","isArray","anyOf","filter","entry","$ref","length"],"mappings":"AAEA,SAASA,cAAc,QAAQ,sBAAqB;AACpD,SAASC,aAAa,EAAEC,eAAe,EAAEC,mBAAmB,QAAQ,uBAAsB;AAE1F;;;;;;;;CAQC,GACD,OAAO,SAASC,0BAA0BC,MAAyB,EAAEC,YAAsB;IACzF,gDAAgD;IAChD,MAAMC,kBAAkB,IAAIC;IAE5B,4BAA4B;IAC5B,KAAK,MAAMC,YAAYR,cAAe;QACpCM,gBAAgBG,GAAG,CAACD;IACtB;IAEA,mCAAmC;IACnC,KAAK,MAAME,QAAQL,aAAc;QAC/B,mDAAmD;QACnD,MAAMM,aAAaD,KAAKE,QAAQ,CAAC,UAAUX,gBAAgBS,QAAQA,KAAKG,WAAW;QACnFP,gBAAgBG,GAAG,CAACE;IACtB;IAEA,MAAMG,sBAA2C,CAAC;IAElD,6EAA6E;IAC7E,KAAK,MAAM,CAACC,KAAKC,IAAI,IAAIC,OAAOC,OAAO,CAACd,OAAOe,WAAW,IAAI,CAAC,GAAI;QACjE,IAAIpB,eAAeiB,MAAM;YACvB,MAAMI,WAAWJ,IAAIK,UAAU,EAAEC,MAAMC;YACvC,IAAIH,YAAYA,SAASI,IAAI,CAAC,CAACC,IAAMnB,gBAAgBoB,GAAG,CAACD,KAAK;gBAC5DX,mBAAmB,CAACC,IAAI,GAAGY,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACb,MAAM,6BAA6B;;YAC1F;QACF;IACF;IAEA,kEAAkE;IAClE,KAAK,MAAMR,YAAYR,cAAe;QACpC,MAAM8B,UAAU5B,mBAAmB,CAACM,SAAS;QAC7C,IAAIsB,WAAW1B,OAAOe,WAAW,EAAE,CAACW,QAAQ,IAAI,CAAChB,mBAAmB,CAACgB,QAAQ,EAAE;YAC7EhB,mBAAmB,CAACgB,QAAQ,GAAGH,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACzB,OAAOe,WAAW,CAACW,QAAQ;QACtF;IACF;IAEA,4DAA4D;IAC5D,MAAMC,eAAe,CAACC;QACpB,IAAI,OAAOA,QAAQ,UAAU;YAC3B,OAAO;QACT;QACA,MAAMF,UAAUE,IAAIC,OAAO,CAAC,kBAAkB;QAC9C,OAAOH,WAAWhB;IACpB;IAEA,iFAAiF;IACjF,KAAK,MAAME,OAAOC,OAAOiB,MAAM,CAACpB,qBAAsB;QACpD,IAAIf,eAAeiB,QAAQA,IAAIK,UAAU,EAAEc,UAAUC,OAAO;YAC1D,MAAMA,QAAQpB,IAAIK,UAAU,CAACc,QAAQ,CAACC,KAAK;YAE3C,IAAIC,MAAMC,OAAO,CAACF,MAAMG,KAAK,GAAG;gBAC9B,qCAAqC;gBACrCH,MAAMG,KAAK,GAAGH,MAAMG,KAAK,CAACC,MAAM,CAAC,CAACC,QAAUV,aAAaU,MAAMC,IAAI;gBACnE,IAAIN,MAAMG,KAAK,CAACI,MAAM,KAAK,GAAG;oBAC5B,OAAO3B,IAAIK,UAAU,CAACc,QAAQ;gBAChC;YACF,OAAO,IAAIC,MAAMM,IAAI,IAAI,CAACX,aAAaK,MAAMM,IAAI,GAAG;gBAClD,OAAO1B,IAAIK,UAAU,CAACc,QAAQ;YAChC;QACF;IACF;IAEA,gDAAgD;IAChD,OAAO;QACL,GAAG/B,MAAM;QACTe,aAAaL;IACf;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/utilities/generateFileNameByPrompt.ts"],"sourcesContent":["export function generateFileNameByPrompt(prompt: string) {\n // Helper function to get a random integer between min and max (inclusive)\n function getRandomInt(min: number, max: number) {\n return Math.floor(Math.random() * (max - min + 1)) + min\n }\n\n // Define the desired length of the filename part from the prompt\n const maxLength = 30\n const promptLength = prompt.length\n\n // Determine the start position for the random substring\n const startPos = getRandomInt(0, Math.max(0, promptLength - maxLength))\n\n // Get the random substring and truncate it if necessary\n let randomSubstring = prompt.substring(startPos, startPos + maxLength)\n\n // Replace invalid filename characters with an underscore\n randomSubstring = randomSubstring.replace(/[^a-z\\d]/gi, '_').toLowerCase()\n\n // Add a timestamp for uniqueness\n const timestamp = new Date().toISOString().replace(/[:.-]/g, '')\n\n // Combine the truncated prompt and timestamp to form the filename\n return `${randomSubstring}_${timestamp}`\n}\n"],"names":["generateFileNameByPrompt","prompt","getRandomInt","min","max","Math","floor","random","maxLength","promptLength","length","startPos","randomSubstring","substring","replace","toLowerCase","timestamp","Date","toISOString"],"mappings":"AAAA,OAAO,SAASA,yBAAyBC,MAAc;IACrD,0EAA0E;IAC1E,SAASC,aAAaC,GAAW,EAAEC,GAAW;QAC5C,OAAOC,KAAKC,KAAK,CAACD,KAAKE,MAAM,KAAMH,CAAAA,MAAMD,MAAM,CAAA,KAAMA;IACvD;IAEA,iEAAiE;IACjE,MAAMK,YAAY;IAClB,MAAMC,eAAeR,OAAOS,MAAM;IAElC,wDAAwD;IACxD,MAAMC,WAAWT,aAAa,GAAGG,KAAKD,GAAG,CAAC,GAAGK,eAAeD;IAE5D,wDAAwD;IACxD,IAAII,kBAAkBX,OAAOY,SAAS,CAACF,UAAUA,WAAWH;IAE5D,yDAAyD;IACzDI,kBAAkBA,gBAAgBE,OAAO,CAAC,cAAc,KAAKC,WAAW;IAExE,iCAAiC;IACjC,MAAMC,YAAY,IAAIC,OAAOC,WAAW,GAAGJ,OAAO,CAAC,UAAU;IAE7D,kEAAkE;IAClE,OAAO,CAAC,EAAEF,gBAAgB,CAAC,EAAEI,UAAU,CAAC;AAC1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/utilities/isObjectSchema.ts"],"sourcesContent":["import type { LexicalNodeSchema } from '../schemas/lexicalJsonSchema.js'\n\nexport function isObjectSchema(schema: unknown): schema is LexicalNodeSchema {\n return typeof schema === 'object' && schema !== null && !Array.isArray(schema)\n}\n"],"names":["isObjectSchema","schema","Array","isArray"],"mappings":"AAEA,OAAO,SAASA,eAAeC,MAAe;IAC5C,OAAO,OAAOA,WAAW,YAAYA,WAAW,QAAQ,CAACC,MAAMC,OAAO,CAACF;AACzE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/utilities/nodeToSchemaMap.ts"],"sourcesContent":["/**\n * Maps Lexical node type values to JSON schema definition names.\n * This is used to filter the editor schema based on allowed editor nodes.\n *\n * The keys are the type values that appear in serialized Lexical JSON (e.g., 'heading', 'paragraph').\n * The values are the schema definition names as defined in lexicalJsonSchema.ts.\n */\nexport const nodeTypeToSchemaMap: Record<string, string> = {\n // Core nodes (typically always included)\n text: 'TextNode',\n linebreak: 'LineBreakNode',\n tab: 'TabNode',\n root: 'RootNode',\n\n // Block nodes\n paragraph: 'ParagraphNode',\n heading: 'HeadingNode',\n quote: 'QuoteNode',\n list: 'ListNode',\n listitem: 'ListItemNode',\n\n // Rich content nodes\n link: 'LinkNode',\n code: 'CodeNode',\n horizontalrule: 'HorizontalRuleNode',\n\n // Table nodes\n table: 'TableNode',\n tablerow: 'TableRowNode',\n tablecell: 'TableCellNode',\n\n // Media nodes\n image: 'ImageNode',\n}\n\n/**\n * Core nodes that should always be included in the filtered schema\n */\nexport const coreNodeTypes = ['text', 'linebreak', 'tab', 'root', 'paragraph']\n\n/**\n * Converts a Lexical node class name (e.g., 'HeadingNode') to its type value (e.g., 'heading').\n * This handles the common pattern where node classes are named with the pattern `{Type}Node`.\n */\nexport function nodeClassToType(nodeClassName: string): string {\n // Handle common formats:\n // 'HeadingNode' -> 'heading'\n // 'ParagraphNode' -> 'paragraph'\n // 'HorizontalRuleNode' -> 'horizontalrule'\n return nodeClassName.replace(/Node$/, '').toLowerCase()\n}\n\n/**\n * Converts a set of Lexical node class names to their corresponding schema definition names.\n * Includes core nodes automatically.\n */\nexport function nodeClassesToSchemaDefinitions(nodeClassNames: string[]): string[] {\n const definitions = new Set<string>()\n\n // Always include core nodes\n for (const coreType of coreNodeTypes) {\n const def = nodeTypeToSchemaMap[coreType]\n if (def) {\n definitions.add(def)\n }\n }\n\n // Convert each node class to its definition\n for (const className of nodeClassNames) {\n const type = nodeClassToType(className)\n const def = nodeTypeToSchemaMap[type]\n if (def) {\n definitions.add(def)\n }\n }\n\n return Array.from(definitions)\n}\n"],"names":["nodeTypeToSchemaMap","text","linebreak","tab","root","paragraph","heading","quote","list","listitem","link","code","horizontalrule","table","tablerow","tablecell","image","coreNodeTypes","nodeClassToType","nodeClassName","replace","toLowerCase","nodeClassesToSchemaDefinitions","nodeClassNames","definitions","Set","coreType","def","add","className","type","Array","from"],"mappings":"AAAA;;;;;;CAMC,GACD,OAAO,MAAMA,sBAA8C;IACzD,yCAAyC;IACzCC,MAAM;IACNC,WAAW;IACXC,KAAK;IACLC,MAAM;IAEN,cAAc;IACdC,WAAW;IACXC,SAAS;IACTC,OAAO;IACPC,MAAM;IACNC,UAAU;IAEV,qBAAqB;IACrBC,MAAM;IACNC,MAAM;IACNC,gBAAgB;IAEhB,cAAc;IACdC,OAAO;IACPC,UAAU;IACVC,WAAW;IAEX,cAAc;IACdC,OAAO;AACT,EAAC;AAED;;CAEC,GACD,OAAO,MAAMC,gBAAgB;IAAC;IAAQ;IAAa;IAAO;IAAQ;CAAY,CAAA;AAE9E;;;CAGC,GACD,OAAO,SAASC,gBAAgBC,aAAqB;IACnD,yBAAyB;IACzB,6BAA6B;IAC7B,iCAAiC;IACjC,2CAA2C;IAC3C,OAAOA,cAAcC,OAAO,CAAC,SAAS,IAAIC,WAAW;AACvD;AAEA;;;CAGC,GACD,OAAO,SAASC,+BAA+BC,cAAwB;IACrE,MAAMC,cAAc,IAAIC;IAExB,4BAA4B;IAC5B,KAAK,MAAMC,YAAYT,cAAe;QACpC,MAAMU,MAAM3B,mBAAmB,CAAC0B,SAAS;QACzC,IAAIC,KAAK;YACPH,YAAYI,GAAG,CAACD;QAClB;IACF;IAEA,4CAA4C;IAC5C,KAAK,MAAME,aAAaN,eAAgB;QACtC,MAAMO,OAAOZ,gBAAgBW;QAC7B,MAAMF,MAAM3B,mBAAmB,CAAC8B,KAAK;QACrC,IAAIH,KAAK;YACPH,YAAYI,GAAG,CAACD;QAClB;IACF;IAEA,OAAOI,MAAMC,IAAI,CAACR;AACpB"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { ActionPrompt } from '
|
|
1
|
+
import type { ActionPrompt } from '../../types.js';
|
|
2
2
|
export declare const defaultSystemPrompt = "IMPORTANT INSTRUCTION:\nProduce only the requested output text.\nDo not add any explanations, comments, or engagement.\nDo not use quotation marks in the response.\nBEGIN OUTPUT:";
|
|
3
3
|
export declare const defaultPrompts: ActionPrompt[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/utilities/prompts.ts"],"sourcesContent":["import type { ActionPrompt } from '../../types.js'\n\n//TODO: This is a temporary solution make use of structured output\nexport const defaultSystemPrompt = `IMPORTANT INSTRUCTION:\nProduce only the requested output text.\nDo not add any explanations, comments, or engagement.\nDo not use quotation marks in the response.\nBEGIN OUTPUT:`\n\nexport const defaultPrompts: ActionPrompt[] = [\n {\n name: 'Rephrase',\n system: ({\n prompt = '',\n systemPrompt = '',\n }) => `You are a skilled language expert. Rephrase the given text while maintaining its original meaning, tone, and emotional content. Use different words and sentence structures where possible, but preserve the overall style and sentiment of the original.\n \n -------------\n INSTRUCTIONS:\n - Rephrase the text according to the guidelines of the ORIGINAL SYSTEM PROMPT, if provided.\n - Retain the original meaning, tone, and emotional content.\n - Use different vocabulary and sentence structures where appropriate.\n - Ensure the rephrased text conveys the same message and feeling as the original.\n ${prompt ? '\\n\\nPrevious prompt:\\n' + prompt : ''}\n ${systemPrompt ? '\\n\\nORIGINAL SYSTEM PROMPT:\\n' + systemPrompt : ''}\n -------------`,\n },\n {\n name: 'Expand',\n system:\n () => `You are a creative writer and subject matter expert. Expand the given text by adding depth, detail, and relevant information while maintaining the original tone and style.\n \n -------------\n INSTRUCTIONS:\n - Understand the main ideas and tone of the text.\n - Add more details, examples, explanations, or context.\n - Maintain the original tone, style, and intent.\n - Ensure the expanded version flows naturally and coherently.\n - Do not contradict or alter the original meaning.\n -------------`,\n },\n {\n name: 'Proofread',\n system:\n () => `You are an English language expert. Proofread the given text, focusing on correcting grammar and spelling mistakes without altering the content, style, or tone.\n \n -------------\n INSTRUCTIONS:\n - Correct grammar and spelling errors.\n - Do not change the content, meaning, tone, or style.\n - Return the full text, whether corrections were made or not.\n - Do not provide additional comments or analysis.\n -------------`,\n },\n {\n name: 'Simplify',\n system: ({\n prompt = '',\n }) => `You are a skilled communicator specializing in clear and concise writing. Simplify the given text to make it easier to understand while retaining its core message.\n \n -------------\n INSTRUCTIONS:\n - Simplify the language, using more common words and shorter sentences.\n - Remove unnecessary details or jargon while keeping essential information.\n - Maintain the original meaning and key points.\n - Aim for clarity and readability for a general audience.\n - The simplified text should be more concise than the original.\n ${prompt ? '\\n\\nPREVIOUS PROMPT:\\n' + prompt : ''}\n -------------`,\n },\n {\n name: 'Summarize',\n layout: () => `\n[heading] - Summary\n[paragraph] - Your summary goes here...\n `,\n system: () =>\n `You are an expert at summarizing information. Your task is to create a concise summary of the given text that captures its key points and essential details while preserving the original meaning.\n\nINSTRUCTIONS:\n1. Carefully read and analyze the provided text.\n2. Identify and extract the main ideas and crucial supporting details.\n3. Condense the information into a clear and coherent summary that maintains the core message.\n4. Preserve the original tone and intent of the text.\n5. Ensure your summary is approximately 25-30% of the original text length.\n6. Use clear and precise language, avoiding unnecessary jargon or complexity.\n`,\n },\n {\n name: 'Tone',\n system: () =>\n `You are a tone adjustment specialist. Modify the tone of the given text as specified while keeping the original message and content intact.\n \n -------------\n INSTRUCTIONS:\n - Adjust the tone to match the specified style (e.g., formal, informal, professional, friendly).\n - Maintain the original content and meaning.\n - Ensure the adjusted text flows naturally with the new tone.\n -------------`,\n },\n {\n name: 'Translate',\n system: ({ locale, prompt = '', systemPrompt = '' }: { locale?: string; prompt?: string; systemPrompt?: string }) =>\n `You are a skilled translator. Translate the following text into ${locale}, ensuring the original meaning, tone, and context are preserved.\n \n -------------\n INSTRUCTIONS:\n - Accurately translate the text into ${locale}.\n - Preserve the original meaning, tone, and context.\n - Ensure the translation is culturally appropriate and natural in the target language.\n ${prompt ? '\\n\\nPREVIOUS PROMPT:\\n' + prompt : ''}\n ${systemPrompt ? '\\n\\nORIGINAL SYSTEM PROMPT:\\n' + systemPrompt : ''}\n -------------`,\n },\n]\n"],"names":["defaultSystemPrompt","defaultPrompts","name","system","prompt","systemPrompt","layout","locale"],"mappings":"AAEA,kEAAkE;AAClE,OAAO,MAAMA,sBAAsB,CAAC;;;;aAIvB,CAAC,CAAA;AAEd,OAAO,MAAMC,iBAAiC;IAC5C;QACEC,MAAM;QACNC,QAAQ,CAAC,EACPC,SAAS,EAAE,EACXC,eAAe,EAAE,EAClB,GAAK,CAAC;;;;;;;;MAQL,EAAED,SAAS,2BAA2BA,SAAS,GAAG;MAClD,EAAEC,eAAe,kCAAkCA,eAAe,GAAG;mBACxD,CAAC;IAClB;IACA;QACEH,MAAM;QACNC,QACE,IAAM,CAAC;;;;;;;;;mBASM,CAAC;IAClB;IACA;QACED,MAAM;QACNC,QACE,IAAM,CAAC;;;;;;;;mBAQM,CAAC;IAClB;IACA;QACED,MAAM;QACNC,QAAQ,CAAC,EACPC,SAAS,EAAE,EACZ,GAAK,CAAC;;;;;;;;;MASL,EAAEA,SAAS,2BAA2BA,SAAS,GAAG;mBACrC,CAAC;IAClB;IACA;QACEF,MAAM;QACNI,QAAQ,IAAM,CAAC;;;IAGf,CAAC;QACDH,QAAQ,IACN,CAAC;;;;;;;;;AASP,CAAC;IACC;IACA;QACED,MAAM;QACNC,QAAQ,IACN,CAAC;;;;;;;mBAOY,CAAC;IAClB;IACA;QACED,MAAM;QACNC,QAAQ,CAAC,EAAEI,MAAM,EAAEH,SAAS,EAAE,EAAEC,eAAe,EAAE,EAA+D,GAC9G,CAAC,gEAAgE,EAAEE,OAAO;;;;yCAIvC,EAAEA,OAAO;;;IAG9C,EAAEH,SAAS,2BAA2BA,SAAS,GAAG;IAClD,EAAEC,eAAe,kCAAkCA,eAAe,GAAG;iBACxD,CAAC;IAChB;CACD,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/utilities/systemGenerate.ts"],"sourcesContent":["import { anthropic } from '@ai-sdk/anthropic'\nimport { generateText } from 'ai'\n\nimport { PLUGIN_DEFAULT_ANTHROPIC_MODEL, PLUGIN_DEFAULT_OPENAI_MODEL } from '../../defaults.js'\n// import { openai } from '../models/openai/openai.js'\n\nexport const systemGenerate = async (\n data: { prompt: string; system: string },\n generateTextFn?: (prompt: string, system: string) => Promise<string>,\n) => {\n const { prompt, system } = data\n\n if (generateTextFn) {\n return generateTextFn(prompt, system)\n }\n\n // TODO: to be re-evaluate and implemented in a way that admin ui can generate when needed\n\n // let model = null\n\n\n // If the generateTextFn is not provided, still need OPENAI_API_KEY or ANTHROPIC_API_KEY to initialize\n // if (process.env.OPENAI_API_KEY) {\n // model = openai(PLUGIN_DEFAULT_OPENAI_MODEL)\n // } else if (process.env.ANTHROPIC_API_KEY) {\n // model = anthropic(PLUGIN_DEFAULT_ANTHROPIC_MODEL)\n // } else {\n // throw new Error('- AI Plugin: Please check your environment variables!')\n // }\n //\n // const { text } = await generateText({\n // model,\n // prompt,\n // system,\n // })\n //\n // return text\n}\n"],"names":["systemGenerate","data","generateTextFn","prompt","system"],"mappings":"AAIA,sDAAsD;AAEtD,OAAO,MAAMA,iBAAiB,OAC5BC,MACAC;IAEA,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAE,GAAGH;IAE3B,IAAIC,gBAAgB;QAClB,OAAOA,eAAeC,QAAQC;IAChC;AAEA,0FAA0F;AAE1F,mBAAmB;AAGnB,sGAAsG;AACtG,oCAAoC;AACpC,gDAAgD;AAChD,8CAA8C;AAC9C,sDAAsD;AACtD,WAAW;AACX,6EAA6E;AAC7E,IAAI;AACJ,EAAE;AACF,wCAAwC;AACxC,WAAW;AACX,YAAY;AACZ,YAAY;AACZ,KAAK;AACL,EAAE;AACF,cAAc;AAChB,EAAC"}
|
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
import { PLUGIN_AI_JOBS_TABLE, PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js';
|
|
2
|
-
|
|
3
|
-
create: ({ req })=>!!req.user,
|
|
4
|
-
delete: ({ req })=>!!req.user,
|
|
5
|
-
read: ({ req })=>!!req.user,
|
|
6
|
-
update: ({ req })=>!!req.user
|
|
7
|
-
};
|
|
8
|
-
const defaultAdminConfig = {
|
|
9
|
-
group: 'Plugins',
|
|
10
|
-
hidden: true
|
|
11
|
-
};
|
|
2
|
+
import { pluginCollectionAccess, pluginCollectionAdmin } from './shared.js';
|
|
12
3
|
export const aiJobsCollection = ()=>({
|
|
13
4
|
slug: PLUGIN_AI_JOBS_TABLE,
|
|
14
|
-
access:
|
|
15
|
-
admin:
|
|
5
|
+
access: pluginCollectionAccess,
|
|
6
|
+
admin: pluginCollectionAdmin,
|
|
16
7
|
fields: [
|
|
17
8
|
{
|
|
18
9
|
name: 'instructionId',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/collections/AIJobs.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\nimport { PLUGIN_AI_JOBS_TABLE, PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\
|
|
1
|
+
{"version":3,"sources":["../../src/collections/AIJobs.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\nimport { PLUGIN_AI_JOBS_TABLE, PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\nimport { pluginCollectionAccess, pluginCollectionAdmin } from './shared.js'\n\n\nexport const aiJobsCollection = (): CollectionConfig => ({\n slug: PLUGIN_AI_JOBS_TABLE,\n access: pluginCollectionAccess,\n admin: pluginCollectionAdmin,\n fields: [\n {\n name: 'instructionId',\n type: 'relationship',\n relationTo: PLUGIN_INSTRUCTIONS_TABLE,\n required: true,\n },\n {\n name: 'task_id',\n type: 'text',\n required: true,\n unique: true,\n },\n {\n name: 'status',\n type: 'select',\n defaultValue: 'queued',\n options: [\n { label: 'Queued', value: 'queued' },\n { label: 'Running', value: 'running' },\n { label: 'Completed', value: 'completed' },\n { label: 'Failed', value: 'failed' },\n { label: 'Canceled', value: 'canceled' },\n ],\n },\n {\n name: 'progress',\n type: 'number',\n max: 100,\n min: 0,\n },\n {\n name: 'result_id',\n type: 'text',\n },\n {\n name: 'error',\n type: 'textarea',\n },\n {\n name: 'meta',\n type: 'json',\n },\n ],\n labels: {\n plural: 'AI Jobs',\n singular: 'AI Job',\n },\n})\n"],"names":["PLUGIN_AI_JOBS_TABLE","PLUGIN_INSTRUCTIONS_TABLE","pluginCollectionAccess","pluginCollectionAdmin","aiJobsCollection","slug","access","admin","fields","name","type","relationTo","required","unique","defaultValue","options","label","value","max","min","labels","plural","singular"],"mappings":"AAEA,SAASA,oBAAoB,EAAEC,yBAAyB,QAAQ,iBAAgB;AAChF,SAASC,sBAAsB,EAAEC,qBAAqB,QAAQ,cAAa;AAG3E,OAAO,MAAMC,mBAAmB,IAAyB,CAAA;QACvDC,MAAML;QACNM,QAAQJ;QACRK,OAAOJ;QACPK,QAAQ;YACN;gBACEC,MAAM;gBACNC,MAAM;gBACNC,YAAYV;gBACZW,UAAU;YACZ;YACA;gBACEH,MAAM;gBACNC,MAAM;gBACNE,UAAU;gBACVC,QAAQ;YACV;YACA;gBACEJ,MAAM;gBACNC,MAAM;gBACNI,cAAc;gBACdC,SAAS;oBACP;wBAAEC,OAAO;wBAAUC,OAAO;oBAAS;oBACnC;wBAAED,OAAO;wBAAWC,OAAO;oBAAU;oBACrC;wBAAED,OAAO;wBAAaC,OAAO;oBAAY;oBACzC;wBAAED,OAAO;wBAAUC,OAAO;oBAAS;oBACnC;wBAAED,OAAO;wBAAYC,OAAO;oBAAW;iBACxC;YACH;YACA;gBACER,MAAM;gBACNC,MAAM;gBACNQ,KAAK;gBACLC,KAAK;YACP;YACA;gBACEV,MAAM;gBACNC,MAAM;YACR;YACA;gBACED,MAAM;gBACNC,MAAM;YACR;YACA;gBACED,MAAM;gBACNC,MAAM;YACR;SACD;QACDU,QAAQ;YACNC,QAAQ;YACRC,UAAU;QACZ;IACF,CAAA,EAAE"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { allProviderBlocks } from '../ai/providers/blocks/index.js';
|
|
2
|
+
import { invalidateProviderCache } from '../ai/providers/registry.js';
|
|
2
3
|
export const AIProvidersGlobal = {
|
|
3
4
|
slug: 'ai-providers',
|
|
4
5
|
access: {
|
|
@@ -65,15 +66,21 @@ export const AIProvidersGlobal = {
|
|
|
65
66
|
label: 'Default Model'
|
|
66
67
|
},
|
|
67
68
|
{
|
|
68
|
-
name: '
|
|
69
|
+
name: 'providerOptions',
|
|
69
70
|
type: 'json',
|
|
70
71
|
admin: {
|
|
71
72
|
components: {
|
|
72
|
-
Field: '@ai-stack/payloadcms/client#
|
|
73
|
-
}
|
|
74
|
-
description: 'Default options for this model (global)'
|
|
73
|
+
Field: '@ai-stack/payloadcms/client#GlobalProviderOptions'
|
|
74
|
+
}
|
|
75
75
|
},
|
|
76
|
-
label: '
|
|
76
|
+
label: 'Provider Options'
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: 'schema',
|
|
80
|
+
type: 'json',
|
|
81
|
+
admin: {
|
|
82
|
+
hidden: true
|
|
83
|
+
}
|
|
77
84
|
}
|
|
78
85
|
],
|
|
79
86
|
label: ''
|
|
@@ -108,15 +115,21 @@ export const AIProvidersGlobal = {
|
|
|
108
115
|
label: 'Default Model'
|
|
109
116
|
},
|
|
110
117
|
{
|
|
111
|
-
name: '
|
|
118
|
+
name: 'providerOptions',
|
|
112
119
|
type: 'json',
|
|
113
120
|
admin: {
|
|
114
121
|
components: {
|
|
115
|
-
Field: '@ai-stack/payloadcms/client#
|
|
116
|
-
}
|
|
117
|
-
description: 'Default options for this model (global)'
|
|
122
|
+
Field: '@ai-stack/payloadcms/client#GlobalProviderOptions'
|
|
123
|
+
}
|
|
118
124
|
},
|
|
119
|
-
label: '
|
|
125
|
+
label: 'Provider Options'
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
name: 'schema',
|
|
129
|
+
type: 'json',
|
|
130
|
+
admin: {
|
|
131
|
+
hidden: true
|
|
132
|
+
}
|
|
120
133
|
}
|
|
121
134
|
],
|
|
122
135
|
label: ''
|
|
@@ -161,15 +174,21 @@ export const AIProvidersGlobal = {
|
|
|
161
174
|
label: 'Default Voice'
|
|
162
175
|
},
|
|
163
176
|
{
|
|
164
|
-
name: '
|
|
177
|
+
name: 'providerOptions',
|
|
165
178
|
type: 'json',
|
|
166
179
|
admin: {
|
|
167
180
|
components: {
|
|
168
|
-
Field: '@ai-stack/payloadcms/client#
|
|
169
|
-
}
|
|
170
|
-
description: 'Default options for this model (global)'
|
|
181
|
+
Field: '@ai-stack/payloadcms/client#GlobalProviderOptions'
|
|
182
|
+
}
|
|
171
183
|
},
|
|
172
|
-
label: '
|
|
184
|
+
label: 'Provider Options'
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
name: 'schema',
|
|
188
|
+
type: 'json',
|
|
189
|
+
admin: {
|
|
190
|
+
hidden: true
|
|
191
|
+
}
|
|
173
192
|
}
|
|
174
193
|
],
|
|
175
194
|
label: ''
|
|
@@ -207,15 +226,21 @@ export const AIProvidersGlobal = {
|
|
|
207
226
|
label: 'Default Model'
|
|
208
227
|
},
|
|
209
228
|
{
|
|
210
|
-
name: '
|
|
229
|
+
name: 'providerOptions',
|
|
211
230
|
type: 'json',
|
|
212
231
|
admin: {
|
|
213
232
|
components: {
|
|
214
|
-
Field: '@ai-stack/payloadcms/client#
|
|
215
|
-
}
|
|
216
|
-
description: 'Default options for this model (global)'
|
|
233
|
+
Field: '@ai-stack/payloadcms/client#GlobalProviderOptions'
|
|
234
|
+
}
|
|
217
235
|
},
|
|
218
|
-
label: '
|
|
236
|
+
label: 'Provider Options'
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
name: 'schema',
|
|
240
|
+
type: 'json',
|
|
241
|
+
admin: {
|
|
242
|
+
hidden: true
|
|
243
|
+
}
|
|
219
244
|
}
|
|
220
245
|
],
|
|
221
246
|
label: ''
|
|
@@ -232,6 +257,8 @@ export const AIProvidersGlobal = {
|
|
|
232
257
|
hooks: {
|
|
233
258
|
afterChange: [
|
|
234
259
|
async ({ doc, req })=>{
|
|
260
|
+
// Immediately invalidate cached provider registry so new settings take effect
|
|
261
|
+
invalidateProviderCache();
|
|
235
262
|
if (doc.enabledCollections && doc.enabledCollections.length > 0) {
|
|
236
263
|
const { seedProperties } = await import('../utilities/seedProperties.js');
|
|
237
264
|
await seedProperties({
|