mirror of
https://github.com/zhayujie/chatgpt-on-wechat.git
synced 2026-07-17 11:07:11 +08:00
Rework the multi custom-provider design per maintainer review: 1. Data model: use server-generated uuid4 short id as primary key; 'name' is now a pure display label that can be freely renamed. 2. Routing: drop 'custom_active_provider'; activate a provider by setting bot_type to 'custom:<id>'. Single source of truth — no pointer drift between bot_type and a separate active selector. 3. Security: drag_sensitive() now recursively masks api_key/secret in nested structures (custom_providers list); previously only top-level string fields were masked. 4. Per-provider model: the provider's 'model' field now takes effect on the main chat path and agent path (was silently ignored before). 5. XSS fix: replace all inline onclick handlers in custom-provider UI with data-* attributes + event delegation. Provider names never appear in executable HTML contexts. Legacy compatibility: bot_type='custom' (no colon) still reads the flat custom_api_key/custom_api_base fields byte-for-byte identically. Closes: consolidates #2876 into this PR as requested. Ref: #2838
105 lines
3.5 KiB
Plaintext
105 lines
3.5 KiB
Plaintext
---
|
|
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
|
|
|
|
<Note>
|
|
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.
|
|
</Note>
|
|
|
|
## 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:<id>"`:
|
|
|
|
```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:<id>"` 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 |
|
|
|
|
<Note>
|
|
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])"`).
|
|
</Note>
|
|
|
|
<Note>
|
|
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.
|
|
</Note>
|