SearXNG · self-hosted search · LLM · AI agents · JSON API

SearXNG: как дать локальной LLM и AI-агенту собственный поиск в интернете

Локальная модель знает только то, что попало в её weights и текущий context. Чтобы получать свежие данные из интернета, ей нужен отдельный поисковый слой. SearXNG — self-hosted metasearch engine: он агрегирует результаты разных поисковых сервисов, не строит пользовательский профиль и предоставляет простой HTTP API, который удобно подключать к LLM-агентам.

Rolling release каждый merge в master считается новой версией
≈260 engines около 81 включено в default settings
AGPL-3.0 Python ≥3.10, production/stable project
Metasearch, а не новый индекс интернета

SearXNG отправляет один запрос нескольким поисковым сервисам и объединяет результаты

Это принципиально отличается от собственного crawler/indexer. SearXNG не пытается самостоятельно проиндексировать весь интернет. Он обращается к настроенным engines и агрегирует ответы.

AI-agentодин query
→
SearXNGfan-out · merge · rank
→
Search enginesBing · Brave · DDG · Google · arXiv · GitHub...
→
JSON resultstitle · url · content · engine
01 Один API вместо нескольких providers

Agent не обязан отдельно интегрировать каждый search service.

02 Поиск не привязан к одной выдаче

Можно комбинировать engines, categories и специализированные источники.

03 Self-hosted control plane

Вы сами решаете, какие engines включены, какие форматы разрешены и кто имеет доступ к instance.

04 Privacy-oriented design

SearXNG не профилирует пользователя и убирает часть идентифицирующих данных из upstream requests.

Почему это интересно именно для LLM

Search превращается в обычный tool, а не в отдельный коммерческий API каждого провайдера

01Fresh facts

Модель ищет данные после своего training cutoff.

02Research

Agent собирает несколько независимых источников перед ответом.

03Monitoring

Поиск новых публикаций, releases и обсуждений по time range.

04Developer research

GitHub, package/docs и технические результаты в одном backend.

05Private assistant

Локальная LLM получает web search без передачи всего chat context поисковому сервису.

06RAG ingestion

Search находит URL, другой слой загружает и индексирует содержимое.

SearXNG получает только поисковый query, если вы сами не отправляете туда весь prompt.

Хороший agent-tool формирует короткий search query из задачи, а не пересылает search backend всю историю разговора.

Следующий слой после Firecrawl

SearXNG находит URL, Firecrawl извлекает полное содержимое

ЗадачаSearXNGFirecrawl
Найти релевантные страницыОсновной сценарийЕсть Search, но не основной self-host search-engine layer
Объединить много search providersДаНет
Прочитать страницу целикомНетДа
Получить чистый MarkdownНетДа
Crawl целого сайтаНетДа
Privacy-oriented metasearch UIДаНе его задача
Рекомендуемый путь — container Compose

Установка SearXNG через официальный Compose template

mkdir -p ./searxng/core-config/
cd ./searxng/

curl -fsSL \
  -O https://raw.githubusercontent.com/searxng/searxng/master/container/docker-compose.yml \
  -O https://raw.githubusercontent.com/searxng/searxng/master/container/.env.example

cp .env.example .env

docker compose up -d

Current official Compose создаёт SearXNG core и Valkey. Config хранится в core-config/. Документация рекомендует Compose как основной containerized deployment path.

Config /etc/searxng

settings.yml, limiter.toml и другие настройки.

Cache/data /var/cache/searxng

Persistent cache и связанные runtime data.

Valkey Limiter/backend state

Нужен, если используется SearXNG bot limiter.

Reverse proxy Для внешнего доступа

HTTPS, auth и корректные forwarded headers настраиваются отдельно.

Для purely local AI backend не публикуйте порт на все интерфейсы без необходимости.

Ограничьте Docker port binding loopback-интерфейсом или firewall/VPN. По умолчанию sample Compose может публиковать service наружу на host network.

