> ## Documentation Index
> Fetch the complete documentation index at: https://praison.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# CLI Configuration

> One config, every project: layered, project-aware defaults for the praisonai CLI

The `praisonai` CLI reads defaults from a layered hierarchy so you can set a model once and have it work everywhere — globally, per project, or per command.

```python theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
from praisonaiagents import Agent

agent = Agent(name="assistant", instructions="Use project defaults from .praisonai/config.yaml.")
agent.start("What model am I using?")
```

The user sets a default model in config once; every `praisonai` command in that project picks it up without repeating flags.

```mermaid theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
graph TB
    subgraph "Configuration Precedence (highest wins)"
        CLI[⚡ CLI flags] --> ENV[🌱 Per-key env vars<br/>PRAISONAI_MODEL, ...]
        ENV --> EnvBlob[📦 Env config<br/>PRAISONAI_CONFIG_CONTENT<br/>or PRAISONAI_CONFIG]
        EnvBlob --> PROJ[📁 Project config<br/>.praisonai/config.yaml]
        PROJ --> GLOB[🏠 Global config<br/>~/.praisonai/config.yaml]
        GLOB --> MANAGED[🏢 Managed defaults]
        MANAGED --> DEF[📋 Built-in defaults]
    end

    classDef high fill:#8B0000,stroke:#7C90A0,color:#fff
    classDef mid fill:#F59E0B,stroke:#7C90A0,color:#fff
    classDef low fill:#6366F1,stroke:#7C90A0,color:#fff

    class CLI,ENV high
    class EnvBlob,PROJ,GLOB mid
    class MANAGED,DEF low
```

<Note>
  See also: [Env Config Injection](/docs/features/env-config-injection) — supply the whole config layer from `PRAISONAI_CONFIG_CONTENT` / `PRAISONAI_CONFIG` with nothing on disk.
</Note>

## Quick Start

<Steps>
  <Step title="Set a default model">
    ```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
    praisonai config set agent.model gpt-4o-mini
    ```
  </Step>

  <Step title="Run any agent">
    ```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
    praisonai run "Summarise this README"
    ```

    The model from config is picked automatically — no `--model` flag needed.
  </Step>

  <Step title="Inspect what was resolved">
    ```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
    praisonai config show --sources
    ```
  </Step>
</Steps>

When you `praisonai run`, CLI defaults flow into the agent automatically:

```python theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
from praisonaiagents import Agent

# Model, temperature, and tools come from resolved CLI config
agent = Agent(name="assistant", instructions="Be helpful.")
# praisonai run "..." uses agent.model from ~/.praisonai/config.yaml or project config
```

***

## How It Works

```mermaid theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
sequenceDiagram
    participant User
    participant CLI as praisonai CLI
    participant Resolver as ConfigResolver
    participant Project as Project config
    participant Agent

    User->>CLI: praisonai run "task"
    CLI->>Resolver: resolve_config()
    Resolver->>Project: walk-up cwd → git root OR $HOME
    Project-->>Resolver: .praisonai/config.yaml
    Resolver-->>CLI: merged ResolvedConfig
    CLI->>Agent: agent.model, temperature, tools
    Agent-->>User: response
```

Layers are **deep-merged**. Lists are concatenated. Scalars are overridden by higher layers.

| Layer | Source                                                                 | Precedence |
| ----- | ---------------------------------------------------------------------- | ---------- |
| 1     | Built-in defaults                                                      | Lowest     |
| 2     | Global `~/.praisonai/config.yaml` (+ legacy paths)                     |            |
| 3     | Project config (walk-up to git root or `$HOME`, whichever comes first) |            |
| 4     | Environment variables                                                  |            |
| 5     | CLI flags                                                              | Highest    |

***

## Project vs Global Config

| Location                               | Scope                                               | Commit to repo? |
| -------------------------------------- | --------------------------------------------------- | --------------- |
| `~/.praisonai/config.yaml`             | All projects on this machine                        | No              |
| `./.praisonai/config.yaml`             | This project (and subdirectories)                   | Yes             |
| `./praisonai.yaml` / `./praisonai.yml` | Canonical project config                            | Yes             |
| `./praison.yaml` / `./praison.yml`     | Legacy fallback (backward compat, still discovered) | Yes             |
| `./.praison/config.toml`               | Legacy TOML (backward compat)                       | Optional †      |

