> ## 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.

***

## Project data directory (`.praisonai/`)

Project-local CLI state lives in `./.praisonai/` — the same directory the runtime (`praisonaiagents.paths`) reads from. Everything below goes through a single pair of helpers in `cli/configuration/paths.py`, derived from the one constant `PROJECT_DATA_DIRNAME` (itself `praisonaiagents.paths.DEFAULT_DIR_NAME`), so a new site cannot drift:

* `get_project_data_path(...)` — the canonical **write** path (`<cwd>/.praisonai/<file>`).
* `resolve_project_data_path(...)` — the **read** path: returns the canonical file if it exists, else an existing legacy `<cwd>/.praison/<file>`, else the canonical path.

<Warning>
  **Why this matters (PraisonAI PR #4946).** `.praison` is the *first* project marker the config loader checks. Before this fix, any feature that created `./.praison/` in a project whose config lived in `./.praisonai/` made the loader silently flip and stop reading the project's own `.praisonai/config.toml` — the same silent-drift class of bug as the hooks path in [#4927](https://github.com/MervinPraison/PraisonAI/pull/4927). The migration is **one-way**: writes always land on the canonical `.praisonai/`, and the very first write (or a `praisonai doctor --deep`) moves you off the legacy path.
</Warning>

### Files written under `./.praisonai/`

These nine (plus one) project-data sites migrated from `./.praison/` (or `~/.praison/`) to the canonical `./.praisonai/` in PR #4946. A read-only fallback to `.praison/` is preserved so nothing saved earlier is orphaned:

| File / directory | Feature |
| - | - |
| `thinking.json` | Thinking level (`praisonai thinking`) |
| `compaction.json` | Conversation compaction state |
| `output.json` | Output-style (`praisonai output-style`) |
| file-history | Interactive input history |
| `queue.db` | Background queue database |
| `knowledge/<collection>` | Knowledge vector-store path (config loader, unified schema, and three `retrieval.py` sites) |
| skills check | `praisonai doctor` skills check |
| memory check | `praisonai doctor` memory check |

<Note>
  **Left on `.praison` deliberately** (documented read-only fallbacks or home-level sites, **not** changed by PR #4946): the `config.toml` helpers in `cli/configuration/paths.py` and `credentials.py`; the `~/.praison` todo workspace (`features/todo.py`); `features/logs.py`; `features/package.py`; `llm/catalogue.py`; `resolver.py`; interactive history files; `doctor`'s `mcp_checks` (already canonical-first), `permissions_checks`, and `config_checks`; and `job_workflow.py` (a read-only path that never creates the directory). Where docs mention these, only the project-data sites above have migrated — home-level sites and read-only reads still use `.praison`.
</Note>

***

## 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>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.