# Example provider configs

> Copy-paste YAML from examples/configs for vLLM, Ollama, OpenRouter, DeepInfra, Azure, and cloud-compatible endpoints mapped to agent config keys.

- Repository: vxcontrol/pentagi
- GitHub: https://github.com/vxcontrol/pentagi
- Human docs: https://grok-wiki.com/public/docs/vxcontrol-pentagi-eca0cf4de5f5
- Complete Markdown: https://grok-wiki.com/public/docs/vxcontrol-pentagi-eca0cf4de5f5/llms-full.txt

## Source Files

- `examples/configs/vllm-qwen3.5-27b-fp8.provider.yml`
- `examples/configs/custom-openai.provider.yml`
- `examples/configs/openrouter.provider.yml`
- `examples/configs/deepinfra.provider.yml`
- `examples/configs/azure-openai.provider.yml`
- `examples/configs/ollama-qwen332b-fp16-tc.provider.yml`
- `examples/tests/openai-report.md`

---

---
title: "Example provider configs"
description: "Copy-paste YAML from examples/configs for vLLM, Ollama, OpenRouter, DeepInfra, Azure, and cloud-compatible endpoints mapped to agent config keys."
---

`examples/configs/*.provider.yml` files are full `ProviderConfig` YAML maps: each top-level key is an agent slot (`simple`, `primary_agent`, `coder`, …), and each value is an `AgentConfig` (`model`, sampling, `reasoning`, `price`, `extra_body`). At runtime, `LoadConfig` / `LoadConfigData` parse `.yml`/`.yaml` or `.json` into `backend/pkg/providers/pconfig.ProviderConfig`. Connection details stay in env (`LLM_SERVER_*` or `OLLAMA_SERVER_*`); the YAML only assigns models and call options per agent.

Docker images bake the same files into `/opt/pentagi/conf/`. Compose can also bind-mount host files via `PENTAGI_LLM_SERVER_CONFIG_PATH` → `/opt/pentagi/conf/custom.provider.yml` and `PENTAGI_OLLAMA_SERVER_CONFIG_PATH` → `/opt/pentagi/conf/ollama.provider.yml`.

## Catalog

| File | Endpoint style | Typical env path | Notes |
|------|----------------|------------------|-------|
| `vllm-qwen3.5-27b-fp8.provider.yml` | OpenAI-compatible vLLM | `LLM_SERVER_*` | Thinking on primary roles; `enable_thinking: false` on utility agents |
| `vllm-qwen3.5-27b-fp8-no-think.provider.yml` | vLLM | `LLM_SERVER_*` | Thinking disabled on all agents |
| `vllm-qwen3.6-27b-fp8*.provider.yml` | vLLM | `LLM_SERVER_*` | Same pattern for Qwen3.6-27B-FP8 |
| `vllm-qwen3.6-35b-a3b-fp8*.provider.yml` | vLLM | `LLM_SERVER_*` | MoE 35B-A3B FP8 |
| `vllm-qwen332b-fp16.provider.yml` | vLLM | `LLM_SERVER_*` | Single-model `Qwen/Qwen3-32B` |
| `ollama-qwen332b-fp16-tc.provider.yml` | Ollama local | `OLLAMA_SERVER_*` | Minimal single-model map (`qwen3:32b-fp16-tc`) |
| `ollama-qwq32b-fp16-tc.provider.yml` | Ollama local | `OLLAMA_SERVER_*` | Single-model `qwq:32b-fp16-tc` |
| `ollama-llama318b.provider.yml` | Ollama local | `OLLAMA_SERVER_*` | `llama3.1:8b` |
| `ollama-llama318b-instruct.provider.yml` | Ollama local | `OLLAMA_SERVER_*` | `llama3.1:8b-instruct-q8_0` |
| `ollama-cloud.provider.yml` | Ollama Cloud | `OLLAMA_SERVER_*` | Multi-model paid-tier assignments |
| `openrouter.provider.yml` | Aggregator | `LLM_SERVER_*` | Mixed vendors via OpenRouter model IDs |
| `deepinfra.provider.yml` | Aggregator | `LLM_SERVER_*` | Mixed DeepInfra model IDs + `price` |
| `custom-openai.provider.yml` | OpenAI API | `LLM_SERVER_*` | Unverified-org friendly (`o3-mini` vs o1/o3/o4-mini) |
| `azure-openai.provider.yml` | Azure OpenAI-compatible | `LLM_SERVER_*` | Deployment names as `model`; higher `max_tokens` |
| `deepseek.provider.yml` | DeepSeek / custom | `LLM_SERVER_*` or native DeepSeek | `extra_body.thinking` + `reasoning` |
| `moonshot.provider.yml` | Moonshot / custom | `LLM_SERVER_*` | Often needs `LLM_SERVER_PRESERVE_REASONING=true` |
| `novita.provider.yml` | Novita aggregator | `LLM_SERVER_*` | Prefixed model IDs |

