diff --git a/src/backend/base/langflow/components/embeddings/AstraVectorize.py b/src/backend/base/langflow/components/embeddings/AstraVectorize.py new file mode 100644 index 000000000..812dd6525 --- /dev/null +++ b/src/backend/base/langflow/components/embeddings/AstraVectorize.py @@ -0,0 +1,97 @@ +from typing import Optional, Dict, Any + +from langflow.custom import CustomComponent + +from langflow.custom import Component +from base.langflow.inputs import TextInput +from base.langflow.template.field.base import Output +# +# +# class AstraVectorize(Component): +# display_name = "Astra Vectorize" +# description = "Configuration options for Astra Vectorize server-side embeddings." +# documentation = "..." +# icon = "AstraDB" # TODO: New icon? +# +# inputs = [ +# TextInput( +# name="provider", +# display_name="Provider", +# ) +# ] +# outputs = [ +# Output(display_name="Vectorize_configuration", name="embeddings", method="build"), +# ] +# +# def build( +# self, +# ) -> Dict[str, Any]: +# return { +# "provider": self.provider +# } + + +from langflow.custom import Component +from langflow.inputs.inputs import DataInput, IntInput, TextInput, DictInput +from langflow.schema import Data +from langflow.template.field.base import Output +from langflow.utils.util import build_loader_repr_from_data, unescape_string + + +class AstraVectorize(Component): + display_name: str = "Astra Vectorize" + description: str = "Configuration options for Astra Vectorize server-side embeddings." + documentation: str = "https://docs.datastax.com/en/astra-db-serverless/databases/embedding-generation.html" + icon = "AstraDB" + + inputs = [ + TextInput( + name="provider", + display_name="Provider name", + info='The provider to use.', + ), + TextInput( + name="model_name", + display_name="Model name", + info='The model to use.', + ), + DictInput( + name="authentication", + display_name="Authentication", + info='Authentication parameters. Use the Astra Portal to add the embedding provider integration to your Astra organization.', + is_list=True + ), + DictInput( + name="authentication2", + display_name="Authentication", + info='Authentication parameters. Use the Astra Portal to add the embedding provider integration to your Astra organization.', + is_list=False + ), + TextInput( + name="provider_api_key", + display_name="Provider API Key to authenticate to the external service", + info='An alternative to the Astra Authentication that let you use directly the API key of the provider.', + advanced=True + ), + DictInput( + name="parameters", + display_name="Additional model parameters", + info='Additional model parameters.', + advanced=True, + is_list=True + ), + ] + outputs = [ + Output(display_name="Configuration", name="config", method="build", types=["dict"]), + ] + + def build(self) -> dict[str, Any]: + return { + "collection_vector_service_options": { + "provider": self.provider, + "model_name": self.model_name, + "authentication": self.authentication, + "parameters": self.parameters + }, + "collection_embedding_api_key": self.provider_api_key + } diff --git a/src/backend/base/langflow/components/vectorstores/AstraDB.py b/src/backend/base/langflow/components/vectorstores/AstraDB.py index b53508237..9538eaef5 100644 --- a/src/backend/base/langflow/components/vectorstores/AstraDB.py +++ b/src/backend/base/langflow/components/vectorstores/AstraDB.py @@ -107,7 +107,7 @@ class AstraVectorStoreComponent(LCVectorStoreComponent): HandleInput( name="embedding", display_name="Embedding", - input_types=["Embeddings"], + input_types=["Embeddings", "dict"], ), StrInput( name="metadata_indexing_exclude", @@ -155,8 +155,12 @@ class AstraVectorStoreComponent(LCVectorStoreComponent): except KeyError: raise ValueError(f"Invalid setup mode: {self.setup_mode}") + if isinstance(self.embedding, dict): + embedding_dict = {"embedding": self.embedding} + else: + embedding_dict = self.embedding.to_dict() vector_store_kwargs = { - "embedding": self.embedding, + **embedding_dict, "collection_name": self.collection_name, "token": self.token, "api_endpoint": self.api_endpoint, diff --git a/src/backend/base/langflow/initial_setup/starter_projects/VectorStore-RAG-Flows.json b/src/backend/base/langflow/initial_setup/starter_projects/VectorStore-RAG-Flows.json index af140749f..df5d8f072 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/VectorStore-RAG-Flows.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/VectorStore-RAG-Flows.json @@ -6,316 +6,261 @@ "data": { "sourceHandle": { "dataType": "Prompt", - "id": "Prompt-jzPqb", + "id": "Prompt-VecUe", "name": "prompt", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", - "id": "OpenAIModel-ickkA", - "inputTypes": [ - "Message" - ], + "id": "OpenAIModel-PKrw7", + "inputTypes": ["Message"], "type": "str" } }, - "id": "reactflow__edge-Prompt-jzPqb{œdataTypeœ:œPromptœ,œidœ:œPrompt-jzPqbœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-ickkA{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-ickkAœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-Prompt-VecUe{œdataTypeœ:œPromptœ,œidœ:œPrompt-VecUeœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-PKrw7{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-PKrw7œ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "Prompt-jzPqb", - "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-jzPqbœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", + "source": "Prompt-VecUe", + "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-VecUeœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}", "style": { "stroke": "#555" }, - "target": "OpenAIModel-ickkA", - "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-ickkAœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + "target": "OpenAIModel-PKrw7", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-PKrw7œ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "OpenAIModel", - "id": "OpenAIModel-ickkA", + "id": "OpenAIModel-PKrw7", "name": "text_output", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", - "id": "ChatOutput-Zy354", - "inputTypes": [ - "Message", - "str" - ], + "id": "ChatOutput-nUD9B", + "inputTypes": ["Message", "str"], "type": "str" } }, - "id": "reactflow__edge-OpenAIModel-ickkA{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-ickkAœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-Zy354{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-Zy354œ,œinputTypesœ:[œMessageœ,œstrœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-OpenAIModel-PKrw7{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-PKrw7œ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-nUD9B{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-nUD9Bœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "OpenAIModel-ickkA", - "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-ickkAœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", + "source": "OpenAIModel-PKrw7", + "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-PKrw7œ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", "style": { "stroke": "#555" }, - "target": "ChatOutput-Zy354", - "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-Zy354œ, œinputTypesœ: [œMessageœ, œstrœ], œtypeœ: œstrœ}" + "target": "ChatOutput-nUD9B", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-nUD9Bœ, œinputTypesœ: [œMessageœ, œstrœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "File", - "id": "File-28ckd", + "id": "File-w2zxA", "name": "data", - "output_types": [ - "Data" - ] + "output_types": ["Data"] }, "targetHandle": { "fieldName": "data_input", - "id": "RecursiveCharacterTextSplitter-HVESL", - "inputTypes": [ - "Document", - "Data" - ], + "id": "RecursiveCharacterTextSplitter-CrApG", + "inputTypes": ["Document", "Data"], "type": "other" } }, - "id": "reactflow__edge-File-28ckd{œdataTypeœ:œFileœ,œidœ:œFile-28ckdœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-RecursiveCharacterTextSplitter-HVESL{œfieldNameœ:œdata_inputœ,œidœ:œRecursiveCharacterTextSplitter-HVESLœ,œinputTypesœ:[œDocumentœ,œDataœ],œtypeœ:œotherœ}", - "source": "File-28ckd", - "sourceHandle": "{œdataTypeœ: œFileœ, œidœ: œFile-28ckdœ, œnameœ: œdataœ, œoutput_typesœ: [œDataœ]}", - "target": "RecursiveCharacterTextSplitter-HVESL", - "targetHandle": "{œfieldNameœ: œdata_inputœ, œidœ: œRecursiveCharacterTextSplitter-HVESLœ, œinputTypesœ: [œDocumentœ, œDataœ], œtypeœ: œotherœ}" + "id": "reactflow__edge-File-w2zxA{œdataTypeœ:œFileœ,œidœ:œFile-w2zxAœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-RecursiveCharacterTextSplitter-CrApG{œfieldNameœ:œdata_inputœ,œidœ:œRecursiveCharacterTextSplitter-CrApGœ,œinputTypesœ:[œDocumentœ,œDataœ],œtypeœ:œotherœ}", + "source": "File-w2zxA", + "sourceHandle": "{œdataTypeœ: œFileœ, œidœ: œFile-w2zxAœ, œnameœ: œdataœ, œoutput_typesœ: [œDataœ]}", + "target": "RecursiveCharacterTextSplitter-CrApG", + "targetHandle": "{œfieldNameœ: œdata_inputœ, œidœ: œRecursiveCharacterTextSplitter-CrApGœ, œinputTypesœ: [œDocumentœ, œDataœ], œtypeœ: œotherœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "RecursiveCharacterTextSplitter", - "id": "RecursiveCharacterTextSplitter-HVESL", + "id": "RecursiveCharacterTextSplitter-CrApG", "name": "data", - "output_types": [ - "Data" - ] + "output_types": ["Data"] }, "targetHandle": { "fieldName": "vector_store_inputs", - "id": "AstraDB-irvai", - "inputTypes": [ - "Document", - "Data" - ], + "id": "AstraDB-rXo8b", + "inputTypes": ["Data"], "type": "other" } }, - "id": "reactflow__edge-RecursiveCharacterTextSplitter-HVESL{œdataTypeœ:œRecursiveCharacterTextSplitterœ,œidœ:œRecursiveCharacterTextSplitter-HVESLœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-AstraDB-irvai{œfieldNameœ:œvector_store_inputsœ,œidœ:œAstraDB-irvaiœ,œinputTypesœ:[œDocumentœ,œDataœ],œtypeœ:œotherœ}", - "source": "RecursiveCharacterTextSplitter-HVESL", - "sourceHandle": "{œdataTypeœ: œRecursiveCharacterTextSplitterœ, œidœ: œRecursiveCharacterTextSplitter-HVESLœ, œnameœ: œdataœ, œoutput_typesœ: [œDataœ]}", - "target": "AstraDB-irvai", - "targetHandle": "{œfieldNameœ: œvector_store_inputsœ, œidœ: œAstraDB-irvaiœ, œinputTypesœ: [œDocumentœ, œDataœ], œtypeœ: œotherœ}" + "id": "reactflow__edge-RecursiveCharacterTextSplitter-CrApG{œdataTypeœ:œRecursiveCharacterTextSplitterœ,œidœ:œRecursiveCharacterTextSplitter-CrApGœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-AstraDB-rXo8b{œfieldNameœ:œvector_store_inputsœ,œidœ:œAstraDB-rXo8bœ,œinputTypesœ:[œDocumentœ,œDataœ],œtypeœ:œotherœ}", + "source": "RecursiveCharacterTextSplitter-CrApG", + "sourceHandle": "{œdataTypeœ: œRecursiveCharacterTextSplitterœ, œidœ: œRecursiveCharacterTextSplitter-CrApGœ, œnameœ: œdataœ, œoutput_typesœ: [œDataœ]}", + "target": "AstraDB-rXo8b", + "targetHandle": "{œfieldNameœ: œvector_store_inputsœ, œidœ: œAstraDB-rXo8bœ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "OpenAIEmbeddings", - "id": "OpenAIEmbeddings-YeYtt", + "id": "OpenAIEmbeddings-PCoh9", "name": "embeddings", - "output_types": [ - "Embeddings" - ] + "output_types": ["Embeddings"] }, "targetHandle": { "fieldName": "embedding", - "id": "AstraDB-irvai", - "inputTypes": [ - "Embeddings" - ], + "id": "AstraDB-rXo8b", + "inputTypes": ["Embeddings", "dict"], "type": "other" } }, - "id": "reactflow__edge-OpenAIEmbeddings-YeYtt{œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-YeYttœ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}-AstraDB-irvai{œfieldNameœ:œembeddingœ,œidœ:œAstraDB-irvaiœ,œinputTypesœ:[œEmbeddingsœ],œtypeœ:œotherœ}", - "source": "OpenAIEmbeddings-YeYtt", - "sourceHandle": "{œdataTypeœ: œOpenAIEmbeddingsœ, œidœ: œOpenAIEmbeddings-YeYttœ, œnameœ: œembeddingsœ, œoutput_typesœ: [œEmbeddingsœ]}", - "target": "AstraDB-irvai", - "targetHandle": "{œfieldNameœ: œembeddingœ, œidœ: œAstraDB-irvaiœ, œinputTypesœ: [œEmbeddingsœ], œtypeœ: œotherœ}" + "id": "reactflow__edge-OpenAIEmbeddings-PCoh9{œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-PCoh9œ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}-AstraDB-rXo8b{œfieldNameœ:œembeddingœ,œidœ:œAstraDB-rXo8bœ,œinputTypesœ:[œEmbeddingsœ],œtypeœ:œotherœ}", + "source": "OpenAIEmbeddings-PCoh9", + "sourceHandle": "{œdataTypeœ: œOpenAIEmbeddingsœ, œidœ: œOpenAIEmbeddings-PCoh9œ, œnameœ: œembeddingsœ, œoutput_typesœ: [œEmbeddingsœ]}", + "target": "AstraDB-rXo8b", + "targetHandle": "{œfieldNameœ: œembeddingœ, œidœ: œAstraDB-rXo8bœ, œinputTypesœ: [œEmbeddingsœ, œdictœ], œtypeœ: œotherœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "ChatInput", - "id": "ChatInput-IY8UK", + "id": "ChatInput-sn9b4", "name": "message", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "search_input", - "id": "AstraDB-wANQu", - "inputTypes": [ - "Message", - "str" - ], + "id": "AstraDB-61WgV", + "inputTypes": ["Message", "str"], "type": "str" } }, - "id": "reactflow__edge-ChatInput-IY8UK{œdataTypeœ:œChatInputœ,œidœ:œChatInput-IY8UKœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-AstraDB-wANQu{œfieldNameœ:œsearch_inputœ,œidœ:œAstraDB-wANQuœ,œinputTypesœ:[œMessageœ,œstrœ],œtypeœ:œstrœ}", + "id": "reactflow__edge-ChatInput-sn9b4{œdataTypeœ:œChatInputœ,œidœ:œChatInput-sn9b4œ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-AstraDB-61WgV{œfieldNameœ:œsearch_inputœ,œidœ:œAstraDB-61WgVœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "ChatInput-IY8UK", - "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-IY8UKœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", - "target": "AstraDB-wANQu", - "targetHandle": "{œfieldNameœ: œsearch_inputœ, œidœ: œAstraDB-wANQuœ, œinputTypesœ: [œMessageœ, œstrœ], œtypeœ: œstrœ}" + "source": "ChatInput-sn9b4", + "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-sn9b4œ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", + "target": "AstraDB-61WgV", + "targetHandle": "{œfieldNameœ: œsearch_inputœ, œidœ: œAstraDB-61WgVœ, œinputTypesœ: [œMessageœ, œstrœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "OpenAIEmbeddings", - "id": "OpenAIEmbeddings-HoSp5", + "id": "OpenAIEmbeddings-HsV7O", "name": "embeddings", - "output_types": [ - "Embeddings" - ] + "output_types": ["Embeddings"] }, "targetHandle": { "fieldName": "embedding", - "id": "AstraDB-wANQu", - "inputTypes": [ - "Embeddings" - ], + "id": "AstraDB-61WgV", + "inputTypes": ["Embeddings", "dict"], "type": "other" } }, - "id": "reactflow__edge-OpenAIEmbeddings-HoSp5{œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-HoSp5œ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}-AstraDB-wANQu{œfieldNameœ:œembeddingœ,œidœ:œAstraDB-wANQuœ,œinputTypesœ:[œEmbeddingsœ],œtypeœ:œotherœ}", + "id": "reactflow__edge-OpenAIEmbeddings-HsV7O{œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-HsV7Oœ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}-AstraDB-61WgV{œfieldNameœ:œembeddingœ,œidœ:œAstraDB-61WgVœ,œinputTypesœ:[œEmbeddingsœ],œtypeœ:œotherœ}", "selected": false, - "source": "OpenAIEmbeddings-HoSp5", - "sourceHandle": "{œdataTypeœ: œOpenAIEmbeddingsœ, œidœ: œOpenAIEmbeddings-HoSp5œ, œnameœ: œembeddingsœ, œoutput_typesœ: [œEmbeddingsœ]}", - "target": "AstraDB-wANQu", - "targetHandle": "{œfieldNameœ: œembeddingœ, œidœ: œAstraDB-wANQuœ, œinputTypesœ: [œEmbeddingsœ], œtypeœ: œotherœ}" + "source": "OpenAIEmbeddings-HsV7O", + "sourceHandle": "{œdataTypeœ: œOpenAIEmbeddingsœ, œidœ: œOpenAIEmbeddings-HsV7Oœ, œnameœ: œembeddingsœ, œoutput_typesœ: [œEmbeddingsœ]}", + "target": "AstraDB-61WgV", + "targetHandle": "{œfieldNameœ: œembeddingœ, œidœ: œAstraDB-61WgVœ, œinputTypesœ: [œEmbeddingsœ, œdictœ], œtypeœ: œotherœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "AstraDB", - "id": "AstraDB-wANQu", + "id": "AstraDB-61WgV", "name": "search_results", - "output_types": [ - "Data" - ] + "output_types": ["Data"] }, "targetHandle": { "fieldName": "data", - "id": "ParseData-C9tUn", - "inputTypes": [ - "Data" - ], + "id": "ParseData-DXlFW", + "inputTypes": ["Data"], "type": "other" } }, - "id": "reactflow__edge-AstraDB-wANQu{œdataTypeœ:œAstraDBœ,œidœ:œAstraDB-wANQuœ,œnameœ:œsearch_resultsœ,œoutput_typesœ:[œDataœ]}-ParseData-C9tUn{œfieldNameœ:œdataœ,œidœ:œParseData-C9tUnœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}", + "id": "reactflow__edge-AstraDB-61WgV{œdataTypeœ:œAstraDBœ,œidœ:œAstraDB-61WgVœ,œnameœ:œsearch_resultsœ,œoutput_typesœ:[œDataœ]}-ParseData-DXlFW{œfieldNameœ:œdataœ,œidœ:œParseData-DXlFWœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}", "selected": false, - "source": "AstraDB-wANQu", - "sourceHandle": "{œdataTypeœ: œAstraDBœ, œidœ: œAstraDB-wANQuœ, œnameœ: œsearch_resultsœ, œoutput_typesœ: [œDataœ]}", - "target": "ParseData-C9tUn", - "targetHandle": "{œfieldNameœ: œdataœ, œidœ: œParseData-C9tUnœ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}" + "source": "AstraDB-61WgV", + "sourceHandle": "{œdataTypeœ: œAstraDBœ, œidœ: œAstraDB-61WgVœ, œnameœ: œsearch_resultsœ, œoutput_typesœ: [œDataœ]}", + "target": "ParseData-DXlFW", + "targetHandle": "{œfieldNameœ: œdataœ, œidœ: œParseData-DXlFWœ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "ParseData", - "id": "ParseData-C9tUn", + "id": "ParseData-DXlFW", "name": "text", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "input_value", - "id": "TextOutput-IxTee", - "inputTypes": [ - "Message" - ], + "id": "TextOutput-rT1Fj", + "inputTypes": ["Message"], "type": "str" } }, - "id": "reactflow__edge-ParseData-C9tUn{œdataTypeœ:œParseDataœ,œidœ:œParseData-C9tUnœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-TextOutput-IxTee{œfieldNameœ:œinput_valueœ,œidœ:œTextOutput-IxTeeœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", - "source": "ParseData-C9tUn", - "sourceHandle": "{œdataTypeœ: œParseDataœ, œidœ: œParseData-C9tUnœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", - "target": "TextOutput-IxTee", - "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œTextOutput-IxTeeœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" + "id": "reactflow__edge-ParseData-DXlFW{œdataTypeœ:œParseDataœ,œidœ:œParseData-DXlFWœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-TextOutput-rT1Fj{œfieldNameœ:œinput_valueœ,œidœ:œTextOutput-rT1Fjœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", + "source": "ParseData-DXlFW", + "sourceHandle": "{œdataTypeœ: œParseDataœ, œidœ: œParseData-DXlFWœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", + "target": "TextOutput-rT1Fj", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œTextOutput-rT1Fjœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "TextOutput", - "id": "TextOutput-IxTee", + "id": "TextOutput-rT1Fj", "name": "text", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "context", - "id": "Prompt-jzPqb", - "inputTypes": [ - "Message", - "Text" - ], + "id": "Prompt-VecUe", + "inputTypes": ["Message", "Text"], "type": "str" } }, - "id": "reactflow__edge-TextOutput-IxTee{œdataTypeœ:œTextOutputœ,œidœ:œTextOutput-IxTeeœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-jzPqb{œfieldNameœ:œcontextœ,œidœ:œPrompt-jzPqbœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", - "source": "TextOutput-IxTee", - "sourceHandle": "{œdataTypeœ: œTextOutputœ, œidœ: œTextOutput-IxTeeœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-jzPqb", - "targetHandle": "{œfieldNameœ: œcontextœ, œidœ: œPrompt-jzPqbœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + "id": "reactflow__edge-TextOutput-rT1Fj{œdataTypeœ:œTextOutputœ,œidœ:œTextOutput-rT1Fjœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-VecUe{œfieldNameœ:œcontextœ,œidœ:œPrompt-VecUeœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "source": "TextOutput-rT1Fj", + "sourceHandle": "{œdataTypeœ: œTextOutputœ, œidœ: œTextOutput-rT1Fjœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-VecUe", + "targetHandle": "{œfieldNameœ: œcontextœ, œidœ: œPrompt-VecUeœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" }, { "className": "", "data": { "sourceHandle": { "dataType": "ChatInput", - "id": "ChatInput-IY8UK", + "id": "ChatInput-sn9b4", "name": "message", - "output_types": [ - "Message" - ] + "output_types": ["Message"] }, "targetHandle": { "fieldName": "question", - "id": "Prompt-jzPqb", - "inputTypes": [ - "Message", - "Text" - ], + "id": "Prompt-VecUe", + "inputTypes": ["Message", "Text"], "type": "str" } }, - "id": "reactflow__edge-ChatInput-IY8UK{œdataTypeœ:œChatInputœ,œidœ:œChatInput-IY8UKœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-jzPqb{œfieldNameœ:œquestionœ,œidœ:œPrompt-jzPqbœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", - "source": "ChatInput-IY8UK", - "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-IY8UKœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", - "target": "Prompt-jzPqb", - "targetHandle": "{œfieldNameœ: œquestionœ, œidœ: œPrompt-jzPqbœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" + "id": "reactflow__edge-ChatInput-sn9b4{œdataTypeœ:œChatInputœ,œidœ:œChatInput-sn9b4œ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-VecUe{œfieldNameœ:œquestionœ,œidœ:œPrompt-VecUeœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}", + "source": "ChatInput-sn9b4", + "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-sn9b4œ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", + "target": "Prompt-VecUe", + "targetHandle": "{œfieldNameœ: œquestionœ, œidœ: œPrompt-VecUeœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}" } ], "nodes": [ { "data": { - "id": "ChatInput-IY8UK", + "id": "ChatInput-sn9b4", "node": { - "base_classes": [ - "Text", - "str", - "object", - "Record" - ], + "base_classes": ["Text", "str", "object", "Record"], "beta": false, "custom_fields": { "input_value": null, @@ -336,13 +281,10 @@ { "cache": true, "display_name": "Message", - "hidden": false, "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -364,7 +306,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from langflow.base.data.utils import IMG_FILE_TYPES, TEXT_FILE_TYPES\nfrom langflow.base.io.chat import ChatComponent\nfrom langflow.io import DropdownInput, FileInput, MultilineInput, Output, MessageTextInput\nfrom langflow.schema.message import Message\n\n\nclass ChatInput(ChatComponent):\n display_name = \"Chat Input\"\n description = \"Get chat inputs from the Playground.\"\n icon = \"ChatInput\"\n\n inputs = [\n MultilineInput(\n name=\"input_value\",\n display_name=\"Text\",\n value=\"\",\n info=\"Message to be passed as input.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"User\",\n info=\"Type of sender.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"sender_name\",\n display_name=\"Sender Name\",\n info=\"Name of the sender.\",\n value=\"User\",\n advanced=True,\n ),\n MessageTextInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n FileInput(\n name=\"files\",\n display_name=\"Files\",\n file_types=TEXT_FILE_TYPES + IMG_FILE_TYPES,\n info=\"Files to be sent with the message.\",\n advanced=True,\n is_list=True,\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n files=self.files,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n" + "value": "from langflow.base.data.utils import IMG_FILE_TYPES, TEXT_FILE_TYPES\nfrom langflow.base.io.chat import ChatComponent\nfrom langflow.io import DropdownInput, FileInput, Output, TextInput\nfrom langflow.schema.message import Message\n\n\nclass ChatInput(ChatComponent):\n display_name = \"Chat Input\"\n description = \"Get chat inputs from the Playground.\"\n icon = \"ChatInput\"\n\n inputs = [\n TextInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n value=\"\",\n info=\"Message to be passed as input.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"User\",\n info=\"Type of sender.\",\n advanced=True,\n ),\n TextInput(\n name=\"sender_name\",\n type=str,\n display_name=\"Sender Name\",\n info=\"Name of the sender.\",\n value=\"User\",\n advanced=True,\n ),\n TextInput(\n name=\"session_id\", type=str, display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True\n ),\n FileInput(\n name=\"files\",\n display_name=\"Files\",\n file_types=TEXT_FILE_TYPES + IMG_FILE_TYPES,\n info=\"Files to be sent with the message.\",\n advanced=True,\n is_list=True,\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n files=self.files,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n" }, "input_value": { "advanced": false, @@ -373,10 +315,7 @@ "fileTypes": [], "file_path": "", "info": "Message to be passed as input.", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "multiline": true, @@ -387,7 +326,7 @@ "show": true, "title_case": false, "type": "str", - "value": "" + "value": "uau" }, "sender": { "advanced": true, @@ -396,17 +335,12 @@ "fileTypes": [], "file_path": "", "info": "Type of sender.", - "input_types": [ - "Text" - ], + "input_types": ["Text"], "list": true, "load_from_db": false, "multiline": false, "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "password": false, "placeholder": "", "required": false, @@ -422,10 +356,7 @@ "fileTypes": [], "file_path": "", "info": "Name of the sender.", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "multiline": true, @@ -445,10 +376,7 @@ "fileTypes": [], "file_path": "", "info": "Session ID for the message.", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "multiline": true, @@ -467,7 +395,7 @@ }, "dragging": false, "height": 309, - "id": "ChatInput-IY8UK", + "id": "ChatInput-sn9b4", "position": { "x": 702.4571951501161, "y": 119.7726926425525 @@ -485,11 +413,9 @@ "description": "Display a text output in the Playground.", "display_name": "Extracted Chunks", "edited": false, - "id": "TextOutput-IxTee", + "id": "TextOutput-rT1Fj", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -497,9 +423,7 @@ "display_name": "Extracted Chunks", "documentation": "", "edited": true, - "field_order": [ - "input_value" - ], + "field_order": ["input_value"], "frozen": false, "icon": "type", "output_types": [], @@ -507,12 +431,11 @@ { "cache": true, "display_name": "Text", + "hidden": false, "method": "text_response", "name": "text", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -535,16 +458,14 @@ "show": true, "title_case": false, "type": "code", - "value": "from langflow.base.io.text import TextComponent\nfrom langflow.io import Output, MessageTextInput\nfrom langflow.schema.message import Message\n\n\nclass TextOutputComponent(TextComponent):\n display_name = \"Text Output\"\n description = \"Display a text output in the Playground.\"\n icon = \"type\"\n\n inputs = [\n MessageTextInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Text to be passed as output.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def text_response(self) -> Message:\n message = Message(\n text=self.input_value,\n )\n self.status = self.input_value\n return message\n" + "value": "from langflow.base.io.text import TextComponent\nfrom langflow.io import Output\nfrom langflow.io import TextInput\nfrom langflow.schema.message import Message\n\n\nclass TextOutputComponent(TextComponent):\n display_name = \"Text Output\"\n description = \"Display a text output in the Playground.\"\n icon = \"type\"\n\n inputs = [\n TextInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Text to be passed as output.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def text_response(self) -> Message:\n message = Message(\n text=self.input_value,\n )\n self.status = self.input_value\n return message\n" }, "input_value": { "advanced": false, "display_name": "Text", "dynamic": false, "info": "Text to be passed as output.", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, "name": "input_value", @@ -561,7 +482,7 @@ }, "dragging": false, "height": 309, - "id": "TextOutput-IxTee", + "id": "TextOutput-rT1Fj", "position": { "x": 2439.792450398153, "y": 661.149562774499 @@ -576,11 +497,9 @@ }, { "data": { - "id": "OpenAIEmbeddings-HoSp5", + "id": "OpenAIEmbeddings-HsV7O", "node": { - "base_classes": [ - "Embeddings" - ], + "base_classes": ["Embeddings"], "beta": false, "custom_fields": { "allowed_special": null, @@ -618,13 +537,10 @@ { "cache": true, "display_name": "Embeddings", - "hidden": false, "method": "build_embeddings", "name": "embeddings", "selected": "Embeddings", - "types": [ - "Embeddings" - ], + "types": ["Embeddings"], "value": "__UNDEFINED__" } ], @@ -649,10 +565,7 @@ "display_name": "Client", "dynamic": false, "info": "", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "name": "client", @@ -679,7 +592,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from langchain_openai.embeddings.base import OpenAIEmbeddings\n\nfrom langflow.base.embeddings.model import LCEmbeddingsModel\nfrom langflow.field_typing import Embeddings\nfrom langflow.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, SecretStrInput, MessageTextInput\n\n\nclass OpenAIEmbeddingsComponent(LCEmbeddingsModel):\n display_name = \"OpenAI Embeddings\"\n description = \"Generate embeddings using OpenAI models.\"\n icon = \"OpenAI\"\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=[\n \"text-embedding-3-small\",\n \"text-embedding-3-large\",\n \"text-embedding-ada-002\",\n ],\n value=\"text-embedding-3-small\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n SecretStrInput(name=\"openai_api_base\", display_name=\"OpenAI API Base\", advanced=True),\n SecretStrInput(name=\"openai_api_key\", display_name=\"OpenAI API Key\"),\n SecretStrInput(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 ]\n\n def build_embeddings(self) -> Embeddings:\n return OpenAIEmbeddings(\n tiktoken_enabled=self.tiktoken_enable,\n default_headers=self.default_headers,\n default_query=self.default_query,\n allowed_special=\"all\",\n disallowed_special=\"all\",\n chunk_size=self.chunk_size,\n deployment=self.deployment,\n embedding_ctx_length=self.embedding_ctx_length,\n max_retries=self.max_retries,\n model=self.model,\n model_kwargs=self.model_kwargs,\n base_url=self.openai_api_base,\n api_key=self.openai_api_key,\n openai_api_type=self.openai_api_type,\n api_version=self.openai_api_version,\n organization=self.openai_organization,\n openai_proxy=self.openai_proxy,\n timeout=self.request_timeout or None,\n show_progress_bar=self.show_progress_bar,\n skip_empty=self.skip_empty,\n tiktoken_model_name=self.tiktoken_model_name,\n )\n" + "value": "from langchain_openai.embeddings.base import OpenAIEmbeddings\n\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.field_typing import Embeddings\nfrom langflow.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, Output, SecretStrInput, TextInput\n\n\nclass OpenAIEmbeddingsComponent(LCModelComponent):\n display_name = \"OpenAI Embeddings\"\n description = \"Generate embeddings using OpenAI models.\"\n icon = \"OpenAI\"\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 TextInput(name=\"client\", display_name=\"Client\", advanced=True),\n TextInput(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=[\n \"text-embedding-3-small\",\n \"text-embedding-3-large\",\n \"text-embedding-ada-002\",\n ],\n value=\"text-embedding-3-small\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n SecretStrInput(name=\"openai_api_base\", display_name=\"OpenAI API Base\", advanced=True),\n SecretStrInput(name=\"openai_api_key\", display_name=\"OpenAI API Key\"),\n SecretStrInput(name=\"openai_api_type\", display_name=\"OpenAI API Type\", advanced=True),\n TextInput(name=\"openai_api_version\", display_name=\"OpenAI API Version\", advanced=True),\n TextInput(\n name=\"openai_organization\",\n display_name=\"OpenAI Organization\",\n advanced=True,\n ),\n TextInput(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 TextInput(\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 ]\n\n outputs = [\n Output(display_name=\"Embeddings\", name=\"embeddings\", method=\"build_embeddings\"),\n ]\n\n def build_embeddings(self) -> Embeddings:\n return OpenAIEmbeddings(\n tiktoken_enabled=self.tiktoken_enable,\n default_headers=self.default_headers,\n default_query=self.default_query,\n allowed_special=\"all\",\n disallowed_special=\"all\",\n chunk_size=self.chunk_size,\n deployment=self.deployment,\n embedding_ctx_length=self.embedding_ctx_length,\n max_retries=self.max_retries,\n model=self.model,\n model_kwargs=self.model_kwargs,\n base_url=self.openai_api_base,\n api_key=self.openai_api_key,\n openai_api_type=self.openai_api_type,\n api_version=self.openai_api_version,\n organization=self.openai_organization,\n openai_proxy=self.openai_proxy,\n timeout=self.request_timeout or None,\n show_progress_bar=self.show_progress_bar,\n skip_empty=self.skip_empty,\n tiktoken_model_name=self.tiktoken_model_name,\n )\n" }, "default_headers": { "advanced": true, @@ -714,10 +627,7 @@ "display_name": "Deployment", "dynamic": false, "info": "", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "name": "deployment", @@ -818,7 +728,7 @@ "show": true, "title_case": false, "type": "str", - "value": "" + "value": "OPENAI_API_KEY" }, "openai_api_type": { "advanced": true, @@ -841,10 +751,7 @@ "display_name": "OpenAI API Version", "dynamic": false, "info": "", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "name": "openai_api_version", @@ -860,10 +767,7 @@ "display_name": "OpenAI Organization", "dynamic": false, "info": "", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "name": "openai_organization", @@ -879,10 +783,7 @@ "display_name": "OpenAI Proxy", "dynamic": false, "info": "", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "name": "openai_proxy", @@ -954,10 +855,7 @@ "display_name": "TikToken Model Name", "dynamic": false, "info": "", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "name": "tiktoken_model_name", @@ -974,7 +872,7 @@ }, "dragging": false, "height": 395, - "id": "OpenAIEmbeddings-HoSp5", + "id": "OpenAIEmbeddings-HsV7O", "position": { "x": 690.5967478991026, "y": 597.6680004855787 @@ -989,34 +887,35 @@ }, { "data": { - "description": "Generates text using OpenAI LLMs.", - "display_name": "OpenAI", - "edited": false, - "id": "OpenAIModel-ickkA", + "id": "OpenAIModel-PKrw7", "node": { - "base_classes": [ - "LanguageModel", - "Message" - ], + "base_classes": ["object", "Text", "str"], "beta": false, - "conditional_paths": [], - "custom_fields": {}, + "custom_fields": { + "input_value": null, + "max_tokens": null, + "model_kwargs": null, + "model_name": null, + "openai_api_base": null, + "openai_api_key": null, + "stream": null, + "system_message": null, + "temperature": null + }, "description": "Generates text using OpenAI LLMs.", "display_name": "OpenAI", "documentation": "", - "edited": true, + "field_formatters": {}, "field_order": [ - "input_value", "max_tokens", "model_kwargs", - "output_schema", "model_name", "openai_api_base", "openai_api_key", "temperature", - "stream", + "input_value", "system_message", - "seed" + "stream" ], "frozen": false, "icon": "OpenAI", @@ -1025,13 +924,10 @@ { "cache": true, "display_name": "Text", - "hidden": false, "method": "text_response", "name": "text_output", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" }, { @@ -1039,14 +935,11 @@ "display_name": "Language Model", "method": "build_model", "name": "model_output", - "selected": "LanguageModel", - "types": [ - "LanguageModel" - ], + "selected": "BaseLanguageModel", + "types": ["BaseLanguageModel"], "value": "__UNDEFINED__" } ], - "pinned": false, "template": { "_type": "Component", "code": { @@ -1065,19 +958,21 @@ "show": true, "title_case": false, "type": "code", - "value": "import operator\nfrom functools import reduce\n\nfrom langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import LanguageModel\nfrom langflow.inputs import (\n BoolInput,\n DictInput,\n DropdownInput,\n FloatInput,\n IntInput,\n MessageInput,\n SecretStrInput,\n StrInput,\n)\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n inputs = [\n MessageInput(name=\"input_value\", display_name=\"Input\"),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n DictInput(\n name=\"output_schema\",\n is_list=True,\n display_name=\"Schema\",\n advanced=True,\n info=\"The schema for the Output of the model. You must pass the word JSON in the prompt. If left blank, JSON mode will be disabled.\",\n ),\n DropdownInput(\n name=\"model_name\", display_name=\"Model Name\", advanced=False, options=MODEL_NAMES, value=MODEL_NAMES[0]\n ),\n StrInput(\n name=\"openai_api_base\",\n display_name=\"OpenAI API Base\",\n advanced=True,\n info=\"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. You can change this to use other APIs like JinaChat, LocalAI and Prem.\",\n ),\n SecretStrInput(\n name=\"openai_api_key\",\n display_name=\"OpenAI API Key\",\n info=\"The OpenAI API Key to use for the OpenAI model.\",\n advanced=False,\n value=\"OPENAI_API_KEY\",\n ),\n FloatInput(name=\"temperature\", display_name=\"Temperature\", value=0.1),\n BoolInput(name=\"stream\", display_name=\"Stream\", info=STREAM_INFO_TEXT, advanced=True),\n StrInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"System message to pass to the model.\",\n advanced=True,\n ),\n IntInput(\n name=\"seed\",\n display_name=\"Seed\",\n info=\"The seed controls the reproducibility of the job.\",\n advanced=True,\n value=1,\n ),\n ]\n\n def build_model(self) -> LanguageModel:\n # self.output_schea is a list of dictionaries\n # let's convert it to a dictionary\n output_schema_dict: dict[str, str] = reduce(operator.ior, self.output_schema or {}, {})\n openai_api_key = self.openai_api_key\n temperature = self.temperature\n model_name: str = self.model_name\n max_tokens = self.max_tokens\n model_kwargs = self.model_kwargs or {}\n openai_api_base = self.openai_api_base or \"https://api.openai.com/v1\"\n json_mode = bool(output_schema_dict)\n seed = self.seed\n model_kwargs[\"seed\"] = seed\n\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs,\n model=model_name,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature or 0.1,\n )\n if json_mode:\n output = output.with_structured_output(schema=output_schema_dict, method=\"json_mode\") # type: ignore\n\n return output\n\n def _get_exception_message(self, e: Exception):\n \"\"\"\n Get a message from an OpenAI exception.\n\n Args:\n exception (Exception): The exception to get the message from.\n\n Returns:\n str: The message from the exception.\n \"\"\"\n\n try:\n from openai import BadRequestError\n except ImportError:\n return\n if isinstance(e, BadRequestError):\n message = e.body.get(\"message\") # type: ignore\n if message:\n return message\n return\n" + "value": "import operator\nfrom functools import reduce\n\nfrom langchain_openai import ChatOpenAI\nfrom pydantic.v1 import SecretStr\n\nfrom langflow.base.constants import STREAM_INFO_TEXT\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import MODEL_NAMES\nfrom langflow.field_typing import BaseLanguageModel\nfrom langflow.inputs import (\n BoolInput,\n DictInput,\n DropdownInput,\n FloatInput,\n IntInput,\n MessageInput,\n SecretStrInput,\n StrInput,\n)\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass OpenAIModelComponent(LCModelComponent):\n display_name = \"OpenAI\"\n description = \"Generates text using OpenAI LLMs.\"\n icon = \"OpenAI\"\n\n inputs = [\n MessageInput(name=\"input_value\", display_name=\"Input\"),\n IntInput(\n name=\"max_tokens\",\n display_name=\"Max Tokens\",\n advanced=True,\n info=\"The maximum number of tokens to generate. Set to 0 for unlimited tokens.\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n DictInput(\n name=\"output_schema\",\n is_list=True,\n display_name=\"Schema\",\n advanced=True,\n info=\"The schema for the Output of the model. You must pass the word JSON in the prompt. If left blank, JSON mode will be disabled.\",\n ),\n DropdownInput(\n name=\"model_name\", display_name=\"Model Name\", advanced=False, options=MODEL_NAMES, value=MODEL_NAMES[0]\n ),\n StrInput(\n name=\"openai_api_base\",\n display_name=\"OpenAI API Base\",\n advanced=True,\n info=\"The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. You can change this to use other APIs like JinaChat, LocalAI and Prem.\",\n ),\n SecretStrInput(\n name=\"openai_api_key\",\n display_name=\"OpenAI API Key\",\n info=\"The OpenAI API Key to use for the OpenAI model.\",\n advanced=False,\n value=\"OPENAI_API_KEY\",\n ),\n FloatInput(name=\"temperature\", display_name=\"Temperature\", value=0.1),\n BoolInput(name=\"stream\", display_name=\"Stream\", info=STREAM_INFO_TEXT, advanced=True),\n StrInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"System message to pass to the model.\",\n advanced=True,\n ),\n IntInput(\n name=\"seed\",\n display_name=\"Seed\",\n info=\"The seed controls the reproducibility of the job.\",\n advanced=True,\n value=1,\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text_output\", method=\"text_response\"),\n Output(display_name=\"Language Model\", name=\"model_output\", method=\"build_model\"),\n ]\n\n def text_response(self) -> Message:\n input_value = self.input_value\n stream = self.stream\n system_message = self.system_message\n output = self.build_model()\n result = self.get_chat_result(output, stream, input_value, system_message)\n self.status = result\n return result\n\n def build_model(self) -> BaseLanguageModel:\n # self.output_schea is a list of dictionaries\n # let's convert it to a dictionary\n output_schema_dict = reduce(operator.ior, self.output_schema or {}, {})\n openai_api_key = self.openai_api_key\n temperature = self.temperature\n model_name = self.model_name\n max_tokens = self.max_tokens\n model_kwargs = self.model_kwargs\n openai_api_base = self.openai_api_base or \"https://api.openai.com/v1\"\n json_mode = bool(output_schema_dict)\n seed = self.seed\n if openai_api_key:\n api_key = SecretStr(openai_api_key)\n else:\n api_key = None\n output = ChatOpenAI(\n max_tokens=max_tokens or None,\n model_kwargs=model_kwargs or {},\n model=model_name or None,\n base_url=openai_api_base,\n api_key=api_key,\n temperature=temperature or 0.1,\n seed=seed,\n )\n if json_mode:\n output = output.with_structured_output(schema=output_schema_dict, method=\"json_mode\")\n\n return output\n" }, "input_value": { "advanced": false, "display_name": "Input", "dynamic": false, + "fileTypes": [], + "file_path": "", "info": "", - "input_types": [ - "Message" - ], + "input_types": ["Message"], "list": false, "load_from_db": false, + "multiline": true, "name": "input_value", + "password": false, "placeholder": "", "required": false, "show": true, @@ -1089,35 +984,53 @@ "advanced": true, "display_name": "Max Tokens", "dynamic": false, + "fileTypes": [], + "file_path": "", "info": "The maximum number of tokens to generate. Set to 0 for unlimited tokens.", + "input_types": ["Text"], "list": false, + "load_from_db": false, + "multiline": false, "name": "max_tokens", + "password": false, "placeholder": "", "required": false, "show": true, "title_case": false, - "type": "int", + "type": "str", "value": "" }, "model_kwargs": { "advanced": true, "display_name": "Model Kwargs", "dynamic": false, + "fileTypes": [], + "file_path": "", "info": "", + "input_types": ["Text"], "list": false, + "load_from_db": false, + "multiline": false, "name": "model_kwargs", + "password": false, "placeholder": "", "required": false, "show": true, "title_case": false, - "type": "dict", - "value": {} + "type": "str", + "value": "" }, "model_name": { "advanced": false, "display_name": "Model Name", "dynamic": false, + "fileTypes": [], + "file_path": "", "info": "", + "input_types": ["Text"], + "list": true, + "load_from_db": false, + "multiline": false, "name": "model_name", "options": [ "gpt-4o", @@ -1126,6 +1039,7 @@ "gpt-3.5-turbo", "gpt-3.5-turbo-0125" ], + "password": false, "placeholder": "", "required": false, "show": true, @@ -1137,10 +1051,15 @@ "advanced": true, "display_name": "OpenAI API Base", "dynamic": false, + "fileTypes": [], + "file_path": "", "info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1. You can change this to use other APIs like JinaChat, LocalAI and Prem.", + "input_types": ["Text"], "list": false, "load_from_db": false, + "multiline": true, "name": "openai_api_base", + "password": false, "placeholder": "", "required": false, "show": true, @@ -1152,9 +1071,13 @@ "advanced": false, "display_name": "OpenAI API Key", "dynamic": false, + "fileTypes": [], + "file_path": "", "info": "The OpenAI API Key to use for the OpenAI model.", "input_types": [], + "list": false, "load_from_db": true, + "multiline": false, "name": "openai_api_key", "password": true, "placeholder": "", @@ -1162,58 +1085,41 @@ "show": true, "title_case": false, "type": "str", - "value": "" - }, - "output_schema": { - "advanced": true, - "display_name": "Schema", - "dynamic": false, - "info": "The schema for the Output of the model. You must pass the word JSON in the prompt. If left blank, JSON mode will be disabled.", - "list": true, - "name": "output_schema", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "type": "dict", - "value": {} - }, - "seed": { - "advanced": true, - "display_name": "Seed", - "dynamic": false, - "info": "The seed controls the reproducibility of the job.", - "list": false, - "name": "seed", - "placeholder": "", - "required": false, - "show": true, - "title_case": false, - "type": "int", - "value": 1 + "value": "OPENAI_API_KEY" }, "stream": { "advanced": true, "display_name": "Stream", "dynamic": false, + "fileTypes": [], + "file_path": "", "info": "Stream the response from the model. Streaming works only in Chat.", + "input_types": ["Text"], "list": false, + "load_from_db": false, + "multiline": false, "name": "stream", + "password": false, "placeholder": "", "required": false, "show": true, "title_case": false, - "type": "bool", + "type": "str", "value": false }, "system_message": { "advanced": true, "display_name": "System Message", "dynamic": false, + "fileTypes": [], + "file_path": "", "info": "System message to pass to the model.", + "input_types": ["Text"], "list": false, "load_from_db": false, + "multiline": true, "name": "system_message", + "password": false, "placeholder": "", "required": false, "show": true, @@ -1225,14 +1131,20 @@ "advanced": false, "display_name": "Temperature", "dynamic": false, + "fileTypes": [], + "file_path": "", "info": "", + "input_types": ["Text"], "list": false, + "load_from_db": false, + "multiline": false, "name": "temperature", + "password": false, "placeholder": "", "required": false, "show": true, "title_case": false, - "type": "float", + "type": "str", "value": 0.1 } } @@ -1240,8 +1152,8 @@ "type": "OpenAIModel" }, "dragging": false, - "height": 623, - "id": "OpenAIModel-ickkA", + "height": 639, + "id": "OpenAIModel-PKrw7", "position": { "x": 3410.117202077183, "y": 431.2038048137648 @@ -1258,20 +1170,13 @@ "data": { "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", - "id": "Prompt-jzPqb", + "id": "Prompt-VecUe", "node": { - "base_classes": [ - "object", - "str", - "Text" - ], + "base_classes": ["object", "str", "Text"], "beta": false, "conditional_paths": [], "custom_fields": { - "template": [ - "context", - "question" - ] + "template": ["context", "question"] }, "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", @@ -1290,13 +1195,10 @@ { "cache": true, "display_name": "Prompt Message", - "hidden": false, "method": "build_prompt", "name": "prompt", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -1319,7 +1221,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from langflow.custom import Component\nfrom langflow.io import Output, PromptInput\nfrom langflow.schema.message import Message\n\n\nclass PromptComponent(Component):\n display_name: str = \"Prompt\"\n description: str = \"Create a prompt template with dynamic variables.\"\n icon = \"prompts\"\n trace_type = \"prompt\"\n\n inputs = [\n PromptInput(name=\"template\", display_name=\"Template\"),\n ]\n\n outputs = [\n Output(display_name=\"Prompt Message\", name=\"prompt\", method=\"build_prompt\"),\n ]\n\n async def build_prompt(\n self,\n ) -> Message:\n prompt = await Message.from_template_and_variables(**self._attributes)\n self.status = prompt.text\n return prompt\n" + "value": "from langflow.custom import Component\nfrom langflow.io import Output, PromptInput\nfrom langflow.schema.message import Message\n\n\nclass PromptComponent(Component):\n display_name: str = \"Prompt\"\n description: str = \"Create a prompt template with dynamic variables.\"\n icon = \"prompts\"\n\n inputs = [\n PromptInput(name=\"template\", display_name=\"Template\"),\n ]\n\n outputs = [\n Output(display_name=\"Prompt Message\", name=\"prompt\", method=\"build_prompt\"),\n ]\n\n async def build_prompt(\n self,\n ) -> Message:\n prompt = await Message.from_template_and_variables(**self._arguments)\n self.status = prompt.text\n return prompt\n" }, "context": { "advanced": false, @@ -1329,10 +1231,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -1353,10 +1252,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Message", - "Text" - ], + "input_types": ["Message", "Text"], "list": false, "load_from_db": false, "multiline": true, @@ -1376,9 +1272,7 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": [ - "Text" - ], + "input_types": ["Text"], "list": false, "load_from_db": false, "multiline": false, @@ -1397,7 +1291,7 @@ }, "dragging": false, "height": 525, - "id": "Prompt-jzPqb", + "id": "Prompt-VecUe", "position": { "x": 2941.2776396951576, "y": 446.43037366459487 @@ -1412,14 +1306,9 @@ }, { "data": { - "id": "ChatOutput-Zy354", + "id": "ChatOutput-nUD9B", "node": { - "base_classes": [ - "object", - "Text", - "Record", - "str" - ], + "base_classes": ["object", "Text", "Record", "str"], "beta": false, "custom_fields": { "input_value": null, @@ -1444,9 +1333,7 @@ "method": "message_response", "name": "message", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -1468,7 +1355,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.io import DropdownInput, Output, MessageTextInput\nfrom langflow.schema.message import Message\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n MessageTextInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Message to be passed as output.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n MessageTextInput(\n name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True\n ),\n MessageTextInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n MessageTextInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n" + "value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.io import DropdownInput, Output, TextInput\nfrom langflow.schema.message import Message\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n TextInput(\n name=\"input_value\",\n display_name=\"Text\",\n info=\"Message to be passed as output.\",\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n TextInput(\n name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True\n ),\n TextInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n TextInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n" }, "input_value": { "advanced": false, @@ -1477,10 +1364,7 @@ "fileTypes": [], "file_path": "", "info": "Message to be passed as output.", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "multiline": true, @@ -1500,17 +1384,12 @@ "fileTypes": [], "file_path": "", "info": "Type of sender.", - "input_types": [ - "Text" - ], + "input_types": ["Text"], "list": true, "load_from_db": false, "multiline": false, "name": "sender", - "options": [ - "Machine", - "User" - ], + "options": ["Machine", "User"], "password": false, "placeholder": "", "required": false, @@ -1526,10 +1405,7 @@ "fileTypes": [], "file_path": "", "info": "Name of the sender.", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "multiline": true, @@ -1549,10 +1425,7 @@ "fileTypes": [], "file_path": "", "info": "Session ID for the message.", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "multiline": true, @@ -1571,7 +1444,7 @@ }, "dragging": false, "height": 309, - "id": "ChatOutput-Zy354", + "id": "ChatOutput-nUD9B", "position": { "x": 3998.201592537035, "y": 603.4216529723935 @@ -1586,11 +1459,9 @@ }, { "data": { - "id": "File-28ckd", + "id": "File-w2zxA", "node": { - "base_classes": [ - "Record" - ], + "base_classes": ["Record"], "beta": false, "custom_fields": { "path": null, @@ -1608,13 +1479,10 @@ { "cache": true, "display_name": "Data", - "hidden": false, "method": "load_file", "name": "data", "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" } ], @@ -1662,7 +1530,7 @@ "ts", "tsx" ], - "file_path": "c9e0cb46-c474-451a-8496-413f58481d92/Context Once.json", + "file_path": "0433f955-c8cc-4d24-a2bf-e8cd0d11f99c/_Cadastro_de_Pessoa_Fisica_Editável__-_Assinado[1] (1).pdf", "info": "Supported file types: txt, md, mdx, csv, json, yaml, yml, xml, html, htm, pdf, docx, py, sh, sql, js, ts, tsx", "list": false, "name": "path", @@ -1693,7 +1561,7 @@ }, "dragging": false, "height": 301, - "id": "File-28ckd", + "id": "File-w2zxA", "position": { "x": 2257.233450682836, "y": 1747.5389618367233 @@ -1708,11 +1576,9 @@ }, { "data": { - "id": "OpenAIEmbeddings-YeYtt", + "id": "OpenAIEmbeddings-PCoh9", "node": { - "base_classes": [ - "Embeddings" - ], + "base_classes": ["Embeddings"], "beta": false, "custom_fields": { "allowed_special": null, @@ -1750,13 +1616,10 @@ { "cache": true, "display_name": "Embeddings", - "hidden": false, "method": "build_embeddings", "name": "embeddings", "selected": "Embeddings", - "types": [ - "Embeddings" - ], + "types": ["Embeddings"], "value": "__UNDEFINED__" } ], @@ -1781,10 +1644,7 @@ "display_name": "Client", "dynamic": false, "info": "", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "name": "client", @@ -1811,7 +1671,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from langchain_openai.embeddings.base import OpenAIEmbeddings\n\nfrom langflow.base.embeddings.model import LCEmbeddingsModel\nfrom langflow.field_typing import Embeddings\nfrom langflow.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, SecretStrInput, MessageTextInput\n\n\nclass OpenAIEmbeddingsComponent(LCEmbeddingsModel):\n display_name = \"OpenAI Embeddings\"\n description = \"Generate embeddings using OpenAI models.\"\n icon = \"OpenAI\"\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=[\n \"text-embedding-3-small\",\n \"text-embedding-3-large\",\n \"text-embedding-ada-002\",\n ],\n value=\"text-embedding-3-small\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n SecretStrInput(name=\"openai_api_base\", display_name=\"OpenAI API Base\", advanced=True),\n SecretStrInput(name=\"openai_api_key\", display_name=\"OpenAI API Key\"),\n SecretStrInput(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 ]\n\n def build_embeddings(self) -> Embeddings:\n return OpenAIEmbeddings(\n tiktoken_enabled=self.tiktoken_enable,\n default_headers=self.default_headers,\n default_query=self.default_query,\n allowed_special=\"all\",\n disallowed_special=\"all\",\n chunk_size=self.chunk_size,\n deployment=self.deployment,\n embedding_ctx_length=self.embedding_ctx_length,\n max_retries=self.max_retries,\n model=self.model,\n model_kwargs=self.model_kwargs,\n base_url=self.openai_api_base,\n api_key=self.openai_api_key,\n openai_api_type=self.openai_api_type,\n api_version=self.openai_api_version,\n organization=self.openai_organization,\n openai_proxy=self.openai_proxy,\n timeout=self.request_timeout or None,\n show_progress_bar=self.show_progress_bar,\n skip_empty=self.skip_empty,\n tiktoken_model_name=self.tiktoken_model_name,\n )\n" + "value": "from langchain_openai.embeddings.base import OpenAIEmbeddings\n\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.field_typing import Embeddings\nfrom langflow.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, Output, SecretStrInput, TextInput\n\n\nclass OpenAIEmbeddingsComponent(LCModelComponent):\n display_name = \"OpenAI Embeddings\"\n description = \"Generate embeddings using OpenAI models.\"\n icon = \"OpenAI\"\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 TextInput(name=\"client\", display_name=\"Client\", advanced=True),\n TextInput(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=[\n \"text-embedding-3-small\",\n \"text-embedding-3-large\",\n \"text-embedding-ada-002\",\n ],\n value=\"text-embedding-3-small\",\n ),\n DictInput(name=\"model_kwargs\", display_name=\"Model Kwargs\", advanced=True),\n SecretStrInput(name=\"openai_api_base\", display_name=\"OpenAI API Base\", advanced=True),\n SecretStrInput(name=\"openai_api_key\", display_name=\"OpenAI API Key\"),\n SecretStrInput(name=\"openai_api_type\", display_name=\"OpenAI API Type\", advanced=True),\n TextInput(name=\"openai_api_version\", display_name=\"OpenAI API Version\", advanced=True),\n TextInput(\n name=\"openai_organization\",\n display_name=\"OpenAI Organization\",\n advanced=True,\n ),\n TextInput(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 TextInput(\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 ]\n\n outputs = [\n Output(display_name=\"Embeddings\", name=\"embeddings\", method=\"build_embeddings\"),\n ]\n\n def build_embeddings(self) -> Embeddings:\n return OpenAIEmbeddings(\n tiktoken_enabled=self.tiktoken_enable,\n default_headers=self.default_headers,\n default_query=self.default_query,\n allowed_special=\"all\",\n disallowed_special=\"all\",\n chunk_size=self.chunk_size,\n deployment=self.deployment,\n embedding_ctx_length=self.embedding_ctx_length,\n max_retries=self.max_retries,\n model=self.model,\n model_kwargs=self.model_kwargs,\n base_url=self.openai_api_base,\n api_key=self.openai_api_key,\n openai_api_type=self.openai_api_type,\n api_version=self.openai_api_version,\n organization=self.openai_organization,\n openai_proxy=self.openai_proxy,\n timeout=self.request_timeout or None,\n show_progress_bar=self.show_progress_bar,\n skip_empty=self.skip_empty,\n tiktoken_model_name=self.tiktoken_model_name,\n )\n" }, "default_headers": { "advanced": true, @@ -1846,10 +1706,7 @@ "display_name": "Deployment", "dynamic": false, "info": "", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "name": "deployment", @@ -1950,7 +1807,7 @@ "show": true, "title_case": false, "type": "str", - "value": "" + "value": "OPENAI_API_KEY" }, "openai_api_type": { "advanced": true, @@ -1973,10 +1830,7 @@ "display_name": "OpenAI API Version", "dynamic": false, "info": "", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "name": "openai_api_version", @@ -1992,10 +1846,7 @@ "display_name": "OpenAI Organization", "dynamic": false, "info": "", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "name": "openai_organization", @@ -2011,10 +1862,7 @@ "display_name": "OpenAI Proxy", "dynamic": false, "info": "", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "name": "openai_proxy", @@ -2086,10 +1934,7 @@ "display_name": "TikToken Model Name", "dynamic": false, "info": "", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "name": "tiktoken_model_name", @@ -2106,7 +1951,7 @@ }, "dragging": false, "height": 395, - "id": "OpenAIEmbeddings-YeYtt", + "id": "OpenAIEmbeddings-PCoh9", "position": { "x": 2781.1922529351923, "y": 2206.267872396239 @@ -2123,18 +1968,16 @@ "data": { "description": "Split text into chunks of a specified length.", "display_name": "Recursive Character Text Splitter", - "id": "RecursiveCharacterTextSplitter-HVESL", + "id": "RecursiveCharacterTextSplitter-CrApG", "node": { - "base_classes": [ - "Data" - ], + "base_classes": ["Data"], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "Split text into chunks of a specified length.", "display_name": "Recursive Character Text Splitter", "documentation": "https://docs.langflow.org/components/text-splitters#recursivecharactertextsplitter", - "edited": false, + "edited": true, "field_order": [ "chunk_size", "chunk_overlap", @@ -2142,20 +1985,15 @@ "separators" ], "frozen": false, - "output_types": [ - "Data" - ], + "output_types": ["Data"], "outputs": [ { "cache": true, "display_name": "Data", - "hidden": false, "method": "build", "name": "data", "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" } ], @@ -2206,17 +2044,14 @@ "show": true, "title_case": false, "type": "code", - "value": "from langchain_text_splitters import RecursiveCharacterTextSplitter\n\nfrom langflow.custom import Component\nfrom langflow.inputs.inputs import DataInput, IntInput, MessageTextInput\nfrom langflow.schema import Data\nfrom langflow.template.field.base import Output\nfrom langflow.utils.util import build_loader_repr_from_data, unescape_string\n\n\nclass RecursiveCharacterTextSplitterComponent(Component):\n display_name: str = \"Recursive Character Text Splitter\"\n description: str = \"Split text into chunks of a specified length.\"\n documentation: str = \"https://docs.langflow.org/components/text-splitters#recursivecharactertextsplitter\"\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 MessageTextInput(\n name=\"separators\",\n display_name=\"Separators\",\n info='The characters to split on.\\nIf left empty defaults to [\"\\\\n\\\\n\", \"\\\\n\", \" \", \"\"].',\n is_list=True,\n ),\n ]\n outputs = [\n Output(display_name=\"Data\", name=\"data\", method=\"split_data\"),\n ]\n\n def split_data(self) -> list[Data]:\n \"\"\"\n Split text into chunks of a specified length.\n\n Args:\n separators (list[str]): The characters to split on.\n chunk_size (int): The maximum length of each chunk.\n chunk_overlap (int): The amount of overlap between chunks.\n\n Returns:\n list[str]: The chunks of text.\n \"\"\"\n\n if self.separators == \"\":\n self.separators = None\n elif self.separators:\n # check if the separators list has escaped characters\n # if there are escaped characters, unescape them\n self.separators = [unescape_string(x) for x in self.separators]\n\n # Make sure chunk_size and chunk_overlap are ints\n if isinstance(self.chunk_size, str):\n self.chunk_size = int(self.chunk_size)\n if isinstance(self.chunk_overlap, str):\n self.chunk_overlap = int(self.chunk_overlap)\n splitter = RecursiveCharacterTextSplitter(\n separators=self.separators,\n chunk_size=self.chunk_size,\n chunk_overlap=self.chunk_overlap,\n )\n documents = []\n if not isinstance(self.data_input, list):\n self.data_input = [self.data_input]\n for _input in self.data_input:\n if isinstance(_input, Data):\n documents.append(_input.to_lc_document())\n else:\n documents.append(_input)\n docs = splitter.split_documents(documents)\n data = self.to_data(docs)\n self.repr_value = build_loader_repr_from_data(data)\n return data\n" + "value": "from langchain_text_splitters import RecursiveCharacterTextSplitter\n\nfrom langflow.custom import Component\nfrom langflow.inputs.inputs import DataInput, IntInput, TextInput\nfrom langflow.schema import Data\nfrom langflow.template.field.base import Output\nfrom langflow.utils.util import build_loader_repr_from_data, unescape_string\n\n\nclass RecursiveCharacterTextSplitterComponent(Component):\n display_name: str = \"Recursive Character Text Splitter\"\n description: str = \"Split text into chunks of a specified length.\"\n documentation: str = \"https://docs.langflow.org/components/text-splitters#recursivecharactertextsplitter\"\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 TextInput(\n name=\"separators\",\n display_name=\"Separators\",\n info='The characters to split on.\\nIf left empty defaults to [\"\\\\n\\\\n\", \"\\\\n\", \" \", \"\"].',\n is_list=True,\n ),\n ]\n outputs = [\n Output(display_name=\"Data\", name=\"data\", method=\"build\"),\n ]\n\n def build(self) -> list[Data]:\n \"\"\"\n Split text into chunks of a specified length.\n\n Args:\n separators (list[str]): The characters to split on.\n chunk_size (int): The maximum length of each chunk.\n chunk_overlap (int): The amount of overlap between chunks.\n\n Returns:\n list[str]: The chunks of text.\n \"\"\"\n\n if self.separators == \"\":\n self.separators = None\n elif self.separators:\n # check if the separators list has escaped characters\n # if there are escaped characters, unescape them\n self.separators = [unescape_string(x) for x in self.separators]\n\n # Make sure chunk_size and chunk_overlap are ints\n if isinstance(self.chunk_size, str):\n self.chunk_size = int(self.chunk_size)\n if isinstance(self.chunk_overlap, str):\n self.chunk_overlap = int(self.chunk_overlap)\n splitter = RecursiveCharacterTextSplitter(\n separators=self.separators,\n chunk_size=self.chunk_size,\n chunk_overlap=self.chunk_overlap,\n )\n documents = []\n if not isinstance(self.data_input, list):\n self.data_input = [self.data_input]\n for _input in self.data_input:\n if isinstance(_input, Data):\n documents.append(_input.to_lc_document())\n else:\n documents.append(_input)\n docs = splitter.split_documents(documents)\n data = self.to_data(docs)\n self.repr_value = build_loader_repr_from_data(data)\n return data\n" }, "data_input": { "advanced": false, "display_name": "Input", "dynamic": false, "info": "The texts to split.", - "input_types": [ - "Document", - "Data" - ], + "input_types": ["Document", "Data"], "list": false, "name": "data_input", "placeholder": "", @@ -2231,10 +2066,7 @@ "display_name": "Separators", "dynamic": false, "info": "The characters to split on.\nIf left empty defaults to [\"\\n\\n\", \"\\n\", \" \", \"\"].", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": true, "load_from_db": false, "name": "separators", @@ -2243,9 +2075,7 @@ "show": true, "title_case": false, "type": "str", - "value": [ - "\\n" - ] + "value": ["\\n"] } } }, @@ -2253,7 +2083,7 @@ }, "dragging": false, "height": 529, - "id": "RecursiveCharacterTextSplitter-HVESL", + "id": "RecursiveCharacterTextSplitter-CrApG", "position": { "x": 2726.46405760335, "y": 1530.1666819162674 @@ -2270,11 +2100,9 @@ "data": { "description": "Implementation of Vector Store using Astra DB with search capabilities", "display_name": "Astra DB Vector Store", - "id": "AstraDB-irvai", + "id": "AstraDB-rXo8b", "node": { - "base_classes": [ - "Data" - ], + "base_classes": ["Data"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -2314,9 +2142,7 @@ "method": "build_base_retriever", "name": "base_retriever", "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" }, { @@ -2325,9 +2151,7 @@ "method": "search_documents", "name": "search_results", "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" } ], @@ -2362,7 +2186,7 @@ "show": true, "title_case": false, "type": "str", - "value": "" + "value": "ASTRA_DB_API_ENDPOINT" }, "batch_size": { "advanced": true, @@ -2436,7 +2260,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from loguru import logger\n\nfrom langflow.base.vectorstores.model import LCVectorStoreComponent\nfrom langflow.io import BoolInput, DropdownInput, HandleInput, IntInput, MultilineInput, SecretStrInput, StrInput\nfrom langflow.schema import Data\n\n\nclass AstraVectorStoreComponent(LCVectorStoreComponent):\n display_name: str = \"Astra DB Vector Store\"\n description: str = \"Implementation of Vector Store using Astra DB with search capabilities\"\n documentation: str = \"https://python.langchain.com/docs/integrations/vectorstores/astradb\"\n icon: str = \"AstraDB\"\n\n inputs = [\n StrInput(\n name=\"collection_name\",\n display_name=\"Collection Name\",\n info=\"The name of the collection within Astra DB where the vectors will be stored.\",\n ),\n SecretStrInput(\n name=\"token\",\n display_name=\"Astra DB Application Token\",\n info=\"Authentication token for accessing Astra DB.\",\n value=\"ASTRA_DB_APPLICATION_TOKEN\",\n ),\n SecretStrInput(\n name=\"api_endpoint\",\n display_name=\"API Endpoint\",\n info=\"API endpoint URL for the Astra DB service.\",\n value=\"ASTRA_DB_API_ENDPOINT\",\n ),\n HandleInput(\n name=\"vector_store_inputs\",\n display_name=\"Vector Store Inputs\",\n input_types=[\"Document\", \"Data\"],\n is_list=True,\n ),\n HandleInput(\n name=\"embedding\",\n display_name=\"Embedding\",\n input_types=[\"Embeddings\"],\n ),\n StrInput(\n name=\"namespace\",\n display_name=\"Namespace\",\n info=\"Optional namespace within Astra DB to use for the collection.\",\n advanced=True,\n ),\n DropdownInput(\n name=\"metric\",\n display_name=\"Metric\",\n info=\"Optional distance metric for vector comparisons in the vector store.\",\n options=[\"cosine\", \"dot_product\", \"euclidean\"],\n advanced=True,\n ),\n IntInput(\n name=\"batch_size\",\n display_name=\"Batch Size\",\n info=\"Optional number of data to process in a single batch.\",\n advanced=True,\n ),\n IntInput(\n name=\"bulk_insert_batch_concurrency\",\n display_name=\"Bulk Insert Batch Concurrency\",\n info=\"Optional concurrency level for bulk insert operations.\",\n advanced=True,\n ),\n IntInput(\n name=\"bulk_insert_overwrite_concurrency\",\n display_name=\"Bulk Insert Overwrite Concurrency\",\n info=\"Optional concurrency level for bulk insert operations that overwrite existing data.\",\n advanced=True,\n ),\n IntInput(\n name=\"bulk_delete_concurrency\",\n display_name=\"Bulk Delete Concurrency\",\n info=\"Optional concurrency level for bulk delete operations.\",\n advanced=True,\n ),\n DropdownInput(\n name=\"setup_mode\",\n display_name=\"Setup Mode\",\n info=\"Configuration mode for setting up the vector store, with options like 'Sync', 'Async', or 'Off'.\",\n options=[\"Sync\", \"Async\", \"Off\"],\n advanced=True,\n value=\"Sync\",\n ),\n BoolInput(\n name=\"pre_delete_collection\",\n display_name=\"Pre Delete Collection\",\n info=\"Boolean flag to determine whether to delete the collection before creating a new one.\",\n advanced=True,\n ),\n StrInput(\n name=\"metadata_indexing_include\",\n display_name=\"Metadata Indexing Include\",\n info=\"Optional list of metadata fields to include in the indexing.\",\n advanced=True,\n ),\n StrInput(\n name=\"metadata_indexing_exclude\",\n display_name=\"Metadata Indexing Exclude\",\n info=\"Optional list of metadata fields to exclude from the indexing.\",\n advanced=True,\n ),\n StrInput(\n name=\"collection_indexing_policy\",\n display_name=\"Collection Indexing Policy\",\n info=\"Optional dictionary defining the indexing policy for the collection.\",\n advanced=True,\n ),\n BoolInput(\n name=\"add_to_vector_store\",\n display_name=\"Add to Vector Store\",\n info=\"If true, the Vector Store Inputs will be added to the Vector Store.\",\n ),\n MultilineInput(\n name=\"search_input\",\n display_name=\"Search Input\",\n ),\n DropdownInput(\n name=\"search_type\",\n display_name=\"Search Type\",\n options=[\"Similarity\", \"MMR\"],\n value=\"Similarity\",\n ),\n IntInput(\n name=\"number_of_results\",\n display_name=\"Number of Results\",\n info=\"Number of results to return.\",\n advanced=True,\n value=4,\n ),\n ]\n\n def build_vector_store(self):\n try:\n from langchain_astradb import AstraDBVectorStore\n from langchain_astradb.utils.astradb import SetupMode\n except ImportError:\n raise ImportError(\n \"Could not import langchain Astra DB integration package. \"\n \"Please install it with `pip install langchain-astradb`.\"\n )\n\n try:\n if not self.setup_mode:\n self.setup_mode = self._inputs[\"setup_mode\"].options[0]\n\n setup_mode_value = SetupMode[self.setup_mode.upper()]\n except KeyError:\n raise ValueError(f\"Invalid setup mode: {self.setup_mode}\")\n\n vector_store_kwargs = {\n \"embedding\": self.embedding,\n \"collection_name\": self.collection_name,\n \"token\": self.token,\n \"api_endpoint\": self.api_endpoint,\n \"namespace\": self.namespace or None,\n \"metric\": self.metric or None,\n \"batch_size\": self.batch_size or None,\n \"bulk_insert_batch_concurrency\": self.bulk_insert_batch_concurrency or None,\n \"bulk_insert_overwrite_concurrency\": self.bulk_insert_overwrite_concurrency or None,\n \"bulk_delete_concurrency\": self.bulk_delete_concurrency or None,\n \"setup_mode\": setup_mode_value,\n \"pre_delete_collection\": self.pre_delete_collection or False,\n }\n\n if self.metadata_indexing_include:\n vector_store_kwargs[\"metadata_indexing_include\"] = self.metadata_indexing_include\n elif self.metadata_indexing_exclude:\n vector_store_kwargs[\"metadata_indexing_exclude\"] = self.metadata_indexing_exclude\n elif self.collection_indexing_policy:\n vector_store_kwargs[\"collection_indexing_policy\"] = self.collection_indexing_policy\n\n try:\n vector_store = AstraDBVectorStore(**vector_store_kwargs)\n except Exception as e:\n raise ValueError(f\"Error initializing AstraDBVectorStore: {str(e)}\") from e\n\n if self.add_to_vector_store:\n self._add_documents_to_vector_store(vector_store)\n\n return vector_store\n\n def build_base_retriever(self):\n vector_store = self.build_vector_store()\n self.status = self._astradb_collection_to_data(vector_store.collection)\n return vector_store\n\n def _add_documents_to_vector_store(self, vector_store):\n documents = []\n for _input in self.vector_store_inputs or []:\n if isinstance(_input, Data):\n documents.append(_input.to_lc_document())\n else:\n raise ValueError(\"Vector Store Inputs must be Data objects.\")\n\n if documents and self.embedding is not None:\n logger.debug(f\"Adding {len(documents)} documents to the Vector Store.\")\n try:\n vector_store.add_documents(documents)\n except Exception as e:\n raise ValueError(f\"Error adding documents to AstraDBVectorStore: {str(e)}\") from e\n else:\n logger.debug(\"No documents to add to the Vector Store.\")\n\n def search_documents(self):\n vector_store = self.build_vector_store()\n\n logger.debug(f\"Search input: {self.search_input}\")\n logger.debug(f\"Search type: {self.search_type}\")\n logger.debug(f\"Number of results: {self.number_of_results}\")\n\n if self.search_input and isinstance(self.search_input, str) and self.search_input.strip():\n try:\n if self.search_type == \"Similarity\":\n docs = vector_store.similarity_search(\n query=self.search_input,\n k=self.number_of_results,\n )\n elif self.search_type == \"MMR\":\n docs = vector_store.max_marginal_relevance_search(\n query=self.search_input,\n k=self.number_of_results,\n )\n else:\n raise ValueError(f\"Invalid search type: {self.search_type}\")\n except Exception as e:\n raise ValueError(f\"Error performing search in AstraDBVectorStore: {str(e)}\") from e\n\n logger.debug(f\"Retrieved documents: {len(docs)}\")\n\n data = [Data.from_document(doc) for doc in docs]\n logger.debug(f\"Converted documents to data: {len(data)}\")\n self.status = data\n return data\n else:\n logger.debug(\"No search input provided. Skipping search.\")\n return []\n\n def _astradb_collection_to_data(self, collection):\n data = []\n data_dict = collection.find()\n if data_dict and \"data\" in data_dict:\n data_dict = data_dict[\"data\"].get(\"documents\", [])\n\n for item in data_dict:\n data.append(Data(content=item[\"content\"]))\n return data\n" + "value": "from loguru import logger\n\nfrom langflow.base.vectorstores.model import LCVectorStoreComponent\nfrom langflow.io import BoolInput, DropdownInput, HandleInput, IntInput, MultilineInput, SecretStrInput, StrInput, DataInput\nfrom langflow.schema import Data\n\n\nclass AstraVectorStoreComponent(LCVectorStoreComponent):\n display_name: str = \"Astra DB Vector Store\"\n description: str = \"Implementation of Vector Store using Astra DB with search capabilities\"\n documentation: str = \"https://python.langchain.com/docs/integrations/vectorstores/astradb\"\n icon: str = \"AstraDB\"\n\n inputs = [\n StrInput(\n name=\"collection_name\",\n display_name=\"Collection Name\",\n info=\"The name of the collection within Astra DB where the vectors will be stored.\",\n ),\n SecretStrInput(\n name=\"token\",\n display_name=\"Astra DB Application Token\",\n info=\"Authentication token for accessing Astra DB.\",\n value=\"ASTRA_DB_APPLICATION_TOKEN\",\n ),\n SecretStrInput(\n name=\"api_endpoint\",\n display_name=\"API Endpoint\",\n info=\"API endpoint URL for the Astra DB service.\",\n value=\"ASTRA_DB_API_ENDPOINT\",\n ),\n DataInput(\n name=\"vector_store_inputs\",\n display_name=\"Vector Store Inputs\",\n is_list=True,\n ),\n HandleInput(\n name=\"embedding\",\n display_name=\"Embedding\",\n input_types=[\"Embeddings\", \"dict\"],\n ),\n StrInput(\n name=\"namespace\",\n display_name=\"Namespace\",\n info=\"Optional namespace within Astra DB to use for the collection.\",\n advanced=True,\n ),\n DropdownInput(\n name=\"metric\",\n display_name=\"Metric\",\n info=\"Optional distance metric for vector comparisons in the vector store.\",\n options=[\"cosine\", \"dot_product\", \"euclidean\"],\n advanced=True,\n ),\n IntInput(\n name=\"batch_size\",\n display_name=\"Batch Size\",\n info=\"Optional number of data to process in a single batch.\",\n advanced=True,\n ),\n IntInput(\n name=\"bulk_insert_batch_concurrency\",\n display_name=\"Bulk Insert Batch Concurrency\",\n info=\"Optional concurrency level for bulk insert operations.\",\n advanced=True,\n ),\n IntInput(\n name=\"bulk_insert_overwrite_concurrency\",\n display_name=\"Bulk Insert Overwrite Concurrency\",\n info=\"Optional concurrency level for bulk insert operations that overwrite existing data.\",\n advanced=True,\n ),\n IntInput(\n name=\"bulk_delete_concurrency\",\n display_name=\"Bulk Delete Concurrency\",\n info=\"Optional concurrency level for bulk delete operations.\",\n advanced=True,\n ),\n DropdownInput(\n name=\"setup_mode\",\n display_name=\"Setup Mode\",\n info=\"Configuration mode for setting up the vector store, with options like 'Sync', 'Async', or 'Off'.\",\n options=[\"Sync\", \"Async\", \"Off\"],\n advanced=True,\n value=\"Sync\",\n ),\n BoolInput(\n name=\"pre_delete_collection\",\n display_name=\"Pre Delete Collection\",\n info=\"Boolean flag to determine whether to delete the collection before creating a new one.\",\n advanced=True,\n ),\n StrInput(\n name=\"metadata_indexing_include\",\n display_name=\"Metadata Indexing Include\",\n info=\"Optional list of metadata fields to include in the indexing.\",\n advanced=True,\n ),\n StrInput(\n name=\"metadata_indexing_exclude\",\n display_name=\"Metadata Indexing Exclude\",\n info=\"Optional list of metadata fields to exclude from the indexing.\",\n advanced=True,\n ),\n StrInput(\n name=\"collection_indexing_policy\",\n display_name=\"Collection Indexing Policy\",\n info=\"Optional dictionary defining the indexing policy for the collection.\",\n advanced=True,\n ),\n BoolInput(\n name=\"add_to_vector_store\",\n display_name=\"Add to Vector Store\",\n info=\"If true, the Vector Store Inputs will be added to the Vector Store.\",\n ),\n MultilineInput(\n name=\"search_input\",\n display_name=\"Search Input\",\n ),\n DropdownInput(\n name=\"search_type\",\n display_name=\"Search Type\",\n options=[\"Similarity\", \"MMR\"],\n value=\"Similarity\",\n ),\n IntInput(\n name=\"number_of_results\",\n display_name=\"Number of Results\",\n info=\"Number of results to return.\",\n advanced=True,\n value=4,\n ),\n ]\n\n def build_vector_store(self):\n try:\n from langchain_astradb import AstraDBVectorStore\n from langchain_astradb.utils.astradb import SetupMode\n except ImportError:\n raise ImportError(\n \"Could not import langchain Astra DB integration package. \"\n \"Please install it with `pip install langchain-astradb`.\"\n )\n\n try:\n if not self.setup_mode:\n self.setup_mode = self._inputs[\"setup_mode\"].options[0]\n\n setup_mode_value = SetupMode[self.setup_mode.upper()]\n except KeyError:\n raise ValueError(f\"Invalid setup mode: {self.setup_mode}\")\n\n if isinstance(self.embedding, dict):\n embedding_dict = {\"embedding\": self.embedding}\n else:\n embedding_dict = self.embedding.to_dict()\n vector_store_kwargs = {\n **embedding_dict,\n \"collection_name\": self.collection_name,\n \"token\": self.token,\n \"api_endpoint\": self.api_endpoint,\n \"namespace\": self.namespace or None,\n \"metric\": self.metric or None,\n \"batch_size\": self.batch_size or None,\n \"bulk_insert_batch_concurrency\": self.bulk_insert_batch_concurrency or None,\n \"bulk_insert_overwrite_concurrency\": self.bulk_insert_overwrite_concurrency or None,\n \"bulk_delete_concurrency\": self.bulk_delete_concurrency or None,\n \"setup_mode\": setup_mode_value,\n \"pre_delete_collection\": self.pre_delete_collection or False,\n }\n\n if self.metadata_indexing_include:\n vector_store_kwargs[\"metadata_indexing_include\"] = self.metadata_indexing_include\n elif self.metadata_indexing_exclude:\n vector_store_kwargs[\"metadata_indexing_exclude\"] = self.metadata_indexing_exclude\n elif self.collection_indexing_policy:\n vector_store_kwargs[\"collection_indexing_policy\"] = self.collection_indexing_policy\n\n try:\n vector_store = AstraDBVectorStore(**vector_store_kwargs)\n except Exception as e:\n raise ValueError(f\"Error initializing AstraDBVectorStore: {str(e)}\") from e\n\n if self.add_to_vector_store:\n self._add_documents_to_vector_store(vector_store)\n\n return vector_store\n\n def build_base_retriever(self):\n vector_store = self.build_vector_store()\n self.status = self._astradb_collection_to_data(vector_store.collection)\n return vector_store\n\n def _add_documents_to_vector_store(self, vector_store):\n documents = []\n for _input in self.vector_store_inputs or []:\n if isinstance(_input, Data):\n documents.append(_input.to_lc_document())\n else:\n raise ValueError(\"Vector Store Inputs must be Data objects.\")\n\n if documents and self.embedding is not None:\n logger.debug(f\"Adding {len(documents)} documents to the Vector Store.\")\n try:\n vector_store.add_documents(documents)\n except Exception as e:\n raise ValueError(f\"Error adding documents to AstraDBVectorStore: {str(e)}\") from e\n else:\n logger.debug(\"No documents to add to the Vector Store.\")\n\n def search_documents(self):\n vector_store = self.build_vector_store()\n\n logger.debug(f\"Search input: {self.search_input}\")\n logger.debug(f\"Search type: {self.search_type}\")\n logger.debug(f\"Number of results: {self.number_of_results}\")\n\n if self.search_input and isinstance(self.search_input, str) and self.search_input.strip():\n try:\n if self.search_type == \"Similarity\":\n docs = vector_store.similarity_search(\n query=self.search_input,\n k=self.number_of_results,\n )\n elif self.search_type == \"MMR\":\n docs = vector_store.max_marginal_relevance_search(\n query=self.search_input,\n k=self.number_of_results,\n )\n else:\n raise ValueError(f\"Invalid search type: {self.search_type}\")\n except Exception as e:\n raise ValueError(f\"Error performing search in AstraDBVectorStore: {str(e)}\") from e\n\n logger.debug(f\"Retrieved documents: {len(docs)}\")\n\n data = [Data.from_document(doc) for doc in docs]\n logger.debug(f\"Converted documents to data: {len(data)}\")\n self.status = data\n return data\n else:\n logger.debug(\"No search input provided. Skipping search.\")\n return []\n\n def _astradb_collection_to_data(self, collection):\n data = []\n data_dict = collection.find()\n if data_dict and \"data\" in data_dict:\n data_dict = data_dict[\"data\"].get(\"documents\", [])\n\n for item in data_dict:\n data.append(Data(content=item[\"content\"]))\n return data\n" }, "collection_indexing_policy": { "advanced": true, @@ -2473,9 +2297,7 @@ "display_name": "Embedding", "dynamic": false, "info": "", - "input_types": [ - "Embeddings" - ], + "input_types": ["Embeddings", "dict"], "list": false, "name": "embedding", "placeholder": "", @@ -2521,11 +2343,7 @@ "dynamic": false, "info": "Optional distance metric for vector comparisons in the vector store.", "name": "metric", - "options": [ - "cosine", - "dot_product", - "euclidean" - ], + "options": ["cosine", "dot_product", "euclidean"], "placeholder": "", "required": false, "show": true, @@ -2581,10 +2399,7 @@ "display_name": "Search Input", "dynamic": false, "info": "", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "multiline": true, @@ -2602,10 +2417,7 @@ "dynamic": false, "info": "", "name": "search_type", - "options": [ - "Similarity", - "MMR" - ], + "options": ["Similarity", "MMR"], "placeholder": "", "required": false, "show": true, @@ -2619,11 +2431,7 @@ "dynamic": false, "info": "Configuration mode for setting up the vector store, with options like 'Sync', 'Async', or 'Off'.", "name": "setup_mode", - "options": [ - "Sync", - "Async", - "Off" - ], + "options": ["Sync", "Async", "Off"], "placeholder": "", "required": false, "show": true, @@ -2645,17 +2453,14 @@ "show": true, "title_case": false, "type": "str", - "value": "" + "value": "ASTRA_DB_APPLICATION_TOKEN" }, "vector_store_inputs": { "advanced": false, "display_name": "Vector Store Inputs", "dynamic": false, "info": "", - "input_types": [ - "Document", - "Data" - ], + "input_types": ["Data"], "list": true, "name": "vector_store_inputs", "placeholder": "", @@ -2671,7 +2476,7 @@ }, "dragging": false, "height": 917, - "id": "AstraDB-irvai", + "id": "AstraDB-rXo8b", "position": { "x": 3329.7211874614477, "y": 1559.774393811144 @@ -2680,7 +2485,7 @@ "x": 3329.7211874614477, "y": 1559.774393811144 }, - "selected": false, + "selected": true, "type": "genericNode", "width": 384 }, @@ -2688,11 +2493,9 @@ "data": { "description": "Implementation of Vector Store using Astra DB with search capabilities", "display_name": "Astra DB Vector Store", - "id": "AstraDB-wANQu", + "id": "AstraDB-61WgV", "node": { - "base_classes": [ - "Data" - ], + "base_classes": ["Data"], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -2732,21 +2535,16 @@ "method": "build_base_retriever", "name": "base_retriever", "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" }, { "cache": true, "display_name": "Search Results", - "hidden": false, "method": "search_documents", "name": "search_results", "selected": "Data", - "types": [ - "Data" - ], + "types": ["Data"], "value": "__UNDEFINED__" } ], @@ -2781,7 +2579,7 @@ "show": true, "title_case": false, "type": "str", - "value": "" + "value": "ASTRA_DB_API_ENDPOINT" }, "batch_size": { "advanced": true, @@ -2855,7 +2653,7 @@ "show": true, "title_case": false, "type": "code", - "value": "from loguru import logger\n\nfrom langflow.base.vectorstores.model import LCVectorStoreComponent\nfrom langflow.io import BoolInput, DropdownInput, HandleInput, IntInput, MultilineInput, SecretStrInput, StrInput\nfrom langflow.schema import Data\n\n\nclass AstraVectorStoreComponent(LCVectorStoreComponent):\n display_name: str = \"Astra DB Vector Store\"\n description: str = \"Implementation of Vector Store using Astra DB with search capabilities\"\n documentation: str = \"https://python.langchain.com/docs/integrations/vectorstores/astradb\"\n icon: str = \"AstraDB\"\n\n inputs = [\n StrInput(\n name=\"collection_name\",\n display_name=\"Collection Name\",\n info=\"The name of the collection within Astra DB where the vectors will be stored.\",\n ),\n SecretStrInput(\n name=\"token\",\n display_name=\"Astra DB Application Token\",\n info=\"Authentication token for accessing Astra DB.\",\n value=\"ASTRA_DB_APPLICATION_TOKEN\",\n ),\n SecretStrInput(\n name=\"api_endpoint\",\n display_name=\"API Endpoint\",\n info=\"API endpoint URL for the Astra DB service.\",\n value=\"ASTRA_DB_API_ENDPOINT\",\n ),\n HandleInput(\n name=\"vector_store_inputs\",\n display_name=\"Vector Store Inputs\",\n input_types=[\"Document\", \"Data\"],\n is_list=True,\n ),\n HandleInput(\n name=\"embedding\",\n display_name=\"Embedding\",\n input_types=[\"Embeddings\"],\n ),\n StrInput(\n name=\"namespace\",\n display_name=\"Namespace\",\n info=\"Optional namespace within Astra DB to use for the collection.\",\n advanced=True,\n ),\n DropdownInput(\n name=\"metric\",\n display_name=\"Metric\",\n info=\"Optional distance metric for vector comparisons in the vector store.\",\n options=[\"cosine\", \"dot_product\", \"euclidean\"],\n advanced=True,\n ),\n IntInput(\n name=\"batch_size\",\n display_name=\"Batch Size\",\n info=\"Optional number of data to process in a single batch.\",\n advanced=True,\n ),\n IntInput(\n name=\"bulk_insert_batch_concurrency\",\n display_name=\"Bulk Insert Batch Concurrency\",\n info=\"Optional concurrency level for bulk insert operations.\",\n advanced=True,\n ),\n IntInput(\n name=\"bulk_insert_overwrite_concurrency\",\n display_name=\"Bulk Insert Overwrite Concurrency\",\n info=\"Optional concurrency level for bulk insert operations that overwrite existing data.\",\n advanced=True,\n ),\n IntInput(\n name=\"bulk_delete_concurrency\",\n display_name=\"Bulk Delete Concurrency\",\n info=\"Optional concurrency level for bulk delete operations.\",\n advanced=True,\n ),\n DropdownInput(\n name=\"setup_mode\",\n display_name=\"Setup Mode\",\n info=\"Configuration mode for setting up the vector store, with options like 'Sync', 'Async', or 'Off'.\",\n options=[\"Sync\", \"Async\", \"Off\"],\n advanced=True,\n value=\"Sync\",\n ),\n BoolInput(\n name=\"pre_delete_collection\",\n display_name=\"Pre Delete Collection\",\n info=\"Boolean flag to determine whether to delete the collection before creating a new one.\",\n advanced=True,\n ),\n StrInput(\n name=\"metadata_indexing_include\",\n display_name=\"Metadata Indexing Include\",\n info=\"Optional list of metadata fields to include in the indexing.\",\n advanced=True,\n ),\n StrInput(\n name=\"metadata_indexing_exclude\",\n display_name=\"Metadata Indexing Exclude\",\n info=\"Optional list of metadata fields to exclude from the indexing.\",\n advanced=True,\n ),\n StrInput(\n name=\"collection_indexing_policy\",\n display_name=\"Collection Indexing Policy\",\n info=\"Optional dictionary defining the indexing policy for the collection.\",\n advanced=True,\n ),\n BoolInput(\n name=\"add_to_vector_store\",\n display_name=\"Add to Vector Store\",\n info=\"If true, the Vector Store Inputs will be added to the Vector Store.\",\n ),\n MultilineInput(\n name=\"search_input\",\n display_name=\"Search Input\",\n ),\n DropdownInput(\n name=\"search_type\",\n display_name=\"Search Type\",\n options=[\"Similarity\", \"MMR\"],\n value=\"Similarity\",\n ),\n IntInput(\n name=\"number_of_results\",\n display_name=\"Number of Results\",\n info=\"Number of results to return.\",\n advanced=True,\n value=4,\n ),\n ]\n\n def build_vector_store(self):\n try:\n from langchain_astradb import AstraDBVectorStore\n from langchain_astradb.utils.astradb import SetupMode\n except ImportError:\n raise ImportError(\n \"Could not import langchain Astra DB integration package. \"\n \"Please install it with `pip install langchain-astradb`.\"\n )\n\n try:\n if not self.setup_mode:\n self.setup_mode = self._inputs[\"setup_mode\"].options[0]\n\n setup_mode_value = SetupMode[self.setup_mode.upper()]\n except KeyError:\n raise ValueError(f\"Invalid setup mode: {self.setup_mode}\")\n\n vector_store_kwargs = {\n \"embedding\": self.embedding,\n \"collection_name\": self.collection_name,\n \"token\": self.token,\n \"api_endpoint\": self.api_endpoint,\n \"namespace\": self.namespace or None,\n \"metric\": self.metric or None,\n \"batch_size\": self.batch_size or None,\n \"bulk_insert_batch_concurrency\": self.bulk_insert_batch_concurrency or None,\n \"bulk_insert_overwrite_concurrency\": self.bulk_insert_overwrite_concurrency or None,\n \"bulk_delete_concurrency\": self.bulk_delete_concurrency or None,\n \"setup_mode\": setup_mode_value,\n \"pre_delete_collection\": self.pre_delete_collection or False,\n }\n\n if self.metadata_indexing_include:\n vector_store_kwargs[\"metadata_indexing_include\"] = self.metadata_indexing_include\n elif self.metadata_indexing_exclude:\n vector_store_kwargs[\"metadata_indexing_exclude\"] = self.metadata_indexing_exclude\n elif self.collection_indexing_policy:\n vector_store_kwargs[\"collection_indexing_policy\"] = self.collection_indexing_policy\n\n try:\n vector_store = AstraDBVectorStore(**vector_store_kwargs)\n except Exception as e:\n raise ValueError(f\"Error initializing AstraDBVectorStore: {str(e)}\") from e\n\n if self.add_to_vector_store:\n self._add_documents_to_vector_store(vector_store)\n\n return vector_store\n\n def build_base_retriever(self):\n vector_store = self.build_vector_store()\n self.status = self._astradb_collection_to_data(vector_store.collection)\n return vector_store\n\n def _add_documents_to_vector_store(self, vector_store):\n documents = []\n for _input in self.vector_store_inputs or []:\n if isinstance(_input, Data):\n documents.append(_input.to_lc_document())\n else:\n raise ValueError(\"Vector Store Inputs must be Data objects.\")\n\n if documents and self.embedding is not None:\n logger.debug(f\"Adding {len(documents)} documents to the Vector Store.\")\n try:\n vector_store.add_documents(documents)\n except Exception as e:\n raise ValueError(f\"Error adding documents to AstraDBVectorStore: {str(e)}\") from e\n else:\n logger.debug(\"No documents to add to the Vector Store.\")\n\n def search_documents(self):\n vector_store = self.build_vector_store()\n\n logger.debug(f\"Search input: {self.search_input}\")\n logger.debug(f\"Search type: {self.search_type}\")\n logger.debug(f\"Number of results: {self.number_of_results}\")\n\n if self.search_input and isinstance(self.search_input, str) and self.search_input.strip():\n try:\n if self.search_type == \"Similarity\":\n docs = vector_store.similarity_search(\n query=self.search_input,\n k=self.number_of_results,\n )\n elif self.search_type == \"MMR\":\n docs = vector_store.max_marginal_relevance_search(\n query=self.search_input,\n k=self.number_of_results,\n )\n else:\n raise ValueError(f\"Invalid search type: {self.search_type}\")\n except Exception as e:\n raise ValueError(f\"Error performing search in AstraDBVectorStore: {str(e)}\") from e\n\n logger.debug(f\"Retrieved documents: {len(docs)}\")\n\n data = [Data.from_document(doc) for doc in docs]\n logger.debug(f\"Converted documents to data: {len(data)}\")\n self.status = data\n return data\n else:\n logger.debug(\"No search input provided. Skipping search.\")\n return []\n\n def _astradb_collection_to_data(self, collection):\n data = []\n data_dict = collection.find()\n if data_dict and \"data\" in data_dict:\n data_dict = data_dict[\"data\"].get(\"documents\", [])\n\n for item in data_dict:\n data.append(Data(content=item[\"content\"]))\n return data\n" + "value": "from loguru import logger\n\nfrom langflow.base.vectorstores.model import LCVectorStoreComponent\nfrom langflow.io import BoolInput, DropdownInput, HandleInput, IntInput, MultilineInput, SecretStrInput, StrInput, DataInput\nfrom langflow.schema import Data\n\n\nclass AstraVectorStoreComponent(LCVectorStoreComponent):\n display_name: str = \"Astra DB Vector Store\"\n description: str = \"Implementation of Vector Store using Astra DB with search capabilities\"\n documentation: str = \"https://python.langchain.com/docs/integrations/vectorstores/astradb\"\n icon: str = \"AstraDB\"\n\n inputs = [\n StrInput(\n name=\"collection_name\",\n display_name=\"Collection Name\",\n info=\"The name of the collection within Astra DB where the vectors will be stored.\",\n ),\n SecretStrInput(\n name=\"token\",\n display_name=\"Astra DB Application Token\",\n info=\"Authentication token for accessing Astra DB.\",\n value=\"ASTRA_DB_APPLICATION_TOKEN\",\n ),\n SecretStrInput(\n name=\"api_endpoint\",\n display_name=\"API Endpoint\",\n info=\"API endpoint URL for the Astra DB service.\",\n value=\"ASTRA_DB_API_ENDPOINT\",\n ),\n DataInput(\n name=\"vector_store_inputs\",\n display_name=\"Vector Store Inputs\",\n is_list=True,\n ),\n HandleInput(\n name=\"embedding\",\n display_name=\"Embedding\",\n input_types=[\"Embeddings\", \"dict\"],\n ),\n StrInput(\n name=\"namespace\",\n display_name=\"Namespace\",\n info=\"Optional namespace within Astra DB to use for the collection.\",\n advanced=True,\n ),\n DropdownInput(\n name=\"metric\",\n display_name=\"Metric\",\n info=\"Optional distance metric for vector comparisons in the vector store.\",\n options=[\"cosine\", \"dot_product\", \"euclidean\"],\n advanced=True,\n ),\n IntInput(\n name=\"batch_size\",\n display_name=\"Batch Size\",\n info=\"Optional number of data to process in a single batch.\",\n advanced=True,\n ),\n IntInput(\n name=\"bulk_insert_batch_concurrency\",\n display_name=\"Bulk Insert Batch Concurrency\",\n info=\"Optional concurrency level for bulk insert operations.\",\n advanced=True,\n ),\n IntInput(\n name=\"bulk_insert_overwrite_concurrency\",\n display_name=\"Bulk Insert Overwrite Concurrency\",\n info=\"Optional concurrency level for bulk insert operations that overwrite existing data.\",\n advanced=True,\n ),\n IntInput(\n name=\"bulk_delete_concurrency\",\n display_name=\"Bulk Delete Concurrency\",\n info=\"Optional concurrency level for bulk delete operations.\",\n advanced=True,\n ),\n DropdownInput(\n name=\"setup_mode\",\n display_name=\"Setup Mode\",\n info=\"Configuration mode for setting up the vector store, with options like 'Sync', 'Async', or 'Off'.\",\n options=[\"Sync\", \"Async\", \"Off\"],\n advanced=True,\n value=\"Sync\",\n ),\n BoolInput(\n name=\"pre_delete_collection\",\n display_name=\"Pre Delete Collection\",\n info=\"Boolean flag to determine whether to delete the collection before creating a new one.\",\n advanced=True,\n ),\n StrInput(\n name=\"metadata_indexing_include\",\n display_name=\"Metadata Indexing Include\",\n info=\"Optional list of metadata fields to include in the indexing.\",\n advanced=True,\n ),\n StrInput(\n name=\"metadata_indexing_exclude\",\n display_name=\"Metadata Indexing Exclude\",\n info=\"Optional list of metadata fields to exclude from the indexing.\",\n advanced=True,\n ),\n StrInput(\n name=\"collection_indexing_policy\",\n display_name=\"Collection Indexing Policy\",\n info=\"Optional dictionary defining the indexing policy for the collection.\",\n advanced=True,\n ),\n BoolInput(\n name=\"add_to_vector_store\",\n display_name=\"Add to Vector Store\",\n info=\"If true, the Vector Store Inputs will be added to the Vector Store.\",\n ),\n MultilineInput(\n name=\"search_input\",\n display_name=\"Search Input\",\n ),\n DropdownInput(\n name=\"search_type\",\n display_name=\"Search Type\",\n options=[\"Similarity\", \"MMR\"],\n value=\"Similarity\",\n ),\n IntInput(\n name=\"number_of_results\",\n display_name=\"Number of Results\",\n info=\"Number of results to return.\",\n advanced=True,\n value=4,\n ),\n ]\n\n def build_vector_store(self):\n try:\n from langchain_astradb import AstraDBVectorStore\n from langchain_astradb.utils.astradb import SetupMode\n except ImportError:\n raise ImportError(\n \"Could not import langchain Astra DB integration package. \"\n \"Please install it with `pip install langchain-astradb`.\"\n )\n\n try:\n if not self.setup_mode:\n self.setup_mode = self._inputs[\"setup_mode\"].options[0]\n\n setup_mode_value = SetupMode[self.setup_mode.upper()]\n except KeyError:\n raise ValueError(f\"Invalid setup mode: {self.setup_mode}\")\n\n if isinstance(self.embedding, dict):\n embedding_dict = {\"embedding\": self.embedding}\n else:\n embedding_dict = self.embedding.to_dict()\n vector_store_kwargs = {\n **embedding_dict,\n \"collection_name\": self.collection_name,\n \"token\": self.token,\n \"api_endpoint\": self.api_endpoint,\n \"namespace\": self.namespace or None,\n \"metric\": self.metric or None,\n \"batch_size\": self.batch_size or None,\n \"bulk_insert_batch_concurrency\": self.bulk_insert_batch_concurrency or None,\n \"bulk_insert_overwrite_concurrency\": self.bulk_insert_overwrite_concurrency or None,\n \"bulk_delete_concurrency\": self.bulk_delete_concurrency or None,\n \"setup_mode\": setup_mode_value,\n \"pre_delete_collection\": self.pre_delete_collection or False,\n }\n\n if self.metadata_indexing_include:\n vector_store_kwargs[\"metadata_indexing_include\"] = self.metadata_indexing_include\n elif self.metadata_indexing_exclude:\n vector_store_kwargs[\"metadata_indexing_exclude\"] = self.metadata_indexing_exclude\n elif self.collection_indexing_policy:\n vector_store_kwargs[\"collection_indexing_policy\"] = self.collection_indexing_policy\n\n try:\n vector_store = AstraDBVectorStore(**vector_store_kwargs)\n except Exception as e:\n raise ValueError(f\"Error initializing AstraDBVectorStore: {str(e)}\") from e\n\n if self.add_to_vector_store:\n self._add_documents_to_vector_store(vector_store)\n\n return vector_store\n\n def build_base_retriever(self):\n vector_store = self.build_vector_store()\n self.status = self._astradb_collection_to_data(vector_store.collection)\n return vector_store\n\n def _add_documents_to_vector_store(self, vector_store):\n documents = []\n for _input in self.vector_store_inputs or []:\n if isinstance(_input, Data):\n documents.append(_input.to_lc_document())\n else:\n raise ValueError(\"Vector Store Inputs must be Data objects.\")\n\n if documents and self.embedding is not None:\n logger.debug(f\"Adding {len(documents)} documents to the Vector Store.\")\n try:\n vector_store.add_documents(documents)\n except Exception as e:\n raise ValueError(f\"Error adding documents to AstraDBVectorStore: {str(e)}\") from e\n else:\n logger.debug(\"No documents to add to the Vector Store.\")\n\n def search_documents(self):\n vector_store = self.build_vector_store()\n\n logger.debug(f\"Search input: {self.search_input}\")\n logger.debug(f\"Search type: {self.search_type}\")\n logger.debug(f\"Number of results: {self.number_of_results}\")\n\n if self.search_input and isinstance(self.search_input, str) and self.search_input.strip():\n try:\n if self.search_type == \"Similarity\":\n docs = vector_store.similarity_search(\n query=self.search_input,\n k=self.number_of_results,\n )\n elif self.search_type == \"MMR\":\n docs = vector_store.max_marginal_relevance_search(\n query=self.search_input,\n k=self.number_of_results,\n )\n else:\n raise ValueError(f\"Invalid search type: {self.search_type}\")\n except Exception as e:\n raise ValueError(f\"Error performing search in AstraDBVectorStore: {str(e)}\") from e\n\n logger.debug(f\"Retrieved documents: {len(docs)}\")\n\n data = [Data.from_document(doc) for doc in docs]\n logger.debug(f\"Converted documents to data: {len(data)}\")\n self.status = data\n return data\n else:\n logger.debug(\"No search input provided. Skipping search.\")\n return []\n\n def _astradb_collection_to_data(self, collection):\n data = []\n data_dict = collection.find()\n if data_dict and \"data\" in data_dict:\n data_dict = data_dict[\"data\"].get(\"documents\", [])\n\n for item in data_dict:\n data.append(Data(content=item[\"content\"]))\n return data\n" }, "collection_indexing_policy": { "advanced": true, @@ -2892,9 +2690,7 @@ "display_name": "Embedding", "dynamic": false, "info": "", - "input_types": [ - "Embeddings" - ], + "input_types": ["Embeddings", "dict"], "list": false, "name": "embedding", "placeholder": "", @@ -2940,11 +2736,7 @@ "dynamic": false, "info": "Optional distance metric for vector comparisons in the vector store.", "name": "metric", - "options": [ - "cosine", - "dot_product", - "euclidean" - ], + "options": ["cosine", "dot_product", "euclidean"], "placeholder": "", "required": false, "show": true, @@ -3000,10 +2792,7 @@ "display_name": "Search Input", "dynamic": false, "info": "", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "multiline": true, @@ -3021,10 +2810,7 @@ "dynamic": false, "info": "", "name": "search_type", - "options": [ - "Similarity", - "MMR" - ], + "options": ["Similarity", "MMR"], "placeholder": "", "required": false, "show": true, @@ -3038,11 +2824,7 @@ "dynamic": false, "info": "Configuration mode for setting up the vector store, with options like 'Sync', 'Async', or 'Off'.", "name": "setup_mode", - "options": [ - "Sync", - "Async", - "Off" - ], + "options": ["Sync", "Async", "Off"], "placeholder": "", "required": false, "show": true, @@ -3064,17 +2846,14 @@ "show": true, "title_case": false, "type": "str", - "value": "" + "value": "ASTRA_DB_APPLICATION_TOKEN" }, "vector_store_inputs": { "advanced": false, "display_name": "Vector Store Inputs", "dynamic": false, "info": "", - "input_types": [ - "Document", - "Data" - ], + "input_types": ["Data"], "list": true, "name": "vector_store_inputs", "placeholder": "", @@ -3090,7 +2869,7 @@ }, "dragging": false, "height": 917, - "id": "AstraDB-wANQu", + "id": "AstraDB-61WgV", "position": { "x": 1298.4611042465333, "y": 160.7181472642742 @@ -3105,22 +2884,16 @@ }, { "data": { - "id": "ParseData-C9tUn", + "id": "ParseData-DXlFW", "node": { - "base_classes": [ - "Message" - ], + "base_classes": ["Message"], "beta": false, "conditional_paths": [], "custom_fields": {}, "description": "Convert Data into plain text following a specified template.", "display_name": "Parse Data", "documentation": "", - "field_order": [ - "data", - "template", - "sep" - ], + "field_order": ["data", "template", "sep"], "frozen": false, "icon": "braces", "output_types": [], @@ -3128,13 +2901,10 @@ { "cache": true, "display_name": "Text", - "hidden": false, "method": "parse_data", "name": "text", "selected": "Message", - "types": [ - "Message" - ], + "types": ["Message"], "value": "__UNDEFINED__" } ], @@ -3164,9 +2934,7 @@ "display_name": "Data", "dynamic": false, "info": "The data to convert to text.", - "input_types": [ - "Data" - ], + "input_types": ["Data"], "list": false, "name": "data", "placeholder": "", @@ -3196,10 +2964,7 @@ "display_name": "Template", "dynamic": false, "info": "The template to use for formatting the data. It can contain the keys {text}, {data} or any other key in the Data.", - "input_types": [ - "Message", - "str" - ], + "input_types": ["Message", "str"], "list": false, "load_from_db": false, "multiline": true, @@ -3217,7 +2982,7 @@ }, "dragging": false, "height": 385, - "id": "ParseData-C9tUn", + "id": "ParseData-DXlFW", "position": { "x": 1911.4866480237615, "y": 566.903831987901 @@ -3232,15 +2997,15 @@ } ], "viewport": { - "x": -124.92057698887993, - "y": 126.80996053902413, - "zoom": 0.370642160653555 + "x": -145.46470046912816, + "y": 67.11009748758056, + "zoom": 0.2936356220661912 } }, "description": "Visit https://pre-release.langflow.org/tutorials/rag-with-astradb for a detailed guide of this project.\nThis project give you both Ingestion and RAG in a single file. You'll need to visit https://astra.datastax.com/ to create an Astra DB instance, your Token and grab an API Endpoint.\nRunning this project requires you to add a file in the Files component, then define a Collection Name and click on the Play icon on the Astra DB component. \n\nAfter the ingestion ends you are ready to click on the Run button at the lower left corner and start asking questions about your data.", - "endpoint_name": null, - "id": "c9e0cb46-c474-451a-8496-413f58481d92", + "endpoint_name": "None-2", + "id": "0433f955-c8cc-4d24-a2bf-e8cd0d11f99c", "is_component": false, - "last_tested_version": "1.0.0a61", + "last_tested_version": "1.0.0a59", "name": "Vector Store RAG" -} \ No newline at end of file +}