Architecture Decision Record

ADR 014: vLLM for Served Generation, Alongside Ollama

A second inference runtime for throughput — vLLM serving a quantized 30B tensor-parallel across both GPUs, with Ollama kept for embeddings and flexible experimentation.

Status: Accepted — rollout in progress  ·  Date: Aug 2026  ·  ← All ADRs


Context

ADR 011 established local inference on Ollama, and that was the right call to start: trivial model management, one-line model swaps, and more than good enough for interactive chat and document Q&A.

Then the workloads changed shape. Agentic loops and — especially — Cortexa’s evaluation harness aren’t latency-bound the way a single chat is; they’re throughput-bound. A full eval run is ~150 sequential model calls, all serialized on one GPU, and Ollama serves essentially one request at a time. Two things I wanted, Ollama doesn’t do well:

Decision

Run vLLM as the served-generation runtime, and keep Ollama for everything else — a split by job, not a straight replacement.

Reasoning

Tradeoffs

Outcome

vLLM is live and serving qwen3-coder-30b across both cards. But this is honestly recorded as a migration in progress (Aug 2026), not a finished cutover. The generation consumers — Open WebUI, paperless-ai, karakeep — still point at Ollama endpoints and haven’t been repointed to vLLM’s OpenAI API, so some currently have no generation backend during the transition. The external gateway is wired for Cortexa; the internal repointing (and the egress lane) is the open work.

I’m documenting it mid-flight on purpose. The tidy version — “migrated to vLLM” — would be a cleaner sentence and a less honest one. This is what the change actually looks like a few days in.