自定义提供商
AISCouncil 支持任何实现 OpenAI chat completions 格式的 LLM API。这让您可以连接到自托管模型、企业 LLM 网关、替代提供商和本地推理服务器。
什么是自定义提供商
自定义提供商是使用 OpenAI 兼容 API 格式(/v1/chat/completions 和 SSE 流式传输)的用户定义 LLM 端点。大多数现代推理服务器和 LLM 网关都实现此格式,使其成为 LLM API 的事实标准。
用例
- 自托管模型 —— 连接到在您自己的硬件上运行的 vLLM、Text Generation Inference 或 LocalAI
- 企业 LLM 网关 —— 通过您公司的 API 代理路由,带有身份验证和日志记录
- 本地代理 —— 使用 LiteLLM 或类似工具将多个提供商统一在单个端点后面
- 替代提供商 —— 连接到尚未内置到应用程序中的任何提供商
- 微调模型 —— 在任何兼容的托管平台上访问您的自定义微调模型
- 隔离部署 —— 使用在本地网络上运行的模型,无需互联网访问
通过设置添加自定义提供商
- 打开设置(点击齿轮图标或按
Ctrl+Shift+S) - 进入 API 密钥部分
- 滚动到自定义提供商
- 填写字段:
| 字段 | 必需 | 描述 |
|---|---|---|
| 提供商 ID | 是 | 短标识符(例如 my-llm)。必须唯一、小写、无空格 |
| 显示名称 | 是 | 在提供商下拉菜单中显示的人类可读名称 |
| 端点 URL | 是 | chat completions 端点的完整 URL(例如 https://my-api.example.com/v1/chat/completions) |
| API 密钥 | 否 | 用于身份验证的 Bearer token(如果不需要则留空) |
| 模型 | 是 | 此端点可用的模型 ID 的逗号分隔列表 |
- 点击保存
- 创建或配置机器人时,提供商会出现在提供商下拉菜单中
编程注册
您可以从浏览器控制台或脚本注册自定义提供商:
AIS.Providers.registerCustom("my-provider", {
name: "My Provider",
endpoint: "https://my-api.example.com/v1/chat/completions",
models: [
{ id: "my-model-7b", name: "My Model 7B" },
{ id: "my-model-70b", name: "My Model 70B" },
],
apiStyle: "openai",
});
注册选项
| 选项 | 类型 | 默认值 | 描述 |
|---|---|---|---|
name | string | 提供商 ID | 显示名称 |
endpoint | string | 必需 | chat completions 端点的完整 URL |
models | array | [{id: 'default', name: id}] | 可用模型 |
apiStyle | string | 'openai' | API 格式(目前仅支持 'openai') |
extraHeaders | object | {} | 每个请求中包含的额外 HTTP 头 |
pricing | object | null | 定价信息(用于成本跟踪) |
maxInput | number | 0 | 最大输入上下文长度(仅用于显示) |
额外头
如果您的端点需要自定义头(例如,对于 Bearer token 以外的身份验证方案):
AIS.Providers.registerCustom("corp-gateway", {
name: "Corporate Gateway",
endpoint: "https://llm.corp.internal/v1/chat/completions",
models: [{ id: "gpt-4o", name: "GPT-4o (via gateway)" }],
extraHeaders: {
"X-Corp-Token": "your-internal-token",
"X-Department": "engineering",
},
});
持久性
自定义提供商自动保存到 localStorage 中的 ais-custom-providers 键下。它们在每次页面加载时恢复,因此您只需注册一次。
管理自定义提供商
列出已注册的自定义提供商
const customIds = AIS.Providers.listCustom();
// ['my-provider', 'corp-gateway']
删除自定义提供商
AIS.Providers.removeCustom("my-provider");
这会从运行时注册表和 localStorage 中删除它。
列出所有提供商(内置 + 自定义)
const all = AIS.Providers.list();
// [{ name: 'anthropic', models: [...] }, { name: 'my-provider', models: [...] }, ...]
内部工作原理
自定义提供商使用与内置 OpenAI、xAI、OpenRouter、DeepSeek、Groq 和其他提供商相同的 openaiCompatible() SSE 流式工厂。此工厂:
- 构建标准 OpenAI 格式的请求体(model、messages、temperature、max_tokens、stream 等)
- 使用
Authorization: Bearer {apiKey}头发送 POST 请求 - 解析 SSE 流(
data: {...}行)以获取内容增量 - 处理流式(delta)和非流式(message)响应格式
- 如果存在,从
usage字段提取 token 使用情况
所有配置字段都适用于自定义提供商:温度、top_p、频率惩罚、存在惩罚、停止序列、响应格式和推理投入。
兼容服务
以下服务实现 OpenAI 兼容 API 格式并可作为自定义提供商工作:
| 服务 | 端点 | 说明 |
|---|---|---|
| LiteLLM | http://localhost:4000/v1/chat/completions | 统一 100+ 提供商的代理 |
| LocalAI | http://localhost:8080/v1/chat/completions | 本地运行开源模型 |
| vLLM | http://localhost:8000/v1/chat/completions | 高性能推理服务器 |
| Text Generation Inference | http://localhost:8080/v1/chat/completions | Hugging Face 推理服务器 |
| Ollama | http://localhost:11434/v1/chat/completions | 已内置,但也可作为自定义添加 |
| llama.cpp(服务器模式) | http://localhost:8080/v1/chat/completions | 轻量级 C++ 推理 |
| Jan | http://localhost:1337/v1/chat/completions | 带有本地模型的桌面应用 |
| LM Studio | http://localhost:1234/v1/chat/completions | 带有模型管理的桌面应用 |
| Cloudflare Workers AI | https://api.cloudflare.com/client/v4/accounts/{id}/ai/v1/chat/completions | 已内置,但可自定义 |
| Azure OpenAI | https://{resource}.openai.azure.com/openai/deployments/{deployment}/chat/completions?api-version=2024-02-01 | 需要 api-key 头 |
故障排除
CORS 错误
CORS(跨源资源共享)
当浏览器直接调用 API 端点时,服务器必须在其响应中包含 CORS 头。没有它们,浏览器出于安全原因会阻止请求。
如果您在控制台中看到 CORS 错误,您的自定义端点需要返回这些头:
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Methods: POST, OPTIONS
对于本地服务:
- Ollama: 在启动前设置
OLLAMA_ORIGINS=*环境变量 - vLLM: 添加
--allowed-origins '*'标志 - LiteLLM: 添加
--cors标志或设置LITELLM_ALLOW_ORIGINS=* - LocalAI: CORS 默认启用
对于反向代理(Nginx)后面的远程服务:
location /v1/ {
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization' always;
add_header 'Access-Control-Allow-Methods' 'POST, OPTIONS' always;
if ($request_method = 'OPTIONS') {
return 204;
}
proxy_pass http://localhost:8000;
}
连接被拒绝
- 验证端点 URL 正确且服务正在运行
- 对于本地服务,确保服务器在预期端口上监听
- 对于
localhost服务,尝试使用127.0.0.1代替(或反之) - 检查没有防火墙阻止端口
身份验证错误
- 验证您的 API 密钥正确
- 某些服务使用不同的身份验证头 —— 如果服务不使用标准
Authorization: Bearer格式,请使用extraHeaders - Azure OpenAI 使用
api-key头而不是Authorization
空响应或乱码响应
- 确认端点返回 OpenAI 兼容的 SSE 格式(
data: {"choices":[{"delta":{"content":"..."}}]}) - 某些服务需要在请求体中使用
stream: true(应用程序默认发送此参数) - 检查模型 ID 与服务期望的匹配
- 在开发者工具中打开浏览器的网络标签页以检查原始请求和响应