This guide walks you through a local Python installation of Spy Search. By the end you’ll have the FastAPI backend and React frontend running, and you’ll have submitted your first query.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/JasonHonKL/spy-search/llms.txt
Use this file to discover all available pages before exploring further.
Prerequisites
Before you begin, make sure you have the following available:- Python 3.12+ — required by the project runtime (
pyproject.tomlspecifiesrequires-python = ">=3.12") - git — to clone the repository
- Node.js & npm — for the React frontend (
installation.shrunsnpm installinsidefrontend/) - An LLM API key — for OpenAI, DeepSeek, Gemini, Grok (xAI), or Anthropic; or Ollama running locally for a fully free setup
uv(optional) — the setup script installs it automatically if not found
Installation Steps
Run the setup script
- Creates a
.envfile pre-populated with placeholder keys for DeepSeek, Gemini, xAI, and OpenAI - Creates the required local directories (
./tmp/screenshot,./local_files) - Creates an empty
messages.jsonfile used by the agent pipeline
setup.py completes, run the full dependency installer:installation.sh will:- Install
uvif it isn’t already on yourPATH - Create and activate a
.venvvirtual environment - Install all Python dependencies from
requirements.txtviauv pip install - Run
playwright installto download the Chromium browser used for web scraping - Run
npm install --legacy-peer-depsinside thefrontend/directory
Copy and configure config.json
config.json in your editor. The default example uses OpenRouter to serve a Llama 3.3 70B model via the OpenAI-compatible API:| Field | Description |
|---|---|
provider | LLM provider: openai, deepseek, gemini, xai, anthropic, or ollama |
model | Model identifier as expected by the chosen provider |
agents | Active agent roles — ["reporter"] enables the full plan → search → report pipeline |
db | Path for the local ChromaDB vector store used by the RAG layer |
base_url | Override the provider’s default API base URL (useful for OpenRouter or local Ollama) |
language | Language code for generated reports (e.g. "en", "zh", "ja") |
To use Ollama with a locally running model, set
"provider": "ollama", point "base_url" to "http://localhost:11434", and set "model" to any model you have pulled (e.g. "qwen3:8b"). No API key is needed.Set your API key in .env
Open the If you are using Ollama, no API key is required — leave the placeholder values as-is.
.env file created by setup.py and fill in the key for your chosen provider:Start the backend server
Activate the virtual environment and start the FastAPI backend:You should see Uvicorn confirm it is serving on
http://127.0.0.1:8000.Alternatively, use the bundled run script to start both the backend and the React frontend together:run.sh activates the virtual environment, launches the FastAPI server on port 8000, and starts the React dev server on port 8080 — both as background processes.Open the frontend or call the API
Once both processes are running:
- Frontend UI — open http://localhost:8080 in your browser
- Backend API docs — open http://localhost:8000/docs for the interactive Swagger UI
Quick API Test
You can test the search endpoint directly from your terminal without opening the frontend:Next Steps
Docker Setup
Deploy the full stack with Docker Compose — recommended for team or production use.
Introduction
Learn how the Planner, Searcher, and Reporter agents work together.