Критическая настройка для AI

JSON API существует из коробки, но формат JSON по умолчанию не включён

Current default search settings содержат только html. Если agent запросит ?format=json, а формат не разрешён, SearXNG вернёт 403 Forbidden.

Минимальный settings.yml для local agent

use_default_settings: true

general:
  debug: false
  instance_name: "Local AI Search"

search:
  safe_search: 0
  formats:
    - html
    - json

server:
  secret_key: "CHANGE_TO_LONG_RANDOM_SECRET"
  limiter: false
  public_instance: false
  image_proxy: false

Такой вариант логичен, если instance реально доступен только локально/VPN. Для public/shared instance limiter лучше включать и правильно настраивать через Valkey.

Проверка API

curl "http://127.0.0.1:8888/search?q=local+LLM&format=json"

Параметры search API

qSearch query

Обязательный текст запроса.

format=jsonJSON response

Должен быть разрешён в settings.yml.

language=ruЯзык

Передаётся поддерживающим engines.

time_range=dayСвежесть

day, month, year — если engine поддерживает.

categories=generalКатегории

Можно ограничивать тип поиска.

safesearch=0Safe search

0/1/2 при поддержке соответствующего engine.

Превращаем поиск в tool

Pydantic AI + локальный SearXNG

import requests
from pydantic_ai import Agent

SEARXNG_URL = "http://127.0.0.1:8888"

agent = Agent(
    "ollama:qwen3",
    instructions=(
        "Используй web_search для свежих фактов. "
        "Не выдумывай источник, если поиск ничего не вернул."
    ),
)


@agent.tool_plain
def web_search(query: str) -> list[dict]:
    response = requests.get(
        f"{SEARXNG_URL}/search",
        params={
            "q": query,
            "format": "json",
            "language": "ru",
        },
        timeout=15,
    )
    response.raise_for_status()

    data = response.json()

    return [
        {
            "title": item.get("title"),
            "url": item.get("url"),
            "snippet": item.get("content"),
            "engine": item.get("engine"),
        }
        for item in data.get("results", [])[:8]
    ]


result = agent.run_sync(
    "Найди свежую информацию о новой версии интересующего проекта."
)

print(result.output)

Здесь local Ollama отвечает за reasoning, а SearXNG — только за search. Можно заменить model provider и оставить search tool без изменений.

Лучше snippets

Production research-agent должен после поиска открыть лучшие источники

1. Query rewriteLLM делает короткий search query
→
2. SearXNGнаходит 5–10 URL
→
3. Firecrawl / HTTPзагружает full text
→
4. Rerankвыбирает сильные sources
→
5. LLMответ + ссылки/citations
Search snippet — не источник истины.

Snippet может быть обрезанным, устаревшим или вырванным из контекста. Для существенного факта agent должен открыть страницу и проверить её содержимое.

Не только Google/Bing

Около 260 engines позволяют собрать поиск под конкретного агента

Текущая документация показывает около 260 поддерживаемых engines, из которых примерно 81 включён по умолчанию. Среди них есть общие поисковые системы и специализированные источники.

General webОбычный интернет-поиск

Несколько providers дают более устойчивую выдачу.

DeveloperGitHub/packages/docs

Удобно для coding/research agent.

SciencearXiv и академические источники

Можно делать отдельную research category.

MediaImages/video/news

Отдельные engines поддерживают свои result types.

Можно добавлять собственный JSON engine

engines:
  - name: internal-docs
    engine: json_engine
    paging: true
    search_url: https://docs.example/api/search?q={query}&page={pageno}
    results_query: documents
    url_query: url
    title_query: title
    content_query: summary

То есть SearXNG способен стать не только internet metasearch, но и unified search layer поверх вашего внутреннего JSON-search endpoint.

Privacy без магических обещаний

Self-hosted SearXNG скрывает пользователя от upstream engine, но не делает сам поиск «невидимым»

