Skip to the page

Verity

Set SEARXNG_BASE_URL in Verity's .env to the SpecStream address, and Verity's searches run on SpecStream's Search API, in the SearXNG JSON its code already reads. There is no SearXNG instance to install, and the model and page reading stay on your machine.

SpecStream for VerityAI assistants

What you need

  • Verity, installed with install.bat, by hand from the README, or with Docker.
  • A SpecStream key. Get your key on the Search API screen of your SpecStream workspace. New accounts start with $10 of credit, no card.
  1. 1. Set SEARXNG_BASE_URL in .env

    Verity reads its settings from .env in the Verity folder. If you have none yet, copy .env.sample to .env. Replace the SearXNG line with the SpecStream address, with your key in place of YOUR_SPECSTREAM_KEY.

    Give the address without /search: Verity adds /search itself. The address holds your key, so keep .env out of git and out of anything you share.

    .env
    SEARXNG_BASE_URL=https://api.specstream.ai/searxng/YOUR_SPECSTREAM_KEY
  2. 2. With Docker, set it in .env_docker

    The Docker backend reads .env_docker, not .env. Its sample line is SEARXNG_BASE_URL=http://host.docker.internal:8080, which points at a SearXNG on your own machine. Replace it with the same SpecStream line, without quotes, and rebuild:

    In the Verity folder
    docker compose up --build
  3. 3. Restart Verity

    Verity reads the address only when it starts. Stop what you run and start it again: start.bat for the CLI app, start-webserver.bat for the web server behind the WebUI, start-mcpserver.bat for the MCP server, or python src/api_server.py in a manual install. Each of them reads the same SEARXNG_BASE_URL.

  4. 4. Ask a question that needs the web

    Ask in the WebUI, or call the API server directly. The stream sends a search event, then read while Verity reads the pages it found, then think, and the answer as token events:

    Terminal
    curl -N "http://localhost:8000/ask?question=What%20changed%20in%20the%20latest%20PostgreSQL%20release"

What changes and what stays

Verity's search code, src/backend/search/searxng.py, is unchanged. It posts each query to SEARXNG_BASE_URL plus /search with format=json, language=en and categories=general. SpecStream answers in SearXNG's JSON shape: results[] with title, url, content and a score on each result. Verity ranks results by that score, so it works with no change.

Verity still reads the pages itself with Crawl4AI, and your local model still writes the answer. Only the search leaves your machine: each question and the queries Verity's model writes from it go to SpecStream.

The -site:spotify.com Verity adds to every query holds on every result: SpecStream applies site: and -site: to each result it returns.

Why not run SearXNG yourself

Verity's README starts with installing SearXNG. That means a Docker container on port 8080, a settings.yml with json added under search: formats:, and a secret key. SearXNG's own search API docs (opens in a new tab) say that requesting a format the instance has not turned on returns 403 Forbidden, and many public instances have JSON turned off.

A SearXNG instance also passes every query on to public engines from your own address, and those engines can answer it with CAPTCHAs, as AgenticSeek users report in issue #410 (opens in a new tab). With SpecStream the search runs on SpecStream's servers, so there is nothing to host, patch or unblock.

What each question costs

Verity's model rewrites each question into two more search queries, and Verity searches all three. Each search is one Search API call of up to 10 results.

The SearXNG address runs the Search API's fast tier, at $1 per 1,000 searches of up to 10 results. A Verity question with its three searches costs about $0.003. Searches come out of your balance with no quote and no approval, and every call, charged or not, is in your account's request log. The pricing page has the details.

Keep searches in the EU

Verity is built for privacy. To keep its searches inside the EU, turn on eu_egress_only for the key you put in the address, when you create the key or later through the API (reference). Each search then reaches the engines only from SpecStream's server in Madrid.

Limits and errors

  • Verity waits 10 seconds for a search. If it gives up, it says SearXNG request timed out,please ensure it is running. Ask again.
  • If Verity says Unexpected error in search with a client error, check the key in the address.
  • If Verity says Could not connect to SearXNG,please ensure it is running, it still uses http://localhost:8080. Verity's src/config.py reads SEARXNG_BASE_URL when it is first imported, before Verity's own load_dotenv(). When the virtual environment sits inside the Verity folder, as install.bat makes it, the line in .env is loaded in time. Otherwise set the variable in the shell that starts Verity: set SEARXNG_BASE_URL=https://api.specstream.ai/searxng/YOUR_SPECSTREAM_KEY on Windows, or export with the same value on macOS and Linux.

Go back to a local SearXNG

Set SEARXNG_BASE_URL back to http://localhost:8080 in .env, or http://host.docker.internal:8080 in .env_docker, and restart Verity. Questions: [email protected].

More

SpecStream for Verity covers what it does in Verity on one page. Every other tool has its guide in Connect your tools. You see the most a request can cost before it starts, and the matches are paid from your balance. Billing has the details. For help, email [email protected].