Use local models

Goal. Run embeddings or generation without a provider, a key or a network. About ten minutes, most of it downloading.

Released binaries cannot do it yet

The release ships without local execution, because it vendors llama.cpp and would turn a twelve-megabyte download into something much larger. A bare model name means a local model, so on a fresh install:

strata --cache inference embed miniLM "hello"
inference.unsupported_operation: not supported: `miniLM` is a local model, and
this build has no local model execution: this build runs cloud models only, and
a bare model name means a local model. Either name a cloud model instead, or run
`strata inference install-local` to add local execution.

Add it

strata inference install-local

This adds local execution to the installation you already have. There is no build from source and no toolchain to install.

strata inference status

The build line and the local provider row are what change.

Pick a model

strata --cache inference models list
miniLM        embed     bert          f16     unavailable   45 MB
nomic-embed   embed     nomic-bert    q8_0    unavailable   260 MB
bge-m3        embed     xlm-roberta   q8_0    unavailable   1.2 GB
gpt2          generate  gpt2          q8_0    unavailable   178 MB
tinyllama     generate  llama         q4_k_m  unavailable   670 MB
qwen3:8b      generate  qwen3         q4_k_m  unavailable   4.7 GB

unavailable means not downloaded yet. Sizes range from 45 MB to 4.7 GB, so choose deliberately: miniLM for embeddings is 45 MB and enough for most retrieval, while an 8B generator is a different commitment.

strata --cache inference models local

Lists what is actually on disk.

Check before you commit to one

strata --cache inference capability miniLM
availability              not_downloaded
can_embed                 false
provider_feature_enabled  false

On a cloud-only build those read false, which is the truth rather than an advertisement. After install-local they change. embedding_dim is reported for local models, which is the number your collection’s dimension has to match.

Why bother

No key, no network, no bill. Embedding a large corpus locally costs time rather than money, and works offline.

Nothing leaves the machine. For data you cannot send to a provider, this is the only option.

Reproducibility. A local model at a pinned quantisation answers the same way next year. A hosted model behind a moving name does not.

The trade is quality and speed. A 45 MB embedding model is not text-embedding-3-large, and generation on CPU is slow.

Models are cached in memory

strata --cache inference cache-status
strata --cache inference unload

Loaded models stay resident between calls, which matters more than it sounds when the model is several gigabytes. unload with no argument clears everything.

Failure modes

inference.unsupported_operation. The build has no local execution. Run install-local.

A model is not_downloaded. It is fetched on first use, so the first call is slow and needs a network even though later ones do not.

Dimension mismatch. capability <model> reports embedding_dim; the collection has to be created with that number.

Next

Use cloud providers for the hosted path, or Embed and store documents.

Verified against strata-core@v1.2.7 · Edit this page · Report an issue

agents: this page as markdown → /docs/guides/ai/use-local-models.md