mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-05-06 01:32:36 +00:00
Some checks failed
* feat(crewai-tools): add highlights to ExaSearchTool, rename from EXASearchTool - Add a highlights init param so agents can get token-efficient excerpts instead of full pages - Rename EXASearchTool to ExaSearchTool; keep EXASearchTool as a deprecated alias so existing imports keep working - Update the docs and example to use highlights as the recommended option - Add a small note that says Exa is the fastest and most accurate web search API - Add tests for the new highlights param and the deprecation alias * fix(crewai-tools): import order and module-level Exa for tests - Reorder std-lib imports so ruff is happy with force-sort-within-sections. - Import Exa at module level (with a fallback) so the existing test mocks resolve. The lazy install prompt still works if exa_py is missing. - Allow content and summary to be a dict, matching highlights. - Trim test file to the cases this PR introduces (highlights param and the EXASearchTool deprecation alias). Existing init-shape tests stay. Co-Authored-By: ishan <ishan@exa.ai> * chore(crewai-tools): drop self-explanatory comment on schema alias Co-Authored-By: ishan <ishan@exa.ai> * docs(crewai-tools): default highlights to True, drop summary from examples Co-Authored-By: ishan <ishan@exa.ai> * docs(crewai-tools): simplify highlights examples to highlights=True Co-Authored-By: ishan <ishan@exa.ai> * feat(crewai-tools): add x-exa-integration header for usage tracking Co-Authored-By: ishan <ishan@exa.ai> * docs(crewai-tools): add Exa MCP section and resources links Co-Authored-By: ishan <ishan@exa.ai> --------- Co-authored-by: ishan <ishan@exa.ai> Co-authored-by: Greyson LaLonde <greyson.r.lalonde@gmail.com> Co-authored-by: Lorenze Jay <63378463+lorenzejay@users.noreply.github.com>
153 lines
5.0 KiB
Plaintext
153 lines
5.0 KiB
Plaintext
---
|
|
title: "Exa Search Tool"
|
|
description: "Search the web with Exa, the fastest and most accurate web search API. Get token-efficient highlights and full page content."
|
|
icon: "magnifying-glass"
|
|
mode: "wide"
|
|
---
|
|
|
|
The `ExaSearchTool` lets CrewAI agents search the web using [Exa](https://exa.ai/), the fastest and most accurate web search API. It returns the most relevant results for any query, with options for token-efficient highlights and full page content.
|
|
|
|
## Installation
|
|
|
|
Install the CrewAI tools package:
|
|
|
|
```shell
|
|
pip install 'crewai[tools]'
|
|
```
|
|
|
|
## Environment Variables
|
|
|
|
Set your Exa API key as an environment variable:
|
|
|
|
```bash
|
|
export EXA_API_KEY='your_exa_api_key'
|
|
```
|
|
|
|
Get an API key from the [Exa dashboard](https://dashboard.exa.ai/api-keys).
|
|
|
|
## Example Usage
|
|
|
|
Here's how to use the `ExaSearchTool` within a CrewAI agent:
|
|
|
|
```python
|
|
import os
|
|
from crewai import Agent, Task, Crew
|
|
from crewai_tools import ExaSearchTool
|
|
|
|
# Initialize the tool
|
|
exa_tool = ExaSearchTool()
|
|
|
|
# Create an agent that uses the tool
|
|
researcher = Agent(
|
|
role='Research Analyst',
|
|
goal='Find the latest information on any topic',
|
|
backstory='An expert researcher who finds the most relevant and up-to-date information.',
|
|
tools=[exa_tool],
|
|
verbose=True
|
|
)
|
|
|
|
# Create a task for the agent
|
|
research_task = Task(
|
|
description='Find the top 3 recent breakthroughs in quantum computing.',
|
|
expected_output='A summary of the top 3 breakthroughs with source URLs.',
|
|
agent=researcher
|
|
)
|
|
|
|
# Form the crew and kick it off
|
|
crew = Crew(
|
|
agents=[researcher],
|
|
tasks=[research_task],
|
|
verbose=True
|
|
)
|
|
|
|
result = crew.kickoff()
|
|
print(result)
|
|
```
|
|
|
|
## Configuration Options
|
|
|
|
The `ExaSearchTool` accepts the following parameters during initialization:
|
|
|
|
- `type` (str, optional): The search type to use. Defaults to `"auto"`. Options: `"auto"`, `"instant"`, `"fast"`, `"deep"`.
|
|
- `highlights` (bool or dict, optional): Return token-efficient excerpts most relevant to the query instead of the full page. Defaults to `True`. Pass a dict like `{"max_characters": 4000}` to configure, or `False` to disable.
|
|
- `content` (bool, optional): Whether to include full page content in results. Defaults to `False`.
|
|
- `api_key` (str, optional): Your Exa API key. Falls back to the `EXA_API_KEY` environment variable if not provided.
|
|
- `base_url` (str, optional): Custom API server URL. Falls back to the `EXA_BASE_URL` environment variable if not provided.
|
|
|
|
When calling the tool (or when an agent invokes it), the following search parameters are available:
|
|
|
|
- `search_query` (str): **Required**. The search query string.
|
|
- `start_published_date` (str, optional): Filter results published after this date (ISO 8601 format, e.g. `"2024-01-01"`).
|
|
- `end_published_date` (str, optional): Filter results published before this date (ISO 8601 format).
|
|
- `include_domains` (list[str], optional): A list of domains to restrict the search to.
|
|
|
|
## Advanced Usage
|
|
|
|
For most agent workflows we recommend `highlights` — it returns the most relevant excerpts from each result and uses far fewer tokens than full page content:
|
|
|
|
```python
|
|
# Get token-efficient excerpts most relevant to the query
|
|
exa_tool = ExaSearchTool(
|
|
highlights=True,
|
|
type="auto",
|
|
)
|
|
|
|
# Use it in an agent
|
|
agent = Agent(
|
|
role="Researcher",
|
|
goal="Answer questions with current web data",
|
|
tools=[exa_tool]
|
|
)
|
|
```
|
|
|
|
For thorough, multi-step searches, use `type="deep"`:
|
|
|
|
```python
|
|
exa_tool = ExaSearchTool(
|
|
highlights=True,
|
|
type="deep",
|
|
)
|
|
```
|
|
|
|
For more on choosing between highlights and full content, see the [Exa search best practices](https://exa.ai/docs/reference/search-best-practices).
|
|
|
|
## Using Exa via MCP
|
|
|
|
You can also connect your agent to Exa's hosted MCP server. Pass your API key with the `x-api-key` header:
|
|
|
|
```python
|
|
from crewai import Agent
|
|
from crewai.mcp import MCPServerHTTP
|
|
|
|
agent = Agent(
|
|
role="Research Analyst",
|
|
goal="Find and analyze information on the web",
|
|
backstory="Expert researcher with access to Exa's tools",
|
|
mcps=[
|
|
MCPServerHTTP(
|
|
url="https://mcp.exa.ai/mcp",
|
|
headers={"x-api-key": "YOUR_EXA_API_KEY"},
|
|
),
|
|
],
|
|
)
|
|
```
|
|
|
|
Get your API key from the [Exa dashboard](https://dashboard.exa.ai/api-keys). For more on MCP in CrewAI, see the [MCP overview](/en/mcp/overview).
|
|
|
|
## Features
|
|
|
|
- **Token-Efficient Highlights**: Get the most relevant excerpts from each result, ~10x fewer tokens than full text
|
|
- **Semantic Search**: Find results based on meaning, not just keywords
|
|
- **Full Content Retrieval**: Get the full text of web pages alongside search results
|
|
- **Date Filtering**: Limit results to specific time periods with published date filters
|
|
- **Domain Filtering**: Restrict searches to specific domains
|
|
|
|
<Note>
|
|
`EXASearchTool` is a deprecated alias for `ExaSearchTool`. Existing imports continue to work but will emit a deprecation warning; please migrate to `ExaSearchTool`.
|
|
</Note>
|
|
|
|
## Resources
|
|
|
|
- [Exa documentation](https://exa.ai/docs)
|
|
- [Exa dashboard — manage API keys and usage](https://dashboard.exa.ai)
|