All of the above (except host-only edits) ship under `/opt/pentagi/conf/` in the image.

## Agent keys

Every example file defines the same 13 agent slots. Keys must match `ProviderConfig` YAML tags exactly:

| Key | Role |
|-----|------|
| `simple` | Lightweight calls |
| `simple_json` | Structured JSON (`json: true`) |
| `primary_agent` | Flow orchestration |
| `assistant` | Assistant mode |
| `generator` | Subtask plan generation |
| `refiner` | Plan refinement |
| `adviser` | Advisory / analysis |
| `reflector` | Reflection loops |
| `searcher` | Search / gather |
| `enricher` | Context enrichment |
| `coder` | Code generation |
| `installer` | Tool/setup work |
| `pentester` | Exploitation / pentest steps |

Missing keys fall back to provider defaults when the runtime builds options; example files intentionally fill all slots.

## Per-agent fields

Common `AgentConfig` fields used in examples:

| Field | Type | Purpose |
|-------|------|---------|
| `model` | string | Model or deployment id sent to the API |
| `temperature`, `top_p`, `top_k`, `min_p` | number | Sampling |
| `presence_penalty`, `repetition_penalty`, `frequency_penalty` | number | Penalties (vLLM/Qwen samples use these heavily) |
| `n` | int | Completions per call (examples use `1`) |
| `max_tokens` | int | Output budget |
| `json` | bool | Force JSON mode (`simple_json`) |
| `reasoning.effort` | string | e.g. `low` / `medium` / `high` |
| `reasoning.max_tokens` | int | Reasoning token budget (some aggregators) |
| `price.input` / `price.output` | float | USD per **1M** tokens (cost accounting) |
| `price.cache_read` / `price.cache_write` | float | Optional cache rates |
| `extra_body` | object | Provider-specific request merge (e.g. `chat_template_kwargs`, `thinking`) |

Full field list and UI test surfaces: [Provider configuration schema](/provider-config-schema).

## Wire a config into the stack

<Steps>
  <Step title="Pick the YAML">
    Copy from the repo (`examples/configs/…`) or use the baked path `/opt/pentagi/conf/<name>.provider.yml` inside the container.
  </Step>
  <Step title="Point env at the file">
    Custom OpenAI-compatible backends:

    ```bash
    LLM_SERVER_URL=https://…/v1
    LLM_SERVER_KEY=…
    LLM_SERVER_MODEL=                 # leave empty when models come from YAML
    LLM_SERVER_CONFIG_PATH=/opt/pentagi/conf/openrouter.provider.yml
    LLM_SERVER_PROVIDER=              # optional LiteLLM prefix, e.g. openrouter
    LLM_SERVER_LEGACY_REASONING=false
    LLM_SERVER_PRESERVE_REASONING=false
    ```

    Ollama:

    ```bash
    OLLAMA_SERVER_URL=http://ollama-server:11434   # or https://ollama.com
    OLLAMA_SERVER_API_KEY=                         # required for Ollama Cloud
    OLLAMA_SERVER_MODEL=
    OLLAMA_SERVER_CONFIG_PATH=/opt/pentagi/conf/ollama-qwen332b-fp16-tc.provider.yml
    ```
  </Step>
  <Step title="Mount host overrides (optional)">
    ```bash
    PENTAGI_LLM_SERVER_CONFIG_PATH=./my-custom.provider.yml
    PENTAGI_OLLAMA_SERVER_CONFIG_PATH=./my-ollama.provider.yml
    ```

    Compose mounts these to `/opt/pentagi/conf/custom.provider.yml` and `/opt/pentagi/conf/ollama.provider.yml`. Set `LLM_SERVER_CONFIG_PATH` / `OLLAMA_SERVER_CONFIG_PATH` to those in-container paths when using the mounts.
  </Step>
  <Step title="Verify with ctester">
    ```bash
    docker exec -it pentagi /opt/pentagi/bin/ctester \
      -config /opt/pentagi/conf/openrouter.provider.yml

    # From a backend checkout
    go run ./cmd/ctester/*.go \
      -config ../examples/configs/deepinfra.provider.yml \
      -report ../test-report.md
    ```

    Sample run reports live under `examples/tests/` (e.g. `openai-report.md`, `openrouter-report.md`).
  </Step>
