Skip to content

Configuration Reference

Complete reference for OmniAgent configuration options.

Configuration File

OmniAgent uses YAML or JSON configuration files:

omniagent gateway run --config omniagent.yaml

Gateway

Field Type Default Description
gateway.address string 127.0.0.1:18789 WebSocket server address
gateway.read_timeout duration 30s Read timeout
gateway.write_timeout duration 30s Write timeout
gateway.ping_interval duration 30s WebSocket ping interval
gateway:
  address: "127.0.0.1:18789"
  read_timeout: 30s
  write_timeout: 30s
  ping_interval: 30s

Agent

Field Type Default Description
agent.provider string anthropic LLM provider
agent.model string claude-sonnet-4-20250514 Model name
agent.api_key string - API key (or use env var)
agent.temperature float 0.7 Sampling temperature
agent.max_tokens int 4096 Max response tokens
agent.system_prompt string - Custom system prompt
agent:
  provider: openai
  model: gpt-4o
  api_key: ${OPENAI_API_KEY}
  temperature: 0.7
  max_tokens: 4096
  system_prompt: "You are OmniAgent, responding on behalf of the user."

Supported Providers

Provider Models
openai gpt-4o, gpt-4-turbo, gpt-3.5-turbo
anthropic claude-sonnet-4-20250514, claude-3-opus-20240229
gemini gemini-2.0-flash, gemini-1.5-pro

Multi-Agent Configuration

Configure multiple agents with different models and tool access:

Field Type Default Description
agents []AgentConfig [] List of agent configurations
agents[].id string - Unique agent identifier (required)
agents[].name string - Human-readable name
agents[].description string - Agent description
agents[].provider string (from agent) LLM provider
agents[].model string (from agent) Model name
agents[].api_key string (from agent) API key
agents[].base_url string - Custom API endpoint
agents[].temperature float 0.7 Sampling temperature
agents[].max_tokens int 4096 Max response tokens
agents[].system_prompt string - Custom system prompt
agents[].allowed_tools []string - Whitelist of allowed tools
agents[].denied_tools []string - Blacklist of denied tools
agents[].enabled bool true Whether agent is active
# Default agent settings (used as fallback)
agent:
  provider: anthropic
  model: claude-sonnet-4-20250514
  api_key: ${ANTHROPIC_API_KEY}

# Multiple agent configurations
agents:
  - id: general
    name: General Assistant
    # Inherits from agent section

  - id: research
    name: Research Agent
    provider: openai
    model: gpt-4o
    api_key: ${OPENAI_API_KEY}
    system_prompt: You are a research assistant.
    allowed_tools:
      - web_search
      - read_url

  - id: coder
    name: Coding Agent
    system_prompt: You are a senior software engineer.
    denied_tools:
      - web_search

See Multi-Agent Guide for detailed usage.

Channels

WhatsApp

Field Type Default Description
channels.whatsapp.enabled bool false Enable WhatsApp
channels.whatsapp.db_path string whatsapp.db Session database
channels:
  whatsapp:
    enabled: true
    db_path: "whatsapp.db"

Telegram

Field Type Default Description
channels.telegram.enabled bool false Enable Telegram
channels.telegram.token string - Bot token
channels:
  telegram:
    enabled: true
    token: ${TELEGRAM_BOT_TOKEN}

Discord

Field Type Default Description
channels.discord.enabled bool false Enable Discord
channels.discord.token string - Bot token
channels:
  discord:
    enabled: true
    token: ${DISCORD_BOT_TOKEN}

Skills

Field Type Default Description
skills.enabled bool true Enable skill loading
skills.paths []string [] Additional skill directories
skills.includes []string [] If set, load only these skills. In team mode this is the catalog a virtual agent's enabled skills may be drawn from.
skills.disabled []string [] Skills to skip
skills.max_injected int 20 Max skills in prompt
skills:
  enabled: true
  paths:
    - ~/.omniagent/skills
    - /opt/shared-skills
  disabled:
    - experimental-skill
  max_injected: 20

Secrets

