Configuration

June 27, 2026 · View on GitHub

English | 简体中文 | 繁體中文 | 日本語 | Русский

devo onboard is the recommended setup path. For manual configuration, Devo merges settings in this order:

  1. Built-in defaults
  2. DEVO_HOME/config.toml - user-level config, defaulting to ~/.devo/config.toml on macOS/Linux and C:\Users\yourname\.devo\config.toml on Windows
  3. <workspace>/.devo/config.toml - project-level config
  4. CLI flags

Credentials live separately in DEVO_HOME/auth.json; config.toml should refer to credential ids instead of storing API keys directly.

Minimal shape:

[defaults]
model_binding = "deepseek-v4-flash-api-deepseek-com"

[providers."api.deepseek.com"]
enabled = true
name = "api.deepseek.com"
base_url = "https://api.deepseek.com"
credential = "api_deepseek_com_api_key"
wire_apis = ["openai_chat_completions"]

[model_bindings.deepseek-v4-flash-api-deepseek-com]
enabled = true
model_slug = "deepseek-v4-flash"
provider = "api.deepseek.com"
model_name = "deepseek-v4-flash"
display_name = "DeepSeek V4 Flash"
invocation_method = "openai_chat_completions"
default_reasoning_effort = "high"

The important separation is:

  • model_slug selects Devo's local model metadata from models.json.
  • provider selects the configured connection record.
  • model_name is the provider-specific model string sent on the wire.
  • invocation_method selects the provider protocol, such as openai_chat_completions, openai_responses, or anthropic_messages.

Custom Models

If the model you want to use is not in the built-in list, add it to models.json, then bind it through config.toml.

User-level model catalog:

  • macOS/Linux: ~/.devo/models.json
  • Windows: C:\Users\yourname\.devo\models.json

Project-level overrides can also be placed at <workspace>/.devo/models.json. Catalog precedence is <workspace>/.devo/models.json, then <DEVO_HOME>/models.json, then the built-in catalog. In models.json, provider is the default wire API metadata for the model; the actual endpoint is still selected by the provider field in config.toml.

Example models.json entry:

[
  {
    "slug": "my-coding-model",
    "display_name": "My Coding Model",
    "channel": "Custom",
    "provider": "openai_chat_completions",
    "description": "Custom OpenAI-compatible coding model.",
    "reasoning_capability": "unsupported",
    "context_window": 200000,
    "effective_context_window_percent": 95,
    "max_tokens": 4096,
    "input_modalities": ["text"],
    "base_instructions": "You are Devo, a coding agent. Help the user edit and understand code."
  }
]

Then reference that slug from a model binding:

[model_bindings.my-coding-model-example]
enabled = true
model_slug = "my-coding-model"
provider = "my.provider"
model_name = "provider-specific-model-name"
display_name = "My Coding Model"
invocation_method = "openai_chat_completions"