</Steps>

## OpenAI-compatible custom endpoints

Use `LLM_SERVER_*` for any OpenAI chat-completions compatible API (OpenAI, Azure OpenAI-compatible gateways, vLLM, OpenRouter, DeepInfra, Novita, LiteLLM, etc.). Leave `LLM_SERVER_MODEL` empty when the YAML sets every agent `model`.

### OpenRouter

Endpoint: `https://openrouter.ai/api/v1`. Models use vendor-prefixed IDs.

| Agent | Model in `openrouter.provider.yml` |
|-------|--------------------------------------|
| `simple` / `simple_json` / `reflector` / `enricher` | `openai/gpt-4.1-mini` |
| `primary_agent` / `assistant` | `openai/gpt-5` |
| `generator` / `coder` | `anthropic/claude-sonnet-4.5` |
| `refiner` / `adviser` | `google/gemini-2.5-pro` |
| `searcher` | `x-ai/grok-3-mini` |
| `installer` | `google/gemini-2.5-flash` |
| `pentester` | `moonshotai/kimi-k2-0905` |

```bash
LLM_SERVER_URL=https://openrouter.ai/api/v1
LLM_SERVER_KEY=sk-or-…
LLM_SERVER_CONFIG_PATH=/opt/pentagi/conf/openrouter.provider.yml
```

```yaml
# examples/configs/openrouter.provider.yml (excerpt)
primary_agent:
  model: "openai/gpt-5"
  n: 1
  max_tokens: 6000
  reasoning:
    effort: medium
  price:
    input: 1.25
    output: 10.0

generator:
  model: "anthropic/claude-sonnet-4.5"
  n: 1
  max_tokens: 12000
  reasoning:
    max_tokens: 4000
  price:
    input: 3.0
    output: 15.0
```

### DeepInfra

Endpoint: `https://api.deepinfra.com/v1/openai`. Same agent map pattern; different model ids and prices.

| Agent | Model in `deepinfra.provider.yml` |
|-------|-------------------------------------|
| `simple` / `simple_json` / `reflector` | `Qwen/Qwen3-Next-80B-A3B-Instruct` |
| `primary_agent` / `assistant` / `pentester` | `moonshotai/Kimi-K2-Instruct-0905` |
| `generator` / `adviser` | `google/gemini-2.5-pro` |
| `refiner` | `deepseek-ai/DeepSeek-R1-0528-Turbo` |
| `searcher` / `enricher` | `Qwen/Qwen3-32B` |
| `coder` | `anthropic/claude-4-sonnet` |
| `installer` | `google/gemini-2.5-flash` |

```bash
LLM_SERVER_URL=https://api.deepinfra.com/v1/openai
LLM_SERVER_KEY=…
LLM_SERVER_CONFIG_PATH=/opt/pentagi/conf/deepinfra.provider.yml
```

### Custom OpenAI (unverified org)

`custom-openai.provider.yml` maps heavy agents to `o3-mini` and lighter work to `gpt-4.1-mini` / `gpt-4.1`, with `reasoning.effort` and `price` blocks.

```bash
LLM_SERVER_URL=https://api.openai.com/v1
LLM_SERVER_KEY=sk-…
LLM_SERVER_CONFIG_PATH=/opt/pentagi/conf/custom-openai.provider.yml
LLM_SERVER_LEGACY_REASONING=true
```

```yaml
# examples/configs/custom-openai.provider.yml (excerpt)
simple:
  model: "gpt-4.1-mini"
  temperature: 0.5
  top_p: 0.5
  n: 1
  max_tokens: 3000
  price:
    input: 0.4
    output: 1.6

primary_agent:
  model: "o3-mini"
  n: 1
  max_tokens: 4000
  reasoning:
    effort: low
  price:
    input: 1.1
    output: 4.4

coder:
  model: "gpt-4.1"
  temperature: 0.2
  top_p: 0.1
  n: 1
  max_tokens: 6000
  price:
    input: 2.0
    output: 8.0
```

### Azure OpenAI–compatible

`azure-openai.provider.yml` uses deployment-style names (`gpt-4.1-mini`, `o4-mini`, `gpt-4.1`) and larger `max_tokens` than the custom OpenAI sample. Point `LLM_SERVER_URL` at your Azure (or Azure-compatible) base URL that speaks chat completions.

