Integration: Brave Search
Search the web using the Brave Search API with Haystack
Table of Contents
Overview
Brave Search is an independent search engine with its own web index. Unlike most search APIs, it does not rely on Google or Bing, making it a great choice for privacy-conscious applications.
This integration provides:
-
BraveWebSearch: Searches the web using the Brave Search API and returns results as HaystackDocumentobjects along with source URLs.
You need a Brave Search API key to use this integration. You can get one at brave.com/search/api.
Installation
pip install brave-search-haystack
Usage
BraveWebSearch
BraveWebSearch queries the Brave Search API and returns results as Haystack Document objects containing the content snippets and metadata (title, URL). Source URLs are also returned separately.
Basic Example
from haystack_integrations.components.websearch.brave import BraveWebSearch
web_search = BraveWebSearch(top_k=5)
result = web_search.run(query="What is Haystack by deepset?")
documents = result["documents"]
links = result["links"]
In a Pipeline
Here is an example of a RAG pipeline that uses BraveWebSearch to retrieve web content and answer a question:
from haystack import Pipeline
from haystack.utils import Secret
from haystack.components.builders.chat_prompt_builder import ChatPromptBuilder
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.dataclasses import ChatMessage
from haystack_integrations.components.websearch.brave import BraveWebSearch
web_search = BraveWebSearch(top_k=3)
prompt_template = [
ChatMessage.from_system("You are a helpful assistant."),
ChatMessage.from_user(
"Given the information below:\n"
"{% for document in documents %}{{ document.content }}\n{% endfor %}\n"
"Answer the following question: {{ query }}.\nAnswer:",
),
]
prompt_builder = ChatPromptBuilder(
template=prompt_template,
required_variables={"query", "documents"},
)
llm = OpenAIChatGenerator(
api_key=Secret.from_env_var("OPENAI_API_KEY"),
model="gpt-4o-mini",
)
pipe = Pipeline()
pipe.add_component("search", web_search)
pipe.add_component("prompt_builder", prompt_builder)
pipe.add_component("llm", llm)
pipe.connect("search.documents", "prompt_builder.documents")
pipe.connect("prompt_builder.prompt", "llm.messages")
query = "What is Haystack by deepset?"
result = pipe.run(data={"search": {"query": query}, "prompt_builder": {"query": query}})
print(result["llm"]["replies"][0].text)
Async Support
The component supports asynchronous execution via run_async:
import asyncio
from haystack_integrations.components.websearch.brave import BraveWebSearch
async def main():
web_search = BraveWebSearch(top_k=3)
result = await web_search.run_async(query="What is Haystack by deepset?")
print(f"Found {len(result['documents'])} documents")
asyncio.run(main())
Parameters
api_key: API key for Brave Search. Defaults to theBRAVE_API_KEYenvironment variable.top_k: Maximum number of results to return. Defaults to 10.country: 2-letter country code to bias search results (e.g."US","DE").search_lang: Language code for search results (e.g."en","de").extra_params: Additional query parameters passed directly to the Brave Search API.timeout: Timeout in seconds for the HTTP request. Defaults to 10.max_retries: Maximum number of retry attempts on transient failures. Defaults to 3.
License
brave-search-haystack is distributed under the terms of the
Apache-2.0 license.
