--- title: Custom description: Custom vendor configuration for third-party API proxies and local models --- For model services accessed via the OpenAI-compatible protocol or locally deployed models, such as: - **Third-party API proxies**: call multiple models through a unified API base - **Local models**: models deployed locally with tools like Ollama, vLLM, LocalAI - **Private deployments**: model services deployed inside an enterprise Difference from the `openai` vendor: when a custom vendor is selected, switching models via `/config model` does not automatically switch the vendor type — the custom API address is always used. ## Text Chat ### Third-party API proxy ```json { "bot_type": "custom", "model": "", "custom_api_key": "YOUR_API_KEY", "custom_api_base": "https://{your-proxy.com}/v1" } ``` | Parameter | Description | | --- | --- | | `bot_type` | Must be set to `custom` | | `model` | Model name; any model name supported by the proxy service | | `custom_api_key` | API key provided by the proxy service | | `custom_api_base` | API endpoint provided by the proxy service; must be OpenAI-compatible | ### Local models Local models usually do not require an API key — only the API base needs to be filled in: ```json { "bot_type": "custom", "model": "qwen3.5:27b", "custom_api_base": "http://localhost:11434/v1" } ``` Common local deployment tools and their default endpoints: | Tool | Default API Base | | --- | --- | | [Ollama](https://ollama.com) | `http://localhost:11434/v1` | | [vLLM](https://docs.vllm.ai) | `http://localhost:8000/v1` | | [LocalAI](https://localai.io) | `http://localhost:8080/v1` | ### Switching Models Switching models under a custom vendor only changes `model` — `bot_type` and the API endpoint remain unchanged: ``` /config model qwen3.5:27b ``` ## Configuring Multiple Custom Providers If you need to configure several OpenAI-compatible third-party services at once (e.g. SiliconFlow, Qiniu), use the `custom_providers` list and activate one by setting `bot_type` to `"custom:"`: ```json { "bot_type": "custom:3f2a9c1b", "custom_providers": [ { "id": "3f2a9c1b", "name": "siliconflow", "api_key": "YOUR_SILICONFLOW_KEY", "api_base": "https://api.siliconflow.cn/v1", "model": "deepseek-ai/DeepSeek-V3" }, { "id": "a1b2c3d4", "name": "qiniu", "api_key": "YOUR_QINIU_KEY", "api_base": "https://api.qnaigc.com/v1", "model": "deepseek-v3" } ] } ``` | Parameter | Description | | --- | --- | | `custom_providers` | List of custom providers; each item has `id`, `name`, `api_key`, `api_base`, and an optional `model` | | `bot_type` | Set to `"custom:"` to activate a specific provider; `id` is the provider's unique identifier | | `id` | Server-generated short identifier (8-char hex); used as the primary key for each provider | | `name` | User-facing display label — can be freely renamed without breaking anything | | `model` | Optional; when set, this model is used instead of the global `model` field | The `id` is auto-generated by the web console when you add a provider — you don't need to create it manually. If editing `config.json` by hand, use any unique 8-character hex string (e.g. run `python3 -c "import uuid; print(uuid.uuid4().hex[:8])"`). When `bot_type` is exactly `"custom"` (no colon suffix), CowAgent uses the legacy single-provider `custom_api_key` / `custom_api_base` fields, so existing configurations keep working without any changes.