```bash
LLM_SERVER_URL=https://YOUR_RESOURCE.openai.azure.com/openai/v1
LLM_SERVER_KEY=…
LLM_SERVER_CONFIG_PATH=/opt/pentagi/conf/azure-openai.provider.yml
LLM_SERVER_LEGACY_REASONING=true
```

```yaml
# examples/configs/azure-openai.provider.yml (excerpt)
generator:
  model: "o4-mini"
  n: 1
  max_tokens: 32768
  price:
    input: 1.1
    output: 4.4

pentester:
  model: "o4-mini"
  n: 1
  max_tokens: 8192
  price:
    input: 1.1
    output: 4.4
```

### LiteLLM proxy

Keep the same YAML; set `LLM_SERVER_PROVIDER` so model names are prefixed (e.g. `openrouter`, `deepinfra`, `moonshot`, `novita`). Empty `LLM_SERVER_PROVIDER` means direct API ids as written in the file.

## vLLM (local / air-gapped)

vLLM examples assume an OpenAI-compatible server (typically `…/v1`) and a single model id for every agent. Sampling follows Qwen guidance: higher temp/`top_p` for reasoning agents; lower temp and `presence_penalty: 0.0` for `coder` / `installer` / `pentester`.

### Thinking vs non-thinking

| File | Behavior |
|------|----------|
| `vllm-qwen3.5-27b-fp8.provider.yml` | Primary roles think by default; `simple`, `simple_json`, `reflector`, `searcher`, `enricher` set `extra_body.chat_template_kwargs.enable_thinking: false` |
| `vllm-qwen3.5-27b-fp8-no-think.provider.yml` | All agents set `enable_thinking: false` |

Same dual-file pattern exists for Qwen3.6-27B-FP8 and Qwen3.6-35B-A3B-FP8.

```bash
LLM_SERVER_URL=http://host.docker.internal:8000/v1
LLM_SERVER_KEY=not-needed
LLM_SERVER_CONFIG_PATH=/opt/pentagi/conf/vllm-qwen3.5-27b-fp8.provider.yml
```

```yaml
# examples/configs/vllm-qwen3.5-27b-fp8.provider.yml (excerpt)
simple:
  model: "Qwen/Qwen3.5-27B-FP8"
  temperature: 0.7
  top_k: 20
  top_p: 0.8
  min_p: 0.0
  presence_penalty: 1.5
  repetition_penalty: 1.0
  n: 1
  max_tokens: 32768
  extra_body:
    chat_template_kwargs:
      enable_thinking: false

primary_agent:
  model: "Qwen/Qwen3.5-27B-FP8"
  temperature: 1.0
  top_k: 20
  top_p: 0.95
  min_p: 0.0
  presence_penalty: 1.5
  repetition_penalty: 1.0
  n: 1
  max_tokens: 32768

coder:
  model: "Qwen/Qwen3.5-27B-FP8"
  temperature: 0.6
  top_k: 20
  top_p: 0.95
  min_p: 0.0
  presence_penalty: 0.0
  repetition_penalty: 1.0
  n: 1
  max_tokens: 32768
```

Hardware matrix, vLLM serve flags, and supervision knobs: [Deploy with vLLM and Qwen](/vllm-qwen-deployment).

## Ollama

Ollama uses `OLLAMA_SERVER_*` (not `LLM_SERVER_*`). Config path: `OLLAMA_SERVER_CONFIG_PATH`.

### Local single-model maps

`ollama-qwen332b-fp16-tc.provider.yml` is the minimal template—same model and `max_tokens` on every agent:

```yaml
# examples/configs/ollama-qwen332b-fp16-tc.provider.yml (complete)
simple:
  model: "qwen3:32b-fp16-tc"
  n: 1
  max_tokens: 40000

simple_json:
  model: "qwen3:32b-fp16-tc"
  n: 1
  max_tokens: 40000

primary_agent:
  model: "qwen3:32b-fp16-tc"
  n: 1
  max_tokens: 40000

assistant:
  model: "qwen3:32b-fp16-tc"
  n: 1
  max_tokens: 40000

generator:
  model: "qwen3:32b-fp16-tc"
  n: 1
  max_tokens: 40000

refiner:
  model: "qwen3:32b-fp16-tc"
  n: 1
  max_tokens: 40000

adviser:
  model: "qwen3:32b-fp16-tc"
  n: 1
  max_tokens: 40000

reflector:
  model: "qwen3:32b-fp16-tc"
  n: 1
  max_tokens: 40000

searcher:
  model: "qwen3:32b-fp16-tc"
  n: 1
  max_tokens: 40000

enricher:
  model: "qwen3:32b-fp16-tc"
  n: 1
  max_tokens: 40000

coder:
  model: "qwen3:32b-fp16-tc"
  n: 1
  max_tokens: 40000

installer:
  model: "qwen3:32b-fp16-tc"
  n: 1
  max_tokens: 40000

pentester:
  model: "qwen3:32b-fp16-tc"
  n: 1
  max_tokens: 40000
```

