diff --git a/docs/docs/administration/prompt-customization.mdx b/docs/docs/administration/prompt-customization.mdx
index 661610611..42036f88b 100644
--- a/docs/docs/administration/prompt-customization.mdx
+++ b/docs/docs/administration/prompt-customization.mdx
@@ -2,6 +2,7 @@ import ThemedImage from "@theme/ThemedImage";
import useBaseUrl from "@docusaurus/useBaseUrl";
import ZoomableImage from "/src/theme/ZoomableImage.js";
import ReactPlayer from "react-player";
+import Admonition from "@theme/Admonition";
# Prompt Customization
diff --git a/docs/docs/getting-started/install-langflow.mdx b/docs/docs/getting-started/install-langflow.mdx
index f2f33e24e..b94b3468c 100644
--- a/docs/docs/getting-started/install-langflow.mdx
+++ b/docs/docs/getting-started/install-langflow.mdx
@@ -32,7 +32,7 @@ Pipx can fetch the missing Python version for you with `--fetch-missing-python`,
## Having a problem?
-If you encounter a problem, see [Common Installation Issues](/migration/possible-installation-issues).
+If you encounter a problem, see [Common Installation Issues](/getting-started/possible-installation-issues).
To get help in the Langflow CLI:
diff --git a/docs/docs/migration/migrating-to-one-point-zero.mdx b/docs/docs/migration/migrating-to-one-point-zero.mdx
index 78ae6b608..2fd1fe935 100644
--- a/docs/docs/migration/migrating-to-one-point-zero.mdx
+++ b/docs/docs/migration/migrating-to-one-point-zero.mdx
@@ -102,7 +102,7 @@ You can now connect Output components to any other component (that has a Text ou
Langflow 1.0 allows you to rename and edit the description of each component, making it easier to understand and interact with the flow. Learn how to customize your component names and descriptions for improved clarity.
-[Learn more about Component Descriptions](../getting-started/workspace#component-parameters)
+[Learn more about Component Descriptions](../getting-started/workspace#flows--components)
## Passing Tweaks and Inputs in the API
diff --git a/docs/docs/whats-new/a-new-chapter-langflow.mdx b/docs/docs/whats-new/a-new-chapter-langflow.mdx
index ccdaf8426..c44476ea1 100644
--- a/docs/docs/whats-new/a-new-chapter-langflow.mdx
+++ b/docs/docs/whats-new/a-new-chapter-langflow.mdx
@@ -1,96 +1,184 @@
+import ZoomableImage from "/src/theme/ZoomableImage.js";
+
# A new chapter for Langflow
-# First things first
+## First things first
-**Thank you all for being part of the Langflow community**. The journey so far has been amazing and we are happy to have you with us.
+**Thank you all for being part of the Langflow community**. The journey so far has been amazing, and we are thrilled to have you with us.
-We have some exciting news to share with you. Langflow is changing, and we want to tell you all about it.
+We have some exciting news to share with you. Langflow is evolving, and we want to tell you all about it!
-## Where have we been?
+## What's new?
-We spent the last few months working on a new version of Langflow. We wanted to make it more powerful, more flexible, and easier to use.
-We're moving from version 0.6 straight to 1.0 (preview). This is a big change, and we want to explain why we're doing it and what it means for you.
+In the past year, we learned a lot from the community and our users. We saw the potential of Langflow and the need for a visual, interactive platform for building conversational AI applications (and beyond). You thought us the importance of a platform that is easy to use, but also powerful and controllable, and that made clear to us how Langflow's transparency could be improved.
-## Why?
+Below are some of the new features we included to make that happen!
-In the past year, we learned a lot from the community and our users. We saw the potential of Langflow and the need for a more powerful and flexible tool for building conversational AI applications (and beyond).
-We realized that Langflow was hiding things from you that would really help you build better and more complex conversational AI applications. So we decided to make a big change.
+### Same Component, Multiple Outputs
-## The only way to go is forward
+Components can now have more than a single output, allowing for unique flexibility in creating complex flows. The game-changer is output routing — it allows for so many new capabilities it’s almost silly to describe!
-From all the people we talked to, we learned that the most important thing for (most of) them is to have a tool that is easy to use, but also powerful and controllable. They also told us that Langflow's transparency could be improved.
+1. Branch to one or more subsequent components;
+2. Apply logic operations like if/else and exploit decision-making;
+3. Create classification models that choose between paths;
+4. Enable the development of agent architectures from scratch;
+5. Build an orchestrator that routes between agents.
-In those points, we saw an opportunity to make Langflow much more powerful and flexible, while also making it easier to use and understand.
+
-One key change you'll notice is that projects now require you to define Inputs and Outputs.
-This is a big change, but it's also a big improvement.
-It allows you to define the structure of your conversation and the data that flows through it.
-This makes it easier to understand and control your conversation.
+### Flow + Composition
-This change comes with a new way of visualizing your projects. Before 1.0 you would connect Components to ultimately build one final Component that was processed behind the scenes.
-Now, each step of the process is defined by you, is visible on the workspace, and can be monitored and controlled by you. This makes it so that Composition is now just another way of building in Langflow. **Now data flows through your project more transparently**.
+One key change you'll notice is that projects now require you to define **Inputs** and **Outputs**. They allow you to define the structure of your conversation and how data flows through it. This change comes with a new way of visualizing your projects.
-The caveat is existing projects may need some new Components to get them back to their full functionality.
-[We've made this as easy as possible](../migration/compatibility), and there will be improvements to it as we get feedback in our Discord server and on GitHub.
+Before 1.0 you would connect components to ultimately build one final component that was processed behind the scenes. Now, each step of the process is defined by you, is visible on the workspace, and can be monitored and controlled.
-## Custom Interactions
+This makes it so that composition is now just **another way** of building in Langflow and **data flows through your project more transparently**. This means that the easy stuff is *really* easy and the complex parts are still possible!
-The moment we decided to make this change, we saw the potential to make Langflow even more yours.
-By having a clear definition of Inputs and Outputs, we could build the experience around that which led us to create the **Playground**.
+- **Flow:** Data is processed by one component and then passed to the next component in line for immediate execution.
+- **Composition**: Allows components to not only forward data but also share states for modular building.
-When building a project testing and debugging is crucial. The Playground is a tool that changes dynamically based on the Inputs and Outputs you defined in your project.
+For example, a flow can sequentially process text, and after a few steps, trigger an agent. It can access functions that wait to be called or to respond. This blend of flow and composition brings an unprecedented level of flexibility and control to data workflows in LLM-based apps and agents that use multiple models and APIs working together to achieve tasks.
-For example, let's say you are building a simple RAG application. Generally, you have an Input, some references that come from a Vector Store Search, a Prompt and the answer.
-Now, you could plug the output of your Prompt into a [Text Output](../components/inputs-and-outputs), rename that to "Prompt Result" and see the output of your Prompt in the Playground.
+
-{/* Add image here of the described above */}
+### Memory Management
-This is just one example of how the Playground can help you build and debug your projects.
+Langflow 1.0 natively allows every chat message to be stored, and a single flow can have multiple memory sessions. This enables you to create multiple “memories” for agents to store and recall specific information as needed.
-We have many planned features for the Playground, and we're excited to see how you use it and what you think of it.
+You can edit and remove previous messages to inspect and validate a model’s response behavior. Control, explore, and manage conversation histories to get your models acting just right.
-## An easier start
+
-The experience for the first-time user is also something we wanted to improve.
+### Component Freeze 🥶
-Meet the new and improved **New Project** screen. It's now easier to start a new project, and you can choose from a list of starter projects to get you started.
+Component output freezing is back in Langflow, and it’s cooler than ever!
-{/* Add new project image */}
+Once a component runs, you can now lock its previous output state to prevent it from re-running.
-We wanted to create start projects that would help you learn about new features and also give you a head start on your projects.
+Avoid spending extra tokens and remove repetition when output should be constant — plus it's great for debugging and prototyping!
+
+
+
+### Output Preview
+
+Each component now includes an output visualizer that opens a pop-up screen, allowing you to easily inspect and monitor transmissions between components. It provides instant feedback on your workflows, letting you see results as they are processed. 🔍
+
+
+
+### Inputs and Outputs Handling
+
+Inputs and outputs finally make more sense to us, and hopefully to you too.
+
+We’re proposing Langflow-native types to keep things consistent, but not limited to use any Python type. For instance, a Chat Input component sends out what we call a Message object (text + metadata like date, time, and sender), but maybe you want to introduce external types from your favorite Python package? Go wild. Each native type will have their own visualization modes and will evolve according to new integrations added.
+
+### Custom Endpoint Name
+
+Now you can pick a custom name for your endpoint used to call your flow from the API.
+
+
+
+### Logs & Monitoring
+
+A new logs page has been added! Now, both component executions and message history from the chat can be inspected in an interactive table. This will make it easier to debug, inspect, and manage messages passing through components.
+
+
+
+### Folders 📁
+
+We introduced folders on the home page to help categorize flows and components. Create, remove and edit them to keep your work organized.
+
+### Playground
+
+By having a clear definition of Inputs and Outputs, we could build the experience around that, which led us to create the Playground. When building a project, testing and debugging are crucial. The Playground is an interface that changes dynamically based on the Inputs and Outputs you defined in your project.
+
+For example, let's say you are building a simple RAG application. Generally, you have an Input, some references that come from a Vector Store Search, a Prompt, and the answer. Now, you could plug the output of your Prompt into a Text Output, rename that to "Prompt Result," and see the output of your Prompt in the Playground. We have many planned features for the Playground, and we're excited to see how you'll explore it!
+
+### Multi-Modal
+
+Langflow is now multi-modal! It can now handle images and more soon!
+
+
+
+We’ve also improved project organization, global variables and overall settings, added Python 3.12 compatibility, keyboard shortcuts and a lot of new and fun experimental components!
+
+## An Easier Start
+
+The experience for first-time users is something we wanted to improve. For that we created a couple of Starter Projects. It's now much easier to start a new project, and you can choose from a list of starter projects to get you going.
For now, we have:
-- **[Basic Prompting (Hello, World)](/starter-projects/basic-prompting)**: A simple flow that shows you how to use the Prompt Component and how to talk like a pirate.
-- **[Vector Store RAG](/tutorials/rag-with-astradb)**: A flow that shows you how to ingest data into a Vector Store and then use it to run a RAG application.
-- **[Memory Chatbot](/starter-projects/memory-chatbot)**: This one shows you how to create a simple chatbot that can remember things about the user.
-- **[Document QA](/starter-projects/document-qa)**: This flow shows you how to build a simple flow that helps you get answers about a document.
-- **[Blog Writer](/starter-projects/blog-writer)**: Shows you how you can expand on the Prompt variables and be creative about what inputs you add to it.
+- **Basic Prompting (Hello, World)**: Learn the basics of a Prompt Component.
+- **Vector Store RAG**: Ingest data into a Vector Store and then use it to run a RAG application.
+- **Memory Chatbot**: Create a simple chatbot that can remember things about the user.
+- **Document QA**: Build a simple flow that helps you get answers about a document.
+- **Blog Writer**: Expand on the Prompt variables and be creative about what inputs you add to it.
-As always, your feedback is invaluable, so please let us know what you think of the new starter projects and what you would like to see in the future.
+Please let us know what other starter projects you would like to see in the future!
-## Less is more
+---
-We added many new Components to Langflow and updated some of the existing ones, and we will deprecate some of them.
+## What's Next?
-The idea is that Langflow has evolved, and we want to make sure that the Components you use are the best they can be.
-Some of them don't work well with the others, and some of them are just not needed anymore.
+Langflow has gone through a big change, and we are excited to see how you use it and what you think of it. We plan to add more types of Input and Output like Image and Audio, and we also plan to add more Components to help you build more complex projects.
-We are working on a list of Components that will be deprecated.
-In the preview stages of 1.0, we will have a smaller list of Components so that we make sure that the ones we have are the best they can be.
-Regardless, community feedback is very important in this matter, so please let us know what you think of the new Components and which ones you miss.
+We are excited to see the community embracing Langflow as their number one AI builder and eagerly wait to see what new inspiring projects will come out of this release! A big thanks to everyone who's supporting or being part of this community in any way. ✨
-We are aiming at having a more stable and reliable set of Components that helps you get quickly to useful results.
-This also means that your contributions in the [Langflow Store](https://langflow.store) and throughout the community are more important than ever.
+Sincerely,
-## What's next?
-
-Langflow went through a big change, and we are excited to see how you use it and what you think of it.
-
-We plan to add more types of Input and Output like Image and Audio, and we also plan to add more Components to help you build more complex projects.
-
-We also have some experimental features like a State Management System (so cool!) and a new way of building Grouped Components that we are excited to show you.
-
-## Reach out
-
-One last time, we want to thank you for being part of the Langflow community. Your feedback is invaluable, and we want to hear from you.
+**The Langflow Team 🚀**
\ No newline at end of file
diff --git a/docs/static/img/component-freeze.jpeg b/docs/static/img/component-freeze.jpeg
new file mode 100644
index 000000000..d06b8000b
Binary files /dev/null and b/docs/static/img/component-freeze.jpeg differ
diff --git a/docs/static/img/custom-endpoint.webp b/docs/static/img/custom-endpoint.webp
new file mode 100644
index 000000000..f6b1a88ed
Binary files /dev/null and b/docs/static/img/custom-endpoint.webp differ
diff --git a/docs/static/img/flow-composition.webp b/docs/static/img/flow-composition.webp
new file mode 100644
index 000000000..f3075512d
Binary files /dev/null and b/docs/static/img/flow-composition.webp differ
diff --git a/docs/static/img/logs-monitoring.webp b/docs/static/img/logs-monitoring.webp
new file mode 100644
index 000000000..02b6877d4
Binary files /dev/null and b/docs/static/img/logs-monitoring.webp differ
diff --git a/docs/static/img/multi-modal.png b/docs/static/img/multi-modal.png
new file mode 100644
index 000000000..1b42c3d47
Binary files /dev/null and b/docs/static/img/multi-modal.png differ
diff --git a/docs/static/img/multiple_outputs.webp b/docs/static/img/multiple_outputs.webp
new file mode 100644
index 000000000..72c71f96c
Binary files /dev/null and b/docs/static/img/multiple_outputs.webp differ
diff --git a/docs/static/img/output-preview.gif b/docs/static/img/output-preview.gif
new file mode 100644
index 000000000..b200ffba7
Binary files /dev/null and b/docs/static/img/output-preview.gif differ
diff --git a/docs/static/img/playground.png b/docs/static/img/playground.png
new file mode 100644
index 000000000..a1ae092ff
Binary files /dev/null and b/docs/static/img/playground.png differ
diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting (Hello, World).json b/src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting (Hello, World).json
index 283e12da9..163384b2c 100644
--- a/src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting (Hello, World).json
+++ b/src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting (Hello, World).json
@@ -2,11 +2,10 @@
"data": {
"edges": [
{
- "className": "",
"data": {
"sourceHandle": {
"dataType": "ChatInput",
- "id": "ChatInput-cIXVH",
+ "id": "ChatInput-pxptT",
"name": "message",
"output_types": [
"Message"
@@ -14,7 +13,7 @@
},
"targetHandle": {
"fieldName": "user_input",
- "id": "Prompt-Ejl8w",
+ "id": "Prompt-1S5SU",
"inputTypes": [
"Message",
"Text"
@@ -22,18 +21,17 @@
"type": "str"
}
},
- "id": "reactflow__edge-ChatInput-cIXVH{œdataTypeœ:œChatInputœ,œidœ:œChatInput-cIXVHœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-Ejl8w{œfieldNameœ:œuser_inputœ,œidœ:œPrompt-Ejl8wœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
- "source": "ChatInput-cIXVH",
- "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-cIXVHœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}",
- "target": "Prompt-Ejl8w",
- "targetHandle": "{œfieldNameœ: œuser_inputœ, œidœ: œPrompt-Ejl8wœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
+ "id": "reactflow__edge-ChatInput-pxptT{œdataTypeœ:œChatInputœ,œidœ:œChatInput-pxptTœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-1S5SU{œfieldNameœ:œuser_inputœ,œidœ:œPrompt-1S5SUœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
+ "source": "ChatInput-pxptT",
+ "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-pxptTœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "Prompt-1S5SU",
+ "targetHandle": "{œfieldNameœ: œuser_inputœ, œidœ: œPrompt-1S5SUœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
},
{
- "className": "",
"data": {
"sourceHandle": {
"dataType": "Prompt",
- "id": "Prompt-Ejl8w",
+ "id": "Prompt-1S5SU",
"name": "prompt",
"output_types": [
"Message"
@@ -41,25 +39,24 @@
},
"targetHandle": {
"fieldName": "input_value",
- "id": "OpenAIModel-FAF7r",
+ "id": "OpenAIModel-nJXWj",
"inputTypes": [
"Message"
],
"type": "str"
}
},
- "id": "reactflow__edge-Prompt-Ejl8w{œdataTypeœ:œPromptœ,œidœ:œPrompt-Ejl8wœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-FAF7r{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-FAF7rœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
- "source": "Prompt-Ejl8w",
- "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-Ejl8wœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}",
- "target": "OpenAIModel-FAF7r",
- "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-FAF7rœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
+ "id": "reactflow__edge-Prompt-1S5SU{œdataTypeœ:œPromptœ,œidœ:œPrompt-1S5SUœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-nJXWj{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-nJXWjœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
+ "source": "Prompt-1S5SU",
+ "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-1S5SUœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "OpenAIModel-nJXWj",
+ "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-nJXWjœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
},
{
- "className": "",
"data": {
"sourceHandle": {
"dataType": "OpenAIModel",
- "id": "OpenAIModel-FAF7r",
+ "id": "OpenAIModel-nJXWj",
"name": "text_output",
"output_types": [
"Message"
@@ -67,147 +64,24 @@
},
"targetHandle": {
"fieldName": "input_value",
- "id": "ChatOutput-riTzX",
+ "id": "ChatOutput-XP4bj",
"inputTypes": [
"Message"
],
"type": "str"
}
},
- "id": "reactflow__edge-OpenAIModel-FAF7r{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-FAF7rœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-riTzX{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-riTzXœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
- "source": "OpenAIModel-FAF7r",
- "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-FAF7rœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}",
- "target": "ChatOutput-riTzX",
- "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-riTzXœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
+ "id": "reactflow__edge-OpenAIModel-nJXWj{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-nJXWjœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-XP4bj{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-XP4bjœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
+ "source": "OpenAIModel-nJXWj",
+ "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-nJXWjœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "ChatOutput-XP4bj",
+ "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-XP4bjœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
}
],
"nodes": [
{
"data": {
- "description": "Create a prompt template with dynamic variables.",
- "display_name": "Prompt",
- "edited": false,
- "id": "Prompt-Ejl8w",
- "node": {
- "base_classes": [
- "Message"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {
- "template": [
- "user_input"
- ]
- },
- "description": "Create a prompt template with dynamic variables.",
- "display_name": "Prompt",
- "documentation": "",
- "edited": true,
- "field_order": [
- "template"
- ],
- "frozen": false,
- "icon": "prompts",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Prompt Message",
- "hidden": false,
- "method": "build_prompt",
- "name": "prompt",
- "selected": "Message",
- "types": [
- "Message"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "show": true,
- "title_case": false,
- "type": "code",
- "value": "from langflow.base.prompts.api_utils import process_prompt_template\nfrom langflow.custom import Component\nfrom langflow.io import Output, PromptInput\nfrom langflow.schema.message import Message\nfrom langflow.template.utils import update_template_values\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\n def post_code_processing(self, new_build_config: dict, current_build_config: dict):\n \"\"\"\n This function is called after the code validation is done.\n \"\"\"\n frontend_node = super().post_code_processing(new_build_config, current_build_config)\n template = frontend_node[\"template\"][\"template\"][\"value\"]\n _ = process_prompt_template(\n template=template,\n name=\"template\",\n custom_fields=frontend_node[\"custom_fields\"],\n frontend_node_template=frontend_node[\"template\"],\n )\n # Now that template is updated, we need to grab any values that were set in the current_build_config\n # and update the frontend_node with those values\n update_template_values(frontend_template=frontend_node, raw_template=current_build_config[\"template\"])\n return frontend_node\n"
- },
- "template": {
- "advanced": false,
- "display_name": "Template",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "template",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_input": true,
- "type": "prompt",
- "value": "Answer the user as if you were a pirate.\n\nUser: {user_input}\n\nAnswer: "
- },
- "user_input": {
- "advanced": false,
- "display_name": "user_input",
- "dynamic": false,
- "field_type": "str",
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "input_types": [
- "Message",
- "Text"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "user_input",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- }
- }
- },
- "type": "Prompt"
- },
- "dragging": false,
- "height": 422,
- "id": "Prompt-Ejl8w",
- "position": {
- "x": 43.70859256635981,
- "y": 1115.5304359666682
- },
- "positionAbsolute": {
- "x": 43.70859256635981,
- "y": 1115.5304359666682
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "description": "Get chat inputs from the Playground.",
- "display_name": "Chat Input",
- "edited": false,
- "id": "ChatInput-cIXVH",
+ "id": "ChatInput-pxptT",
"node": {
"base_classes": [
"Message"
@@ -218,7 +92,7 @@
"description": "Get chat inputs from the Playground.",
"display_name": "Chat Input",
"documentation": "",
- "edited": true,
+ "edited": false,
"field_order": [
"input_value",
"sender",
@@ -262,7 +136,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, 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 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 TextInput(\n name=\"sender_name\",\n display_name=\"Sender Name\",\n info=\"Name of the sender.\",\n value=\"User\",\n advanced=True,\n ),\n TextInput(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, MessageTextInput, MultilineInput, Output\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(\n name=\"session_id\", 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"
},
"files": {
"advanced": true,
@@ -390,14 +264,14 @@
},
"dragging": false,
"height": 308,
- "id": "ChatInput-cIXVH",
+ "id": "ChatInput-pxptT",
"position": {
- "x": -521.3324537445985,
- "y": 1089.7620993695407
+ "x": -493.6459512396177,
+ "y": 1083.200545525551
},
"positionAbsolute": {
- "x": -521.3324537445985,
- "y": 1089.7620993695407
+ "x": -493.6459512396177,
+ "y": 1083.200545525551
},
"selected": false,
"type": "genericNode",
@@ -405,10 +279,132 @@
},
{
"data": {
- "description": "Generates text using OpenAI LLMs.",
- "display_name": "OpenAI",
- "edited": false,
- "id": "OpenAIModel-FAF7r",
+ "description": "Create a prompt template with dynamic variables.",
+ "display_name": "Prompt",
+ "id": "Prompt-1S5SU",
+ "node": {
+ "base_classes": [
+ "Message"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {
+ "template": [
+ "user_input"
+ ]
+ },
+ "description": "Create a prompt template with dynamic variables.",
+ "display_name": "Prompt",
+ "documentation": "",
+ "edited": false,
+ "error": null,
+ "field_order": [
+ "template"
+ ],
+ "frozen": false,
+ "full_path": null,
+ "icon": "prompts",
+ "is_composition": null,
+ "is_input": null,
+ "is_output": null,
+ "name": "",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Prompt Message",
+ "hidden": false,
+ "method": "build_prompt",
+ "name": "prompt",
+ "selected": "Message",
+ "types": [
+ "Message"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "_type": "Component",
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "show": true,
+ "title_case": false,
+ "type": "code",
+ "value": "from langflow.base.prompts.api_utils import process_prompt_template\nfrom langflow.custom import Component\nfrom langflow.io import Output, PromptInput\nfrom langflow.schema.message import Message\nfrom langflow.template.utils import update_template_values\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\n def post_code_processing(self, new_build_config: dict, current_build_config: dict):\n \"\"\"\n This function is called after the code validation is done.\n \"\"\"\n frontend_node = super().post_code_processing(new_build_config, current_build_config)\n template = frontend_node[\"template\"][\"template\"][\"value\"]\n _ = process_prompt_template(\n template=template,\n name=\"template\",\n custom_fields=frontend_node[\"custom_fields\"],\n frontend_node_template=frontend_node[\"template\"],\n )\n # Now that template is updated, we need to grab any values that were set in the current_build_config\n # and update the frontend_node with those values\n update_template_values(frontend_template=frontend_node, raw_template=current_build_config[\"template\"])\n return frontend_node\n"
+ },
+ "template": {
+ "advanced": false,
+ "display_name": "Template",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "template",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "type": "prompt",
+ "value": "Answer the user as if you were a pirate.\n\nUser: {user_input}\n\nAnswer: "
+ },
+ "user_input": {
+ "advanced": false,
+ "display_name": "user_input",
+ "dynamic": false,
+ "field_type": "str",
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "input_types": [
+ "Message",
+ "Text"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "user_input",
+ "password": false,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ }
+ }
+ },
+ "type": "Prompt"
+ },
+ "dragging": false,
+ "height": 422,
+ "id": "Prompt-1S5SU",
+ "position": {
+ "x": 56.354011530798516,
+ "y": 1157.2005405164796
+ },
+ "positionAbsolute": {
+ "x": 56.354011530798516,
+ "y": 1157.2005405164796
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ },
+ {
+ "data": {
+ "id": "OpenAIModel-nJXWj",
"node": {
"base_classes": [
"LanguageModel",
@@ -420,7 +416,7 @@
"description": "Generates text using OpenAI LLMs.",
"display_name": "OpenAI",
"documentation": "",
- "edited": true,
+ "edited": false,
"field_order": [
"input_value",
"max_tokens",
@@ -668,14 +664,14 @@
},
"dragging": false,
"height": 621,
- "id": "OpenAIModel-FAF7r",
+ "id": "OpenAIModel-nJXWj",
"position": {
- "x": 584.9288140250019,
- "y": 1149.0790574268922
+ "x": 624.3539730827923,
+ "y": 1053.2005475562555
},
"positionAbsolute": {
- "x": 584.9288140250019,
- "y": 1149.0790574268922
+ "x": 624.3539730827923,
+ "y": 1053.2005475562555
},
"selected": false,
"type": "genericNode",
@@ -683,10 +679,7 @@
},
{
"data": {
- "description": "Display a chat message in the Playground.",
- "display_name": "Chat Output",
- "edited": false,
- "id": "ChatOutput-riTzX",
+ "id": "ChatOutput-XP4bj",
"node": {
"base_classes": [
"Message"
@@ -697,7 +690,7 @@
"description": "Display a chat message in the Playground.",
"display_name": "Chat Output",
"documentation": "",
- "edited": true,
+ "edited": false,
"field_order": [
"input_value",
"sender",
@@ -740,7 +733,7 @@
"show": true,
"title_case": false,
"type": "code",
- "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"
+ "value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.io import DropdownInput, MessageTextInput, Output\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(\n name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True\n ),\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"
},
"data_template": {
"advanced": true,
@@ -846,14 +839,14 @@
},
"dragging": false,
"height": 308,
- "id": "ChatOutput-riTzX",
+ "id": "ChatOutput-XP4bj",
"position": {
- "x": 1157.3374592784412,
- "y": 1160.9424490383622
+ "x": 1219.477374823274,
+ "y": 1200.950216973985
},
"positionAbsolute": {
- "x": 1157.3374592784412,
- "y": 1160.9424490383622
+ "x": 1219.477374823274,
+ "y": 1200.950216973985
},
"selected": false,
"type": "genericNode",
@@ -861,14 +854,14 @@
}
],
"viewport": {
- "x": 382.9033026612555,
- "y": -365.74767124549675,
- "zoom": 0.5000000338450783
+ "x": 392.1085223509972,
+ "y": -327.49805229761307,
+ "zoom": 0.5000000676901589
}
},
"description": "This flow will get you experimenting with the basics of the UI, the Chat and the Prompt component. \n\nTry changing the Template in it to see how the model behaves. \nYou can change it to this and a Text Input into the `type_of_person` variable : \"Answer the user as if you were a pirate.\n\nUser: {user_input}\n\nAnswer: \" ",
"endpoint_name": null,
- "id": "52f28cee-19d7-48c4-ac36-12a6cc32206b",
+ "id": "f652abdc-7ef2-4e52-a00b-847b7aa32cee",
"is_component": false,
"last_tested_version": "1.0.0rc1",
"name": "Basic Prompting (Hello, World)"
diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Blog Writer.json b/src/backend/base/langflow/initial_setup/starter_projects/Blog Writer.json
index 9c9c107a0..ec4a19aac 100644
--- a/src/backend/base/langflow/initial_setup/starter_projects/Blog Writer.json
+++ b/src/backend/base/langflow/initial_setup/starter_projects/Blog Writer.json
@@ -2,38 +2,10 @@
"data": {
"edges": [
{
- "className": "",
- "data": {
- "sourceHandle": {
- "dataType": "TextInput",
- "id": "TextInput-TDpSd",
- "name": "text",
- "output_types": [
- "Message"
- ]
- },
- "targetHandle": {
- "fieldName": "instructions",
- "id": "Prompt-kfWwQ",
- "inputTypes": [
- "Message",
- "Text"
- ],
- "type": "str"
- }
- },
- "id": "reactflow__edge-TextInput-TDpSd{œdataTypeœ:œTextInputœ,œidœ:œTextInput-TDpSdœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-kfWwQ{œfieldNameœ:œinstructionsœ,œidœ:œPrompt-kfWwQœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
- "source": "TextInput-TDpSd",
- "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-TDpSdœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}",
- "target": "Prompt-kfWwQ",
- "targetHandle": "{œfieldNameœ: œinstructionsœ, œidœ: œPrompt-kfWwQœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
- },
- {
- "className": "",
"data": {
"sourceHandle": {
"dataType": "URL",
- "id": "URL-hivMA",
+ "id": "URL-k9NkE",
"name": "data",
"output_types": [
"Data"
@@ -41,25 +13,24 @@
},
"targetHandle": {
"fieldName": "data",
- "id": "ParseData-O4Tzh",
+ "id": "ParseData-EwWXd",
"inputTypes": [
"Data"
],
"type": "other"
}
},
- "id": "reactflow__edge-URL-hivMA{œdataTypeœ:œURLœ,œidœ:œURL-hivMAœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-ParseData-O4Tzh{œfieldNameœ:œdataœ,œidœ:œParseData-O4Tzhœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}",
- "source": "URL-hivMA",
- "sourceHandle": "{œdataTypeœ: œURLœ, œidœ: œURL-hivMAœ, œnameœ: œdataœ, œoutput_typesœ: [œDataœ]}",
- "target": "ParseData-O4Tzh",
- "targetHandle": "{œfieldNameœ: œdataœ, œidœ: œParseData-O4Tzhœ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}"
+ "id": "reactflow__edge-URL-k9NkE{œdataTypeœ:œURLœ,œidœ:œURL-k9NkEœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-ParseData-EwWXd{œfieldNameœ:œdataœ,œidœ:œParseData-EwWXdœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}",
+ "source": "URL-k9NkE",
+ "sourceHandle": "{œdataTypeœ: œURLœ, œidœ: œURL-k9NkEœ, œnameœ: œdataœ, œoutput_typesœ: [œDataœ]}",
+ "target": "ParseData-EwWXd",
+ "targetHandle": "{œfieldNameœ: œdataœ, œidœ: œParseData-EwWXdœ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}"
},
{
- "className": "",
"data": {
"sourceHandle": {
"dataType": "ParseData",
- "id": "ParseData-O4Tzh",
+ "id": "ParseData-EwWXd",
"name": "text",
"output_types": [
"Message"
@@ -67,7 +38,7 @@
},
"targetHandle": {
"fieldName": "references",
- "id": "Prompt-kfWwQ",
+ "id": "Prompt-B9Mq6",
"inputTypes": [
"Message",
"Text"
@@ -75,18 +46,43 @@
"type": "str"
}
},
- "id": "reactflow__edge-ParseData-O4Tzh{œdataTypeœ:œParseDataœ,œidœ:œParseData-O4Tzhœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-kfWwQ{œfieldNameœ:œreferencesœ,œidœ:œPrompt-kfWwQœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
- "source": "ParseData-O4Tzh",
- "sourceHandle": "{œdataTypeœ: œParseDataœ, œidœ: œParseData-O4Tzhœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}",
- "target": "Prompt-kfWwQ",
- "targetHandle": "{œfieldNameœ: œreferencesœ, œidœ: œPrompt-kfWwQœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
+ "id": "reactflow__edge-ParseData-EwWXd{œdataTypeœ:œParseDataœ,œidœ:œParseData-EwWXdœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-B9Mq6{œfieldNameœ:œreferencesœ,œidœ:œPrompt-B9Mq6œ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
+ "source": "ParseData-EwWXd",
+ "sourceHandle": "{œdataTypeœ: œParseDataœ, œidœ: œParseData-EwWXdœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "Prompt-B9Mq6",
+ "targetHandle": "{œfieldNameœ: œreferencesœ, œidœ: œPrompt-B9Mq6œ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
+ },
+ {
+ "data": {
+ "sourceHandle": {
+ "dataType": "TextInput",
+ "id": "TextInput-uf6ij",
+ "name": "text",
+ "output_types": [
+ "Message"
+ ]
+ },
+ "targetHandle": {
+ "fieldName": "instructions",
+ "id": "Prompt-B9Mq6",
+ "inputTypes": [
+ "Message",
+ "Text"
+ ],
+ "type": "str"
+ }
+ },
+ "id": "reactflow__edge-TextInput-uf6ij{œdataTypeœ:œTextInputœ,œidœ:œTextInput-uf6ijœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-B9Mq6{œfieldNameœ:œinstructionsœ,œidœ:œPrompt-B9Mq6œ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
+ "source": "TextInput-uf6ij",
+ "sourceHandle": "{œdataTypeœ: œTextInputœ, œidœ: œTextInput-uf6ijœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "Prompt-B9Mq6",
+ "targetHandle": "{œfieldNameœ: œinstructionsœ, œidœ: œPrompt-B9Mq6œ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
},
{
- "className": "",
"data": {
"sourceHandle": {
"dataType": "Prompt",
- "id": "Prompt-kfWwQ",
+ "id": "Prompt-B9Mq6",
"name": "prompt",
"output_types": [
"Message"
@@ -94,25 +90,24 @@
},
"targetHandle": {
"fieldName": "input_value",
- "id": "OpenAIModel-hVXLt",
+ "id": "OpenAIModel-X9ukk",
"inputTypes": [
"Message"
],
"type": "str"
}
},
- "id": "reactflow__edge-Prompt-kfWwQ{œdataTypeœ:œPromptœ,œidœ:œPrompt-kfWwQœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-hVXLt{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-hVXLtœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
- "source": "Prompt-kfWwQ",
- "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-kfWwQœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}",
- "target": "OpenAIModel-hVXLt",
- "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-hVXLtœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
+ "id": "reactflow__edge-Prompt-B9Mq6{œdataTypeœ:œPromptœ,œidœ:œPrompt-B9Mq6œ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-X9ukk{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-X9ukkœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
+ "source": "Prompt-B9Mq6",
+ "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-B9Mq6œ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "OpenAIModel-X9ukk",
+ "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-X9ukkœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
},
{
- "className": "",
"data": {
"sourceHandle": {
"dataType": "OpenAIModel",
- "id": "OpenAIModel-hVXLt",
+ "id": "OpenAIModel-X9ukk",
"name": "text_output",
"output_types": [
"Message"
@@ -120,54 +115,51 @@
},
"targetHandle": {
"fieldName": "input_value",
- "id": "ChatOutput-HrMHH",
+ "id": "ChatOutput-5r5Iw",
"inputTypes": [
"Message"
],
"type": "str"
}
},
- "id": "reactflow__edge-OpenAIModel-hVXLt{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-hVXLtœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-HrMHH{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-HrMHHœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
- "source": "OpenAIModel-hVXLt",
- "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-hVXLtœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}",
- "target": "ChatOutput-HrMHH",
- "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-HrMHHœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
+ "id": "reactflow__edge-OpenAIModel-X9ukk{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-X9ukkœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-5r5Iw{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-5r5Iwœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
+ "source": "OpenAIModel-X9ukk",
+ "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-X9ukkœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "ChatOutput-5r5Iw",
+ "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-5r5Iwœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
}
],
"nodes": [
{
"data": {
- "description": "Get text inputs from the Playground.",
- "display_name": "Instructions",
- "edited": false,
- "id": "TextInput-TDpSd",
+ "id": "URL-k9NkE",
"node": {
"base_classes": [
- "Message"
+ "Data"
],
"beta": false,
"conditional_paths": [],
"custom_fields": {},
- "description": "Get text inputs from the Playground.",
- "display_name": "Instructions",
+ "description": "Fetch content from one or more URLs.",
+ "display_name": "URL",
"documentation": "",
- "edited": true,
+ "edited": false,
"field_order": [
- "input_value"
+ "urls"
],
"frozen": false,
- "icon": "type",
+ "icon": "layout-template",
"output_types": [],
"outputs": [
{
"cache": true,
- "display_name": "Text",
+ "display_name": "Data",
"hidden": false,
- "method": "text_response",
- "name": "text",
- "selected": "Message",
+ "method": "fetch_content",
+ "name": "data",
+ "selected": "Data",
"types": [
- "Message"
+ "Data"
],
"value": "__UNDEFINED__"
}
@@ -191,40 +183,45 @@
"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 TextInputComponent(TextComponent):\n display_name = \"Text Input\"\n description = \"Get text inputs from 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 input.\",\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 return message\n"
+ "value": "import re\n\nfrom langchain_community.document_loaders.web_base import WebBaseLoader\n\nfrom langflow.custom import Component\nfrom langflow.io import MessageTextInput, Output\nfrom langflow.schema import Data\n\n\nclass URLComponent(Component):\n display_name = \"URL\"\n description = \"Fetch content from one or more URLs.\"\n icon = \"layout-template\"\n\n inputs = [\n MessageTextInput(\n name=\"urls\",\n display_name=\"URLs\",\n info=\"Enter one or more URLs, separated by commas.\",\n is_list=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"data\", method=\"fetch_content\"),\n ]\n\n def ensure_url(self, string: str) -> str:\n \"\"\"\n Ensures the given string is a URL by adding 'http://' if it doesn't start with 'http://' or 'https://'.\n Raises an error if the string is not a valid URL.\n\n Parameters:\n string (str): The string to be checked and possibly modified.\n\n Returns:\n str: The modified string that is ensured to be a URL.\n\n Raises:\n ValueError: If the string is not a valid URL.\n \"\"\"\n if not string.startswith((\"http://\", \"https://\")):\n string = \"http://\" + string\n\n # Basic URL validation regex\n url_regex = re.compile(\n r\"^(https?:\\/\\/)?\" # optional protocol\n r\"(www\\.)?\" # optional www\n r\"([a-zA-Z0-9.-]+)\" # domain\n r\"(\\.[a-zA-Z]{2,})?\" # top-level domain\n r\"(:\\d+)?\" # optional port\n r\"(\\/[^\\s]*)?$\", # optional path\n re.IGNORECASE,\n )\n\n if not url_regex.match(string):\n raise ValueError(f\"Invalid URL: {string}\")\n\n return string\n\n def fetch_content(self) -> list[Data]:\n urls = [self.ensure_url(url.strip()) for url in self.urls if url.strip()]\n loader = WebBaseLoader(web_paths=urls, encoding=\"utf-8\")\n docs = loader.load()\n data = [Data(text=doc.page_content, **doc.metadata) for doc in docs]\n self.status = data\n return data\n"
},
- "input_value": {
+ "urls": {
"advanced": false,
- "display_name": "Text",
+ "display_name": "URLs",
"dynamic": false,
- "info": "Text to be passed as input.",
+ "info": "Enter one or more URLs, separated by commas.",
"input_types": [
"Message"
],
- "list": false,
+ "list": true,
"load_from_db": false,
- "name": "input_value",
+ "name": "urls",
"placeholder": "",
"required": false,
"show": true,
"title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
"type": "str",
- "value": "Use the references above for style to write a new blog/tutorial about Langflow and AI. Suggest non-covered topics."
+ "value": [
+ "langflow.org/",
+ "docs.langflow.org/"
+ ]
}
}
},
- "type": "TextInput"
+ "type": "URL"
},
"dragging": false,
- "height": 309,
- "id": "TextInput-TDpSd",
+ "height": 358,
+ "id": "URL-k9NkE",
"position": {
- "x": 735.806436564132,
- "y": 346.40301122327935
+ "x": 220.79156431407534,
+ "y": 498.8186168722667
},
"positionAbsolute": {
- "x": 735.806436564132,
- "y": 346.40301122327935
+ "x": 220.79156431407534,
+ "y": 498.8186168722667
},
"selected": false,
"type": "genericNode",
@@ -232,7 +229,7 @@
},
{
"data": {
- "id": "ParseData-O4Tzh",
+ "id": "ParseData-EwWXd",
"node": {
"base_classes": [
"Message"
@@ -243,6 +240,7 @@
"description": "Convert Data into plain text following a specified template.",
"display_name": "Parse Data",
"documentation": "",
+ "edited": false,
"field_order": [
"data",
"template",
@@ -300,6 +298,8 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
"type": "other",
"value": ""
},
@@ -310,26 +310,33 @@
"info": "",
"list": false,
"load_from_db": false,
- "multiline": true,
"name": "sep",
"placeholder": "",
"required": false,
"show": true,
"title_case": false,
+ "trace_as_metadata": true,
"type": "str",
- "value": "---"
+ "value": "\n"
},
"template": {
"advanced": false,
"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"
+ ],
+ "list": false,
+ "load_from_db": false,
"multiline": true,
"name": "template",
"placeholder": "",
"required": false,
"show": true,
"title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
"type": "str",
"value": "{text}"
}
@@ -338,15 +345,15 @@
"type": "ParseData"
},
"dragging": false,
- "height": 377,
- "id": "ParseData-O4Tzh",
+ "height": 384,
+ "id": "ParseData-EwWXd",
"position": {
- "x": 759.575501198118,
- "y": 760.6953079067359
+ "x": 754.3607306709101,
+ "y": 736.8516961537598
},
"positionAbsolute": {
- "x": 759.575501198118,
- "y": 760.6953079067359
+ "x": 754.3607306709101,
+ "y": 736.8516961537598
},
"selected": false,
"type": "genericNode",
@@ -354,10 +361,251 @@
},
{
"data": {
- "description": "Generates text using OpenAI LLMs.",
- "display_name": "OpenAI",
- "edited": false,
- "id": "OpenAIModel-hVXLt",
+ "description": "Create a prompt template with dynamic variables.",
+ "display_name": "Prompt",
+ "id": "Prompt-B9Mq6",
+ "node": {
+ "base_classes": [
+ "Message"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {
+ "template": [
+ "references",
+ "instructions"
+ ]
+ },
+ "description": "Create a prompt template with dynamic variables.",
+ "display_name": "Prompt",
+ "documentation": "",
+ "edited": false,
+ "error": null,
+ "field_order": [
+ "template"
+ ],
+ "frozen": false,
+ "full_path": null,
+ "icon": "prompts",
+ "is_composition": null,
+ "is_input": null,
+ "is_output": null,
+ "name": "",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Prompt Message",
+ "hidden": false,
+ "method": "build_prompt",
+ "name": "prompt",
+ "selected": "Message",
+ "types": [
+ "Message"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "_type": "Component",
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "show": true,
+ "title_case": false,
+ "type": "code",
+ "value": "from langflow.base.prompts.api_utils import process_prompt_template\nfrom langflow.custom import Component\nfrom langflow.io import Output, PromptInput\nfrom langflow.schema.message import Message\nfrom langflow.template.utils import update_template_values\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\n def post_code_processing(self, new_build_config: dict, current_build_config: dict):\n \"\"\"\n This function is called after the code validation is done.\n \"\"\"\n frontend_node = super().post_code_processing(new_build_config, current_build_config)\n template = frontend_node[\"template\"][\"template\"][\"value\"]\n _ = process_prompt_template(\n template=template,\n name=\"template\",\n custom_fields=frontend_node[\"custom_fields\"],\n frontend_node_template=frontend_node[\"template\"],\n )\n # Now that template is updated, we need to grab any values that were set in the current_build_config\n # and update the frontend_node with those values\n update_template_values(frontend_template=frontend_node, raw_template=current_build_config[\"template\"])\n return frontend_node\n"
+ },
+ "instructions": {
+ "advanced": false,
+ "display_name": "instructions",
+ "dynamic": false,
+ "field_type": "str",
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "input_types": [
+ "Message",
+ "Text"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "instructions",
+ "password": false,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ },
+ "references": {
+ "advanced": false,
+ "display_name": "references",
+ "dynamic": false,
+ "field_type": "str",
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "input_types": [
+ "Message",
+ "Text"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "references",
+ "password": false,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ },
+ "template": {
+ "advanced": false,
+ "display_name": "Template",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "template",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "type": "prompt",
+ "value": "Reference 1:\n\n{references}\n\n---\n\n{instructions}\n\nBlog: \n\n"
+ }
+ }
+ },
+ "type": "Prompt"
+ },
+ "dragging": false,
+ "height": 515,
+ "id": "Prompt-B9Mq6",
+ "position": {
+ "x": 1368.0633591447076,
+ "y": 467.19448061224284
+ },
+ "positionAbsolute": {
+ "x": 1368.0633591447076,
+ "y": 467.19448061224284
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ },
+ {
+ "data": {
+ "id": "TextInput-uf6ij",
+ "node": {
+ "base_classes": [
+ "Message"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {},
+ "description": "Get text inputs from the Playground.",
+ "display_name": "Instructions",
+ "documentation": "",
+ "edited": false,
+ "field_order": [
+ "input_value"
+ ],
+ "frozen": false,
+ "icon": "type",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Text",
+ "hidden": false,
+ "method": "text_response",
+ "name": "text",
+ "selected": "Message",
+ "types": [
+ "Message"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "_type": "Component",
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "show": true,
+ "title_case": false,
+ "type": "code",
+ "value": "from langflow.base.io.text import TextComponent\nfrom langflow.io import MessageTextInput, Output\nfrom langflow.schema.message import Message\n\n\nclass TextInputComponent(TextComponent):\n display_name = \"Text Input\"\n description = \"Get text inputs from 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 input.\",\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 return message\n"
+ },
+ "input_value": {
+ "advanced": false,
+ "display_name": "Text",
+ "dynamic": false,
+ "info": "Text to be passed as input.",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "input_value",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "Use the references above for style to write a new blog/tutorial about Langflow and AI. Suggest non-covered topics."
+ }
+ }
+ },
+ "type": "TextInput"
+ },
+ "dragging": false,
+ "height": 308,
+ "id": "TextInput-uf6ij",
+ "position": {
+ "x": 743.7338453293725,
+ "y": 301.58775454952183
+ },
+ "positionAbsolute": {
+ "x": 743.7338453293725,
+ "y": 301.58775454952183
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ },
+ {
+ "data": {
+ "id": "OpenAIModel-X9ukk",
"node": {
"base_classes": [
"LanguageModel",
@@ -369,7 +617,7 @@
"description": "Generates text using OpenAI LLMs.",
"display_name": "OpenAI",
"documentation": "",
- "edited": true,
+ "edited": false,
"field_order": [
"input_value",
"max_tokens",
@@ -447,6 +695,8 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
"type": "str",
"value": ""
},
@@ -461,6 +711,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_metadata": true,
"type": "int",
"value": ""
},
@@ -475,6 +726,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_input": true,
"type": "dict",
"value": {}
},
@@ -495,6 +747,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_metadata": true,
"type": "str",
"value": "gpt-4-turbo"
},
@@ -510,6 +763,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_metadata": true,
"type": "str",
"value": ""
},
@@ -540,6 +794,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_input": true,
"type": "dict",
"value": {}
},
@@ -554,11 +809,12 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_metadata": true,
"type": "int",
"value": 1
},
"stream": {
- "advanced": false,
+ "advanced": true,
"display_name": "Stream",
"dynamic": false,
"info": "Stream the response from the model. Streaming works only in Chat.",
@@ -568,8 +824,9 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_metadata": true,
"type": "bool",
- "value": true
+ "value": false
},
"system_message": {
"advanced": true,
@@ -583,6 +840,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_metadata": true,
"type": "str",
"value": ""
},
@@ -597,6 +855,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_metadata": true,
"type": "float",
"value": 0.1
}
@@ -605,26 +864,23 @@
"type": "OpenAIModel"
},
"dragging": false,
- "height": 699,
- "id": "OpenAIModel-hVXLt",
+ "height": 621,
+ "id": "OpenAIModel-X9ukk",
"position": {
- "x": 1918.8991680862073,
- "y": 459.92681406971394
+ "x": 1899.407626221589,
+ "y": 395.9013619556682
},
"positionAbsolute": {
- "x": 1918.8991680862073,
- "y": 459.92681406971394
+ "x": 1899.407626221589,
+ "y": 395.9013619556682
},
- "selected": true,
+ "selected": false,
"type": "genericNode",
"width": 384
},
{
"data": {
- "description": "Display a chat message in the Playground.",
- "display_name": "Chat Output",
- "edited": false,
- "id": "ChatOutput-HrMHH",
+ "id": "ChatOutput-5r5Iw",
"node": {
"base_classes": [
"Message"
@@ -635,7 +891,7 @@
"description": "Display a chat message in the Playground.",
"display_name": "Chat Output",
"documentation": "",
- "edited": true,
+ "edited": false,
"field_order": [
"input_value",
"sender",
@@ -783,257 +1039,15 @@
"type": "ChatOutput"
},
"dragging": false,
- "height": 309,
- "id": "ChatOutput-HrMHH",
+ "height": 308,
+ "id": "ChatOutput-5r5Iw",
"position": {
- "x": 2473.1294450647747,
- "y": 668.8159913425238
+ "x": 2449.3489426461606,
+ "y": 571.2449700910389
},
"positionAbsolute": {
- "x": 2473.1294450647747,
- "y": 668.8159913425238
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "description": "Create a prompt template with dynamic variables.",
- "display_name": "Prompt",
- "id": "Prompt-kfWwQ",
- "node": {
- "base_classes": [
- "Message"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {
- "template": [
- "references",
- "instructions"
- ]
- },
- "description": "Create a prompt template with dynamic variables.",
- "display_name": "Prompt",
- "documentation": "",
- "edited": false,
- "error": null,
- "field_order": [
- "template"
- ],
- "frozen": false,
- "full_path": null,
- "icon": "prompts",
- "is_composition": null,
- "is_input": null,
- "is_output": null,
- "name": "",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Prompt Message",
- "hidden": false,
- "method": "build_prompt",
- "name": "prompt",
- "selected": "Message",
- "types": [
- "Message"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "show": true,
- "title_case": false,
- "type": "code",
- "value": "from langflow.base.prompts.api_utils import process_prompt_template\nfrom langflow.custom import Component\nfrom langflow.io import Output, PromptInput\nfrom langflow.schema.message import Message\nfrom langflow.template.utils import update_template_values\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\n def post_code_processing(self, new_build_config: dict, current_build_config: dict):\n \"\"\"\n This function is called after the code validation is done.\n \"\"\"\n frontend_node = super().post_code_processing(new_build_config, current_build_config)\n template = frontend_node[\"template\"][\"template\"][\"value\"]\n _ = process_prompt_template(\n template=template,\n name=\"template\",\n custom_fields=frontend_node[\"custom_fields\"],\n frontend_node_template=frontend_node[\"template\"],\n )\n # Now that template is updated, we need to grab any values that were set in the current_build_config\n # and update the frontend_node with those values\n update_template_values(frontend_template=frontend_node, raw_template=current_build_config[\"template\"])\n return frontend_node\n"
- },
- "instructions": {
- "advanced": false,
- "display_name": "instructions",
- "dynamic": false,
- "field_type": "str",
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "input_types": [
- "Message",
- "Text"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "instructions",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "references": {
- "advanced": false,
- "display_name": "references",
- "dynamic": false,
- "field_type": "str",
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "input_types": [
- "Message",
- "Text"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "references",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "template": {
- "advanced": false,
- "display_name": "Template",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "template",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_input": true,
- "type": "prompt",
- "value": "Reference 1:\n\n{references}\n\n---\n\n{instructions}\n\nBlog: \n\n"
- }
- }
- },
- "type": "Prompt"
- },
- "dragging": false,
- "height": 517,
- "id": "Prompt-kfWwQ",
- "position": {
- "x": 1288.0925694176524,
- "y": 519.4286147510747
- },
- "positionAbsolute": {
- "x": 1288.0925694176524,
- "y": 519.4286147510747
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "id": "URL-hivMA",
- "node": {
- "base_classes": [
- "Data"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {},
- "description": "Fetch content from one or more URLs.",
- "display_name": "URL",
- "documentation": "",
- "edited": false,
- "field_order": [
- "urls"
- ],
- "frozen": false,
- "icon": "layout-template",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Data",
- "hidden": false,
- "method": "fetch_content",
- "name": "data",
- "selected": "Data",
- "types": [
- "Data"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "show": true,
- "title_case": false,
- "type": "code",
- "value": "import re\n\nfrom langchain_community.document_loaders.web_base import WebBaseLoader\n\nfrom langflow.custom import Component\nfrom langflow.io import MessageTextInput, Output\nfrom langflow.schema import Data\n\n\nclass URLComponent(Component):\n display_name = \"URL\"\n description = \"Fetch content from one or more URLs.\"\n icon = \"layout-template\"\n\n inputs = [\n MessageTextInput(\n name=\"urls\",\n display_name=\"URLs\",\n info=\"Enter one or more URLs, separated by commas.\",\n is_list=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"data\", method=\"fetch_content\"),\n ]\n\n def ensure_url(self, string: str) -> str:\n \"\"\"\n Ensures the given string is a URL by adding 'http://' if it doesn't start with 'http://' or 'https://'.\n Raises an error if the string is not a valid URL.\n\n Parameters:\n string (str): The string to be checked and possibly modified.\n\n Returns:\n str: The modified string that is ensured to be a URL.\n\n Raises:\n ValueError: If the string is not a valid URL.\n \"\"\"\n if not string.startswith((\"http://\", \"https://\")):\n string = \"http://\" + string\n\n # Basic URL validation regex\n url_regex = re.compile(\n r\"^(https?:\\/\\/)?\" # optional protocol\n r\"(www\\.)?\" # optional www\n r\"([a-zA-Z0-9.-]+)\" # domain\n r\"(\\.[a-zA-Z]{2,})?\" # top-level domain\n r\"(:\\d+)?\" # optional port\n r\"(\\/[^\\s]*)?$\", # optional path\n re.IGNORECASE,\n )\n\n if not url_regex.match(string):\n raise ValueError(f\"Invalid URL: {string}\")\n\n return string\n\n def fetch_content(self) -> list[Data]:\n urls = [self.ensure_url(url.strip()) for url in self.urls if url.strip()]\n loader = WebBaseLoader(web_paths=urls, encoding=\"utf-8\")\n docs = loader.load()\n data = [Data(text=doc.page_content, **doc.metadata) for doc in docs]\n self.status = data\n return data\n"
- },
- "urls": {
- "advanced": false,
- "display_name": "URLs",
- "dynamic": false,
- "info": "Enter one or more URLs, separated by commas.",
- "input_types": [
- "Message"
- ],
- "list": true,
- "load_from_db": false,
- "name": "urls",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_input": true,
- "trace_as_metadata": true,
- "type": "str",
- "value": [
- "langflow.org",
- "docs.langflow.org/"
- ]
- }
- }
- },
- "type": "URL"
- },
- "height": 359,
- "id": "URL-hivMA",
- "position": {
- "x": 247.90599789054627,
- "y": 514.1589932671732
+ "x": 2449.3489426461606,
+ "y": 571.2449700910389
},
"selected": false,
"type": "genericNode",
@@ -1041,14 +1055,14 @@
}
],
"viewport": {
- "x": -75.20072339134504,
- "y": -30.25319522994951,
- "zoom": 0.4742390893506119
+ "x": -63.94787944982488,
+ "y": -16.004163894553585,
+ "zoom": 0.47423908935061165
}
},
"description": "This flow can be used to create a blog post following instructions from the user, using two other blogs as reference.",
"endpoint_name": null,
- "id": "26f5bcac-db01-4696-87dc-f7b38afc74ee",
+ "id": "13da3150-95b9-4d81-9ad2-f635dcdce7ab",
"is_component": false,
"last_tested_version": "1.0.0rc1",
"name": "Blog Writer"
diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Document QA.json b/src/backend/base/langflow/initial_setup/starter_projects/Document QA.json
index cdfacf1c7..d66c6b22b 100644
--- a/src/backend/base/langflow/initial_setup/starter_projects/Document QA.json
+++ b/src/backend/base/langflow/initial_setup/starter_projects/Document QA.json
@@ -2,11 +2,10 @@
"data": {
"edges": [
{
- "className": "",
"data": {
"sourceHandle": {
"dataType": "File",
- "id": "File-31fJd",
+ "id": "File-h46aK",
"name": "data",
"output_types": [
"Data"
@@ -14,25 +13,24 @@
},
"targetHandle": {
"fieldName": "data",
- "id": "ParseData-rLcoq",
+ "id": "ParseData-sqVr1",
"inputTypes": [
"Data"
],
"type": "other"
}
},
- "id": "reactflow__edge-File-31fJd{œdataTypeœ:œFileœ,œidœ:œFile-31fJdœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-ParseData-rLcoq{œfieldNameœ:œdataœ,œidœ:œParseData-rLcoqœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}",
- "source": "File-31fJd",
- "sourceHandle": "{œdataTypeœ: œFileœ, œidœ: œFile-31fJdœ, œnameœ: œdataœ, œoutput_typesœ: [œDataœ]}",
- "target": "ParseData-rLcoq",
- "targetHandle": "{œfieldNameœ: œdataœ, œidœ: œParseData-rLcoqœ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}"
+ "id": "reactflow__edge-File-h46aK{œdataTypeœ:œFileœ,œidœ:œFile-h46aKœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-ParseData-sqVr1{œfieldNameœ:œdataœ,œidœ:œParseData-sqVr1œ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}",
+ "source": "File-h46aK",
+ "sourceHandle": "{œdataTypeœ: œFileœ, œidœ: œFile-h46aKœ, œnameœ: œdataœ, œoutput_typesœ: [œDataœ]}",
+ "target": "ParseData-sqVr1",
+ "targetHandle": "{œfieldNameœ: œdataœ, œidœ: œParseData-sqVr1œ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}"
},
{
- "className": "",
"data": {
"sourceHandle": {
"dataType": "ParseData",
- "id": "ParseData-rLcoq",
+ "id": "ParseData-sqVr1",
"name": "text",
"output_types": [
"Message"
@@ -40,7 +38,7 @@
},
"targetHandle": {
"fieldName": "Document",
- "id": "Prompt-L1GxH",
+ "id": "Prompt-mQ7w2",
"inputTypes": [
"Message",
"Text"
@@ -48,18 +46,17 @@
"type": "str"
}
},
- "id": "reactflow__edge-ParseData-rLcoq{œdataTypeœ:œParseDataœ,œidœ:œParseData-rLcoqœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-L1GxH{œfieldNameœ:œDocumentœ,œidœ:œPrompt-L1GxHœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
- "source": "ParseData-rLcoq",
- "sourceHandle": "{œdataTypeœ: œParseDataœ, œidœ: œParseData-rLcoqœ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}",
- "target": "Prompt-L1GxH",
- "targetHandle": "{œfieldNameœ: œDocumentœ, œidœ: œPrompt-L1GxHœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
+ "id": "reactflow__edge-ParseData-sqVr1{œdataTypeœ:œParseDataœ,œidœ:œParseData-sqVr1œ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-mQ7w2{œfieldNameœ:œDocumentœ,œidœ:œPrompt-mQ7w2œ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
+ "source": "ParseData-sqVr1",
+ "sourceHandle": "{œdataTypeœ: œParseDataœ, œidœ: œParseData-sqVr1œ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "Prompt-mQ7w2",
+ "targetHandle": "{œfieldNameœ: œDocumentœ, œidœ: œPrompt-mQ7w2œ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
},
{
- "className": "",
"data": {
"sourceHandle": {
"dataType": "ChatInput",
- "id": "ChatInput-RuLDX",
+ "id": "ChatInput-cMXe0",
"name": "message",
"output_types": [
"Message"
@@ -67,7 +64,7 @@
},
"targetHandle": {
"fieldName": "Question",
- "id": "Prompt-L1GxH",
+ "id": "Prompt-mQ7w2",
"inputTypes": [
"Message",
"Text"
@@ -75,18 +72,17 @@
"type": "str"
}
},
- "id": "reactflow__edge-ChatInput-RuLDX{œdataTypeœ:œChatInputœ,œidœ:œChatInput-RuLDXœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-L1GxH{œfieldNameœ:œQuestionœ,œidœ:œPrompt-L1GxHœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
- "source": "ChatInput-RuLDX",
- "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-RuLDXœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}",
- "target": "Prompt-L1GxH",
- "targetHandle": "{œfieldNameœ: œQuestionœ, œidœ: œPrompt-L1GxHœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
+ "id": "reactflow__edge-ChatInput-cMXe0{œdataTypeœ:œChatInputœ,œidœ:œChatInput-cMXe0œ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-mQ7w2{œfieldNameœ:œQuestionœ,œidœ:œPrompt-mQ7w2œ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
+ "source": "ChatInput-cMXe0",
+ "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-cMXe0œ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "Prompt-mQ7w2",
+ "targetHandle": "{œfieldNameœ: œQuestionœ, œidœ: œPrompt-mQ7w2œ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
},
{
- "className": "",
"data": {
"sourceHandle": {
"dataType": "Prompt",
- "id": "Prompt-L1GxH",
+ "id": "Prompt-mQ7w2",
"name": "prompt",
"output_types": [
"Message"
@@ -94,25 +90,24 @@
},
"targetHandle": {
"fieldName": "input_value",
- "id": "OpenAIModel-4ptCk",
+ "id": "OpenAIModel-O0AGC",
"inputTypes": [
"Message"
],
"type": "str"
}
},
- "id": "reactflow__edge-Prompt-L1GxH{œdataTypeœ:œPromptœ,œidœ:œPrompt-L1GxHœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-4ptCk{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-4ptCkœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
- "source": "Prompt-L1GxH",
- "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-L1GxHœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}",
- "target": "OpenAIModel-4ptCk",
- "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-4ptCkœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
+ "id": "reactflow__edge-Prompt-mQ7w2{œdataTypeœ:œPromptœ,œidœ:œPrompt-mQ7w2œ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-O0AGC{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-O0AGCœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
+ "source": "Prompt-mQ7w2",
+ "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-mQ7w2œ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "OpenAIModel-O0AGC",
+ "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-O0AGCœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
},
{
- "className": "",
"data": {
"sourceHandle": {
"dataType": "OpenAIModel",
- "id": "OpenAIModel-4ptCk",
+ "id": "OpenAIModel-O0AGC",
"name": "text_output",
"output_types": [
"Message"
@@ -120,27 +115,432 @@
},
"targetHandle": {
"fieldName": "input_value",
- "id": "ChatOutput-DYHPP",
+ "id": "ChatOutput-efggd",
"inputTypes": [
"Message"
],
"type": "str"
}
},
- "id": "reactflow__edge-OpenAIModel-4ptCk{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-4ptCkœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-DYHPP{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-DYHPPœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
- "source": "OpenAIModel-4ptCk",
- "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-4ptCkœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}",
- "target": "ChatOutput-DYHPP",
- "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-DYHPPœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
+ "id": "reactflow__edge-OpenAIModel-O0AGC{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-O0AGCœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-efggd{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-efggdœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
+ "source": "OpenAIModel-O0AGC",
+ "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-O0AGCœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "ChatOutput-efggd",
+ "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-efggdœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
}
],
"nodes": [
{
"data": {
- "description": "Get chat inputs from the Playground.",
- "display_name": "Chat Input",
- "edited": false,
- "id": "ChatInput-RuLDX",
+ "id": "File-h46aK",
+ "node": {
+ "base_classes": [
+ "Data"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {},
+ "description": "A generic file loader.",
+ "display_name": "File",
+ "documentation": "",
+ "edited": false,
+ "field_order": [
+ "path",
+ "silent_errors"
+ ],
+ "frozen": false,
+ "icon": "file-text",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Data",
+ "hidden": false,
+ "method": "load_file",
+ "name": "data",
+ "selected": "Data",
+ "types": [
+ "Data"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "_type": "Component",
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "show": true,
+ "title_case": false,
+ "type": "code",
+ "value": "from pathlib import Path\n\nfrom langflow.base.data.utils import TEXT_FILE_TYPES, parse_text_file_to_data\nfrom langflow.custom import Component\nfrom langflow.io import BoolInput, FileInput, Output\nfrom langflow.schema import Data\n\n\nclass FileComponent(Component):\n display_name = \"File\"\n description = \"A generic file loader.\"\n icon = \"file-text\"\n\n inputs = [\n FileInput(\n name=\"path\",\n display_name=\"Path\",\n file_types=TEXT_FILE_TYPES,\n info=f\"Supported file types: {', '.join(TEXT_FILE_TYPES)}\",\n ),\n BoolInput(\n name=\"silent_errors\",\n display_name=\"Silent Errors\",\n advanced=True,\n info=\"If true, errors will not raise an exception.\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"data\", method=\"load_file\"),\n ]\n\n def load_file(self) -> Data:\n if not self.path:\n raise ValueError(\"Please, upload a file to use this component.\")\n resolved_path = self.resolve_path(self.path)\n silent_errors = self.silent_errors\n\n extension = Path(resolved_path).suffix[1:].lower()\n\n if extension == \"doc\":\n raise ValueError(\"doc files are not supported. Please save as .docx\")\n if extension not in TEXT_FILE_TYPES:\n raise ValueError(f\"Unsupported file type: {extension}\")\n\n data = parse_text_file_to_data(resolved_path, silent_errors)\n self.status = data if data else \"No data\"\n return data or Data()\n"
+ },
+ "path": {
+ "advanced": false,
+ "display_name": "Path",
+ "dynamic": false,
+ "fileTypes": [
+ "txt",
+ "md",
+ "mdx",
+ "csv",
+ "json",
+ "yaml",
+ "yml",
+ "xml",
+ "html",
+ "htm",
+ "pdf",
+ "docx",
+ "py",
+ "sh",
+ "sql",
+ "js",
+ "ts",
+ "tsx"
+ ],
+ "file_path": "",
+ "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",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "file",
+ "value": ""
+ },
+ "silent_errors": {
+ "advanced": true,
+ "display_name": "Silent Errors",
+ "dynamic": false,
+ "info": "If true, errors will not raise an exception.",
+ "list": false,
+ "name": "silent_errors",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "bool",
+ "value": false
+ }
+ }
+ },
+ "type": "File"
+ },
+ "dragging": false,
+ "height": 300,
+ "id": "File-h46aK",
+ "position": {
+ "x": -449.0807503257012,
+ "y": -253.5304920926106
+ },
+ "positionAbsolute": {
+ "x": -449.0807503257012,
+ "y": -253.5304920926106
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ },
+ {
+ "data": {
+ "id": "ParseData-sqVr1",
+ "node": {
+ "base_classes": [
+ "Message"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {},
+ "description": "Convert Data into plain text following a specified template.",
+ "display_name": "Parse Data",
+ "documentation": "",
+ "edited": false,
+ "field_order": [
+ "data",
+ "template",
+ "sep"
+ ],
+ "frozen": false,
+ "icon": "braces",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Text",
+ "hidden": false,
+ "method": "parse_data",
+ "name": "text",
+ "selected": "Message",
+ "types": [
+ "Message"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "_type": "Component",
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "show": true,
+ "title_case": false,
+ "type": "code",
+ "value": "from langflow.custom import Component\nfrom langflow.helpers.data import data_to_text\nfrom langflow.io import DataInput, MultilineInput, Output, StrInput\nfrom langflow.schema.message import Message\n\n\nclass ParseDataComponent(Component):\n display_name = \"Parse Data\"\n description = \"Convert Data into plain text following a specified template.\"\n icon = \"braces\"\n\n inputs = [\n DataInput(name=\"data\", display_name=\"Data\", info=\"The data to convert to text.\"),\n MultilineInput(\n name=\"template\",\n display_name=\"Template\",\n info=\"The template to use for formatting the data. It can contain the keys {text}, {data} or any other key in the Data.\",\n value=\"{text}\",\n ),\n StrInput(name=\"sep\", display_name=\"Separator\", advanced=True, value=\"\\n\"),\n ]\n\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"parse_data\"),\n ]\n\n def parse_data(self) -> Message:\n data = self.data if isinstance(self.data, list) else [self.data]\n template = self.template\n\n result_string = data_to_text(template, data, sep=self.sep)\n self.status = result_string\n return Message(text=result_string)\n"
+ },
+ "data": {
+ "advanced": false,
+ "display_name": "Data",
+ "dynamic": false,
+ "info": "The data to convert to text.",
+ "input_types": [
+ "Data"
+ ],
+ "list": false,
+ "name": "data",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "other",
+ "value": ""
+ },
+ "sep": {
+ "advanced": true,
+ "display_name": "Separator",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "name": "sep",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "\n"
+ },
+ "template": {
+ "advanced": false,
+ "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"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "template",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "{text}"
+ }
+ }
+ },
+ "type": "ParseData"
+ },
+ "dragging": false,
+ "height": 384,
+ "id": "ParseData-sqVr1",
+ "position": {
+ "x": 73.79471204296345,
+ "y": -186.9430114986888
+ },
+ "positionAbsolute": {
+ "x": 73.79471204296345,
+ "y": -186.9430114986888
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ },
+ {
+ "data": {
+ "description": "Create a prompt template with dynamic variables.",
+ "display_name": "Prompt",
+ "id": "Prompt-mQ7w2",
+ "node": {
+ "base_classes": [
+ "Message"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {
+ "template": [
+ "Document",
+ "Question"
+ ]
+ },
+ "description": "Create a prompt template with dynamic variables.",
+ "display_name": "Prompt",
+ "documentation": "",
+ "edited": false,
+ "error": null,
+ "field_order": [
+ "template"
+ ],
+ "frozen": false,
+ "full_path": null,
+ "icon": "prompts",
+ "is_composition": null,
+ "is_input": null,
+ "is_output": null,
+ "name": "",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Prompt Message",
+ "hidden": false,
+ "method": "build_prompt",
+ "name": "prompt",
+ "selected": "Message",
+ "types": [
+ "Message"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "Document": {
+ "advanced": false,
+ "display_name": "Document",
+ "dynamic": false,
+ "field_type": "str",
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "input_types": [
+ "Message",
+ "Text"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "Document",
+ "password": false,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ },
+ "Question": {
+ "advanced": false,
+ "display_name": "Question",
+ "dynamic": false,
+ "field_type": "str",
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "input_types": [
+ "Message",
+ "Text"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "Question",
+ "password": false,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ },
+ "_type": "Component",
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "show": true,
+ "title_case": false,
+ "type": "code",
+ "value": "from langflow.base.prompts.api_utils import process_prompt_template\nfrom langflow.custom import Component\nfrom langflow.io import Output, PromptInput\nfrom langflow.schema.message import Message\nfrom langflow.template.utils import update_template_values\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\n def post_code_processing(self, new_build_config: dict, current_build_config: dict):\n \"\"\"\n This function is called after the code validation is done.\n \"\"\"\n frontend_node = super().post_code_processing(new_build_config, current_build_config)\n template = frontend_node[\"template\"][\"template\"][\"value\"]\n _ = process_prompt_template(\n template=template,\n name=\"template\",\n custom_fields=frontend_node[\"custom_fields\"],\n frontend_node_template=frontend_node[\"template\"],\n )\n # Now that template is updated, we need to grab any values that were set in the current_build_config\n # and update the frontend_node with those values\n update_template_values(frontend_template=frontend_node, raw_template=current_build_config[\"template\"])\n return frontend_node\n"
+ },
+ "template": {
+ "advanced": false,
+ "display_name": "Template",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "template",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "type": "prompt",
+ "value": "Answer user's questions based on the document below:\n\n---\n\n{Document}\n\n---\n\nQuestion:\n{Question}\n\nAnswer:\n"
+ }
+ }
+ },
+ "type": "Prompt"
+ },
+ "dragging": false,
+ "height": 515,
+ "id": "Prompt-mQ7w2",
+ "position": {
+ "x": 637.3518652087848,
+ "y": 47.191730368560215
+ },
+ "positionAbsolute": {
+ "x": 637.3518652087848,
+ "y": 47.191730368560215
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ },
+ {
+ "data": {
+ "id": "ChatInput-cMXe0",
"node": {
"base_classes": [
"Message"
@@ -151,7 +551,7 @@
"description": "Get chat inputs from the Playground.",
"display_name": "Chat Input",
"documentation": "",
- "edited": true,
+ "edited": false,
"field_order": [
"input_value",
"sender",
@@ -322,15 +722,15 @@
"type": "ChatInput"
},
"dragging": false,
- "height": 309,
- "id": "ChatInput-RuLDX",
+ "height": 308,
+ "id": "ChatInput-cMXe0",
"position": {
- "x": -201.55524461361745,
- "y": 411.67283602771283
+ "x": 50.08709924122684,
+ "y": 320.88186720121615
},
"positionAbsolute": {
- "x": -201.55524461361745,
- "y": 411.67283602771283
+ "x": 50.08709924122684,
+ "y": 320.88186720121615
},
"selected": false,
"type": "genericNode",
@@ -338,10 +738,282 @@
},
{
"data": {
- "description": "Display a chat message in the Playground.",
- "display_name": "Chat Output",
- "edited": false,
- "id": "ChatOutput-DYHPP",
+ "id": "OpenAIModel-O0AGC",
+ "node": {
+ "base_classes": [
+ "LanguageModel",
+ "Message"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {},
+ "description": "Generates text using OpenAI LLMs.",
+ "display_name": "OpenAI",
+ "documentation": "",
+ "edited": false,
+ "field_order": [
+ "input_value",
+ "max_tokens",
+ "model_kwargs",
+ "output_schema",
+ "model_name",
+ "openai_api_base",
+ "openai_api_key",
+ "temperature",
+ "stream",
+ "system_message",
+ "seed"
+ ],
+ "frozen": false,
+ "icon": "OpenAI",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Text",
+ "hidden": false,
+ "method": "text_response",
+ "name": "text_output",
+ "selected": "Message",
+ "types": [
+ "Message"
+ ],
+ "value": "__UNDEFINED__"
+ },
+ {
+ "cache": true,
+ "display_name": "Language Model",
+ "method": "build_model",
+ "name": "model_output",
+ "selected": "LanguageModel",
+ "types": [
+ "LanguageModel"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "_type": "Component",
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "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"
+ },
+ "input_value": {
+ "advanced": false,
+ "display_name": "Input",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "input_value",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "max_tokens": {
+ "advanced": true,
+ "display_name": "Max Tokens",
+ "dynamic": false,
+ "info": "The maximum number of tokens to generate. Set to 0 for unlimited tokens.",
+ "list": false,
+ "name": "max_tokens",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": ""
+ },
+ "model_kwargs": {
+ "advanced": true,
+ "display_name": "Model Kwargs",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "model_kwargs",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "type": "dict",
+ "value": {}
+ },
+ "model_name": {
+ "advanced": false,
+ "display_name": "Model Name",
+ "dynamic": false,
+ "info": "",
+ "name": "model_name",
+ "options": [
+ "gpt-4o",
+ "gpt-4-turbo",
+ "gpt-4-turbo-preview",
+ "gpt-3.5-turbo",
+ "gpt-3.5-turbo-0125"
+ ],
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "gpt-4-turbo"
+ },
+ "openai_api_base": {
+ "advanced": true,
+ "display_name": "OpenAI API Base",
+ "dynamic": false,
+ "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.",
+ "list": false,
+ "load_from_db": false,
+ "name": "openai_api_base",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "openai_api_key": {
+ "advanced": false,
+ "display_name": "OpenAI API Key",
+ "dynamic": false,
+ "info": "The OpenAI API Key to use for the OpenAI model.",
+ "input_types": [],
+ "load_from_db": false,
+ "name": "openai_api_key",
+ "password": true,
+ "placeholder": "",
+ "required": false,
+ "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,
+ "trace_as_input": true,
+ "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,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": 1
+ },
+ "stream": {
+ "advanced": true,
+ "display_name": "Stream",
+ "dynamic": false,
+ "info": "Stream the response from the model. Streaming works only in Chat.",
+ "list": false,
+ "name": "stream",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "bool",
+ "value": false
+ },
+ "system_message": {
+ "advanced": true,
+ "display_name": "System Message",
+ "dynamic": false,
+ "info": "System message to pass to the model.",
+ "list": false,
+ "load_from_db": false,
+ "name": "system_message",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "temperature": {
+ "advanced": false,
+ "display_name": "Temperature",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "temperature",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "float",
+ "value": 0.1
+ }
+ }
+ },
+ "type": "OpenAIModel"
+ },
+ "dragging": false,
+ "height": 621,
+ "id": "OpenAIModel-O0AGC",
+ "position": {
+ "x": 1227.3672858178775,
+ "y": 11.61201090144857
+ },
+ "positionAbsolute": {
+ "x": 1227.3672858178775,
+ "y": 11.61201090144857
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ },
+ {
+ "data": {
+ "id": "ChatOutput-efggd",
"node": {
"base_classes": [
"Message"
@@ -352,7 +1024,7 @@
"description": "Display a chat message in the Playground.",
"display_name": "Chat Output",
"documentation": "",
- "edited": true,
+ "edited": false,
"field_order": [
"input_value",
"sender",
@@ -501,689 +1173,14 @@
},
"dragging": false,
"height": 308,
- "id": "ChatOutput-DYHPP",
+ "id": "ChatOutput-efggd",
"position": {
- "x": 1733.3012915204283,
- "y": 168.76098809939327
+ "x": 1831.1359796346408,
+ "y": 139.5174517327903
},
"positionAbsolute": {
- "x": 1733.3012915204283,
- "y": 168.76098809939327
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "description": "A generic file loader.",
- "display_name": "File",
- "id": "File-31fJd",
- "node": {
- "base_classes": [
- "Data"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {},
- "description": "A generic file loader.",
- "display_name": "File",
- "documentation": "",
- "edited": false,
- "field_order": [
- "path",
- "silent_errors"
- ],
- "frozen": false,
- "icon": "file-text",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Data",
- "hidden": false,
- "method": "load_file",
- "name": "data",
- "selected": "Data",
- "types": [
- "Data"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "show": true,
- "title_case": false,
- "type": "code",
- "value": "from pathlib import Path\n\nfrom langflow.base.data.utils import TEXT_FILE_TYPES, parse_text_file_to_data\nfrom langflow.custom import Component\nfrom langflow.io import BoolInput, FileInput, Output\nfrom langflow.schema import Data\n\n\nclass FileComponent(Component):\n display_name = \"File\"\n description = \"A generic file loader.\"\n icon = \"file-text\"\n\n inputs = [\n FileInput(\n name=\"path\",\n display_name=\"Path\",\n file_types=TEXT_FILE_TYPES,\n info=f\"Supported file types: {', '.join(TEXT_FILE_TYPES)}\",\n ),\n BoolInput(\n name=\"silent_errors\",\n display_name=\"Silent Errors\",\n advanced=True,\n info=\"If true, errors will not raise an exception.\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"data\", method=\"load_file\"),\n ]\n\n def load_file(self) -> Data:\n if not self.path:\n raise ValueError(\"Please, upload a file to use this component.\")\n resolved_path = self.resolve_path(self.path)\n silent_errors = self.silent_errors\n\n extension = Path(resolved_path).suffix[1:].lower()\n\n if extension == \"doc\":\n raise ValueError(\"doc files are not supported. Please save as .docx\")\n if extension not in TEXT_FILE_TYPES:\n raise ValueError(f\"Unsupported file type: {extension}\")\n\n data = parse_text_file_to_data(resolved_path, silent_errors)\n self.status = data if data else \"No data\"\n return data or Data()\n"
- },
- "path": {
- "advanced": false,
- "display_name": "Path",
- "dynamic": false,
- "fileTypes": [
- "txt",
- "md",
- "mdx",
- "csv",
- "json",
- "yaml",
- "yml",
- "xml",
- "html",
- "htm",
- "pdf",
- "docx",
- "py",
- "sh",
- "sql",
- "js",
- "ts",
- "tsx"
- ],
- "file_path": "860235bc-cb3e-4576-8a52-afd711f4f138/IMKL24_Speaker Invitation_Rodrigo.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",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "file",
- "value": ""
- },
- "silent_errors": {
- "advanced": true,
- "display_name": "Silent Errors",
- "dynamic": false,
- "info": "If true, errors will not raise an exception.",
- "list": false,
- "name": "silent_errors",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": false
- }
- }
- },
- "type": "File"
- },
- "dragging": false,
- "height": 301,
- "id": "File-31fJd",
- "position": {
- "x": -423.1448900251602,
- "y": -230.83411538932458
- },
- "positionAbsolute": {
- "x": -423.1448900251602,
- "y": -230.83411538932458
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "description": "Generates text using OpenAI LLMs.",
- "display_name": "OpenAI",
- "edited": false,
- "id": "OpenAIModel-4ptCk",
- "node": {
- "base_classes": [
- "LanguageModel",
- "Message"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {},
- "description": "Generates text using OpenAI LLMs.",
- "display_name": "OpenAI",
- "documentation": "",
- "edited": true,
- "field_order": [
- "input_value",
- "max_tokens",
- "model_kwargs",
- "output_schema",
- "model_name",
- "openai_api_base",
- "openai_api_key",
- "temperature",
- "stream",
- "system_message",
- "seed"
- ],
- "frozen": false,
- "icon": "OpenAI",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Text",
- "hidden": false,
- "method": "text_response",
- "name": "text_output",
- "selected": "Message",
- "types": [
- "Message"
- ],
- "value": "__UNDEFINED__"
- },
- {
- "cache": true,
- "display_name": "Language Model",
- "method": "build_model",
- "name": "model_output",
- "selected": "LanguageModel",
- "types": [
- "LanguageModel"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "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"
- },
- "input_value": {
- "advanced": false,
- "display_name": "Input",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message"
- ],
- "list": false,
- "load_from_db": false,
- "name": "input_value",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "max_tokens": {
- "advanced": true,
- "display_name": "Max Tokens",
- "dynamic": false,
- "info": "The maximum number of tokens to generate. Set to 0 for unlimited tokens.",
- "list": false,
- "name": "max_tokens",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": ""
- },
- "model_kwargs": {
- "advanced": true,
- "display_name": "Model Kwargs",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "model_kwargs",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "dict",
- "value": {}
- },
- "model_name": {
- "advanced": false,
- "display_name": "Model Name",
- "dynamic": false,
- "info": "",
- "name": "model_name",
- "options": [
- "gpt-4o",
- "gpt-4-turbo",
- "gpt-4-turbo-preview",
- "gpt-3.5-turbo",
- "gpt-3.5-turbo-0125"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "gpt-4-turbo"
- },
- "openai_api_base": {
- "advanced": true,
- "display_name": "OpenAI API Base",
- "dynamic": false,
- "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.",
- "list": false,
- "load_from_db": false,
- "name": "openai_api_base",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_api_key": {
- "advanced": false,
- "display_name": "OpenAI API Key",
- "dynamic": false,
- "info": "The OpenAI API Key to use for the OpenAI model.",
- "input_types": [],
- "load_from_db": false,
- "name": "openai_api_key",
- "password": true,
- "placeholder": "",
- "required": false,
- "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
- },
- "stream": {
- "advanced": true,
- "display_name": "Stream",
- "dynamic": false,
- "info": "Stream the response from the model. Streaming works only in Chat.",
- "list": false,
- "name": "stream",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": false
- },
- "system_message": {
- "advanced": true,
- "display_name": "System Message",
- "dynamic": false,
- "info": "System message to pass to the model.",
- "list": false,
- "load_from_db": false,
- "name": "system_message",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "temperature": {
- "advanced": false,
- "display_name": "Temperature",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "temperature",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "float",
- "value": 0.1
- }
- }
- },
- "type": "OpenAIModel"
- },
- "dragging": false,
- "height": 622,
- "id": "OpenAIModel-4ptCk",
- "position": {
- "x": 1205.1434354219589,
- "y": -39.953851445891985
- },
- "positionAbsolute": {
- "x": 1205.1434354219589,
- "y": -39.953851445891985
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "description": "Create a prompt template with dynamic variables.",
- "display_name": "Prompt",
- "id": "Prompt-L1GxH",
- "node": {
- "base_classes": [
- "Message"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {
- "template": [
- "Document",
- "Question"
- ]
- },
- "description": "Create a prompt template with dynamic variables.",
- "display_name": "Prompt",
- "documentation": "",
- "edited": false,
- "error": null,
- "field_order": [
- "template"
- ],
- "frozen": false,
- "full_path": null,
- "icon": "prompts",
- "is_composition": null,
- "is_input": null,
- "is_output": null,
- "name": "",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Prompt Message",
- "hidden": false,
- "method": "build_prompt",
- "name": "prompt",
- "selected": "Message",
- "types": [
- "Message"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "Document": {
- "advanced": false,
- "display_name": "Document",
- "dynamic": false,
- "field_type": "str",
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "input_types": [
- "Message",
- "Text"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "Document",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "Question": {
- "advanced": false,
- "display_name": "Question",
- "dynamic": false,
- "field_type": "str",
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "input_types": [
- "Message",
- "Text"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "Question",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "show": true,
- "title_case": false,
- "type": "code",
- "value": "from langflow.base.prompts.api_utils import process_prompt_template\nfrom langflow.custom import Component\nfrom langflow.io import Output, PromptInput\nfrom langflow.schema.message import Message\nfrom langflow.template.utils import update_template_values\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\n def post_code_processing(self, new_build_config: dict, current_build_config: dict):\n \"\"\"\n This function is called after the code validation is done.\n \"\"\"\n frontend_node = super().post_code_processing(new_build_config, current_build_config)\n template = frontend_node[\"template\"][\"template\"][\"value\"]\n _ = process_prompt_template(\n template=template,\n name=\"template\",\n custom_fields=frontend_node[\"custom_fields\"],\n frontend_node_template=frontend_node[\"template\"],\n )\n # Now that template is updated, we need to grab any values that were set in the current_build_config\n # and update the frontend_node with those values\n update_template_values(frontend_template=frontend_node, raw_template=current_build_config[\"template\"])\n return frontend_node\n"
- },
- "template": {
- "advanced": false,
- "display_name": "Template",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "template",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_input": true,
- "type": "prompt",
- "value": "Answer user's questions based on the document below:\n\n---\n\n{Document}\n\n---\n\nQuestion:\n{Question}\n\nAnswer:\n"
- }
- }
- },
- "type": "Prompt"
- },
- "dragging": false,
- "height": 517,
- "id": "Prompt-L1GxH",
- "position": {
- "x": 641.7559080574213,
- "y": 96.74239207995313
- },
- "positionAbsolute": {
- "x": 641.7559080574213,
- "y": 96.74239207995313
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "id": "ParseData-rLcoq",
- "node": {
- "base_classes": [
- "Message"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {},
- "description": "Convert Data into plain text following a specified template.",
- "display_name": "Parse Data",
- "documentation": "",
- "edited": false,
- "field_order": [
- "data",
- "template",
- "sep"
- ],
- "frozen": false,
- "icon": "braces",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Text",
- "hidden": false,
- "method": "parse_data",
- "name": "text",
- "selected": "Message",
- "types": [
- "Message"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "show": true,
- "title_case": false,
- "type": "code",
- "value": "from langflow.custom import Component\nfrom langflow.helpers.data import data_to_text\nfrom langflow.io import DataInput, MultilineInput, Output, StrInput\nfrom langflow.schema.message import Message\n\n\nclass ParseDataComponent(Component):\n display_name = \"Parse Data\"\n description = \"Convert Data into plain text following a specified template.\"\n icon = \"braces\"\n\n inputs = [\n DataInput(name=\"data\", display_name=\"Data\", info=\"The data to convert to text.\"),\n MultilineInput(\n name=\"template\",\n display_name=\"Template\",\n info=\"The template to use for formatting the data. It can contain the keys {text}, {data} or any other key in the Data.\",\n value=\"{text}\",\n ),\n StrInput(name=\"sep\", display_name=\"Separator\", advanced=True, value=\"\\n\"),\n ]\n\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"parse_data\"),\n ]\n\n def parse_data(self) -> Message:\n data = self.data if isinstance(self.data, list) else [self.data]\n template = self.template\n\n result_string = data_to_text(template, data, sep=self.sep)\n self.status = result_string\n return Message(text=result_string)\n"
- },
- "data": {
- "advanced": false,
- "display_name": "Data",
- "dynamic": false,
- "info": "The data to convert to text.",
- "input_types": [
- "Data"
- ],
- "list": false,
- "name": "data",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_input": true,
- "trace_as_metadata": true,
- "type": "other",
- "value": ""
- },
- "sep": {
- "advanced": true,
- "display_name": "Separator",
- "dynamic": false,
- "info": "",
- "list": false,
- "load_from_db": false,
- "name": "sep",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_metadata": true,
- "type": "str",
- "value": "\n"
- },
- "template": {
- "advanced": false,
- "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"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "template",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_input": true,
- "trace_as_metadata": true,
- "type": "str",
- "value": "{text}"
- }
- }
- },
- "type": "ParseData"
- },
- "dragging": false,
- "height": 385,
- "id": "ParseData-rLcoq",
- "position": {
- "x": 122.60847618765547,
- "y": -109.41723790443038
- },
- "positionAbsolute": {
- "x": 122.60847618765547,
- "y": -109.41723790443038
+ "x": 1831.1359796346408,
+ "y": 139.5174517327903
},
"selected": false,
"type": "genericNode",
@@ -1191,14 +1188,14 @@
}
],
"viewport": {
- "x": 269.0008349738299,
- "y": 216.31613407272368,
- "zoom": 0.45804409165968474
+ "x": 249.03047748371796,
+ "y": 251.71203687916693,
+ "zoom": 0.4580440916596844
}
},
"description": "This flow integrates PDF reading with a language model to answer document-specific questions. Ideal for small-scale texts, it facilitates direct queries with immediate insights.",
"endpoint_name": null,
- "id": "ebaa8c25-5d89-4f31-a945-3804be72ac58",
+ "id": "4b4cbf9e-34fe-4613-a460-3b7af89b7788",
"is_component": false,
"last_tested_version": "1.0.0rc1",
"name": "Document QA"
diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Memory Chatbot.json b/src/backend/base/langflow/initial_setup/starter_projects/Memory Chatbot.json
index 0ab839eee..c3396f03e 100644
--- a/src/backend/base/langflow/initial_setup/starter_projects/Memory Chatbot.json
+++ b/src/backend/base/langflow/initial_setup/starter_projects/Memory Chatbot.json
@@ -2,11 +2,10 @@
"data": {
"edges": [
{
- "className": "",
"data": {
"sourceHandle": {
"dataType": "Memory",
- "id": "Memory-A4OPp",
+ "id": "Memory-uy2TA",
"name": "messages_text",
"output_types": [
"Message"
@@ -14,7 +13,7 @@
},
"targetHandle": {
"fieldName": "context",
- "id": "Prompt-xhlQ7",
+ "id": "Prompt-m9rUs",
"inputTypes": [
"Message",
"Text"
@@ -22,18 +21,17 @@
"type": "str"
}
},
- "id": "reactflow__edge-Memory-A4OPp{œdataTypeœ:œMemoryœ,œidœ:œMemory-A4OPpœ,œnameœ:œmessages_textœ,œoutput_typesœ:[œMessageœ]}-Prompt-xhlQ7{œfieldNameœ:œcontextœ,œidœ:œPrompt-xhlQ7œ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
- "source": "Memory-A4OPp",
- "sourceHandle": "{œdataTypeœ: œMemoryœ, œidœ: œMemory-A4OPpœ, œnameœ: œmessages_textœ, œoutput_typesœ: [œMessageœ]}",
- "target": "Prompt-xhlQ7",
- "targetHandle": "{œfieldNameœ: œcontextœ, œidœ: œPrompt-xhlQ7œ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
+ "id": "reactflow__edge-Memory-uy2TA{œdataTypeœ:œMemoryœ,œidœ:œMemory-uy2TAœ,œnameœ:œmessages_textœ,œoutput_typesœ:[œMessageœ]}-Prompt-m9rUs{œfieldNameœ:œcontextœ,œidœ:œPrompt-m9rUsœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
+ "source": "Memory-uy2TA",
+ "sourceHandle": "{œdataTypeœ: œMemoryœ, œidœ: œMemory-uy2TAœ, œnameœ: œmessages_textœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "Prompt-m9rUs",
+ "targetHandle": "{œfieldNameœ: œcontextœ, œidœ: œPrompt-m9rUsœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
},
{
- "className": "",
"data": {
"sourceHandle": {
"dataType": "ChatInput",
- "id": "ChatInput-ENTF8",
+ "id": "ChatInput-hSTqh",
"name": "message",
"output_types": [
"Message"
@@ -41,7 +39,7 @@
},
"targetHandle": {
"fieldName": "user_message",
- "id": "Prompt-xhlQ7",
+ "id": "Prompt-m9rUs",
"inputTypes": [
"Message",
"Text"
@@ -49,18 +47,17 @@
"type": "str"
}
},
- "id": "reactflow__edge-ChatInput-ENTF8{œdataTypeœ:œChatInputœ,œidœ:œChatInput-ENTF8œ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-xhlQ7{œfieldNameœ:œuser_messageœ,œidœ:œPrompt-xhlQ7œ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
- "source": "ChatInput-ENTF8",
- "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-ENTF8œ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}",
- "target": "Prompt-xhlQ7",
- "targetHandle": "{œfieldNameœ: œuser_messageœ, œidœ: œPrompt-xhlQ7œ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
+ "id": "reactflow__edge-ChatInput-hSTqh{œdataTypeœ:œChatInputœ,œidœ:œChatInput-hSTqhœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-m9rUs{œfieldNameœ:œuser_messageœ,œidœ:œPrompt-m9rUsœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
+ "source": "ChatInput-hSTqh",
+ "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-hSTqhœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "Prompt-m9rUs",
+ "targetHandle": "{œfieldNameœ: œuser_messageœ, œidœ: œPrompt-m9rUsœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
},
{
- "className": "",
"data": {
"sourceHandle": {
"dataType": "Prompt",
- "id": "Prompt-xhlQ7",
+ "id": "Prompt-m9rUs",
"name": "prompt",
"output_types": [
"Message"
@@ -68,25 +65,24 @@
},
"targetHandle": {
"fieldName": "input_value",
- "id": "OpenAIModel-ZBIVC",
+ "id": "OpenAIModel-WmUtU",
"inputTypes": [
"Message"
],
"type": "str"
}
},
- "id": "reactflow__edge-Prompt-xhlQ7{œdataTypeœ:œPromptœ,œidœ:œPrompt-xhlQ7œ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-ZBIVC{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-ZBIVCœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
- "source": "Prompt-xhlQ7",
- "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-xhlQ7œ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}",
- "target": "OpenAIModel-ZBIVC",
- "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-ZBIVCœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
+ "id": "reactflow__edge-Prompt-m9rUs{œdataTypeœ:œPromptœ,œidœ:œPrompt-m9rUsœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-WmUtU{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-WmUtUœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
+ "source": "Prompt-m9rUs",
+ "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-m9rUsœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "OpenAIModel-WmUtU",
+ "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-WmUtUœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
},
{
- "className": "",
"data": {
"sourceHandle": {
"dataType": "OpenAIModel",
- "id": "OpenAIModel-ZBIVC",
+ "id": "OpenAIModel-WmUtU",
"name": "text_output",
"output_types": [
"Message"
@@ -94,27 +90,24 @@
},
"targetHandle": {
"fieldName": "input_value",
- "id": "ChatOutput-e8ruq",
+ "id": "ChatOutput-LIvGN",
"inputTypes": [
"Message"
],
"type": "str"
}
},
- "id": "reactflow__edge-OpenAIModel-ZBIVC{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-ZBIVCœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-e8ruq{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-e8ruqœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
- "source": "OpenAIModel-ZBIVC",
- "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-ZBIVCœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}",
- "target": "ChatOutput-e8ruq",
- "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-e8ruqœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
+ "id": "reactflow__edge-OpenAIModel-WmUtU{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-WmUtUœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-LIvGN{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-LIvGNœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
+ "source": "OpenAIModel-WmUtU",
+ "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-WmUtUœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "ChatOutput-LIvGN",
+ "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-LIvGNœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
}
],
"nodes": [
{
"data": {
- "description": "Retrieves stored chat messages.",
- "display_name": "Memory",
- "edited": false,
- "id": "Memory-A4OPp",
+ "id": "Memory-uy2TA",
"node": {
"base_classes": [
"Data",
@@ -124,9 +117,9 @@
"conditional_paths": [],
"custom_fields": {},
"description": "Retrieves stored chat messages.",
- "display_name": "Memory",
+ "display_name": "Chat Memory",
"documentation": "",
- "edited": true,
+ "edited": false,
"field_order": [
"sender",
"sender_name",
@@ -182,7 +175,7 @@
"show": true,
"title_case": false,
"type": "code",
- "value": "from langflow.custom import Component\nfrom langflow.helpers.data import data_to_text\nfrom langflow.io import DropdownInput, IntInput, MultilineInput, Output, MessageTextInput\nfrom langflow.memory import get_messages\nfrom langflow.schema import Data\nfrom langflow.schema.message import Message\n\n\nclass MemoryComponent(Component):\n display_name = \"Chat Memory\"\n description = \"Retrieves stored chat messages.\"\n icon = \"message-square-more\"\n\n inputs = [\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\", \"Machine and User\"],\n value=\"Machine and 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 advanced=True,\n ),\n IntInput(\n name=\"n_messages\",\n display_name=\"Number of Messages\",\n value=100,\n info=\"Number of messages to retrieve.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"session_id\",\n display_name=\"Session ID\",\n info=\"Session ID of the chat history.\",\n advanced=True,\n ),\n DropdownInput(\n name=\"order\",\n display_name=\"Order\",\n options=[\"Ascending\", \"Descending\"],\n value=\"Ascending\",\n info=\"Order of the messages.\",\n advanced=True,\n ),\n MultilineInput(\n name=\"template\",\n display_name=\"Template\",\n info=\"The template to use for formatting the data. It can contain the keys {text}, {sender} or any other key in the message data.\",\n value=\"{sender_name}: {text}\",\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Chat History\", name=\"messages\", method=\"retrieve_messages\"),\n Output(display_name=\"Messages (Text)\", name=\"messages_text\", method=\"retrieve_messages_as_text\"),\n ]\n\n def retrieve_messages(self) -> Data:\n sender = self.sender\n sender_name = self.sender_name\n session_id = self.session_id\n n_messages = self.n_messages\n order = \"DESC\" if self.order == \"Descending\" else \"ASC\"\n\n if sender == \"Machine and User\":\n sender = None\n\n messages = get_messages(\n sender=sender,\n sender_name=sender_name,\n session_id=session_id,\n limit=n_messages,\n order=order,\n )\n self.status = messages\n return messages\n\n def retrieve_messages_as_text(self) -> Message:\n messages_text = data_to_text(self.template, self.retrieve_messages())\n self.status = messages_text\n return Message(text=messages_text)\n"
+ "value": "from langflow.custom import Component\nfrom langflow.helpers.data import data_to_text\nfrom langflow.io import DropdownInput, IntInput, MessageTextInput, MultilineInput, Output\nfrom langflow.memory import get_messages\nfrom langflow.schema import Data\nfrom langflow.schema.message import Message\n\n\nclass MemoryComponent(Component):\n display_name = \"Chat Memory\"\n description = \"Retrieves stored chat messages.\"\n icon = \"message-square-more\"\n\n inputs = [\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\", \"Machine and User\"],\n value=\"Machine and 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 advanced=True,\n ),\n IntInput(\n name=\"n_messages\",\n display_name=\"Number of Messages\",\n value=100,\n info=\"Number of messages to retrieve.\",\n advanced=True,\n ),\n MessageTextInput(\n name=\"session_id\",\n display_name=\"Session ID\",\n info=\"Session ID of the chat history.\",\n advanced=True,\n ),\n DropdownInput(\n name=\"order\",\n display_name=\"Order\",\n options=[\"Ascending\", \"Descending\"],\n value=\"Ascending\",\n info=\"Order of the messages.\",\n advanced=True,\n ),\n MultilineInput(\n name=\"template\",\n display_name=\"Template\",\n info=\"The template to use for formatting the data. It can contain the keys {text}, {sender} or any other key in the message data.\",\n value=\"{sender_name}: {text}\",\n advanced=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Chat History\", name=\"messages\", method=\"retrieve_messages\"),\n Output(display_name=\"Messages (Text)\", name=\"messages_text\", method=\"retrieve_messages_as_text\"),\n ]\n\n def retrieve_messages(self) -> Data:\n sender = self.sender\n sender_name = self.sender_name\n session_id = self.session_id\n n_messages = self.n_messages\n order = \"DESC\" if self.order == \"Descending\" else \"ASC\"\n\n if sender == \"Machine and User\":\n sender = None\n\n messages = get_messages(\n sender=sender,\n sender_name=sender_name,\n session_id=session_id,\n limit=n_messages,\n order=order,\n )\n self.status = messages\n return messages\n\n def retrieve_messages_as_text(self) -> Message:\n messages_text = data_to_text(self.template, self.retrieve_messages())\n self.status = messages_text\n return Message(text=messages_text)\n"
},
"n_messages": {
"advanced": true,
@@ -195,6 +188,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_metadata": true,
"type": "int",
"value": 100
},
@@ -212,6 +206,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_metadata": true,
"type": "str",
"value": "Ascending"
},
@@ -230,6 +225,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_metadata": true,
"type": "str",
"value": "Machine and User"
},
@@ -248,6 +244,8 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
"type": "str",
"value": ""
},
@@ -266,6 +264,8 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
"type": "str",
"value": ""
},
@@ -285,6 +285,8 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
"type": "str",
"value": "{sender_name}: {text}"
}
@@ -293,15 +295,15 @@
"type": "Memory"
},
"dragging": false,
- "height": 267,
- "id": "Memory-A4OPp",
+ "height": 266,
+ "id": "Memory-uy2TA",
"position": {
- "x": 1258.8089948698466,
- "y": 547.1243849102437
+ "x": 1264.7588980556088,
+ "y": 506.6868269980502
},
"positionAbsolute": {
- "x": 1258.8089948698466,
- "y": 547.1243849102437
+ "x": 1264.7588980556088,
+ "y": 506.6868269980502
},
"selected": false,
"type": "genericNode",
@@ -309,10 +311,157 @@
},
{
"data": {
- "description": "Get chat inputs from the Playground.",
- "display_name": "Chat Input",
- "edited": false,
- "id": "ChatInput-ENTF8",
+ "description": "Create a prompt template with dynamic variables.",
+ "display_name": "Prompt",
+ "id": "Prompt-m9rUs",
+ "node": {
+ "base_classes": [
+ "Message"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {
+ "template": [
+ "context",
+ "user_message"
+ ]
+ },
+ "description": "Create a prompt template with dynamic variables.",
+ "display_name": "Prompt",
+ "documentation": "",
+ "edited": false,
+ "error": null,
+ "field_order": [
+ "template"
+ ],
+ "frozen": false,
+ "full_path": null,
+ "icon": "prompts",
+ "is_composition": null,
+ "is_input": null,
+ "is_output": null,
+ "name": "",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Prompt Message",
+ "hidden": false,
+ "method": "build_prompt",
+ "name": "prompt",
+ "selected": "Message",
+ "types": [
+ "Message"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "_type": "Component",
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "show": true,
+ "title_case": false,
+ "type": "code",
+ "value": "from langflow.base.prompts.api_utils import process_prompt_template\nfrom langflow.custom import Component\nfrom langflow.io import Output, PromptInput\nfrom langflow.schema.message import Message\nfrom langflow.template.utils import update_template_values\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\n def post_code_processing(self, new_build_config: dict, current_build_config: dict):\n \"\"\"\n This function is called after the code validation is done.\n \"\"\"\n frontend_node = super().post_code_processing(new_build_config, current_build_config)\n template = frontend_node[\"template\"][\"template\"][\"value\"]\n _ = process_prompt_template(\n template=template,\n name=\"template\",\n custom_fields=frontend_node[\"custom_fields\"],\n frontend_node_template=frontend_node[\"template\"],\n )\n # Now that template is updated, we need to grab any values that were set in the current_build_config\n # and update the frontend_node with those values\n update_template_values(frontend_template=frontend_node, raw_template=current_build_config[\"template\"])\n return frontend_node\n"
+ },
+ "context": {
+ "advanced": false,
+ "display_name": "context",
+ "dynamic": false,
+ "field_type": "str",
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "input_types": [
+ "Message",
+ "Text"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "context",
+ "password": false,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ },
+ "template": {
+ "advanced": false,
+ "display_name": "Template",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "template",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "type": "prompt",
+ "value": "{context}\n\nUser: {user_message}\nAI: "
+ },
+ "user_message": {
+ "advanced": false,
+ "display_name": "user_message",
+ "dynamic": false,
+ "field_type": "str",
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "input_types": [
+ "Message",
+ "Text"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "user_message",
+ "password": false,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ }
+ }
+ },
+ "type": "Prompt"
+ },
+ "dragging": false,
+ "height": 515,
+ "id": "Prompt-m9rUs",
+ "position": {
+ "x": 1880.8227904110583,
+ "y": 625.8049209882275
+ },
+ "positionAbsolute": {
+ "x": 1880.8227904110583,
+ "y": 625.8049209882275
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ },
+ {
+ "data": {
+ "id": "ChatInput-hSTqh",
"node": {
"base_classes": [
"Message"
@@ -323,7 +472,7 @@
"description": "Get chat inputs from the Playground.",
"display_name": "Chat Input",
"documentation": "",
- "edited": true,
+ "edited": false,
"field_order": [
"input_value",
"sender",
@@ -493,16 +642,16 @@
},
"type": "ChatInput"
},
- "dragging": true,
- "height": 309,
- "id": "ChatInput-ENTF8",
+ "dragging": false,
+ "height": 308,
+ "id": "ChatInput-hSTqh",
"position": {
- "x": 1261.3748612945249,
- "y": 912.733279525042
+ "x": 1275.9262193671882,
+ "y": 836.1228056896347
},
"positionAbsolute": {
- "x": 1261.3748612945249,
- "y": 912.733279525042
+ "x": 1275.9262193671882,
+ "y": 836.1228056896347
},
"selected": false,
"type": "genericNode",
@@ -510,10 +659,7 @@
},
{
"data": {
- "description": "Generates text using OpenAI LLMs.",
- "display_name": "OpenAI",
- "edited": false,
- "id": "OpenAIModel-ZBIVC",
+ "id": "OpenAIModel-WmUtU",
"node": {
"base_classes": [
"LanguageModel",
@@ -525,7 +671,7 @@
"description": "Generates text using OpenAI LLMs.",
"display_name": "OpenAI",
"documentation": "",
- "edited": true,
+ "edited": false,
"field_order": [
"input_value",
"max_tokens",
@@ -603,6 +749,8 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
"type": "str",
"value": ""
},
@@ -617,6 +765,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_metadata": true,
"type": "int",
"value": ""
},
@@ -631,6 +780,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_input": true,
"type": "dict",
"value": {}
},
@@ -651,6 +801,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_metadata": true,
"type": "str",
"value": "gpt-4-turbo"
},
@@ -666,6 +817,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_metadata": true,
"type": "str",
"value": ""
},
@@ -696,6 +848,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_input": true,
"type": "dict",
"value": {}
},
@@ -710,6 +863,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_metadata": true,
"type": "int",
"value": 1
},
@@ -724,6 +878,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_metadata": true,
"type": "bool",
"value": false
},
@@ -739,6 +894,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_metadata": true,
"type": "str",
"value": ""
},
@@ -753,6 +909,7 @@
"required": false,
"show": true,
"title_case": false,
+ "trace_as_metadata": true,
"type": "float",
"value": 0.1
}
@@ -761,15 +918,15 @@
"type": "OpenAIModel"
},
"dragging": false,
- "height": 622,
- "id": "OpenAIModel-ZBIVC",
+ "height": 621,
+ "id": "OpenAIModel-WmUtU",
"position": {
- "x": 2495.6628431453228,
- "y": 669.9567653609598
+ "x": 2428.0215346784357,
+ "y": 569.9683144303319
},
"positionAbsolute": {
- "x": 2495.6628431453228,
- "y": 669.9567653609598
+ "x": 2428.0215346784357,
+ "y": 569.9683144303319
},
"selected": false,
"type": "genericNode",
@@ -777,10 +934,7 @@
},
{
"data": {
- "description": "Display a chat message in the Playground.",
- "display_name": "Chat Output",
- "edited": false,
- "id": "ChatOutput-e8ruq",
+ "id": "ChatOutput-LIvGN",
"node": {
"base_classes": [
"Message"
@@ -791,7 +945,7 @@
"description": "Display a chat message in the Playground.",
"display_name": "Chat Output",
"documentation": "",
- "edited": true,
+ "edited": false,
"field_order": [
"input_value",
"sender",
@@ -940,164 +1094,14 @@
},
"dragging": false,
"height": 308,
- "id": "ChatOutput-e8ruq",
+ "id": "ChatOutput-LIvGN",
"position": {
- "x": 3028.2686266398873,
- "y": 888.0854888768531
+ "x": 2988.248820475989,
+ "y": 705.837390387878
},
"positionAbsolute": {
- "x": 3028.2686266398873,
- "y": 888.0854888768531
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "description": "Create a prompt template with dynamic variables.",
- "display_name": "Prompt",
- "id": "Prompt-xhlQ7",
- "node": {
- "base_classes": [
- "Message"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {
- "template": [
- "context",
- "user_message"
- ]
- },
- "description": "Create a prompt template with dynamic variables.",
- "display_name": "Prompt",
- "documentation": "",
- "edited": false,
- "error": null,
- "field_order": [
- "template"
- ],
- "frozen": false,
- "full_path": null,
- "icon": "prompts",
- "is_composition": null,
- "is_input": null,
- "is_output": null,
- "name": "",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Prompt Message",
- "hidden": false,
- "method": "build_prompt",
- "name": "prompt",
- "selected": "Message",
- "types": [
- "Message"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "show": true,
- "title_case": false,
- "type": "code",
- "value": "from langflow.base.prompts.api_utils import process_prompt_template\nfrom langflow.custom import Component\nfrom langflow.io import Output, PromptInput\nfrom langflow.schema.message import Message\nfrom langflow.template.utils import update_template_values\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\n def post_code_processing(self, new_build_config: dict, current_build_config: dict):\n \"\"\"\n This function is called after the code validation is done.\n \"\"\"\n frontend_node = super().post_code_processing(new_build_config, current_build_config)\n template = frontend_node[\"template\"][\"template\"][\"value\"]\n _ = process_prompt_template(\n template=template,\n name=\"template\",\n custom_fields=frontend_node[\"custom_fields\"],\n frontend_node_template=frontend_node[\"template\"],\n )\n # Now that template is updated, we need to grab any values that were set in the current_build_config\n # and update the frontend_node with those values\n update_template_values(frontend_template=frontend_node, raw_template=current_build_config[\"template\"])\n return frontend_node\n"
- },
- "context": {
- "advanced": false,
- "display_name": "context",
- "dynamic": false,
- "field_type": "str",
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "input_types": [
- "Message",
- "Text"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "context",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "template": {
- "advanced": false,
- "display_name": "Template",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "template",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_input": true,
- "type": "prompt",
- "value": "{context}\n\nUser: {user_message}\nAI: "
- },
- "user_message": {
- "advanced": false,
- "display_name": "user_message",
- "dynamic": false,
- "field_type": "str",
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "input_types": [
- "Message",
- "Text"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "user_message",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- }
- }
- },
- "type": "Prompt"
- },
- "dragging": false,
- "height": 517,
- "id": "Prompt-xhlQ7",
- "position": {
- "x": 1879.4280156201567,
- "y": 674.3958274263156
- },
- "positionAbsolute": {
- "x": 1879.4280156201567,
- "y": 674.3958274263156
+ "x": 2988.248820475989,
+ "y": 705.837390387878
},
"selected": false,
"type": "genericNode",
@@ -1105,14 +1109,14 @@
}
],
"viewport": {
- "x": -592.532107710133,
- "y": -149.32118023592653,
+ "x": -586.5321077101332,
+ "y": -103.32118023592653,
"zoom": 0.5372819347267049
}
},
"description": "This project can be used as a starting point for building a Chat experience with user specific memory. You can set a different Session ID to start a new message history.",
"endpoint_name": null,
- "id": "909c382d-d215-4d50-91b3-dcb6f3ffd93c",
+ "id": "2a47bc35-69ca-4d8b-9895-2a7fab222b9f",
"is_component": false,
"last_tested_version": "1.0.0rc1",
"name": "Memory Chatbot"
diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json b/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json
index 5f974dc1a..ae6115c67 100644
--- a/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json
+++ b/src/backend/base/langflow/initial_setup/starter_projects/Vector Store RAG.json
@@ -1,3142 +1,3175 @@
{
- "id": "152a031a-a41a-4df1-a161-19800f686776",
- "data": {
- "nodes": [
- {
- "data": {
- "description": "Get chat inputs from the Playground.",
- "display_name": "Chat Input",
- "edited": false,
- "id": "ChatInput-8ZRjI",
- "node": {
- "base_classes": [
- "Message"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {},
- "description": "Get chat inputs from the Playground.",
- "display_name": "Chat Input",
- "documentation": "",
- "edited": true,
- "field_order": [
- "input_value",
- "sender",
- "sender_name",
- "session_id",
- "files"
- ],
- "frozen": false,
- "icon": "ChatInput",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Message",
- "hidden": false,
- "method": "message_response",
- "name": "message",
- "selected": "Message",
- "types": [
- "Message"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "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, MessageTextInput, MultilineInput, Output\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(\n name=\"session_id\", 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"
- },
- "files": {
- "advanced": true,
- "display_name": "Files",
- "dynamic": false,
- "fileTypes": [
- "txt",
- "md",
- "mdx",
- "csv",
- "json",
- "yaml",
- "yml",
- "xml",
- "html",
- "htm",
- "pdf",
- "docx",
- "py",
- "sh",
- "sql",
- "js",
- "ts",
- "tsx",
- "jpg",
- "jpeg",
- "png",
- "bmp",
- "image"
- ],
- "file_path": "",
- "info": "Files to be sent with the message.",
- "list": true,
- "name": "files",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_metadata": true,
- "type": "file",
- "value": ""
- },
- "input_value": {
- "advanced": false,
- "display_name": "Text",
- "dynamic": false,
- "info": "Message to be passed as input.",
- "input_types": [
- "Message"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "input_value",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_input": true,
- "trace_as_metadata": true,
- "type": "str",
- "value": ""
- },
- "sender": {
- "advanced": true,
- "display_name": "Sender Type",
- "dynamic": false,
- "info": "Type of sender.",
- "name": "sender",
- "options": [
- "Machine",
- "User"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_metadata": true,
- "type": "str",
- "value": "User"
- },
- "sender_name": {
- "advanced": true,
- "display_name": "Sender Name",
- "dynamic": false,
- "info": "Name of the sender.",
- "input_types": [
- "Message"
- ],
- "list": false,
- "load_from_db": false,
- "name": "sender_name",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_input": true,
- "trace_as_metadata": true,
- "type": "str",
- "value": "User"
- },
- "session_id": {
- "advanced": true,
- "display_name": "Session ID",
- "dynamic": false,
- "info": "Session ID for the message.",
- "input_types": [
- "Message"
- ],
- "list": false,
- "load_from_db": false,
- "name": "session_id",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_input": true,
- "trace_as_metadata": true,
- "type": "str",
- "value": ""
- }
- }
- },
- "type": "ChatInput"
- },
- "dragging": false,
- "height": 309,
- "id": "ChatInput-8ZRjI",
- "position": {
- "x": 682.002772470747,
- "y": 253.67030039648512
- },
- "positionAbsolute": {
- "x": 682.002772470747,
- "y": 253.67030039648512
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "id": "OpenAIEmbeddings-hNOwh",
- "node": {
- "base_classes": [
- "Embeddings"
- ],
- "beta": false,
- "custom_fields": {
- "allowed_special": null,
- "chunk_size": null,
- "client": null,
- "default_headers": null,
- "default_query": null,
- "deployment": null,
- "disallowed_special": null,
- "embedding_ctx_length": null,
- "max_retries": null,
- "model": null,
- "model_kwargs": null,
- "openai_api_base": null,
- "openai_api_key": null,
- "openai_api_type": null,
- "openai_api_version": null,
- "openai_organization": null,
- "openai_proxy": null,
- "request_timeout": null,
- "show_progress_bar": null,
- "skip_empty": null,
- "tiktoken_enable": null,
- "tiktoken_model_name": null
- },
- "description": "Generate embeddings using OpenAI models.",
- "display_name": "OpenAI Embeddings",
- "documentation": "",
- "field_formatters": {},
- "field_order": [],
- "frozen": false,
- "icon": "OpenAI",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Embeddings",
- "hidden": false,
- "method": "build_embeddings",
- "name": "embeddings",
- "selected": "Embeddings",
- "types": [
- "Embeddings"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "template": {
- "_type": "Component",
- "chunk_size": {
- "advanced": true,
- "display_name": "Chunk Size",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "chunk_size",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": 1000
- },
- "client": {
- "advanced": true,
- "display_name": "Client",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "client",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "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"
- },
- "default_headers": {
- "advanced": true,
- "display_name": "Default Headers",
- "dynamic": false,
- "info": "Default headers to use for the API request.",
- "list": false,
- "name": "default_headers",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "dict",
- "value": {}
- },
- "default_query": {
- "advanced": true,
- "display_name": "Default Query",
- "dynamic": false,
- "info": "Default query parameters to use for the API request.",
- "list": false,
- "name": "default_query",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "dict",
- "value": {}
- },
- "deployment": {
- "advanced": true,
- "display_name": "Deployment",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "deployment",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "embedding_ctx_length": {
- "advanced": true,
- "display_name": "Embedding Context Length",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "embedding_ctx_length",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": 1536
- },
- "max_retries": {
- "advanced": true,
- "display_name": "Max Retries",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "max_retries",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": 3
- },
- "model": {
- "advanced": false,
- "display_name": "Model",
- "dynamic": false,
- "info": "",
- "name": "model",
- "options": [
- "text-embedding-3-small",
- "text-embedding-3-large",
- "text-embedding-ada-002"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "text-embedding-3-small"
- },
- "model_kwargs": {
- "advanced": true,
- "display_name": "Model Kwargs",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "model_kwargs",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "dict",
- "value": {}
- },
- "openai_api_base": {
- "advanced": true,
- "display_name": "OpenAI API Base",
- "dynamic": false,
- "info": "",
- "input_types": [],
- "load_from_db": true,
- "name": "openai_api_base",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_api_key": {
- "advanced": false,
- "display_name": "OpenAI API Key",
- "dynamic": false,
- "info": "",
- "input_types": [],
- "load_from_db": false,
- "name": "openai_api_key",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_api_type": {
- "advanced": true,
- "display_name": "OpenAI API Type",
- "dynamic": false,
- "info": "",
- "input_types": [],
- "load_from_db": true,
- "name": "openai_api_type",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_api_version": {
- "advanced": true,
- "display_name": "OpenAI API Version",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "openai_api_version",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_organization": {
- "advanced": true,
- "display_name": "OpenAI Organization",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "openai_organization",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_proxy": {
- "advanced": true,
- "display_name": "OpenAI Proxy",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "openai_proxy",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "request_timeout": {
- "advanced": true,
- "display_name": "Request Timeout",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "request_timeout",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "float",
- "value": ""
- },
- "show_progress_bar": {
- "advanced": true,
- "display_name": "Show Progress Bar",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "show_progress_bar",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": false
- },
- "skip_empty": {
- "advanced": true,
- "display_name": "Skip Empty",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "skip_empty",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": false
- },
- "tiktoken_enable": {
- "advanced": true,
- "display_name": "TikToken Enable",
- "dynamic": false,
- "info": "If False, you must have transformers installed.",
- "list": false,
- "name": "tiktoken_enable",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": true
- },
- "tiktoken_model_name": {
- "advanced": true,
- "display_name": "TikToken Model Name",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "tiktoken_model_name",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- }
- }
- },
- "type": "OpenAIEmbeddings"
- },
- "dragging": false,
- "height": 393,
- "id": "OpenAIEmbeddings-hNOwh",
- "position": {
- "x": 672.1192980997866,
- "y": 786.6985113716086
- },
- "positionAbsolute": {
- "x": 672.1192980997866,
- "y": 786.6985113716086
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "description": "Generates text using OpenAI LLMs.",
- "display_name": "OpenAI",
- "edited": false,
- "id": "OpenAIModel-euVNy",
- "node": {
- "base_classes": [
- "LanguageModel",
- "Message"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {},
- "description": "Generates text using OpenAI LLMs.",
- "display_name": "OpenAI",
- "documentation": "",
- "edited": true,
- "field_order": [
- "input_value",
- "max_tokens",
- "model_kwargs",
- "output_schema",
- "model_name",
- "openai_api_base",
- "openai_api_key",
- "temperature",
- "stream",
- "system_message",
- "seed"
- ],
- "frozen": false,
- "icon": "OpenAI",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Text",
- "hidden": false,
- "method": "text_response",
- "name": "text_output",
- "selected": "Message",
- "types": [
- "Message"
- ],
- "value": "__UNDEFINED__"
- },
- {
- "cache": true,
- "display_name": "Language Model",
- "method": "build_model",
- "name": "model_output",
- "selected": "LanguageModel",
- "types": [
- "LanguageModel"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "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"
- },
- "input_value": {
- "advanced": false,
- "display_name": "Input",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message"
- ],
- "list": false,
- "load_from_db": false,
- "name": "input_value",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "max_tokens": {
- "advanced": true,
- "display_name": "Max Tokens",
- "dynamic": false,
- "info": "The maximum number of tokens to generate. Set to 0 for unlimited tokens.",
- "list": false,
- "name": "max_tokens",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": ""
- },
- "model_kwargs": {
- "advanced": true,
- "display_name": "Model Kwargs",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "model_kwargs",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "dict",
- "value": {}
- },
- "model_name": {
- "advanced": false,
- "display_name": "Model Name",
- "dynamic": false,
- "info": "",
- "name": "model_name",
- "options": [
- "gpt-4o",
- "gpt-4-turbo",
- "gpt-4-turbo-preview",
- "gpt-3.5-turbo",
- "gpt-3.5-turbo-0125"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "gpt-4-turbo"
- },
- "openai_api_base": {
- "advanced": true,
- "display_name": "OpenAI API Base",
- "dynamic": false,
- "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.",
- "list": false,
- "load_from_db": false,
- "name": "openai_api_base",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_api_key": {
- "advanced": false,
- "display_name": "OpenAI API Key",
- "dynamic": false,
- "info": "The OpenAI API Key to use for the OpenAI model.",
- "input_types": [],
- "load_from_db": false,
- "name": "openai_api_key",
- "password": true,
- "placeholder": "",
- "required": false,
- "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
- },
- "stream": {
- "advanced": true,
- "display_name": "Stream",
- "dynamic": false,
- "info": "Stream the response from the model. Streaming works only in Chat.",
- "list": false,
- "name": "stream",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": false
- },
- "system_message": {
- "advanced": true,
- "display_name": "System Message",
- "dynamic": false,
- "info": "System message to pass to the model.",
- "list": false,
- "load_from_db": false,
- "name": "system_message",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "temperature": {
- "advanced": false,
- "display_name": "Temperature",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "temperature",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "float",
- "value": 0.1
- }
- }
- },
- "type": "OpenAIModel"
- },
- "dragging": false,
- "height": 623,
- "id": "OpenAIModel-euVNy",
- "position": {
- "x": 3243.967394111999,
- "y": 392.861541437184
- },
- "positionAbsolute": {
- "x": 3243.967394111999,
- "y": 392.861541437184
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "description": "Display a chat message in the Playground.",
- "display_name": "Chat Output",
- "edited": false,
- "id": "ChatOutput-1eddV",
- "node": {
- "base_classes": [
- "Message"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {},
- "description": "Display a chat message in the Playground.",
- "display_name": "Chat Output",
- "documentation": "",
- "edited": true,
- "field_order": [
- "input_value",
- "sender",
- "sender_name",
- "session_id",
- "data_template"
- ],
- "frozen": false,
- "icon": "ChatOutput",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Message",
- "method": "message_response",
- "name": "message",
- "selected": "Message",
- "types": [
- "Message"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "show": true,
- "title_case": false,
- "type": "code",
- "value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.io import DropdownInput, MessageTextInput, Output\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(\n name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True\n ),\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"
- },
- "data_template": {
- "advanced": true,
- "display_name": "Data Template",
- "dynamic": false,
- "info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",
- "input_types": [
- "Message"
- ],
- "list": false,
- "load_from_db": false,
- "name": "data_template",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_input": true,
- "trace_as_metadata": true,
- "type": "str",
- "value": "{text}"
- },
- "input_value": {
- "advanced": false,
- "display_name": "Text",
- "dynamic": false,
- "info": "Message to be passed as output.",
- "input_types": [
- "Message"
- ],
- "list": false,
- "load_from_db": false,
- "name": "input_value",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_input": true,
- "trace_as_metadata": true,
- "type": "str",
- "value": ""
- },
- "sender": {
- "advanced": true,
- "display_name": "Sender Type",
- "dynamic": false,
- "info": "Type of sender.",
- "name": "sender",
- "options": [
- "Machine",
- "User"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_metadata": true,
- "type": "str",
- "value": "Machine"
- },
- "sender_name": {
- "advanced": true,
- "display_name": "Sender Name",
- "dynamic": false,
- "info": "Name of the sender.",
- "input_types": [
- "Message"
- ],
- "list": false,
- "load_from_db": false,
- "name": "sender_name",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_input": true,
- "trace_as_metadata": true,
- "type": "str",
- "value": "AI"
- },
- "session_id": {
- "advanced": true,
- "display_name": "Session ID",
- "dynamic": false,
- "info": "Session ID for the message.",
- "input_types": [
- "Message"
- ],
- "list": false,
- "load_from_db": false,
- "name": "session_id",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_input": true,
- "trace_as_metadata": true,
- "type": "str",
- "value": ""
- }
- }
- },
- "type": "ChatOutput"
- },
- "dragging": false,
- "height": 309,
- "id": "ChatOutput-1eddV",
- "position": {
- "x": 3788.786948642587,
- "y": 608.4077159222614
- },
- "positionAbsolute": {
- "x": 3788.786948642587,
- "y": 608.4077159222614
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "id": "File-p2YBf",
- "node": {
- "base_classes": [
- "Record"
- ],
- "beta": false,
- "custom_fields": {
- "path": null,
- "silent_errors": null
- },
- "description": "A generic file loader.",
- "display_name": "File",
- "documentation": "",
- "field_formatters": {},
- "field_order": [],
- "frozen": false,
- "icon": "file-text",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Data",
- "hidden": false,
- "method": "load_file",
- "name": "data",
- "selected": "Data",
- "types": [
- "Data"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "show": true,
- "title_case": false,
- "type": "code",
- "value": "from pathlib import Path\n\nfrom langflow.base.data.utils import TEXT_FILE_TYPES, parse_text_file_to_data\nfrom langflow.custom import Component\nfrom langflow.io import BoolInput, FileInput, Output\nfrom langflow.schema import Data\n\n\nclass FileComponent(Component):\n display_name = \"File\"\n description = \"A generic file loader.\"\n icon = \"file-text\"\n\n inputs = [\n FileInput(\n name=\"path\",\n display_name=\"Path\",\n file_types=TEXT_FILE_TYPES,\n info=f\"Supported file types: {', '.join(TEXT_FILE_TYPES)}\",\n ),\n BoolInput(\n name=\"silent_errors\",\n display_name=\"Silent Errors\",\n advanced=True,\n info=\"If true, errors will not raise an exception.\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"data\", method=\"load_file\"),\n ]\n\n def load_file(self) -> Data:\n if not self.path:\n raise ValueError(\"Please, upload a file to use this component.\")\n resolved_path = self.resolve_path(self.path)\n silent_errors = self.silent_errors\n\n extension = Path(resolved_path).suffix[1:].lower()\n\n if extension == \"doc\":\n raise ValueError(\"doc files are not supported. Please save as .docx\")\n if extension not in TEXT_FILE_TYPES:\n raise ValueError(f\"Unsupported file type: {extension}\")\n\n data = parse_text_file_to_data(resolved_path, silent_errors)\n self.status = data if data else \"No data\"\n return data or Data()\n"
- },
- "path": {
- "advanced": false,
- "display_name": "Path",
- "dynamic": false,
- "fileTypes": [
- "txt",
- "md",
- "mdx",
- "csv",
- "json",
- "yaml",
- "yml",
- "xml",
- "html",
- "htm",
- "pdf",
- "docx",
- "py",
- "sh",
- "sql",
- "js",
- "ts",
- "tsx"
- ],
- "file_path": "bba1609b-3af2-431d-a884-322cc253c69d/flatland.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",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "file",
- "value": ""
- },
- "silent_errors": {
- "advanced": true,
- "display_name": "Silent Errors",
- "dynamic": false,
- "info": "If true, errors will not raise an exception.",
- "list": false,
- "name": "silent_errors",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": false
- }
- }
- },
- "type": "File"
- },
- "dragging": false,
- "height": 301,
- "id": "File-p2YBf",
- "position": {
- "x": 1435.8917804347734,
- "y": 1603.546667861399
- },
- "positionAbsolute": {
- "x": 1435.8917804347734,
- "y": 1603.546667861399
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "description": "Implementation of Vector Store using Astra DB with search capabilities",
- "display_name": "Astra DB Vector Store",
- "id": "AstraDB-p6135",
- "node": {
- "base_classes": [
- "Data"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {},
- "description": "Implementation of Vector Store using Astra DB with search capabilities",
- "display_name": "Astra DB Vector Store",
- "documentation": "https://python.langchain.com/docs/integrations/vectorstores/astradb",
- "edited": false,
- "field_order": [
- "collection_name",
- "token",
- "api_endpoint",
- "vector_store_inputs",
- "embedding",
- "namespace",
- "metric",
- "batch_size",
- "bulk_insert_batch_concurrency",
- "bulk_insert_overwrite_concurrency",
- "bulk_delete_concurrency",
- "setup_mode",
- "pre_delete_collection",
- "metadata_indexing_include",
- "metadata_indexing_exclude",
- "collection_indexing_policy",
- "add_to_vector_store",
- "search_input",
- "search_type",
- "number_of_results"
- ],
- "frozen": false,
- "icon": "AstraDB",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Retriever",
- "method": "build_base_retriever",
- "name": "base_retriever",
- "selected": "Data",
- "types": [
- "Data"
- ],
- "value": "__UNDEFINED__"
- },
- {
- "cache": true,
- "display_name": "Search Results",
- "hidden": false,
- "method": "search_documents",
- "name": "search_results",
- "selected": "Data",
- "types": [
- "Data"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "add_to_vector_store": {
- "advanced": false,
- "display_name": "Add to Vector Store",
- "dynamic": false,
- "info": "If true, the Vector Store Inputs will be added to the Vector Store.",
- "list": false,
- "name": "add_to_vector_store",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": false
- },
- "api_endpoint": {
- "advanced": false,
- "display_name": "API Endpoint",
- "dynamic": false,
- "info": "API endpoint URL for the Astra DB service.",
- "input_types": [],
- "load_from_db": false,
- "name": "api_endpoint",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "batch_size": {
- "advanced": true,
- "display_name": "Batch Size",
- "dynamic": false,
- "info": "Optional number of data to process in a single batch.",
- "list": false,
- "name": "batch_size",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": ""
- },
- "bulk_delete_concurrency": {
- "advanced": true,
- "display_name": "Bulk Delete Concurrency",
- "dynamic": false,
- "info": "Optional concurrency level for bulk delete operations.",
- "list": false,
- "name": "bulk_delete_concurrency",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": ""
- },
- "bulk_insert_batch_concurrency": {
- "advanced": true,
- "display_name": "Bulk Insert Batch Concurrency",
- "dynamic": false,
- "info": "Optional concurrency level for bulk insert operations.",
- "list": false,
- "name": "bulk_insert_batch_concurrency",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": ""
- },
- "bulk_insert_overwrite_concurrency": {
- "advanced": true,
- "display_name": "Bulk Insert Overwrite Concurrency",
- "dynamic": false,
- "info": "Optional concurrency level for bulk insert operations that overwrite existing data.",
- "list": false,
- "name": "bulk_insert_overwrite_concurrency",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": ""
- },
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "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"
- },
- "collection_indexing_policy": {
- "advanced": true,
- "display_name": "Collection Indexing Policy",
- "dynamic": false,
- "info": "Optional dictionary defining the indexing policy for the collection.",
- "list": false,
- "load_from_db": false,
- "name": "collection_indexing_policy",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "collection_name": {
- "advanced": false,
- "display_name": "Collection Name",
- "dynamic": false,
- "info": "The name of the collection within Astra DB where the vectors will be stored.",
- "list": false,
- "load_from_db": false,
- "name": "collection_name",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "langflow"
- },
- "embedding": {
- "advanced": false,
- "display_name": "Embedding",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Embeddings"
- ],
- "list": false,
- "name": "embedding",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "other",
- "value": ""
- },
- "metadata_indexing_exclude": {
- "advanced": true,
- "display_name": "Metadata Indexing Exclude",
- "dynamic": false,
- "info": "Optional list of metadata fields to exclude from the indexing.",
- "list": false,
- "load_from_db": false,
- "name": "metadata_indexing_exclude",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "metadata_indexing_include": {
- "advanced": true,
- "display_name": "Metadata Indexing Include",
- "dynamic": false,
- "info": "Optional list of metadata fields to include in the indexing.",
- "list": false,
- "load_from_db": false,
- "name": "metadata_indexing_include",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "metric": {
- "advanced": true,
- "display_name": "Metric",
- "dynamic": false,
- "info": "Optional distance metric for vector comparisons in the vector store.",
- "name": "metric",
- "options": [
- "cosine",
- "dot_product",
- "euclidean"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "namespace": {
- "advanced": true,
- "display_name": "Namespace",
- "dynamic": false,
- "info": "Optional namespace within Astra DB to use for the collection.",
- "list": false,
- "load_from_db": false,
- "name": "namespace",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "number_of_results": {
- "advanced": true,
- "display_name": "Number of Results",
- "dynamic": false,
- "info": "Number of results to return.",
- "list": false,
- "name": "number_of_results",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": 4
- },
- "pre_delete_collection": {
- "advanced": true,
- "display_name": "Pre Delete Collection",
- "dynamic": false,
- "info": "Boolean flag to determine whether to delete the collection before creating a new one.",
- "list": false,
- "name": "pre_delete_collection",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": false
- },
- "search_input": {
- "advanced": false,
- "display_name": "Search Input",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "search_input",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "search_type": {
- "advanced": false,
- "display_name": "Search Type",
- "dynamic": false,
- "info": "",
- "name": "search_type",
- "options": [
- "Similarity",
- "MMR"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "Similarity"
- },
- "setup_mode": {
- "advanced": true,
- "display_name": "Setup Mode",
- "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"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "Sync"
- },
- "token": {
- "advanced": false,
- "display_name": "Astra DB Application Token",
- "dynamic": false,
- "info": "Authentication token for accessing Astra DB.",
- "input_types": [],
- "load_from_db": false,
- "name": "token",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "vector_store_inputs": {
- "advanced": false,
- "display_name": "Vector Store Inputs",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Document",
- "Data"
- ],
- "list": true,
- "name": "vector_store_inputs",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "other",
- "value": ""
- }
- }
- },
- "type": "AstraDB"
- },
- "dragging": false,
- "height": 917,
- "id": "AstraDB-p6135",
- "position": {
- "x": 1298.4611042465333,
- "y": 160.7181472642742
- },
- "positionAbsolute": {
- "x": 1298.4611042465333,
- "y": 160.7181472642742
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "id": "ParseData-9DrmC",
- "node": {
- "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"
- ],
- "frozen": false,
- "icon": "braces",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Text",
- "hidden": false,
- "method": "parse_data",
- "name": "text",
- "selected": "Message",
- "types": [
- "Message"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "show": true,
- "title_case": false,
- "type": "code",
- "value": "from langflow.custom import Component\nfrom langflow.helpers.data import data_to_text\nfrom langflow.io import DataInput, MultilineInput, Output, StrInput\nfrom langflow.schema.message import Message\n\n\nclass ParseDataComponent(Component):\n display_name = \"Parse Data\"\n description = \"Convert Data into plain text following a specified template.\"\n icon = \"braces\"\n\n inputs = [\n DataInput(name=\"data\", display_name=\"Data\", info=\"The data to convert to text.\"),\n MultilineInput(\n name=\"template\",\n display_name=\"Template\",\n info=\"The template to use for formatting the data. It can contain the keys {text}, {data} or any other key in the Data.\",\n value=\"{text}\",\n ),\n StrInput(name=\"sep\", display_name=\"Separator\", advanced=True, value=\"\\n\"),\n ]\n\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"parse_data\"),\n ]\n\n def parse_data(self) -> Message:\n data = self.data if isinstance(self.data, list) else [self.data]\n template = self.template\n\n result_string = data_to_text(template, data, sep=self.sep)\n self.status = result_string\n return Message(text=result_string)\n"
- },
- "data": {
- "advanced": false,
- "display_name": "Data",
- "dynamic": false,
- "info": "The data to convert to text.",
- "input_types": [
- "Data"
- ],
- "list": false,
- "name": "data",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "other",
- "value": ""
- },
- "sep": {
- "advanced": true,
- "display_name": "Separator",
- "dynamic": false,
- "info": "",
- "list": false,
- "load_from_db": false,
- "name": "sep",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "---"
- },
- "template": {
- "advanced": false,
- "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"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "template",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "{text}"
- }
- }
- },
- "type": "ParseData"
- },
- "dragging": false,
- "height": 385,
- "id": "ParseData-9DrmC",
- "position": {
- "x": 1911.4866480237615,
- "y": 566.903831987901
- },
- "positionAbsolute": {
- "x": 1911.4866480237615,
- "y": 566.903831987901
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "description": "Create a prompt template with dynamic variables.",
- "display_name": "Prompt",
- "id": "Prompt-EEXgw",
- "node": {
- "base_classes": [
- "Message"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {
- "template": [
- "context",
- "question"
- ]
- },
- "description": "Create a prompt template with dynamic variables.",
- "display_name": "Prompt",
- "documentation": "",
- "edited": false,
- "error": null,
- "field_order": [
- "template"
- ],
- "frozen": false,
- "full_path": null,
- "icon": "prompts",
- "is_composition": null,
- "is_input": null,
- "is_output": null,
- "name": "",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Prompt Message",
- "hidden": false,
- "method": "build_prompt",
- "name": "prompt",
- "selected": "Message",
- "types": [
- "Message"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "show": true,
- "title_case": false,
- "type": "code",
- "value": "from langflow.base.prompts.api_utils import process_prompt_template\nfrom langflow.custom import Component\nfrom langflow.io import Output, PromptInput\nfrom langflow.schema.message import Message\nfrom langflow.template.utils import update_template_values\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\n def post_code_processing(self, new_build_config: dict, current_build_config: dict):\n \"\"\"\n This function is called after the code validation is done.\n \"\"\"\n frontend_node = super().post_code_processing(new_build_config, current_build_config)\n template = frontend_node[\"template\"][\"template\"][\"value\"]\n _ = process_prompt_template(\n template=template,\n name=\"template\",\n custom_fields=frontend_node[\"custom_fields\"],\n frontend_node_template=frontend_node[\"template\"],\n )\n # Now that template is updated, we need to grab any values that were set in the current_build_config\n # and update the frontend_node with those values\n update_template_values(frontend_template=frontend_node, raw_template=current_build_config[\"template\"])\n return frontend_node\n"
- },
- "context": {
- "advanced": false,
- "display_name": "context",
- "dynamic": false,
- "field_type": "str",
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "input_types": [
- "Message",
- "Text"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "context",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "question": {
- "advanced": false,
- "display_name": "question",
- "dynamic": false,
- "field_type": "str",
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "input_types": [
- "Message",
- "Text"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "question",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "template": {
- "advanced": false,
- "display_name": "Template",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "template",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_input": true,
- "type": "prompt",
- "value": "{context}\n\n---\n\nGiven the context above, answer the question as best as possible.\n\nQuestion: {question}\n\nAnswer: "
- }
- }
- },
- "type": "Prompt"
- },
- "dragging": false,
- "height": 517,
- "id": "Prompt-EEXgw",
- "position": {
- "x": 2537.8054430938064,
- "y": 442.35183727527414
- },
- "positionAbsolute": {
- "x": 2537.8054430938064,
- "y": 442.35183727527414
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "id": "SplitText-qI0jS",
- "node": {
- "base_classes": [
- "Data"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {},
- "description": "Split text into chunks based on specified criteria.",
- "display_name": "Split Text",
- "documentation": "",
- "edited": false,
- "field_order": [
- "data_inputs",
- "chunk_overlap",
- "chunk_size",
- "separator"
- ],
- "frozen": false,
- "icon": "scissors-line-dashed",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Chunks",
- "hidden": false,
- "method": "split_text",
- "name": "chunks",
- "selected": "Data",
- "types": [
- "Data"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "chunk_overlap": {
- "advanced": false,
- "display_name": "Chunk Overlap",
- "dynamic": false,
- "info": "Number of characters to overlap between chunks.",
- "list": false,
- "name": "chunk_overlap",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_metadata": true,
- "type": "int",
- "value": 200
- },
- "chunk_size": {
- "advanced": false,
- "display_name": "Chunk Size",
- "dynamic": false,
- "info": "The maximum number of characters in each chunk.",
- "list": false,
- "name": "chunk_size",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_metadata": true,
- "type": "int",
- "value": 1000
- },
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "show": true,
- "title_case": false,
- "type": "code",
- "value": "from typing import List\n\nfrom langchain_text_splitters import CharacterTextSplitter\n\nfrom langflow.custom import Component\nfrom langflow.io import HandleInput, IntInput, MessageTextInput, Output\nfrom langflow.schema import Data\nfrom langflow.utils.util import unescape_string\n\n\nclass SplitTextComponent(Component):\n display_name: str = \"Split Text\"\n description: str = \"Split text into chunks based on specified criteria.\"\n icon = \"scissors-line-dashed\"\n\n inputs = [\n HandleInput(\n name=\"data_inputs\",\n display_name=\"Data Inputs\",\n info=\"The data to split.\",\n input_types=[\"Data\"],\n is_list=True,\n ),\n IntInput(\n name=\"chunk_overlap\",\n display_name=\"Chunk Overlap\",\n info=\"Number of characters to overlap between chunks.\",\n value=200,\n ),\n IntInput(\n name=\"chunk_size\",\n display_name=\"Chunk Size\",\n info=\"The maximum number of characters in each chunk.\",\n value=1000,\n ),\n MessageTextInput(\n name=\"separator\",\n display_name=\"Separator\",\n info=\"The character to split on. Defaults to newline.\",\n value=\"\\n\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Chunks\", name=\"chunks\", method=\"split_text\"),\n ]\n\n def _docs_to_data(self, docs):\n data = []\n for doc in docs:\n data.append(Data(text=doc.page_content, data=doc.metadata))\n return data\n\n def split_text(self) -> List[Data]:\n separator = unescape_string(self.separator)\n\n documents = []\n for _input in self.data_inputs:\n if isinstance(_input, Data):\n documents.append(_input.to_lc_document())\n\n splitter = CharacterTextSplitter(\n chunk_overlap=self.chunk_overlap,\n chunk_size=self.chunk_size,\n separator=separator,\n )\n docs = splitter.split_documents(documents)\n data = self._docs_to_data(docs)\n self.status = data\n return data\n"
- },
- "data_inputs": {
- "advanced": false,
- "display_name": "Data Inputs",
- "dynamic": false,
- "info": "The data to split.",
- "input_types": [
- "Data"
- ],
- "list": true,
- "name": "data_inputs",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_metadata": true,
- "type": "other",
- "value": ""
- },
- "separator": {
- "advanced": false,
- "display_name": "Separator",
- "dynamic": false,
- "info": "The character to split on. Defaults to newline.",
- "input_types": [
- "Message"
- ],
- "list": false,
- "load_from_db": false,
- "name": "separator",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "trace_as_input": true,
- "trace_as_metadata": true,
- "type": "str",
- "value": "\n"
- }
- }
- },
- "type": "SplitText"
- },
- "dragging": false,
- "height": 557,
- "id": "SplitText-qI0jS",
- "position": {
- "x": 1992.5159478772907,
- "y": 1190.8288727494814
- },
- "positionAbsolute": {
- "x": 1992.5159478772907,
- "y": 1190.8288727494814
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "id": "AstraDB-AX2Xz",
- "type": "genericNode",
- "position": {
- "x": 2773.0562333179937,
- "y": 1160.0660495763536
- },
- "data": {
- "description": "Implementation of Vector Store using Astra DB with search capabilities",
- "display_name": "Astra DB Vector Store",
- "id": "AstraDB-AX2Xz",
- "node": {
- "base_classes": [
- "Data"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {},
- "description": "Implementation of Vector Store using Astra DB with search capabilities",
- "display_name": "Astra DB Vector Store",
- "documentation": "https://python.langchain.com/docs/integrations/vectorstores/astradb",
- "edited": false,
- "field_order": [
- "collection_name",
- "token",
- "api_endpoint",
- "vector_store_inputs",
- "embedding",
- "namespace",
- "metric",
- "batch_size",
- "bulk_insert_batch_concurrency",
- "bulk_insert_overwrite_concurrency",
- "bulk_delete_concurrency",
- "setup_mode",
- "pre_delete_collection",
- "metadata_indexing_include",
- "metadata_indexing_exclude",
- "collection_indexing_policy",
- "add_to_vector_store",
- "search_input",
- "search_type",
- "number_of_results"
- ],
- "frozen": false,
- "icon": "AstraDB",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Retriever",
- "method": "build_base_retriever",
- "name": "base_retriever",
- "selected": "Data",
- "types": [
- "Data"
- ],
- "value": "__UNDEFINED__"
- },
- {
- "cache": true,
- "display_name": "Search Results",
- "hidden": false,
- "method": "search_documents",
- "name": "search_results",
- "selected": "Data",
- "types": [
- "Data"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "add_to_vector_store": {
- "advanced": false,
- "display_name": "Add to Vector Store",
- "dynamic": false,
- "info": "If true, the Vector Store Inputs will be added to the Vector Store.",
- "list": false,
- "name": "add_to_vector_store",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": true
- },
- "api_endpoint": {
- "advanced": false,
- "display_name": "API Endpoint",
- "dynamic": false,
- "info": "API endpoint URL for the Astra DB service.",
- "input_types": [],
- "load_from_db": false,
- "name": "api_endpoint",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "batch_size": {
- "advanced": true,
- "display_name": "Batch Size",
- "dynamic": false,
- "info": "Optional number of data to process in a single batch.",
- "list": false,
- "name": "batch_size",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": ""
- },
- "bulk_delete_concurrency": {
- "advanced": true,
- "display_name": "Bulk Delete Concurrency",
- "dynamic": false,
- "info": "Optional concurrency level for bulk delete operations.",
- "list": false,
- "name": "bulk_delete_concurrency",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": ""
- },
- "bulk_insert_batch_concurrency": {
- "advanced": true,
- "display_name": "Bulk Insert Batch Concurrency",
- "dynamic": false,
- "info": "Optional concurrency level for bulk insert operations.",
- "list": false,
- "name": "bulk_insert_batch_concurrency",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": ""
- },
- "bulk_insert_overwrite_concurrency": {
- "advanced": true,
- "display_name": "Bulk Insert Overwrite Concurrency",
- "dynamic": false,
- "info": "Optional concurrency level for bulk insert operations that overwrite existing data.",
- "list": false,
- "name": "bulk_insert_overwrite_concurrency",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": ""
- },
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "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"
- },
- "collection_indexing_policy": {
- "advanced": true,
- "display_name": "Collection Indexing Policy",
- "dynamic": false,
- "info": "Optional dictionary defining the indexing policy for the collection.",
- "list": false,
- "load_from_db": false,
- "name": "collection_indexing_policy",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "collection_name": {
- "advanced": false,
- "display_name": "Collection Name",
- "dynamic": false,
- "info": "The name of the collection within Astra DB where the vectors will be stored.",
- "list": false,
- "load_from_db": false,
- "name": "collection_name",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "langflow"
- },
- "embedding": {
- "advanced": false,
- "display_name": "Embedding",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Embeddings"
- ],
- "list": false,
- "name": "embedding",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "other",
- "value": ""
- },
- "metadata_indexing_exclude": {
- "advanced": true,
- "display_name": "Metadata Indexing Exclude",
- "dynamic": false,
- "info": "Optional list of metadata fields to exclude from the indexing.",
- "list": false,
- "load_from_db": false,
- "name": "metadata_indexing_exclude",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "metadata_indexing_include": {
- "advanced": true,
- "display_name": "Metadata Indexing Include",
- "dynamic": false,
- "info": "Optional list of metadata fields to include in the indexing.",
- "list": false,
- "load_from_db": false,
- "name": "metadata_indexing_include",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "metric": {
- "advanced": true,
- "display_name": "Metric",
- "dynamic": false,
- "info": "Optional distance metric for vector comparisons in the vector store.",
- "name": "metric",
- "options": [
- "cosine",
- "dot_product",
- "euclidean"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "namespace": {
- "advanced": true,
- "display_name": "Namespace",
- "dynamic": false,
- "info": "Optional namespace within Astra DB to use for the collection.",
- "list": false,
- "load_from_db": false,
- "name": "namespace",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "number_of_results": {
- "advanced": true,
- "display_name": "Number of Results",
- "dynamic": false,
- "info": "Number of results to return.",
- "list": false,
- "name": "number_of_results",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": 4
- },
- "pre_delete_collection": {
- "advanced": true,
- "display_name": "Pre Delete Collection",
- "dynamic": false,
- "info": "Boolean flag to determine whether to delete the collection before creating a new one.",
- "list": false,
- "name": "pre_delete_collection",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": false
- },
- "search_input": {
- "advanced": false,
- "display_name": "Search Input",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "search_input",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "search_type": {
- "advanced": false,
- "display_name": "Search Type",
- "dynamic": false,
- "info": "",
- "name": "search_type",
- "options": [
- "Similarity",
- "MMR"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "Similarity"
- },
- "setup_mode": {
- "advanced": true,
- "display_name": "Setup Mode",
- "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"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "Sync"
- },
- "token": {
- "advanced": false,
- "display_name": "Astra DB Application Token",
- "dynamic": false,
- "info": "Authentication token for accessing Astra DB.",
- "input_types": [],
- "load_from_db": false,
- "name": "token",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "vector_store_inputs": {
- "advanced": false,
- "display_name": "Vector Store Inputs",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Document",
- "Data"
- ],
- "list": true,
- "name": "vector_store_inputs",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "other",
- "value": ""
- }
- }
- },
- "type": "AstraDB"
- },
- "selected": false,
- "width": 384,
- "height": 917,
- "positionAbsolute": {
- "x": 2773.0562333179937,
- "y": 1160.0660495763536
- },
- "dragging": false
- },
- {
- "id": "OpenAIEmbeddings-PQc6x",
- "type": "genericNode",
- "position": {
- "x": 1992.590633037642,
- "y": 1850.2707576021312
- },
- "data": {
- "id": "OpenAIEmbeddings-PQc6x",
- "node": {
- "base_classes": [
- "Embeddings"
- ],
- "beta": false,
- "custom_fields": {
- "allowed_special": null,
- "chunk_size": null,
- "client": null,
- "default_headers": null,
- "default_query": null,
- "deployment": null,
- "disallowed_special": null,
- "embedding_ctx_length": null,
- "max_retries": null,
- "model": null,
- "model_kwargs": null,
- "openai_api_base": null,
- "openai_api_key": null,
- "openai_api_type": null,
- "openai_api_version": null,
- "openai_organization": null,
- "openai_proxy": null,
- "request_timeout": null,
- "show_progress_bar": null,
- "skip_empty": null,
- "tiktoken_enable": null,
- "tiktoken_model_name": null
- },
- "description": "Generate embeddings using OpenAI models.",
- "display_name": "OpenAI Embeddings",
- "documentation": "",
- "field_formatters": {},
- "field_order": [],
- "frozen": false,
- "icon": "OpenAI",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Embeddings",
- "hidden": false,
- "method": "build_embeddings",
- "name": "embeddings",
- "selected": "Embeddings",
- "types": [
- "Embeddings"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "template": {
- "_type": "Component",
- "chunk_size": {
- "advanced": true,
- "display_name": "Chunk Size",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "chunk_size",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": 1000
- },
- "client": {
- "advanced": true,
- "display_name": "Client",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "client",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "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"
- },
- "default_headers": {
- "advanced": true,
- "display_name": "Default Headers",
- "dynamic": false,
- "info": "Default headers to use for the API request.",
- "list": false,
- "name": "default_headers",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "dict",
- "value": {}
- },
- "default_query": {
- "advanced": true,
- "display_name": "Default Query",
- "dynamic": false,
- "info": "Default query parameters to use for the API request.",
- "list": false,
- "name": "default_query",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "dict",
- "value": {}
- },
- "deployment": {
- "advanced": true,
- "display_name": "Deployment",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "deployment",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "embedding_ctx_length": {
- "advanced": true,
- "display_name": "Embedding Context Length",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "embedding_ctx_length",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": 1536
- },
- "max_retries": {
- "advanced": true,
- "display_name": "Max Retries",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "max_retries",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": 3
- },
- "model": {
- "advanced": false,
- "display_name": "Model",
- "dynamic": false,
- "info": "",
- "name": "model",
- "options": [
- "text-embedding-3-small",
- "text-embedding-3-large",
- "text-embedding-ada-002"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "text-embedding-3-small"
- },
- "model_kwargs": {
- "advanced": true,
- "display_name": "Model Kwargs",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "model_kwargs",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "dict",
- "value": {}
- },
- "openai_api_base": {
- "advanced": true,
- "display_name": "OpenAI API Base",
- "dynamic": false,
- "info": "",
- "input_types": [],
- "load_from_db": true,
- "name": "openai_api_base",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_api_key": {
- "advanced": false,
- "display_name": "OpenAI API Key",
- "dynamic": false,
- "info": "",
- "input_types": [],
- "load_from_db": false,
- "name": "openai_api_key",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_api_type": {
- "advanced": true,
- "display_name": "OpenAI API Type",
- "dynamic": false,
- "info": "",
- "input_types": [],
- "load_from_db": true,
- "name": "openai_api_type",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_api_version": {
- "advanced": true,
- "display_name": "OpenAI API Version",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "openai_api_version",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_organization": {
- "advanced": true,
- "display_name": "OpenAI Organization",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "openai_organization",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_proxy": {
- "advanced": true,
- "display_name": "OpenAI Proxy",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "openai_proxy",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "request_timeout": {
- "advanced": true,
- "display_name": "Request Timeout",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "request_timeout",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "float",
- "value": ""
- },
- "show_progress_bar": {
- "advanced": true,
- "display_name": "Show Progress Bar",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "show_progress_bar",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": false
- },
- "skip_empty": {
- "advanced": true,
- "display_name": "Skip Empty",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "skip_empty",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": false
- },
- "tiktoken_enable": {
- "advanced": true,
- "display_name": "TikToken Enable",
- "dynamic": false,
- "info": "If False, you must have transformers installed.",
- "list": false,
- "name": "tiktoken_enable",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": true
- },
- "tiktoken_model_name": {
- "advanced": true,
- "display_name": "TikToken Model Name",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "tiktoken_model_name",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- }
- }
- },
- "type": "OpenAIEmbeddings"
- },
- "selected": true,
- "width": 384,
- "height": 395,
- "positionAbsolute": {
- "x": 1992.590633037642,
- "y": 1850.2707576021312
- },
- "dragging": true
+ "data": {
+ "edges": [
+ {
+ "data": {
+ "sourceHandle": {
+ "dataType": "ChatInput",
+ "id": "ChatInput-c4xn9",
+ "name": "message",
+ "output_types": [
+ "Message"
+ ]
+ },
+ "targetHandle": {
+ "fieldName": "search_input",
+ "id": "AstraDB-7nAHJ",
+ "inputTypes": [
+ "Message"
+ ],
+ "type": "str"
+ }
+ },
+ "id": "reactflow__edge-ChatInput-c4xn9{œdataTypeœ:œChatInputœ,œidœ:œChatInput-c4xn9œ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-AstraDB-7nAHJ{œfieldNameœ:œsearch_inputœ,œidœ:œAstraDB-7nAHJœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
+ "source": "ChatInput-c4xn9",
+ "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-c4xn9œ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "AstraDB-7nAHJ",
+ "targetHandle": "{œfieldNameœ: œsearch_inputœ, œidœ: œAstraDB-7nAHJœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
+ },
+ {
+ "data": {
+ "sourceHandle": {
+ "dataType": "OpenAIEmbeddings",
+ "id": "OpenAIEmbeddings-BKXc6",
+ "name": "embeddings",
+ "output_types": [
+ "Embeddings"
+ ]
+ },
+ "targetHandle": {
+ "fieldName": "embedding",
+ "id": "AstraDB-7nAHJ",
+ "inputTypes": [
+ "Embeddings",
+ "dict"
+ ],
+ "type": "other"
+ }
+ },
+ "id": "reactflow__edge-OpenAIEmbeddings-BKXc6{œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-BKXc6œ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}-AstraDB-7nAHJ{œfieldNameœ:œembeddingœ,œidœ:œAstraDB-7nAHJœ,œinputTypesœ:[œEmbeddingsœ,œdictœ],œtypeœ:œotherœ}",
+ "source": "OpenAIEmbeddings-BKXc6",
+ "sourceHandle": "{œdataTypeœ: œOpenAIEmbeddingsœ, œidœ: œOpenAIEmbeddings-BKXc6œ, œnameœ: œembeddingsœ, œoutput_typesœ: [œEmbeddingsœ]}",
+ "target": "AstraDB-7nAHJ",
+ "targetHandle": "{œfieldNameœ: œembeddingœ, œidœ: œAstraDB-7nAHJœ, œinputTypesœ: [œEmbeddingsœ, œdictœ], œtypeœ: œotherœ}"
+ },
+ {
+ "data": {
+ "sourceHandle": {
+ "dataType": "AstraDB",
+ "id": "AstraDB-7nAHJ",
+ "name": "search_results",
+ "output_types": [
+ "Data"
+ ]
+ },
+ "targetHandle": {
+ "fieldName": "data",
+ "id": "ParseData-d61Q0",
+ "inputTypes": [
+ "Data"
+ ],
+ "type": "other"
+ }
+ },
+ "id": "reactflow__edge-AstraDB-7nAHJ{œdataTypeœ:œAstraDBœ,œidœ:œAstraDB-7nAHJœ,œnameœ:œsearch_resultsœ,œoutput_typesœ:[œDataœ]}-ParseData-d61Q0{œfieldNameœ:œdataœ,œidœ:œParseData-d61Q0œ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}",
+ "source": "AstraDB-7nAHJ",
+ "sourceHandle": "{œdataTypeœ: œAstraDBœ, œidœ: œAstraDB-7nAHJœ, œnameœ: œsearch_resultsœ, œoutput_typesœ: [œDataœ]}",
+ "target": "ParseData-d61Q0",
+ "targetHandle": "{œfieldNameœ: œdataœ, œidœ: œParseData-d61Q0œ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}"
+ },
+ {
+ "data": {
+ "sourceHandle": {
+ "dataType": "ParseData",
+ "id": "ParseData-d61Q0",
+ "name": "text",
+ "output_types": [
+ "Message"
+ ]
+ },
+ "targetHandle": {
+ "fieldName": "context",
+ "id": "Prompt-vqAlG",
+ "inputTypes": [
+ "Message",
+ "Text"
+ ],
+ "type": "str"
+ }
+ },
+ "id": "reactflow__edge-ParseData-d61Q0{œdataTypeœ:œParseDataœ,œidœ:œParseData-d61Q0œ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-vqAlG{œfieldNameœ:œcontextœ,œidœ:œPrompt-vqAlGœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
+ "source": "ParseData-d61Q0",
+ "sourceHandle": "{œdataTypeœ: œParseDataœ, œidœ: œParseData-d61Q0œ, œnameœ: œtextœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "Prompt-vqAlG",
+ "targetHandle": "{œfieldNameœ: œcontextœ, œidœ: œPrompt-vqAlGœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
+ },
+ {
+ "data": {
+ "sourceHandle": {
+ "dataType": "ChatInput",
+ "id": "ChatInput-c4xn9",
+ "name": "message",
+ "output_types": [
+ "Message"
+ ]
+ },
+ "targetHandle": {
+ "fieldName": "question",
+ "id": "Prompt-vqAlG",
+ "inputTypes": [
+ "Message",
+ "Text"
+ ],
+ "type": "str"
+ }
+ },
+ "id": "reactflow__edge-ChatInput-c4xn9{œdataTypeœ:œChatInputœ,œidœ:œChatInput-c4xn9œ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-vqAlG{œfieldNameœ:œquestionœ,œidœ:œPrompt-vqAlGœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
+ "source": "ChatInput-c4xn9",
+ "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-c4xn9œ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "Prompt-vqAlG",
+ "targetHandle": "{œfieldNameœ: œquestionœ, œidœ: œPrompt-vqAlGœ, œinputTypesœ: [œMessageœ, œTextœ], œtypeœ: œstrœ}"
+ },
+ {
+ "data": {
+ "sourceHandle": {
+ "dataType": "Prompt",
+ "id": "Prompt-vqAlG",
+ "name": "prompt",
+ "output_types": [
+ "Message"
+ ]
+ },
+ "targetHandle": {
+ "fieldName": "input_value",
+ "id": "OpenAIModel-ybL3k",
+ "inputTypes": [
+ "Message"
+ ],
+ "type": "str"
+ }
+ },
+ "id": "reactflow__edge-Prompt-vqAlG{œdataTypeœ:œPromptœ,œidœ:œPrompt-vqAlGœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-ybL3k{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-ybL3kœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
+ "source": "Prompt-vqAlG",
+ "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-vqAlGœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "OpenAIModel-ybL3k",
+ "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-ybL3kœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
+ },
+ {
+ "data": {
+ "sourceHandle": {
+ "dataType": "OpenAIModel",
+ "id": "OpenAIModel-ybL3k",
+ "name": "text_output",
+ "output_types": [
+ "Message"
+ ]
+ },
+ "targetHandle": {
+ "fieldName": "input_value",
+ "id": "ChatOutput-BpzuD",
+ "inputTypes": [
+ "Message"
+ ],
+ "type": "str"
+ }
+ },
+ "id": "reactflow__edge-OpenAIModel-ybL3k{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-ybL3kœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-BpzuD{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-BpzuDœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
+ "source": "OpenAIModel-ybL3k",
+ "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-ybL3kœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}",
+ "target": "ChatOutput-BpzuD",
+ "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-BpzuDœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
+ },
+ {
+ "data": {
+ "sourceHandle": {
+ "dataType": "File",
+ "id": "File-bf6wn",
+ "name": "data",
+ "output_types": [
+ "Data"
+ ]
+ },
+ "targetHandle": {
+ "fieldName": "data_inputs",
+ "id": "SplitText-52wBo",
+ "inputTypes": [
+ "Data"
+ ],
+ "type": "other"
+ }
+ },
+ "id": "reactflow__edge-File-bf6wn{œdataTypeœ:œFileœ,œidœ:œFile-bf6wnœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-SplitText-52wBo{œfieldNameœ:œdata_inputsœ,œidœ:œSplitText-52wBoœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}",
+ "source": "File-bf6wn",
+ "sourceHandle": "{œdataTypeœ: œFileœ, œidœ: œFile-bf6wnœ, œnameœ: œdataœ, œoutput_typesœ: [œDataœ]}",
+ "target": "SplitText-52wBo",
+ "targetHandle": "{œfieldNameœ: œdata_inputsœ, œidœ: œSplitText-52wBoœ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}"
+ },
+ {
+ "data": {
+ "sourceHandle": {
+ "dataType": "SplitText",
+ "id": "SplitText-52wBo",
+ "name": "chunks",
+ "output_types": [
+ "Data"
+ ]
+ },
+ "targetHandle": {
+ "fieldName": "ingest_data",
+ "id": "AstraDB-vyd5U",
+ "inputTypes": [
+ "Data"
+ ],
+ "type": "other"
+ }
+ },
+ "id": "reactflow__edge-SplitText-52wBo{œdataTypeœ:œSplitTextœ,œidœ:œSplitText-52wBoœ,œnameœ:œchunksœ,œoutput_typesœ:[œDataœ]}-AstraDB-vyd5U{œfieldNameœ:œingest_dataœ,œidœ:œAstraDB-vyd5Uœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}",
+ "source": "SplitText-52wBo",
+ "sourceHandle": "{œdataTypeœ: œSplitTextœ, œidœ: œSplitText-52wBoœ, œnameœ: œchunksœ, œoutput_typesœ: [œDataœ]}",
+ "target": "AstraDB-vyd5U",
+ "targetHandle": "{œfieldNameœ: œingest_dataœ, œidœ: œAstraDB-vyd5Uœ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}"
+ },
+ {
+ "data": {
+ "sourceHandle": {
+ "dataType": "OpenAIEmbeddings",
+ "id": "OpenAIEmbeddings-sRZMc",
+ "name": "embeddings",
+ "output_types": [
+ "Embeddings"
+ ]
+ },
+ "targetHandle": {
+ "fieldName": "embedding",
+ "id": "AstraDB-vyd5U",
+ "inputTypes": [
+ "Embeddings",
+ "dict"
+ ],
+ "type": "other"
+ }
+ },
+ "id": "reactflow__edge-OpenAIEmbeddings-sRZMc{œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-sRZMcœ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}-AstraDB-vyd5U{œfieldNameœ:œembeddingœ,œidœ:œAstraDB-vyd5Uœ,œinputTypesœ:[œEmbeddingsœ,œdictœ],œtypeœ:œotherœ}",
+ "source": "OpenAIEmbeddings-sRZMc",
+ "sourceHandle": "{œdataTypeœ: œOpenAIEmbeddingsœ, œidœ: œOpenAIEmbeddings-sRZMcœ, œnameœ: œembeddingsœ, œoutput_typesœ: [œEmbeddingsœ]}",
+ "target": "AstraDB-vyd5U",
+ "targetHandle": "{œfieldNameœ: œembeddingœ, œidœ: œAstraDB-vyd5Uœ, œinputTypesœ: [œEmbeddingsœ, œdictœ], œtypeœ: œotherœ}"
+ }
+ ],
+ "nodes": [
+ {
+ "data": {
+ "id": "ChatInput-c4xn9",
+ "node": {
+ "base_classes": [
+ "Message"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {},
+ "description": "Get chat inputs from the Playground.",
+ "display_name": "Chat Input",
+ "documentation": "",
+ "edited": false,
+ "field_order": [
+ "input_value",
+ "sender",
+ "sender_name",
+ "session_id",
+ "files"
+ ],
+ "frozen": false,
+ "icon": "ChatInput",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Message",
+ "hidden": false,
+ "method": "message_response",
+ "name": "message",
+ "selected": "Message",
+ "types": [
+ "Message"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "_type": "Component",
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "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, MessageTextInput, MultilineInput, Output\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(\n name=\"session_id\", 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"
+ },
+ "files": {
+ "advanced": true,
+ "display_name": "Files",
+ "dynamic": false,
+ "fileTypes": [
+ "txt",
+ "md",
+ "mdx",
+ "csv",
+ "json",
+ "yaml",
+ "yml",
+ "xml",
+ "html",
+ "htm",
+ "pdf",
+ "docx",
+ "py",
+ "sh",
+ "sql",
+ "js",
+ "ts",
+ "tsx",
+ "jpg",
+ "jpeg",
+ "png",
+ "bmp",
+ "image"
+ ],
+ "file_path": "",
+ "info": "Files to be sent with the message.",
+ "list": true,
+ "name": "files",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "file",
+ "value": ""
+ },
+ "input_value": {
+ "advanced": false,
+ "display_name": "Text",
+ "dynamic": false,
+ "info": "Message to be passed as input.",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "input_value",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "sender": {
+ "advanced": true,
+ "display_name": "Sender Type",
+ "dynamic": false,
+ "info": "Type of sender.",
+ "name": "sender",
+ "options": [
+ "Machine",
+ "User"
+ ],
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "User"
+ },
+ "sender_name": {
+ "advanced": true,
+ "display_name": "Sender Name",
+ "dynamic": false,
+ "info": "Name of the sender.",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "sender_name",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "User"
+ },
+ "session_id": {
+ "advanced": true,
+ "display_name": "Session ID",
+ "dynamic": false,
+ "info": "Session ID for the message.",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "session_id",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ }
}
- ],
- "edges": [
- {
- "className": "",
- "data": {
- "sourceHandle": {
- "dataType": "ChatInput",
- "id": "ChatInput-8ZRjI",
- "name": "message",
- "output_types": [
- "Message"
- ]
- },
- "targetHandle": {
- "fieldName": "search_input",
- "id": "AstraDB-p6135",
- "inputTypes": [
- "Message",
- "str"
- ],
- "type": "str"
- }
- },
- "id": "reactflow__edge-ChatInput-8ZRjI{œdataTypeœ:œChatInputœ,œidœ:œChatInput-8ZRjIœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-AstraDB-p6135{œfieldNameœ:œsearch_inputœ,œidœ:œAstraDB-p6135œ,œinputTypesœ:[œMessageœ,œstrœ],œtypeœ:œstrœ}",
- "selected": false,
- "source": "ChatInput-8ZRjI",
- "sourceHandle": "{œdataTypeœ:œChatInputœ,œidœ:œChatInput-8ZRjIœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}",
- "target": "AstraDB-p6135",
- "targetHandle": "{œfieldNameœ:œsearch_inputœ,œidœ:œAstraDB-p6135œ,œinputTypesœ:[œMessageœ,œstrœ],œtypeœ:œstrœ}"
- },
- {
- "className": "",
- "data": {
- "sourceHandle": {
- "dataType": "OpenAIEmbeddings",
- "id": "OpenAIEmbeddings-hNOwh",
- "name": "embeddings",
- "output_types": [
- "Embeddings"
- ]
- },
- "targetHandle": {
- "fieldName": "embedding",
- "id": "AstraDB-p6135",
- "inputTypes": [
- "Embeddings"
- ],
- "type": "other"
- }
- },
- "id": "reactflow__edge-OpenAIEmbeddings-hNOwh{œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-hNOwhœ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}-AstraDB-p6135{œfieldNameœ:œembeddingœ,œidœ:œAstraDB-p6135œ,œinputTypesœ:[œEmbeddingsœ],œtypeœ:œotherœ}",
- "selected": false,
- "source": "OpenAIEmbeddings-hNOwh",
- "sourceHandle": "{œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-hNOwhœ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}",
- "target": "AstraDB-p6135",
- "targetHandle": "{œfieldNameœ:œembeddingœ,œidœ:œAstraDB-p6135œ,œinputTypesœ:[œEmbeddingsœ],œtypeœ:œotherœ}"
- },
- {
- "className": "",
- "data": {
- "sourceHandle": {
- "dataType": "AstraDB",
- "id": "AstraDB-p6135",
- "name": "search_results",
- "output_types": [
- "Data"
- ]
- },
- "targetHandle": {
- "fieldName": "data",
- "id": "ParseData-9DrmC",
- "inputTypes": [
- "Data"
- ],
- "type": "other"
- }
- },
- "id": "reactflow__edge-AstraDB-p6135{œdataTypeœ:œAstraDBœ,œidœ:œAstraDB-p6135œ,œnameœ:œsearch_resultsœ,œoutput_typesœ:[œDataœ]}-ParseData-9DrmC{œfieldNameœ:œdataœ,œidœ:œParseData-9DrmCœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}",
- "selected": false,
- "source": "AstraDB-p6135",
- "sourceHandle": "{œdataTypeœ:œAstraDBœ,œidœ:œAstraDB-p6135œ,œnameœ:œsearch_resultsœ,œoutput_typesœ:[œDataœ]}",
- "target": "ParseData-9DrmC",
- "targetHandle": "{œfieldNameœ:œdataœ,œidœ:œParseData-9DrmCœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}"
- },
- {
- "className": "",
- "data": {
- "sourceHandle": {
- "dataType": "ChatInput",
- "id": "ChatInput-8ZRjI",
- "name": "message",
- "output_types": [
- "Message"
- ]
- },
- "targetHandle": {
- "fieldName": "question",
- "id": "Prompt-EEXgw",
- "inputTypes": [
- "Message",
- "Text"
- ],
- "type": "str"
- }
- },
- "id": "reactflow__edge-ChatInput-8ZRjI{œdataTypeœ:œChatInputœ,œidœ:œChatInput-8ZRjIœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-Prompt-EEXgw{œfieldNameœ:œquestionœ,œidœ:œPrompt-EEXgwœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
- "source": "ChatInput-8ZRjI",
- "sourceHandle": "{œdataTypeœ:œChatInputœ,œidœ:œChatInput-8ZRjIœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}",
- "target": "Prompt-EEXgw",
- "targetHandle": "{œfieldNameœ:œquestionœ,œidœ:œPrompt-EEXgwœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}"
- },
- {
- "className": "",
- "data": {
- "sourceHandle": {
- "dataType": "File",
- "id": "File-p2YBf",
- "name": "data",
- "output_types": [
- "Data"
- ]
- },
- "targetHandle": {
- "fieldName": "data_inputs",
- "id": "SplitText-qI0jS",
- "inputTypes": [
- "Data"
- ],
- "type": "other"
- }
- },
- "id": "reactflow__edge-File-p2YBf{œdataTypeœ:œFileœ,œidœ:œFile-p2YBfœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}-SplitText-qI0jS{œfieldNameœ:œdata_inputsœ,œidœ:œSplitText-qI0jSœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}",
- "source": "File-p2YBf",
- "sourceHandle": "{œdataTypeœ:œFileœ,œidœ:œFile-p2YBfœ,œnameœ:œdataœ,œoutput_typesœ:[œDataœ]}",
- "target": "SplitText-qI0jS",
- "targetHandle": "{œfieldNameœ:œdata_inputsœ,œidœ:œSplitText-qI0jSœ,œinputTypesœ:[œDataœ],œtypeœ:œotherœ}",
- "selected": false
- },
- {
- "className": "",
- "data": {
- "sourceHandle": {
- "dataType": "ParseData",
- "id": "ParseData-9DrmC",
- "name": "text",
- "output_types": [
- "Message"
- ]
- },
- "targetHandle": {
- "fieldName": "context",
- "id": "Prompt-EEXgw",
- "inputTypes": [
- "Message",
- "Text"
- ],
- "type": "str"
- }
- },
- "id": "reactflow__edge-ParseData-9DrmC{œdataTypeœ:œParseDataœ,œidœ:œParseData-9DrmCœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}-Prompt-EEXgw{œfieldNameœ:œcontextœ,œidœ:œPrompt-EEXgwœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}",
- "source": "ParseData-9DrmC",
- "sourceHandle": "{œdataTypeœ:œParseDataœ,œidœ:œParseData-9DrmCœ,œnameœ:œtextœ,œoutput_typesœ:[œMessageœ]}",
- "target": "Prompt-EEXgw",
- "targetHandle": "{œfieldNameœ:œcontextœ,œidœ:œPrompt-EEXgwœ,œinputTypesœ:[œMessageœ,œTextœ],œtypeœ:œstrœ}"
- },
- {
- "className": "",
- "data": {
- "sourceHandle": {
- "dataType": "Prompt",
- "id": "Prompt-EEXgw",
- "name": "prompt",
- "output_types": [
- "Message"
- ]
- },
- "targetHandle": {
- "fieldName": "input_value",
- "id": "OpenAIModel-euVNy",
- "inputTypes": [
- "Message"
- ],
- "type": "str"
- }
- },
- "id": "reactflow__edge-Prompt-EEXgw{œdataTypeœ:œPromptœ,œidœ:œPrompt-EEXgwœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}-OpenAIModel-euVNy{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-euVNyœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
- "source": "Prompt-EEXgw",
- "sourceHandle": "{œdataTypeœ:œPromptœ,œidœ:œPrompt-EEXgwœ,œnameœ:œpromptœ,œoutput_typesœ:[œMessageœ]}",
- "target": "OpenAIModel-euVNy",
- "targetHandle": "{œfieldNameœ:œinput_valueœ,œidœ:œOpenAIModel-euVNyœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}"
- },
- {
- "className": "",
- "data": {
- "sourceHandle": {
- "dataType": "OpenAIModel",
- "id": "OpenAIModel-euVNy",
- "name": "text_output",
- "output_types": [
- "Message"
- ]
- },
- "targetHandle": {
- "fieldName": "input_value",
- "id": "ChatOutput-1eddV",
- "inputTypes": [
- "Message"
- ],
- "type": "str"
- }
- },
- "id": "reactflow__edge-OpenAIModel-euVNy{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-euVNyœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-1eddV{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-1eddVœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}",
- "source": "OpenAIModel-euVNy",
- "sourceHandle": "{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-euVNyœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}",
- "target": "ChatOutput-1eddV",
- "targetHandle": "{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-1eddVœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}"
- },
- {
- "className": "",
- "data": {
- "sourceHandle": {
- "dataType": "SplitText",
- "id": "SplitText-qI0jS",
- "name": "chunks",
- "output_types": [
- "Data"
- ]
- },
- "targetHandle": {
- "fieldName": "vector_store_inputs",
- "id": "AstraDB-AX2Xz",
- "inputTypes": [
- "Document",
- "Data"
- ],
- "type": "other"
- }
- },
- "source": "SplitText-qI0jS",
- "sourceHandle": "{œdataTypeœ:œSplitTextœ,œidœ:œSplitText-qI0jSœ,œnameœ:œchunksœ,œoutput_typesœ:[œDataœ]}",
- "target": "AstraDB-AX2Xz",
- "targetHandle": "{œfieldNameœ:œvector_store_inputsœ,œidœ:œAstraDB-AX2Xzœ,œinputTypesœ:[œDocumentœ,œDataœ],œtypeœ:œotherœ}",
- "id": "reactflow__edge-SplitText-qI0jS{œdataTypeœ:œSplitTextœ,œidœ:œSplitText-qI0jSœ,œnameœ:œchunksœ,œoutput_typesœ:[œDataœ]}-AstraDB-AX2Xz{œfieldNameœ:œvector_store_inputsœ,œidœ:œAstraDB-AX2Xzœ,œinputTypesœ:[œDocumentœ,œDataœ],œtypeœ:œotherœ}",
- "selected": false
- },
- {
- "source": "OpenAIEmbeddings-PQc6x",
- "sourceHandle": "{œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-PQc6xœ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}",
- "target": "AstraDB-AX2Xz",
- "targetHandle": "{œfieldNameœ:œembeddingœ,œidœ:œAstraDB-AX2Xzœ,œinputTypesœ:[œEmbeddingsœ],œtypeœ:œotherœ}",
- "data": {
- "targetHandle": {
- "fieldName": "embedding",
- "id": "AstraDB-AX2Xz",
- "inputTypes": [
- "Embeddings"
- ],
- "type": "other"
- },
- "sourceHandle": {
- "dataType": "OpenAIEmbeddings",
- "id": "OpenAIEmbeddings-PQc6x",
- "name": "embeddings",
- "output_types": [
- "Embeddings"
- ]
- }
- },
- "id": "reactflow__edge-OpenAIEmbeddings-PQc6x{œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-PQc6xœ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}-AstraDB-AX2Xz{œfieldNameœ:œembeddingœ,œidœ:œAstraDB-AX2Xzœ,œinputTypesœ:[œEmbeddingsœ],œtypeœ:œotherœ}",
- "selected": false
+ },
+ "type": "ChatInput"
+ },
+ "dragging": false,
+ "height": 308,
+ "id": "ChatInput-c4xn9",
+ "position": {
+ "x": 642.3545710150049,
+ "y": 220.22556606238678
+ },
+ "positionAbsolute": {
+ "x": 642.3545710150049,
+ "y": 220.22556606238678
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ },
+ {
+ "data": {
+ "id": "AstraDB-7nAHJ",
+ "node": {
+ "base_classes": [
+ "Data",
+ "Retriever"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {},
+ "description": "Implementation of Vector Store using Astra DB with search capabilities",
+ "display_name": "Astra DB",
+ "documentation": "https://python.langchain.com/docs/integrations/vectorstores/astradb",
+ "edited": false,
+ "field_order": [
+ "collection_name",
+ "token",
+ "api_endpoint",
+ "search_input",
+ "ingest_data",
+ "namespace",
+ "metric",
+ "batch_size",
+ "bulk_insert_batch_concurrency",
+ "bulk_insert_overwrite_concurrency",
+ "bulk_delete_concurrency",
+ "setup_mode",
+ "pre_delete_collection",
+ "metadata_indexing_include",
+ "embedding",
+ "metadata_indexing_exclude",
+ "collection_indexing_policy",
+ "search_type",
+ "number_of_results"
+ ],
+ "frozen": false,
+ "icon": "AstraDB",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Retriever",
+ "method": "build_base_retriever",
+ "name": "base_retriever",
+ "selected": "Retriever",
+ "types": [
+ "Retriever"
+ ],
+ "value": "__UNDEFINED__"
+ },
+ {
+ "cache": true,
+ "display_name": "Search Results",
+ "hidden": false,
+ "method": "search_documents",
+ "name": "search_results",
+ "selected": "Data",
+ "types": [
+ "Data"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "_type": "Component",
+ "api_endpoint": {
+ "advanced": false,
+ "display_name": "API Endpoint",
+ "dynamic": false,
+ "info": "API endpoint URL for the Astra DB service.",
+ "input_types": [],
+ "load_from_db": false,
+ "name": "api_endpoint",
+ "password": true,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ },
+ "batch_size": {
+ "advanced": true,
+ "display_name": "Batch Size",
+ "dynamic": false,
+ "info": "Optional number of data to process in a single batch.",
+ "list": false,
+ "name": "batch_size",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": ""
+ },
+ "bulk_delete_concurrency": {
+ "advanced": true,
+ "display_name": "Bulk Delete Concurrency",
+ "dynamic": false,
+ "info": "Optional concurrency level for bulk delete operations.",
+ "list": false,
+ "name": "bulk_delete_concurrency",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": ""
+ },
+ "bulk_insert_batch_concurrency": {
+ "advanced": true,
+ "display_name": "Bulk Insert Batch Concurrency",
+ "dynamic": false,
+ "info": "Optional concurrency level for bulk insert operations.",
+ "list": false,
+ "name": "bulk_insert_batch_concurrency",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": ""
+ },
+ "bulk_insert_overwrite_concurrency": {
+ "advanced": true,
+ "display_name": "Bulk Insert Overwrite Concurrency",
+ "dynamic": false,
+ "info": "Optional concurrency level for bulk insert operations that overwrite existing data.",
+ "list": false,
+ "name": "bulk_insert_overwrite_concurrency",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": ""
+ },
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "show": true,
+ "title_case": false,
+ "type": "code",
+ "value": "from loguru import logger\n\nfrom langflow.base.vectorstores.model import LCVectorStoreComponent\nfrom langflow.io import (\n BoolInput,\n DropdownInput,\n HandleInput,\n IntInput,\n MultilineInput,\n SecretStrInput,\n StrInput,\n DataInput,\n)\nfrom langflow.schema import Data\n\n\nclass AstraVectorStoreComponent(LCVectorStoreComponent):\n display_name: str = \"Astra DB\"\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 MultilineInput(\n name=\"search_input\",\n display_name=\"Search Input\",\n ),\n DataInput(\n name=\"ingest_data\",\n display_name=\"Ingest Data\",\n is_list=True,\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 HandleInput(\n name=\"embedding\",\n display_name=\"Embedding or Astra Vectorize\",\n input_types=[\"Embeddings\", \"dict\"],\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 DropdownInput(\n name=\"search_type\",\n display_name=\"Search Type\",\n options=[\"Similarity\", \"MMR\"],\n value=\"Similarity\",\n advanced=True,\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 not isinstance(self.embedding, dict):\n embedding_dict = {\"embedding\": self.embedding}\n else:\n from astrapy.info import CollectionVectorServiceOptions\n\n dict_options = self.embedding.get(\"collection_vector_service_options\", {})\n dict_options[\"authentication\"] = {\n k: v for k, v in dict_options.get(\"authentication\", {}).items() if k and v\n }\n dict_options[\"parameters\"] = {k: v for k, v in dict_options.get(\"parameters\", {}).items() if k and v}\n embedding_dict = {\n \"collection_vector_service_options\": CollectionVectorServiceOptions.from_dict(dict_options),\n \"collection_embedding_api_key\": self.embedding.get(\"collection_embedding_api_key\"),\n }\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 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.ingest_data 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,
+ "display_name": "Collection Indexing Policy",
+ "dynamic": false,
+ "info": "Optional dictionary defining the indexing policy for the collection.",
+ "list": false,
+ "load_from_db": false,
+ "name": "collection_indexing_policy",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "collection_name": {
+ "advanced": false,
+ "display_name": "Collection Name",
+ "dynamic": false,
+ "info": "The name of the collection within Astra DB where the vectors will be stored.",
+ "list": false,
+ "load_from_db": false,
+ "name": "collection_name",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "langflow"
+ },
+ "embedding": {
+ "advanced": false,
+ "display_name": "Embedding or Astra Vectorize",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Embeddings",
+ "dict"
+ ],
+ "list": false,
+ "name": "embedding",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "other",
+ "value": ""
+ },
+ "ingest_data": {
+ "advanced": false,
+ "display_name": "Ingest Data",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Data"
+ ],
+ "list": true,
+ "name": "ingest_data",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "other",
+ "value": ""
+ },
+ "metadata_indexing_exclude": {
+ "advanced": true,
+ "display_name": "Metadata Indexing Exclude",
+ "dynamic": false,
+ "info": "Optional list of metadata fields to exclude from the indexing.",
+ "list": false,
+ "load_from_db": false,
+ "name": "metadata_indexing_exclude",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "metadata_indexing_include": {
+ "advanced": true,
+ "display_name": "Metadata Indexing Include",
+ "dynamic": false,
+ "info": "Optional list of metadata fields to include in the indexing.",
+ "list": false,
+ "load_from_db": false,
+ "name": "metadata_indexing_include",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "metric": {
+ "advanced": true,
+ "display_name": "Metric",
+ "dynamic": false,
+ "info": "Optional distance metric for vector comparisons in the vector store.",
+ "name": "metric",
+ "options": [
+ "cosine",
+ "dot_product",
+ "euclidean"
+ ],
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "namespace": {
+ "advanced": true,
+ "display_name": "Namespace",
+ "dynamic": false,
+ "info": "Optional namespace within Astra DB to use for the collection.",
+ "list": false,
+ "load_from_db": false,
+ "name": "namespace",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "number_of_results": {
+ "advanced": true,
+ "display_name": "Number of Results",
+ "dynamic": false,
+ "info": "Number of results to return.",
+ "list": false,
+ "name": "number_of_results",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": 4
+ },
+ "pre_delete_collection": {
+ "advanced": true,
+ "display_name": "Pre Delete Collection",
+ "dynamic": false,
+ "info": "Boolean flag to determine whether to delete the collection before creating a new one.",
+ "list": false,
+ "name": "pre_delete_collection",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "bool",
+ "value": false
+ },
+ "search_input": {
+ "advanced": false,
+ "display_name": "Search Input",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "search_input",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "search_type": {
+ "advanced": true,
+ "display_name": "Search Type",
+ "dynamic": false,
+ "info": "",
+ "name": "search_type",
+ "options": [
+ "Similarity",
+ "MMR"
+ ],
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "Similarity"
+ },
+ "setup_mode": {
+ "advanced": true,
+ "display_name": "Setup Mode",
+ "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"
+ ],
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "Sync"
+ },
+ "token": {
+ "advanced": false,
+ "display_name": "Astra DB Application Token",
+ "dynamic": false,
+ "info": "Authentication token for accessing Astra DB.",
+ "input_types": [],
+ "load_from_db": false,
+ "name": "token",
+ "password": true,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ }
}
- ],
- "viewport": {
- "x": -173.2239134973895,
- "y": 90.45548562382544,
- "zoom": 0.32281188532359306
- }
- },
- "description": "Visit https://docs.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.",
- "name": "Vector Store RAG",
- "last_tested_version": "1.0.0rc1",
- "endpoint_name": null,
- "is_component": false
+ },
+ "type": "AstraDB"
+ },
+ "dragging": false,
+ "height": 753,
+ "id": "AstraDB-7nAHJ",
+ "position": {
+ "x": 1246.0381406498648,
+ "y": 333.25157075413966
+ },
+ "positionAbsolute": {
+ "x": 1246.0381406498648,
+ "y": 333.25157075413966
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ },
+ {
+ "data": {
+ "id": "OpenAIEmbeddings-BKXc6",
+ "node": {
+ "base_classes": [
+ "Embeddings"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {},
+ "description": "Generate embeddings using OpenAI models.",
+ "display_name": "OpenAI Embeddings",
+ "documentation": "",
+ "edited": false,
+ "field_order": [
+ "default_headers",
+ "default_query",
+ "chunk_size",
+ "client",
+ "deployment",
+ "embedding_ctx_length",
+ "max_retries",
+ "model",
+ "model_kwargs",
+ "openai_api_base",
+ "openai_api_key",
+ "openai_api_type",
+ "openai_api_version",
+ "openai_organization",
+ "openai_proxy",
+ "request_timeout",
+ "show_progress_bar",
+ "skip_empty",
+ "tiktoken_model_name",
+ "tiktoken_enable"
+ ],
+ "frozen": false,
+ "icon": "OpenAI",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Embeddings",
+ "hidden": false,
+ "method": "build_embeddings",
+ "name": "embeddings",
+ "selected": "Embeddings",
+ "types": [
+ "Embeddings"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "_type": "Component",
+ "chunk_size": {
+ "advanced": true,
+ "display_name": "Chunk Size",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "chunk_size",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": 1000
+ },
+ "client": {
+ "advanced": true,
+ "display_name": "Client",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "client",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "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, MessageTextInput, SecretStrInput\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"
+ },
+ "default_headers": {
+ "advanced": true,
+ "display_name": "Default Headers",
+ "dynamic": false,
+ "info": "Default headers to use for the API request.",
+ "list": false,
+ "name": "default_headers",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "type": "dict",
+ "value": {}
+ },
+ "default_query": {
+ "advanced": true,
+ "display_name": "Default Query",
+ "dynamic": false,
+ "info": "Default query parameters to use for the API request.",
+ "list": false,
+ "name": "default_query",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "type": "dict",
+ "value": {}
+ },
+ "deployment": {
+ "advanced": true,
+ "display_name": "Deployment",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "deployment",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "embedding_ctx_length": {
+ "advanced": true,
+ "display_name": "Embedding Context Length",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "embedding_ctx_length",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": 1536
+ },
+ "max_retries": {
+ "advanced": true,
+ "display_name": "Max Retries",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "max_retries",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": 3
+ },
+ "model": {
+ "advanced": false,
+ "display_name": "Model",
+ "dynamic": false,
+ "info": "",
+ "name": "model",
+ "options": [
+ "text-embedding-3-small",
+ "text-embedding-3-large",
+ "text-embedding-ada-002"
+ ],
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "text-embedding-3-small"
+ },
+ "model_kwargs": {
+ "advanced": true,
+ "display_name": "Model Kwargs",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "model_kwargs",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "type": "dict",
+ "value": {}
+ },
+ "openai_api_base": {
+ "advanced": true,
+ "display_name": "OpenAI API Base",
+ "dynamic": false,
+ "info": "",
+ "input_types": [],
+ "load_from_db": true,
+ "name": "openai_api_base",
+ "password": true,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ },
+ "openai_api_key": {
+ "advanced": false,
+ "display_name": "OpenAI API Key",
+ "dynamic": false,
+ "info": "",
+ "input_types": [],
+ "load_from_db": false,
+ "name": "openai_api_key",
+ "password": true,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ },
+ "openai_api_type": {
+ "advanced": true,
+ "display_name": "OpenAI API Type",
+ "dynamic": false,
+ "info": "",
+ "input_types": [],
+ "load_from_db": true,
+ "name": "openai_api_type",
+ "password": true,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ },
+ "openai_api_version": {
+ "advanced": true,
+ "display_name": "OpenAI API Version",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "openai_api_version",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "openai_organization": {
+ "advanced": true,
+ "display_name": "OpenAI Organization",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "openai_organization",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "openai_proxy": {
+ "advanced": true,
+ "display_name": "OpenAI Proxy",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "openai_proxy",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "request_timeout": {
+ "advanced": true,
+ "display_name": "Request Timeout",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "request_timeout",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "float",
+ "value": ""
+ },
+ "show_progress_bar": {
+ "advanced": true,
+ "display_name": "Show Progress Bar",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "show_progress_bar",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "bool",
+ "value": false
+ },
+ "skip_empty": {
+ "advanced": true,
+ "display_name": "Skip Empty",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "skip_empty",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "bool",
+ "value": false
+ },
+ "tiktoken_enable": {
+ "advanced": true,
+ "display_name": "TikToken Enable",
+ "dynamic": false,
+ "info": "If False, you must have transformers installed.",
+ "list": false,
+ "name": "tiktoken_enable",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "bool",
+ "value": true
+ },
+ "tiktoken_model_name": {
+ "advanced": true,
+ "display_name": "TikToken Model Name",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "tiktoken_model_name",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ }
+ }
+ },
+ "type": "OpenAIEmbeddings"
+ },
+ "dragging": false,
+ "height": 394,
+ "id": "OpenAIEmbeddings-BKXc6",
+ "position": {
+ "x": 603.2488770584523,
+ "y": 661.6162066128852
+ },
+ "positionAbsolute": {
+ "x": 603.2488770584523,
+ "y": 661.6162066128852
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ },
+ {
+ "data": {
+ "id": "ParseData-d61Q0",
+ "node": {
+ "base_classes": [
+ "Message"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {},
+ "description": "Convert Data into plain text following a specified template.",
+ "display_name": "Parse Data",
+ "documentation": "",
+ "edited": false,
+ "field_order": [
+ "data",
+ "template",
+ "sep"
+ ],
+ "frozen": false,
+ "icon": "braces",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Text",
+ "hidden": false,
+ "method": "parse_data",
+ "name": "text",
+ "selected": "Message",
+ "types": [
+ "Message"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "_type": "Component",
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "show": true,
+ "title_case": false,
+ "type": "code",
+ "value": "from langflow.custom import Component\nfrom langflow.helpers.data import data_to_text\nfrom langflow.io import DataInput, MultilineInput, Output, StrInput\nfrom langflow.schema.message import Message\n\n\nclass ParseDataComponent(Component):\n display_name = \"Parse Data\"\n description = \"Convert Data into plain text following a specified template.\"\n icon = \"braces\"\n\n inputs = [\n DataInput(name=\"data\", display_name=\"Data\", info=\"The data to convert to text.\"),\n MultilineInput(\n name=\"template\",\n display_name=\"Template\",\n info=\"The template to use for formatting the data. It can contain the keys {text}, {data} or any other key in the Data.\",\n value=\"{text}\",\n ),\n StrInput(name=\"sep\", display_name=\"Separator\", advanced=True, value=\"\\n\"),\n ]\n\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"parse_data\"),\n ]\n\n def parse_data(self) -> Message:\n data = self.data if isinstance(self.data, list) else [self.data]\n template = self.template\n\n result_string = data_to_text(template, data, sep=self.sep)\n self.status = result_string\n return Message(text=result_string)\n"
+ },
+ "data": {
+ "advanced": false,
+ "display_name": "Data",
+ "dynamic": false,
+ "info": "The data to convert to text.",
+ "input_types": [
+ "Data"
+ ],
+ "list": false,
+ "name": "data",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "other",
+ "value": ""
+ },
+ "sep": {
+ "advanced": true,
+ "display_name": "Separator",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "name": "sep",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "\n"
+ },
+ "template": {
+ "advanced": false,
+ "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"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "template",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "{text}"
+ }
+ }
+ },
+ "type": "ParseData"
+ },
+ "dragging": false,
+ "height": 384,
+ "id": "ParseData-d61Q0",
+ "position": {
+ "x": 1854.1518317915907,
+ "y": 459.3386924128532
+ },
+ "positionAbsolute": {
+ "x": 1854.1518317915907,
+ "y": 459.3386924128532
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ },
+ {
+ "data": {
+ "description": "Create a prompt template with dynamic variables.",
+ "display_name": "Prompt",
+ "id": "Prompt-vqAlG",
+ "node": {
+ "base_classes": [
+ "Message"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {
+ "template": [
+ "context",
+ "question"
+ ]
+ },
+ "description": "Create a prompt template with dynamic variables.",
+ "display_name": "Prompt",
+ "documentation": "",
+ "edited": false,
+ "error": null,
+ "field_order": [
+ "template"
+ ],
+ "frozen": false,
+ "full_path": null,
+ "icon": "prompts",
+ "is_composition": null,
+ "is_input": null,
+ "is_output": null,
+ "name": "",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Prompt Message",
+ "hidden": false,
+ "method": "build_prompt",
+ "name": "prompt",
+ "selected": "Message",
+ "types": [
+ "Message"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "_type": "Component",
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "show": true,
+ "title_case": false,
+ "type": "code",
+ "value": "from langflow.base.prompts.api_utils import process_prompt_template\nfrom langflow.custom import Component\nfrom langflow.io import Output, PromptInput\nfrom langflow.schema.message import Message\nfrom langflow.template.utils import update_template_values\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\n def post_code_processing(self, new_build_config: dict, current_build_config: dict):\n \"\"\"\n This function is called after the code validation is done.\n \"\"\"\n frontend_node = super().post_code_processing(new_build_config, current_build_config)\n template = frontend_node[\"template\"][\"template\"][\"value\"]\n _ = process_prompt_template(\n template=template,\n name=\"template\",\n custom_fields=frontend_node[\"custom_fields\"],\n frontend_node_template=frontend_node[\"template\"],\n )\n # Now that template is updated, we need to grab any values that were set in the current_build_config\n # and update the frontend_node with those values\n update_template_values(frontend_template=frontend_node, raw_template=current_build_config[\"template\"])\n return frontend_node\n"
+ },
+ "context": {
+ "advanced": false,
+ "display_name": "context",
+ "dynamic": false,
+ "field_type": "str",
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "input_types": [
+ "Message",
+ "Text"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "context",
+ "password": false,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ },
+ "question": {
+ "advanced": false,
+ "display_name": "question",
+ "dynamic": false,
+ "field_type": "str",
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "input_types": [
+ "Message",
+ "Text"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "question",
+ "password": false,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ },
+ "template": {
+ "advanced": false,
+ "display_name": "Template",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "template",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "type": "prompt",
+ "value": "{context}\n\n---\n\nGiven the context above, answer the question as best as possible.\n\nQuestion: {question}\n\nAnswer: "
+ }
+ }
+ },
+ "type": "Prompt"
+ },
+ "dragging": false,
+ "height": 515,
+ "id": "Prompt-vqAlG",
+ "position": {
+ "x": 2486.0988668404975,
+ "y": 496.5120474157301
+ },
+ "positionAbsolute": {
+ "x": 2486.0988668404975,
+ "y": 496.5120474157301
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ },
+ {
+ "data": {
+ "id": "OpenAIModel-ybL3k",
+ "node": {
+ "base_classes": [
+ "LanguageModel",
+ "Message"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {},
+ "description": "Generates text using OpenAI LLMs.",
+ "display_name": "OpenAI",
+ "documentation": "",
+ "edited": false,
+ "field_order": [
+ "input_value",
+ "max_tokens",
+ "model_kwargs",
+ "output_schema",
+ "model_name",
+ "openai_api_base",
+ "openai_api_key",
+ "temperature",
+ "stream",
+ "system_message",
+ "seed"
+ ],
+ "frozen": false,
+ "icon": "OpenAI",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Text",
+ "hidden": false,
+ "method": "text_response",
+ "name": "text_output",
+ "selected": "Message",
+ "types": [
+ "Message"
+ ],
+ "value": "__UNDEFINED__"
+ },
+ {
+ "cache": true,
+ "display_name": "Language Model",
+ "method": "build_model",
+ "name": "model_output",
+ "selected": "LanguageModel",
+ "types": [
+ "LanguageModel"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "_type": "Component",
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "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"
+ },
+ "input_value": {
+ "advanced": false,
+ "display_name": "Input",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "input_value",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "max_tokens": {
+ "advanced": true,
+ "display_name": "Max Tokens",
+ "dynamic": false,
+ "info": "The maximum number of tokens to generate. Set to 0 for unlimited tokens.",
+ "list": false,
+ "name": "max_tokens",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": ""
+ },
+ "model_kwargs": {
+ "advanced": true,
+ "display_name": "Model Kwargs",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "model_kwargs",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "type": "dict",
+ "value": {}
+ },
+ "model_name": {
+ "advanced": false,
+ "display_name": "Model Name",
+ "dynamic": false,
+ "info": "",
+ "name": "model_name",
+ "options": [
+ "gpt-4o",
+ "gpt-4-turbo",
+ "gpt-4-turbo-preview",
+ "gpt-3.5-turbo",
+ "gpt-3.5-turbo-0125"
+ ],
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "gpt-4-turbo"
+ },
+ "openai_api_base": {
+ "advanced": true,
+ "display_name": "OpenAI API Base",
+ "dynamic": false,
+ "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.",
+ "list": false,
+ "load_from_db": false,
+ "name": "openai_api_base",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "openai_api_key": {
+ "advanced": false,
+ "display_name": "OpenAI API Key",
+ "dynamic": false,
+ "info": "The OpenAI API Key to use for the OpenAI model.",
+ "input_types": [],
+ "load_from_db": false,
+ "name": "openai_api_key",
+ "password": true,
+ "placeholder": "",
+ "required": false,
+ "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,
+ "trace_as_input": true,
+ "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,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": 1
+ },
+ "stream": {
+ "advanced": true,
+ "display_name": "Stream",
+ "dynamic": false,
+ "info": "Stream the response from the model. Streaming works only in Chat.",
+ "list": false,
+ "name": "stream",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "bool",
+ "value": false
+ },
+ "system_message": {
+ "advanced": true,
+ "display_name": "System Message",
+ "dynamic": false,
+ "info": "System message to pass to the model.",
+ "list": false,
+ "load_from_db": false,
+ "name": "system_message",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "temperature": {
+ "advanced": false,
+ "display_name": "Temperature",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "temperature",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "float",
+ "value": 0.1
+ }
+ }
+ },
+ "type": "OpenAIModel"
+ },
+ "dragging": false,
+ "height": 621,
+ "id": "OpenAIModel-ybL3k",
+ "position": {
+ "x": 3145.6693008609222,
+ "y": 374.23955005474204
+ },
+ "positionAbsolute": {
+ "x": 3145.6693008609222,
+ "y": 374.23955005474204
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ },
+ {
+ "data": {
+ "id": "ChatOutput-BpzuD",
+ "node": {
+ "base_classes": [
+ "Message"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {},
+ "description": "Display a chat message in the Playground.",
+ "display_name": "Chat Output",
+ "documentation": "",
+ "edited": false,
+ "field_order": [
+ "input_value",
+ "sender",
+ "sender_name",
+ "session_id",
+ "data_template"
+ ],
+ "frozen": false,
+ "icon": "ChatOutput",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Message",
+ "method": "message_response",
+ "name": "message",
+ "selected": "Message",
+ "types": [
+ "Message"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "_type": "Component",
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "show": true,
+ "title_case": false,
+ "type": "code",
+ "value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.io import DropdownInput, MessageTextInput, Output\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(\n name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True\n ),\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"
+ },
+ "data_template": {
+ "advanced": true,
+ "display_name": "Data Template",
+ "dynamic": false,
+ "info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "data_template",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "{text}"
+ },
+ "input_value": {
+ "advanced": false,
+ "display_name": "Text",
+ "dynamic": false,
+ "info": "Message to be passed as output.",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "input_value",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "sender": {
+ "advanced": true,
+ "display_name": "Sender Type",
+ "dynamic": false,
+ "info": "Type of sender.",
+ "name": "sender",
+ "options": [
+ "Machine",
+ "User"
+ ],
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "Machine"
+ },
+ "sender_name": {
+ "advanced": true,
+ "display_name": "Sender Name",
+ "dynamic": false,
+ "info": "Name of the sender.",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "sender_name",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "AI"
+ },
+ "session_id": {
+ "advanced": true,
+ "display_name": "Session ID",
+ "dynamic": false,
+ "info": "Session ID for the message.",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "session_id",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ }
+ }
+ },
+ "type": "ChatOutput"
+ },
+ "dragging": false,
+ "height": 308,
+ "id": "ChatOutput-BpzuD",
+ "position": {
+ "x": 3769.242086248817,
+ "y": 585.3403837062634
+ },
+ "positionAbsolute": {
+ "x": 3769.242086248817,
+ "y": 585.3403837062634
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ },
+ {
+ "data": {
+ "id": "SplitText-52wBo",
+ "node": {
+ "base_classes": [
+ "Data"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {},
+ "description": "Split text into chunks based on specified criteria.",
+ "display_name": "Split Text",
+ "documentation": "",
+ "edited": false,
+ "field_order": [
+ "data_inputs",
+ "chunk_overlap",
+ "chunk_size",
+ "separator"
+ ],
+ "frozen": false,
+ "icon": "scissors-line-dashed",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Chunks",
+ "hidden": false,
+ "method": "split_text",
+ "name": "chunks",
+ "selected": "Data",
+ "types": [
+ "Data"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "_type": "Component",
+ "chunk_overlap": {
+ "advanced": false,
+ "display_name": "Chunk Overlap",
+ "dynamic": false,
+ "info": "Number of characters to overlap between chunks.",
+ "list": false,
+ "name": "chunk_overlap",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": 200
+ },
+ "chunk_size": {
+ "advanced": false,
+ "display_name": "Chunk Size",
+ "dynamic": false,
+ "info": "The maximum number of characters in each chunk.",
+ "list": false,
+ "name": "chunk_size",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": 1000
+ },
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "show": true,
+ "title_case": false,
+ "type": "code",
+ "value": "from typing import List\n\nfrom langchain_text_splitters import CharacterTextSplitter\n\nfrom langflow.custom import Component\nfrom langflow.io import HandleInput, IntInput, MessageTextInput, Output\nfrom langflow.schema import Data\nfrom langflow.utils.util import unescape_string\n\n\nclass SplitTextComponent(Component):\n display_name: str = \"Split Text\"\n description: str = \"Split text into chunks based on specified criteria.\"\n icon = \"scissors-line-dashed\"\n\n inputs = [\n HandleInput(\n name=\"data_inputs\",\n display_name=\"Data Inputs\",\n info=\"The data to split.\",\n input_types=[\"Data\"],\n is_list=True,\n ),\n IntInput(\n name=\"chunk_overlap\",\n display_name=\"Chunk Overlap\",\n info=\"Number of characters to overlap between chunks.\",\n value=200,\n ),\n IntInput(\n name=\"chunk_size\",\n display_name=\"Chunk Size\",\n info=\"The maximum number of characters in each chunk.\",\n value=1000,\n ),\n MessageTextInput(\n name=\"separator\",\n display_name=\"Separator\",\n info=\"The character to split on. Defaults to newline.\",\n value=\"\\n\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Chunks\", name=\"chunks\", method=\"split_text\"),\n ]\n\n def _docs_to_data(self, docs):\n data = []\n for doc in docs:\n data.append(Data(text=doc.page_content, data=doc.metadata))\n return data\n\n def split_text(self) -> List[Data]:\n separator = unescape_string(self.separator)\n\n documents = []\n for _input in self.data_inputs:\n if isinstance(_input, Data):\n documents.append(_input.to_lc_document())\n\n splitter = CharacterTextSplitter(\n chunk_overlap=self.chunk_overlap,\n chunk_size=self.chunk_size,\n separator=separator,\n )\n docs = splitter.split_documents(documents)\n data = self._docs_to_data(docs)\n self.status = data\n return data\n"
+ },
+ "data_inputs": {
+ "advanced": false,
+ "display_name": "Data Inputs",
+ "dynamic": false,
+ "info": "The data to split.",
+ "input_types": [
+ "Data"
+ ],
+ "list": true,
+ "name": "data_inputs",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "other",
+ "value": ""
+ },
+ "separator": {
+ "advanced": false,
+ "display_name": "Separator",
+ "dynamic": false,
+ "info": "The character to split on. Defaults to newline.",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "separator",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "\n"
+ }
+ }
+ },
+ "type": "SplitText"
+ },
+ "dragging": false,
+ "height": 527,
+ "id": "SplitText-52wBo",
+ "position": {
+ "x": 2044.2799160989089,
+ "y": 1185.3130355818519
+ },
+ "positionAbsolute": {
+ "x": 2044.2799160989089,
+ "y": 1185.3130355818519
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ },
+ {
+ "data": {
+ "id": "File-bf6wn",
+ "node": {
+ "base_classes": [
+ "Data"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {},
+ "description": "A generic file loader.",
+ "display_name": "File",
+ "documentation": "",
+ "edited": false,
+ "field_order": [
+ "path",
+ "silent_errors"
+ ],
+ "frozen": false,
+ "icon": "file-text",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Data",
+ "hidden": false,
+ "method": "load_file",
+ "name": "data",
+ "selected": "Data",
+ "types": [
+ "Data"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "_type": "Component",
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "show": true,
+ "title_case": false,
+ "type": "code",
+ "value": "from pathlib import Path\n\nfrom langflow.base.data.utils import TEXT_FILE_TYPES, parse_text_file_to_data\nfrom langflow.custom import Component\nfrom langflow.io import BoolInput, FileInput, Output\nfrom langflow.schema import Data\n\n\nclass FileComponent(Component):\n display_name = \"File\"\n description = \"A generic file loader.\"\n icon = \"file-text\"\n\n inputs = [\n FileInput(\n name=\"path\",\n display_name=\"Path\",\n file_types=TEXT_FILE_TYPES,\n info=f\"Supported file types: {', '.join(TEXT_FILE_TYPES)}\",\n ),\n BoolInput(\n name=\"silent_errors\",\n display_name=\"Silent Errors\",\n advanced=True,\n info=\"If true, errors will not raise an exception.\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"data\", method=\"load_file\"),\n ]\n\n def load_file(self) -> Data:\n if not self.path:\n raise ValueError(\"Please, upload a file to use this component.\")\n resolved_path = self.resolve_path(self.path)\n silent_errors = self.silent_errors\n\n extension = Path(resolved_path).suffix[1:].lower()\n\n if extension == \"doc\":\n raise ValueError(\"doc files are not supported. Please save as .docx\")\n if extension not in TEXT_FILE_TYPES:\n raise ValueError(f\"Unsupported file type: {extension}\")\n\n data = parse_text_file_to_data(resolved_path, silent_errors)\n self.status = data if data else \"No data\"\n return data or Data()\n"
+ },
+ "path": {
+ "advanced": false,
+ "display_name": "Path",
+ "dynamic": false,
+ "fileTypes": [
+ "txt",
+ "md",
+ "mdx",
+ "csv",
+ "json",
+ "yaml",
+ "yml",
+ "xml",
+ "html",
+ "htm",
+ "pdf",
+ "docx",
+ "py",
+ "sh",
+ "sql",
+ "js",
+ "ts",
+ "tsx"
+ ],
+ "file_path": "",
+ "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",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "file",
+ "value": ""
+ },
+ "silent_errors": {
+ "advanced": true,
+ "display_name": "Silent Errors",
+ "dynamic": false,
+ "info": "If true, errors will not raise an exception.",
+ "list": false,
+ "name": "silent_errors",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "bool",
+ "value": false
+ }
+ }
+ },
+ "type": "File"
+ },
+ "dragging": false,
+ "height": 300,
+ "id": "File-bf6wn",
+ "position": {
+ "x": 1418.981990122179,
+ "y": 1539.3825691184466
+ },
+ "positionAbsolute": {
+ "x": 1418.981990122179,
+ "y": 1539.3825691184466
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ },
+ {
+ "data": {
+ "id": "AstraDB-vyd5U",
+ "node": {
+ "base_classes": [
+ "Data",
+ "Retriever"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {},
+ "description": "Implementation of Vector Store using Astra DB with search capabilities",
+ "display_name": "Astra DB",
+ "documentation": "https://python.langchain.com/docs/integrations/vectorstores/astradb",
+ "edited": false,
+ "field_order": [
+ "collection_name",
+ "token",
+ "api_endpoint",
+ "search_input",
+ "ingest_data",
+ "namespace",
+ "metric",
+ "batch_size",
+ "bulk_insert_batch_concurrency",
+ "bulk_insert_overwrite_concurrency",
+ "bulk_delete_concurrency",
+ "setup_mode",
+ "pre_delete_collection",
+ "metadata_indexing_include",
+ "embedding",
+ "metadata_indexing_exclude",
+ "collection_indexing_policy",
+ "search_type",
+ "number_of_results"
+ ],
+ "frozen": false,
+ "icon": "AstraDB",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Retriever",
+ "method": "build_base_retriever",
+ "name": "base_retriever",
+ "selected": "Retriever",
+ "types": [
+ "Retriever"
+ ],
+ "value": "__UNDEFINED__"
+ },
+ {
+ "cache": true,
+ "display_name": "Search Results",
+ "method": "search_documents",
+ "name": "search_results",
+ "selected": "Data",
+ "types": [
+ "Data"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "_type": "Component",
+ "api_endpoint": {
+ "advanced": false,
+ "display_name": "API Endpoint",
+ "dynamic": false,
+ "info": "API endpoint URL for the Astra DB service.",
+ "input_types": [],
+ "load_from_db": false,
+ "name": "api_endpoint",
+ "password": true,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ },
+ "batch_size": {
+ "advanced": true,
+ "display_name": "Batch Size",
+ "dynamic": false,
+ "info": "Optional number of data to process in a single batch.",
+ "list": false,
+ "name": "batch_size",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": ""
+ },
+ "bulk_delete_concurrency": {
+ "advanced": true,
+ "display_name": "Bulk Delete Concurrency",
+ "dynamic": false,
+ "info": "Optional concurrency level for bulk delete operations.",
+ "list": false,
+ "name": "bulk_delete_concurrency",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": ""
+ },
+ "bulk_insert_batch_concurrency": {
+ "advanced": true,
+ "display_name": "Bulk Insert Batch Concurrency",
+ "dynamic": false,
+ "info": "Optional concurrency level for bulk insert operations.",
+ "list": false,
+ "name": "bulk_insert_batch_concurrency",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": ""
+ },
+ "bulk_insert_overwrite_concurrency": {
+ "advanced": true,
+ "display_name": "Bulk Insert Overwrite Concurrency",
+ "dynamic": false,
+ "info": "Optional concurrency level for bulk insert operations that overwrite existing data.",
+ "list": false,
+ "name": "bulk_insert_overwrite_concurrency",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": ""
+ },
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "show": true,
+ "title_case": false,
+ "type": "code",
+ "value": "from loguru import logger\n\nfrom langflow.base.vectorstores.model import LCVectorStoreComponent\nfrom langflow.io import (\n BoolInput,\n DropdownInput,\n HandleInput,\n IntInput,\n MultilineInput,\n SecretStrInput,\n StrInput,\n DataInput,\n)\nfrom langflow.schema import Data\n\n\nclass AstraVectorStoreComponent(LCVectorStoreComponent):\n display_name: str = \"Astra DB\"\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 MultilineInput(\n name=\"search_input\",\n display_name=\"Search Input\",\n ),\n DataInput(\n name=\"ingest_data\",\n display_name=\"Ingest Data\",\n is_list=True,\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 HandleInput(\n name=\"embedding\",\n display_name=\"Embedding or Astra Vectorize\",\n input_types=[\"Embeddings\", \"dict\"],\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 DropdownInput(\n name=\"search_type\",\n display_name=\"Search Type\",\n options=[\"Similarity\", \"MMR\"],\n value=\"Similarity\",\n advanced=True,\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 not isinstance(self.embedding, dict):\n embedding_dict = {\"embedding\": self.embedding}\n else:\n from astrapy.info import CollectionVectorServiceOptions\n\n dict_options = self.embedding.get(\"collection_vector_service_options\", {})\n dict_options[\"authentication\"] = {\n k: v for k, v in dict_options.get(\"authentication\", {}).items() if k and v\n }\n dict_options[\"parameters\"] = {k: v for k, v in dict_options.get(\"parameters\", {}).items() if k and v}\n embedding_dict = {\n \"collection_vector_service_options\": CollectionVectorServiceOptions.from_dict(dict_options),\n \"collection_embedding_api_key\": self.embedding.get(\"collection_embedding_api_key\"),\n }\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 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.ingest_data 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,
+ "display_name": "Collection Indexing Policy",
+ "dynamic": false,
+ "info": "Optional dictionary defining the indexing policy for the collection.",
+ "list": false,
+ "load_from_db": false,
+ "name": "collection_indexing_policy",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "collection_name": {
+ "advanced": false,
+ "display_name": "Collection Name",
+ "dynamic": false,
+ "info": "The name of the collection within Astra DB where the vectors will be stored.",
+ "list": false,
+ "load_from_db": false,
+ "name": "collection_name",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "langflow"
+ },
+ "embedding": {
+ "advanced": false,
+ "display_name": "Embedding or Astra Vectorize",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Embeddings",
+ "dict"
+ ],
+ "list": false,
+ "name": "embedding",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "other",
+ "value": ""
+ },
+ "ingest_data": {
+ "advanced": false,
+ "display_name": "Ingest Data",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Data"
+ ],
+ "list": true,
+ "name": "ingest_data",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "other",
+ "value": ""
+ },
+ "metadata_indexing_exclude": {
+ "advanced": true,
+ "display_name": "Metadata Indexing Exclude",
+ "dynamic": false,
+ "info": "Optional list of metadata fields to exclude from the indexing.",
+ "list": false,
+ "load_from_db": false,
+ "name": "metadata_indexing_exclude",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "metadata_indexing_include": {
+ "advanced": true,
+ "display_name": "Metadata Indexing Include",
+ "dynamic": false,
+ "info": "Optional list of metadata fields to include in the indexing.",
+ "list": false,
+ "load_from_db": false,
+ "name": "metadata_indexing_include",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "metric": {
+ "advanced": true,
+ "display_name": "Metric",
+ "dynamic": false,
+ "info": "Optional distance metric for vector comparisons in the vector store.",
+ "name": "metric",
+ "options": [
+ "cosine",
+ "dot_product",
+ "euclidean"
+ ],
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "namespace": {
+ "advanced": true,
+ "display_name": "Namespace",
+ "dynamic": false,
+ "info": "Optional namespace within Astra DB to use for the collection.",
+ "list": false,
+ "load_from_db": false,
+ "name": "namespace",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "number_of_results": {
+ "advanced": true,
+ "display_name": "Number of Results",
+ "dynamic": false,
+ "info": "Number of results to return.",
+ "list": false,
+ "name": "number_of_results",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": 4
+ },
+ "pre_delete_collection": {
+ "advanced": true,
+ "display_name": "Pre Delete Collection",
+ "dynamic": false,
+ "info": "Boolean flag to determine whether to delete the collection before creating a new one.",
+ "list": false,
+ "name": "pre_delete_collection",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "bool",
+ "value": false
+ },
+ "search_input": {
+ "advanced": false,
+ "display_name": "Search Input",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "search_input",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "search_type": {
+ "advanced": true,
+ "display_name": "Search Type",
+ "dynamic": false,
+ "info": "",
+ "name": "search_type",
+ "options": [
+ "Similarity",
+ "MMR"
+ ],
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "Similarity"
+ },
+ "setup_mode": {
+ "advanced": true,
+ "display_name": "Setup Mode",
+ "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"
+ ],
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "Sync"
+ },
+ "token": {
+ "advanced": false,
+ "display_name": "Astra DB Application Token",
+ "dynamic": false,
+ "info": "Authentication token for accessing Astra DB.",
+ "input_types": [],
+ "load_from_db": false,
+ "name": "token",
+ "password": true,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ }
+ }
+ },
+ "type": "AstraDB"
+ },
+ "dragging": false,
+ "height": 753,
+ "id": "AstraDB-vyd5U",
+ "position": {
+ "x": 2676.4816074350247,
+ "y": 1269.304067004569
+ },
+ "positionAbsolute": {
+ "x": 2676.4816074350247,
+ "y": 1269.304067004569
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ },
+ {
+ "data": {
+ "id": "OpenAIEmbeddings-sRZMc",
+ "node": {
+ "base_classes": [
+ "Embeddings"
+ ],
+ "beta": false,
+ "conditional_paths": [],
+ "custom_fields": {},
+ "description": "Generate embeddings using OpenAI models.",
+ "display_name": "OpenAI Embeddings",
+ "documentation": "",
+ "edited": false,
+ "field_order": [
+ "default_headers",
+ "default_query",
+ "chunk_size",
+ "client",
+ "deployment",
+ "embedding_ctx_length",
+ "max_retries",
+ "model",
+ "model_kwargs",
+ "openai_api_base",
+ "openai_api_key",
+ "openai_api_type",
+ "openai_api_version",
+ "openai_organization",
+ "openai_proxy",
+ "request_timeout",
+ "show_progress_bar",
+ "skip_empty",
+ "tiktoken_model_name",
+ "tiktoken_enable"
+ ],
+ "frozen": false,
+ "icon": "OpenAI",
+ "output_types": [],
+ "outputs": [
+ {
+ "cache": true,
+ "display_name": "Embeddings",
+ "hidden": false,
+ "method": "build_embeddings",
+ "name": "embeddings",
+ "selected": "Embeddings",
+ "types": [
+ "Embeddings"
+ ],
+ "value": "__UNDEFINED__"
+ }
+ ],
+ "pinned": false,
+ "template": {
+ "_type": "Component",
+ "chunk_size": {
+ "advanced": true,
+ "display_name": "Chunk Size",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "chunk_size",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": 1000
+ },
+ "client": {
+ "advanced": true,
+ "display_name": "Client",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "client",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "code": {
+ "advanced": true,
+ "dynamic": true,
+ "fileTypes": [],
+ "file_path": "",
+ "info": "",
+ "list": false,
+ "load_from_db": false,
+ "multiline": true,
+ "name": "code",
+ "password": false,
+ "placeholder": "",
+ "required": true,
+ "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, MessageTextInput, SecretStrInput\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"
+ },
+ "default_headers": {
+ "advanced": true,
+ "display_name": "Default Headers",
+ "dynamic": false,
+ "info": "Default headers to use for the API request.",
+ "list": false,
+ "name": "default_headers",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "type": "dict",
+ "value": {}
+ },
+ "default_query": {
+ "advanced": true,
+ "display_name": "Default Query",
+ "dynamic": false,
+ "info": "Default query parameters to use for the API request.",
+ "list": false,
+ "name": "default_query",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "type": "dict",
+ "value": {}
+ },
+ "deployment": {
+ "advanced": true,
+ "display_name": "Deployment",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "deployment",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "embedding_ctx_length": {
+ "advanced": true,
+ "display_name": "Embedding Context Length",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "embedding_ctx_length",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": 1536
+ },
+ "max_retries": {
+ "advanced": true,
+ "display_name": "Max Retries",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "max_retries",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "int",
+ "value": 3
+ },
+ "model": {
+ "advanced": false,
+ "display_name": "Model",
+ "dynamic": false,
+ "info": "",
+ "name": "model",
+ "options": [
+ "text-embedding-3-small",
+ "text-embedding-3-large",
+ "text-embedding-ada-002"
+ ],
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": "text-embedding-3-small"
+ },
+ "model_kwargs": {
+ "advanced": true,
+ "display_name": "Model Kwargs",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "model_kwargs",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "type": "dict",
+ "value": {}
+ },
+ "openai_api_base": {
+ "advanced": true,
+ "display_name": "OpenAI API Base",
+ "dynamic": false,
+ "info": "",
+ "input_types": [],
+ "load_from_db": true,
+ "name": "openai_api_base",
+ "password": true,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ },
+ "openai_api_key": {
+ "advanced": false,
+ "display_name": "OpenAI API Key",
+ "dynamic": false,
+ "info": "",
+ "input_types": [],
+ "load_from_db": false,
+ "name": "openai_api_key",
+ "password": true,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ },
+ "openai_api_type": {
+ "advanced": true,
+ "display_name": "OpenAI API Type",
+ "dynamic": false,
+ "info": "",
+ "input_types": [],
+ "load_from_db": true,
+ "name": "openai_api_type",
+ "password": true,
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "type": "str",
+ "value": ""
+ },
+ "openai_api_version": {
+ "advanced": true,
+ "display_name": "OpenAI API Version",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "openai_api_version",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "openai_organization": {
+ "advanced": true,
+ "display_name": "OpenAI Organization",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "openai_organization",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "openai_proxy": {
+ "advanced": true,
+ "display_name": "OpenAI Proxy",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "openai_proxy",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ },
+ "request_timeout": {
+ "advanced": true,
+ "display_name": "Request Timeout",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "request_timeout",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "float",
+ "value": ""
+ },
+ "show_progress_bar": {
+ "advanced": true,
+ "display_name": "Show Progress Bar",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "show_progress_bar",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "bool",
+ "value": false
+ },
+ "skip_empty": {
+ "advanced": true,
+ "display_name": "Skip Empty",
+ "dynamic": false,
+ "info": "",
+ "list": false,
+ "name": "skip_empty",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "bool",
+ "value": false
+ },
+ "tiktoken_enable": {
+ "advanced": true,
+ "display_name": "TikToken Enable",
+ "dynamic": false,
+ "info": "If False, you must have transformers installed.",
+ "list": false,
+ "name": "tiktoken_enable",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_metadata": true,
+ "type": "bool",
+ "value": true
+ },
+ "tiktoken_model_name": {
+ "advanced": true,
+ "display_name": "TikToken Model Name",
+ "dynamic": false,
+ "info": "",
+ "input_types": [
+ "Message"
+ ],
+ "list": false,
+ "load_from_db": false,
+ "name": "tiktoken_model_name",
+ "placeholder": "",
+ "required": false,
+ "show": true,
+ "title_case": false,
+ "trace_as_input": true,
+ "trace_as_metadata": true,
+ "type": "str",
+ "value": ""
+ }
+ }
+ },
+ "type": "OpenAIEmbeddings"
+ },
+ "dragging": false,
+ "height": 394,
+ "id": "OpenAIEmbeddings-sRZMc",
+ "position": {
+ "x": 2050.0569098721217,
+ "y": 1823.5240486490072
+ },
+ "positionAbsolute": {
+ "x": 2050.0569098721217,
+ "y": 1823.5240486490072
+ },
+ "selected": false,
+ "type": "genericNode",
+ "width": 384
+ }
+ ],
+ "viewport": {
+ "x": -108.04801490857153,
+ "y": -44.38043074355511,
+ "zoom": 0.32281188532359256
+ }
+ },
+ "description": "Visit https://docs.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": "7804e4a4-8e16-45e0-88ab-ed6248daa0eb",
+ "is_component": false,
+ "last_tested_version": "1.0.0rc1",
+ "name": "Vector Store RAG"
}
\ No newline at end of file
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
deleted file mode 100644
index aa800d76f..000000000
--- a/src/backend/base/langflow/initial_setup/starter_projects/VectorStore-RAG-Flows.json
+++ /dev/null
@@ -1,3278 +0,0 @@
-{
- "data": {
- "edges": [
- {
- "className": "",
- "data": {
- "sourceHandle": {
- "dataType": "Prompt",
- "id": "Prompt-VecUe",
- "name": "prompt",
- "output_types": [
- "Message"
- ]
- },
- "targetHandle": {
- "fieldName": "input_value",
- "id": "OpenAIModel-PKrw7",
- "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-VecUe",
- "sourceHandle": "{œdataTypeœ: œPromptœ, œidœ: œPrompt-VecUeœ, œnameœ: œpromptœ, œoutput_typesœ: [œMessageœ]}",
- "style": {
- "stroke": "#555"
- },
- "target": "OpenAIModel-PKrw7",
- "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œOpenAIModel-PKrw7œ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}"
- },
- {
- "className": "",
- "data": {
- "sourceHandle": {
- "dataType": "OpenAIModel",
- "id": "OpenAIModel-PKrw7",
- "name": "text_output",
- "output_types": [
- "Message"
- ]
- },
- "targetHandle": {
- "fieldName": "input_value",
- "id": "ChatOutput-nUD9B",
- "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-PKrw7",
- "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-PKrw7œ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}",
- "style": {
- "stroke": "#555"
- },
- "target": "ChatOutput-nUD9B",
- "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-nUD9Bœ, œinputTypesœ: [œMessageœ, œstrœ], œtypeœ: œstrœ}"
- },
- {
- "className": "",
- "data": {
- "sourceHandle": {
- "dataType": "File",
- "id": "File-w2zxA",
- "name": "data",
- "output_types": [
- "Data"
- ]
- },
- "targetHandle": {
- "fieldName": "data_input",
- "id": "RecursiveCharacterTextSplitter-CrApG",
- "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-CrApG",
- "name": "data",
- "output_types": [
- "Data"
- ]
- },
- "targetHandle": {
- "fieldName": "vector_store_inputs",
- "id": "AstraDB-rXo8b",
- "inputTypes": [
- "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-PCoh9",
- "name": "embeddings",
- "output_types": [
- "Embeddings"
- ]
- },
- "targetHandle": {
- "fieldName": "embedding",
- "id": "AstraDB-rXo8b",
- "inputTypes": [
- "Embeddings",
- "dict"
- ],
- "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-sn9b4",
- "name": "message",
- "output_types": [
- "Message"
- ]
- },
- "targetHandle": {
- "fieldName": "search_input",
- "id": "AstraDB-61WgV",
- "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-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-HsV7O",
- "name": "embeddings",
- "output_types": [
- "Embeddings"
- ]
- },
- "targetHandle": {
- "fieldName": "embedding",
- "id": "AstraDB-61WgV",
- "inputTypes": [
- "Embeddings",
- "dict"
- ],
- "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-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-61WgV",
- "name": "search_results",
- "output_types": [
- "Data"
- ]
- },
- "targetHandle": {
- "fieldName": "data",
- "id": "ParseData-DXlFW",
- "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-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-DXlFW",
- "name": "text",
- "output_types": [
- "Message"
- ]
- },
- "targetHandle": {
- "fieldName": "input_value",
- "id": "TextOutput-rT1Fj",
- "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-rT1Fj",
- "name": "text",
- "output_types": [
- "Message"
- ]
- },
- "targetHandle": {
- "fieldName": "context",
- "id": "Prompt-VecUe",
- "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-sn9b4",
- "name": "message",
- "output_types": [
- "Message"
- ]
- },
- "targetHandle": {
- "fieldName": "question",
- "id": "Prompt-VecUe",
- "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-sn9b4",
- "node": {
- "base_classes": [
- "Text",
- "str",
- "object",
- "Record"
- ],
- "beta": false,
- "custom_fields": {
- "input_value": null,
- "return_record": null,
- "sender": null,
- "sender_name": null,
- "session_id": null
- },
- "description": "Get chat inputs from the Playground.",
- "display_name": "Chat Input",
- "documentation": "",
- "field_formatters": {},
- "field_order": [],
- "frozen": false,
- "icon": "ChatInput",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Message",
- "method": "message_response",
- "name": "message",
- "selected": "Message",
- "types": [
- "Message"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "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, 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 MessageTextInput(\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 MessageTextInput(\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 MessageTextInput(\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,
- "display_name": "Text",
- "dynamic": false,
- "fileTypes": [],
- "file_path": "",
- "info": "Message to be passed as input.",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "input_value",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "uau"
- },
- "sender": {
- "advanced": true,
- "display_name": "Sender Type",
- "dynamic": false,
- "fileTypes": [],
- "file_path": "",
- "info": "Type of sender.",
- "input_types": [
- "Text"
- ],
- "list": true,
- "load_from_db": false,
- "multiline": false,
- "name": "sender",
- "options": [
- "Machine",
- "User"
- ],
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "User"
- },
- "sender_name": {
- "advanced": true,
- "display_name": "Sender Name",
- "dynamic": false,
- "fileTypes": [],
- "file_path": "",
- "info": "Name of the sender.",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "sender_name",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "User"
- },
- "session_id": {
- "advanced": true,
- "display_name": "Session ID",
- "dynamic": false,
- "fileTypes": [],
- "file_path": "",
- "info": "Session ID for the message.",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "session_id",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- }
- }
- },
- "type": "ChatInput"
- },
- "dragging": false,
- "height": 309,
- "id": "ChatInput-sn9b4",
- "position": {
- "x": 702.4571951501161,
- "y": 119.7726926425525
- },
- "positionAbsolute": {
- "x": 702.4571951501161,
- "y": 119.7726926425525
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "description": "Display a text output in the Playground.",
- "display_name": "Extracted Chunks",
- "edited": false,
- "id": "TextOutput-rT1Fj",
- "node": {
- "base_classes": [
- "Message"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {},
- "description": "Display a text output in the Playground.",
- "display_name": "Extracted Chunks",
- "documentation": "",
- "edited": true,
- "field_order": [
- "input_value"
- ],
- "frozen": false,
- "icon": "type",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Text",
- "hidden": false,
- "method": "text_response",
- "name": "text",
- "selected": "Message",
- "types": [
- "Message"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "show": true,
- "title_case": false,
- "type": "code",
- "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 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"
- },
- "input_value": {
- "advanced": false,
- "display_name": "Text",
- "dynamic": false,
- "info": "Text to be passed as output.",
- "input_types": [
- "Message"
- ],
- "list": false,
- "load_from_db": false,
- "name": "input_value",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- }
- }
- },
- "type": "TextOutput"
- },
- "dragging": false,
- "height": 309,
- "id": "TextOutput-rT1Fj",
- "position": {
- "x": 2439.792450398153,
- "y": 661.149562774499
- },
- "positionAbsolute": {
- "x": 2439.792450398153,
- "y": 661.149562774499
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "id": "OpenAIEmbeddings-HsV7O",
- "node": {
- "base_classes": [
- "Embeddings"
- ],
- "beta": false,
- "custom_fields": {
- "allowed_special": null,
- "chunk_size": null,
- "client": null,
- "default_headers": null,
- "default_query": null,
- "deployment": null,
- "disallowed_special": null,
- "embedding_ctx_length": null,
- "max_retries": null,
- "model": null,
- "model_kwargs": null,
- "openai_api_base": null,
- "openai_api_key": null,
- "openai_api_type": null,
- "openai_api_version": null,
- "openai_organization": null,
- "openai_proxy": null,
- "request_timeout": null,
- "show_progress_bar": null,
- "skip_empty": null,
- "tiktoken_enable": null,
- "tiktoken_model_name": null
- },
- "description": "Generate embeddings using OpenAI models.",
- "display_name": "OpenAI Embeddings",
- "documentation": "",
- "field_formatters": {},
- "field_order": [],
- "frozen": false,
- "icon": "OpenAI",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Embeddings",
- "method": "build_embeddings",
- "name": "embeddings",
- "selected": "Embeddings",
- "types": [
- "Embeddings"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "template": {
- "_type": "Component",
- "chunk_size": {
- "advanced": true,
- "display_name": "Chunk Size",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "chunk_size",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": 1000
- },
- "client": {
- "advanced": true,
- "display_name": "Client",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "client",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "show": true,
- "title_case": false,
- "type": "code",
- "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, MessageTextInput\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 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 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,
- "display_name": "Default Headers",
- "dynamic": false,
- "info": "Default headers to use for the API request.",
- "list": false,
- "name": "default_headers",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "dict",
- "value": {}
- },
- "default_query": {
- "advanced": true,
- "display_name": "Default Query",
- "dynamic": false,
- "info": "Default query parameters to use for the API request.",
- "list": false,
- "name": "default_query",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "dict",
- "value": {}
- },
- "deployment": {
- "advanced": true,
- "display_name": "Deployment",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "deployment",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "embedding_ctx_length": {
- "advanced": true,
- "display_name": "Embedding Context Length",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "embedding_ctx_length",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": 1536
- },
- "max_retries": {
- "advanced": true,
- "display_name": "Max Retries",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "max_retries",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": 3
- },
- "model": {
- "advanced": false,
- "display_name": "Model",
- "dynamic": false,
- "info": "",
- "name": "model",
- "options": [
- "text-embedding-3-small",
- "text-embedding-3-large",
- "text-embedding-ada-002"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "text-embedding-3-small"
- },
- "model_kwargs": {
- "advanced": true,
- "display_name": "Model Kwargs",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "model_kwargs",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "dict",
- "value": {}
- },
- "openai_api_base": {
- "advanced": true,
- "display_name": "OpenAI API Base",
- "dynamic": false,
- "info": "",
- "input_types": [],
- "load_from_db": true,
- "name": "openai_api_base",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_api_key": {
- "advanced": false,
- "display_name": "OpenAI API Key",
- "dynamic": false,
- "info": "",
- "input_types": [],
- "load_from_db": true,
- "name": "openai_api_key",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "OPENAI_API_KEY"
- },
- "openai_api_type": {
- "advanced": true,
- "display_name": "OpenAI API Type",
- "dynamic": false,
- "info": "",
- "input_types": [],
- "load_from_db": true,
- "name": "openai_api_type",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_api_version": {
- "advanced": true,
- "display_name": "OpenAI API Version",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "openai_api_version",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_organization": {
- "advanced": true,
- "display_name": "OpenAI Organization",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "openai_organization",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_proxy": {
- "advanced": true,
- "display_name": "OpenAI Proxy",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "openai_proxy",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "request_timeout": {
- "advanced": true,
- "display_name": "Request Timeout",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "request_timeout",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "float",
- "value": ""
- },
- "show_progress_bar": {
- "advanced": true,
- "display_name": "Show Progress Bar",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "show_progress_bar",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": false
- },
- "skip_empty": {
- "advanced": true,
- "display_name": "Skip Empty",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "skip_empty",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": false
- },
- "tiktoken_enable": {
- "advanced": true,
- "display_name": "TikToken Enable",
- "dynamic": false,
- "info": "If False, you must have transformers installed.",
- "list": false,
- "name": "tiktoken_enable",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": true
- },
- "tiktoken_model_name": {
- "advanced": true,
- "display_name": "TikToken Model Name",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "tiktoken_model_name",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- }
- }
- },
- "type": "OpenAIEmbeddings"
- },
- "dragging": false,
- "height": 395,
- "id": "OpenAIEmbeddings-HsV7O",
- "position": {
- "x": 690.5967478991026,
- "y": 597.6680004855787
- },
- "positionAbsolute": {
- "x": 690.5967478991026,
- "y": 597.6680004855787
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "id": "OpenAIModel-PKrw7",
- "node": {
- "base_classes": [
- "object",
- "Text",
- "str"
- ],
- "beta": false,
- "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": "",
- "field_formatters": {},
- "field_order": [
- "max_tokens",
- "model_kwargs",
- "model_name",
- "openai_api_base",
- "openai_api_key",
- "temperature",
- "input_value",
- "system_message",
- "stream"
- ],
- "frozen": false,
- "icon": "OpenAI",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Text",
- "method": "text_response",
- "name": "text_output",
- "selected": "Message",
- "types": [
- "Message"
- ],
- "value": "__UNDEFINED__"
- },
- {
- "cache": true,
- "display_name": "Language Model",
- "method": "build_model",
- "name": "model_output",
- "selected": "BaseLanguageModel",
- "types": [
- "BaseLanguageModel"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "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 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"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "input_value",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "max_tokens": {
- "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": "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": "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",
- "gpt-4-turbo",
- "gpt-4-turbo-preview",
- "gpt-3.5-turbo",
- "gpt-3.5-turbo-0125"
- ],
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "gpt-3.5-turbo"
- },
- "openai_api_base": {
- "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,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_api_key": {
- "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": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "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": "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,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "temperature": {
- "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": "str",
- "value": 0.1
- }
- }
- },
- "type": "OpenAIModel"
- },
- "dragging": false,
- "height": 639,
- "id": "OpenAIModel-PKrw7",
- "position": {
- "x": 3410.117202077183,
- "y": 431.2038048137648
- },
- "positionAbsolute": {
- "x": 3410.117202077183,
- "y": 431.2038048137648
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "description": "Create a prompt template with dynamic variables.",
- "display_name": "Prompt",
- "id": "Prompt-VecUe",
- "node": {
- "base_classes": [
- "object",
- "str",
- "Text"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {
- "template": [
- "context",
- "question"
- ]
- },
- "description": "Create a prompt template with dynamic variables.",
- "display_name": "Prompt",
- "documentation": "",
- "error": null,
- "field_order": [],
- "frozen": false,
- "full_path": null,
- "icon": "prompts",
- "is_composition": null,
- "is_input": null,
- "is_output": null,
- "name": "",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Prompt Message",
- "method": "build_prompt",
- "name": "prompt",
- "selected": "Message",
- "types": [
- "Message"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "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\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,
- "display_name": "context",
- "dynamic": false,
- "field_type": "str",
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "input_types": [
- "Message",
- "Text"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "context",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "question": {
- "advanced": false,
- "display_name": "question",
- "dynamic": false,
- "field_type": "str",
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "input_types": [
- "Message",
- "Text"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "question",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "template": {
- "advanced": false,
- "display_name": "Template",
- "dynamic": false,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "input_types": [
- "Text"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": false,
- "name": "template",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "prompt",
- "value": "{context}\n\n---\n\nGiven the context above, answer the question as best as possible.\n\nQuestion: {question}\n\nAnswer: "
- }
- }
- },
- "type": "Prompt"
- },
- "dragging": false,
- "height": 525,
- "id": "Prompt-VecUe",
- "position": {
- "x": 2941.2776396951576,
- "y": 446.43037366459487
- },
- "positionAbsolute": {
- "x": 2941.2776396951576,
- "y": 446.43037366459487
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "id": "ChatOutput-nUD9B",
- "node": {
- "base_classes": [
- "object",
- "Text",
- "Record",
- "str"
- ],
- "beta": false,
- "custom_fields": {
- "input_value": null,
- "record_template": null,
- "return_record": null,
- "sender": null,
- "sender_name": null,
- "session_id": null
- },
- "description": "Display a chat message in the Playground.",
- "display_name": "Chat Output",
- "documentation": "",
- "field_formatters": {},
- "field_order": [],
- "frozen": false,
- "icon": "ChatOutput",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Message",
- "method": "message_response",
- "name": "message",
- "selected": "Message",
- "types": [
- "Message"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "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"
- },
- "input_value": {
- "advanced": false,
- "display_name": "Text",
- "dynamic": false,
- "fileTypes": [],
- "file_path": "",
- "info": "Message to be passed as output.",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "input_value",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "sender": {
- "advanced": true,
- "display_name": "Sender Type",
- "dynamic": false,
- "fileTypes": [],
- "file_path": "",
- "info": "Type of sender.",
- "input_types": [
- "Text"
- ],
- "list": true,
- "load_from_db": false,
- "multiline": false,
- "name": "sender",
- "options": [
- "Machine",
- "User"
- ],
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "Machine"
- },
- "sender_name": {
- "advanced": true,
- "display_name": "Sender Name",
- "dynamic": false,
- "fileTypes": [],
- "file_path": "",
- "info": "Name of the sender.",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "sender_name",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "AI"
- },
- "session_id": {
- "advanced": true,
- "display_name": "Session ID",
- "dynamic": false,
- "fileTypes": [],
- "file_path": "",
- "info": "Session ID for the message.",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "session_id",
- "password": false,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- }
- }
- },
- "type": "ChatOutput"
- },
- "dragging": false,
- "height": 309,
- "id": "ChatOutput-nUD9B",
- "position": {
- "x": 3998.201592537035,
- "y": 603.4216529723935
- },
- "positionAbsolute": {
- "x": 3998.201592537035,
- "y": 603.4216529723935
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "id": "File-w2zxA",
- "node": {
- "base_classes": [
- "Record"
- ],
- "beta": false,
- "custom_fields": {
- "path": null,
- "silent_errors": null
- },
- "description": "A generic file loader.",
- "display_name": "File",
- "documentation": "",
- "field_formatters": {},
- "field_order": [],
- "frozen": false,
- "icon": "file-text",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Data",
- "method": "load_file",
- "name": "data",
- "selected": "Data",
- "types": [
- "Data"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "show": true,
- "title_case": false,
- "type": "code",
- "value": "from pathlib import Path\n\nfrom langflow.base.data.utils import TEXT_FILE_TYPES, parse_text_file_to_data\nfrom langflow.custom import Component\nfrom langflow.io import BoolInput, FileInput, Output\nfrom langflow.schema import Data\n\n\nclass FileComponent(Component):\n display_name = \"File\"\n description = \"A generic file loader.\"\n icon = \"file-text\"\n\n inputs = [\n FileInput(\n name=\"path\",\n display_name=\"Path\",\n file_types=TEXT_FILE_TYPES,\n info=f\"Supported file types: {', '.join(TEXT_FILE_TYPES)}\",\n ),\n BoolInput(\n name=\"silent_errors\",\n display_name=\"Silent Errors\",\n advanced=True,\n info=\"If true, errors will not raise an exception.\",\n ),\n ]\n\n outputs = [\n Output(display_name=\"Data\", name=\"data\", method=\"load_file\"),\n ]\n\n def load_file(self) -> Data:\n if not self.path:\n raise ValueError(\"Please, upload a file to use this component.\")\n resolved_path = self.resolve_path(self.path)\n silent_errors = self.silent_errors\n\n extension = Path(resolved_path).suffix[1:].lower()\n\n if extension == \"doc\":\n raise ValueError(\"doc files are not supported. Please save as .docx\")\n if extension not in TEXT_FILE_TYPES:\n raise ValueError(f\"Unsupported file type: {extension}\")\n\n data = parse_text_file_to_data(resolved_path, silent_errors)\n self.status = data if data else \"No data\"\n return data or Data()\n"
- },
- "path": {
- "advanced": false,
- "display_name": "Path",
- "dynamic": false,
- "fileTypes": [
- "txt",
- "md",
- "mdx",
- "csv",
- "json",
- "yaml",
- "yml",
- "xml",
- "html",
- "htm",
- "pdf",
- "docx",
- "py",
- "sh",
- "sql",
- "js",
- "ts",
- "tsx"
- ],
- "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",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "file",
- "value": ""
- },
- "silent_errors": {
- "advanced": true,
- "display_name": "Silent Errors",
- "dynamic": false,
- "info": "If true, errors will not raise an exception.",
- "list": false,
- "name": "silent_errors",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": false
- }
- }
- },
- "type": "File"
- },
- "dragging": false,
- "height": 301,
- "id": "File-w2zxA",
- "position": {
- "x": 2257.233450682836,
- "y": 1747.5389618367233
- },
- "positionAbsolute": {
- "x": 2257.233450682836,
- "y": 1747.5389618367233
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "id": "OpenAIEmbeddings-PCoh9",
- "node": {
- "base_classes": [
- "Embeddings"
- ],
- "beta": false,
- "custom_fields": {
- "allowed_special": null,
- "chunk_size": null,
- "client": null,
- "default_headers": null,
- "default_query": null,
- "deployment": null,
- "disallowed_special": null,
- "embedding_ctx_length": null,
- "max_retries": null,
- "model": null,
- "model_kwargs": null,
- "openai_api_base": null,
- "openai_api_key": null,
- "openai_api_type": null,
- "openai_api_version": null,
- "openai_organization": null,
- "openai_proxy": null,
- "request_timeout": null,
- "show_progress_bar": null,
- "skip_empty": null,
- "tiktoken_enable": null,
- "tiktoken_model_name": null
- },
- "description": "Generate embeddings using OpenAI models.",
- "display_name": "OpenAI Embeddings",
- "documentation": "",
- "field_formatters": {},
- "field_order": [],
- "frozen": false,
- "icon": "OpenAI",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Embeddings",
- "method": "build_embeddings",
- "name": "embeddings",
- "selected": "Embeddings",
- "types": [
- "Embeddings"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "template": {
- "_type": "Component",
- "chunk_size": {
- "advanced": true,
- "display_name": "Chunk Size",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "chunk_size",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": 1000
- },
- "client": {
- "advanced": true,
- "display_name": "Client",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "client",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "show": true,
- "title_case": false,
- "type": "code",
- "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, MessageTextInput\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 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 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,
- "display_name": "Default Headers",
- "dynamic": false,
- "info": "Default headers to use for the API request.",
- "list": false,
- "name": "default_headers",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "dict",
- "value": {}
- },
- "default_query": {
- "advanced": true,
- "display_name": "Default Query",
- "dynamic": false,
- "info": "Default query parameters to use for the API request.",
- "list": false,
- "name": "default_query",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "dict",
- "value": {}
- },
- "deployment": {
- "advanced": true,
- "display_name": "Deployment",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "deployment",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "embedding_ctx_length": {
- "advanced": true,
- "display_name": "Embedding Context Length",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "embedding_ctx_length",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": 1536
- },
- "max_retries": {
- "advanced": true,
- "display_name": "Max Retries",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "max_retries",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": 3
- },
- "model": {
- "advanced": false,
- "display_name": "Model",
- "dynamic": false,
- "info": "",
- "name": "model",
- "options": [
- "text-embedding-3-small",
- "text-embedding-3-large",
- "text-embedding-ada-002"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "text-embedding-3-small"
- },
- "model_kwargs": {
- "advanced": true,
- "display_name": "Model Kwargs",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "model_kwargs",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "dict",
- "value": {}
- },
- "openai_api_base": {
- "advanced": true,
- "display_name": "OpenAI API Base",
- "dynamic": false,
- "info": "",
- "input_types": [],
- "load_from_db": true,
- "name": "openai_api_base",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_api_key": {
- "advanced": false,
- "display_name": "OpenAI API Key",
- "dynamic": false,
- "info": "",
- "input_types": [],
- "load_from_db": true,
- "name": "openai_api_key",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "OPENAI_API_KEY"
- },
- "openai_api_type": {
- "advanced": true,
- "display_name": "OpenAI API Type",
- "dynamic": false,
- "info": "",
- "input_types": [],
- "load_from_db": true,
- "name": "openai_api_type",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_api_version": {
- "advanced": true,
- "display_name": "OpenAI API Version",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "openai_api_version",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_organization": {
- "advanced": true,
- "display_name": "OpenAI Organization",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "openai_organization",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "openai_proxy": {
- "advanced": true,
- "display_name": "OpenAI Proxy",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "openai_proxy",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "request_timeout": {
- "advanced": true,
- "display_name": "Request Timeout",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "request_timeout",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "float",
- "value": ""
- },
- "show_progress_bar": {
- "advanced": true,
- "display_name": "Show Progress Bar",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "show_progress_bar",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": false
- },
- "skip_empty": {
- "advanced": true,
- "display_name": "Skip Empty",
- "dynamic": false,
- "info": "",
- "list": false,
- "name": "skip_empty",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": false
- },
- "tiktoken_enable": {
- "advanced": true,
- "display_name": "TikToken Enable",
- "dynamic": false,
- "info": "If False, you must have transformers installed.",
- "list": false,
- "name": "tiktoken_enable",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": true
- },
- "tiktoken_model_name": {
- "advanced": true,
- "display_name": "TikToken Model Name",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "name": "tiktoken_model_name",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- }
- }
- },
- "type": "OpenAIEmbeddings"
- },
- "dragging": false,
- "height": 395,
- "id": "OpenAIEmbeddings-PCoh9",
- "position": {
- "x": 2781.1922529351923,
- "y": 2206.267872396239
- },
- "positionAbsolute": {
- "x": 2781.1922529351923,
- "y": 2206.267872396239
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "description": "Split text into chunks of a specified length.",
- "display_name": "Recursive Character Text Splitter",
- "id": "RecursiveCharacterTextSplitter-CrApG",
- "node": {
- "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": true,
- "field_order": [
- "chunk_size",
- "chunk_overlap",
- "data_input",
- "separators"
- ],
- "frozen": false,
- "output_types": [
- "Data"
- ],
- "outputs": [
- {
- "cache": true,
- "display_name": "Data",
- "method": "build",
- "name": "data",
- "selected": "Data",
- "types": [
- "Data"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "chunk_overlap": {
- "advanced": false,
- "display_name": "Chunk Overlap",
- "dynamic": false,
- "info": "The amount of overlap between chunks.",
- "list": false,
- "name": "chunk_overlap",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": 200
- },
- "chunk_size": {
- "advanced": false,
- "display_name": "Chunk Size",
- "dynamic": false,
- "info": "The maximum length of each chunk.",
- "list": false,
- "name": "chunk_size",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": 1000
- },
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "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=\"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"
- ],
- "list": false,
- "name": "data_input",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "other",
- "value": ""
- },
- "separators": {
- "advanced": false,
- "display_name": "Separators",
- "dynamic": false,
- "info": "The characters to split on.\nIf left empty defaults to [\"\\n\\n\", \"\\n\", \" \", \"\"].",
- "input_types": [
- "Message",
- "str"
- ],
- "list": true,
- "load_from_db": false,
- "name": "separators",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": [
- "\\n"
- ]
- }
- }
- },
- "type": "RecursiveCharacterTextSplitter"
- },
- "dragging": false,
- "height": 529,
- "id": "RecursiveCharacterTextSplitter-CrApG",
- "position": {
- "x": 2726.46405760335,
- "y": 1530.1666819162674
- },
- "positionAbsolute": {
- "x": 2726.46405760335,
- "y": 1530.1666819162674
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "description": "Implementation of Vector Store using Astra DB with search capabilities",
- "display_name": "Astra DB Vector Store",
- "id": "AstraDB-rXo8b",
- "node": {
- "base_classes": [
- "Data"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {},
- "description": "Implementation of Vector Store using Astra DB with search capabilities",
- "display_name": "Astra DB Vector Store",
- "documentation": "https://python.langchain.com/docs/integrations/vectorstores/astradb",
- "edited": false,
- "field_order": [
- "collection_name",
- "token",
- "api_endpoint",
- "vector_store_inputs",
- "embedding",
- "namespace",
- "metric",
- "batch_size",
- "bulk_insert_batch_concurrency",
- "bulk_insert_overwrite_concurrency",
- "bulk_delete_concurrency",
- "setup_mode",
- "pre_delete_collection",
- "metadata_indexing_include",
- "metadata_indexing_exclude",
- "collection_indexing_policy",
- "add_to_vector_store",
- "search_input",
- "search_type",
- "number_of_results"
- ],
- "frozen": false,
- "icon": "AstraDB",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Retriever",
- "method": "build_base_retriever",
- "name": "base_retriever",
- "selected": "Data",
- "types": [
- "Data"
- ],
- "value": "__UNDEFINED__"
- },
- {
- "cache": true,
- "display_name": "Search Results",
- "method": "search_documents",
- "name": "search_results",
- "selected": "Data",
- "types": [
- "Data"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "add_to_vector_store": {
- "advanced": false,
- "display_name": "Add to Vector Store",
- "dynamic": false,
- "info": "If true, the Vector Store Inputs will be added to the Vector Store.",
- "list": false,
- "name": "add_to_vector_store",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": true
- },
- "api_endpoint": {
- "advanced": false,
- "display_name": "API Endpoint",
- "dynamic": false,
- "info": "API endpoint URL for the Astra DB service.",
- "input_types": [],
- "load_from_db": true,
- "name": "api_endpoint",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "ASTRA_DB_API_ENDPOINT"
- },
- "batch_size": {
- "advanced": true,
- "display_name": "Batch Size",
- "dynamic": false,
- "info": "Optional number of data to process in a single batch.",
- "list": false,
- "name": "batch_size",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": ""
- },
- "bulk_delete_concurrency": {
- "advanced": true,
- "display_name": "Bulk Delete Concurrency",
- "dynamic": false,
- "info": "Optional concurrency level for bulk delete operations.",
- "list": false,
- "name": "bulk_delete_concurrency",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": ""
- },
- "bulk_insert_batch_concurrency": {
- "advanced": true,
- "display_name": "Bulk Insert Batch Concurrency",
- "dynamic": false,
- "info": "Optional concurrency level for bulk insert operations.",
- "list": false,
- "name": "bulk_insert_batch_concurrency",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": ""
- },
- "bulk_insert_overwrite_concurrency": {
- "advanced": true,
- "display_name": "Bulk Insert Overwrite Concurrency",
- "dynamic": false,
- "info": "Optional concurrency level for bulk insert operations that overwrite existing data.",
- "list": false,
- "name": "bulk_insert_overwrite_concurrency",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": ""
- },
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "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, 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,
- "display_name": "Collection Indexing Policy",
- "dynamic": false,
- "info": "Optional dictionary defining the indexing policy for the collection.",
- "list": false,
- "load_from_db": false,
- "name": "collection_indexing_policy",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "collection_name": {
- "advanced": false,
- "display_name": "Collection Name",
- "dynamic": false,
- "info": "The name of the collection within Astra DB where the vectors will be stored.",
- "list": false,
- "load_from_db": false,
- "name": "collection_name",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "langflow"
- },
- "embedding": {
- "advanced": false,
- "display_name": "Embedding",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Embeddings",
- "dict"
- ],
- "list": false,
- "name": "embedding",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "other",
- "value": ""
- },
- "metadata_indexing_exclude": {
- "advanced": true,
- "display_name": "Metadata Indexing Exclude",
- "dynamic": false,
- "info": "Optional list of metadata fields to exclude from the indexing.",
- "list": false,
- "load_from_db": false,
- "name": "metadata_indexing_exclude",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "metadata_indexing_include": {
- "advanced": true,
- "display_name": "Metadata Indexing Include",
- "dynamic": false,
- "info": "Optional list of metadata fields to include in the indexing.",
- "list": false,
- "load_from_db": false,
- "name": "metadata_indexing_include",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "metric": {
- "advanced": true,
- "display_name": "Metric",
- "dynamic": false,
- "info": "Optional distance metric for vector comparisons in the vector store.",
- "name": "metric",
- "options": [
- "cosine",
- "dot_product",
- "euclidean"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "namespace": {
- "advanced": true,
- "display_name": "Namespace",
- "dynamic": false,
- "info": "Optional namespace within Astra DB to use for the collection.",
- "list": false,
- "load_from_db": false,
- "name": "namespace",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "number_of_results": {
- "advanced": true,
- "display_name": "Number of Results",
- "dynamic": false,
- "info": "Number of results to return.",
- "list": false,
- "name": "number_of_results",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": 4
- },
- "pre_delete_collection": {
- "advanced": true,
- "display_name": "Pre Delete Collection",
- "dynamic": false,
- "info": "Boolean flag to determine whether to delete the collection before creating a new one.",
- "list": false,
- "name": "pre_delete_collection",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": false
- },
- "search_input": {
- "advanced": false,
- "display_name": "Search Input",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "search_input",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "search_type": {
- "advanced": false,
- "display_name": "Search Type",
- "dynamic": false,
- "info": "",
- "name": "search_type",
- "options": [
- "Similarity",
- "MMR"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "Similarity"
- },
- "setup_mode": {
- "advanced": true,
- "display_name": "Setup Mode",
- "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"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "Sync"
- },
- "token": {
- "advanced": false,
- "display_name": "Astra DB Application Token",
- "dynamic": false,
- "info": "Authentication token for accessing Astra DB.",
- "input_types": [],
- "load_from_db": true,
- "name": "token",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "ASTRA_DB_APPLICATION_TOKEN"
- },
- "vector_store_inputs": {
- "advanced": false,
- "display_name": "Vector Store Inputs",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Data"
- ],
- "list": true,
- "name": "vector_store_inputs",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "other",
- "value": ""
- }
- }
- },
- "type": "AstraDB"
- },
- "dragging": false,
- "height": 917,
- "id": "AstraDB-rXo8b",
- "position": {
- "x": 3329.7211874614477,
- "y": 1559.774393811144
- },
- "positionAbsolute": {
- "x": 3329.7211874614477,
- "y": 1559.774393811144
- },
- "selected": true,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "description": "Implementation of Vector Store using Astra DB with search capabilities",
- "display_name": "Astra DB Vector Store",
- "id": "AstraDB-61WgV",
- "node": {
- "base_classes": [
- "Data"
- ],
- "beta": false,
- "conditional_paths": [],
- "custom_fields": {},
- "description": "Implementation of Vector Store using Astra DB with search capabilities",
- "display_name": "Astra DB Vector Store",
- "documentation": "https://python.langchain.com/docs/integrations/vectorstores/astradb",
- "edited": false,
- "field_order": [
- "collection_name",
- "token",
- "api_endpoint",
- "vector_store_inputs",
- "embedding",
- "namespace",
- "metric",
- "batch_size",
- "bulk_insert_batch_concurrency",
- "bulk_insert_overwrite_concurrency",
- "bulk_delete_concurrency",
- "setup_mode",
- "pre_delete_collection",
- "metadata_indexing_include",
- "metadata_indexing_exclude",
- "collection_indexing_policy",
- "add_to_vector_store",
- "search_input",
- "search_type",
- "number_of_results"
- ],
- "frozen": false,
- "icon": "AstraDB",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Retriever",
- "method": "build_base_retriever",
- "name": "base_retriever",
- "selected": "Data",
- "types": [
- "Data"
- ],
- "value": "__UNDEFINED__"
- },
- {
- "cache": true,
- "display_name": "Search Results",
- "method": "search_documents",
- "name": "search_results",
- "selected": "Data",
- "types": [
- "Data"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "add_to_vector_store": {
- "advanced": false,
- "display_name": "Add to Vector Store",
- "dynamic": false,
- "info": "If true, the Vector Store Inputs will be added to the Vector Store.",
- "list": false,
- "name": "add_to_vector_store",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": true
- },
- "api_endpoint": {
- "advanced": false,
- "display_name": "API Endpoint",
- "dynamic": false,
- "info": "API endpoint URL for the Astra DB service.",
- "input_types": [],
- "load_from_db": true,
- "name": "api_endpoint",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "ASTRA_DB_API_ENDPOINT"
- },
- "batch_size": {
- "advanced": true,
- "display_name": "Batch Size",
- "dynamic": false,
- "info": "Optional number of data to process in a single batch.",
- "list": false,
- "name": "batch_size",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": ""
- },
- "bulk_delete_concurrency": {
- "advanced": true,
- "display_name": "Bulk Delete Concurrency",
- "dynamic": false,
- "info": "Optional concurrency level for bulk delete operations.",
- "list": false,
- "name": "bulk_delete_concurrency",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": ""
- },
- "bulk_insert_batch_concurrency": {
- "advanced": true,
- "display_name": "Bulk Insert Batch Concurrency",
- "dynamic": false,
- "info": "Optional concurrency level for bulk insert operations.",
- "list": false,
- "name": "bulk_insert_batch_concurrency",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": ""
- },
- "bulk_insert_overwrite_concurrency": {
- "advanced": true,
- "display_name": "Bulk Insert Overwrite Concurrency",
- "dynamic": false,
- "info": "Optional concurrency level for bulk insert operations that overwrite existing data.",
- "list": false,
- "name": "bulk_insert_overwrite_concurrency",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": ""
- },
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "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, 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,
- "display_name": "Collection Indexing Policy",
- "dynamic": false,
- "info": "Optional dictionary defining the indexing policy for the collection.",
- "list": false,
- "load_from_db": false,
- "name": "collection_indexing_policy",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "collection_name": {
- "advanced": false,
- "display_name": "Collection Name",
- "dynamic": false,
- "info": "The name of the collection within Astra DB where the vectors will be stored.",
- "list": false,
- "load_from_db": false,
- "name": "collection_name",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "langflow"
- },
- "embedding": {
- "advanced": false,
- "display_name": "Embedding",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Embeddings",
- "dict"
- ],
- "list": false,
- "name": "embedding",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "other",
- "value": ""
- },
- "metadata_indexing_exclude": {
- "advanced": true,
- "display_name": "Metadata Indexing Exclude",
- "dynamic": false,
- "info": "Optional list of metadata fields to exclude from the indexing.",
- "list": false,
- "load_from_db": false,
- "name": "metadata_indexing_exclude",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "metadata_indexing_include": {
- "advanced": true,
- "display_name": "Metadata Indexing Include",
- "dynamic": false,
- "info": "Optional list of metadata fields to include in the indexing.",
- "list": false,
- "load_from_db": false,
- "name": "metadata_indexing_include",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "metric": {
- "advanced": true,
- "display_name": "Metric",
- "dynamic": false,
- "info": "Optional distance metric for vector comparisons in the vector store.",
- "name": "metric",
- "options": [
- "cosine",
- "dot_product",
- "euclidean"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "namespace": {
- "advanced": true,
- "display_name": "Namespace",
- "dynamic": false,
- "info": "Optional namespace within Astra DB to use for the collection.",
- "list": false,
- "load_from_db": false,
- "name": "namespace",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "number_of_results": {
- "advanced": true,
- "display_name": "Number of Results",
- "dynamic": false,
- "info": "Number of results to return.",
- "list": false,
- "name": "number_of_results",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "int",
- "value": 4
- },
- "pre_delete_collection": {
- "advanced": true,
- "display_name": "Pre Delete Collection",
- "dynamic": false,
- "info": "Boolean flag to determine whether to delete the collection before creating a new one.",
- "list": false,
- "name": "pre_delete_collection",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "bool",
- "value": false
- },
- "search_input": {
- "advanced": false,
- "display_name": "Search Input",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Message",
- "str"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "search_input",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": ""
- },
- "search_type": {
- "advanced": false,
- "display_name": "Search Type",
- "dynamic": false,
- "info": "",
- "name": "search_type",
- "options": [
- "Similarity",
- "MMR"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "Similarity"
- },
- "setup_mode": {
- "advanced": true,
- "display_name": "Setup Mode",
- "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"
- ],
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "Sync"
- },
- "token": {
- "advanced": false,
- "display_name": "Astra DB Application Token",
- "dynamic": false,
- "info": "Authentication token for accessing Astra DB.",
- "input_types": [],
- "load_from_db": true,
- "name": "token",
- "password": true,
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "ASTRA_DB_APPLICATION_TOKEN"
- },
- "vector_store_inputs": {
- "advanced": false,
- "display_name": "Vector Store Inputs",
- "dynamic": false,
- "info": "",
- "input_types": [
- "Data"
- ],
- "list": true,
- "name": "vector_store_inputs",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "other",
- "value": ""
- }
- }
- },
- "type": "AstraDB"
- },
- "dragging": false,
- "height": 917,
- "id": "AstraDB-61WgV",
- "position": {
- "x": 1298.4611042465333,
- "y": 160.7181472642742
- },
- "positionAbsolute": {
- "x": 1298.4611042465333,
- "y": 160.7181472642742
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- },
- {
- "data": {
- "id": "ParseData-DXlFW",
- "node": {
- "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"
- ],
- "frozen": false,
- "icon": "braces",
- "output_types": [],
- "outputs": [
- {
- "cache": true,
- "display_name": "Text",
- "method": "parse_data",
- "name": "text",
- "selected": "Message",
- "types": [
- "Message"
- ],
- "value": "__UNDEFINED__"
- }
- ],
- "pinned": false,
- "template": {
- "_type": "Component",
- "code": {
- "advanced": true,
- "dynamic": true,
- "fileTypes": [],
- "file_path": "",
- "info": "",
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "code",
- "password": false,
- "placeholder": "",
- "required": true,
- "show": true,
- "title_case": false,
- "type": "code",
- "value": "from langflow.custom import Component\nfrom langflow.helpers.data import data_to_text\nfrom langflow.io import DataInput, MultilineInput, Output, StrInput\nfrom langflow.schema.message import Message\n\n\nclass ParseDataComponent(Component):\n display_name = \"Parse Data\"\n description = \"Convert Data into plain text following a specified template.\"\n icon = \"braces\"\n\n inputs = [\n DataInput(name=\"data\", display_name=\"Data\", info=\"The data to convert to text.\"),\n MultilineInput(\n name=\"template\",\n display_name=\"Template\",\n info=\"The template to use for formatting the data. It can contain the keys {text}, {data} or any other key in the Data.\",\n value=\"{text}\",\n ),\n StrInput(name=\"sep\", display_name=\"Separator\", advanced=True, value=\"\\n\"),\n ]\n\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"parse_data\"),\n ]\n\n def parse_data(self) -> Message:\n data = self.data if isinstance(self.data, list) else [self.data]\n template = self.template\n\n result_string = data_to_text(template, data, sep=self.sep)\n self.status = result_string\n return Message(text=result_string)\n"
- },
- "data": {
- "advanced": false,
- "display_name": "Data",
- "dynamic": false,
- "info": "The data to convert to text.",
- "input_types": [
- "Data"
- ],
- "list": false,
- "name": "data",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "other",
- "value": ""
- },
- "sep": {
- "advanced": true,
- "display_name": "Separator",
- "dynamic": false,
- "info": "",
- "list": false,
- "load_from_db": false,
- "name": "sep",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "---"
- },
- "template": {
- "advanced": false,
- "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"
- ],
- "list": false,
- "load_from_db": false,
- "multiline": true,
- "name": "template",
- "placeholder": "",
- "required": false,
- "show": true,
- "title_case": false,
- "type": "str",
- "value": "{text}"
- }
- }
- },
- "type": "ParseData"
- },
- "dragging": false,
- "height": 385,
- "id": "ParseData-DXlFW",
- "position": {
- "x": 1911.4866480237615,
- "y": 566.903831987901
- },
- "positionAbsolute": {
- "x": 1911.4866480237615,
- "y": 566.903831987901
- },
- "selected": false,
- "type": "genericNode",
- "width": 384
- }
- ],
- "viewport": {
- "x": -145.46470046912816,
- "y": 67.11009748758056,
- "zoom": 0.2936356220661912
- }
- },
- "description": "Visit https://docs.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": "None-2",
- "id": "0433f955-c8cc-4d24-a2bf-e8cd0d11f99c",
- "is_component": false,
- "last_tested_version": "1.0.0a59",
- "name": "Vector Store RAG"
-}
\ No newline at end of file