+
+Use these controls to do the following:
+
+- **Code** — Modify the component's Python code and save your changes.
+- **Controls** — Adjust all component parameters.
+- **Freeze Path** — After a component runs, lock its previous output state to prevent it from re-running.
+
+Click
+### Component port data type colors
-On the top right corner of the component, you'll find the a play button to run a component. Once it runs, a status icon appears and you can hover over that to visualize success or error messages. Start interacting with your AI by clicking the **Playground** at the bottom right of the workspace.
+The following table lists the handle colors and their corresponding data types:
+
+| Data Type | Handle Color | Hex Code |
+|-----------|--------------|----------|
+| BaseLanguageModel | Fuchsia | #c026d3 |
+| Data | Red | #dc2626 |
+| Document | Lime | #65a30d |
+| Embeddings | Emerald | #10b981 |
+| LanguageModel | Fuchsia | #c026d3 |
+| Message | Indigo | #4f46e5 |
+| Prompt | Violet | #7c3aed |
+| str | Indigo | #4F46E5 |
+| Text | Indigo | #4F46E5 |
+| unknown | Gray | #9CA3AF |
-## Component menu {#7e3f2f8ff5074b2fb3eee97c9cfaabe7}
+## Freeze Path
+
+After a component runs, **Freeze Path** locks the component's previous output state to prevent it from re-running.
+
+If you’re expecting consistent output from a component and don’t need to re-run it, click **Freeze Path**.
+
+Enabling **Freeze Path** freezes all components downstream of the selected component.
-Each component is unique, but they all have a menu bar at the top that looks something like this.
+## Additional component options
+Click
+To modify a component's name or description, double-click in the **Name** or **Description** fields. Component descriptions accept markdown syntax.
+### Component shortcuts
-It consists of options such as:
+The following keyboard shortcuts are available when a component is selected.
-- **Code** — Modify the component's Python code and save it.
-- **Controls** — Adjust all parameters of a component.
-- **Freeze Path** — After a component runs, lock its previous output state to prevent it from re-running.
-
-Click **All** (the "..." button) to see all options.
-
-
-## Output preview {#ed7b3c34e0774b8a916b0e68821c9a7a}
-
-
-Langflow includes an output visualizer for components that opens a pop-up screen. This allows you to easily inspect and monitor transmissions between components, providing instant feedback on your workflows.
-
-
-## Advanced settings {#b6430d4903df44f0ba4618a558c83d7b}
-
-
-Langflow components can be edited by clicking the **Advanced Settings** button.
-
-
-Hide parameters with the **Show** button to reduce complexity and keep the workspace clean and intuitive for experimentation.
-
-
-You can also double-click a component's name and description to modify those. Component descriptions accept markdown syntax.
-
-
-## Group components {#c3f5ed818e3b40ceb6534dc358e1a5f2}
+| Menu Item | Mac Shortcut | Description |
+|-----------|----------|-------------|
+| Code | ⌘ + C | Opens the code editor for the component. |
+| Advanced | ⌘ + A | Opens advanced settings for the component. |
+| Save | ⌘ + S | Saves the current state of the component to Saved components in the sidebar. |
+| Duplicate | ⌘ + D | Creates a duplicate of the component. |
+| Copy | ⌘ + C | Copies the selected component. Paste it in the workspace with ⌘ + V. |
+| Docs | ⌘ + D | Opens related documentation. |
+| Minimize | ⌘ + Q | Minimizes the current component. |
+| Freeze | ⌘ + F | Freezes the current component state. |
+| Freeze Path | ⌘ + F | Freezes the current component state and all upstream components. |
+| Download | ⌘ + D | Downloads the current component as a JSON file. |
+| Delete | ⌘ + ⌫ | Deletes the component. |
+## Group components in the workspace
Multiple components can be grouped into a single component for reuse. This is useful when combining large flows into single components (like RAG with a vector database, for example) and saving space.
@@ -61,11 +95,12 @@ Multiple components can be grouped into a single component for reuse. This is us
2. Select **Group**.
3. The components merge into a single component.
4. Double-click the name and description to change them.
-5. Save your grouped component to in the sidebar for later use!
+5. Save your grouped component to in the sidebar for later use.
-## Component version {#887fd587589448dc8c27336d1c235b9b}
+## Component version
A component's state is stored in a database, while sidebar components are like starter templates. As soon as you drag a component from the sidebar to the workspace, the two components are no longer in parity.
-
The component will keep the version number it was initialized to the workspace with. Click the **Update Component** icon (exclamation mark) to bring the component up to the `latest` version. This will change the code of the component in place so you can validate that the component was updated by checking its Python code before and after updating it.
+
+
diff --git a/docs/docs/Components/components-processing.md b/docs/docs/Components/components-processing.md
new file mode 100644
index 000000000..efe51b9e8
--- /dev/null
+++ b/docs/docs/Components/components-processing.md
@@ -0,0 +1,117 @@
+---
+title: Processing
+slug: /components-processing
+---
+
+# Processing components in Langflow
+
+Processing components process and transform data within a flow.
+
+## Use a processing component in a flow
+
+The **Split Text** processing component in this flow splits the incoming [data](/guides-data-message) into chunks to be embedded into the vector store component.
+
+The component offers control over chunk size, overlap, and separator, which affect context and granularity in vector store retrieval results.
+
+
+
+## Combine Text
+
+This component concatenates two text sources into a single text chunk using a specified delimiter.
+
+### Inputs
+
+| Name | Display Name | Info |
+|------|--------------|------|
+| first_text | First Text | The first text input to concatenate. |
+| second_text | Second Text | The second text input to concatenate. |
+| delimiter | Delimiter | A string used to separate the two text inputs. Defaults to a space. |
+
+
+## Filter Data
+
+This component filters a Data object based on a list of keys.
+
+### Inputs
+
+| Name | Display Name | Info |
+|------|--------------|------|
+| data | Data | Data object to filter. |
+| filter_criteria | Filter Criteria | List of keys to filter by. |
+
+### Outputs
+
+| Name | Display Name | Info |
+|------|--------------|------|
+| filtered_data | Filtered Data | A new Data object containing only the key-value pairs that match the filter criteria. |
+
+
+## Parse JSON
+
+This component converts and extracts JSON fields using JQ queries.
+
+### Inputs
+
+| Name | Display Name | Info |
+|------|--------------|------|
+| input_value | Input | Data object to filter. Can be a message or data object. |
+| query | JQ Query | JQ Query to filter the data. The input is always a JSON list. |
+
+### Outputs
+
+| Name | Display Name | Info |
+|------|--------------|------|
+| filtered_data | Filtered Data | Filtered data as a list of data objects. |
+
+## Merge Data component
+
+This component combines multiple data sources into a single unified Data object.
+
+The component iterates through the input list of data objects, merging them into a single data object. If the input list is empty, it returns an empty data object. If there's only one input data object, it returns that object unchanged. The merging process uses the addition operator to combine data objects.
+
+### Inputs
+
+| Name | Display Name | Info |
+|------|--------------|------|
+| data | Data | A list of data objects to be merged |
+
+### Outputs
+
+| Name | Display Name | Info |
+|------|--------------|------|
+| merged_data | Merged Data | A single data object containing the combined information from all input data objects |
+
+
+## Parse Data component
+
+The ParseData component converts data objects into plain text using a specified template.
+This component transforms structured data into human-readable text formats, allowing for customizable output through the use of templates.
+
+### Inputs
+
+| Name | Display Name | Info |
+|------|--------------|------|
+| data | Data | The data to convert to text. |
+| template | Template | The template to use for formatting the data. It can contain the keys `{text}`, `{data}` or any other key in the data. |
+| sep | Separator | The separator to use between multiple data items. |
+
+### Outputs
+
+| Name | Display Name | Info |
+|------|--------------|------|
+| text | Text | The resulting formatted text string as a message object. |
+
+
+## Split Text component
+
+This component splits text into chunks of a specified length.
+
+### Inputs
+
+| Name | Display Name | Info |
+|------|--------------|------|
+| texts | Texts | Texts to split. |
+| separators | Separators | Characters to split on. Defaults to a space. |
+| max_chunk_size | Max Chunk Size | The maximum length, in characters, of each chunk. |
+| chunk_overlap | Chunk Overlap | The amount of character overlap between chunks. |
+| recursive | Recursive | Whether to split recursively. |
diff --git a/docs/docs/Components/components-prompts.md b/docs/docs/Components/components-prompts.md
index 55ff7d747..57ecf2d3e 100644
--- a/docs/docs/Components/components-prompts.md
+++ b/docs/docs/Components/components-prompts.md
@@ -4,21 +4,42 @@ sidebar_position: 2
slug: /components-prompts
---
-# Prompts
+# Prompt components in Langflow
-A prompt serves as the input to a language model, comprising multiple components that can be parameterized using prompt templates.
+A prompt is a structured input to a language model that instructs the model how to handle user inputs and variables.
-Prompt templates provide a systematic approach for generating prompts, allowing for reproducible customization through defined input variables.
+Prompt components create prompt templates with custom fields and dynamic variables for providing your model structured, repeatable prompts.
-### Parameters
+Prompts are a combination of natural language and variables created with curly braces.
-#### Inputs
+## Use a prompt component in a flow
+
+An example of modifying a prompt can be found in the [Quickstart](/get-started-quickstart#run-the-chatbot-with-retrieved-context), where a basic chatbot flow is extended to include a full vector RAG pipeline.
+
+
+
+The default prompt in the **Prompt** component is `Answer the user as if you were a GenAI expert, enthusiastic about helping them get started building something fresh.`
+
+This prompt creates a "personality" for your LLM's chat interactions, but it doesn't include variables that you may find useful when templating prompts.
+
+To modify the prompt template, in the **Prompt** component, click the **Template** field. For example, the `{context}` variable gives the LLM model access to embedded vector data to return better answers.
+
+```plain
+Given the context
+{context}
+Answer the question
+{user_question}
+```
+
+When variables are added to a prompt template, new fields are automatically created in the component. These fields can be connected to receive text input from other components to automate prompting, or to output instructions to other components. An example of prompts controlling agents behavior is available in the [sequential tasks agent starter flow](/starter-projects-sequential-agent).
+
+### Inputs
| Name | Display Name | Info |
|----------|--------------|-------------------------------------------------------------------|
| template | Template | Create a prompt template with dynamic variables. |
-#### Outputs
+### Outputs
| Name | Display Name | Info |
|--------|----------------|--------------------------------------------------------|
@@ -30,16 +51,14 @@ This component fetches prompts from the [Langchain Hub](https://docs.smith.langc
When a prompt is loaded, the component generates input fields for custom variables. For example, the default prompt "efriis/my-first-prompt" generates fields for `profession` and `question`.
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Display Name | Info |
|--------------------|---------------------------|------------------------------------------|
| langchain_api_key | Your LangChain API Key | The LangChain API Key to use. |
| langchain_hub_prompt| LangChain Hub Prompt | The LangChain Hub prompt to use. |
-#### Outputs
+### Outputs
| Name | Display Name | Info |
|--------|--------------|-------------------------------------------------------------------|
diff --git a/docs/docs/Components/components-rag.md b/docs/docs/Components/components-rag.md
deleted file mode 100644
index 9af9468fb..000000000
--- a/docs/docs/Components/components-rag.md
+++ /dev/null
@@ -1,36 +0,0 @@
----
-title: RAG
-sidebar_position: 9
-slug: /components-rag
----
-
-RAG (Retrieval-Augmented Generation) components process a user query by retrieving relevant documents and generating a concise summary that addresses the user's question.
-
-## Vectara RAG
-
-This component leverages Vectara's Retrieval Augmented Generation (RAG) capabilities to search and summarize documents based on the provided input. For more information, see the [Vectara documentation](https://docs.vectara.com/docs/).
-
-### Parameters
-
-#### Inputs
-
-| Name | Type | Description |
-|-----------------------|--------------|------------------------------------------------------------|
-| vectara_customer_id | String | Vectara customer ID |
-| vectara_corpus_id | String | Vectara corpus ID |
-| vectara_api_key | SecretString | Vectara API key |
-| search_query | String | The query to receive an answer on |
-| lexical_interpolation | Float | Hybrid search factor (0.005 to 0.1) |
-| filter | String | Metadata filters to narrow the search |
-| reranker | String | Reranker type (mmr, rerank_multilingual_v1, none) |
-| reranker_k | Integer | Number of results to rerank (1 to 100) |
-| diversity_bias | Float | Diversity bias for MMR reranker (0 to 1) |
-| max_results | Integer | Maximum number of search results to summarize (1 to 100) |
-| response_lang | String | Language code for the response (e.g., "eng", "auto") |
-| prompt | String | Prompt name for summarization |
-
-#### Outputs
-
-| Name | Type | Description |
-|--------|---------|-----------------------|
-| answer | Message | Generated RAG response|
\ No newline at end of file
diff --git a/docs/docs/Components/components-tools.md b/docs/docs/Components/components-tools.md
index 0a6d95a51..e0527b1c2 100644
--- a/docs/docs/Components/components-tools.md
+++ b/docs/docs/Components/components-tools.md
@@ -1,6 +1,29 @@
-# Tools
+---
+title: Tools
+slug: /components-tools
+---
-Tool components are used to interact with external services, APIs, and tools. They can be used to search the web, query databases, and perform other tasks.
+# Tool components in Langflow
+
+Tools are typically connected to agent components at the **Tools** port. Agents use LLMs as a reasoning engine to decide which of the connected tool components to use to solve a problem.
+
+Tools in agentic functions are, essentially, functions that the agent can call to perform tasks or access external resources.
+A function is wrapped as a `Tool` object, with a common interface the agent understands.
+Agents become aware of tools through tool registration, where the agent is provided a list of available tools, typically at agent initialization. The `Tool` object's description tells the agent what the tool can do.
+
+The agent then uses a connected LLM to reason through the problem to decide which tool is best for the job.
+
+## Use a tool in a flow
+
+Tools are typically connected to agent components at the **Tools** port.
+
+The [simple agent starter project](/starter-projects-simple-agent) uses URL and Calculator tools connected to an [agent component](#agent-component-agent-component) to answer a user's questions. The OpenAI LLM acts as a brain for the agent to decide which tool to use.
+
+
+
+To make a component into a tool that an agent can use, enable **Tool mode** in the component. Enabling **Tool mode** modifies a component input to accept calls from an agent.
+If the component you want to connect to an agent doesn't have a **Tool mode** option, you can modify the component's inputs to become a tool.
+For an example, see [Make any component a tool](/agents-tool-calling-agent-component#make-any-component-a-tool).
## Bing Search API
diff --git a/docs/docs/Components/components-vector-stores.md b/docs/docs/Components/components-vector-stores.md
index da8c181d1..b45689099 100644
--- a/docs/docs/Components/components-vector-stores.md
+++ b/docs/docs/Components/components-vector-stores.md
@@ -1,11 +1,33 @@
---
-title: Vector Stores
-sidebar_position: 7
+title: Vector stores
slug: /components-vector-stores
---
-# Vector Stores
-Vector databases are used to store and search for vectors. They can be used to store embeddings, search for similar vectors, and perform other vector operations.
+# Vector store components in Langflow
+
+Vector databases store vector data, which backs AI workloads like chatbots and Retrieval Augmented Generation.
+
+Vector database components establish connections to existing vector databases or create in-memory vector stores for storing and retrieving vector data.
+
+Vector database components are distinct from [memory components](/components-memories), which are built specifically for storing and retrieving chat messages from external databases.
+
+## Use a vector store component in a flow
+
+Vector databases can be populated from within Langflow with document ingestion pipelines, like the following
+
+
+
+This example uses the **Astra DB vector store** component. Your vector store component's parameters and authentication may be different, but the document ingestion workflow is the same. A document is loaded from a local machine and chunked. The Astra DB vector store generates embeddings with the connected [model](/components-models) component, and stores them in the connected Astra DB database.
+
+This vector data can then be retrieved for workloads like Retrieval Augmented Generation.
+
+
+
+The user's chat input is embedded and compared to the vectors embedded during document ingestion for a similarity search. The results are output from the vector database component as a [Data](/guides-data-message) object, and parsed into text. This text fills the `{context}` variable in the **Prompt** component, which informs the **Open AI model** component's responses.
+
+Alternatively, connect the vector database component's **Retriever** port to a [retriever tool](components-tools#retriever-tool), and then to an [agent](/components-agents) component. This enables the agent to use your vector database as a tool and make decisions based on the available data.
+
+
## Astra DB Vector Store
@@ -13,9 +35,7 @@ This component implements a Vector Store using Astra DB with search capabilities
For more information, see the [DataStax documentation](https://docs.datastax.com/en/astra-db-serverless/databases/create-database.html).
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Display Name | Info |
|------|--------------|------|
@@ -37,7 +57,7 @@ For more information, see the [DataStax documentation](https://docs.datastax.com
| search_score_threshold | Search Score Threshold | Minimum similarity score threshold for search results |
| search_filter | Search Metadata Filter | Optional dictionary of filters to apply to the search query |
-#### Outputs
+### Outputs
| Name | Display Name | Info |
|------|--------------|------|
@@ -49,9 +69,7 @@ For more information, see the [DataStax documentation](https://docs.datastax.com
This component creates a Cassandra Vector Store with search capabilities.
For more information, see the [Cassandra documentation](https://cassandra.apache.org/doc/latest/cassandra/vector-search/overview.html).
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Type | Description |
|------|------|-------------|
@@ -74,7 +92,7 @@ For more information, see the [Cassandra documentation](https://cassandra.apache
| body_search | String | Document textual search terms |
| enable_body_search | Boolean | Flag to enable body search |
-#### Outputs
+### Outputs
| Name | Type | Description |
|------|------|-------------|
@@ -85,9 +103,7 @@ For more information, see the [Cassandra documentation](https://cassandra.apache
This component implements a Cassandra Graph Vector Store with search capabilities.
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Display Name | Info |
|------|--------------|------|
@@ -107,7 +123,7 @@ This component implements a Cassandra Graph Vector Store with search capabilitie
| search_score_threshold | Search Score Threshold | Minimum similarity score threshold for search results (for "Similarity with score threshold" search type) |
| search_filter | Search Metadata Filter | Optional dictionary of filters to apply to the search query |
-#### Outputs
+### Outputs
| Name | Display Name | Info |
|------|--------------|------|
@@ -119,9 +135,7 @@ This component implements a Cassandra Graph Vector Store with search capabilitie
This component creates a Chroma Vector Store with search capabilities.
For more information, see the [Chroma documentation](https://docs.trychroma.com/).
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Type | Description |
|------------------------------|---------------|--------------------------------------------------|
@@ -140,7 +154,7 @@ For more information, see the [Chroma documentation](https://docs.trychroma.com/
| number_of_results | Integer | Number of results to return from the search. Default: 10. |
| limit | Integer | Limit the number of records to compare when Allow Duplicates is False. |
-#### Outputs
+### Outputs
| Name | Type | Description |
|----------------|---------------|--------------------------------|
@@ -152,9 +166,7 @@ For more information, see the [Chroma documentation](https://docs.trychroma.com/
This component implements a Clickhouse Vector Store with search capabilities.
For more information, see the [CLickhouse Documentation](https://clickhouse.com/docs/en/intro).
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Display Name | Info |
|------|--------------|------|
@@ -175,7 +187,7 @@ For more information, see the [CLickhouse Documentation](https://clickhouse.com/
| number_of_results | Number of Results | Number of results to return in similarity search (default: 4) |
| score_threshold | Score threshold | Threshold for similarity scores |
-#### Outputs
+### Outputs
| Name | Display Name | Info |
|------|--------------|------|
@@ -187,9 +199,7 @@ For more information, see the [CLickhouse Documentation](https://clickhouse.com/
This component creates a Couchbase Vector Store with search capabilities.
For more information, see the [Couchbase documentation](https://docs.couchbase.com/home/index.html).
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Type | Description |
|-------------------------|---------------|--------------------------------------------------|
@@ -205,7 +215,7 @@ For more information, see the [Couchbase documentation](https://docs.couchbase.c
| embedding | Embeddings | The embedding function to use for the vector store. |
| number_of_results | Integer | Number of results to return from the search. Default: 4 (advanced). |
-#### Outputs
+### Outputs
| Name | Type | Description |
|----------------|------------------------|--------------------------------|
@@ -216,9 +226,7 @@ For more information, see the [Couchbase documentation](https://docs.couchbase.c
This component creates a FAISS Vector Store with search capabilities.
For more information, see the [FAISS documentation](https://faiss.ai/index.html).
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Type | Description |
|---------------------------|---------------|--------------------------------------------------|
@@ -230,7 +238,7 @@ For more information, see the [FAISS documentation](https://faiss.ai/index.html)
| embedding | Embeddings | The embedding function to use for the vector store. |
| number_of_results | Integer | Number of results to return from the search. Default: 4 (advanced). |
-#### Outputs
+### Outputs
| Name | Type | Description |
|----------------|------------------------|--------------------------------|
@@ -240,9 +248,7 @@ For more information, see the [FAISS documentation](https://faiss.ai/index.html)
This component implements a Vector Store using HCD.
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Display Name | Info |
|------|--------------|------|
@@ -270,7 +276,7 @@ This component implements a Vector Store using HCD.
| search_score_threshold | Search Score Threshold | Minimum similarity score threshold for search results (default: 0) |
| search_filter | Search Metadata Filter | Optional dictionary of filters to apply to the search query |
-#### Outputs
+### Outputs
| Name | Display Name | Info |
|------|--------------|------|
@@ -282,9 +288,7 @@ This component implements a Vector Store using HCD.
This component creates a Milvus Vector Store with search capabilities.
For more information, see the [Milvus documentation](https://milvus.io/docs).
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Type | Description |
|-------------------------|---------------|--------------------------------------------------|
@@ -305,7 +309,7 @@ For more information, see the [Milvus documentation](https://milvus.io/docs).
| vector_dimensions | Integer | Number of dimensions of the vectors |
| pre_delete_collection | Boolean | Whether to delete the collection before creating a new one |
-#### Outputs
+### Outputs
| Name | Type | Description |
|----------------|------------------------|--------------------------------|
@@ -316,9 +320,7 @@ For more information, see the [Milvus documentation](https://milvus.io/docs).
This component creates a MongoDB Atlas Vector Store with search capabilities.
For more information, see the [MongoDB Atlas documentation](https://www.mongodb.com/docs/atlas/atlas-vector-search/tutorials/vector-search-quick-start/).
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Type | Description |
| ------------------------ | ------------ | ----------------------------------------- |
@@ -331,7 +333,7 @@ For more information, see the [MongoDB Atlas documentation](https://www.mongodb.
| embedding | Embeddings | Embedding function to use |
| number_of_results | Integer | Number of results to return in search |
-#### Outputs
+### Outputs
| Name | Type | Description |
| ------------- | ---------------------- | ----------------------------------------- |
@@ -344,9 +346,7 @@ For more information, see the [MongoDB Atlas documentation](https://www.mongodb.
This component creates a PGVector Vector Store with search capabilities.
For more information, see the [PGVector documentation](https://github.com/pgvector/pgvector).
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Type | Description |
| --------------- | ------------ | ----------------------------------------- |
@@ -357,7 +357,7 @@ For more information, see the [PGVector documentation](https://github.com/pgvect
| embedding | Embeddings | Embedding function to use |
| number_of_results | Integer | Number of results to return in search |
-#### Outputs
+### Outputs
| Name | Type | Description |
| ------------- | ----------- | ----------------------------------------- |
@@ -370,9 +370,7 @@ For more information, see the [PGVector documentation](https://github.com/pgvect
This component creates a Pinecone Vector Store with search capabilities.
For more information, see the [Pinecone documentation](https://docs.pinecone.io/home).
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Type | Description |
| ----------------- | ------------ | ----------------------------------------- |
@@ -386,7 +384,7 @@ For more information, see the [Pinecone documentation](https://docs.pinecone.io/
| embedding | Embeddings | Embedding function to use |
| number_of_results | Integer | Number of results to return in search |
-#### Outputs
+### Outputs
| Name | Type | Description |
| ------------- | ---------- | ----------------------------------------- |
@@ -399,9 +397,7 @@ For more information, see the [Pinecone documentation](https://docs.pinecone.io/
This component creates a Qdrant Vector Store with search capabilities.
For more information, see the [Qdrant documentation](https://qdrant.tech/documentation/).
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Type | Description |
| -------------------- | ------------ | ----------------------------------------- |
@@ -422,7 +418,7 @@ For more information, see the [Qdrant documentation](https://qdrant.tech/documen
| embedding | Embeddings | Embedding function to use |
| number_of_results | Integer | Number of results to return in search |
-#### Outputs
+### Outputs
| Name | Type | Description |
| ------------- | -------- | ----------------------------------------- |
@@ -435,9 +431,7 @@ For more information, see the [Qdrant documentation](https://qdrant.tech/documen
This component creates a Redis Vector Store with search capabilities.
For more information, see the [Redis documentation](https://redis.io/docs/latest/develop/interact/search-and-query/advanced-concepts/vectors/).
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Type | Description |
| ----------------- | ------------ | ----------------------------------------- |
@@ -450,7 +444,7 @@ For more information, see the [Redis documentation](https://redis.io/docs/latest
| number_of_results | Integer | Number of results to return in search |
| embedding | Embeddings | Embedding function to use |
-#### Outputs
+### Outputs
| Name | Type | Description |
| ------------- | -------- | ----------------------------------------- |
@@ -463,9 +457,7 @@ For more information, see the [Redis documentation](https://redis.io/docs/latest
This component creates a connection to a Supabase Vector Store with search capabilities.
For more information, see the [Supabase documentation](https://supabase.com/docs/guides/ai).
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Type | Description |
| ------------------- | ------------ | ----------------------------------------- |
@@ -478,7 +470,7 @@ For more information, see the [Supabase documentation](https://supabase.com/docs
| embedding | Embeddings | Embedding function to use |
| number_of_results | Integer | Number of results to return in search |
-#### Outputs
+### Outputs
| Name | Type | Description |
| ------------- | ------------------ | ----------------------------------------- |
@@ -491,9 +483,7 @@ For more information, see the [Supabase documentation](https://supabase.com/docs
This component creates an Upstash Vector Store with search capabilities.
For more information, see the [Upstash documentation](https://upstash.com/docs/introduction).
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Type | Description |
| --------------- | ------------ | ----------------------------------------- |
@@ -507,7 +497,7 @@ For more information, see the [Upstash documentation](https://upstash.com/docs/i
| embedding | Embeddings | Embedding function to use (optional) |
| number_of_results | Integer | Number of results to return in search |
-#### Outputs
+### Outputs
| Name | Type | Description |
| ------------- | ---------------- | ----------------------------------------- |
@@ -520,9 +510,7 @@ For more information, see the [Upstash documentation](https://upstash.com/docs/i
This component creates a Vectara Vector Store with search capabilities.
For more information, see the [Vectara documentation](https://docs.vectara.com/docs/).
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Type | Description |
| ---------------- | ------------ | ----------------------------------------- |
@@ -534,7 +522,7 @@ For more information, see the [Vectara documentation](https://docs.vectara.com/d
| search_query | String | Query for similarity search |
| number_of_results | Integer | Number of results to return in search |
-#### Outputs
+### Outputs
| Name | Type | Description |
| ------------- | ----------------- | ----------------------------------------- |
@@ -546,9 +534,7 @@ For more information, see the [Vectara documentation](https://docs.vectara.com/d
This component searches a Vectara Vector Store for documents based on the provided input.
For more information, see the [Vectara documentation](https://docs.vectara.com/docs/).
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Type | Description |
|---------------------|--------------|-------------------------------------------|
@@ -559,20 +545,45 @@ For more information, see the [Vectara documentation](https://docs.vectara.com/d
| vectara_api_key | SecretString | Vectara API key |
| files_url | List[String] | Optional URLs for file initialization |
-#### Outputs
+### Outputs
| Name | Type | Description |
|----------------|------------|----------------------------|
| search_results | List[Data] | Results of similarity search |
+## Vectara RAG
+
+This component leverages Vectara's Retrieval Augmented Generation (RAG) capabilities to search and summarize documents based on the provided input. For more information, see the [Vectara documentation](https://docs.vectara.com/docs/).
+
+### Inputs
+
+| Name | Type | Description |
+|-----------------------|--------------|------------------------------------------------------------|
+| vectara_customer_id | String | Vectara customer ID |
+| vectara_corpus_id | String | Vectara corpus ID |
+| vectara_api_key | SecretString | Vectara API key |
+| search_query | String | The query to receive an answer on |
+| lexical_interpolation | Float | Hybrid search factor (0.005 to 0.1) |
+| filter | String | Metadata filters to narrow the search |
+| reranker | String | Reranker type (mmr, rerank_multilingual_v1, none) |
+| reranker_k | Integer | Number of results to rerank (1 to 100) |
+| diversity_bias | Float | Diversity bias for MMR reranker (0 to 1) |
+| max_results | Integer | Maximum number of search results to summarize (1 to 100) |
+| response_lang | String | Language code for the response (for example, "eng", "auto") |
+| prompt | String | Prompt name for summarization |
+
+### Outputs
+
+| Name | Type | Description |
+|--------|---------|-----------------------|
+| answer | Message | Generated RAG response|
+
## Weaviate
This component facilitates a Weaviate Vector Store setup, optimizing text and document indexing and retrieval.
For more information, see the [Weaviate Documentation](https://weaviate.io/developers/weaviate).
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Type | Description |
|---------------|--------------|-------------------------------------------|
@@ -585,7 +596,7 @@ For more information, see the [Weaviate Documentation](https://weaviate.io/devel
| embedding | Embeddings | Model used |
| attributes | List[String] | Optional additional attributes |
-#### Outputs
+### Outputs
| Name | Type | Description |
|--------------|------------------|-------------------------------|
@@ -598,9 +609,7 @@ For more information, see the [Weaviate Documentation](https://weaviate.io/devel
This component searches a Weaviate Vector Store for documents similar to the input.
For more information, see the [Weaviate Documentation](https://weaviate.io/developers/weaviate).
-### Parameters
-
-#### Inputs
+### Inputs
| Name | Type | Description |
|---------------|--------------|-------------------------------------------|
@@ -614,7 +623,7 @@ For more information, see the [Weaviate Documentation](https://weaviate.io/devel
| embedding | Embeddings | Model used |
| attributes | List[String] | Optional additional attributes |
-#### Outputs
+### Outputs
| Name | Type | Description |
|----------------|------------|----------------------------|
diff --git a/docs/docs/Guides/guides-chat-memory.md b/docs/docs/Guides/guides-chat-memory.md
index 03019d890..a62fac9fb 100644
--- a/docs/docs/Guides/guides-chat-memory.md
+++ b/docs/docs/Guides/guides-chat-memory.md
@@ -12,7 +12,7 @@ Langflow allows every chat message to be stored, and a single flow can have mult
In any project, as long as there are [**Chat**](/components-io) being used, memories are always being stored by default. These are messages from a user to the AI or vice-versa.
-To see and access this history of messages, Langflow features a component called **Chat Memory**. It retrieves previous messages and outputs them in structured format or parsed.
+To see and access this history of messages, Langflow features a component called [Message history](/components-helpers#memory-history). It retrieves previous messages and outputs them in structured format or parsed.
To learn the basics about memory in Langflow, check out the [Memory Chatbot](/starter-projects-memory-chatbot) starter example.
@@ -55,13 +55,13 @@ You can also display all messages stored across every flow and session by going
## Store chat memory in an external database
-Chat memory is retrieved from an external database or vector store using the [**Chat Memory**](/components-helpers#chat-memory) component.
+Chat memory is retrieved from an external database or vector store using the [Chat Memory](/components-helpers#chat-memory) component.
Chat memory is stored to an external database or vector store using the [Store Message](/components-helpers#store-message) component.
-The [**Chat Memories**](/Components/components-memories) components provide access to their respective external databases **as memory**. This allows AIs to access external memory for persistence and context retention. For example, connect the **Chat Memory** component to an **AstraDBChatMemory*** component to store the message history in an external Astra DB database.
+The [**Chat Memories**](/components-memories) components provide access to their respective external databases **as memory**. This allows AIs to access external memory for persistence and context retention. For example, connect the **Chat Memory** component to an **AstraDBChatMemory** component to store the message history in an external Astra DB database.
-This example stores and retrieves chat history from an [AstraDBChatMemory](/Components/components-memories#astradbchatmemory-component) component with **Store Message** and **Chat Memory** components.
+This example stores and retrieves chat history from an [AstraDBChatMemory](/components-memories#astradbchatmemory-component) component with **Store Message** and **Chat Memory** components.
### Prerequisites
@@ -76,7 +76,7 @@ This example stores and retrieves chat history from an [AstraDBChatMemory](/Comp
This starter project extends the basic prompting flow to include a chat memory component.
2. Add the [Store Message](/components-helpers#store-message) component to the flow.
The **Store message** component stores messages in the external database.
-3. Add the [AstraDBChatMemory Component](/Components/components-memories#astradbchatmemory-component) to the flow.
+3. Add the [AstraDBChatMemory Component](/components-memories#astradbchatmemory-component) to the flow.
The **Astra DB Chat Memory** component stores and retrieves messages from **Astra DB**.
4. Configure the **AstraDBChatMemory** component with your AstraDB instance details.
1. In the **Astra DB Application Token** field, add your Astra token. (`AstraCS:...`)
diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js
index 00dc90662..a20004279 100644
--- a/docs/docusaurus.config.js
+++ b/docs/docusaurus.config.js
@@ -127,6 +127,10 @@ const config = {
to: "/configuration-global-variables",
from: "/settings-global-variables",
},
+ {
+ to: "/components-vector-stores",
+ from: "/components-rag",
+ },
// add more redirects like this
// {
// to: '/docs/anotherpage',
diff --git a/docs/sidebars.js b/docs/sidebars.js
index 4cfa5dba6..7eca0c594 100644
--- a/docs/sidebars.js
+++ b/docs/sidebars.js
@@ -33,6 +33,26 @@ module.exports = {
"Workspace/workspace-playground",
],
},
+ {
+ type: "category",
+ label: "Components",
+ items: [
+ "Components/components-overview",
+ "Components/components-agents",
+ "Components/components-data",
+ "Components/components-embedding-models",
+ "Components/components-helpers",
+ "Components/components-io",
+ "Components/components-loaders",
+ "Components/components-logic",
+ "Components/components-memories",
+ "Components/components-models",
+ "Components/components-prompts",
+ "Components/components-tools",
+ "Components/components-vector-stores",
+ "Components/components-custom-components",
+ ],
+ },
{
type: "category",
label: "Agents",
@@ -55,27 +75,6 @@ module.exports = {
"Configuration/configuration-security-best-practices"
],
},
- {
- type: "category",
- label: "Components",
- items: [
- "Components/components-overview",
- "Components/components-agents",
- "Components/components-custom-components",
- "Components/components-data",
- "Components/components-embedding-models",
- "Components/components-helpers",
- "Components/components-io",
- "Components/components-loaders",
- "Components/components-logic",
- "Components/components-memories",
- "Components/components-models",
- "Components/components-prompts",
- "Components/components-rag",
- "Components/components-tools",
- "Components/components-vector-stores",
- ],
- },
{
type: "category",
label: "Guides",
diff --git a/docs/static/img/url-component.png b/docs/static/img/url-component.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a26605c58d5e63efbb924f931db32c0899f5bbb
GIT binary patch
literal 419796
zcmeFZcRbr|+Xvjeb?8(@2eqlaSGTS93T@RcYD7vzs;&+ct-YhIQDRgHArc)%?bap<
ztxY7cg9z{G8uxv_&vQRlUH`tHw;v)+e!uf~j^jMW_j?>?h=JY>wtc7fZP~JgP4nhe
z!!29(3T)Z3leT9U_~fpl@hJGS)!XpK1gfTxpRgVP3Ro?8S_yZdFw+f7mW1N(#q-!A9-*n>CVIz zo)v>jels;Ezvvhw-EkI-1C^$p*E5#s@C_|h)d+0hN}?`dLUrYPBwGV}V9d8;}Ok|ZsXOtLYIRa6cz1sFmS7sM~G2F8ceD?`xYKC0f@J=}LAF;;(TXNa3 zg#-Tz>6xOUsVS2rBPbSc8(5B;%te1j?T3s~bv^uz9_qx~z{ivZCe}b@Tr;Mu>>1Ov z&<0^yujxO-CPzBlZ})mVX5MFG=RT9Rdc}?=Fv;`^P(me7%5Ht5{YA9%O>g?(dDN3Q z7@h*T6UW;e%J(cO=`>)@PK$wElCx{~?vwr;zt`?MihOHp uboD9+;jE3E!M9K#QW>h+phhK5nE#KL`Z!)yR|rxn^;?ww66ac<8c=z<-DTU;na zs;m}dBrO+9PRzPl`t*KSSy@ROK1 (Wr$&Xd-MX-cu{F~61c%q9=4)*?XdxUaq%tE8Q8SQ0 a+TAGOgJ46Ya!dRCe6sG)p``x1IZ+w z<8bUQfB=XUL0e _uJS~!ua1%JB2`W}7+c=ol@*Q9Purj! zZ{A+Z)2wLXZ0y}g8t5%+UaJ13R3>ek0n@f@)jxZp?Az2ewdH#K&p7dz^o-pF_{F~I zw*$C}iq9imYisoN{s}Kv6l= M490jOS|4uE*M*F|vACeekencZ{ufJogYY$?9jd{P0veo WZaib zvaCC4+`V$9_QAkpCz|Z2I>%9lVEQt?T{*Nt_=qi~9X)z
n5U(|_qWH8f78e&6jZ6 KVYV0_q6 z*VXceUIOX&-pEtdZKO|4d9krQBM%Q};HE$85{gRtN>)K7tnJz@wPyQQxZ$Y%5DSYO z=Vdmw@PeYEdXS|IsEQmw@=6KYvRQTFM@M}D0ni2UpST7R{Ljk790KH$zkkHCzu8!e z+PZc7>_(PDsoL=M>$QkpPHQ)}aOY(=H!i~Jg}~&oB|2;8>x1Tjk3cpz>GhQxh*WXU zLL{r^r_yZ;!esx?FS_p3J{ekrusBAfPyeXWD8(k&)r0Ou>F!>l1ffY%O!`|7z_Pk(K4k pSWuV0@NOD3$V=tbc;Dm4`M4B@Dmw%+eC3r(MV(KTjlt1L&eIhNI< z+R2cQ9uua?$jUyWR|3rIMjGf?K`FE5WcCplCxS#}NWg+4@gVIN>Jeb=$*@K?d9F6q zNcCp%GyCG=y1w;`iZn46Pp%XzH|j5DYR@VIo(+c16 *YAOxerpw1qHk`n+HKqlFErb9Kgg?Y3|e1w7%%oVePq+#l@Cy{mu1>`|8Tk zrY7ReoTy>k85MwfpUKRu`Dvb=k+H;UTQ05NUKG)XLxYn_7HO0#j;yxIxsU<-`}dVg zU{+R2EMMD`1SWrAXPb)M?c0}16joMtU4}DA-f|-3WK^{h6qJR?-e8BxtzdDByfzpg zeP?IqIVk;oB<%F zdbavv$D|#a4X|e;j0LX!P!A_3-ua?bZ@pAN)_L6WWIPa<`@FyP&_)_$HP*_|aBztB zq@bjv`oq#;SjVUV$%Mzs-MzqKIVtlpmE6^JaG)PD76}qAO-uJBalz!=t?3jL0$kPI z)8i!Hl9vP4G(X?%H6A_03=>x!XeHgcGs!bpPzXPMJQR0QsZskVAD}+D6xs%fI5Yx) z%RI!dU!9!1eSEWy!lH}9ued)ju;b)JOqE3d^v=o0$Y^pvrL_(P2&l- NM)tM3sn{0y69h%R5+LM*Gr`e2N28u>1RBVIQo+g_Mn=)_)tS04bh>{x z&Y|BdL=}U<1Xi_8g0q28X$^s;Gw|j?Tps- z)mEvIlm>ASitn#C_7AW1l_o| #%H2@c1QOPP61}!3Z`dMQx&RA`1**iqvat@Bm}JWuk$WqHsQyvmvA%TG zA02*qAQ!LwdOO#T=?86oZ??{bgv@+%zVElCu;nP1daguzusq)$L5n&UXFyc#Hc(73 z{BmXY%gO3uOOWf`as_Ic2f+#D;Q$kbV4cf$OTWj#7U%rlI9xyM8ZiJ+h^iWn(j7?X z?U>kJzI_6Mw2xcay277z=I2AkM0T@vIOj*8>+1!p$ougKjK`UimfxO9CM8=TzNjdm z)%UuLjAZg7UKSnWF&u!ioz5Y+zBf<35tj;sFHSLbOMVGl>DxNshxsH;6Ot$)5YF)m z<*ellRg`pyDM(C|=nWRE#%9=az%b-a&rB?uUO8AWlKv!0+IT%0YsE!i#CgK1B5^9J zx3aRcyZMFkV5dbeFK}?iMUeDt>p37v%l+cMzE*n}hG9ixUFDp _$LgY%fS_@G4mc^|6QQ*9n>>wsKD9LXPTvDQA@hql?@~F33Zi0T z&N>3l+c}kYkM6^{)dz-`J&Pc3F5kFeCeLvm!1w2F)p>mz{QAnFdvM4-!h>F5QQS~R zW*-=RuN|uPApQFUvk=7=`0+Mo{eY>b8MP7*2RZ7BDo#Zk6VN40%k9_K)qT2Ed)Z2~ zuUl|YM@Q%BL-bZ+56Ar(4r%jupIk(>42%pvfO4cRJO-mu4Z%ReLR~<8N(82(F1-}B z!XdI-+hlB!Y6OQ#A2>nz?JxxkpHAPXMe@FK*TK@$j3qpYEq;M>@fg2)wnh;__epV0 zJXVNB??@FxHlf`L1GyWqxQ$Ygn@%tR&Cj#H{l-h<-sfq?zkB?*V_?SQxM2JNsYX0R zp&=}hd!ymw-Z3I~z@*f@0Skm@=j-SyQ|>Y%8Sw;f Sm@~Qgz2%Y<2=i9azy8)cs eofGnu;o)pv=r+Of9@X %3soznRLcUAzu8d@NfA}~Oo R?Z2f|!7SG!^@;wj;tSJgKON@Xes;%sZpy+{)9Z z%=q tQEJi3k&-3orV<0yY{x+b_08~ z$j(cA0y*s;KMY+SLDO7QJDm$>^C^U;{rkf%XXAIdi0sb6tmV>$jCQ{Vsr6Z@zCyN+ zQGgy*itkXtN$ocw?5aHui>mODGsymc>GvKgfEZ>qM2>2m(7XVaKg+yu>s#|f3*~un zQBfH`GpOlUJ1$sbgSK^{M^olWSYy_ZyM~ab*#H9C$M4x)N^7*9F=eLSTlXNA=uE;j z#+Po9FgoA9F|<=l0IN7Kh7Q1h^0%nP0*F^cLzh3g*|QSwYQ>0JboVr0=cV=W@w&3c z>d31B#KqFZIln+857^GbA}5=>dMME|$G3+zgK9dsQvPB=gv2~q%~xl8rwhHW3xSb| ztRp{u&n8laXsb=*g1HS57X5PRD=ij0uJsmm{-*_AxE<7Hl1Rhm`XO4*9r$v<)3*W| z_0G)()8sFzwA`l32Th<^`^Qfw6G4K&{o~t>32tg%NMN_5jYQ2CaYcd}jxuZZxi>G< zk27&1ji4m4C@rdZ9!Cg^(`JXwU1sSInd^I+A#?yE$LIVGpKo`lkx#spL0zIVKkBFj z16!Kfy^?*4;WKzAj}Dl8z9HdV0yGPT_jraa-!O%VG9{Tr*_?KZI0d%pyV(U+ne|<` zoWi+}sx-?2%G3vdFpD>>&6Oalm^2)4gCS) )_;w3wXx87X01=$kmAkERqE@6-SpP&Ca?MX|e{I+Ft&SV{7IB1?&cYQ7>}U%C zw$5TOheCp0j&~4=6mW3XRP+O8fFvozv3Y5AOpS+dXnp$7`j4Ydj3+#u-5}bMi`fAD zQV!NMxgHyn{t_)_0h?=bnJ|i!1)i z+K)^k$|5h=NoFc J4|7Mn#zr5TL}v zAOAWv$ISyF`C?b@2RTraTR6ZqSGQskhyuAU`~hlpMK3d6S2&VK4c4Fb;p%(GL9_SL zEh!!Y{hdWN`p*?6hdyu%bQh&HbgPzqXj^3G0tF5z4YxI)A=;7;38VYX@Nz-l83hH9 zivt+#9Y-*7`O$L`Wia6YaxvYmy(n(Q9GYj(1&dZK9btzFUj`k6>yPkK$-K1O=GPg= z8?V*%^qzsWa}y2L3syLfG4g@oz;f2fN)Gg!5U;BNlVX^30%9uJK4V&c`476sH8UfF z9~CewGoW8QBVvEPW8xw|e)O4g^KJ}lkw)gM-7YQM7SiW(`o=fD4glOxDSn-TvALz+ z!3klPQ_BIj!jgFHMjVb&1?f2eThY__kvyOy#+Fl^0qnx;aRt{X`J^PvF9cgwj$;3< z^~Vmv7;d8c6W!ureFz9OquPS3vpBuN+>XcyL6^5ub_6Z?-Tkt7mF@M?Y9_(tf@X+9 zT)jeZ_c`ipdmh~DX7OqX#inm0+m> {Wc_ojPo7#J$6@>7=P zE6K?Hpb0F>m!ysR<8en}*?RKdxQ03m2QGTbC8|Jk2AKEyBP-(FN%r@@INZNLvuhdM zkr|y@e{-*vwnT6gd-RFq%!zw<_qYCDxL}^PElD8 LSY7IJ=SqAA$O_GAKo_%x}(DPF8l(#ic7LZlJxL zQhL9a=1U`ufn0o2t_e8Np{%sDJl>{n^8caiE2E+c*S1wq2?<3|8VL~)5Rq;X=}<~q zI){bg;tTCAt8vIk>tu zvwAl)OtBU)7C1lg>cGRthn;L&%1wHF{o2xa*ozNzajgOGl*Ne>9gwD{scGEJJjelp zqO!ez{~RFfk5pY|NhaMw*gq|;1h<%(d$rBYf0&=6Q9QMJHy6f}6BCbj05@9T%A3nb zb^r<7-sTL00Sy19c_yT_LspjInq3W`M(dgbjoMA-5Q5 ?8>D^`PkiNc3KwIu4JqvWBkV-gq;NcoR=d&po zXHG4ASJ%@O5(qm#zeOIAHSA4G_>}x)GvpI?s1|Q}Bovza6bwe%HD4O@- 1I=n4_fz_sLH-mmhRHLTVVQ zz&p!GPXxf7FM)dK>ZVR#C@LuU1A6u$(VKKFFNI=_X=bT%T_6{n14wE$)^lW|hp_sm z;F>ysQVzSk6l_LRgZBJux8blER9sAqKeg A04k{Km{hC0vr}(Wwp#~fNq~= zNs|B-81jBjStM`#Eq5;9403$*2!P=Y u<1_ ^jz+kNd%s_Cu){8Et3X5hQuuhJ6yg@9^*>-{G|!?T_b^5+2;XRHo8TN1F9t#JV6UiGjSmAuTsWK?4HugPT7}lEed;Nr-}G(v z%54inA$<~*&O&n@8P`B$e)o0hJLD1-;pKh)z-sIVKL>}oMgzPOwNO+Gx736_u)?QO znWe-=2stf$VcX&jwyVj>p?jnY7*bs1VhVLo;LV$f7}Wvj_tLU_GrQJ7Gs_rY>jJRW zDJC>hP(ngNxpwLptJ1TS4l c`6CzaejcRGAp{#p;g z)8UCX1>BQArbOQ%0i^{FnxAxo(@eywZU+t)L|SNlVFTtXITTi`f2X6u9nhvoYIz6< zm^-{OZ@2$6JFaL20kj|!D$6DO+tov=v#LqrzLRP}OGv=SCL_g(zFi0KjKEXMB?qJ3 z1z>bmH&CdvSCJ`v9t7HToV)%ITvC#{S!)R?%2ObBS^$W$QT2HqxAfUNi{2R0Ns^4q zukbb5>?hr*!(hI#9q5Y*%9+G1#2*elG64Ncd4AK?X@w?@tQ8Oh7~YiIOdJNKA`{A# zDqcYfQsvr!nCSi6`kBUofi1&I>pf;9G=~JNiXe8VZkC^c0eS!g+IzndAVC)zvW^Q? zqo0CV(No7l0M2MvAEszGdHO~1Kn+m`cuibW^+~|By3S;JK>!8}66re}?;0896hMY* zkWgR5j}4BXM9lX9mBTYYcvCe>23Mlanh*)8E%fkka6lLRV}uu}CbL|{8~@E$EWpm! z%bTnL8&W5QLMn_kfSM&yOe|>71ez)#VX9)b_B=&e8=$ms&Vz>XCyFFAO$TVAlJyM) zf`TSAOh-wG&nwBUrn%~?wIem6aIO-#7#90K_Hk-gr2^WMR#JTa(Ts|Uk>euG6pf5Z zCZ~@HP~Vej`I(8t-=b^fR9~#oBO@dGDU%6fn&1I?!@3QK`cAV~Vu$Fe*3j1~=iOgQ zxfCj>*QOB>4)u0CLtQ!^sF5GAUzUl#X@0 NX0C6GLIE1weW20o+E@z@jPP zk6q90Q)Imp@a GvFc9G3I_~CmS20YWZ)qizKVmV7=t=3bM-r%c8{A*>}0IbU4>~_1*XAV#N zc_d?Brd_qmWf?hh2>@o>gMe8@x$elkya-ZrXe7mXR<&r{beKaIU|m;^6SE}&ViL1z zdOPqgF#7_&;WKXh6BA%Pv^zjY=MHVM0l4CV?V>D@7-gMZINvA$PH9hgSXu1-3Q19z z4e_wrLR5=PM4cpZ0R~pLK2>R+BVDmofKd+jyVOXN+3L&GPbB}9k7qNcU+*qOW~aRf zIkk4PL~4fuAQIA1y^RZCq4QVf{`%Eh)h1YyIcPhaz-sXUfGWEHBay{gk *l#Pc)on;AesF6mtzOfI9TI@azoDELb0V5E@p;wqG!d{91~d(WuT}Dj zub}F4)CZ={p#g&|=tE*~K%1N80)5CK(297@U%G4I@%i(G9r~YUC%Zw`elh4roRo zP6xX#^+g~uKoGLCi|n9Af55Kv(+q`_Tm_MU<_PmK%)9rDQvDyu#!xybi|P%R*;hT3 z;jEK>8Gp#3;VkQ`SI67bH9rSHGj{46lAJCZUxsFMTYrIP_I@?m00SAHn2<{#Z-FeoMJYWsr8`(0H6+wpjH^n+GTO%DIlg@di^>G8hJX 4%ogrUdFNS6(SBCsZ1lwQyMz!rfnqIpO2A<~e^mq_Np zElC7wanUHYp`IV!XVw+p_Ae5!k*;W^fhD4p;=xJjHZ))AiXwp>QWsrjKolK|`zGyQ zg6{vT==!%BWE!X=2PPK4|15LVnpyxSUf#uTPVb#(dQbB-^BOy&!~Rtd{^!cv #LP{n${lezwbv%~+Cu`Ph1Cj+Mi&inuQ(f@u%gT7^$H-QGp{<`k{`ZC-` z?aBTBL@*cKx<^NsW$kV-8}sxTY $Yupp#g; z7`5LDewQ*cC*8Jwx))_t_BlD9)B+~dC_gopCks#2WeyI@89ldjy$ l>x&=vo)@RXC9L$DW=lu08-(2#YFkP zhr(TD?;!+ARO;ev>)DMWc$}P#hZU01N`>;hxmmtB|A{Ufn%xw3*&e_Z`i=&0#~af< z!8?Vopgf)%lutfyH1ZG=ZcZtce}xD`u2`U`c7Hq-Q3 h9?$=z!wvud%^JKM= zzxq<5RzBJdx8dD_t{NMwsm02 >O);)m2RYL{16k+NHQtR(nl zp^<*Z_dTcV6Pmk!b?p1J#PEbfj}A3o#8+M)tlxjTU*y#*ndU`gThtlSwmMs>5LKx_ zP0yOhgZl*qzTns`O!%zPL1WW!mVL>;%~^Mn%YrL-CETbGUN%gq(PSU8Gt-#YvRh^_ zIMkeUvYz6!^{Iv>BnC2eM6|VW{f9_q*_MI-qk%!iEVq5|<=(c&$eUMEY|Sg~b=SXS z$LW*=e#}3o1B)DI%Z)l+7o zS*k6VSOuJl7~ffK5T0Q2d>G_&2y`@q%aralzO_WM+i&Y+-CrvA`7G5&Q<( vCgmh!t4X9_G`F-utV=7SlUfeA?%YVOL@WLl*@jqkzDI z65&a(hmlcBMKhehMPWLkOtwCMGCP&gnKRF;YG3Zv(Hmk4kF!ljVwwT=H&16f<+Y3) z`qhZ}t71=gHMM^G)DI3SORBvc957m&)nj s?v0*@liuqTm#wnfS%~}E-LmsB3mjmEr+!$HXVWLI0fdGgzGti3S-OU zDht=0*7lJK<-3g9{nWK3T_H`3U)lXU(U#|Aq&NLfNktAA3e@vLj|En zK9ZPN4-c)i5}UnLN{KkM42{p~Or@4T>aPuB3xIomjc;e03~YUdsj+I*TgALSb4bAC z%4a;;9zQWA@a`%-de)a45Bgkc4Z12^)(T+XBqgmd+GOtO?~nHXEq0IKZBShCJKzmi z+|gU(6nFh@6h3Y9^!iB18h>q`AE|bL+^DWWCVu-?ycc(2)gxw_4#1ZQ^grt%Hz}wZ zM2H+^t|ZkoVC7V+NKkKcTg5);Eq313Y!dIZ`VkYDZ+5;^NXq=WSM8J7!)X$7cBdG_ z;zTYF_#$pAH|wah3zjUt31#$t86m 1BYZq{#mCVw$F+_Y`s>oko0k9wNywI)+J z*;cXZXlK*aWi$QGEGzEy7v_if6mMQc9Uitr*+w<1E#mD(-yNe{b1Jlip5A}R6>f1p zmg7Zr?(uLmrjXVM)c%0zZJ}Cmi@msLnY)BvQPBKr;FS-`&X#C9zPj}YgdJd^^zKX3 zr3uttDpHnRkP$H;d}Hrlq)lnw3QHMobZFrQ#03>%M_1w y~U`nanV>*Q_6Nm +vOWfua@BthyfG;BG>bX 5=Z zM|a$GZST1owd=CWJ!f^=8avfvkROAq#X?JWb|~#%0JXNO3H+t{=XV5zuVbkE)|0 z AxDUC dQ8{KWR@ zfV4IBYJb$`v-*7jM%31)VYXa+1E^J0hwRwL_KqYauj}2sHv+3R&q62g7wasie^yr* zom)&d8Riu{^V49lxY(~OrDx%kwQgGc`Ax?*MC{vmvFyY1#V*7#*_rsDutV8cU!&r0 ze1)6ShhjQu;K9wi=+;61!n|ryk$z5YRR8D$%p&$}YG6fAd_9cR*BTzYgllT7dkIoB ze+_aIOr{+2#spl+|MQXFkA0azG&j_AmMds~lk!%t1EaYx|K4VYI!nQnVf?JfA&Kke zc)>^Q g24 zp?ef|#Wti(wQ^k|_F=Cz>ste T-?naQt(t>yF7-KvT<-A z6vVmZU3NUvy5a)6&FZ}R{l2x;Ca1a_3-h6a#qMrjdbJqh2(o!oHqcj_d(?W=!Us}# z5Pl)#+>T|iZg<-DX$Z9fCoMZzB5PlX)M*lnR1okr?nd!l!T1i5=(PJ*1fewu_hN15 zgEy6PvZeBP`I0ph&HWcD78CjUP$p>)!P8+WqF&1a9Fg!=aq8%`fyDT|^Q)*|nUwT? zO}@44HucM~mhM5r&T~iYt(P+-vCq~UL@qBa6AE>UbDOS<1ox*nKUM`ACWBASg~Q}K zR>Q8Yq9By1u3L8!-Z)3!FdupJ6Ga7gBjH1cgJNI#gtJ!irf@GL&Qu&DHEf9Sv~O<; zS&^xYLfRdi_t^xkoW~(zg&;&8L61`j7jb`6c0o4g;qKcwXdfk0De 5J594pbWMIAr1qJV#4NNNkd)4O3DQXs^EZ|G7k%$sv9} z+}dZL78uX!mKQ$w8Re+yUaHW_MIn34jr;!hncQ>x(dwI5BL^1iKWP_Je)I_6#fjeG zG!6Z`T~_ Ok2ZH|^g@c^alV&yA&LCzP!7v|Dz;8V zcMZ4HVb+#50vzZ|`$mQ68`}6Ys;NDr>4K#|4TrTJ#jV|YscckDd#CUFfV~9Fyyb10 zQ>jQ@q-(I%eJRm5CeUeBhl CR`r8Ak^iGh(0v +0F* 1IefGyH5yUY9WCss1 zjUL~MS?^ayKa3{MSfH7xJHPO{h;1|M#j6pa(eo0K9DF{asK9qlkEn0ZBQcvQV$U54 zAAN|5$~$qNeZw2C;-8mz<9V1Pry9m{)3kf>O(*Q+QZ|wOy|2gq1nx+=FCEF xyr!5);x~4w3qzWi5%9F5B2YO#cw7w~%TqW=_;#A!JCu zoB~|8-};Jf8lAL6qQ2Z!viB0a9y9XBvS^)p=zjA3s6k4?Xfm``aoz<*$5&?x#sf$t zU%`QHO&4c)dRRFxd=(-BRFjYUE+xoF-uzPXeiH9_y^0#i@E~_}Iwbnc%40Rta@`p6 zFh`obnNG2JKT*!jE!dx>(6l!)x&e_az8B^8w7?39-PShplvqqu4vZd9N6+9*41Ho3 zmRe8s_;ubcg2nXkj}#}~chuI(!Aq~#dpYN)8#7`Z%8I06Y9*%3e#LH=o6mAS4v-yg z;V#QPXR`8&{CRwF!uP49RzLeP|K4M)XnwFoss8%=GR*}BMjOhQD&d8?ojG;J2Y$Nm z5}xi4$xrI!E-rAJ=hx-fw}G D*+NA zDfAjZP#-QX=z1P`7?zfm0ofDsi;}>Hv#!yA<2a5i zuGD)-A%H(BHdC{cw++4@nQU42!e$(U5_;0Ic-b&)GLYiMIZbG$^e;lY< zPEwbL-S{-C6>*E$G@mEliNGeA&(CnD`J&mx-|F@3=<3T*bM`rHa=d^BGIeZI{37wF zpS)y1Ck;iEszfL=q?f#6jS(iYZ%}0inBC`pNi#R!tWda*)2OhsM#Nb6P*mqPIYDT% z`*?(003PKM@FR3`MkY>nW;9+ab2enJp@&i7E$(rem#%xs!7pF;$7EYyh}s!26gC+I zo;dgX;`-Fowm2nnT_I{QUc{7#x3#W?Pr!?n06tlLcHS IL;C_>b8^HJrkBjsaVq|Dd(rKv?f6KSv@`mJVka=uCyjj`)< zH=Zwf<_^-e-3BNRuXfUc`metXqBD;M9}zMxUIz6w=Nq$G2~1UX>Sx@0k?d6~z6194 z#}mIId8yC}m1so1unGzZifdx-b?lIyqQ=g^WQUyzu1j)Ur=*b24~Xn6ep7Z!f*u^% z;9|5EE|%%*zW~4v;^_u1wbMPtgH=EKP%^%y{6!)Ua 6*pF` zQiH(}8A9>J#8dV#h?UEQPuEM--ZFbrES`mk0MwEdq$1e6f_K+V>Cj)mf#GjTPw(YW z(YA$jx +@Cl{Z!vF%O0|lB3|rN;n-iImJV`7?FBVq!{#8#*Xj ziF==}yG(IgcvL;kaNM%xRY|zvs9*8N4pO 6cnHo#wm^bbKU^vp%tDc~p^v!q%r@&Deq-FIXqT)ff18ij;HI ztj#!HhxLL?9o|vs1*eM7KP?|zy!#keP_#J2-p`3rfOnU7@6=U-)O8Zp9F`+YW5y)y z6UTWe7F}u9W1oQ9rq$SA*E<|@DD5RX@llH|3+l3;Up!9++nvW{&)(m4=#gj}6PQS{ zZ*+_CvCX$hi^^{PIr4M#L6F;=Q tsWrszjHQ%r6u{~5;;#Y%N1TS9o)=M3-?zB9W@et`MlN>Y)|u?i<2xDF zU-Vj9aR`erc?D+2K@$58A=A;Fl`db2PZe$YvhhXb+BGwl*nJyD!n;-KkMH@h_o?%x z2I9=znDy0kFvJ61Gz#724RHTLFfqN0YfsXc#yAJVn_^`c^t^9RG-NCaZv?t~(D5W- z1^oIo`MdP6gR^&vjorbY!&DZ|mf5}H2ZofrBfWlx!1X;#zECoiJn!*p+?Fs!r8a)l zUa}_G6X=Qz%@Gb|(Ax=m Rpq6O5~#fvO?J*^#m!Did5GJAyq#ZC5oc