Configuration Internals (defaults and overrides)
This page is for contributors: it explains where Pipelex defaults live, how configuration is merged at runtime, and where to change the behavior in code.
For the user-facing configuration guide, see Configuration Overview.
Mental model (for contributors)
Pipelex configuration is merged in layers:
- Shipped defaults: maintained by the Pipelex project and used as the baseline by the installed package.
- Global config (
~/.pipelex/): machine-wide settings for a developer, applied to every project on the machine. - Project config (
{project_root}/.pipelex/): per-project settings, edited by teams using Pipelex. - Override files at each level (
pipelex_local.toml,pipelex_{environment}.toml,pipelex_{run_mode}.toml,pipelex_override.toml,pipelex_temporary_override.toml): optional, typically gitignored, used for personal or ephemeral tweaks.
The key idea: global personal preferences layer under project-specific settings — both are loaded, and project values win on collisions. Nothing in ~/.pipelex/ is shadowed by the mere existence of a project .pipelex/.
Where defaults live (Pipelex repository)
- Default values (baseline): repo root
pipelex.toml - User-facing templates copied into
.pipelex/by the init flow:pipelex/kit/configs/…
Merge order (runtime)
The configuration loading/merging behavior is implemented in pipelex/system/configuration/config_loader.py. Files are deep-merged via load_toml_from_path_and_merge_with_overrides; the later a file appears in the load list, the higher its precedence per leaf key.
Load order:
- Package defaults —
pipelex/pipelex.tomlshipped with the installed package. - Global base —
~/.pipelex/pipelex.toml. - Global override sequence — from
~/.pipelex/, in this order:pipelex_local.tomlpipelex_{environment}.tomlpipelex_{run_mode}.toml(see unit-test special case below)pipelex_override.tomlpipelex_temporary_override.toml
- Project base —
{project_root}/.pipelex/pipelex.toml, if a project.pipelex/exists and is distinct from~/.pipelex/. - Project override sequence — same five files as step 3, read from
{project_root}/.pipelex/, if the project dir is distinct from the global dir. - Programmatic
extra_overridespassed intoConfigLoader.load_config()(if any).
Unit-test special case
When runtime_manager.is_unit_testing is true, the pipelex_{run_mode}.toml entry is sourced exclusively from ./tests/pipelex_{run_mode}.toml (e.g. tests/pipelex_unit_test.toml). Global and project run_mode files are not loaded, keeping test runs hermetic from machine-wide overrides.
Where to change things in code
- Config merge logic:
pipelex/system/configuration/config_loader.py - Override lists (
local/super):pipelex/system/configuration/config_root.py
Contributor guidelines for config changes
- If you change defaults, update the repo root
pipelex.toml(and consider whether templates inpipelex/kit/configs/…should also be updated). - If you change templates, keep them user-focused and stable; avoid adding internal-only details.
- If you change merge order or override semantics, treat it as a potentially breaking change and document it (changelog + migration notes if needed).
Test Profile Configuration
The test profile system controls which AI models are included in parametrized tests. This is separate from the main Pipelex configuration.
Files
| File | Purpose | Tracked |
|---|---|---|
.pipelex-dev/test_profiles.toml |
Base profiles and model collections | Yes |
.pipelex-dev/test_profiles_override.toml |
Local customizations | No (gitignored) |
How it works
- Collections define reusable lists of models organized by provider
- Profiles reference collections or specify models directly
- The preprocessing command resolves references and generates fixture files
Key code locations
- Profile loading & merging:
pipelex/cli/dev_cli/commands/preprocess_test_models_cmd.py - Generated fixtures:
tests/integration/pipelex/fixtures/_generated_model_sets.py
Common tasks
# Regenerate fixtures with default (dev) profile
make regenerate-test-models
# Use a specific profile
make regenerate-test-models TEST_PROFILE=full
For full documentation, see Test Profile Configuration.