Most RAG tutorials open with "set your OPENAI_API_KEY." This one doesn't need it. In Part 1 I claimed the LLM and embeddings are behind a swappable boundary — "switch providers via config, not code." Part 3 is me cashing that claim: running the entire RAG agent — ingestion, retrieval, the ReAct loop, source citations — on a laptop with zero API keys and no Docker, just Ollama and an embedded Qdrant.
Everything below is real output from an actual run. Including the one thing that broke.
What "offline" actually requires
Three pieces, all local:
Ollama running two models — one for chat, one for embeddings:






