AI providers
Self-hosted viora uses two models: one for embeddings (finding the right passage) and one for chat (writing the answer). Choose each independently in .env.
viora cloud uses Cloudflare Workers AI with bge-m3 embeddings and Llama 4 Scout for answers. You don't need to configure anything.
| Provider | VIORA_EMBEDDINGS | VIORA_CHAT | Needs |
|---|---|---|---|
| Cloudflare Workers AI | cloudflare | cloudflare | CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_API_TOKEN |
| OpenAI or any compatible API | openai | openai | OPENAI_API_KEY, optional OPENAI_BASE_URL |
| Ollama (local, free) | ollama | ollama | Ollama running; optional OLLAMA_BASE_URL |
| Anthropic Claude | use another embedder | anthropic | pip install "viora-ai[anthropic]", ANTHROPIC_API_KEY |
| Offline (tests, demos) | hash | extractive | Nothing |
Default models
| Provider | Embeddings | Chat |
|---|---|---|
| Cloudflare | @cf/baai/bge-m3 | @cf/meta/llama-4-scout-17b-16e-instruct |
| OpenAI | text-embedding-3-small | gpt-4o-mini |
| Ollama | bge-m3 | llama3.2 |
| Anthropic | – | claude-opus-5-5 (low effort, with automatic refusal fallback) |
Override with VIORA_EMBEDDING_MODEL and VIORA_CHAT_MODEL. Groq, OpenRouter, Together, LM Studio and vLLM work through the OpenAI-compatible provider by setting OPENAI_BASE_URL.
Changing the embedding provider changes how passages are stored. Run
viora ingest again afterwards.Other settings
| Variable | Default | Meaning |
|---|---|---|
VIORA_TOP_K | 6 | Passages given to the model per question. |
VIORA_MIN_SCORE | 0.30 | Below this similarity, a passage counts as unrelated. |
VIORA_MAX_TOKENS | 600 | Longest answer, in tokens. |
VIORA_QUESTIONS_PER_HOUR | 30 | Per visitor, per site. |
VIORA_DATA_DIR | .viora | Where the database is stored. |