From nothing to a
cited answer in four minutes.
If any step here takes longer than it says, that's a documentation bug and we treat it as a real one. Open an issue with the docs label.
pipx install quirePick a package manager.
Python 3.10 or newer. The default install pulls a small embedding model and nothing else. No model weights until you ask for them.
- Local models need Ollama or any OpenAI-compatible endpoint
- OCR is optional; install the
[ocr]extra if you have scans - Nothing writes outside the working directory and
~/.cache/quire
$ pipx install quire # recommended
$ brew install quire
$ npm install -g @quire/cli # node wrapper
$ docker run -v $PWD:/w quire/quire
# from source
$ git clone https://github.com/getquire/quire
$ cd quire && uv sync && uv run quire --help
# optional extras
$ pipx install "quire[ocr,postgres]"
Six commands, and you'll use two.
| Command | Does |
|---|---|
quire index <path> | Parse and index a folder, git repo, URL or connector. Incremental by default; --rebuild to start over. |
quire ask "…" | A cited answer on stdout. --json for machine use, --strict to exit non-zero when it can't ground the answer. |
quire serve | Web UI and HTTP API on :7777. --host 0.0.0.0 to expose it, which you should think about first. |
quire agent run <name> | Run one agent from .quire/agents/. Designed to be called by cron or CI, not to run as a daemon. |
quire trace <id> | Replay any answer: what was retrieved, what was cut in verification, what the models cost. |
quire bench | Run the evaluation suite against your own corpus. This is how you find out if it works for you. |
$ quire ask "open questions in the RFCs?" --json \
| jq '.citations[].locator'
"docs/rfc/012-v2-migration.md:88"
"docs/rfc/018-multi-region.md:41"
# fail a CI job on an ungrounded claim
$ quire ask "is the runbook current?" --strict \
|| echo "needs a human"
$ quire serve
ui http://127.0.0.1:7777
api http://127.0.0.1:7777/v1
index .quire/index.db (18,332 spans)
model ollama/llama3.1:8b — local
$ curl -s localhost:7777/v1/ask \
-d '{"question":"who owns billing?"}' \
| jq .answer
One file. Committed to your repo.
quire.toml sits next to your documents. Every key has a default that works, so the shortest useful config is an empty file.
- Environment variables override file values:
QUIRE_MODEL_ANSWER - Secrets are read from the environment only, never from the file
quire config --explainprints the resolved config and where each value came from
The one setting to change
strict = true. It converts "confidently wrong" into "no answer and a non-zero exit". It's off by default only because it surprises people on their first run.
[model]
answer = "ollama/llama3.1:8b"
verify = "ollama/qwen2.5:3b"
embed = "bge-small-en-v1.5" # local, bundled
[index]
store = "sqlite://.quire/index.db"
include = ["docs/**", "notes/**"]
exclude = ["**/node_modules", "**/.git"]
ocr = "auto"
[retrieve]
k = 50
rerank = true
recency = "graph" # off | linear | graph
[answer]
strict = true
conflicts = "show" # show | pick-newest
max_words = 400
Library first, HTTP when you need it.
from quire import Index
idx = Index(".quire/index.db")
idx.add("docs/")
answer = idx.ask(
"why did we drop v2?",
strict=True,
)
for c in answer.citations:
print(c.locator, c.date)
# retrieval only, no model call
spans = idx.search("rollback plan", k=10)
| Method | Path | Does |
|---|---|---|
POST | /v1/ask | Cited answer, conflicts, confidence, trace id |
POST | /v1/ask/stream | Same over SSE; citations arrive as verified |
GET | /v1/search | Ranked spans, no generation |
POST | /v1/index | Add or refresh a path |
GET | /v1/traces/:id | Full replay of one answer |
There is no auth layer
By design. quire serve binds to localhost and assumes the network boundary is yours. If you expose it, put it behind something that does authentication properly. We'd rather ship no auth than bad auth.
Four extension points.
quire.parsers
New file formats. The most common contribution by a wide margin.
quire.sources
Connectors — anything that yields documents with a stable id.
quire.models
Model backends. Anything OpenAI-compatible already works without one.
quire.outputs
Where agent results go. Slack, webhook, file, issue tracker.
Each is a documented protocol with a reference implementation under 100 lines. If your plugin is useful, open a PR to list it in the recipes. We don't vendor plugins into core.
Docs missing something?
Every page has an edit link. Documentation PRs skip the review queue and get merged same-day.