From c51e57c7deacfd99a57623ed9f450e0497b8ddc1 Mon Sep 17 00:00:00 2001 From: VICTOR CORREA GOMES <112295415+Vigtu@users.noreply.github.com> Date: Thu, 16 Jan 2025 18:26:09 -0300 Subject: [PATCH] feat: Add `required=True` to essential inputs across Langflow components (#5739) * fix: add required validation to input fields Ensures mandatory fields are properly marked as required across components. * fix: add required validation to input fields Ensures mandatory fields are properly marked as required across components. * fix: add required validation to input fields field: model_name * fix: add required validation to input fields field: model and base_url * fix: add required validation to input fields input: mistral_api_key * fix: add required validation to input fields inputs: model, base_url, nvidia_api_key * fix: add required validation to input fields inputs: model, base_url * fix: add required validation to input fields input: openai_api_key * fix: add required validation to input fields inputs: message, embedding_model * fix: add required validation to input fields inputs: model_name, credentials * fix: add required validation to input fields inputs: aws_secret_access_key, aws_access_key_id * fix: add required validation to input fields inputs: input_text, match_text * fix: add required validation to input fields inputs: input_message * fix: add required validation to input fields inputs: input_value * fix: add required validation to input fields input: data_input * fix: add required validation to input fields inputs: input_value * fix: add required validation to input fields input: data_input * fix: add required validation to input fields input: data_input * fix: add required validation to input fields input: data_input * fix: add required validation to input fields input: data_input * fix: add required validation to input fields inputs: data_inputs, embeddings * fix: add required validation to input fields inputs: api_key, input_value * fix: add required validation to input fields inputs: password, username, openai_api_key, prompt * fix: add required validation to input fields inputs: api_key, transcription_result * fix: add required validation to input fields inputs: api_key, transcription_result, prompt * fix: add required validation to input fields input: prompt * fix: add required validation to input fields input: api_key * fix: add required validation to input fields inputs: api_key, transcript_id * fix: add required validation to input fields inputs: audio_file, api_key * [autofix.ci] apply automated fixes * [autofix.ci] apply automated fixes (attempt 2/3) --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- .../assemblyai/assemblyai_get_subtitles.py | 2 ++ .../components/assemblyai/assemblyai_lemur.py | 8 +++---- .../assemblyai/assemblyai_list_transcripts.py | 1 + .../assemblyai/assemblyai_poll_transcript.py | 2 ++ .../assemblyai/assemblyai_start_transcript.py | 2 ++ .../components/embeddings/amazon_bedrock.py | 2 ++ .../embeddings/google_generative_ai.py | 2 +- .../embeddings/huggingface_inference_api.py | 1 + .../embeddings/lmstudioembeddings.py | 2 ++ .../langflow/components/embeddings/mistral.py | 2 +- .../langflow/components/embeddings/nvidia.py | 3 +++ .../langflow/components/embeddings/ollama.py | 2 ++ .../langflow/components/embeddings/openai.py | 2 +- .../components/embeddings/similarity.py | 1 + .../components/embeddings/text_embedder.py | 2 ++ .../components/embeddings/vertexai.py | 3 ++- .../components/helpers/structured_output.py | 1 + .../icosacomputing/combinatorial_reasoner.py | 5 +++- .../langchain_utilities/character.py | 1 + .../langchain_utilities/csv_agent.py | 1 + .../html_link_extractor.py | 1 + .../langchain_utilities/language_recursive.py | 1 + .../langchain_utilities/language_semantic.py | 2 ++ .../langchain_utilities/natural_language.py | 1 + .../recursive_character.py | 1 + .../components/logic/conditional_router.py | 2 ++ .../langflow/components/logic/pass_message.py | 1 + .../components/notdiamond/notdiamond.py | 3 ++- .../Graph Vector Store RAG.json | 24 +++++++++++-------- .../starter_projects/Vector Store RAG.json | 16 ++++++++----- 30 files changed, 70 insertions(+), 27 deletions(-) diff --git a/src/backend/base/langflow/components/assemblyai/assemblyai_get_subtitles.py b/src/backend/base/langflow/components/assemblyai/assemblyai_get_subtitles.py index 687461442..12dfb5624 100644 --- a/src/backend/base/langflow/components/assemblyai/assemblyai_get_subtitles.py +++ b/src/backend/base/langflow/components/assemblyai/assemblyai_get_subtitles.py @@ -17,11 +17,13 @@ class AssemblyAIGetSubtitles(Component): name="api_key", display_name="Assembly API Key", info="Your AssemblyAI API key. You can get one from https://www.assemblyai.com/", + required=True, ), DataInput( name="transcription_result", display_name="Transcription Result", info="The transcription result from AssemblyAI", + required=True, ), DropdownInput( name="subtitle_format", diff --git a/src/backend/base/langflow/components/assemblyai/assemblyai_lemur.py b/src/backend/base/langflow/components/assemblyai/assemblyai_lemur.py index a0d357bcb..059914cda 100644 --- a/src/backend/base/langflow/components/assemblyai/assemblyai_lemur.py +++ b/src/backend/base/langflow/components/assemblyai/assemblyai_lemur.py @@ -18,17 +18,15 @@ class AssemblyAILeMUR(Component): display_name="Assembly API Key", info="Your AssemblyAI API key. You can get one from https://www.assemblyai.com/", advanced=False, + required=True, ), DataInput( name="transcription_result", display_name="Transcription Result", info="The transcription result from AssemblyAI", + required=True, ), - MultilineInput( - name="prompt", - display_name="Input Prompt", - info="The text to prompt the model", - ), + MultilineInput(name="prompt", display_name="Input Prompt", info="The text to prompt the model", required=True), DropdownInput( name="final_model", display_name="Final Model", diff --git a/src/backend/base/langflow/components/assemblyai/assemblyai_list_transcripts.py b/src/backend/base/langflow/components/assemblyai/assemblyai_list_transcripts.py index de96112bb..369b85de2 100644 --- a/src/backend/base/langflow/components/assemblyai/assemblyai_list_transcripts.py +++ b/src/backend/base/langflow/components/assemblyai/assemblyai_list_transcripts.py @@ -17,6 +17,7 @@ class AssemblyAIListTranscripts(Component): name="api_key", display_name="Assembly API Key", info="Your AssemblyAI API key. You can get one from https://www.assemblyai.com/", + required=True, ), IntInput( name="limit", diff --git a/src/backend/base/langflow/components/assemblyai/assemblyai_poll_transcript.py b/src/backend/base/langflow/components/assemblyai/assemblyai_poll_transcript.py index 13d01e5da..f2ab67839 100644 --- a/src/backend/base/langflow/components/assemblyai/assemblyai_poll_transcript.py +++ b/src/backend/base/langflow/components/assemblyai/assemblyai_poll_transcript.py @@ -18,11 +18,13 @@ class AssemblyAITranscriptionJobPoller(Component): name="api_key", display_name="Assembly API Key", info="Your AssemblyAI API key. You can get one from https://www.assemblyai.com/", + required=True, ), DataInput( name="transcript_id", display_name="Transcript ID", info="The ID of the transcription job to poll", + required=True, ), FloatInput( name="polling_interval", diff --git a/src/backend/base/langflow/components/assemblyai/assemblyai_start_transcript.py b/src/backend/base/langflow/components/assemblyai/assemblyai_start_transcript.py index de83a59e3..48cf11ef5 100644 --- a/src/backend/base/langflow/components/assemblyai/assemblyai_start_transcript.py +++ b/src/backend/base/langflow/components/assemblyai/assemblyai_start_transcript.py @@ -19,6 +19,7 @@ class AssemblyAITranscriptionJobCreator(Component): name="api_key", display_name="Assembly API Key", info="Your AssemblyAI API key. You can get one from https://www.assemblyai.com/", + required=True, ), FileInput( name="audio_file", @@ -65,6 +66,7 @@ class AssemblyAITranscriptionJobCreator(Component): "mxf", ], info="The audio file to transcribe", + required=True, ), MessageTextInput( name="audio_file_url", diff --git a/src/backend/base/langflow/components/embeddings/amazon_bedrock.py b/src/backend/base/langflow/components/embeddings/amazon_bedrock.py index caeafc91a..266f6b11f 100644 --- a/src/backend/base/langflow/components/embeddings/amazon_bedrock.py +++ b/src/backend/base/langflow/components/embeddings/amazon_bedrock.py @@ -24,6 +24,7 @@ class AmazonBedrockEmbeddingsComponent(LCModelComponent): info="The access key for your AWS account." "Usually set in Python code as the environment variable 'AWS_ACCESS_KEY_ID'.", value="AWS_ACCESS_KEY_ID", + required=True, ), SecretStrInput( name="aws_secret_access_key", @@ -31,6 +32,7 @@ class AmazonBedrockEmbeddingsComponent(LCModelComponent): info="The secret key for your AWS account. " "Usually set in Python code as the environment variable 'AWS_SECRET_ACCESS_KEY'.", value="AWS_SECRET_ACCESS_KEY", + required=True, ), SecretStrInput( name="aws_session_token", diff --git a/src/backend/base/langflow/components/embeddings/google_generative_ai.py b/src/backend/base/langflow/components/embeddings/google_generative_ai.py index 8c27561ed..94a3c5a43 100644 --- a/src/backend/base/langflow/components/embeddings/google_generative_ai.py +++ b/src/backend/base/langflow/components/embeddings/google_generative_ai.py @@ -21,7 +21,7 @@ class GoogleGenerativeAIEmbeddingsComponent(Component): name = "Google Generative AI Embeddings" inputs = [ - SecretStrInput(name="api_key", display_name="API Key"), + SecretStrInput(name="api_key", display_name="API Key", required=True), MessageTextInput(name="model_name", display_name="Model Name", value="models/text-embedding-004"), ] diff --git a/src/backend/base/langflow/components/embeddings/huggingface_inference_api.py b/src/backend/base/langflow/components/embeddings/huggingface_inference_api.py index 1338b125b..34c426ac0 100644 --- a/src/backend/base/langflow/components/embeddings/huggingface_inference_api.py +++ b/src/backend/base/langflow/components/embeddings/huggingface_inference_api.py @@ -36,6 +36,7 @@ class HuggingFaceInferenceAPIEmbeddingsComponent(LCEmbeddingsModel): display_name="Model Name", value="BAAI/bge-large-en-v1.5", info="The name of the model to use for text embeddings.", + required=True, ), ] diff --git a/src/backend/base/langflow/components/embeddings/lmstudioembeddings.py b/src/backend/base/langflow/components/embeddings/lmstudioembeddings.py index 11ffe0230..57f783fc1 100644 --- a/src/backend/base/langflow/components/embeddings/lmstudioembeddings.py +++ b/src/backend/base/langflow/components/embeddings/lmstudioembeddings.py @@ -49,12 +49,14 @@ class LMStudioEmbeddingsComponent(LCEmbeddingsModel): display_name="Model", advanced=False, refresh_button=True, + required=True, ), MessageTextInput( name="base_url", display_name="LM Studio Base URL", refresh_button=True, value="http://localhost:1234/v1", + required=True, ), SecretStrInput( name="api_key", diff --git a/src/backend/base/langflow/components/embeddings/mistral.py b/src/backend/base/langflow/components/embeddings/mistral.py index 7aaec00b3..e183d0165 100644 --- a/src/backend/base/langflow/components/embeddings/mistral.py +++ b/src/backend/base/langflow/components/embeddings/mistral.py @@ -20,7 +20,7 @@ class MistralAIEmbeddingsComponent(LCModelComponent): options=["mistral-embed"], value="mistral-embed", ), - SecretStrInput(name="mistral_api_key", display_name="Mistral API Key"), + SecretStrInput(name="mistral_api_key", display_name="Mistral API Key", required=True), IntInput( name="max_concurrent_requests", display_name="Max Concurrent Requests", diff --git a/src/backend/base/langflow/components/embeddings/nvidia.py b/src/backend/base/langflow/components/embeddings/nvidia.py index 1aca0a33d..302fd8300 100644 --- a/src/backend/base/langflow/components/embeddings/nvidia.py +++ b/src/backend/base/langflow/components/embeddings/nvidia.py @@ -21,12 +21,14 @@ class NVIDIAEmbeddingsComponent(LCEmbeddingsModel): "snowflake/arctic-embed-I", ], value="nvidia/nv-embed-v1", + required=True, ), MessageTextInput( name="base_url", display_name="NVIDIA Base URL", refresh_button=True, value="https://integrate.api.nvidia.com/v1", + required=True, ), SecretStrInput( name="nvidia_api_key", @@ -34,6 +36,7 @@ class NVIDIAEmbeddingsComponent(LCEmbeddingsModel): info="The NVIDIA API Key.", advanced=False, value="NVIDIA_API_KEY", + required=True, ), FloatInput( name="temperature", diff --git a/src/backend/base/langflow/components/embeddings/ollama.py b/src/backend/base/langflow/components/embeddings/ollama.py index e5c83ef9e..f3e9e9051 100644 --- a/src/backend/base/langflow/components/embeddings/ollama.py +++ b/src/backend/base/langflow/components/embeddings/ollama.py @@ -17,11 +17,13 @@ class OllamaEmbeddingsComponent(LCModelComponent): name="model", display_name="Ollama Model", value="nomic-embed-text", + required=True, ), MessageTextInput( name="base_url", display_name="Ollama Base URL", value="http://localhost:11434", + required=True, ), ] diff --git a/src/backend/base/langflow/components/embeddings/openai.py b/src/backend/base/langflow/components/embeddings/openai.py index 6c075b97d..e4ae4e6f5 100644 --- a/src/backend/base/langflow/components/embeddings/openai.py +++ b/src/backend/base/langflow/components/embeddings/openai.py @@ -38,7 +38,7 @@ class OpenAIEmbeddingsComponent(LCEmbeddingsModel): value="text-embedding-3-small", ), DictInput(name="model_kwargs", display_name="Model Kwargs", advanced=True), - SecretStrInput(name="openai_api_key", display_name="OpenAI API Key", value="OPENAI_API_KEY"), + SecretStrInput(name="openai_api_key", display_name="OpenAI API Key", value="OPENAI_API_KEY", required=True), MessageTextInput(name="openai_api_base", display_name="OpenAI API Base", advanced=True), MessageTextInput(name="openai_api_type", display_name="OpenAI API Type", advanced=True), MessageTextInput(name="openai_api_version", display_name="OpenAI API Version", advanced=True), diff --git a/src/backend/base/langflow/components/embeddings/similarity.py b/src/backend/base/langflow/components/embeddings/similarity.py index 914943edb..7913ab3fd 100644 --- a/src/backend/base/langflow/components/embeddings/similarity.py +++ b/src/backend/base/langflow/components/embeddings/similarity.py @@ -16,6 +16,7 @@ class EmbeddingSimilarityComponent(Component): display_name="Embedding Vectors", info="A list containing exactly two data objects with embedding vectors to compare.", is_list=True, + required=True, ), DropdownInput( name="similarity_metric", diff --git a/src/backend/base/langflow/components/embeddings/text_embedder.py b/src/backend/base/langflow/components/embeddings/text_embedder.py index d9a40e2ec..5c66a9372 100644 --- a/src/backend/base/langflow/components/embeddings/text_embedder.py +++ b/src/backend/base/langflow/components/embeddings/text_embedder.py @@ -20,11 +20,13 @@ class TextEmbedderComponent(Component): display_name="Embedding Model", info="The embedding model to use for generating embeddings.", input_types=["Embeddings"], + required=True, ), MessageInput( name="message", display_name="Message", info="The message to generate embeddings for.", + required=True, ), ] outputs = [ diff --git a/src/backend/base/langflow/components/embeddings/vertexai.py b/src/backend/base/langflow/components/embeddings/vertexai.py index 6c74f2651..026dd5d41 100644 --- a/src/backend/base/langflow/components/embeddings/vertexai.py +++ b/src/backend/base/langflow/components/embeddings/vertexai.py @@ -16,12 +16,13 @@ class VertexAIEmbeddingsComponent(LCModelComponent): info="JSON credentials file. Leave empty to fallback to environment variables", value="", file_types=["json"], + required=True, ), MessageTextInput(name="location", display_name="Location", value="us-central1", advanced=True), MessageTextInput(name="project", display_name="Project", info="The project ID.", advanced=True), IntInput(name="max_output_tokens", display_name="Max Output Tokens", advanced=True), IntInput(name="max_retries", display_name="Max Retries", value=1, advanced=True), - MessageTextInput(name="model_name", display_name="Model Name", value="textembedding-gecko"), + MessageTextInput(name="model_name", display_name="Model Name", value="textembedding-gecko", required=True), IntInput(name="n", display_name="N", value=1, advanced=True), IntInput(name="request_parallelism", value=5, display_name="Request Parallelism", advanced=True), MessageTextInput(name="stop_sequences", display_name="Stop", advanced=True, is_list=True), diff --git a/src/backend/base/langflow/components/helpers/structured_output.py b/src/backend/base/langflow/components/helpers/structured_output.py index 95f0da21e..2db37a605 100644 --- a/src/backend/base/langflow/components/helpers/structured_output.py +++ b/src/backend/base/langflow/components/helpers/structured_output.py @@ -34,6 +34,7 @@ class StructuredOutputComponent(Component): display_name="Input Message", info="The input message to the language model.", tool_mode=True, + required=True, ), StrInput( name="schema_name", diff --git a/src/backend/base/langflow/components/icosacomputing/combinatorial_reasoner.py b/src/backend/base/langflow/components/icosacomputing/combinatorial_reasoner.py index 217bfb318..22b2e782d 100644 --- a/src/backend/base/langflow/components/icosacomputing/combinatorial_reasoner.py +++ b/src/backend/base/langflow/components/icosacomputing/combinatorial_reasoner.py @@ -16,25 +16,28 @@ class CombinatorialReasonerComponent(Component): name = "Combinatorial Reasoner" inputs = [ - MessageTextInput(name="prompt", display_name="Prompt"), + MessageTextInput(name="prompt", display_name="Prompt", required=True), SecretStrInput( name="openai_api_key", display_name="OpenAI API Key", info="The OpenAI API Key to use for the OpenAI model.", advanced=False, value="OPENAI_API_KEY", + required=True, ), StrInput( name="username", display_name="Username", info="Username to authenticate access to Icosa CR API", advanced=False, + required=True, ), SecretStrInput( name="password", display_name="Password", info="Password to authenticate access to Icosa CR API.", advanced=False, + required=True, ), DropdownInput( name="model_name", diff --git a/src/backend/base/langflow/components/langchain_utilities/character.py b/src/backend/base/langflow/components/langchain_utilities/character.py index 0dff4f13f..92dacd519 100644 --- a/src/backend/base/langflow/components/langchain_utilities/character.py +++ b/src/backend/base/langflow/components/langchain_utilities/character.py @@ -32,6 +32,7 @@ class CharacterTextSplitterComponent(LCTextSplitterComponent): display_name="Input", info="The texts to split.", input_types=["Document", "Data"], + required=True, ), MessageTextInput( name="separator", diff --git a/src/backend/base/langflow/components/langchain_utilities/csv_agent.py b/src/backend/base/langflow/components/langchain_utilities/csv_agent.py index 3e1e32241..ecfc3a415 100644 --- a/src/backend/base/langflow/components/langchain_utilities/csv_agent.py +++ b/src/backend/base/langflow/components/langchain_utilities/csv_agent.py @@ -43,6 +43,7 @@ class CSVAgentComponent(LCAgentComponent): name="input_value", display_name="Text", info="Text to be passed as input and extract info from the CSV File.", + required=True, ), DictInput( name="pandas_kwargs", diff --git a/src/backend/base/langflow/components/langchain_utilities/html_link_extractor.py b/src/backend/base/langflow/components/langchain_utilities/html_link_extractor.py index 824b04ea1..0d3e654ab 100644 --- a/src/backend/base/langflow/components/langchain_utilities/html_link_extractor.py +++ b/src/backend/base/langflow/components/langchain_utilities/html_link_extractor.py @@ -22,6 +22,7 @@ class HtmlLinkExtractorComponent(LCDocumentTransformerComponent): display_name="Input", info="The texts from which to extract links.", input_types=["Document", "Data"], + required=True, ), ] diff --git a/src/backend/base/langflow/components/langchain_utilities/language_recursive.py b/src/backend/base/langflow/components/langchain_utilities/language_recursive.py index 0a454cf43..66f909e96 100644 --- a/src/backend/base/langflow/components/langchain_utilities/language_recursive.py +++ b/src/backend/base/langflow/components/langchain_utilities/language_recursive.py @@ -31,6 +31,7 @@ class LanguageRecursiveTextSplitterComponent(LCTextSplitterComponent): display_name="Input", info="The texts to split.", input_types=["Document", "Data"], + required=True, ), DropdownInput( name="code_language", display_name="Code Language", options=[x.value for x in Language], value="python" diff --git a/src/backend/base/langflow/components/langchain_utilities/language_semantic.py b/src/backend/base/langflow/components/langchain_utilities/language_semantic.py index 261e6e294..6edad7d1c 100644 --- a/src/backend/base/langflow/components/langchain_utilities/language_semantic.py +++ b/src/backend/base/langflow/components/langchain_utilities/language_semantic.py @@ -30,6 +30,7 @@ class SemanticTextSplitterComponent(LCTextSplitterComponent): info="List of Data objects containing text and metadata to split.", input_types=["Data"], is_list=True, + required=True, ), HandleInput( name="embeddings", @@ -37,6 +38,7 @@ class SemanticTextSplitterComponent(LCTextSplitterComponent): info="Embeddings model to use for semantic similarity. Required.", input_types=["Embeddings"], is_list=False, + required=True, ), DropdownInput( name="breakpoint_threshold_type", diff --git a/src/backend/base/langflow/components/langchain_utilities/natural_language.py b/src/backend/base/langflow/components/langchain_utilities/natural_language.py index 3a3b3a938..f6e558d9c 100644 --- a/src/backend/base/langflow/components/langchain_utilities/natural_language.py +++ b/src/backend/base/langflow/components/langchain_utilities/natural_language.py @@ -33,6 +33,7 @@ class NaturalLanguageTextSplitterComponent(LCTextSplitterComponent): display_name="Input", info="The text data to be split.", input_types=["Document", "Data"], + required=True, ), MessageTextInput( name="separator", diff --git a/src/backend/base/langflow/components/langchain_utilities/recursive_character.py b/src/backend/base/langflow/components/langchain_utilities/recursive_character.py index 425f4d9a0..86d728875 100644 --- a/src/backend/base/langflow/components/langchain_utilities/recursive_character.py +++ b/src/backend/base/langflow/components/langchain_utilities/recursive_character.py @@ -32,6 +32,7 @@ class RecursiveCharacterTextSplitterComponent(LCTextSplitterComponent): display_name="Input", info="The texts to split.", input_types=["Document", "Data"], + required=True, ), MessageTextInput( name="separators", diff --git a/src/backend/base/langflow/components/logic/conditional_router.py b/src/backend/base/langflow/components/logic/conditional_router.py index 0e6d419e1..a695f43b4 100644 --- a/src/backend/base/langflow/components/logic/conditional_router.py +++ b/src/backend/base/langflow/components/logic/conditional_router.py @@ -20,11 +20,13 @@ class ConditionalRouterComponent(Component): name="input_text", display_name="Text Input", info="The primary text input for the operation.", + required=True, ), MessageTextInput( name="match_text", display_name="Match Text", info="The text input to compare against.", + required=True, ), DropdownInput( name="operator", diff --git a/src/backend/base/langflow/components/logic/pass_message.py b/src/backend/base/langflow/components/logic/pass_message.py index ae527976c..9db6d80e5 100644 --- a/src/backend/base/langflow/components/logic/pass_message.py +++ b/src/backend/base/langflow/components/logic/pass_message.py @@ -15,6 +15,7 @@ class PassMessageComponent(Component): name="input_message", display_name="Input Message", info="The message to be passed forward.", + required=True, ), MessageInput( name="ignored_message", diff --git a/src/backend/base/langflow/components/notdiamond/notdiamond.py b/src/backend/base/langflow/components/notdiamond/notdiamond.py index 70a13212b..7f6b322a2 100644 --- a/src/backend/base/langflow/components/notdiamond/notdiamond.py +++ b/src/backend/base/langflow/components/notdiamond/notdiamond.py @@ -54,7 +54,7 @@ class NotDiamondComponent(Component): self._selected_model_name = None inputs = [ - MessageInput(name="input_value", display_name="Input"), + MessageInput(name="input_value", display_name="Input", required=True), MessageTextInput( name="system_message", display_name="System Message", @@ -75,6 +75,7 @@ class NotDiamondComponent(Component): info="The Not Diamond API Key to use for routing.", advanced=False, value="NOTDIAMOND_API_KEY", + required=True, ), StrInput( name="preference_id", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Graph Vector Store RAG.json b/src/backend/base/langflow/initial_setup/starter_projects/Graph Vector Store RAG.json index fd1a8c8d3..1ade22b25 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Graph Vector Store RAG.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Graph Vector Store RAG.json @@ -665,7 +665,9 @@ "display_name": "Embeddings", "method": "build_embeddings", "name": "embeddings", - "required_inputs": [], + "required_inputs": [ + "openai_api_key" + ], "selected": "Embeddings", "types": [ "Embeddings" @@ -731,7 +733,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from langchain_openai import OpenAIEmbeddings\n\nfrom langflow.base.embeddings.model import LCEmbeddingsModel\nfrom langflow.base.models.openai_constants import OPENAI_EMBEDDING_MODEL_NAMES\nfrom langflow.field_typing import Embeddings\nfrom langflow.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, MessageTextInput, SecretStrInput\n\n\nclass OpenAIEmbeddingsComponent(LCEmbeddingsModel):\n display_name = \"OpenAI Embeddings\"\n description = \"Generate embeddings using OpenAI models.\"\n icon = \"OpenAI\"\n name = \"OpenAIEmbeddings\"\n\n inputs = [\n DictInput(\n name=\"default_headers\",\n display_name=\"Default Headers\",\n advanced=True,\n info=\"Default headers to use for the API request.\",\n ),\n DictInput(\n name=\"default_query\",\n display_name=\"Default Query\",\n advanced=True,\n info=\"Default query parameters to use for the API request.\",\n ),\n IntInput(name=\"chunk_size\", display_name=\"Chunk Size\", advanced=True, value=1000),\n MessageTextInput(name=\"client\", display_name=\"Client\", advanced=True),\n MessageTextInput(name=\"deployment\", display_name=\"Deployment\", advanced=True),\n IntInput(name=\"embedding_ctx_length\", display_name=\"Embedding Context Length\", advanced=True, value=1536),\n IntInput(name=\"max_retries\", display_name=\"Max Retries\", value=3, advanced=True),\n DropdownInput(\n name=\"model\",\n display_name=\"Model\",\n advanced=False,\n options=OPENAI_EMBEDDING_MODEL_NAMES,\n value=\"text-embedding-3-small\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n SecretStrInput(name=\"openai_api_key\", display_name=\"OpenAI API Key\", value=\"OPENAI_API_KEY\"),\n MessageTextInput(name=\"openai_api_base\", display_name=\"OpenAI API Base\", advanced=True),\n MessageTextInput(name=\"openai_api_type\", display_name=\"OpenAI API Type\", advanced=True),\n MessageTextInput(name=\"openai_api_version\", display_name=\"OpenAI API Version\", advanced=True),\n MessageTextInput(\n name=\"openai_organization\",\n display_name=\"OpenAI Organization\",\n advanced=True,\n ),\n MessageTextInput(name=\"openai_proxy\", display_name=\"OpenAI Proxy\", advanced=True),\n FloatInput(name=\"request_timeout\", display_name=\"Request Timeout\", advanced=True),\n BoolInput(name=\"show_progress_bar\", display_name=\"Show Progress Bar\", advanced=True),\n BoolInput(name=\"skip_empty\", display_name=\"Skip Empty\", advanced=True),\n MessageTextInput(\n name=\"tiktoken_model_name\",\n display_name=\"TikToken Model Name\",\n advanced=True,\n ),\n BoolInput(\n name=\"tiktoken_enable\",\n display_name=\"TikToken Enable\",\n advanced=True,\n value=True,\n info=\"If False, you must have transformers installed.\",\n ),\n IntInput(\n name=\"dimensions\",\n display_name=\"Dimensions\",\n info=\"The number of dimensions the resulting output embeddings should have. \"\n \"Only supported by certain models.\",\n advanced=True,\n ),\n ]\n\n def build_embeddings(self) -> Embeddings:\n return OpenAIEmbeddings(\n client=self.client or None,\n model=self.model,\n dimensions=self.dimensions or None,\n deployment=self.deployment or None,\n api_version=self.openai_api_version or None,\n base_url=self.openai_api_base or None,\n openai_api_type=self.openai_api_type or None,\n openai_proxy=self.openai_proxy or None,\n embedding_ctx_length=self.embedding_ctx_length,\n api_key=self.openai_api_key or None,\n organization=self.openai_organization or None,\n allowed_special=\"all\",\n disallowed_special=\"all\",\n chunk_size=self.chunk_size,\n max_retries=self.max_retries,\n timeout=self.request_timeout or None,\n tiktoken_enabled=self.tiktoken_enable,\n tiktoken_model_name=self.tiktoken_model_name or None,\n show_progress_bar=self.show_progress_bar,\n model_kwargs=self.model_kwargs,\n skip_empty=self.skip_empty,\n default_headers=self.default_headers or None,\n default_query=self.default_query or None,\n )\n" + "value": "from langchain_openai import OpenAIEmbeddings\n\nfrom langflow.base.embeddings.model import LCEmbeddingsModel\nfrom langflow.base.models.openai_constants import OPENAI_EMBEDDING_MODEL_NAMES\nfrom langflow.field_typing import Embeddings\nfrom langflow.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, MessageTextInput, SecretStrInput\n\n\nclass OpenAIEmbeddingsComponent(LCEmbeddingsModel):\n display_name = \"OpenAI Embeddings\"\n description = \"Generate embeddings using OpenAI models.\"\n icon = \"OpenAI\"\n name = \"OpenAIEmbeddings\"\n\n inputs = [\n DictInput(\n name=\"default_headers\",\n display_name=\"Default Headers\",\n advanced=True,\n info=\"Default headers to use for the API request.\",\n ),\n DictInput(\n name=\"default_query\",\n display_name=\"Default Query\",\n advanced=True,\n info=\"Default query parameters to use for the API request.\",\n ),\n IntInput(name=\"chunk_size\", display_name=\"Chunk Size\", advanced=True, value=1000),\n MessageTextInput(name=\"client\", display_name=\"Client\", advanced=True),\n MessageTextInput(name=\"deployment\", display_name=\"Deployment\", advanced=True),\n IntInput(name=\"embedding_ctx_length\", display_name=\"Embedding Context Length\", advanced=True, value=1536),\n IntInput(name=\"max_retries\", display_name=\"Max Retries\", value=3, advanced=True),\n DropdownInput(\n name=\"model\",\n display_name=\"Model\",\n advanced=False,\n options=OPENAI_EMBEDDING_MODEL_NAMES,\n value=\"text-embedding-3-small\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n SecretStrInput(name=\"openai_api_key\", display_name=\"OpenAI API Key\", value=\"OPENAI_API_KEY\", required=True),\n MessageTextInput(name=\"openai_api_base\", display_name=\"OpenAI API Base\", advanced=True),\n MessageTextInput(name=\"openai_api_type\", display_name=\"OpenAI API Type\", advanced=True),\n MessageTextInput(name=\"openai_api_version\", display_name=\"OpenAI API Version\", advanced=True),\n MessageTextInput(\n name=\"openai_organization\",\n display_name=\"OpenAI Organization\",\n advanced=True,\n ),\n MessageTextInput(name=\"openai_proxy\", display_name=\"OpenAI Proxy\", advanced=True),\n FloatInput(name=\"request_timeout\", display_name=\"Request Timeout\", advanced=True),\n BoolInput(name=\"show_progress_bar\", display_name=\"Show Progress Bar\", advanced=True),\n BoolInput(name=\"skip_empty\", display_name=\"Skip Empty\", advanced=True),\n MessageTextInput(\n name=\"tiktoken_model_name\",\n display_name=\"TikToken Model Name\",\n advanced=True,\n ),\n BoolInput(\n name=\"tiktoken_enable\",\n display_name=\"TikToken Enable\",\n advanced=True,\n value=True,\n info=\"If False, you must have transformers installed.\",\n ),\n IntInput(\n name=\"dimensions\",\n display_name=\"Dimensions\",\n info=\"The number of dimensions the resulting output embeddings should have. \"\n \"Only supported by certain models.\",\n advanced=True,\n ),\n ]\n\n def build_embeddings(self) -> Embeddings:\n return OpenAIEmbeddings(\n client=self.client or None,\n model=self.model,\n dimensions=self.dimensions or None,\n deployment=self.deployment or None,\n api_version=self.openai_api_version or None,\n base_url=self.openai_api_base or None,\n openai_api_type=self.openai_api_type or None,\n openai_proxy=self.openai_proxy or None,\n embedding_ctx_length=self.embedding_ctx_length,\n api_key=self.openai_api_key or None,\n organization=self.openai_organization or None,\n allowed_special=\"all\",\n disallowed_special=\"all\",\n chunk_size=self.chunk_size,\n max_retries=self.max_retries,\n timeout=self.request_timeout or None,\n tiktoken_enabled=self.tiktoken_enable,\n tiktoken_model_name=self.tiktoken_model_name or None,\n show_progress_bar=self.show_progress_bar,\n model_kwargs=self.model_kwargs,\n skip_empty=self.skip_empty,\n default_headers=self.default_headers or None,\n default_query=self.default_query or None,\n )\n" }, "default_headers": { "_input_type": "DictInput", @@ -908,7 +910,7 @@ "name": "openai_api_key", "password": true, "placeholder": "", - "required": false, + "required": true, "show": true, "title_case": false, "type": "str", @@ -3344,7 +3346,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from typing import Any\n\nfrom langchain_text_splitters import Language, RecursiveCharacterTextSplitter, TextSplitter\n\nfrom langflow.base.textsplitters.model import LCTextSplitterComponent\nfrom langflow.inputs import DataInput, DropdownInput, IntInput\n\n\nclass LanguageRecursiveTextSplitterComponent(LCTextSplitterComponent):\n display_name: str = \"Language Recursive Text Splitter\"\n description: str = \"Split text into chunks of a specified length based on language.\"\n documentation: str = \"https://docs.langflow.org/components/text-splitters#languagerecursivetextsplitter\"\n name = \"LanguageRecursiveTextSplitter\"\n icon = \"LangChain\"\n\n inputs = [\n IntInput(\n name=\"chunk_size\",\n display_name=\"Chunk Size\",\n info=\"The maximum length of each chunk.\",\n value=1000,\n ),\n IntInput(\n name=\"chunk_overlap\",\n display_name=\"Chunk Overlap\",\n info=\"The amount of overlap between chunks.\",\n value=200,\n ),\n DataInput(\n name=\"data_input\",\n display_name=\"Input\",\n info=\"The texts to split.\",\n input_types=[\"Document\", \"Data\"],\n ),\n DropdownInput(\n name=\"code_language\", display_name=\"Code Language\", options=[x.value for x in Language], value=\"python\"\n ),\n ]\n\n def get_data_input(self) -> Any:\n return self.data_input\n\n def build_text_splitter(self) -> TextSplitter:\n return RecursiveCharacterTextSplitter.from_language(\n language=Language(self.code_language),\n chunk_size=self.chunk_size,\n chunk_overlap=self.chunk_overlap,\n )\n" + "value": "from typing import Any\n\nfrom langchain_text_splitters import Language, RecursiveCharacterTextSplitter, TextSplitter\n\nfrom langflow.base.textsplitters.model import LCTextSplitterComponent\nfrom langflow.inputs import DataInput, DropdownInput, IntInput\n\n\nclass LanguageRecursiveTextSplitterComponent(LCTextSplitterComponent):\n display_name: str = \"Language Recursive Text Splitter\"\n description: str = \"Split text into chunks of a specified length based on language.\"\n documentation: str = \"https://docs.langflow.org/components/text-splitters#languagerecursivetextsplitter\"\n name = \"LanguageRecursiveTextSplitter\"\n icon = \"LangChain\"\n\n inputs = [\n IntInput(\n name=\"chunk_size\",\n display_name=\"Chunk Size\",\n info=\"The maximum length of each chunk.\",\n value=1000,\n ),\n IntInput(\n name=\"chunk_overlap\",\n display_name=\"Chunk Overlap\",\n info=\"The amount of overlap between chunks.\",\n value=200,\n ),\n DataInput(\n name=\"data_input\",\n display_name=\"Input\",\n info=\"The texts to split.\",\n input_types=[\"Document\", \"Data\"],\n required=True,\n ),\n DropdownInput(\n name=\"code_language\", display_name=\"Code Language\", options=[x.value for x in Language], value=\"python\"\n ),\n ]\n\n def get_data_input(self) -> Any:\n return self.data_input\n\n def build_text_splitter(self) -> TextSplitter:\n return RecursiveCharacterTextSplitter.from_language(\n language=Language(self.code_language),\n chunk_size=self.chunk_size,\n chunk_overlap=self.chunk_overlap,\n )\n" }, "code_language": { "_input_type": "DropdownInput", @@ -3404,7 +3406,7 @@ "list": false, "name": "data_input", "placeholder": "", - "required": false, + "required": true, "show": true, "title_case": false, "tool_mode": false, @@ -3494,7 +3496,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from typing import Any\n\nfrom langchain_community.graph_vectorstores.extractors import HtmlLinkExtractor, LinkExtractorTransformer\nfrom langchain_core.documents import BaseDocumentTransformer\n\nfrom langflow.base.document_transformers.model import LCDocumentTransformerComponent\nfrom langflow.inputs import BoolInput, DataInput, StrInput\n\n\nclass HtmlLinkExtractorComponent(LCDocumentTransformerComponent):\n display_name = \"HTML Link Extractor\"\n description = \"Extract hyperlinks from HTML content.\"\n documentation = \"https://python.langchain.com/v0.2/api_reference/community/graph_vectorstores/langchain_community.graph_vectorstores.extractors.html_link_extractor.HtmlLinkExtractor.html\"\n name = \"HtmlLinkExtractor\"\n icon = \"LangChain\"\n\n inputs = [\n StrInput(name=\"kind\", display_name=\"Kind of edge\", value=\"hyperlink\", required=False),\n BoolInput(name=\"drop_fragments\", display_name=\"Drop URL fragments\", value=True, required=False),\n DataInput(\n name=\"data_input\",\n display_name=\"Input\",\n info=\"The texts from which to extract links.\",\n input_types=[\"Document\", \"Data\"],\n ),\n ]\n\n def get_data_input(self) -> Any:\n return self.data_input\n\n def build_document_transformer(self) -> BaseDocumentTransformer:\n return LinkExtractorTransformer(\n [HtmlLinkExtractor(kind=self.kind, drop_fragments=self.drop_fragments).as_document_extractor()]\n )\n" + "value": "from typing import Any\n\nfrom langchain_community.graph_vectorstores.extractors import HtmlLinkExtractor, LinkExtractorTransformer\nfrom langchain_core.documents import BaseDocumentTransformer\n\nfrom langflow.base.document_transformers.model import LCDocumentTransformerComponent\nfrom langflow.inputs import BoolInput, DataInput, StrInput\n\n\nclass HtmlLinkExtractorComponent(LCDocumentTransformerComponent):\n display_name = \"HTML Link Extractor\"\n description = \"Extract hyperlinks from HTML content.\"\n documentation = \"https://python.langchain.com/v0.2/api_reference/community/graph_vectorstores/langchain_community.graph_vectorstores.extractors.html_link_extractor.HtmlLinkExtractor.html\"\n name = \"HtmlLinkExtractor\"\n icon = \"LangChain\"\n\n inputs = [\n StrInput(name=\"kind\", display_name=\"Kind of edge\", value=\"hyperlink\", required=False),\n BoolInput(name=\"drop_fragments\", display_name=\"Drop URL fragments\", value=True, required=False),\n DataInput(\n name=\"data_input\",\n display_name=\"Input\",\n info=\"The texts from which to extract links.\",\n input_types=[\"Document\", \"Data\"],\n required=True,\n ),\n ]\n\n def get_data_input(self) -> Any:\n return self.data_input\n\n def build_document_transformer(self) -> BaseDocumentTransformer:\n return LinkExtractorTransformer(\n [HtmlLinkExtractor(kind=self.kind, drop_fragments=self.drop_fragments).as_document_extractor()]\n )\n" }, "data_input": { "_input_type": "DataInput", @@ -3509,7 +3511,7 @@ "list": false, "name": "data_input", "placeholder": "", - "required": false, + "required": true, "show": true, "title_case": false, "tool_mode": false, @@ -3624,7 +3626,9 @@ "display_name": "Embeddings", "method": "build_embeddings", "name": "embeddings", - "required_inputs": [], + "required_inputs": [ + "openai_api_key" + ], "selected": "Embeddings", "types": [ "Embeddings" @@ -3691,7 +3695,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from langchain_openai import OpenAIEmbeddings\n\nfrom langflow.base.embeddings.model import LCEmbeddingsModel\nfrom langflow.base.models.openai_constants import OPENAI_EMBEDDING_MODEL_NAMES\nfrom langflow.field_typing import Embeddings\nfrom langflow.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, MessageTextInput, SecretStrInput\n\n\nclass OpenAIEmbeddingsComponent(LCEmbeddingsModel):\n display_name = \"OpenAI Embeddings\"\n description = \"Generate embeddings using OpenAI models.\"\n icon = \"OpenAI\"\n name = \"OpenAIEmbeddings\"\n\n inputs = [\n DictInput(\n name=\"default_headers\",\n display_name=\"Default Headers\",\n advanced=True,\n info=\"Default headers to use for the API request.\",\n ),\n DictInput(\n name=\"default_query\",\n display_name=\"Default Query\",\n advanced=True,\n info=\"Default query parameters to use for the API request.\",\n ),\n IntInput(name=\"chunk_size\", display_name=\"Chunk Size\", advanced=True, value=1000),\n MessageTextInput(name=\"client\", display_name=\"Client\", advanced=True),\n MessageTextInput(name=\"deployment\", display_name=\"Deployment\", advanced=True),\n IntInput(name=\"embedding_ctx_length\", display_name=\"Embedding Context Length\", advanced=True, value=1536),\n IntInput(name=\"max_retries\", display_name=\"Max Retries\", value=3, advanced=True),\n DropdownInput(\n name=\"model\",\n display_name=\"Model\",\n advanced=False,\n options=OPENAI_EMBEDDING_MODEL_NAMES,\n value=\"text-embedding-3-small\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n SecretStrInput(name=\"openai_api_key\", display_name=\"OpenAI API Key\", value=\"OPENAI_API_KEY\"),\n MessageTextInput(name=\"openai_api_base\", display_name=\"OpenAI API Base\", advanced=True),\n MessageTextInput(name=\"openai_api_type\", display_name=\"OpenAI API Type\", advanced=True),\n MessageTextInput(name=\"openai_api_version\", display_name=\"OpenAI API Version\", advanced=True),\n MessageTextInput(\n name=\"openai_organization\",\n display_name=\"OpenAI Organization\",\n advanced=True,\n ),\n MessageTextInput(name=\"openai_proxy\", display_name=\"OpenAI Proxy\", advanced=True),\n FloatInput(name=\"request_timeout\", display_name=\"Request Timeout\", advanced=True),\n BoolInput(name=\"show_progress_bar\", display_name=\"Show Progress Bar\", advanced=True),\n BoolInput(name=\"skip_empty\", display_name=\"Skip Empty\", advanced=True),\n MessageTextInput(\n name=\"tiktoken_model_name\",\n display_name=\"TikToken Model Name\",\n advanced=True,\n ),\n BoolInput(\n name=\"tiktoken_enable\",\n display_name=\"TikToken Enable\",\n advanced=True,\n value=True,\n info=\"If False, you must have transformers installed.\",\n ),\n IntInput(\n name=\"dimensions\",\n display_name=\"Dimensions\",\n info=\"The number of dimensions the resulting output embeddings should have. \"\n \"Only supported by certain models.\",\n advanced=True,\n ),\n ]\n\n def build_embeddings(self) -> Embeddings:\n return OpenAIEmbeddings(\n client=self.client or None,\n model=self.model,\n dimensions=self.dimensions or None,\n deployment=self.deployment or None,\n api_version=self.openai_api_version or None,\n base_url=self.openai_api_base or None,\n openai_api_type=self.openai_api_type or None,\n openai_proxy=self.openai_proxy or None,\n embedding_ctx_length=self.embedding_ctx_length,\n api_key=self.openai_api_key or None,\n organization=self.openai_organization or None,\n allowed_special=\"all\",\n disallowed_special=\"all\",\n chunk_size=self.chunk_size,\n max_retries=self.max_retries,\n timeout=self.request_timeout or None,\n tiktoken_enabled=self.tiktoken_enable,\n tiktoken_model_name=self.tiktoken_model_name or None,\n show_progress_bar=self.show_progress_bar,\n model_kwargs=self.model_kwargs,\n skip_empty=self.skip_empty,\n default_headers=self.default_headers or None,\n default_query=self.default_query or None,\n )\n" + "value": "from langchain_openai import OpenAIEmbeddings\n\nfrom langflow.base.embeddings.model import LCEmbeddingsModel\nfrom langflow.base.models.openai_constants import OPENAI_EMBEDDING_MODEL_NAMES\nfrom langflow.field_typing import Embeddings\nfrom langflow.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, MessageTextInput, SecretStrInput\n\n\nclass OpenAIEmbeddingsComponent(LCEmbeddingsModel):\n display_name = \"OpenAI Embeddings\"\n description = \"Generate embeddings using OpenAI models.\"\n icon = \"OpenAI\"\n name = \"OpenAIEmbeddings\"\n\n inputs = [\n DictInput(\n name=\"default_headers\",\n display_name=\"Default Headers\",\n advanced=True,\n info=\"Default headers to use for the API request.\",\n ),\n DictInput(\n name=\"default_query\",\n display_name=\"Default Query\",\n advanced=True,\n info=\"Default query parameters to use for the API request.\",\n ),\n IntInput(name=\"chunk_size\", display_name=\"Chunk Size\", advanced=True, value=1000),\n MessageTextInput(name=\"client\", display_name=\"Client\", advanced=True),\n MessageTextInput(name=\"deployment\", display_name=\"Deployment\", advanced=True),\n IntInput(name=\"embedding_ctx_length\", display_name=\"Embedding Context Length\", advanced=True, value=1536),\n IntInput(name=\"max_retries\", display_name=\"Max Retries\", value=3, advanced=True),\n DropdownInput(\n name=\"model\",\n display_name=\"Model\",\n advanced=False,\n options=OPENAI_EMBEDDING_MODEL_NAMES,\n value=\"text-embedding-3-small\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n SecretStrInput(name=\"openai_api_key\", display_name=\"OpenAI API Key\", value=\"OPENAI_API_KEY\", required=True),\n MessageTextInput(name=\"openai_api_base\", display_name=\"OpenAI API Base\", advanced=True),\n MessageTextInput(name=\"openai_api_type\", display_name=\"OpenAI API Type\", advanced=True),\n MessageTextInput(name=\"openai_api_version\", display_name=\"OpenAI API Version\", advanced=True),\n MessageTextInput(\n name=\"openai_organization\",\n display_name=\"OpenAI Organization\",\n advanced=True,\n ),\n MessageTextInput(name=\"openai_proxy\", display_name=\"OpenAI Proxy\", advanced=True),\n FloatInput(name=\"request_timeout\", display_name=\"Request Timeout\", advanced=True),\n BoolInput(name=\"show_progress_bar\", display_name=\"Show Progress Bar\", advanced=True),\n BoolInput(name=\"skip_empty\", display_name=\"Skip Empty\", advanced=True),\n MessageTextInput(\n name=\"tiktoken_model_name\",\n display_name=\"TikToken Model Name\",\n advanced=True,\n ),\n BoolInput(\n name=\"tiktoken_enable\",\n display_name=\"TikToken Enable\",\n advanced=True,\n value=True,\n info=\"If False, you must have transformers installed.\",\n ),\n IntInput(\n name=\"dimensions\",\n display_name=\"Dimensions\",\n info=\"The number of dimensions the resulting output embeddings should have. \"\n \"Only supported by certain models.\",\n advanced=True,\n ),\n ]\n\n def build_embeddings(self) -> Embeddings:\n return OpenAIEmbeddings(\n client=self.client or None,\n model=self.model,\n dimensions=self.dimensions or None,\n deployment=self.deployment or None,\n api_version=self.openai_api_version or None,\n base_url=self.openai_api_base or None,\n openai_api_type=self.openai_api_type or None,\n openai_proxy=self.openai_proxy or None,\n embedding_ctx_length=self.embedding_ctx_length,\n api_key=self.openai_api_key or None,\n organization=self.openai_organization or None,\n allowed_special=\"all\",\n disallowed_special=\"all\",\n chunk_size=self.chunk_size,\n max_retries=self.max_retries,\n timeout=self.request_timeout or None,\n tiktoken_enabled=self.tiktoken_enable,\n tiktoken_model_name=self.tiktoken_model_name or None,\n show_progress_bar=self.show_progress_bar,\n model_kwargs=self.model_kwargs,\n skip_empty=self.skip_empty,\n default_headers=self.default_headers or None,\n default_query=self.default_query or None,\n )\n" }, "default_headers": { "_input_type": "DictInput", @@ -3874,7 +3878,7 @@ "name": "openai_api_key", "password": true, "placeholder": "", - "required": false, + "required": true, "show": true, "title_case": false, "type": "str", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json b/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json index cedeb886f..8ce425c11 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json @@ -1727,7 +1727,9 @@ "display_name": "Embeddings", "method": "build_embeddings", "name": "embeddings", - "required_inputs": [], + "required_inputs": [ + "openai_api_key" + ], "selected": "Embeddings", "types": [ "Embeddings" @@ -1792,7 +1794,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from langchain_openai import OpenAIEmbeddings\n\nfrom langflow.base.embeddings.model import LCEmbeddingsModel\nfrom langflow.base.models.openai_constants import OPENAI_EMBEDDING_MODEL_NAMES\nfrom langflow.field_typing import Embeddings\nfrom langflow.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, MessageTextInput, SecretStrInput\n\n\nclass OpenAIEmbeddingsComponent(LCEmbeddingsModel):\n display_name = \"OpenAI Embeddings\"\n description = \"Generate embeddings using OpenAI models.\"\n icon = \"OpenAI\"\n name = \"OpenAIEmbeddings\"\n\n inputs = [\n DictInput(\n name=\"default_headers\",\n display_name=\"Default Headers\",\n advanced=True,\n info=\"Default headers to use for the API request.\",\n ),\n DictInput(\n name=\"default_query\",\n display_name=\"Default Query\",\n advanced=True,\n info=\"Default query parameters to use for the API request.\",\n ),\n IntInput(name=\"chunk_size\", display_name=\"Chunk Size\", advanced=True, value=1000),\n MessageTextInput(name=\"client\", display_name=\"Client\", advanced=True),\n MessageTextInput(name=\"deployment\", display_name=\"Deployment\", advanced=True),\n IntInput(name=\"embedding_ctx_length\", display_name=\"Embedding Context Length\", advanced=True, value=1536),\n IntInput(name=\"max_retries\", display_name=\"Max Retries\", value=3, advanced=True),\n DropdownInput(\n name=\"model\",\n display_name=\"Model\",\n advanced=False,\n options=OPENAI_EMBEDDING_MODEL_NAMES,\n value=\"text-embedding-3-small\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n SecretStrInput(name=\"openai_api_key\", display_name=\"OpenAI API Key\", value=\"OPENAI_API_KEY\"),\n MessageTextInput(name=\"openai_api_base\", display_name=\"OpenAI API Base\", advanced=True),\n MessageTextInput(name=\"openai_api_type\", display_name=\"OpenAI API Type\", advanced=True),\n MessageTextInput(name=\"openai_api_version\", display_name=\"OpenAI API Version\", advanced=True),\n MessageTextInput(\n name=\"openai_organization\",\n display_name=\"OpenAI Organization\",\n advanced=True,\n ),\n MessageTextInput(name=\"openai_proxy\", display_name=\"OpenAI Proxy\", advanced=True),\n FloatInput(name=\"request_timeout\", display_name=\"Request Timeout\", advanced=True),\n BoolInput(name=\"show_progress_bar\", display_name=\"Show Progress Bar\", advanced=True),\n BoolInput(name=\"skip_empty\", display_name=\"Skip Empty\", advanced=True),\n MessageTextInput(\n name=\"tiktoken_model_name\",\n display_name=\"TikToken Model Name\",\n advanced=True,\n ),\n BoolInput(\n name=\"tiktoken_enable\",\n display_name=\"TikToken Enable\",\n advanced=True,\n value=True,\n info=\"If False, you must have transformers installed.\",\n ),\n IntInput(\n name=\"dimensions\",\n display_name=\"Dimensions\",\n info=\"The number of dimensions the resulting output embeddings should have. \"\n \"Only supported by certain models.\",\n advanced=True,\n ),\n ]\n\n def build_embeddings(self) -> Embeddings:\n return OpenAIEmbeddings(\n client=self.client or None,\n model=self.model,\n dimensions=self.dimensions or None,\n deployment=self.deployment or None,\n api_version=self.openai_api_version or None,\n base_url=self.openai_api_base or None,\n openai_api_type=self.openai_api_type or None,\n openai_proxy=self.openai_proxy or None,\n embedding_ctx_length=self.embedding_ctx_length,\n api_key=self.openai_api_key or None,\n organization=self.openai_organization or None,\n allowed_special=\"all\",\n disallowed_special=\"all\",\n chunk_size=self.chunk_size,\n max_retries=self.max_retries,\n timeout=self.request_timeout or None,\n tiktoken_enabled=self.tiktoken_enable,\n tiktoken_model_name=self.tiktoken_model_name or None,\n show_progress_bar=self.show_progress_bar,\n model_kwargs=self.model_kwargs,\n skip_empty=self.skip_empty,\n default_headers=self.default_headers or None,\n default_query=self.default_query or None,\n )\n" + "value": "from langchain_openai import OpenAIEmbeddings\n\nfrom langflow.base.embeddings.model import LCEmbeddingsModel\nfrom langflow.base.models.openai_constants import OPENAI_EMBEDDING_MODEL_NAMES\nfrom langflow.field_typing import Embeddings\nfrom langflow.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, MessageTextInput, SecretStrInput\n\n\nclass OpenAIEmbeddingsComponent(LCEmbeddingsModel):\n display_name = \"OpenAI Embeddings\"\n description = \"Generate embeddings using OpenAI models.\"\n icon = \"OpenAI\"\n name = \"OpenAIEmbeddings\"\n\n inputs = [\n DictInput(\n name=\"default_headers\",\n display_name=\"Default Headers\",\n advanced=True,\n info=\"Default headers to use for the API request.\",\n ),\n DictInput(\n name=\"default_query\",\n display_name=\"Default Query\",\n advanced=True,\n info=\"Default query parameters to use for the API request.\",\n ),\n IntInput(name=\"chunk_size\", display_name=\"Chunk Size\", advanced=True, value=1000),\n MessageTextInput(name=\"client\", display_name=\"Client\", advanced=True),\n MessageTextInput(name=\"deployment\", display_name=\"Deployment\", advanced=True),\n IntInput(name=\"embedding_ctx_length\", display_name=\"Embedding Context Length\", advanced=True, value=1536),\n IntInput(name=\"max_retries\", display_name=\"Max Retries\", value=3, advanced=True),\n DropdownInput(\n name=\"model\",\n display_name=\"Model\",\n advanced=False,\n options=OPENAI_EMBEDDING_MODEL_NAMES,\n value=\"text-embedding-3-small\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n SecretStrInput(name=\"openai_api_key\", display_name=\"OpenAI API Key\", value=\"OPENAI_API_KEY\", required=True),\n MessageTextInput(name=\"openai_api_base\", display_name=\"OpenAI API Base\", advanced=True),\n MessageTextInput(name=\"openai_api_type\", display_name=\"OpenAI API Type\", advanced=True),\n MessageTextInput(name=\"openai_api_version\", display_name=\"OpenAI API Version\", advanced=True),\n MessageTextInput(\n name=\"openai_organization\",\n display_name=\"OpenAI Organization\",\n advanced=True,\n ),\n MessageTextInput(name=\"openai_proxy\", display_name=\"OpenAI Proxy\", advanced=True),\n FloatInput(name=\"request_timeout\", display_name=\"Request Timeout\", advanced=True),\n BoolInput(name=\"show_progress_bar\", display_name=\"Show Progress Bar\", advanced=True),\n BoolInput(name=\"skip_empty\", display_name=\"Skip Empty\", advanced=True),\n MessageTextInput(\n name=\"tiktoken_model_name\",\n display_name=\"TikToken Model Name\",\n advanced=True,\n ),\n BoolInput(\n name=\"tiktoken_enable\",\n display_name=\"TikToken Enable\",\n advanced=True,\n value=True,\n info=\"If False, you must have transformers installed.\",\n ),\n IntInput(\n name=\"dimensions\",\n display_name=\"Dimensions\",\n info=\"The number of dimensions the resulting output embeddings should have. \"\n \"Only supported by certain models.\",\n advanced=True,\n ),\n ]\n\n def build_embeddings(self) -> Embeddings:\n return OpenAIEmbeddings(\n client=self.client or None,\n model=self.model,\n dimensions=self.dimensions or None,\n deployment=self.deployment or None,\n api_version=self.openai_api_version or None,\n base_url=self.openai_api_base or None,\n openai_api_type=self.openai_api_type or None,\n openai_proxy=self.openai_proxy or None,\n embedding_ctx_length=self.embedding_ctx_length,\n api_key=self.openai_api_key or None,\n organization=self.openai_organization or None,\n allowed_special=\"all\",\n disallowed_special=\"all\",\n chunk_size=self.chunk_size,\n max_retries=self.max_retries,\n timeout=self.request_timeout or None,\n tiktoken_enabled=self.tiktoken_enable,\n tiktoken_model_name=self.tiktoken_model_name or None,\n show_progress_bar=self.show_progress_bar,\n model_kwargs=self.model_kwargs,\n skip_empty=self.skip_empty,\n default_headers=self.default_headers or None,\n default_query=self.default_query or None,\n )\n" }, "default_headers": { "_input_type": "DictInput", @@ -1969,7 +1971,7 @@ "name": "openai_api_key", "password": true, "placeholder": "", - "required": false, + "required": true, "show": true, "title_case": false, "type": "str", @@ -2250,7 +2252,9 @@ "display_name": "Embeddings", "method": "build_embeddings", "name": "embeddings", - "required_inputs": [], + "required_inputs": [ + "openai_api_key" + ], "selected": "Embeddings", "types": [ "Embeddings" @@ -2315,7 +2319,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from langchain_openai import OpenAIEmbeddings\n\nfrom langflow.base.embeddings.model import LCEmbeddingsModel\nfrom langflow.base.models.openai_constants import OPENAI_EMBEDDING_MODEL_NAMES\nfrom langflow.field_typing import Embeddings\nfrom langflow.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, MessageTextInput, SecretStrInput\n\n\nclass OpenAIEmbeddingsComponent(LCEmbeddingsModel):\n display_name = \"OpenAI Embeddings\"\n description = \"Generate embeddings using OpenAI models.\"\n icon = \"OpenAI\"\n name = \"OpenAIEmbeddings\"\n\n inputs = [\n DictInput(\n name=\"default_headers\",\n display_name=\"Default Headers\",\n advanced=True,\n info=\"Default headers to use for the API request.\",\n ),\n DictInput(\n name=\"default_query\",\n display_name=\"Default Query\",\n advanced=True,\n info=\"Default query parameters to use for the API request.\",\n ),\n IntInput(name=\"chunk_size\", display_name=\"Chunk Size\", advanced=True, value=1000),\n MessageTextInput(name=\"client\", display_name=\"Client\", advanced=True),\n MessageTextInput(name=\"deployment\", display_name=\"Deployment\", advanced=True),\n IntInput(name=\"embedding_ctx_length\", display_name=\"Embedding Context Length\", advanced=True, value=1536),\n IntInput(name=\"max_retries\", display_name=\"Max Retries\", value=3, advanced=True),\n DropdownInput(\n name=\"model\",\n display_name=\"Model\",\n advanced=False,\n options=OPENAI_EMBEDDING_MODEL_NAMES,\n value=\"text-embedding-3-small\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n SecretStrInput(name=\"openai_api_key\", display_name=\"OpenAI API Key\", value=\"OPENAI_API_KEY\"),\n MessageTextInput(name=\"openai_api_base\", display_name=\"OpenAI API Base\", advanced=True),\n MessageTextInput(name=\"openai_api_type\", display_name=\"OpenAI API Type\", advanced=True),\n MessageTextInput(name=\"openai_api_version\", display_name=\"OpenAI API Version\", advanced=True),\n MessageTextInput(\n name=\"openai_organization\",\n display_name=\"OpenAI Organization\",\n advanced=True,\n ),\n MessageTextInput(name=\"openai_proxy\", display_name=\"OpenAI Proxy\", advanced=True),\n FloatInput(name=\"request_timeout\", display_name=\"Request Timeout\", advanced=True),\n BoolInput(name=\"show_progress_bar\", display_name=\"Show Progress Bar\", advanced=True),\n BoolInput(name=\"skip_empty\", display_name=\"Skip Empty\", advanced=True),\n MessageTextInput(\n name=\"tiktoken_model_name\",\n display_name=\"TikToken Model Name\",\n advanced=True,\n ),\n BoolInput(\n name=\"tiktoken_enable\",\n display_name=\"TikToken Enable\",\n advanced=True,\n value=True,\n info=\"If False, you must have transformers installed.\",\n ),\n IntInput(\n name=\"dimensions\",\n display_name=\"Dimensions\",\n info=\"The number of dimensions the resulting output embeddings should have. \"\n \"Only supported by certain models.\",\n advanced=True,\n ),\n ]\n\n def build_embeddings(self) -> Embeddings:\n return OpenAIEmbeddings(\n client=self.client or None,\n model=self.model,\n dimensions=self.dimensions or None,\n deployment=self.deployment or None,\n api_version=self.openai_api_version or None,\n base_url=self.openai_api_base or None,\n openai_api_type=self.openai_api_type or None,\n openai_proxy=self.openai_proxy or None,\n embedding_ctx_length=self.embedding_ctx_length,\n api_key=self.openai_api_key or None,\n organization=self.openai_organization or None,\n allowed_special=\"all\",\n disallowed_special=\"all\",\n chunk_size=self.chunk_size,\n max_retries=self.max_retries,\n timeout=self.request_timeout or None,\n tiktoken_enabled=self.tiktoken_enable,\n tiktoken_model_name=self.tiktoken_model_name or None,\n show_progress_bar=self.show_progress_bar,\n model_kwargs=self.model_kwargs,\n skip_empty=self.skip_empty,\n default_headers=self.default_headers or None,\n default_query=self.default_query or None,\n )\n" + "value": "from langchain_openai import OpenAIEmbeddings\n\nfrom langflow.base.embeddings.model import LCEmbeddingsModel\nfrom langflow.base.models.openai_constants import OPENAI_EMBEDDING_MODEL_NAMES\nfrom langflow.field_typing import Embeddings\nfrom langflow.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, MessageTextInput, SecretStrInput\n\n\nclass OpenAIEmbeddingsComponent(LCEmbeddingsModel):\n display_name = \"OpenAI Embeddings\"\n description = \"Generate embeddings using OpenAI models.\"\n icon = \"OpenAI\"\n name = \"OpenAIEmbeddings\"\n\n inputs = [\n DictInput(\n name=\"default_headers\",\n display_name=\"Default Headers\",\n advanced=True,\n info=\"Default headers to use for the API request.\",\n ),\n DictInput(\n name=\"default_query\",\n display_name=\"Default Query\",\n advanced=True,\n info=\"Default query parameters to use for the API request.\",\n ),\n IntInput(name=\"chunk_size\", display_name=\"Chunk Size\", advanced=True, value=1000),\n MessageTextInput(name=\"client\", display_name=\"Client\", advanced=True),\n MessageTextInput(name=\"deployment\", display_name=\"Deployment\", advanced=True),\n IntInput(name=\"embedding_ctx_length\", display_name=\"Embedding Context Length\", advanced=True, value=1536),\n IntInput(name=\"max_retries\", display_name=\"Max Retries\", value=3, advanced=True),\n DropdownInput(\n name=\"model\",\n display_name=\"Model\",\n advanced=False,\n options=OPENAI_EMBEDDING_MODEL_NAMES,\n value=\"text-embedding-3-small\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n SecretStrInput(name=\"openai_api_key\", display_name=\"OpenAI API Key\", value=\"OPENAI_API_KEY\", required=True),\n MessageTextInput(name=\"openai_api_base\", display_name=\"OpenAI API Base\", advanced=True),\n MessageTextInput(name=\"openai_api_type\", display_name=\"OpenAI API Type\", advanced=True),\n MessageTextInput(name=\"openai_api_version\", display_name=\"OpenAI API Version\", advanced=True),\n MessageTextInput(\n name=\"openai_organization\",\n display_name=\"OpenAI Organization\",\n advanced=True,\n ),\n MessageTextInput(name=\"openai_proxy\", display_name=\"OpenAI Proxy\", advanced=True),\n FloatInput(name=\"request_timeout\", display_name=\"Request Timeout\", advanced=True),\n BoolInput(name=\"show_progress_bar\", display_name=\"Show Progress Bar\", advanced=True),\n BoolInput(name=\"skip_empty\", display_name=\"Skip Empty\", advanced=True),\n MessageTextInput(\n name=\"tiktoken_model_name\",\n display_name=\"TikToken Model Name\",\n advanced=True,\n ),\n BoolInput(\n name=\"tiktoken_enable\",\n display_name=\"TikToken Enable\",\n advanced=True,\n value=True,\n info=\"If False, you must have transformers installed.\",\n ),\n IntInput(\n name=\"dimensions\",\n display_name=\"Dimensions\",\n info=\"The number of dimensions the resulting output embeddings should have. \"\n \"Only supported by certain models.\",\n advanced=True,\n ),\n ]\n\n def build_embeddings(self) -> Embeddings:\n return OpenAIEmbeddings(\n client=self.client or None,\n model=self.model,\n dimensions=self.dimensions or None,\n deployment=self.deployment or None,\n api_version=self.openai_api_version or None,\n base_url=self.openai_api_base or None,\n openai_api_type=self.openai_api_type or None,\n openai_proxy=self.openai_proxy or None,\n embedding_ctx_length=self.embedding_ctx_length,\n api_key=self.openai_api_key or None,\n organization=self.openai_organization or None,\n allowed_special=\"all\",\n disallowed_special=\"all\",\n chunk_size=self.chunk_size,\n max_retries=self.max_retries,\n timeout=self.request_timeout or None,\n tiktoken_enabled=self.tiktoken_enable,\n tiktoken_model_name=self.tiktoken_model_name or None,\n show_progress_bar=self.show_progress_bar,\n model_kwargs=self.model_kwargs,\n skip_empty=self.skip_empty,\n default_headers=self.default_headers or None,\n default_query=self.default_query or None,\n )\n" }, "default_headers": { "_input_type": "DictInput", @@ -2492,7 +2496,7 @@ "name": "openai_api_key", "password": true, "placeholder": "", - "required": false, + "required": true, "show": true, "title_case": false, "type": "str",