exa-haystack
Haystack integration for Exa - the search engine designed for AI.
Installation
pip install exa-haystack
Usage
ExaWebSearch
Search the web using Exa's neural search:
from haystack_integrations.components.websearch.exa import ExaWebSearch
search = ExaWebSearch(num_results=5)
results = search.run(query="latest developments in quantum computing")
for doc in results["documents"]:
print(f"Title: {doc.meta['title']}")
print(f"URL: {doc.meta['url']}")
print(f"Content: {doc.content[:200]}...")
print()
ExaFindSimilar
Find pages similar to a given URL:
from haystack_integrations.components.websearch.exa import ExaFindSimilar
find_similar = ExaFindSimilar(num_results=5)
results = find_similar.run(url="https://example.com/article")
for doc in results["documents"]:
print(f"Similar: {doc.meta['title']} - {doc.meta['url']}")
ExaContents
Fetch full content for URLs:
from haystack_integrations.components.websearch.exa import ExaContents
contents = ExaContents(text=True, highlights=True, summary=True)
results = contents.run(urls=["https://example.com/article1", "https://example.com/article2"])
for doc in results["documents"]:
print(f"Title: {doc.meta['title']}")
print(f"Summary: {doc.meta.get('summary', 'N/A')}")
print(f"Content: {doc.content[:500]}...")
Using in a Pipeline
from haystack import Pipeline
from haystack.components.builders import PromptBuilder
from haystack.components.generators import OpenAIGenerator
from haystack_integrations.components.websearch.exa import ExaWebSearch
template = """
Based on the following search results, answer the question.
Search Results:
{% for doc in documents %}
Title: {{ doc.meta.title }}
Content: {{ doc.content }}
---
{% endfor %}
Question: {{ query }}
Answer:
"""
pipe = Pipeline()
pipe.add_component("search", ExaWebSearch(num_results=3))
pipe.add_component("prompt", PromptBuilder(template=template))
pipe.add_component("llm", OpenAIGenerator())
pipe.connect("search.documents", "prompt.documents")
pipe.connect("prompt", "llm")
result = pipe.run({
"search": {"query": "What is retrieval augmented generation?"},
"prompt": {"query": "What is retrieval augmented generation?"}
})
print(result["llm"]["replies"][0])
Configuration
Set your Exa API key as an environment variable:
export EXA_API_KEY="your-api-key"
Or pass it directly:
from haystack.utils import Secret
from haystack_integrations.components.websearch.exa import ExaWebSearch
search = ExaWebSearch(api_key=Secret.from_token("your-api-key"))
Components
ExaWebSearch
Main search component using Exa's /search endpoint.
Parameters:
api_key: Exa API key (default: fromEXA_API_KEYenv var)num_results: Number of results to return (default: 10)type: Search type —"auto","neural","fast","deep","deep-reasoning","deep-max","instant"(default:"auto")include_domains/exclude_domains: Domain filtersstart_published_date/end_published_date: Date range filters (ISO format)category: Search category filter ("company","research paper","news","pdf","tweet","personal site","financial report","people")additional_queries: Extra queries for deep searchoutput_schema: JSON schema for structured deep search output (returned asdeep_outputcomponent output)max_age_hours: Content freshness control (0= always livecrawl,-1= cache only, positive = max cache age in hours)livecrawl: Legacy freshness option (deprecated, usemax_age_hours)text/highlights/summary: Content options (bool or dict with sub-options)
ExaFindSimilar
Find similar pages using Exa's /findSimilar endpoint.
Parameters:
api_key: Exa API key (default: fromEXA_API_KEYenv var)num_results: Number of results to return (default: 10)include_domains/exclude_domains: Domain filtersexclude_source_domain: Exclude the source URL's domain from resultscategory: Search category filtermax_age_hours: Content freshness controllivecrawl: Legacy freshness option (deprecated, usemax_age_hours)text/highlights/summary: Content options
ExaContents
Fetch content for URLs using Exa's /contents endpoint.
Parameters:
api_key: Exa API key (default: fromEXA_API_KEYenv var)text: Include full text content (default: True)highlights: Include highlighted snippetssummary: Include AI-generated summarymax_age_hours: Content freshness controllivecrawl: Legacy freshness option (deprecated, usemax_age_hours)subpages/subpage_target: Crawl linked subpagesextras/flags: Additional extraction options
Outputs: documents (list of Documents) and statuses (per-URL status/error info)
ExaAnswer
Generate AI-powered answers with citations using Exa's /answer endpoint.
Parameters:
api_key: Exa API key (default: fromEXA_API_KEYenv var)model:"exa"or"exa-pro"(default:"exa")system_prompt: Custom system promptoutput_schema: JSON schema for structured answer output
ExaStreamAnswer
Streaming variant of ExaAnswer — yields answer chunks via SSE.
ExaResearch
Conduct deep research using Exa's /research/v1 endpoint.
Parameters:
api_key: Exa API key (default: fromEXA_API_KEYenv var)model:"exa-research-fast","exa-research", or"exa-research-pro"(default:"exa-research")output_schema: JSON schema for structured research outputpoll_interval/max_wait_time: Polling configuration
License
Apache-2.0
Release files for exa-haystack 1.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| exa_haystack-1.1.0.tar.gz | 17.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| exa_haystack-1.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 37.8 kB
Release files / exa_haystack-1.1.0.tar.gz
| Download URL | exa_haystack-1.1.0.tar.gz |
|---|---|
| Size | 17.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
445f505a314827513575c6c6b4e45c55925f3b2e06d9ab01dfd73485cda3b95e
|
|
BLAKE2b-256 checksum How to use checksums |
c18bb71ada18043520a1849dca050f8767147ae88103ea56a9fbc52a0c258cb8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 12, 2026.
Transparency logRelease files / exa_haystack-1.1.0-py3-none-any.whl
| Download URL | exa_haystack-1.1.0-py3-none-any.whl |
|---|---|
| Size | 20.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
01ebfc34011e1904b8acde3034ca8195619c1316e3cecdeae26f7c85b88f4d0e
|
|
BLAKE2b-256 checksum How to use checksums |
c9700347a02ebba87ac66d2087de8792eacfa48e4e07e4bf8f432fdf9498be01
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 12, 2026.
Transparency log