```bash
OLLAMA_SERVER_URL=http://ollama-server:11434
OLLAMA_SERVER_CONFIG_PATH=/opt/pentagi/conf/ollama-qwen332b-fp16-tc.provider.yml
OLLAMA_SERVER_PULL_MODELS_ENABLED=false
OLLAMA_SERVER_LOAD_MODELS_ENABLED=false
```

### Ollama Cloud multi-model

`ollama-cloud.provider.yml` assigns different `:cloud` models per agent (e.g. `qwen3-coder-next:cloud` for `primary_agent` / `coder` / `pentester`, `qwen3.5:397b-cloud` for `searcher`).

```bash
OLLAMA_SERVER_URL=https://ollama.com
OLLAMA_SERVER_API_KEY=…
OLLAMA_SERVER_CONFIG_PATH=/opt/pentagi/conf/ollama-cloud.provider.yml
```

## Other cloud-compatible samples

| File | When to use |
|------|-------------|
| `deepseek.provider.yml` | DeepSeek models with `extra_body.thinking.type` enabled/disabled per agent and `reasoning.effort` |
| `moonshot.provider.yml` | Kimi / Moonshot; pair with `LLM_SERVER_PRESERVE_REASONING=true` if the API requires reasoning content on tool turns |
| `novita.provider.yml` | Novita OpenAI-compatible gateway (`https://api.novita.ai/openai`) |

These still load through the custom config path when using `LLM_SERVER_CONFIG_PATH`, or through the matching native provider when you set that provider’s own env keys.

## Copy-paste starter (host file)

Minimal bootstrap for a custom host-mounted OpenAI-compatible profile:

```bash
curl -o example.custom.provider.yml \
  https://raw.githubusercontent.com/vxcontrol/pentagi/master/examples/configs/custom-openai.provider.yml
curl -o example.ollama.provider.yml \
  https://raw.githubusercontent.com/vxcontrol/pentagi/master/examples/configs/ollama-llama318b.provider.yml
```

Compose defaults mount those filenames when `PENTAGI_*_CONFIG_PATH` is unset.

## Failure modes

| Symptom | Check |
|---------|--------|
| Config ignored | Path empty or unreadable; extension not `.yml`/`.yaml`/`.json` |
| Wrong models | `LLM_SERVER_MODEL` overriding intent; set empty and rely on YAML |
| LiteLLM 404 on model | Set `LLM_SERVER_PROVIDER` to the proxy prefix |
| OpenAI reasoning errors | `LLM_SERVER_LEGACY_REASONING=true` for OpenAI-style reasoning |
| Moonshot tool-call errors about missing reasoning | `LLM_SERVER_PRESERVE_REASONING=true` |
| Ollama Cloud 401 | Missing `OLLAMA_SERVER_API_KEY` |
| Mount not visible in container | Use in-container path under `/opt/pentagi/conf/…` in `*_CONFIG_PATH` |
| Agent tests fail | Re-run `ctester -config …`; compare with `examples/tests/*-report.md` |

## Related pages

<CardGroup cols={2}>
  <Card title="Local and custom providers" href="/local-and-custom-providers">
    LLM_SERVER_* and OLLAMA_SERVER_* wiring, legacy/preserve reasoning flags, aggregators.
  </Card>
  <Card title="Provider configuration schema" href="/provider-config-schema">
    Full AgentsConfig / AgentConfig fields, baselines, and UI testAgent/testProvider.
  </Card>
  <Card title="Configure LLM providers" href="/configure-llm-providers">
    Built-in provider keys and UI profiles for OpenAI, Anthropic, Gemini, and others.
  </Card>
  <Card title="Deploy with vLLM and Qwen" href="/vllm-qwen-deployment">
    Hardware matrix, vLLM serve flags, thinking vs non-thinking YAML, supervision for smaller models.
  </Card>
  <Card title="Environment variables" href="/environment-variables">
    Authoritative Config struct and .env.example for all provider and path keys.
  </Card>
  <Card title="Development and testing" href="/development-and-testing">
    ctester, ftester, and contributor workflows for validating provider YAML.
  </Card>
</CardGroup>
