AI providers and models

Every install ships the full model catalog. People only pick models this installation can actually reach. Saving a provider key makes that provider's models appear at once — the catalog does not need to be seeded again, and the container does not need a restart.


What people see

Availability is decided when the list is read. A provider counts as available when its API key or server URL is present. An Ollama model also has to be pulled on that server.

Who What they see
Regular users Models of available providers only. Unconfigured cloud models and Ollama models that are not pulled yet are hidden.
Administrators The full catalog on the admin tabs of Manage → Assistants → Models. Unavailable rows stay in the list, greyed, with a badge: Provider not configured or Not pulled.

Keys are entered on Operate → AI infrastructure → Models & keys (/admin/setup). A key is tested against the provider, stored encrypted, and used on the next request. Select suggested models recommends only within the providers this installation can reach. A new account keeps the install-wide defaults until that person chooses a model.

Health checks (Operate → Model Status) are separate: a provider that is configured but briefly down still appears in the picker.

Command line

php bin/console app:provider:list
php bin/console app:provider:list --fresh
php bin/console app:model:enable --provider groq
php bin/console app:model:disable --provider openai
php bin/console app:model:enable --only ollama --only piper --only whisper

app:model:disable is a soft deactivate. It sets the model inactive and not selectable and keeps the row, so chat history that points at it still resolves. The next app:seed (every container start) leaves that choice in place. There is no command that deletes catalog rows. Turn a provider back on with app:model:enable --provider <name>.

--only is an allow-list: those providers are enabled and every other catalog provider is soft-disabled. A cloud provider added in a later release stays off until you extend the list. It cannot be combined with --provider or with per-model keys.

On Kubernetes the same switches are models.providers.only, models.providers.enabled, and models.providers.disabled. The air-gap overlay is examples/values-airgap.yaml.

Speech without a cloud key

Local speech-to-text is a catalog entry (Whisper, tag sound2text). It is available when WHISPER_ENABLED is on and the whisper.cpp binary plus the WHISPER_DEFAULT_MODEL file are present, so SOUND2TEXT can point at it on every browser. Spoken answers use Piper when SYNAPLAN_TTS_URL answers — see Text-to-Speech.

On an install that must stay on your network, set WEB_SPEECH_ENABLED=false. Chrome's Web Speech API sends the recording to Google; with the flag off, the microphone records and the server transcribes with Whisper. The full local setup is Air-gapped installation.

Typical setups

  • Try it locally. docker compose up with the local-ai profile and no cloud keys. The picker lists the Ollama models that have finished downloading. Speech-to-text is local Whisper.
  • Local, plus one or two cloud keys. Paste a Groq or OpenAI key under Models & keys. That provider's models show up within seconds. Suggested defaults stay inside the providers that are actually configured.
  • Kubernetes. Point ollama.baseUrl (or Triton) at your inference service and optionally narrow the catalog with models.providers.*. See Kubernetes.
  • Air-gapped. Pre-pulled Ollama models, WEB_SPEECH_ENABLED=false, local Whisper and Piper, and the Helm allow-list so later cloud providers stay off. See Air-gapped installation.

Provider keys themselves — where to paste them, encryption, env import — are on Administration. Local Ollama setup is the Local AI module page.