† When placed directly at `$HOME`, `.praison/config.toml` is loaded once as `global:` (never as `project:`).

<Note>
  **Canonical name ([PR #3422](https://github.com/MervinPraison/PraisonAI/pull/3422)):** `praisonai.yaml` is the canonical project-root config name — it matches `praisonaiagents/config/loader.py`, `praisonai-code/.../diag.py`, and the TS CLI. The `praison.yaml` / `praison.yml` legacy names are still discovered by the resolver for backward compatibility. When both `praisonai.yaml` and `praison.yaml` exist in the same directory, the **canonical name wins** (asserted by the regression tests).
</Note>

Walk-up discovery searches, at each directory from `cwd` up to **the git root or `$HOME` (whichever comes first)**. At `$HOME` the legacy `.praison/config.toml` name is skipped — that file is owned by the global loader:

1. `.praisonai/config.yaml`
2. `.praisonai/config.yml`
3. `praisonai.yaml` / `praisonai.yml` (canonical project-root config, added in PR #3422)
4. `praison.yaml` / `praison.yml` (legacy fallback, discovered for backward compat)
5. `.praison/config.toml` (legacy)

```yaml theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
# .praisonai/config.yaml — commit this to your repo
agent:
  model: claude-sonnet-4-6
  temperature: 0.3
  max_tokens: 16000
  tools:
    - search_web
    - read_file
```

```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
# Anywhere inside the repo (including subdirs):
praisonai run "Find recent benchmarks for retrieval-augmented generation"
# Uses claude-sonnet-4-6 automatically — no --model flag needed
```

***

## Walk-up Boundaries

Walk-up stops at the nearer of two boundaries: a `.git`-marked directory or `$HOME`.

```mermaid theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
graph TB
    subgraph "Walk-up boundaries (first match wins)"
        CWD["📁 cwd"] --> P["📁 parent"]
        P --> GIT["📁 .git boundary 🛑"]
        P --> HOME["🏠 $HOME boundary 🛑"]
    end

    classDef dir fill:#6366F1,stroke:#7C90A0,color:#fff
    classDef stop fill:#8B0000,stroke:#7C90A0,color:#fff
    class CWD,P dir
    class GIT,HOME stop
```

* The walk stops at the nearer of a `.git`-marked directory or `$HOME`.
* `$HOME` itself is still searched for project configs, so `~/.praisonai/config.yaml` and `~/praisonai.yaml` remain discoverable.
* The legacy `.praison/config.toml` name is skipped only at `$HOME` — that file belongs to the global loader and is loaded exactly once as `global:`.
* A config placed *above* `$HOME` (e.g. `/Users/praisonai.yaml` in a shared-parent layout) no longer wins, because `$HOME` is now a hard boundary.
* If `$HOME` is unresolvable (`Path.home()` raises), the walk falls back to filesystem root.
* The CLI home root (sessions, traces, logs, cache, model-recency) is now the canonical `~/.praisonai/` — the same directory `praisonai setup` and the SDK use — unless `PRAISONAI_HOME` overrides it. A legacy `~/.praison/` is read-only when it is the sole directory present.

<Note>
  `praisonai config sources` shows `~/.praison/config.toml` exactly once, with the `global:` label — never duplicated as `project:`, even when the CLI runs from `$HOME` or a subdirectory beneath it.
</Note>

***

## Choose Your Scope

```mermaid theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
graph TB
    Q{Where should this setting live?}
    Q -->|Just this one command| A[CLI flag]
    Q -->|This shell session only| B[Environment variable]
    Q -->|This repo / team-wide| C[Project config<br/>.praisonai/config.yaml]
    Q -->|All my projects| D[Global config<br/>~/.praisonai/config.yaml]

    classDef question fill:#F59E0B,stroke:#7C90A0,color:#fff
    classDef option fill:#10B981,stroke:#7C90A0,color:#fff
    class Q question
    class A,B,C,D option
```

***

## CLI Home Root

The CLI writes everything under one directory — `~/.praisonai/` by default, or wherever `PRAISONAI_HOME` points. Config, sessions, traces, logs, cache, credentials, `.env`, and durable state all live together there.

```mermaid theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
graph TB
    Q{Where does the CLI put my data?}
    Q --> E1{PRAISONAI_HOME set?}
    E1 -->|Yes| ENV["🌱 $PRAISONAI_HOME/<br/>config, sessions, traces, logs, cache"]
    E1 -->|No| E2{~/.praisonai/ exists?}
    E2 -->|Yes| CANON["🏠 ~/.praisonai/<br/>canonical default"]
    E2 -->|"No, but ~/.praison/ exists"| LEG["📁 ~/.praison/ legacy — read-only<br/>first write migrates forward"]
    E2 -->|Neither| NEW["🆕 ~/.praisonai/ created on first write"]

    classDef question fill:#F59E0B,stroke:#7C90A0,color:#fff
    classDef env fill:#6366F1,stroke:#7C90A0,color:#fff
    classDef canon fill:#10B981,stroke:#7C90A0,color:#fff
    classDef legacy fill:#8B0000,stroke:#7C90A0,color:#fff

    class Q,E1,E2 question
    class ENV env
    class CANON,NEW canon
    class LEG legacy
```

Every user-scoped artefact resolves under the same home root:

| Path                      | Contents                                                                        |
| ------------------------- | ------------------------------------------------------------------------------- |
| `<home>/config.toml`      | User CLI config (written by `praisonai config set`)                             |
| `<home>/config.yaml`      | User CLI YAML config (written by `praisonai setup` / `praisonai init --global`) |
| `<home>/.env`             | API keys (`0600`)                                                               |
| `<home>/credentials.json` | Unified credential store (`0600`)                                               |
| `<home>/sessions/`        | Session state (JSON)                                                            |
| `<home>/traces/`          | Execution traces                                                                |
| `<home>/logs/`            | Log files                                                                       |
| `<home>/cache/`           | Disposable caches (model catalogue, etc.)                                       |
| `<home>/state/`           | Durable state (model recency, DLQs, journals, approvals, update-check)          |
| `<home>/skills/`          | User-scope skills (see [Skill Manage](/docs/features/skill-manage))                  |

### Override with `PRAISONAI_HOME`

Set `PRAISONAI_HOME` to re-root every artefact together — config and sessions and traces and logs and cache all move as one.

```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
export PRAISONAI_HOME=/var/lib/praisonai
praisonai config set agent.model gpt-4o-mini
# → writes /var/lib/praisonai/config.toml
# → sessions, traces, logs, cache all now live under /var/lib/praisonai/
```

Tilde is expanded, so `PRAISONAI_HOME=~/mycustom` resolves the same as `PRAISONAI_HOME=$HOME/mycustom`.

```python theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
from praisonaiagents.paths import get_data_dir

# Both the SDK and the CLI resolve the same home root
print(get_data_dir())  # /var/lib/praisonai (or ~/.praisonai by default)
```

### Legacy `~/.praison/` — read-only fallback

If an older install still has `~/.praison/config.toml`, the CLI keeps reading it until the first write. Any `praisonai config set` / `praisonai config reset` seeds from whatever currently resolves, then writes the merged result to `~/.praisonai/config.toml` — migrating legacy values forward without ever mutating the legacy file. The SDK honours the legacy directory the same way (with a deprecation warning); `praisonai migrate-data` moves everything to the canonical root.

***

## Configuration Schema

### `agent.*` defaults

| Key                   | Type             | Default | Notes                                                             |
| --------------------- | ---------------- | ------- | ----------------------------------------------------------------- |
| `agent.model`         | `str`            | `None`  | e.g. `gpt-4o-mini`, `claude-sonnet-4-6`                           |
| `agent.provider`      | `str`            | `None`  | e.g. `openai`, `anthropic`                                        |
| `agent.base_url`      | `str`            | `None`  | Custom LLM base URL                                               |
| `agent.tools`         | `list[str]`      | `[]`    | Default tool names                                                |
| `agent.toolset`       | `str`            | `None`  | Named toolset                                                     |
| `agent.default_agent` | `str`            | `None`  | Default agent slug                                                |
| `agent.memory`        | `bool` or `dict` | `None`  | Enable memory or config dict                                      |
| `agent.stream`        | `bool`           | `True`  | Stream responses                                                  |
| `agent.temperature`   | `float`          | `0.7`   | LLM temperature. Forwarded to every LLM call (PraisonAI PR #4245) |
| `agent.max_tokens`    | `int`            | `16000` | LLM token budget                                                  |

<Note>
  `api_key` is never serialised to YAML — use environment variables or [`praisonai auth`](/docs/cli/auth).
</Note>

### `mcp.servers.<name>`

| Key       | Type                 | Default | Description                                                                                    |
| --------- | -------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| `command` | `list[str]` or `str` | —       | Local (stdio) server launch command. List form preferred.                                      |
| `args`    | `list[str]`          | `[]`    | Extra args appended to `command`.                                                              |
| `env`     | `dict[str, str]`     | `{}`    | Env vars for the server process. Values containing `,` are skipped on the command-string path. |
| `enabled` | `bool`               | `true`  | Set `false` to declare-but-not-wire a server.                                                  |
| `type`    | `"remote"`           | —       | Marks a remote server; skipped by the run command-string path.                                 |
| `url`     | `str`                | —       | Remote endpoint; presence implies remote.                                                      |

### `permissions.*`

| Key         | Type                             | Default | Description                                                       |
| ----------- | -------------------------------- | ------- | ----------------------------------------------------------------- |
| `default`   | `"allow"` \| `"deny"` \| `"ask"` | —       | Fallback action when no rule matches.                             |
| `rules`     | `list[{pattern, action}]`        | `[]`    | Structured rule list. `action` must be `allow`, `deny`, or `ask`. |
| `<pattern>` | `"allow"` \| `"deny"` \| `"ask"` | —       | Flat shorthand — same shape as `--allow`/`--deny` produces.       |

### `instructions`

Top-level list of extra instruction/context sources loaded alongside the convention-only `AGENTS.md` / `CLAUDE.md` auto-discovery. List values **concatenate** across the config hierarchy (global → user → project), so a project **extends** rather than replaces the org-wide list.

| Key            | Type        | Default | Description                                                                                                                                                                                                  |
| -------------- | ----------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `instructions` | `list[str]` | `[]`    | File paths, globs (`docs/standards/*.md`), `~`/env-var paths, or `http(s)://` URLs. See [Instruction Sources](/docs/features/instruction-sources) for source-type behaviour, the SSRF guard, and merge semantics. |

```yaml theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
# .praisonai/config.yaml
instructions:
  - docs/standards/python.md
  - docs/standards/security.md
  - https://example.com/rules.md
```

Same first-class, layerable status as `agent.*`, `mcp.servers.*`, and `permissions.*` — also mirrored by the repeatable `praisonai run --instructions <path|glob|url>` flag.

Example combining all three sections:

```yaml theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
# .praisonai/config.yaml
agent:
  model: gpt-4o
  temperature: 0.3

mcp:
  servers:
    playwright:
      command: ["npx", "-y", "@playwright/mcp"]

permissions:
  default: ask
  rules:
    - { pattern: "bash:git *", action: allow }
    - { pattern: "bash:rm *",  action: deny }

instructions:
  - docs/standards/python.md
  - https://example.com/rules.md
```

See [Single-Source Config](/docs/features/single-source-config) for a full guide to using all three sections together. Other top-level sections (`output`, `traces`, `session`) are also valid — see [Config CLI reference](/docs/cli/config).

***

## Validation

Configuration is validated against a published JSON Schema. Unknown keys produce actionable warnings with typo suggestions; opt into strict mode to fail fast.

```mermaid theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
graph LR
    L[📄 .praisonai/config.yaml] --> R[🔍 Schema check]
    R -->|Known keys| OK[✅ Applied]
    R -->|Unknown key| W[⚠ Warn + suggest]
    R -->|Strict mode| E[❌ Raise ValueError]

    classDef input fill:#6366F1,stroke:#7C90A0,color:#fff
    classDef process fill:#189AB4,stroke:#7C90A0,color:#fff
    classDef ok fill:#10B981,stroke:#7C90A0,color:#fff
    classDef warn fill:#F59E0B,stroke:#7C90A0,color:#fff
    classDef err fill:#8B0000,stroke:#7C90A0,color:#fff

    class L input
    class R process
    class OK ok
    class W warn
    class E err
```

| Mode              | Enable via                                        | Behaviour on unknown key                   |
| ----------------- | ------------------------------------------------- | ------------------------------------------ |
| Warn (default)    | —                                                 | Logs `UserWarning`, valid keys still apply |
| Strict (per-call) | `--strict-config` / `ConfigResolver(strict=True)` | Raises `ValueError`                        |
| Strict (global)   | `PRAISONAI_STRICT_CONFIG=1`                       | All resolver calls strict                  |

Typo example:

```
Unknown config key 'temprature' in .praisonai/config.yaml (section: agent). Did you mean 'temperature'?
```

The `# yaml-language-server: $schema=...` line written by `praisonai init` enables real-time autocomplete and inline errors in VS Code (YAML extension) and other LSP-aware editors against the [published schema](https://raw.githubusercontent.com/MervinPraison/PraisonAI/main/src/praisonai/praisonai/cli/configuration/config.schema.json).

<Note>
  Editor autocomplete works for **both** the CLI config file (`.praisonai/config.yaml`, validated against [`config.schema.json`](https://raw.githubusercontent.com/MervinPraison/PraisonAI/main/src/praisonai/praisonai/cli/configuration/config.schema.json)) and the agent definition file (`agents.yaml`, validated against [`agents.schema.json`](https://raw.githubusercontent.com/MervinPraison/PraisonAI/main/src/praisonai/praisonai/config/agents.schema.json)). Full setup: [Editor Support](/docs/features/editor-support).
</Note>

***

## Environment Variables

| Variable                         | Maps to                   | Notes                                                                                                                                                   |
| -------------------------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `MODEL_NAME`                     | `agent.model`             |                                                                                                                                                         |
| `OPENAI_MODEL_NAME`              | `agent.model`             |                                                                                                                                                         |
| `PRAISONAI_MODEL`                | `agent.model`             |                                                                                                                                                         |
| `PRAISONAI_PROVIDER`             | `agent.provider`          |                                                                                                                                                         |
| `OPENAI_BASE_URL`                | `agent.base_url`          |                                                                                                                                                         |
| `OPENAI_API_BASE`                | `agent.base_url`          |                                                                                                                                                         |
| `PRAISONAI_BASE_URL`             | `agent.base_url`          |                                                                                                                                                         |
| `PRAISONAI_OUTPUT_FORMAT`        | `output.format`           |                                                                                                                                                         |
| `PRAISONAI_COLOR`                | `output.color`            | bool: `true`/`1`/`yes`                                                                                                                                  |
| `PRAISONAI_VERBOSE`              | `output.verbose`          | bool                                                                                                                                                    |
| `PRAISONAI_QUIET`                | `output.quiet`            | bool                                                                                                                                                    |
| `PRAISONAI_TELEMETRY`            | `telemetry`               | bool                                                                                                                                                    |
| `PRAISONAI_BACKGROUND_JOB_STORE` | background job durability | Default `1` (on). Set to `0` / `false` to force `get_job_manager()` to pure in-memory. See [Durable Background Jobs](/docs/features/durable-background-jobs) |

***

## Subcommand Reference

| Command                            | Flags                                        | Behaviour                                                                 |
| ---------------------------------- | -------------------------------------------- | ------------------------------------------------------------------------- |
| `praisonai config show`            | `--format yaml\|json\|table`, `--sources/-s` | Prints fully resolved config; with `--sources`, lists contributing layers |
| `praisonai config validate [FILE]` | `--strict-config`, `--json`, optional FILE   | Validates schema; warn-by-default, strict opts into raise                 |
| `praisonai config sources`         | none                                         | Prints precedence hierarchy and active layers                             |
| `praisonai config list`            | `--scope all\|user\|project`                 | Lists resolved values; verbose shows sources                              |
| `praisonai config get KEY`         | dotted path                                  | e.g. `agent.model`                                                        |
| `praisonai config set KEY VALUE`   | `--scope user\|project`                      | Writes YAML (`0600` user, `0644` project)                                 |
| `praisonai config reset`           | `--scope user\|project`, `-y`                | Deletes corresponding `config.yaml`                                       |
| `praisonai config path`            | `--scope user\|project`                      | Shows config file path and existence                                      |
| `praisonai config env`             | `--scope`, `--validate`                      | Registered env vars and validation                                        |
| `praisonai config doctor`          | none                                         | Configuration diagnostics                                                 |

```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
# Verify resolution
praisonai config show --sources
# Shows sources: defaults, project:/path/to/repo/.praisonai/config.yaml, ...
```

***

## Backward Compatibility

<AccordionGroup>
  <Accordion title="Legacy ~/.praison/config.toml">
    Loaded once as a `global:` source by the global loader. RAG and model keys are migrated to the new `agent.*` / `rag.*` schema automatically. Project walk-up never re-discovers it at `$HOME`, so `praisonai config sources` shows it exactly once with the `global:` label.

    The legacy file is **read-only**. `praisonai config set` / `praisonai config reset` always write to the canonical `~/.praisonai/config.toml`, seeding from whatever currently resolves — so a first write migrates any legacy values forward and the legacy file is never mutated after that. The same applies to the whole legacy directory: sessions, traces, logs, and cache now live under the canonical home too.
  </Accordion>

  <Accordion title="Legacy ~/.praisonai/.env">
    Model and provider keys from `.env` are merged into the resolved config when no YAML is present.
  </Accordion>

  <Accordion title="Project .praison/config.toml">
    Walk-up discovery still finds legacy TOML project configs in subdirectories (e.g. `<subdir>/.praison/config.toml`) and migrates them on read. The exception is the file at `$HOME` itself, which is only ever loaded as `global:` (see above).
  </Accordion>
</AccordionGroup>

***

## Best Practices

<AccordionGroup>
  <Accordion title="Pin model per project">
    Commit `.praisonai/config.yaml` to your repo so teammates get the same defaults.
  </Accordion>

  <Accordion title="Keep secrets out of YAML">
    `api_key` is never serialised; use env vars or `praisonai auth`.
  </Accordion>

  <Accordion title="Use config sources to debug">
    When behaviour surprises you, `praisonai config sources` prints exactly which layer won.
  </Accordion>

  <Accordion title="Walk-up means subdirectories inherit">
    Running `praisonai` from `repo/scripts/` finds `repo/.praisonai/config.yaml`.
  </Accordion>
</AccordionGroup>

***

## Interpolation & Provenance

Any config value can reference `${VAR}`, `{env:NAME:-default}`, or `{file:./relative/path}` — see [Value Interpolation](/docs/docs/cli/config#value-interpolation) for the directive table and its security rules.

Run `praisonai config provenance` to see the winning value of each key and the exact layer/file that supplied it — see [`provenance`](/docs/docs/cli/config#provenance).

***

## Related

<CardGroup cols={2}>
  <Card title="Config CLI Reference" icon="terminal" href="/docs/cli/config">
    Full subcommand reference for `praisonai config`
  </Card>

  <Card title="Configuration Index" icon="settings" href="/docs/configuration">
    SDK-level agents, tasks, and memory configuration
  </Card>

  <Card title="Runtime Selection" icon="play" href="/docs/features/runtime-selection">
    Model-scoped runtime configuration
  </Card>

  <Card title="LLM Endpoint Config" icon="link" href="/docs/features/llm-endpoint-config">
    Custom base URLs and provider routing
  </Card>

  <Card title="Single-Source Config" icon="gear" href="/docs/features/single-source-config">
    Model + MCP + permissions in one file
  </Card>

  <Card title="Editor Support" icon="file-code" href="/docs/features/editor-support">
    Autocomplete and inline validation for config.yaml and agents.yaml
  </Card>
</CardGroup>
