| Store | Purpose | Backends |
|---|---|---|
config_store | Provider configs, virtual keys, governance rules | SQLite, PostgreSQL |
logs_store | Request/response logs shown in UI | SQLite, PostgreSQL + optional S3/GCS offload |
vector_store | Semantic response caching | Weaviate, Redis, Valkey, Qdrant, Pinecone |
If you use PostgreSQL for any store, the target database must be UTF8 encoded. See PostgreSQL UTF8 Requirement.
config_store
When
config_store is disabled (or absent), all configuration is loaded from config.json at startup only - the Web UI is disabled and changes require a restart. See Two Configuration Modes.- SQLite
- PostgreSQL
- Disabled
SQLite (Default)
Simplest setup - no external database required. Bifrost stores configuration in a local SQLite file.| Field | Description |
|---|---|
config.path | Path to the SQLite file (relative to app-dir, or absolute) |
logs_store
- SQLite
- PostgreSQL
- Disabled
SQLite
Log Retention
Setretention_days to automatically purge old log entries. 0 disables retention-based cleanup.
Materialized View Refresh Interval (PostgreSQL only)
The PostgreSQL logs store backs the dashboard’s stats and histograms with materialized views, refreshed in the background. The default cadence is 1 minute, which keeps dashboard data near real-time but issues aREFRESH MATERIALIZED VIEW CONCURRENTLY every minute — an expensive operation that can be too aggressive on smaller or CPU-constrained database instances.
Set matview_refresh_interval (Go duration string) to slow down refreshes when near-real-time accuracy isn’t critical:
| Field | Default | Description |
|---|---|---|
matview_refresh_interval | "1m" | How often to refresh dashboard materialized views. Accepts any Go duration string ("1m", "5m", "1h"). Minimum 5s. |
- Refreshes are already activity-gated: when no INSERT/UPDATE/DELETE has hit the
logstable since the last refresh, the scheduled tick short-circuits without touching the views. So idle clusters don’t pay for the configured cadence — they only pay when there’s actual log activity. - Dashboard freshness lag will be at most the configured interval. Stats and histograms over the last 24 hours come straight from the raw
logstable (no matview), so short-window dashboards stay real-time regardless of this setting. - A 10-minute safety-net refresh runs even on totally idle clusters so the rolling 30-day filter dropdown window evicts aged-out values.
- Your database instance is CPU-constrained and matview refreshes are showing up as a hot consumer.
- Your team mostly looks at multi-day trends, not minute-by-minute dashboards.
- The database has consistent CPU headroom.
- Operators rely on near-real-time dashboards (e.g. live incident triage).
Object Storage for Logs
Offload LLM request/response logs and MCP tool logs from the database to S3 or GCS. The database retains lightweight index records and fetches full payloads on demand. For MCP logs, the full tool log is stored in object storage and the database keeps dashboard/table fields plus a 200-character input preview.- AWS S3
- Google Cloud Storage
- MinIO (Self-Hosted)
access_key_id and secret_access_key:| Field | Description |
|---|---|
bucket | S3 bucket name (supports env. prefix) |
prefix | Key prefix for stored objects (default: "bifrost") |
compress | Enable gzip compression (default: false) |
region | AWS region |
access_key_id | AWS access key ID (omit for default credential chain) |
secret_access_key | AWS secret access key |
session_token | STS temporary credentials session token |
role_arn | IAM role ARN for STS AssumeRole |
endpoint | Custom endpoint for MinIO / Cloudflare R2 |
force_path_style | Use path-style URLs (required for MinIO, default: false) |
vector_store
A vector store is required for semantic caching. Choose from Weaviate, Redis/Valkey, Qdrant, or Pinecone.- Weaviate
- Redis / Valkey
- Qdrant
- Pinecone
| Field | Required | Description |
|---|---|---|
scheme | Yes | "http" or "https" |
host | Yes | Weaviate server host and port |
api_key | No | Weaviate API key (supports env. prefix) |
grpc_config.host | No | gRPC host for faster vector operations |
grpc_config.secured | No | Use TLS for gRPC connection |

