Minimal example
Add this to~/.soulforge/config.json (or .soulforge/config.json for project scope):
Fields
| Field | Required | What it does |
|---|---|---|
id | yes | Used in model strings (together/llama-3) |
baseURL | yes | OpenAI-compatible endpoint |
name | — | Display name |
envVar | — | Env var for the key (omit for auth-less servers) |
models | — | Fallback model list (strings or {id, name, contextWindow}) |
modelsAPI | — | URL returning OpenAI /v1/models format |
reasoning | — | Thinking/reasoning config (see below) |
More examples
Local server (no key)
Local server (no key)
Corporate gateway with dynamic model list
Corporate gateway with dynamic model list
Multiple providers at once
Multiple providers at once
Thinking / reasoning
For models that support reasoning over an OpenAI-compatible endpoint, add areasoning block. Three styles are supported — use the one your provider accepts:
| Style | Fields | When to use |
|---|---|---|
| OpenAI-style | effort: "low" | "medium" | "high" | "xhigh" | "none" | OpenAI-compatible reasoning models |
| DashScope-style | enabled: true, budget: 8192 | Alibaba Qwen, DashScope APIs |
| Raw | extraParams: { ... } | Anything else — fields are forwarded verbatim |
extraParams override all other keys on collision.
Scope
- Global —
~/.soulforge/config.jsonapplies everywhere. - Project —
.soulforge/config.jsonoverrides global entries with the sameid.
Conflicts
If yourid matches a built-in (e.g. "anthropic"), SoulForge renames it to {id}-custom — the built-in is never replaced. Custom providers always show [custom] in /keys and --list-providers.