A skill declares the secrets it needs in its SKILL.md frontmatter (requires.secrets); the values come from two places in omniagent.yaml, resolved the same way as every other credential field (plain values, or op:///bw:///file:///env:// vault URIs — see Vault-Backed Credentials):

Field Type Description
secrets map[string]string Global bindings, keyed by env-var name, available to every skill
skills.config.<name>.secrets map[string]string Per-skill bindings for skill <name>; take precedence over secrets for the same key

A skill with a required secret that resolves to nothing here is excluded from the loaded skill set (with a logged reason) rather than loading and failing later at call time. This is the single-operator/personal-mode path — team mode's per-agent secrets are managed in the web UI instead (see the Team Mode guide).

secrets:
  GITHUB_TOKEN: "op://Shared/github/token"

skills:
  enabled: true
  config:
    github:
      secrets:
        GITHUB_TOKEN: "env://GITHUB_TOKEN_OVERRIDE" # wins over the global binding above

Personal mode holds one flat secret map per agent instance — if two different skills bind the same env-var name to different values, only one wins (whichever was merged last). This doesn't come up in team mode, where secrets are already isolated per virtual agent.

Every resolved value (vault-backed or a plain literal) is registered with a process-wide log redactor as soon as it's resolved, and the default logger is wrapped to mask any of them out of log output for the life of the process — a defense-in-depth backstop on top of the injection paths themselves never intentionally logging a value. omniagent config show also runs its output through the same redactor before printing it.

Team Mode

Multi-user mode: user accounts, magic-link sign-in, chats, and virtual agents. Disabled by default. See the Team Mode guide for the full picture.

Field Type Default Description
team.enabled bool false Turn team (multi-user) mode on
team.superadmin_email string - Required. Bootstrapped as superadmin on first sign-in
team.superadmin_password string - Optional. Seeds the superadmin's email+password credential on startup (set-once; min 8 chars). Prefer OMNIAGENT_TEAM_SUPERADMIN_PASSWORD or a vault ref over a literal
team.base_url string - External origin (https://…) for magic links and cookies
team.agent_handle string omniagent @-mention handle for the agent in group chats
team.database.app_dsn string - Required. Application-role connection string. postgres://… selects PostgreSQL; any other value (file path, sqlite://…) selects SQLite
team.database.migrate_dsn string - Owner-role DSN used only for migrations-on-start (PostgreSQL)
team.database.app_role string omniagent_app Application role name granted access by migrations
team.smtp.host string - SMTP host for magic-link email; if unset, links are logged (dev)
team.smtp.port int - SMTP port
team.smtp.from string - From address (required with host)
team.smtp.username string - SMTP username
team.smtp.password string - SMTP password
team.secrets.provider string - Per-agent secret vault: memory or file. Empty disables secret injection
team.secrets.dir string - Storage directory for the file provider (required for it)
team.sso.google.client_id string - Google OAuth client ID. Optional; enables the "Sign in with Google" button
team.sso.google.client_secret string - Google OAuth client secret
team.sso.github.client_id string - GitHub OAuth App client ID. Optional; enables the "Sign in with GitHub" button
team.sso.github.client_secret string - GitHub OAuth App client secret
team:
  enabled: true
  superadmin_email: you@example.com
  base_url: https://team.example.com
  agent_handle: omniagent
  database:
    app_dsn: postgres://omniagent_app:pw@db:5432/omniagent_team
    migrate_dsn: postgres://owner:pw@db:5432/omniagent_team
    app_role: omniagent_app
  smtp:
    host: smtp.example.com
    port: 587
    from: agent@example.com
    # password: set via OMNIAGENT_TEAM_SMTP_PASSWORD (YAML values are not
    # shell-expanded, so a literal ${VAR} here is not substituted)
  secrets:
    provider: file
    dir: /var/lib/omniagent/secrets
  sso:
    google:
      client_id: "1234567890-abc.apps.googleusercontent.com"
      client_secret: "GOCSPX-..."
    github:
      client_id: "Iv1.abc123"
      client_secret: "..."

PostgreSQL vs. SQLite

PostgreSQL is the production target and enforces row-level security as a backstop. SQLite (any non-postgres:// app_dsn) has no RLS and is for local trials/tests only.

Storage

gateway run uses this to persist conversation session history and, in single-agent mode, cron job state (RMI-OMNIAGENT-007) — both survive a process restart or redeploy once configured with a durable backend.

Field Type Default Description
storage.type string sqlite Backend type: sqlite, redis, memory
storage.path string ~/.local/share/omniagent/data.db Database path (for sqlite)
storage.redis.url string - Redis connection URL, e.g. redis://localhost:6379 (required when type is redis)
storage:
  type: sqlite
  path: /data/omniagent.db
storage:
  type: redis
  redis:
    url: redis://cache.internal:6379

Storage Backends

Type Persistence Use Case
sqlite Disk Production, single instance
redis Network Production, volume-less deployments (e.g. Lightsail Container Service)
memory None Development, testing

Sessions

Field Type Default Description
sessions.enabled bool true Enable session persistence
sessions.ttl duration 168h Session time-to-live (7 days)
sessions:
  enabled: true
  ttl: 168h  # 7 days

Embedding binaries that build their own *agent.Agent (rather than using the omniagent CLI) still wire storage programmatically:

backend, _ := sqlite.New(sqlite.Config{Path: "data.db"})
agent.New(config, agent.WithSessionsFromStorage(backend))
YAML configuration support is planned.

Voice

Field Type Default Description
voice.enabled bool false Enable voice processing
voice.response_mode string auto auto, always, never
voice.stt.provider string - STT provider
voice.stt.model string - STT model
voice.tts.provider string - TTS provider
voice.tts.model string - TTS model
voice.tts.voice_id string - TTS voice ID
voice:
  enabled: true
  response_mode: auto
  stt:
    provider: deepgram
    model: nova-2
  tts:
    provider: deepgram
    model: aura-asteria-en
    voice_id: aura-asteria-en

Voice Providers

Provider STT Models TTS Models
deepgram nova-2 aura-asteria-en, aura-luna-en
openai whisper-1 tts-1, tts-1-hd
elevenlabs - Various voice IDs

Tokens

OAuth token management for services requiring refresh tokens.

Field Type Default Description
tokens.vault_uri string - Vault URI for storing tokens
tokens.services map - Service configurations
tokens:
  vault_uri: "op://MyVault"
  services:
    google:
      credentials_name: "google-oauth"
      scopes:
        - "https://www.googleapis.com/auth/calendar"
    zoom:
      credentials_name: "zoom-oauth"

Service Configuration

Field Type Description
credentials_name string Credential name in vault (defaults to service name)
scopes []string OAuth scopes to request
auto_refresh bool Auto-refresh tokens (default: true)

Image Generation

Field Type Default Description
image.enabled bool false Enable image generation
image.provider string openai Provider: openai, fal
image.model string - Default model
image.api_key string - API key (overrides provider-specific)
image.base_url string - Custom API base URL
image:
  enabled: true
  provider: openai
  model: gpt-image-2
  api_key: ${OPENAI_API_KEY}

Image Providers

Provider Models
openai dall-e-3, dall-e-2, gpt-image-2
fal fal-ai/flux-pro, fal-ai/flux-dev, fal-ai/flux-schnell

See Image Generation Guide for detailed usage.

Observability

Field Type Default Description
observability.enabled bool false Enable observability
observability.service_name string omniagent Service name for traces
observability.provider string - Provider: otlp, jaeger
observability:
  enabled: true
  service_name: "my-agent"
  provider: otlp
  otlp:
    endpoint: "localhost:4317"

Environment Variable Expansion

Configuration values support environment variable expansion:

agent:
  api_key: ${OPENAI_API_KEY}
  model: ${OMNIAGENT_MODEL:-gpt-4o}  # With default

Vault-Backed Credentials

Credentials can be stored in password managers using URI schemes:

Scheme Provider Example
op:// 1Password op://MyVault/item/field
bw:// Bitwarden bw://org-id/item-name
file:// File file:///path/to/secret
env:// Environment env://VAR_NAME

Keeper (keeper://) is not supported — no provider is registered for it, so it's rejected at startup with a clear "unknown vault URI scheme" error rather than failing confusingly later.

agent:
  api_key: "op://MyVault/anthropic/api-key"

channels:
  telegram:
    token: "bw://org-id/telegram-bot-token"
  discord:
    token: "env://DISCORD_BOT_TOKEN"

Credentials are resolved once at startup. Plain string values still work.

Complete Example

# omniagent.yaml
gateway:
  address: "127.0.0.1:18789"
  read_timeout: 30s
  write_timeout: 30s

agent:
  provider: anthropic
  model: claude-sonnet-4-20250514
  api_key: ${ANTHROPIC_API_KEY}
  temperature: 0.7
  max_tokens: 4096
  system_prompt: |
    You are OmniAgent, an AI assistant responding on behalf of the user.
    Be helpful, concise, and professional.

storage:
  type: sqlite
  path: /data/omniagent.db

sessions:
  enabled: true
  ttl: 168h  # 7 days

channels:
  whatsapp:
    enabled: true
    db_path: "whatsapp.db"
  telegram:
    enabled: false
    token: ${TELEGRAM_BOT_TOKEN}
  discord:
    enabled: false
    token: ${DISCORD_BOT_TOKEN}

skills:
  enabled: true
  paths:
    - ~/.omniagent/skills
  max_injected: 20

voice:
  enabled: true
  response_mode: auto
  stt:
    provider: deepgram
    model: nova-2
  tts:
    provider: deepgram
    model: aura-asteria-en
    voice_id: aura-asteria-en