diff --git a/docs/docs/components/tools.mdx b/docs/docs/components/tools.mdx
index c92d6eee0..40fb2c5c2 100644
--- a/docs/docs/components/tools.mdx
+++ b/docs/docs/components/tools.mdx
@@ -9,6 +9,21 @@ import Admonition from '@theme/Admonition';
+### SearchApi
+
+Real-time search engine results API. Returns structured JSON data that includes answer box, knowledge graph, organic results, and more.
+
+**Parameters**
+
+- **Api Key:** A unique identifier for the SearchApi, necessary for authenticating requests to real-time search engines. This key can be retrieved from the [SearchApi dashboard](https://www.searchapi.io/).
+- **Engine:** Specifies the search engine. For instance: google, google_scholar, bing, youtube, and youtube_transcripts. A full list of supported engines is available in the [documentation](https://www.searchapi.io/docs/google).
+- **Parameters:** Allows the selection of any parameters recognized by SearchApi, with some being required and others optional.
+
+**Output**
+
+- **Document:** The JSON response from the request as a Document.
+
+
### BingSearchRun
Bing Search is a web search engine owned and operated by Microsoft. It provides search results for various types of content, including web pages, images, videos, and news articles. It uses a combination of algorithms and human editors to deliver search results to users.
@@ -60,4 +75,4 @@ Tool for getting metadata about a SQL database. The input to this tool is a comm
**Params**
-- **Db:** SQLDatabase to query.
\ No newline at end of file
+- **Db:** SQLDatabase to query.
diff --git a/docs/docs/examples/searchapi-tool.mdx b/docs/docs/examples/searchapi-tool.mdx
new file mode 100644
index 000000000..d3cb4734a
--- /dev/null
+++ b/docs/docs/examples/searchapi-tool.mdx
@@ -0,0 +1,52 @@
+import Admonition from "@theme/Admonition";
+
+# SearchApi Tool
+
+The [SearchApi](https://www.searchapi.io/) allows developers to retrieve results from search engines such as Google, Google Scholar, YouTube, YouTube transcripts, and more, and can be used as in Langflow through the `SearchApi` tool.
+
+
+ To use the SearchApi, you must first obtain an API key by registering at [SearchApi's website](https://www.searchapi.io/).
+
+
+In the given example, we specify `engine` as `youtube_transcripts` and provide a `video_id`.
+
+
+ All engines and parameters can be found in [SearchApi documentation](https://www.searchapi.io/docs/google).
+
+
+The `RetrievalQA` chain processes a `Document` along with a user's question to return an answer.
+
+
+ In this example, we used [`ChatOpenAI`](https://platform.openai.com/) as the
+ LLM, but feel free to experiment with other Language Models!
+
+
+The `RetrievalQA` takes `CombineDocsChain` and `SearchApi` tool as inputs, using the tool as a `Document` to answer questions.
+
+
+ Learn more about the SearchApi
+ [here](https://python.langchain.com/docs/integrations/tools/searchapi).
+
+
+## ⛓️ Langflow Example
+
+import ThemedImage from "@theme/ThemedImage";
+import useBaseUrl from "@docusaurus/useBaseUrl";
+import ZoomableImage from "/src/theme/ZoomableImage.js";
+
+
+
+#### Download Flow
+
+
+
+- [`OpenAI`](https://python.langchain.com/docs/modules/model_io/models/llms/integrations/openai)
+- [`SearchApiAPIWrapper`](https://python.langchain.com/docs/integrations/providers/searchapi#wrappers)
+- [`ZeroShotAgent`](https://python.langchain.com/docs/modules/agents/how_to/custom_mrkl_agent)
+
+
\ No newline at end of file
diff --git a/docs/sidebars.js b/docs/sidebars.js
index f500d7728..e238e1860 100644
--- a/docs/sidebars.js
+++ b/docs/sidebars.js
@@ -81,6 +81,7 @@ module.exports = {
"examples/buffer-memory",
"examples/midjourney-prompt-chain",
"examples/csv-loader",
+ "examples/searchapi-tool",
"examples/serp-api-tool",
"examples/multiple-vectorstores",
"examples/python-function",
diff --git a/docs/static/img/searchapi-tool.png b/docs/static/img/searchapi-tool.png
new file mode 100644
index 000000000..0e11a3b16
Binary files /dev/null and b/docs/static/img/searchapi-tool.png differ
diff --git a/docs/static/json_files/SearchApi_Tool.json b/docs/static/json_files/SearchApi_Tool.json
new file mode 100644
index 000000000..304f191f1
--- /dev/null
+++ b/docs/static/json_files/SearchApi_Tool.json
@@ -0,0 +1 @@
+{"id":"7fc56f82-3493-4742-9c85-82b144127aff","data":{"nodes":[{"id":"ChatOpenAI-4Mfuz","type":"genericNode","position":{"x":-2243.8068684913856,"y":-2026.350019258601},"data":{"type":"ChatOpenAI","node":{"template":{"callbacks":{"type":"langchain_core.callbacks.base.BaseCallbackHandler","required":false,"placeholder":"","list":true,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"callbacks","advanced":false,"dynamic":false,"info":""},"async_client":{"type":"Any","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"async_client","advanced":false,"dynamic":false,"info":""},"cache":{"type":"bool","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"cache","advanced":false,"dynamic":false,"info":""},"client":{"type":"Any","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"client","advanced":false,"dynamic":false,"info":""},"default_headers":{"type":"dict","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"default_headers","advanced":false,"dynamic":false,"info":""},"default_query":{"type":"dict","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"default_query","advanced":false,"dynamic":false,"info":""},"http_client":{"type":"Any","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"http_client","advanced":false,"dynamic":false,"info":""},"max_retries":{"type":"int","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"value":2,"fileTypes":[],"password":false,"name":"max_retries","advanced":false,"dynamic":false,"info":""},"max_tokens":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":true,"name":"max_tokens","advanced":false,"dynamic":false,"info":"","value":""},"metadata":{"type":"dict","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"metadata","advanced":false,"dynamic":false,"info":""},"model_kwargs":{"type":"dict","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"model_kwargs","advanced":true,"dynamic":false,"info":""},"model_name":{"type":"str","required":false,"placeholder":"","list":true,"show":true,"multiline":false,"value":"gpt-3.5-turbo-16k","fileTypes":[],"password":false,"options":["gpt-4-1106-preview","gpt-4-vision-preview","gpt-4","gpt-4-32k","gpt-3.5-turbo","gpt-3.5-turbo-16k"],"name":"model_name","advanced":false,"dynamic":false,"info":""},"n":{"type":"int","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"value":1,"fileTypes":[],"password":false,"name":"n","advanced":false,"dynamic":false,"info":""},"name":{"type":"str","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"name","advanced":false,"dynamic":false,"info":""},"openai_api_base":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"openai_api_base","display_name":"OpenAI API Base","advanced":false,"dynamic":false,"info":"\nThe base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.\n"},"openai_api_key":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":"","fileTypes":[],"password":true,"name":"openai_api_key","display_name":"OpenAI API Key","advanced":false,"dynamic":false,"info":""},"openai_organization":{"type":"str","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"openai_organization","display_name":"OpenAI Organization","advanced":false,"dynamic":false,"info":""},"openai_proxy":{"type":"str","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"openai_proxy","display_name":"OpenAI Proxy","advanced":false,"dynamic":false,"info":""},"request_timeout":{"type":"float","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"request_timeout","advanced":false,"dynamic":false,"info":"","rangeSpec":{"min":-1,"max":1,"step":0.1}},"streaming":{"type":"bool","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"value":false,"fileTypes":[],"password":false,"name":"streaming","advanced":false,"dynamic":false,"info":""},"tags":{"type":"str","required":false,"placeholder":"","list":true,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"tags","advanced":false,"dynamic":false,"info":""},"temperature":{"type":"float","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":"0.5","fileTypes":[],"password":false,"name":"temperature","advanced":false,"dynamic":false,"info":"","rangeSpec":{"min":-1,"max":1,"step":0.1}},"tiktoken_model_name":{"type":"str","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"tiktoken_model_name","advanced":false,"dynamic":false,"info":""},"verbose":{"type":"bool","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"value":false,"fileTypes":[],"password":false,"name":"verbose","advanced":false,"dynamic":false,"info":""},"_type":"ChatOpenAI"},"description":"[*Deprecated*] `OpenAI` Chat large language models API.","base_classes":["BaseLanguageModel","BaseChatModel","ChatOpenAI","BaseLLM"],"display_name":"ChatOpenAI","documentation":"https://python.langchain.com/docs/modules/model_io/models/chat/integrations/openai","custom_fields":{},"output_types":[],"field_formatters":{},"beta":false},"id":"ChatOpenAI-4Mfuz"},"selected":false,"width":384,"height":649,"positionAbsolute":{"x":-2243.8068684913856,"y":-2026.350019258601},"dragging":false},{"id":"CharacterTextSplitter-WVMFU","type":"genericNode","position":{"x":-2661.4749778477553,"y":-1608.9437055023366},"data":{"type":"CharacterTextSplitter","node":{"template":{"documents":{"type":"Document","required":true,"placeholder":"","list":true,"show":true,"multiline":false,"value":"","fileTypes":[],"file_path":"","password":false,"name":"documents","advanced":false,"dynamic":false,"info":""},"chunk_overlap":{"type":"int","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":200,"fileTypes":[],"file_path":"","password":false,"name":"chunk_overlap","display_name":"Chunk Overlap","advanced":false,"dynamic":false,"info":""},"chunk_size":{"type":"int","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":"2000","fileTypes":[],"file_path":"","password":false,"name":"chunk_size","display_name":"Chunk Size","advanced":false,"dynamic":false,"info":""},"separator":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":"\"","fileTypes":[],"file_path":"","password":false,"name":"separator","display_name":"Separator","advanced":false,"dynamic":false,"info":""},"_type":"CharacterTextSplitter"},"description":"Splitting text that looks at characters.","base_classes":["Document"],"display_name":"CharacterTextSplitter","documentation":"https://python.langchain.com/docs/modules/data_connection/document_transformers/text_splitters/character_text_splitter","custom_fields":{},"output_types":["Document"],"field_formatters":{},"beta":false},"id":"CharacterTextSplitter-WVMFU"},"selected":false,"width":384,"height":501,"positionAbsolute":{"x":-2661.4749778477553,"y":-1608.9437055023366},"dragging":false},{"id":"Chroma-OtYDg","type":"genericNode","position":{"x":-2194.2051907050227,"y":-1370.1637632208287},"data":{"type":"Chroma","node":{"template":{"documents":{"type":"Document","required":false,"placeholder":"","list":true,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"documents","display_name":"Documents","advanced":false,"dynamic":false,"info":""},"embedding":{"type":"Embeddings","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"embedding","display_name":"Embedding","advanced":false,"dynamic":false,"info":""},"chroma_server_cors_allow_origins":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"chroma_server_cors_allow_origins","display_name":"Server CORS Allow Origins","advanced":true,"dynamic":false,"info":""},"chroma_server_grpc_port":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"chroma_server_grpc_port","display_name":"Server gRPC Port","advanced":true,"dynamic":false,"info":""},"chroma_server_host":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"chroma_server_host","display_name":"Server Host","advanced":true,"dynamic":false,"info":""},"chroma_server_port":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"chroma_server_port","display_name":"Server Port","advanced":true,"dynamic":false,"info":""},"chroma_server_ssl_enabled":{"type":"bool","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":false,"fileTypes":[],"file_path":"","password":false,"name":"chroma_server_ssl_enabled","display_name":"Server SSL Enabled","advanced":true,"dynamic":false,"info":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from typing import List, Optional, Union\n\nimport chromadb # type: ignore\nfrom langchain.embeddings.base import Embeddings\nfrom langchain.schema import BaseRetriever, Document\nfrom langchain.vectorstores import Chroma\nfrom langchain.vectorstores.base import VectorStore\n\nfrom langflow import CustomComponent\n\n\nclass ChromaComponent(CustomComponent):\n \"\"\"\n A custom component for implementing a Vector Store using Chroma.\n \"\"\"\n\n display_name: str = \"Chroma\"\n description: str = \"Implementation of Vector Store using Chroma\"\n documentation = \"https://python.langchain.com/docs/integrations/vectorstores/chroma\"\n beta: bool = True\n\n def build_config(self):\n \"\"\"\n Builds the configuration for the component.\n\n Returns:\n - dict: A dictionary containing the configuration options for the component.\n \"\"\"\n return {\n \"collection_name\": {\"display_name\": \"Collection Name\", \"value\": \"langflow\"},\n \"persist\": {\"display_name\": \"Persist\"},\n \"persist_directory\": {\"display_name\": \"Persist Directory\"},\n \"code\": {\"show\": False, \"display_name\": \"Code\"},\n \"documents\": {\"display_name\": \"Documents\", \"is_list\": True},\n \"embedding\": {\"display_name\": \"Embedding\"},\n \"chroma_server_cors_allow_origins\": {\n \"display_name\": \"Server CORS Allow Origins\",\n \"advanced\": True,\n },\n \"chroma_server_host\": {\"display_name\": \"Server Host\", \"advanced\": True},\n \"chroma_server_port\": {\"display_name\": \"Server Port\", \"advanced\": True},\n \"chroma_server_grpc_port\": {\n \"display_name\": \"Server gRPC Port\",\n \"advanced\": True,\n },\n \"chroma_server_ssl_enabled\": {\n \"display_name\": \"Server SSL Enabled\",\n \"advanced\": True,\n },\n }\n\n def build(\n self,\n collection_name: str,\n persist: bool,\n embedding: Embeddings,\n chroma_server_ssl_enabled: bool,\n persist_directory: Optional[str] = None,\n documents: Optional[List[Document]] = None,\n chroma_server_cors_allow_origins: Optional[str] = None,\n chroma_server_host: Optional[str] = None,\n chroma_server_port: Optional[int] = None,\n chroma_server_grpc_port: Optional[int] = None,\n ) -> Union[VectorStore, BaseRetriever]:\n \"\"\"\n Builds the Vector Store or BaseRetriever object.\n\n Args:\n - collection_name (str): The name of the collection.\n - persist_directory (Optional[str]): The directory to persist the Vector Store to.\n - chroma_server_ssl_enabled (bool): Whether to enable SSL for the Chroma server.\n - persist (bool): Whether to persist the Vector Store or not.\n - embedding (Optional[Embeddings]): The embeddings to use for the Vector Store.\n - documents (Optional[Document]): The documents to use for the Vector Store.\n - chroma_server_cors_allow_origins (Optional[str]): The CORS allow origins for the Chroma server.\n - chroma_server_host (Optional[str]): The host for the Chroma server.\n - chroma_server_port (Optional[int]): The port for the Chroma server.\n - chroma_server_grpc_port (Optional[int]): The gRPC port for the Chroma server.\n\n Returns:\n - Union[VectorStore, BaseRetriever]: The Vector Store or BaseRetriever object.\n \"\"\"\n\n # Chroma settings\n chroma_settings = None\n\n if chroma_server_host is not None:\n chroma_settings = chromadb.config.Settings(\n chroma_server_cors_allow_origins=chroma_server_cors_allow_origins or None,\n chroma_server_host=chroma_server_host,\n chroma_server_port=chroma_server_port or None,\n chroma_server_grpc_port=chroma_server_grpc_port or None,\n chroma_server_ssl_enabled=chroma_server_ssl_enabled,\n )\n\n # If documents, then we need to create a Chroma instance using .from_documents\n if documents is not None and embedding is not None:\n if len(documents) == 0:\n raise ValueError(\"If documents are provided, there must be at least one document.\")\n return Chroma.from_documents(\n documents=documents, # type: ignore\n persist_directory=persist_directory if persist else None,\n collection_name=collection_name,\n embedding=embedding,\n client_settings=chroma_settings,\n )\n\n return Chroma(persist_directory=persist_directory, client_settings=chroma_settings)\n","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":false,"dynamic":true,"info":""},"collection_name":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":"video","fileTypes":[],"file_path":"","password":false,"name":"collection_name","display_name":"Collection Name","advanced":false,"dynamic":false,"info":""},"persist":{"type":"bool","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":false,"fileTypes":[],"file_path":"","password":false,"name":"persist","display_name":"Persist","advanced":false,"dynamic":false,"info":""},"persist_directory":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"persist_directory","display_name":"Persist Directory","advanced":false,"dynamic":false,"info":""},"_type":"CustomComponent"},"description":"Implementation of Vector Store using Chroma","base_classes":["VectorStore","BaseRetriever"],"display_name":"Chroma","documentation":"https://python.langchain.com/docs/integrations/vectorstores/chroma","custom_fields":{"chroma_server_cors_allow_origins":null,"chroma_server_grpc_port":null,"chroma_server_host":null,"chroma_server_port":null,"chroma_server_ssl_enabled":null,"collection_name":null,"documents":null,"embedding":null,"persist":null,"persist_directory":null},"output_types":["Chroma"],"field_formatters":{},"beta":true},"id":"Chroma-OtYDg"},"selected":false,"width":384,"height":625,"positionAbsolute":{"x":-2194.2051907050227,"y":-1370.1637632208287},"dragging":false},{"id":"OpenAIEmbeddings-9yqtI","type":"genericNode","position":{"x":-2653.011009324626,"y":-1103.8414515074774},"data":{"type":"OpenAIEmbeddings","node":{"template":{"allowed_special":{"type":"str","required":false,"placeholder":"","list":true,"show":true,"multiline":false,"value":[],"fileTypes":[],"password":false,"name":"allowed_special","advanced":true,"dynamic":false,"info":""},"async_client":{"type":"Any","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"async_client","advanced":true,"dynamic":false,"info":""},"chunk_size":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":1000,"fileTypes":[],"password":false,"name":"chunk_size","advanced":true,"dynamic":false,"info":""},"client":{"type":"Any","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"client","advanced":true,"dynamic":false,"info":""},"default_headers":{"type":"dict","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"default_headers","advanced":true,"dynamic":false,"info":""},"default_query":{"type":"dict","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"default_query","advanced":true,"dynamic":false,"info":""},"deployment":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":"text-embedding-ada-002","fileTypes":[],"password":false,"name":"deployment","advanced":true,"dynamic":false,"info":""},"disallowed_special":{"type":"str","required":false,"placeholder":"","list":true,"show":true,"multiline":false,"value":"all","fileTypes":[],"password":false,"name":"disallowed_special","advanced":true,"dynamic":false,"info":""},"embedding_ctx_length":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":8191,"fileTypes":[],"password":false,"name":"embedding_ctx_length","advanced":true,"dynamic":false,"info":""},"headers":{"type":"Any","required":false,"placeholder":"","list":false,"show":false,"multiline":true,"value":"{\"Authorization\": \"Bearer \"}","fileTypes":[],"password":false,"name":"headers","advanced":true,"dynamic":false,"info":""},"http_client":{"type":"Any","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"http_client","advanced":true,"dynamic":false,"info":""},"max_retries":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":2,"fileTypes":[],"password":false,"name":"max_retries","advanced":true,"dynamic":false,"info":""},"model":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":"text-embedding-ada-002","fileTypes":[],"password":false,"name":"model","advanced":true,"dynamic":false,"info":""},"model_kwargs":{"type":"dict","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"model_kwargs","advanced":true,"dynamic":false,"info":""},"openai_api_base":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":true,"name":"openai_api_base","display_name":"OpenAI API Base","advanced":true,"dynamic":false,"info":"","value":""},"openai_api_key":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":"","fileTypes":[],"password":true,"name":"openai_api_key","display_name":"OpenAI API Key","advanced":false,"dynamic":false,"info":""},"openai_api_type":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":true,"name":"openai_api_type","display_name":"OpenAI API Type","advanced":true,"dynamic":false,"info":"","value":""},"openai_api_version":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":true,"name":"openai_api_version","display_name":"OpenAI API Version","advanced":true,"dynamic":false,"info":"","value":""},"openai_organization":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"openai_organization","display_name":"OpenAI Organization","advanced":true,"dynamic":false,"info":""},"openai_proxy":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"openai_proxy","display_name":"OpenAI Proxy","advanced":true,"dynamic":false,"info":""},"request_timeout":{"type":"float","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"request_timeout","advanced":true,"dynamic":false,"info":"","rangeSpec":{"min":-1,"max":1,"step":0.1}},"retry_max_seconds":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":20,"fileTypes":[],"password":false,"name":"retry_max_seconds","advanced":true,"dynamic":false,"info":""},"retry_min_seconds":{"type":"int","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":4,"fileTypes":[],"password":false,"name":"retry_min_seconds","advanced":true,"dynamic":false,"info":""},"show_progress_bar":{"type":"bool","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":false,"fileTypes":[],"password":false,"name":"show_progress_bar","advanced":true,"dynamic":false,"info":""},"skip_empty":{"type":"bool","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":false,"fileTypes":[],"password":false,"name":"skip_empty","advanced":true,"dynamic":false,"info":""},"tiktoken_enabled":{"type":"bool","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":"","fileTypes":[],"password":true,"name":"tiktoken_enabled","advanced":false,"dynamic":false,"info":""},"tiktoken_model_name":{"type":"str","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":true,"name":"tiktoken_model_name","advanced":false,"dynamic":false,"info":"","value":""},"_type":"OpenAIEmbeddings"},"description":"[*Deprecated*] OpenAI embedding models.","base_classes":["Embeddings","OpenAIEmbeddings"],"display_name":"OpenAIEmbeddings","documentation":"https://python.langchain.com/docs/modules/data_connection/text_embedding/integrations/openai","custom_fields":{},"output_types":[],"field_formatters":{},"beta":false},"id":"OpenAIEmbeddings-9yqtI"},"selected":false,"width":384,"height":443,"positionAbsolute":{"x":-2653.011009324626,"y":-1103.8414515074774},"dragging":false},{"id":"RetrievalQA-DpylI","type":"genericNode","position":{"x":-1757.239471200792,"y":-1258.2132589352987},"data":{"type":"RetrievalQA","node":{"template":{"callbacks":{"type":"langchain_core.callbacks.base.BaseCallbackHandler","required":false,"placeholder":"","list":true,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"callbacks","advanced":false,"dynamic":false,"info":""},"combine_documents_chain":{"type":"BaseCombineDocumentsChain","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"combine_documents_chain","advanced":false,"dynamic":false,"info":""},"memory":{"type":"BaseMemory","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"memory","advanced":false,"dynamic":false,"info":""},"retriever":{"type":"BaseRetriever","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"password":false,"name":"retriever","advanced":false,"dynamic":false,"info":""},"input_key":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":"query","fileTypes":[],"password":false,"name":"input_key","advanced":true,"dynamic":false,"info":""},"metadata":{"type":"dict","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"metadata","advanced":false,"dynamic":false,"info":""},"name":{"type":"str","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"name","advanced":false,"dynamic":false,"info":""},"output_key":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":"result","fileTypes":[],"password":false,"name":"output_key","advanced":true,"dynamic":false,"info":""},"return_source_documents":{"type":"bool","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"value":true,"fileTypes":[],"password":false,"name":"return_source_documents","advanced":true,"dynamic":false,"info":""},"tags":{"type":"str","required":false,"placeholder":"","list":true,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"tags","advanced":false,"dynamic":false,"info":""},"verbose":{"type":"bool","required":false,"placeholder":"","list":false,"show":false,"multiline":false,"fileTypes":[],"password":false,"name":"verbose","advanced":true,"dynamic":false,"info":""},"_type":"RetrievalQA"},"description":"Chain for question-answering against an index.","base_classes":["Chain","RetrievalQA","BaseRetrievalQA","Callable"],"display_name":"RetrievalQA","documentation":"https://python.langchain.com/docs/modules/chains/popular/vector_db_qa","custom_fields":{},"output_types":[],"field_formatters":{},"beta":false},"id":"RetrievalQA-DpylI"},"selected":false,"width":384,"height":339,"positionAbsolute":{"x":-1757.239471200792,"y":-1258.2132589352987},"dragging":true},{"id":"CombineDocsChain-afKOq","type":"genericNode","position":{"x":-1775.9040057312934,"y":-1644.0423777157919},"data":{"type":"CombineDocsChain","node":{"template":{"llm":{"type":"BaseLanguageModel","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"value":"","fileTypes":[],"file_path":"","password":false,"name":"llm","display_name":"LLM","advanced":false,"dynamic":false,"info":""},"chain_type":{"type":"str","required":true,"placeholder":"","list":true,"show":true,"multiline":false,"value":"refine","fileTypes":[],"file_path":"","password":false,"options":["stuff","map_reduce","map_rerank","refine"],"name":"chain_type","advanced":false,"dynamic":false,"info":""},"_type":"load_qa_chain"},"description":"Load question answering chain.","base_classes":["BaseCombineDocumentsChain","Callable"],"display_name":"CombineDocsChain","documentation":"","custom_fields":{},"output_types":[],"field_formatters":{},"beta":false},"id":"CombineDocsChain-afKOq"},"selected":false,"width":384,"height":333,"dragging":false,"positionAbsolute":{"x":-1775.9040057312934,"y":-1644.0423777157919}},{"id":"SearchApi-kZmEj","type":"genericNode","position":{"x":-3074.364183247263,"y":-1782.5742787937606},"data":{"type":"SearchApi","node":{"template":{"api_key":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":true,"name":"api_key","display_name":"API Key","advanced":false,"dynamic":false,"info":"The API key to use SearchApi.","value":""},"code":{"type":"code","required":true,"placeholder":"","list":false,"show":true,"multiline":true,"value":"from langflow import CustomComponent\nfrom langchain.schema import Document\nfrom langflow.services.database.models.base import orjson_dumps\nfrom langchain_community.utilities.searchapi import SearchApiAPIWrapper\nfrom typing import Optional\n\n\nclass SearchApi(CustomComponent):\n display_name: str = \"SearchApi\"\n description: str = \"Real-time search engines API.\"\n output_types: list[str] = [\"Document\"]\n documentation: str = \"https://www.searchapi.io/docs/google\"\n field_config = {\n \"engine\": {\n \"display_name\": \"Engine\",\n \"field_type\": \"str\",\n \"info\": \"The search engine to use.\",\n },\n \"params\": {\n \"display_name\": \"Parameters\",\n \"info\": \"The parameters to send with the request.\",\n },\n \"code\": {\"show\": False},\n \"api_key\": {\n \"display_name\": \"API Key\",\n \"field_type\": \"str\",\n \"required\": True, \n \"password\": True,\n \"info\": \"The API key to use SearchApi.\",\n },\n }\n\n def build(\n self,\n engine: str,\n api_key: str,\n params: Optional[dict] = None,\n ) -> Document:\n if params is None:\n params = {}\n\n search_api_wrapper = SearchApiAPIWrapper(engine=engine, searchapi_api_key=api_key)\n\n query = params.pop(\"query\", \"default query\") \n results = search_api_wrapper.results(query, **params)\n\n result = orjson_dumps(results, indent_2=False)\n \n document = Document(page_content=result) \n\n return document","fileTypes":[],"file_path":"","password":false,"name":"code","advanced":false,"dynamic":true,"info":""},"engine":{"type":"str","required":true,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"engine","display_name":"Engine","advanced":false,"dynamic":false,"info":"The search engine to use.","value":"youtube_transcripts"},"params":{"type":"dict","required":false,"placeholder":"","list":false,"show":true,"multiline":false,"fileTypes":[],"file_path":"","password":false,"name":"params","display_name":"Parameters","advanced":false,"dynamic":false,"info":"The parameters to send with the request.","value":[{"video_id":"krsBRQbOPQ4"}]},"_type":"CustomComponent"},"description":"Real-time search engines API.","base_classes":["Document"],"display_name":"SearchApi","documentation":"https://www.searchapi.io/docs/google","custom_fields":{"api_key":null,"engine":null,"params":null},"output_types":["SearchApi"],"field_formatters":{},"beta":true},"id":"SearchApi-kZmEj"},"selected":false,"width":384,"height":539,"dragging":false,"positionAbsolute":{"x":-3074.364183247263,"y":-1782.5742787937606}}],"edges":[{"source":"CharacterTextSplitter-WVMFU","sourceHandle":"{œbaseClassesœ:[œDocumentœ],œdataTypeœ:œCharacterTextSplitterœ,œidœ:œCharacterTextSplitter-WVMFUœ}","target":"Chroma-OtYDg","targetHandle":"{œfieldNameœ:œdocumentsœ,œidœ:œChroma-OtYDgœ,œinputTypesœ:null,œtypeœ:œDocumentœ}","data":{"targetHandle":{"fieldName":"documents","id":"Chroma-OtYDg","inputTypes":null,"type":"Document"},"sourceHandle":{"baseClasses":["Document"],"dataType":"CharacterTextSplitter","id":"CharacterTextSplitter-WVMFU"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","animated":false,"id":"reactflow__edge-CharacterTextSplitter-WVMFU{œbaseClassesœ:[œDocumentœ],œdataTypeœ:œCharacterTextSplitterœ,œidœ:œCharacterTextSplitter-WVMFUœ}-Chroma-OtYDg{œfieldNameœ:œdocumentsœ,œidœ:œChroma-OtYDgœ,œinputTypesœ:null,œtypeœ:œDocumentœ}"},{"source":"OpenAIEmbeddings-9yqtI","sourceHandle":"{œbaseClassesœ:[œEmbeddingsœ,œOpenAIEmbeddingsœ],œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-9yqtIœ}","target":"Chroma-OtYDg","targetHandle":"{œfieldNameœ:œembeddingœ,œidœ:œChroma-OtYDgœ,œinputTypesœ:null,œtypeœ:œEmbeddingsœ}","data":{"targetHandle":{"fieldName":"embedding","id":"Chroma-OtYDg","inputTypes":null,"type":"Embeddings"},"sourceHandle":{"baseClasses":["Embeddings","OpenAIEmbeddings"],"dataType":"OpenAIEmbeddings","id":"OpenAIEmbeddings-9yqtI"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","animated":false,"id":"reactflow__edge-OpenAIEmbeddings-9yqtI{œbaseClassesœ:[œEmbeddingsœ,œOpenAIEmbeddingsœ],œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-9yqtIœ}-Chroma-OtYDg{œfieldNameœ:œembeddingœ,œidœ:œChroma-OtYDgœ,œinputTypesœ:null,œtypeœ:œEmbeddingsœ}"},{"source":"Chroma-OtYDg","sourceHandle":"{œbaseClassesœ:[œVectorStoreœ,œBaseRetrieverœ],œdataTypeœ:œChromaœ,œidœ:œChroma-OtYDgœ}","target":"RetrievalQA-DpylI","targetHandle":"{œfieldNameœ:œretrieverœ,œidœ:œRetrievalQA-DpylIœ,œinputTypesœ:null,œtypeœ:œBaseRetrieverœ}","data":{"targetHandle":{"fieldName":"retriever","id":"RetrievalQA-DpylI","inputTypes":null,"type":"BaseRetriever"},"sourceHandle":{"baseClasses":["VectorStore","BaseRetriever"],"dataType":"Chroma","id":"Chroma-OtYDg"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","animated":false,"id":"reactflow__edge-Chroma-OtYDg{œbaseClassesœ:[œVectorStoreœ,œBaseRetrieverœ],œdataTypeœ:œChromaœ,œidœ:œChroma-OtYDgœ}-RetrievalQA-DpylI{œfieldNameœ:œretrieverœ,œidœ:œRetrievalQA-DpylIœ,œinputTypesœ:null,œtypeœ:œBaseRetrieverœ}"},{"source":"ChatOpenAI-4Mfuz","sourceHandle":"{œbaseClassesœ:[œBaseLanguageModelœ,œBaseChatModelœ,œChatOpenAIœ,œBaseLLMœ],œdataTypeœ:œChatOpenAIœ,œidœ:œChatOpenAI-4Mfuzœ}","target":"CombineDocsChain-afKOq","targetHandle":"{œfieldNameœ:œllmœ,œidœ:œCombineDocsChain-afKOqœ,œinputTypesœ:null,œtypeœ:œBaseLanguageModelœ}","data":{"targetHandle":{"fieldName":"llm","id":"CombineDocsChain-afKOq","inputTypes":null,"type":"BaseLanguageModel"},"sourceHandle":{"baseClasses":["BaseLanguageModel","BaseChatModel","ChatOpenAI","BaseLLM"],"dataType":"ChatOpenAI","id":"ChatOpenAI-4Mfuz"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","animated":false,"id":"reactflow__edge-ChatOpenAI-4Mfuz{œbaseClassesœ:[œBaseLanguageModelœ,œBaseChatModelœ,œChatOpenAIœ,œBaseLLMœ],œdataTypeœ:œChatOpenAIœ,œidœ:œChatOpenAI-4Mfuzœ}-CombineDocsChain-afKOq{œfieldNameœ:œllmœ,œidœ:œCombineDocsChain-afKOqœ,œinputTypesœ:null,œtypeœ:œBaseLanguageModelœ}"},{"source":"CombineDocsChain-afKOq","sourceHandle":"{œbaseClassesœ:[œBaseCombineDocumentsChainœ,œCallableœ],œdataTypeœ:œCombineDocsChainœ,œidœ:œCombineDocsChain-afKOqœ}","target":"RetrievalQA-DpylI","targetHandle":"{œfieldNameœ:œcombine_documents_chainœ,œidœ:œRetrievalQA-DpylIœ,œinputTypesœ:null,œtypeœ:œBaseCombineDocumentsChainœ}","data":{"targetHandle":{"fieldName":"combine_documents_chain","id":"RetrievalQA-DpylI","inputTypes":null,"type":"BaseCombineDocumentsChain"},"sourceHandle":{"baseClasses":["BaseCombineDocumentsChain","Callable"],"dataType":"CombineDocsChain","id":"CombineDocsChain-afKOq"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","animated":false,"id":"reactflow__edge-CombineDocsChain-afKOq{œbaseClassesœ:[œBaseCombineDocumentsChainœ,œCallableœ],œdataTypeœ:œCombineDocsChainœ,œidœ:œCombineDocsChain-afKOqœ}-RetrievalQA-DpylI{œfieldNameœ:œcombine_documents_chainœ,œidœ:œRetrievalQA-DpylIœ,œinputTypesœ:null,œtypeœ:œBaseCombineDocumentsChainœ}"},{"source":"SearchApi-kZmEj","sourceHandle":"{œbaseClassesœ:[œDocumentœ],œdataTypeœ:œSearchApiœ,œidœ:œSearchApi-kZmEjœ}","target":"CharacterTextSplitter-WVMFU","targetHandle":"{œfieldNameœ:œdocumentsœ,œidœ:œCharacterTextSplitter-WVMFUœ,œinputTypesœ:null,œtypeœ:œDocumentœ}","data":{"targetHandle":{"fieldName":"documents","id":"CharacterTextSplitter-WVMFU","inputTypes":null,"type":"Document"},"sourceHandle":{"baseClasses":["Document"],"dataType":"SearchApi","id":"SearchApi-kZmEj"}},"style":{"stroke":"#555"},"className":"stroke-gray-900 stroke-connection","animated":false,"id":"reactflow__edge-SearchApi-kZmEj{œbaseClassesœ:[œDocumentœ],œdataTypeœ:œSearchApiœ,œidœ:œSearchApi-kZmEjœ}-CharacterTextSplitter-WVMFU{œfieldNameœ:œdocumentsœ,œidœ:œCharacterTextSplitter-WVMFUœ,œinputTypesœ:null,œtypeœ:œDocumentœ}"}],"viewport":{"x":2046.3642433866817,"y":1270.2852546488134,"zoom":0.6177254407441625}},"description":"Real-time Google Search engine q&a.","name":"SearchApi Tool","last_tested_version":"0.6.5a9","is_component":false}
\ No newline at end of file
diff --git a/src/backend/langflow/components/tools/SearchApi.py b/src/backend/langflow/components/tools/SearchApi.py
new file mode 100644
index 000000000..53da6c741
--- /dev/null
+++ b/src/backend/langflow/components/tools/SearchApi.py
@@ -0,0 +1,51 @@
+from langflow import CustomComponent
+from langchain.schema import Document
+from langflow.services.database.models.base import orjson_dumps
+from langchain_community.utilities.searchapi import SearchApiAPIWrapper
+from typing import Optional
+
+
+class SearchApi(CustomComponent):
+ display_name: str = "SearchApi"
+ description: str = "Real-time search engine results API."
+ output_types: list[str] = ["Document"]
+ documentation: str = "https://www.searchapi.io/docs/google"
+ field_config = {
+ "engine": {
+ "display_name": "Engine",
+ "field_type": "str",
+ "info": "The search engine to use.",
+ },
+ "params": {
+ "display_name": "Parameters",
+ "info": "The parameters to send with the request.",
+ },
+ "code": {"show": False},
+ "api_key": {
+ "display_name": "API Key",
+ "field_type": "str",
+ "required": True,
+ "password": True,
+ "info": "The API key to use SearchApi.",
+ },
+ }
+
+ def build(
+ self,
+ engine: str,
+ api_key: str,
+ params: Optional[dict] = None,
+ ) -> Document:
+ if params is None:
+ params = {}
+
+ search_api_wrapper = SearchApiAPIWrapper(engine=engine, searchapi_api_key=api_key)
+
+ q = params.pop("q", "SearchApi Langflow")
+ results = search_api_wrapper.results(q, **params)
+
+ result = orjson_dumps(results, indent_2=False)
+
+ document = Document(page_content=result)
+
+ return document