SearXNG не хранит пользовательский профиль, не передаёт search-engine cookies и генерирует отдельный browser profile для requests. Внешний search provider обычно видит IP вашего SearXNG instance, а не IP локального пользователя.

Скрывается/уменьшается Прямая идентификация конечного пользователя

Upstream видит instance как посредника, а не браузер пользователя.

Не исчезает Сам search query

Чтобы provider нашёл результаты, запрос всё равно должен уйти выбранному engine.

Private instance Вы контролируете logs

Нет необходимости доверять неизвестному оператору публичного instance.

Public instance Нужно доверять его администратору

Вы не знаете наверняка, логирует ли чужой server ваши запросы.

Self-host на домашнем IP имеет свой trade-off.

Upstream engines видят один и тот же IP вашего instance. Для дополнительного разделения SearXNG поддерживает outbound proxy и Tor.

Outgoing network

SearXNG поддерживает HTTP/SOCKS proxy и Tor для исходящих search requests

outgoing:
  request_timeout: 3.0
  enable_http2: true

  proxies:
    all://:
      - socks5h://127.0.0.1:9050

  using_tor_proxy: true
  extra_proxy_timeout: 10.0

Для Tor документация рекомендует socks5h://, чтобы DNS resolution выполнялась через proxy, а не локально.

Tor повышает privacy, но может ухудшить качество/доступность engines.

Некоторые поисковые системы чаще показывают CAPTCHA или блокируют Tor exits. Для AI-agent это означает больше timeout/error и менее стабильную выдачу.

Можно попробовать без установки

Public instance подходит для теста, но хуже как постоянный backend агента

Список публичных instances публикуется на searx.space. Но для AI integration есть важная проблема: многие public instances отключают JSON/CSV/RSS форматы, а также имеют rate limiting.

Тест Public instance

Быстро посмотреть качество поисковой выдачи без установки.

Постоянный agent backend Own instance

Контроль JSON API, engines, rate limit, logs, proxy и availability.

Не стройте production-agent на случайном публичном instance.

Оператор может изменить formats, лимиты, engines или отключить server; кроме того, вы должны доверять его logging policy.

Search proxy может быстро стать abuse target

Для local AI проще закрыть instance, чем пытаться защищать публичный metasearch

1 Сгенерировать secret_key

Не оставлять default ultrasecretkey.

2 Local bind / firewall

Если search нужен только вашим agents, не публиковать instance в интернет.

3 Limiter + Valkey для shared/public

Защищает upstream engines от чрезмерного bot traffic.

4 Правильный X-Forwarded-For

Limiter зависит от корректного определения реального client IP за reverse proxy.

5 Регулярно обновлять

Engine APIs часто меняются; rolling-release fixes выходят постоянно.

6 Не включать опасные offline engines без нужды

Command engine способен выполнять локальные shell commands и требует отдельной модели доверия.

Limiter

server:
  limiter: true

valkey:
  url: valkey://searxng-valkey:6379/0

Limiter нужен прежде всего shared/public instance: SearXNG сам выглядит для upstream search engines как bot, и неконтролируемый клиент способен быстро довести instance до CAPTCHA/ban.

Особая осторожность с command engine.

Официальная документация прямо предупреждает: offline command engine запускает arbitrary shell command с подстановкой пользовательского query. На public instance такие engines нужно изолировать/защищать tokens или вообще не включать.

На момент проверки GitHub Security page SearXNG содержит SECURITY.md, но не показывает опубликованных security advisories. Это не означает отсутствия bugs — только отсутствие опубликованных advisories в этом feed.

Ограничения

Self-hosted metasearch не превращается автоматически в идеальный web search API

01Upstream engines меняются

Parser или endpoint может сломаться после изменений поисковой системы.

02CAPTCHA и blocks

Один instance IP генерирует много search traffic и может быть ограничен.

03Качество engines различается

Больше источников не всегда означает лучше ranking.

