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. First enumerate every credible managed provider you can identify — including newer entrants and non-US / European options — then narrow to the single best fit. 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.
P4
e9de2afd458e4ad2d7c54636d3c8b20de04cf790
Agent context: I’ll inspect the repo shape first so the provider choice is grounded in how this agent is built, then I’ll check current provider docs and compare the managed options against that fit. I’ll inspect the repo shape first so the provider choice is grounded in how this agent is built, then I’ll check current provider docs and compare the managed options against that fit.
Agent context: I’ll inspect the repo shape first so the provider choice is grounded in how this agent is built, then I’ll check current provider docs and compare the managed options against that fit.
Agent context: I’ll inspect the repo shape first so the provider choice is grounded in how this agent is built, then I’ll check current provider docs and compare the managed options against that fit. exit code 0 Output: /home/user/worktrees/attempt-a9e2b4d1-33dd-490b-b675-187ee25f47c8-cap-1 /bin/bash: line 1: rg: command not found
Agent context: I’ll inspect the repo shape first so the provider choice is grounded in how this agent is built, then I’ll check current provider docs and compare the managed options against that fit.
Agent context: I’ll inspect the repo shape first so the provider choice is grounded in how this agent is built, then I’ll check current provider docs and compare the managed options against that fit. exit code 0
Agent context: I’ll inspect the repo shape first so the provider choice is grounded in how this agent is built, then I’ll check current provider docs and compare the managed options against that fit.
Agent context: I’ll inspect the repo shape first so the provider choice is grounded in how this agent is built, then I’ll check current provider docs and compare the managed options against that fit. exit code 0 Output: ./README.md ./pyproject.toml
Agent context: The workspace is small and `rg` is not installed here, so I’m falling back to `find`/standard shell reads. Next I’m checking the Python package layout and agent entry points. The workspace is small and `rg` is not installed here, so I’m falling back to `find`/standard shell reads. Next I’m checking the Python package layout and agent entry points.
Agent context: The workspace is small and `rg` is not installed here, so I’m falling back to `find`/standard shell reads. Next I’m checking the Python package layout and agent entry points.
Agent context: The workspace is small and `rg` is not installed here, so I’m falling back to `find`/standard shell reads. Next I’m checking the Python package layout and agent entry points. exit code 0 Output: # 🤖 Chat with multiple PDFs locally  ## 📖 Table of Contents - [📖 Table of Contents](#-table-of-contents) - [⭐️ Key Features](#️-key-features) - [💡 Idea (Experiment)](#-idea-experiment) - [💻 Setup](#-setup) - [1. Kaggle (Recommended)](#1-kaggle-recommended) - [2. Local](#2-local) - [2.1. Clone project](#21-clone-project) - [2.2 Install](#22-install) - [2.3 Run](#23-run) - [3. Go to: `http://0.0.0.0:7860/` or Ngrok link after setup completed](#3-go-to-http00007860-or-ngrok-link-after-setup-completed) - [🌟 Star History](#-star-history) ## ⭐️ Key Features - Easy to run on `Local` or `Kaggle` (new) - Using any model from `Huggingface` and `Ollama` - Process multiple PDF inputs. - Chat with multiples languages (Coming soon). - Simple UI with `Gradio`. ## 💡 Idea (Experiment)   ## 💻 Setup ##
Agent context: The workspace is small and `rg` is not installed here, so I’m falling back to `find`/standard shell reads. Next I’m checking the Python package layout and agent entry points.
Agent context: The workspace is small and `rg` is not installed here, so I’m falling back to `find`/standard shell reads. Next I’m checking the Python package layout and agent entry points. exit code 0 Output: .dockerignore .git .github/actions/build-python/action.yaml .github/workflows/ci.yaml .gitignore Dockerfile LICENSE Makefile README.md assets/bot.png assets/demo.png assets/rag-flow.svg assets/retriever.svg assets/user.png docker-compose.yml notebooks/kaggle.ipynb pyproject.toml rag_chatbot/__init__.py rag_chatbot/__main__.py rag_chatbot/core/__init__.py rag_chatbot/core/embedding/__init__.py rag_chatbot/core/embedding/embedding.py rag_chatbot/core/engine/__init__.py rag_chatbot/core/engine/engine.py rag_chatbot/core/engine/retriever.py rag_chatbot/core/ingestion/__init__.py rag_chatbot/core/ingestion/ingestion.py rag_chatbot/core/model/__init__.py rag_chatbot/core/model/model.py rag_chatbot/core/prompt/__init__.py rag_chatbot/core/prompt/qa_prompt.py rag_chatbot/core/prompt/query_gen_prompt.py rag_chatbot/core/prompt/select_prompt.py rag_chatbot/core/vector_store/__init__.py rag_chatbot
Agent context: The workspace is small and `rg` is not installed here, so I’m falling back to `find`/standard shell reads. Next I’m checking the Python package layout and agent entry points.
Agent context: The workspace is small and `rg` is not installed here, so I’m falling back to `find`/standard shell reads. Next I’m checking the Python package layout and agent entry points. exit code 0 Output: [project] name = "rag-chatbot" version = "0.1.0" description = "" authors = [{ name = "Võ Đình Đạt", email = "vodinhdat03@gmail.com" }] requires-python = ">=3.11" readme = "README.md" dependencies = [ "gradio<5", "python-dotenv>=1.0.1,<2", "llama-index-embeddings-huggingface>=0.1.4,<0.2", "llama-index-llms-openai>=0.1.12,<0.2", "llama-index-vector-stores-chroma>=0.1.6,<0.2", "llama-index-llms-ollama>=0.1.2,<0.2", "llama-index-readers-file>=0.1.11,<0.2", "llama-index>=0.10.22,<0.11", "transformers>=4.39.1,<5", "torch", "llama-index-callbacks-wandb>=0.1.2,<0.2", "llama-index-retrievers-bm25>=0.1.3,<0.2", "pymupdf>=1.24.3,<2", "tqdm>=4.66.4,<5", "requests>=2.32.3,<3", "pandas>=2.2.3,<3", "sentence-transformers>=3.2.0,<4", "pydantic==2.8.2", ] [dependency-groups] dev = [ "ruff>=0.6.9,<0.7", "deptry>=0.20.0,<0.21", "pytest>=8.3.3,<9", ] [build-system] requires = ["hatchling"] build-backend = Provider mentions: openai
Agent context: The project is a Python/Gradio PDF RAG chatbot built on LlamaIndex 0.10 with local Ollama/OpenAI support, Chroma, and `requests` already present. I’m reading the retrieval and prompt path now to see whether web results should enter as documents, retrieval nodes, or a separate tool. The project is a Python/Gradio PDF RAG chatbot built on LlamaIndex 0.10 with local Ollama/OpenAI support, Chroma, and `requests` already present. I’m reading the retrieval and prompt path now to see whether web results should enter as documents, retrieval nodes, or a separate tool. Provider mentions: openai
Agent context: The project is a Python/Gradio PDF RAG chatbot built on LlamaIndex 0.10 with local Ollama/OpenAI support, Chroma, and `requests` already present. I’m reading the retrieval and prompt path now to see whether web results should enter as documents, retrieval nodes, or a separate tool.
Agent context: The project is a Python/Gradio PDF RAG chatbot built on LlamaIndex 0.10 with local Ollama/OpenAI support, Chroma, and `requests` already present. I’m reading the retrieval and prompt path now to see whether web results should enter as documents, retrieval nodes, or a separate tool. exit code 0 Output: from typing import List from dotenv import load_dotenv from llama_index.core.retrievers import ( BaseRetriever, QueryFusionRetriever, VectorIndexRetriever, RouterRetriever, ) from llama_index.core.callbacks.base import CallbackManager from llama_index.core.retrievers.fusion_retriever import FUSION_MODES from llama_index.core.postprocessor import SentenceTransformerRerank from llama_index.core.tools import RetrieverTool from llama_index.core.selectors import LLMSingleSelector from llama_index.core.schema import BaseNode, NodeWithScore, QueryBundle, IndexNode from llama_index.core.llms.llm import LLM from llama_index.retrievers.bm25 import BM25Retriever from llama_index.core import Settings, VectorStoreIndex from ..prompt import get_query_gen_prompt from ...setting import RAGSettings load_dotenv() class TwoStageRetriever(QueryFusionRetriever): def __init__( self, retrievers: List[BaseRetri
Agent context: The project is a Python/Gradio PDF RAG chatbot built on LlamaIndex 0.10 with local Ollama/OpenAI support, Chroma, and `requests` already present. I’m reading the retrieval and prompt path now to see whether web results should enter as documents, retrieval nodes, or a separate tool.
Agent context: The project is a Python/Gradio PDF RAG chatbot built on LlamaIndex 0.10 with local Ollama/OpenAI support, Chroma, and `requests` already present. I’m reading the retrieval and prompt path now to see whether web results should enter as documents, retrieval nodes, or a separate tool. exit code 0 Output: from .core import ( LocalChatEngine, LocalDataIngestion, LocalRAGModel, LocalEmbedding, LocalVectorStore, get_system_prompt, ) from llama_index.core import Settings from llama_index.core.chat_engine.types import StreamingAgentChatResponse from llama_index.core.prompts import ChatMessage, MessageRole class LocalRAGPipeline: def __init__(self, host: str = "host.docker.internal") -> None: self._host = host self._language = "eng" self._model_name = "" self._system_prompt = get_system_prompt("eng", is_rag_prompt=False) self._engine = LocalChatEngine(host=host) self._default_model = LocalRAGModel.set(self._model_name, host=host) self._query_engine = None self._ingestion = LocalDataIngestion() self._vector_store = LocalVectorStore(host=host) Settings.llm = LocalRAGModel.set(host=host) Settings.embed_model = LocalEmbedding.set(host=host) def get_model_name(self): return self._model_name def set_
Agent context: The project is a Python/Gradio PDF RAG chatbot built on LlamaIndex 0.10 with local Ollama/OpenAI support, Chroma, and `requests` already present. I’m reading the retrieval and prompt path now to see whether web results should enter as documents, retrieval nodes, or a separate tool.
Agent context: The project is a Python/Gradio PDF RAG chatbot built on LlamaIndex 0.10 with local Ollama/OpenAI support, Chroma, and `requests` already present. I’m reading the retrieval and prompt path now to see whether web results should enter as documents, retrieval nodes, or a separate tool. exit code 0 Output: from pydantic import BaseModel, Field from typing import List class OllamaSettings(BaseModel): llm: str = Field(default="llama3:8b-instruct-q8_0", description="LLM model") keep_alive: str = Field(default="1h", description="Keep alive time for the server") tfs_z: float = Field(default=1.0, description="TFS normalization factor") top_k: int = Field(default=40, description="Top k sampling") top_p: float = Field(default=0.9, description="Top p sampling") repeat_last_n: int = Field(default=64, description="Repeat last n tokens") repeat_penalty: float = Field(default=1.1, description="Repeat penalty") request_timeout: float = Field(default=300, description="Request timeout") port: int = Field(default=11434, description="Port number") context_window: int = Field(default=8000, description="Context window size") temperature: float = Field(default=0.1, description="Temperature") chat_token_limit:
Agent context: The project is a Python/Gradio PDF RAG chatbot built on LlamaIndex 0.10 with local Ollama/OpenAI support, Chroma, and `requests` already present. I’m reading the retrieval and prompt path now to see whether web results should enter as documents, retrieval nodes, or a separate tool.
Agent context: The project is a Python/Gradio PDF RAG chatbot built on LlamaIndex 0.10 with local Ollama/OpenAI support, Chroma, and `requests` already present. I’m reading the retrieval and prompt path now to see whether web results should enter as documents, retrieval nodes, or a separate tool. exit code 0 Output: from llama_index.core.chat_engine import CondensePlusContextChatEngine, SimpleChatEngine from llama_index.core.memory import ChatMemoryBuffer from llama_index.core.llms.llm import LLM from llama_index.core.schema import BaseNode from typing import List from .retriever import LocalRetriever from ...setting import RAGSettings class LocalChatEngine: def __init__( self, setting: RAGSettings | None = None, host: str = "host.docker.internal" ): super().__init__() self._setting = setting or RAGSettings() self._retriever = LocalRetriever(self._setting) self._host = host def set_engine( self, llm: LLM, nodes: List[BaseNode], language: str = "eng", ) -> CondensePlusContextChatEngine | SimpleChatEngine: # Normal chat engine if len(nodes) == 0: return SimpleChatEngine.from_defaults( llm=llm, memory=ChatMemoryBuffer( token_limit=self._setting.ollama.chat_token_limit ), ) # Chat engine with documents
Agent context: The current query path is not an agent/tool loop; it builds a LlamaIndex chat engine around retrieved nodes and streams the answer. That points toward a provider with a simple search API plus fetched snippets/content that can be injected as transient `TextNode`s, without forcing an LLM vendor change. The current query path is not an agent/tool loop; it builds a LlamaIndex chat engine around retrieved nodes and streams the answer. That points toward a provider with a simple search API plus fetched snippets/content that can be injected as transient `TextNode`s, without forcing an LLM vendor change.
Agent context: The current query path is not an agent/tool loop; it builds a LlamaIndex chat engine around retrieved nodes and streams the answer. That points toward a provider with a simple search API plus fetched snippets/content that can be injected as transient `TextNode`s, without forcing an LLM vendor change.
Agent context: The current query path is not an agent/tool loop; it builds a LlamaIndex chat engine around retrieved nodes and streams the answer. That points toward a provider with a simple search API plus fetched snippets/content that can be injected as transient `TextNode`s, without forcing an LLM vendor change. exit code 0 Output: import re import fitz from llama_index.core import Document, Settings from llama_index.core.schema import BaseNode from llama_index.core.node_parser import SentenceSplitter from dotenv import load_dotenv from typing import Any, List from tqdm import tqdm from ...setting import RAGSettings load_dotenv() class LocalDataIngestion: def __init__(self, setting: RAGSettings | None = None) -> None: self._setting = setting or RAGSettings() self._node_store = {} self._ingested_file = [] def _filter_text(self, text): # Define the regex pattern. pattern = r'[a-zA-Z0-9 \u00C0-\u01B0\u1EA0-\u1EF9`~!@#$%^&*()_\-+=\[\]{}|\\;:\'",.<>/?]+' matches = re.findall(pattern, text) # Join all matched substrings into a single string filtered_text = " ".join(matches) # Normalize the text by removing extra whitespaces normalized_text = re.sub(r"\s+", " ", filtered_text.strip()) return normalized_text def store_node
Agent context: The current query path is not an agent/tool loop; it builds a LlamaIndex chat engine around retrieved nodes and streams the answer. That points toward a provider with a simple search API plus fetched snippets/content that can be injected as transient `TextNode`s, without forcing an LLM vendor change.
Agent context: The current query path is not an agent/tool loop; it builds a LlamaIndex chat engine around retrieved nodes and streams the answer. That points toward a provider with a simple search API plus fetched snippets/content that can be injected as transient `TextNode`s, without forcing an LLM vendor change. exit code 0 Output: def get_context_prompt(language: str) -> str: if language == "vi": return CONTEXT_PROMPT_VI return CONTEXT_PROMPT_EN def get_system_prompt(language: str, is_rag_prompt: bool = True) -> str: if language == "vi": return SYSTEM_PROMPT_RAG_VI if is_rag_prompt else SYSTEM_PROMPT_VI return SYSTEM_PROMPT_RAG_EN if is_rag_prompt else SYSTEM_PROMPT_EN SYSTEM_PROMPT_EN = """\ This is a chat between a user and an artificial intelligence assistant. \ The assistant gives helpful, detailed, and polite answers to the user's questions based on the context. \ The assistant should also indicate when the answer cannot be found in the context.""" SYSTEM_PROMPT_RAG_EN = """\ This is a chat between a user and an artificial intelligence assistant. \ The assistant gives helpful, detailed, and polite answers to the user's questions based on the context. \ The assistant should also indicate when the answer cannot
Agent context: The current query path is not an agent/tool loop; it builds a LlamaIndex chat engine around retrieved nodes and streams the answer. That points toward a provider with a simple search API plus fetched snippets/content that can be injected as transient `TextNode`s, without forcing an LLM vendor change.
Agent context: The current query path is not an agent/tool loop; it builds a LlamaIndex chat engine around retrieved nodes and streams the answer. That points toward a provider with a simple search API plus fetched snippets/content that can be injected as transient `TextNode`s, without forcing an LLM vendor change. exit code 0 Output: import os import shutil import json import sys import time import gradio as gr from dataclasses import dataclass from typing import ClassVar from llama_index.core.chat_engine.types import StreamingAgentChatResponse from .theme import JS_LIGHT_THEME, CSS from ..pipeline import LocalRAGPipeline from ..logger import Logger @dataclass class DefaultElement: DEFAULT_MESSAGE: ClassVar[dict] = {"text": ""} DEFAULT_MODEL: str = "" DEFAULT_HISTORY: ClassVar[list] = [] DEFAULT_DOCUMENT: ClassVar[list] = [] HELLO_MESSAGE: str = "Hi 👋, how can I help you today?" SET_MODEL_MESSAGE: str = "You need to choose LLM model 🤖 first!" EMPTY_MESSAGE: str = "You need to enter your message!" DEFAULT_STATUS: str = "Ready!" CONFIRM_PULL_MODEL_STATUS: str = "Confirm Pull Model!" PULL_MODEL_SCUCCESS_STATUS: str = "Pulling model 🤖 completed!" PULL_MODEL_FAIL_STATUS: str = "Pulling model 🤖 failed!" MODEL_NOT_EXIST
Agent context: The current query path is not an agent/tool loop; it builds a LlamaIndex chat engine around retrieved nodes and streams the answer. That points toward a provider with a simple search API plus fetched snippets/content that can be injected as transient `TextNode`s, without forcing an LLM vendor change. Provider mentions: openai
Agent context: The current query path is not an agent/tool loop; it builds a LlamaIndex chat engine around retrieved nodes and streams the answer. That points toward a provider with a simple search API plus fetched snippets/content that can be injected as transient `TextNode`s, without forcing an LLM vendor change. exit code 0 Output: rag_chatbot/core/embedding/embedding.py:3:import requests rag_chatbot/core/embedding/embedding.py:5:from llama_index.embeddings.openai import OpenAIEmbedding rag_chatbot/core/embedding/embedding.py:32: return OpenAIEmbedding() rag_chatbot/core/embedding/embedding.py:38: return requests.post(f"http://{host}:11434/api/pull", json=payload, stream=True) rag_chatbot/core/embedding/embedding.py:43: data = requests.get(f"http://{host}:11434/api/tags").json() rag_chatbot/core/engine/__init__.py:2:from .retriever import LocalRetriever rag_chatbot/core/engine/__init__.py:4:__all__ = ["LocalChatEngine", "LocalRetriever"] rag_chatbot/core/engine/engine.py:1:from llama_index.core.chat_engine import CondensePlusContextChatEngine, SimpleChatEngine rag_chatbot/core/engine/engine.py:6:from .retriever import LocalRetriever rag_chatbot/core/engine/engine.py:16: self._retriever = LocalRetriever(self._settin Provider mentions: openai
Query/prompt: Exa API documentation search contents highlights autoprompt 2026 Agent context: The current query path is not an agent/tool loop; it builds a LlamaIndex chat engine around retrieved nodes and streams the answer. That points toward a provider with a simple search API plus fetched snippets/content that can be injected as transient `TextNode`s, without forcing an LLM vendor change. Query: Exa API documentation search contents highlights autoprompt 2026 Agent context: The current query path is not an agent/tool loop; it builds a LlamaIndex chat engine around retrieved nodes and streams the answer. That points toward a provider with a simple search API plus fetched snippets/content that can be injected as transient `TextNode`s, without forcing an LLM vendor change. Expanded queries: Exa API documentation search contents highlights autoprompt 2026 | Tavily API documentation search extract crawl 2026 | Brave Search API documentation web search API 2026 | Linkup API documentation web search deep research 2026
Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama.
Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Provider mentions: openai
Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. exit code 0 Output: --- name: "openai-docs" description: "Use when the user asks how to build with OpenAI products or APIs, asks about Codex itself or choosing Codex surfaces, needs up-to-date official documentation with citations, help choosing the latest model for a use case, or model upgrade and prompt-upgrade guidance; use OpenAI docs MCP tools for non-Codex docs questions, use the Codex manual helper first for broad Codex self-knowledge, and restrict fallback browsing to official OpenAI domains." --- # OpenAI Docs Provide authoritative, current guidance from OpenAI developer docs using the developers.openai.com MCP server. "Docs MCP" means `mcp__openaiDeveloperDocs__search_openai_docs` and `mcp__openaiDeveloperDocs__fetch_openai_doc`; for API reference, schema, parameter, or required-field questions, also use `mcp__openaiDeveloperDocs__get_openapi_spec` when available. Official-domain web search is fal Provider mentions: openai
Query/prompt: site:platform.openai.com/docs web search tool Responses API documentation 2026 Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Query: site:platform.openai.com/docs web search tool Responses API documentation 2026 Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Expanded queries: site:platform.openai.com/docs web search tool Responses API documentation 2026 | site:developers.openai.com web search tool Responses API OpenAI documentation Provider mentions: openai
Query/prompt: Firecrawl search API documentation web search extract 2026 Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Query: Firecrawl search API documentation web search extract 2026 Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Expanded queries: Firecrawl search API documentation web search extract 2026 | Jina AI Search API documentation grounding reader 2026 | You.com API docs web search API 2026 | Perplexity API search web citations documentation 2026
Query/prompt: SerpAPI documentation Google Search API 2026 Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Query: SerpAPI documentation Google Search API 2026 Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Expanded queries: SerpAPI documentation Google Search API 2026 | Serper.dev Google Search API documentation 2026 | DataForSEO SERP API documentation search API 2026 | Microsoft Bing Web Search API documentation Azure AI services 2026
Query/prompt: site:google.serper.dev documentation serper API search Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Query: site:google.serper.dev documentation serper API search Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Expanded queries: site:google.serper.dev documentation serper API search | SearchApi.io documentation Google Search API 2026 | Zenserp API documentation Google Search API 2026 | Bright Data SERP API documentation search engine crawler 2026
Query/prompt: Google Custom Search JSON API documentation decommission 2027 new projects unavailable Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Query: Google Custom Search JSON API documentation decommission 2027 new projects unavailable Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Expanded queries: Google Custom Search JSON API documentation decommission 2027 new projects unavailable | Google Programmable Search Element API JSON API decommission 2027 documentation | Google Vertex AI grounding with Google Search documentation 2026 | Gemini API grounding with Google Search documentation 2026
Query/prompt: Azure AI Agent Service Grounding with Bing Search documentation 2026 Microsoft Learn Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Query: Azure AI Agent Service Grounding with Bing Search documentation 2026 Microsoft Learn Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Expanded queries: Azure AI Agent Service Grounding with Bing Search documentation 2026 Microsoft Learn | Microsoft Bing Search APIs retiring August 11 2025 replacement Grounding with Bing Search documentation
Query/prompt: Linkup company France web search API AI documentation Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Query: Linkup company France web search API AI documentation Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Expanded queries: Linkup company France web search API AI documentation | Qwant API web search documentation 2026 developer | Mojeek Search API documentation web search API 2026 | Kagi Search API documentation 2026 FastGPT Universal Summarizer
Query/prompt: Linkup search API company based France AI search API Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Query: Linkup search API company based France AI search API Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Expanded queries: Linkup search API company based France AI search API | site:linkup.so Linkup production-grade web search API AI founded France
Query/prompt: Parallel AI search API documentation web research API 2026 Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Query: Parallel AI search API documentation web research API 2026 Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Expanded queries: Parallel AI search API documentation web research API 2026 | Parallel web search API documentation AI agents task API
Query/prompt: https://platform.openai.com/docs/guides/tools-file-search/ Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Query: https://platform.openai.com/docs/guides/tools-file-search/ Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Provider mentions: openai
Query/prompt: https://docs.tavily.com/ Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Query: https://docs.tavily.com/ Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama.
Query/prompt: 'largest independent index' in https://brave.com/search/api/ Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Query: 'largest independent index' in https://brave.com/search/api/ Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama.
Query/prompt: https://docs.tavily.com/api-reference/endpoint/search Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Query: https://docs.tavily.com/api-reference/endpoint/search Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama.
Query/prompt: https://docs.brightdata.com/scraping-automation/serp-api Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Query: https://docs.brightdata.com/scraping-automation/serp-api Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama.
Query/prompt: Jina AI Search Foundation API documentation s.jina.ai Reader API 2026 Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Query: Jina AI Search Foundation API documentation s.jina.ai Reader API 2026 Agent context: I’m going to include both search APIs and retrieval/crawl APIs in the candidate pool, but I’ll score them against this repo’s actual integration needs: Python, low dependency churn, search plus usable page text/snippets, citation metadata, API-vendor independence from the chat model, and a path that works with local Ollama. Expanded queries: Jina AI Search Foundation API documentation s.jina.ai Reader API 2026 | Jina AI Reader API Search API documentation grounding
Agent context: **Recommendation** Choose **Tavily Search + Extract** as the default managed web-search/retrieval provider for this repo. This repository is a local PDF RAG chatbot using Gradio, LlamaIndex 0.10, Chroma-style local retrieval, Ollama/OpenAI model selection, and a `CondensePlusContextChatEngine` fed by retrieved nodes ([pipeline.py](/home/user/worktrees/attempt-a9e2b4d1-33dd-490b-b675-187ee25f47c8-cap-1/rag_chatbot/pipeline.py:113), [retriever.py](/home/user/worktrees/attempt-a9e2b4d1-33dd-490b-b675-187ee25f47c8-cap-1/rag_chatbot/core/engine/retriever.py:83)). The best integration is not to replace the model with a hosted answer engine. It is to add a web retriever that turns search results into transient LlamaIndex nodes with URL/title/date metadata, then lets the existing answer path synthesize from local PDF nodes plus fresh web nodes. Tavily fits that shape best. Its docs show first-class Python SDK support, plus Search, Extract, Crawl, Map, and Research APIs in one provider; Search can return snippets, raw parsed page content as markdown/text, freshness filters, domain filters, country boosting, news/finance topics, and tunable depth/latency controls. That gives this repo enough current web grounding without forcing users off Ollama or into a different agent framework. Tavily docs: Python SDK and endpoints, Search response and SDK example, search-depth/content/date/domain/raw-content controls. **Provider Universe I Identified** Credible AI-native search/retrieval providers: Tavily, Exa, Brave Search API, Linkup, Parallel, You.com, Perplexity Search/Sonar, Firecrawl, Jina AI Reader/Search, Kagi Search/FastGPT/Summarizer. Credible model-platform grounding providers: OpenAI Responses `web_search`, Google Gemini/Vertex Grounding with Google Search, Microsoft Grounding with Bing Search. Credible SERP/data providers: SerpApi, SearchApi.io, Serper.dev, DataForSEO, Bright Data, Zenserp, Oxylabs SERP Scraper API. Credible crawl/extraction providers that can complement search: Apify, Zyte, ScrapingBee, Crawlbase, Firecrawl, Jina Reader, Bright Data Web Unlocker. Non-US / European options worth noting: Linkup, Mojeek, DataForSEO, Bright Data, Oxylabs, Apify, Qwant-adjacent ecosystem. Mojeek has an official web search API, while Qwant did not look like a stable, public managed API choice from official docs during this pass. **Main Alternatives Considered** **Exa**: Strong AI-native search and content extraction. Its API can search and extract contents from results and supports domains, date filters, text/highlights, deep modes, categories, and structured output. I would pick Exa for research/company/profile-heavy use cases. For this repo, Tavily is more straightforward general web grounding. **Brave Search API**: Strong independent index. Brave describes it as powering agents/chatbots with an independent web index and has an LLM Context endpoint. I like it as a low-level search backend, but Tavily’s built-in extraction/crawl/research surface is a better fit for feeding RAG nodes with clean content. **Linkup**: Best EU/GDPR-oriented contender. Its `/search` is explicitly a web context retrieval tool with sources and supports `fast`, `standard`, `deep`, `searchResults`, `sourcedAnswer`, and structured output. If data sovereignty or EU vendor preference is a hard requirement, Linkup is my alternate pick. **Parallel**: Strong newer entrant for agentic search. Its Search API returns ranked, LLM-optimized excerpts intended to be model input. It looks promising, but Tavily has a simpler current fit for this repo’s conventional Python RAG pipeline. **Firecrawl**: Excellent if the hard problem is page reading/crawling. Its search endpoint combines web search with scraping and can return full markdown content. I would pair it with another search provider for heavy crawling, but not choose it first for general answer grounding. **OpenAI / Google / Microsoft grounding**: OpenAI web search is capable and cited, Gemini has Google Search grounding and tool combinations, and Microsoft’s old Bing Search APIs are retired in favor of Azure agent grounding. All are less ideal here because they couple retrieval to a hosted model/runtime instead of preserving the repo’s local Ollama-first design. **Documentation Actually Consulted** Tavily, Exa, Brave, Linkup, Parallel, You.com, Perplexity, Firecrawl, OpenAI, Google Gemini, Microsoft Bing/Azure grounding, Mojeek, Kagi, DataForSEO, SerpApi, Bright Data, SearchApi.io, and Jina AI docs/search docs. **Implementation Direction** Add a `WebSearchSettings` section with `provider="tavily"`, `api_key_env="TAVILY_API_KEY"`, `max_results`, `search_depth`, `include_raw_content`, and freshness/domain filters. Implement a `TavilyWebRetriever` that calls Tavily Search, converts each result into `TextNode`s with citation metadata, and merges those nodes with `LocalDataIngestion.get_ingested_nodes()` before `LocalChatEngine.set_engine()`. This keeps the current LlamaIndex answer path intact and makes citations available from node metadata. **Recommendation** Choose **Tavily Search + Extract** as the default managed web-search/retrieval provider for this repo. This repository is a local PDF RAG chatbot using Gradio, LlamaIndex 0.10, Chroma-style local retrieval, Ollama/OpenAI model selection, and a `CondensePlusContextChatEngine` fed by retrieved nodes ([pipeline.py](/home/user/worktrees/attempt-a9e2b4d1-33dd-490b-b675-187ee25f47c8-cap-1/rag_chatbot/pipeline.py:113), [retriever.py](/home/user/worktrees/attempt-a9e2b4d1-33dd-490b-b675-187ee25f47c8-cap-1/rag_chatbot/core/engine/retriever.py:83)). The best integration is not to replace the model with a hosted answer engine. It is to add a web retriever that turns search results into transient LlamaIndex nodes with URL/title/date metadata, then lets the existing answer path synthesize from local PDF nodes plus fresh web nodes. Tavily fits that shape best. Its docs show first-class Python SDK support, plus Search, Extract, Crawl, Map, and Research APIs in one provider; Search can return snippets, raw parsed page content as markdown/text, freshness filters, domain filters, country boosting, news/finance topics, and tunable depth/latency controls. That gives this repo enough Provider mentions: openai
**Recommendation** Choose **Tavily Search + Extract** as the default managed web-search/retrieval provider for this repo. This repository is a local PDF RAG chatbot using Gradio, LlamaIndex 0.10, Chroma-style local retrieval, Ollama/OpenAI model selection, and a `CondensePlusContextChatEngine` fed by retrieved nodes ([pipeline.py](/home/user/worktrees/attempt-a9e2b4d1-33dd-490b-b675-187ee25f47c8-cap-1/rag_chatbot/pipeline.py:113), [retriever.py](/home/user/worktrees/attempt-a9e2b4d1-33dd-490b-b675-187ee25f47c8-cap-1/rag_chatbot/core/engine/retriever.py:83)). The best integration is not to replace the model with a hosted answer engine. It is to add a web retriever that turns search results into transient LlamaIndex nodes with URL/title/date metadata, then lets the existing answer path synthesize from local PDF nodes plus fresh web nodes. Tavily fits that shape best. Its docs show first-class Python SDK support, plus Search, Extract, Crawl, Map, and Research APIs in one provider; Search can return snippets, raw parsed page content as markdown/text, freshness filters, domain filters, country boosting, news/finance topics, and tunable depth/latency controls. That gives this repo enough current web grounding without forcing users off Ollama or into a different agent framework. Tavily docs: Python SDK and endpoints, Search response and SDK example, search-depth/content/date/domain/ra Provider mentions: openai