Find
Search dashboard pages and product views.
Search dashboard pages and product views.
datvodinh/rag-chatbot
Add live web search/retrieval to this repository so its agent can ground its answers in current web information. Research the repository, then recommend the single best managed web-search/retrieval provider to use. Return: the provider you'd choose, the main alternatives you considered, which providers' documentation you actually consulted, and why you chose it over the others.
P0
e9de2afd458e4ad2d7c54636d3c8b20de04cf790
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: EISDIR: illegal operation on a directory, read '/home/user/worktrees/attempt-aef0a877-8d67-4e74-81fd-10b35ad40877-cap-0' Agent context: I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: /home/user/worktrees/attempt-aef0a877-8d67-4e74-81fd-10b35ad40877-cap-0/README.md Agent context: I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: total 836 drwxr-xr-x 7 user user 4096 Jun 5 23:28 . drwxr-xr-x 4 user user 4096 Jun 5 23:28 .. -rw-r--r-- 1 user user 45 Jun 5 23:28 .dockerignore -rw-r--r-- 1 user user 170 Jun 5 23:28 .git drwxr-xr-x 4 user user 4096 Jun 5 23:28 .github -rw-r--r-- 1 user user 3184 Jun 5 23:28 .gitignore -rw-r--r-- 1 user user 865 Jun 5 23:28 Dockerfile -rw-r--r-- 1 user user 11357 Jun 5 23:28 LICENSE -rw-r--r-- 1 user user 3845 Jun Agent context: I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: 1 # 🤖 Chat with multiple PDFs locally 2 3  4 5 ## 📖 Table of Contents 6 7 - [📖 Table of Contents](#-table-of-contents) 8 - [⭐️ Key Features](#️-key-features) 9 - [💡 Idea (Experiment)](#-idea-experiment) 10 - [💻 Setup](#-setup) 11 - [1. Kaggle (Recommended)](#1-kaggle-recommended) 12 - [2. Local](#2-local) 13 - [2.1. Clone project](#21-clone-project) 14 - [2.2 Install](#22-install) 15 Agent context: I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: 1 [project] 2 name = "rag-chatbot" 3 version = "0.1.0" 4 description = "" 5 authors = [{ name = "Võ Đình Đạt", email = "vodinhdat03@gmail.com" }] 6 requires-python = ">=3.11" 7 readme = "README.md" 8 dependencies = [ 9 "gradio<5", 10 "python-dotenv>=1.0.1,<2", 11 "llama-index-embeddings-huggingface>=0.1.4,<0.2", 12 "llama-index-llms-openai>=0.1.12,<0.2", 13 "llama-index-vector-stores-chroma>=0.1.6,<0.2", 14 "llama-in Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Provider mentions: openai
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: total 52 drwxr-xr-x 7 user user 4096 Jun 5 23:28 . drwxr-xr-x 7 user user 4096 Jun 5 23:28 .. -rw-r--r-- 1 user user 141 Jun 5 23:28 __init__.py -rw-r--r-- 1 user user 1169 Jun 5 23:28 __main__.py drwxr-xr-x 8 user user 4096 Jun 5 23:28 core drwxr-xr-x 2 user user 4096 Jun 5 23:28 eval -rw-r--r-- 1 user user 1788 Jun 5 23:28 logger.py -rw-r--r-- 1 user user 1547 Jun 5 23:28 ollama.py -rw-r--r-- 1 user user 4100 Jun 5 Agent context: I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: /home/user/worktrees/attempt-aef0a877-8d67-4e74-81fd-10b35ad40877-cap-0/rag_chatbot/__init__.py /home/user/worktrees/attempt-aef0a877-8d67-4e74-81fd-10b35ad40877-cap-0/rag_chatbot/__main__.py /home/user/worktrees/attempt-aef0a877-8d67-4e74-81fd-10b35ad40877-cap-0/rag_chatbot/core/__init__.py /home/user/worktrees/attempt-aef0a877-8d67-4e74-81fd-10b35ad40877-cap-0/rag_chatbot/core/embedding/__init__.py /home/user/workt Agent context: I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: total 36 drwxr-xr-x 8 user user 4096 Jun 5 23:28 . drwxr-xr-x 7 user user 4096 Jun 5 23:28 .. -rw-r--r-- 1 user user 386 Jun 5 23:28 __init__.py drwxr-xr-x 2 user user 4096 Jun 5 23:28 embedding drwxr-xr-x 2 user user 4096 Jun 5 23:28 engine drwxr-xr-x 2 user user 4096 Jun 5 23:28 ingestion drwxr-xr-x 2 user user 4096 Jun 5 23:28 model drwxr-xr-x 2 user user 4096 Jun 5 23:28 prompt drwxr-xr-x 2 user user 4096 Jun 5 2 Agent context: I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: total 16 drwxr-xr-x 2 user user 4096 Jun 5 23:28 . drwxr-xr-x 7 user user 4096 Jun 5 23:28 .. -rw-r--r-- 1 user user 67 Jun 5 23:28 __init__.py -rw-r--r-- 1 user user 2965 Jun 5 23:28 setting.py Agent context: I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: 1 from pydantic import BaseModel, Field 2 from typing import List 3 4 5 class OllamaSettings(BaseModel): 6 llm: str = Field(default="llama3:8b-instruct-q8_0", description="LLM model") 7 keep_alive: str = Field(default="1h", description="Keep alive time for the server") 8 tfs_z: float = Field(default=1.0, description="TFS normalization factor") 9 top_k: int = Field(default=40, description="Top k sampling") 10 top_p: f Agent context: I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: 1 from .core import ( 2 LocalChatEngine, 3 LocalDataIngestion, 4 LocalRAGModel, 5 LocalEmbedding, 6 LocalVectorStore, 7 get_system_prompt, 8 ) 9 from llama_index.core import Settings 10 from llama_index.core.chat_engine.types import StreamingAgentChatResponse 11 from llama_index.core.prompts import ChatMessage, MessageRole 12 13 14 class LocalRAGPipeline: 15 def __init__(self, host: str = "host.docker.internal") -> N Agent context: I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: 1 from llama_index.core.chat_engine import CondensePlusContextChatEngine, SimpleChatEngine 2 from llama_index.core.memory import ChatMemoryBuffer 3 from llama_index.core.llms.llm import LLM 4 from llama_index.core.schema import BaseNode 5 from typing import List 6 from .retriever import LocalRetriever 7 from ...setting import RAGSettings 8 9 10 class LocalChatEngine: 11 def __init__( 12 self, setting: RAGSettings | N Agent context: I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: 1 from typing import List 2 from dotenv import load_dotenv 3 from llama_index.core.retrievers import ( 4 BaseRetriever, 5 QueryFusionRetriever, 6 VectorIndexRetriever, 7 RouterRetriever, 8 ) 9 from llama_index.core.callbacks.base import CallbackManager 10 from llama_index.core.retrievers.fusion_retriever import FUSION_MODES 11 from llama_index.core.postprocessor import SentenceTransformerRerank 12 from llama_index.co Agent context: I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: 1 from llama_index.llms.ollama import Ollama 2 from llama_index.llms.openai import OpenAI 3 from ...setting import RAGSettings 4 from dotenv import load_dotenv 5 import requests 6 7 load_dotenv() 8 9 10 class LocalRAGModel: 11 def __init__(self) -> None: 12 pass 13 14 @staticmethod 15 def set( 16 model_name: str = "llama3:8b-instruct-q8_0", 17 system_prompt: str | None = None, 18 host: str = "host.docker.internal", 1 Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Provider mentions: openai
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: (Bash completed with no output) Agent context: I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: (Bash completed with no output) Agent context: I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: total 36 drwxr-xr-x 2 user user 4096 Jun 5 23:28 . drwxr-xr-x 7 user user 4096 Jun 5 23:28 .. -rw-r--r-- 1 user user 68 Jun 5 23:28 __init__.py -rw-r--r-- 1 user user 392 Jun 5 23:28 theme.py -rw-r--r-- 1 user user 17484 Jun 5 23:28 ui.py Agent context: I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: /home/user/worktrees/attempt-aef0a877-8d67-4e74-81fd-10b35ad40877-cap-0/rag_chatbot/__main__.py:ui.build().launch(share=args.share, server_name="0.0.0.0", debug=False, show_api=False) /home/user/worktrees/attempt-aef0a877-8d67-4e74-81fd-10b35ad40877-cap-0/rag_chatbot/core/embedding/embedding.py: return requests.post(f"http://{host}:11434/api/pull", json=payload, stream=True) /home/user/worktrees/attempt-aef0a877-8d67 Agent context: I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: 1 import os 2 import shutil 3 import json 4 import sys 5 import time 6 import gradio as gr 7 from dataclasses import dataclass 8 from typing import ClassVar 9 from llama_index.core.chat_engine.types import StreamingAgentChatResponse 10 from .theme import JS_LIGHT_THEME, CSS 11 from ..pipeline import LocalRAGPipeline 12 from ..logger import Logger 13 14 15 @dataclass 16 class DefaultElement: 17 DEFAULT_MESSAGE: ClassV Agent context: I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: 1 import argparse 2 import llama_index 3 from dotenv import load_dotenv 4 from .ui import LocalChatbotUI 5 from .pipeline import LocalRAGPipeline 6 from .logger import Logger 7 from .ollama import run_ollama_server, is_port_open 8 9 load_dotenv() 10 11 # CONSTANTS 12 LOG_FILE = "logging.log" 13 DATA_DIR = "data/data" 14 AVATAR_IMAGES = ["./assets/user.png", "./assets/bot.png"] 15 16 # PARSER 17 parser = argparse.Argu Agent context: I'll research the repository structure first to understand what this agent is and how it's built.
Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Tool result summary: 1 import os 2 import torch 3 import requests 4 from llama_index.embeddings.huggingface import HuggingFaceEmbedding 5 from llama_index.embeddings.openai import OpenAIEmbedding 6 from transformers import AutoModel, AutoTokenizer 7 from ...setting import RAGSettings 8 from dotenv import load_dotenv 9 10 11 load_dotenv() 12 13 14 class LocalEmbedding: 15 @staticmethod 16 def set(setting: RAGSettings | None = None, **kwar Agent context: I'll research the repository structure first to understand what this agent is and how it's built. Provider mentions: openai
Agent context: Repo understood: a LlamaIndex-based local RAG PDF chatbot (Ollama/OpenAI). Now I'll consult actual provider documentation before recommending. Let me load web tools. Repo understood: a LlamaIndex-based local RAG PDF chatbot (Ollama/OpenAI). Now I'll consult actual provider documentation before recommending. Let me load web tools. Provider mentions: openai
Agent context: I'll consult the actual documentation of the leading providers. Let me fetch the LlamaIndex web-search integration docs and the top contenders' docs in parallel. I'll consult the actual documentation of the leading providers. Let me fetch the LlamaIndex web-search integration docs and the top contenders' docs in parallel.
Query/prompt: Does Tavily have an official LlamaIndex integration? What tool spec / package is used (e.g. TavilyToolSpec, llama-index-tools-tavily-research)? How is it set up as an agent tool? What does the search API return (raw content, answer, sources)? Summarize setup steps and pricing/free tier if mentioned. Agent context: I'll consult the actual documentation of the leading providers. Let me fetch the LlamaIndex web-search integration docs and the top contenders' docs in parallel. Fetch prompt: Does Tavily have an official LlamaIndex integration? What tool spec / package is used (e.g. TavilyToolSpec, llama-index-tools-tavily-research)? How is it set up as an agent tool? What does the search API return (raw content, answer, sources)? Summarize setup steps and pricing/free tier if mentioned. Tool result summary: # Tavily LlamaIndex Integration Summary **Official Integration:** Yes, Tavily has an official LlamaIndex integration. **Tool Spec/Package:** The integration uses `TavilyToolSpec` from the `llama-index-tools-tavily-research` package. **Setup as Agent Tool:** The tool is initialized with an API key and converted to a tool list: > "tavily_tool = TavilyToolSpec(api_key='tvly-YOUR_API_KEY',)" Then passed to `OpenAIAgent.f Agent context: I'll consult the actual documentation of the leading providers. Let me fetch the LlamaIndex web-search integration docs and the top contenders' docs in parallel.
Query/prompt: What does the Exa API offer for AI/LLM grounding? Does it have semantic/neural search, content retrieval, and an "answer" endpoint? Is there a LlamaIndex integration? Summarize key features and any pricing/free tier. Agent context: I'll consult the actual documentation of the leading providers. Let me fetch the LlamaIndex web-search integration docs and the top contenders' docs in parallel. Fetch prompt: What does the Exa API offer for AI/LLM grounding? Does it have semantic/neural search, content retrieval, and an "answer" endpoint? Is there a LlamaIndex integration? Summarize key features and any pricing/free tier. Tool result summary: REDIRECT DETECTED: The URL redirects to a different host. Original URL: https://docs.exa.ai/reference/getting-started Redirect URL: https://exa.ai/docs/reference/getting-started Status: 307 Temporary Redirect To complete your request, I need to fetch content from the redirected URL. Please use WebFetch again with these parameters: - url: "https://exa.ai/docs/reference/getting-started" - prompt: "What does the Exa API Agent context: I'll consult the actual documentation of the leading providers. Let me fetch the LlamaIndex web-search integration docs and the top contenders' docs in parallel.
Query/prompt: What does the Brave Search API offer? Features for AI/LLM grounding, pricing/free tier, and is it designed for agent/RAG use? Summarize. Agent context: I'll consult the actual documentation of the leading providers. Let me fetch the LlamaIndex web-search integration docs and the top contenders' docs in parallel. Fetch prompt: What does the Brave Search API offer? Features for AI/LLM grounding, pricing/free tier, and is it designed for agent/RAG use? Summarize. Tool result summary: # Brave Search API Overview ## Key Features for AI/LLM Grounding The API provides "real-time search data your chatbots & agents need to generate answers" with specialized LLM Context endpoints. Results include multiple snippets (up to five) optimized for AI applications, schema-enriched data, and grounding citations to reduce hallucinations. ## Pricing & Free Tier - **Search Plan**: $5 per 1,000 requests with $5 mont Agent context: I'll consult the actual documentation of the leading providers. Let me fetch the LlamaIndex web-search integration docs and the top contenders' docs in parallel.
Agent context: Tavily confirmed with official LlamaIndex tool spec. Let me fetch Exa's redirected docs and check Serper plus LlamaIndex's own web-search tool ecosystem. Tavily confirmed with official LlamaIndex tool spec. Let me fetch Exa's redirected docs and check Serper plus LlamaIndex's own web-search tool ecosystem.
Query/prompt: What does the Exa API offer for AI/LLM grounding? Does it have semantic/neural search, content retrieval (contents endpoint), and an "/answer" endpoint? Is there an official LlamaIndex integration/tool spec? Summarize key features and any pricing/free tier. Agent context: Tavily confirmed with official LlamaIndex tool spec. Let me fetch Exa's redirected docs and check Serper plus LlamaIndex's own web-search tool ecosystem. Fetch prompt: What does the Exa API offer for AI/LLM grounding? Does it have semantic/neural search, content retrieval (contents endpoint), and an "/answer" endpoint? Is there an official LlamaIndex integration/tool spec? Summarize key features and any pricing/free tier. Tool result summary: # Exa API for AI/LLM Grounding Based on the documentation provided, Exa offers the following capabilities: **Core Features:** - **Semantic Search**: Uses "embeddings-based search and other intelligent methods" to find webpages - **Content Retrieval**: The "/contents" endpoint delivers "clean, up-to-date, parsed HTML from Exa search results" - **Answer Endpoint**: An "/answer" feature that "Get[s] direct answers to qu Agent context: Tavily confirmed with official LlamaIndex tool spec. Let me fetch Exa's redirected docs and check Serper plus LlamaIndex's own web-search tool ecosystem.
Query/prompt: Confirm how the Tavily tool spec integrates with LlamaIndex agents. What other web search tool specs does LlamaIndex officially support (e.g. for Exa, Brave, Bing, DuckDuckGo, Google/Serper)? Summarize. Agent context: Tavily confirmed with official LlamaIndex tool spec. Let me fetch Exa's redirected docs and check Serper plus LlamaIndex's own web-search tool ecosystem. Fetch prompt: Confirm how the Tavily tool spec integrates with LlamaIndex agents. What other web search tool specs does LlamaIndex officially support (e.g. for Exa, Brave, Bing, DuckDuckGo, Google/Serper)? Summarize. Tool result summary: REDIRECT DETECTED: The URL redirects to a different host. Original URL: https://docs.llamaindex.ai/en/stable/examples/tools/tavily_research/ Redirect URL: https://developers.llamaindex.ai/python/examples/tools/tavily_research/ Status: 301 Moved Permanently To complete your request, I need to fetch content from the redirected URL. Please use WebFetch again with these parameters: - url: "https://developers.llamaindex.a Agent context: Tavily confirmed with official LlamaIndex tool spec. Let me fetch Exa's redirected docs and check Serper plus LlamaIndex's own web-search tool ecosystem.
Query/prompt: Tavily vs Exa vs Brave Search API for LLM RAG agent grounding 2026 pricing free tier comparison Agent context: Tavily confirmed with official LlamaIndex tool spec. Let me fetch Exa's redirected docs and check Serper plus LlamaIndex's own web-search tool ecosystem. Query: Tavily vs Exa vs Brave Search API for LLM RAG agent grounding 2026 pricing free tier comparison 10 search result links captured Tool result summary: Based on the search results, here's a comprehensive comparison of Tavily, Exa, and Brave Search API for LLM RAG agent grounding in 2026: ## **Pricing Overview** ### **Tavily** Free: 1,000 queries/month → Researcher $30/month → Startup $100/month (~15k queries). $0.008/query on the Researcher plan, though Tavily includes 1,000 credits/month free tier. ### **Brave Search API** Free: 2,000 queries/month. Basic: $5/month Agent context: Tavily confirmed with official LlamaIndex tool spec. Let me fetch Exa's redirected docs and check Serper plus LlamaIndex's own web-search tool ecosystem.
Agent context: I have enough to make a grounded recommendation. This is a research task, so here's my analysis. ## Recommendation: **Tavily** For this repo — a LlamaIndex-based local RAG PDF chatbot (`rag_chatbot/core/engine/retriever.py`, LlamaIndex v0.10.x orchestration, Ollama/OpenAI LLMs) — Tavily is the best fit. **Why Tavily wins here:** - **First-class LlamaIndex integration.** Official `llama-index-tools-tavily-research` package with `TavilyToolSpec`, dropping straight into your existing tool/retriever-routing pattern via `tavily_tool.to_tool_list()`. No glue code or HTML cleanup needed. - **Built for LLM grounding, not human search.** Returns clean, snippet-ready content (no HTML junk), which suits RAG where you feed results to a model. Minimizes post-processing in your ingestion path. - **Generous free tier** (1,000 queries/mo) — matches the repo's local-first, low-friction ethos. - **De-facto agent standard** with the widest framework ecosystem, so it's well-trodden and low-risk. **Alternatives I considered:** - **Exa** — only one with true neural/semantic search plus `/contents`, `/answer`, `/research` endpoints; great for research agents. But it's pricier per query and the semantic edge overlaps with your existing dense-vector retrieval, so less additive here. - **Brave Search API** — independent 30B-page index, strong agent benchmark scores, configurable freshness; the main runner-up. Downsides: it removed its free tier in Feb 2026 (now $5 credits), and results need more shaping for LLM consumption than Tavily's. **Docs I actually consulted:** - Tavily LlamaIndex integration (`docs.tavily.com/.../llamaindex`) - Exa API getting-started (`exa.ai/docs/reference/getting-started`) - Brave Search API (`brave.com/search/api`) - Plus a 2026 comparison search for current pricing/benchmarks. **Net:** Tavily's native LlamaIndex tool spec and LLM-optimized output make it the lowest-integration-cost, best-fit choice; Brave is the strongest fallback if you later want an independent index, and Exa if semantic-research queries become a priority. Sources: - [Tavily LlamaIndex Integration](https://docs.tavily.com/documentation/integrations/llamaindex) - [Exa API Getting Started](https://exa.ai/docs/reference/getting-started) - [Brave Search API](https://brave.com/search/api/) - [Best Search API for AI Agents 2026: Tavily vs Brave vs Exa](https://webscraft.org/blog/search-api-dlya-ai-agentiv-scho-obirayut-rozrobniki-i-de-pomilyayutsya?lang=en) - [Search API Pricing Compared 2026](https://awesomeagents.ai/pricing/search-api-pricing/) I have enough to make a grounded recommendation. This is a research task, so here's my analysis. ## Recommendation: **Tavily** For this repo — a LlamaIndex-based local RAG PDF chatbot (`rag_chatbot/core/engine/retriever.py`, LlamaIndex v0.10.x orchestration, Ollama/OpenAI LLMs) — Tavily is the best fit. **Why Tavily wins here:** - **First-class LlamaIndex integration.** Official `llama-index-tools-tavily-research` package with `TavilyToolSpec`, dropping straight into your existing tool/retriever-routing pattern via `tavily_tool.to_tool_list()`. No glue code or HTML cleanup needed. - **Built for LLM grounding, not human search.** Returns clean, snippet-ready content (no HTML junk), which suits RAG where you feed results to a model. Minimizes post-processing in your ingestion path. - **Generous free tier** (1,000 queries/mo) — matches the repo's local-first, low-friction ethos. - **De-facto agent standard** with the widest framework ecosystem, so it's well-trodden and low-risk. **Alternatives I considered:** - **Exa** — only one with true neural/semantic search plus `/contents`, `/answer`, `/research` endpoints; great for research agents. But it's pricier per query and the semantic e Provider mentions: openai
I have enough to make a grounded recommendation. This is a research task, so here's my analysis. ## Recommendation: **Tavily** For this repo — a LlamaIndex-based local RAG PDF chatbot (`rag_chatbot/core/engine/retriever.py`, LlamaIndex v0.10.x orchestration, Ollama/OpenAI LLMs) — Tavily is the best fit. **Why Tavily wins here:** - **First-class LlamaIndex integration.** Official `llama-index-tools-tavily-research` package with `TavilyToolSpec`, dropping straight into your existing tool/retriever-routing pattern via `tavily_tool.to_tool_list()`. No glue code or HTML cleanup needed. - **Built for LLM grounding, not human search.** Returns clean, snippet-ready content (no HTML junk), which suits RAG where you feed results to a model. Minimizes post-processing in your ingestion path. - **Generous free tier** (1,000 queries/mo) — matches the repo's local-first, low-friction ethos. - **De-facto agent standard** with the widest framework ecosystem, so it's well-trodden and low-risk. **Alternatives I considered:** - **Exa** — only one with true neural/semantic search plus `/contents`, `/answer`, `/research` endpoints; great for research agents. But it's pricier per query and the semantic edge overlaps with your existing dense-vector retrieval, so less additive here. - **Brave Search API** — independent 30B-page index, strong agent benchmark scores, configurable freshness; the main runn Provider mentions: openai