04Нет full-page content

Для серьёзного research нужно отдельно открыть найденный URL.

05Public API требует эксплуатации

Limiter, reverse proxy, headers, monitoring и updates становятся вашей задачей.

06Rolling release

Фиксы приходят быстро, но возможны regressions — обновления нужно контролировать.

Для одного локального агента setup можно оставить очень простым.

Docker Compose + JSON format + loopback/VPN access обычно достаточны. Публичный multi-user search server — уже отдельная инфраструктурная задача.

Практическая архитектура

Хорошая домашняя связка для локального AI

1 Ollama / LM Studio

Локальная model inference.

2 Pydantic AI / собственный agent

Reasoning, tools и workflow.

3 SearXNG

Поиск свежих URL и snippets.

4 Firecrawl / parser

Full-text загрузка лучших результатов.

5 Langfuse / OTel

Tracing, token/cost/latency и evaluation.

Первоисточники

SearXNG: search API, rolling releases, privacy и deployment

Материал проверен 21 сентября 2026 года.

SearXNG использует rolling-release model: каждый merge/commit в master считается новой версией, поэтому здесь сознательно не указана одна «вечная stable 1.x» версия. Current docs на дату проверки собраны из ветки сентября 2026 года.

Вывод

SearXNG — хороший search backend для локального AI, если отделить поиск от чтения страниц

Самая полезная архитектурная идея проста: SearXNG отвечает за discovery, другой инструмент — за загрузку full-text, а LLM — за reasoning и synthesis. Так каждый компонент делает то, для чего он предназначен.

Для домашнего private-agent достаточно собственного instance, JSON API и закрытого сетевого доступа. Публичный SearXNG уже требует limiter, Valkey, reverse proxy и регулярного обслуживания.

FAQ

Частые вопросы про SearXNG и AI

Что такое SearXNG простыми словами?

Self-hosted metasearch engine, который отправляет ваш запрос нескольким поисковым сервисам, объединяет результаты и может отдавать их через JSON API.

Можно ли подключить SearXNG к локальной LLM?

Да. Обычно SearXNG оформляют как search tool: агент отправляет короткий query на /search?format=json, затем LLM анализирует результаты.

Почему format=json возвращает 403?

JSON должен быть явно добавлен в search.formats внутри settings.yml. По умолчанию current settings разрешают только HTML.

Заменяет ли SearXNG Firecrawl?

Нет. SearXNG ищет URL и возвращает snippets. Firecrawl загружает и очищает полный content страницы, делает crawl и structured extraction.

Нужен ли API key?

У собственного private SearXNG Search API нет обязательного commercial API key. Контроль доступа нужно обеспечивать сетевой изоляцией, reverse proxy/auth и limiter в зависимости от deployment.

Можно ли использовать публичный SearXNG instance?

Для теста — да. Для постоянного agent backend хуже: JSON часто отключён, есть rate limits, а оператор instance потенциально может логировать запросы.

SearXNG полностью скрывает запрос от Google/Bing?

Нет. Чтобы получить результат, search query уходит выбранному upstream engine. SearXNG уменьшает идентификацию конечного пользователя: upstream видит instance IP, а не напрямую пользователя, и не получает его обычные cookies.

Можно ли пустить поисковые запросы через Tor?

Да. SearXNG поддерживает proxies и using_tor_proxy. Для Tor предпочтителен socks5h://, чтобы DNS тоже разрешался через proxy.

Какая версия SearXNG актуальна?

SearXNG — rolling-release проект: каждый merge в master является новой версией. Поэтому корректнее обновляться по актуальному official container/master, а не искать редкий semver release.

Локальный AI + собственный web search

Хотите, чтобы локальная модель сама искала свежую информацию, но search backend оставался под вашим контролем?

Практичная схема: SearXNG для поиска, Firecrawl для чтения страниц, локальная LLM для анализа и отдельный agent framework для tools/permissions.