The most useful line in Ollama's v0.32.6 release (Aug 4, 2026) is not a new feature. It's this: its OpenAI-compatible /v1/chat/completions endpoint now streams in OpenAI's exact wire formatrole only on the first chunk, finish_reason on its own chunk, and usage in a separate chunk. If you ever kept a "local mode" branch in your streaming parser because Ollama's stream was almost but not quite OpenAI-shaped, you can delete it.

That's the whole story, and it's worth two minutes because it collapses the cost of running your agent locally to nearly zero code.

The one-paragraph how-to#

Point your existing OpenAI client at localhost. Nothing else changes.

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:11434/v1",   # Ollama, not api.openai.com
    api_key="ollama",                        # required by the SDK, ignored by Ollama
)

stream = client.chat.completions.create(
    model="qwen3.5",                         # any local tag you've pulled
    messages=[{"role": "user", "content": "Summarize this diff."}],
    stream=True,
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")

Before 0.32.6 this mostly worked — until a strict parser tripped on where role or finish_reason showed up. Now the chunk sequence is identical to what api.openai.com sends, so the same loop drives both. The reason to bother is the usual one: the same agent, no per-token bill, and nothing leaving the machine. This is the "OpenAI-compatible local backend" pattern we walked through for LM Studio — Ollama just closed the last gap that made it leak.

The change that actually bites: finish_reason#

The streaming-shape fix is the headline, but the sneaky one is truncation. Previously, a response cut off by the token limit could report finish_reason: "tool_calls" — which is simply wrong. In 0.32.6 a truncated response correctly reports finish_reason: "length".

If your agent branches on finish_reason — "the model wants a tool" vs "the model ran out of room" — the old value was routing truncated turns straight into your tool-call handler, where they'd fail in a confusing way. This is one of those bugs that never throws; it just makes your agent occasionally do the wrong thing under load. Upgrade, then trust finish_reason again.

What else shipped#

When to use the /v1 endpoint vs Ollama's native API#

Use the OpenAI-compatible /v1 endpoint when you already wrote your agent against OpenAI and just want a local backend under it — that's now a base-URL change and nothing more. Reach for Ollama's native /api/chat when you're building Ollama-first and want its own controls (keep-alive, model options, its native tools schema). Both stream; only the /v1 path is the OpenAI drop-in.

If you're weighing Ollama against a full serving stack for anything past a single machine — concurrency, batching, multiple GPUs — that's a different tool class; see vLLM vs SGLang vs Ollama for where the line is, and the local-agent open-models playbook for picking the model that runs well on the hardware you actually have.