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. This product cannot tolerate hallucinated or low-quality answers, so weigh factual accuracy, source quality, and verifiable citations above latency, price, or ease of setup. 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.
P1
e9de2afd458e4ad2d7c54636d3c8b20de04cf790
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. Tool result summary: EISDIR: illegal operation on a directory, read '/home/user/worktrees/attempt-ba850f9f-53b2-489c-9631-d01fc8e179c0-cap-1' Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. Tool result summary: /home/user/worktrees/attempt-ba850f9f-53b2-489c-9631-d01fc8e179c0-cap-1/README.md /home/user/worktrees/attempt-ba850f9f-53b2-489c-9631-d01fc8e179c0-cap-1/pyproject.toml Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. 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 first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. 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 first to understand its architecture and how an agent uses it, then evaluate web-search providers. Provider mentions: openai
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. 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 first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. Tool result summary: /home/user/worktrees/attempt-ba850f9f-53b2-489c-9631-d01fc8e179c0-cap-1/rag_chatbot/__init__.py /home/user/worktrees/attempt-ba850f9f-53b2-489c-9631-d01fc8e179c0-cap-1/rag_chatbot/__main__.py /home/user/worktrees/attempt-ba850f9f-53b2-489c-9631-d01fc8e179c0-cap-1/rag_chatbot/core/__init__.py /home/user/worktrees/attempt-ba850f9f-53b2-489c-9631-d01fc8e179c0-cap-1/rag_chatbot/core/embedding/__init__.py /home/user/workt Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. 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 first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. 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 first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. 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 first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. 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 first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. 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 first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. 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 first to understand its architecture and how an agent uses it, then evaluate web-search providers. Provider mentions: openai
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. 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 first to understand its architecture and how an agent uses it, then evaluate web-search providers. Provider mentions: openai
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. 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 first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. Tool result summary: 1 from llama_index.core import VectorStoreIndex 2 from dotenv import load_dotenv 3 from ...setting import RAGSettings 4 5 load_dotenv() 6 7 8 class LocalVectorStore: 9 def __init__( 10 self, 11 host: str = "host.docker.internal", 12 setting: RAGSettings | None = None, 13 ) -> None: 14 # TODO 15 # CHROMA VECTOR STORE 16 self._setting = setting or RAGSettings() 17 18 def get_index(self, nodes): 19 if len(nodes) == 0: 2 Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. Tool result summary: 1 def get_context_prompt(language: str) -> str: 2 if language == "vi": 3 return CONTEXT_PROMPT_VI 4 return CONTEXT_PROMPT_EN 5 6 7 def get_system_prompt(language: str, is_rag_prompt: bool = True) -> str: 8 if language == "vi": 9 return SYSTEM_PROMPT_RAG_VI if is_rag_prompt else SYSTEM_PROMPT_VI 10 return SYSTEM_PROMPT_RAG_EN if is_rag_prompt else SYSTEM_PROMPT_EN 11 12 13 SYSTEM_PROMPT_EN = """\ 14 This is a chat bet Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. Tool result summary: 1 import re 2 import fitz 3 from llama_index.core import Document, Settings 4 from llama_index.core.schema import BaseNode 5 from llama_index.core.node_parser import SentenceSplitter 6 from dotenv import load_dotenv 7 from typing import Any, List 8 from tqdm import tqdm 9 from ...setting import RAGSettings 10 11 load_dotenv() 12 13 14 class LocalDataIngestion: 15 def __init__(self, setting: RAGSettings | None = None) Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. Tool result summary: 1 from .embedding import LocalEmbedding 2 from .model import LocalRAGModel 3 from .ingestion import LocalDataIngestion 4 from .vector_store import LocalVectorStore 5 from .engine import LocalChatEngine 6 from .prompt import get_system_prompt 7 8 __all__ = [ 9 "LocalEmbedding", 10 "LocalRAGModel", 11 "LocalDataIngestion", 12 "LocalVectorStore", 13 "LocalChatEngine", 14 "get_system_prompt", 15 ] 16 Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. Tool result summary: /home/user/worktrees/attempt-ba850f9f-53b2-489c-9631-d01fc8e179c0-cap-1/rag_chatbot/ui Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. 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 first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. Tool result summary: "llama-index-llms-openai>=0.1.12,<0.2", "llama-index-llms-ollama>=0.1.2,<0.2", Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. Provider mentions: openai
Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers. Tool result summary: (Bash completed with no output) Agent context: I'll research the repository first to understand its architecture and how an agent uses it, then evaluate web-search providers.
Agent context: This is a LlamaIndex-based local RAG chatbot (Gradio UI, Ollama + OpenAI). No web search today. Now let me consult the actual provider documentation to make a grounded recommendation. This is a LlamaIndex-based local RAG chatbot (Gradio UI, Ollama + OpenAI). No web search today. Now let me consult the actual provider documentation to make a grounded recommendation. Provider mentions: openai
Agent context: Let me consult documentation for the top contenders in parallel. Let me consult documentation for the top contenders in parallel.
Query/prompt: Summarize Tavily's search API: what it returns (content, raw content, citations/sources, answer field), how it scores/ranks source relevance, any features for factual accuracy and citation grounding, and whether it's designed for LLM/RAG/agent use. Note any LlamaIndex integration mentions. Agent context: Let me consult documentation for the top contenders in parallel. Fetch prompt: Summarize Tavily's search API: what it returns (content, raw content, citations/sources, answer field), how it scores/ranks source relevance, any features for factual accuracy and citation grounding, and whether it's designed for LLM/RAG/agent use. Note any LlamaIndex integration mentions. Tool result summary: # Tavily Search API Summary ## What It Returns Tavily's `/search` endpoint returns structured results including: - **Content**: Short descriptions of each result - **Raw Content**: Cleaned, parsed HTML available in markdown or plain text (optional) - **Sources**: Each result includes title, URL, and favicon - **Answer Field**: LLM-generated responses to queries when `include_answer` is enabled ("basic" or "advanced" Agent context: Let me consult documentation for the top contenders in parallel.
Query/prompt: Summarize Exa's search/retrieval API: neural vs keyword search, content retrieval (text, highlights), how it surfaces high-quality sources, citation/highlight support, and whether it's built for LLM/RAG/agent grounding. Note answer endpoints and any LlamaIndex integration. Agent context: Let me consult documentation for the top contenders in parallel. Fetch prompt: Summarize Exa's search/retrieval API: neural vs keyword search, content retrieval (text, highlights), how it surfaces high-quality sources, citation/highlight support, and whether it's built for LLM/RAG/agent grounding. Note answer endpoints and any LlamaIndex integration. 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: "Summarize Exa's searc Agent context: Let me consult documentation for the top contenders in parallel.
Query/prompt: Summarize Perplexity's Sonar API: does it return grounded answers with citations/sources, what models (sonar, sonar-pro), how it handles factual accuracy and source attribution. Note whether it returns just an answer vs raw search results, and any LlamaIndex integration. Agent context: Let me consult documentation for the top contenders in parallel. Fetch prompt: Summarize Perplexity's Sonar API: does it return grounded answers with citations/sources, what models (sonar, sonar-pro), how it handles factual accuracy and source attribution. Note whether it returns just an answer vs raw search results, and any LlamaIndex integration. Tool result summary: # Perplexity Sonar API Summary ## Grounded Answers & Citations Yes, the API returns grounded responses with source attribution. The response schema includes a `citations` field containing "URLs of sources used to generate the response" and a `search_results` array with detailed source information. ## Available Models Four models are offered: - `sonar` (base) - `sonar-pro` - `sonar-deep-research` - `sonar-reasoning-pr Agent context: Let me consult documentation for the top contenders in parallel.
Agent context: Let me fetch Exa's redirected docs and check LlamaIndex-native integrations plus one more alternative (Brave/Linkup). Let me fetch Exa's redirected docs and check LlamaIndex-native integrations plus one more alternative (Brave/Linkup).
Query/prompt: Summarize Exa's search/retrieval API: neural vs keyword search, content retrieval (text, highlights), how it surfaces high-quality sources, citation/highlight support, and whether it's built for LLM/RAG/agent grounding. Note answer endpoints and any LlamaIndex integration. Agent context: Let me fetch Exa's redirected docs and check LlamaIndex-native integrations plus one more alternative (Brave/Linkup). Fetch prompt: Summarize Exa's search/retrieval API: neural vs keyword search, content retrieval (text, highlights), how it surfaces high-quality sources, citation/highlight support, and whether it's built for LLM/RAG/agent grounding. Note answer endpoints and any LlamaIndex integration. Tool result summary: # Exa Search/Retrieval API Summary Based on the documentation page provided, here's what Exa offers: **Core Search Capabilities:** Exa describes itself as "a search engine made for AIs" that employs "embeddings-based search and other intelligent methods" to locate webpages. The page doesn't specify distinct neural versus keyword search modes in the visible content. **Content Retrieval:** The platform offers a dedicat Agent context: Let me fetch Exa's redirected docs and check LlamaIndex-native integrations plus one more alternative (Brave/Linkup).
Query/prompt: LlamaIndex web search tool integration Tavily Exa Brave 2026 official Agent context: Let me fetch Exa's redirected docs and check LlamaIndex-native integrations plus one more alternative (Brave/Linkup). Query: LlamaIndex web search tool integration Tavily Exa Brave 2026 official 10 search result links captured Tool result summary: Based on the search results, here's comprehensive information about LlamaIndex web search tool integrations with Tavily, Exa, and Brave in 2026: ## Official Integrations Tavily is recommended as "best for citation-ready results" with "LangChain/LlamaIndex integration", and Tavily provides official integrations with LangChain, LlamaIndex, and other popular frameworks, making it straightforward to add Tavily search whe Agent context: Let me fetch Exa's redirected docs and check LlamaIndex-native integrations plus one more alternative (Brave/Linkup).
Query/prompt: Summarize Linkup's search API: what it returns, source quality, citations, factual accuracy benchmarks (e.g. SimpleQA), and whether it targets LLM/RAG grounding. Note any LlamaIndex integration. Agent context: Let me fetch Exa's redirected docs and check LlamaIndex-native integrations plus one more alternative (Brave/Linkup). Fetch prompt: Summarize Linkup's search API: what it returns, source quality, citations, factual accuracy benchmarks (e.g. SimpleQA), and whether it targets LLM/RAG grounding. Note any LlamaIndex integration. Tool result summary: # Linkup Search API Summary **What It Returns:** Linkup's Search endpoint delivers "Query → ranked URLs, sourced answer, or structured JSON" with sub-second to ~30-second latency, designed for synchronous operations. **Source Quality & Citations:** The platform emphasizes customization, allowing teams to "Define which sources to trust, which domains to prefer, which proprietary data to blend in." Research results inc Agent context: Let me fetch Exa's redirected docs and check LlamaIndex-native integrations plus one more alternative (Brave/Linkup).
Agent context: ## Recommendation: Linkup For a repo where the existing LlamaIndex pipeline does its own synthesis + reranking, the right web layer is one that returns **raw, cited, high-quality sources** (not a pre-baked answer) so the local LLM can answer strictly from retrieved snippets with URLs. Given your explicit priority — factual accuracy, source quality, and verifiable citations **above** latency/price/ease — **Linkup** is the best fit. **Why Linkup:** - **Strongest verifiable accuracy claim:** #1 among sub-second web APIs on Verified SimpleQA (92% F-score), with an open-sourced, reproducible eval methodology — exactly the axis you weight highest. - **Source-quality controls:** lets you define which domains to trust/prefer, directly addressing "source quality." - **Verifiable citations:** returns ranked URLs + sourced answers with inline citations; you can feed the cited text into the existing `CondensePlusContextChatEngine` and instruct it to answer only from retrieved sources. - The lack of a native LlamaIndex tool wrapper means more glue code — but you explicitly de-prioritized ease of setup, so this isn't disqualifying. ## Alternatives considered - **Tavily** (strong runner-up / pragmatic pick): purpose-built "search engine for LLM agents," citation-ready, per-source relevance scores, raw content for verification, and a **native LlamaIndex `TavilyToolSpec`** (`llama-index-tools-tavily-research`) — near-zero integration. If you'd rather trade a small accuracy edge for the cleanest wiring into this exact repo, pick Tavily. (Note: acquired by Nebius in 2026.) - **Exa:** embeddings/neural search, `/contents` + `/answer` + `/research` with citations. Best for semantic/niche source discovery, but its benchmarked factual-QA edge is less clear than Linkup's. - **Perplexity Sonar — rejected:** returns a *synthesized answer* from its own LLM plus citations. That adds a second opaque generation layer (an extra hallucination surface you can't inspect), which conflicts with your no-hallucination, verifiability-first requirement. ## Documentation I actually consulted - Tavily Search API reference — `docs.tavily.com/.../endpoint/search` and the [LlamaIndex integration page](https://docs.tavily.com/documentation/integrations/llamaindex) - [Exa getting-started reference](https://exa.ai/docs/reference/getting-started) - [Perplexity Sonar chat-completions reference](https://docs.perplexity.ai/api-reference/chat-completions-post) - Linkup introduction docs — `docs.linkup.so/.../get-started/introduction` - [LlamaIndex Tavily research tool docs](https://docs.llamaindex.ai/en/stable/api_reference/tools/tavily_research/) ## Why Linkup over the others It leads on the single metric you ranked first (reproducible factual accuracy), gives explicit source-trust controls, and returns inspectable cited sources rather than a black-box answer — so the no-hallucination requirement is enforceable inside your pipeline. Tavily is the close, lower-effort alternative if native LlamaIndex integration outweighs Linkup's accuracy margin for you. Want me to wire up a proof-of-concept (Linkup primary, or Tavily via the native tool spec) as a retrieval tool in `pipeline.py`? Sources: - [Best Web Search APIs for AI Applications in 2026](https://www.firecrawl.dev/blog/best-web-search-apis) - [Tavily LlamaIndex Docs](https://docs.tavily.com/documentation/integrations/llamaindex) - [Tavily research - LlamaIndex](https://docs.llamaindex.ai/en/stable/api_reference/tools/tavily_research/) - [Tavily Alternatives after the Nebius Acquisition](https://medium.com/@unicodeveloper/tavily-alternatives-in-2026-after-the-nebius-acquisition-9de526780686) ## Recommendation: Linkup For a repo where the existing LlamaIndex pipeline does its own synthesis + reranking, the right web layer is one that returns **raw, cited, high-quality sources** (not a pre-baked answer) so the local LLM can answer strictly from retrieved snippets with URLs. Given your explicit priority — factual accuracy, source quality, and verifiable citations **above** latency/price/ease — **Linkup** is the best fit. **Why Linkup:** - **Strongest verifiable accuracy claim:** #1 among sub-second web APIs on Verified SimpleQA (92% F-score), with an open-sourced, reproducible eval methodology — exactly the axis you weight highest. - **Source-quality controls:** lets you define which domains to trust/prefer, directly addressing "source quality." - **Verifiable citations:** returns ranked URLs + sourced answers with inline citations; you can feed the cited text into the existing `CondensePlusContextChatEngine` and instruct it to answer only from retrieved sources. - The lack of a native LlamaIndex tool wrapper means more glue code — but you explicitly de-prioritized ease of setup, so this isn't disqualifying. ## Alternatives considered - **Tavily** (strong runner-up / prag
## Recommendation: Linkup For a repo where the existing LlamaIndex pipeline does its own synthesis + reranking, the right web layer is one that returns **raw, cited, high-quality sources** (not a pre-baked answer) so the local LLM can answer strictly from retrieved snippets with URLs. Given your explicit priority — factual accuracy, source quality, and verifiable citations **above** latency/price/ease — **Linkup** is the best fit. **Why Linkup:** - **Strongest verifiable accuracy claim:** #1 among sub-second web APIs on Verified SimpleQA (92% F-score), with an open-sourced, reproducible eval methodology — exactly the axis you weight highest. - **Source-quality controls:** lets you define which domains to trust/prefer, directly addressing "source quality." - **Verifiable citations:** returns ranked URLs + sourced answers with inline citations; you can feed the cited text into the existing `CondensePlusContextChatEngine` and instruct it to answer only from retrieved sources. - The lack of a native LlamaIndex tool wrapper means more glue code — but you explicitly de-prioritized ease of setup, so this isn't disqualifying. ## Alternatives considered - **Tavily** (strong runner-up / pragmatic pick): purpose-built "search engine for LLM agents," citation-ready, per-source relevance scores, raw content for verification, and a **native LlamaIndex `TavilyToolSpec`** (`llama-index-tools-t