跳到主要内容

自定义提供商

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 或类似工具将多个提供商统一在单个端点后面
  • 替代提供商 —— 连接到尚未内置到应用程序中的任何提供商
  • 微调模型 —— 在任何兼容的托管平台上访问您的自定义微调模型
  • 隔离部署 —— 使用在本地网络上运行的模型,无需互联网访问

通过设置添加自定义提供商

  1. 打开设置(点击齿轮图标或按 Ctrl+Shift+S
  2. 进入 API 密钥部分
  3. 滚动到自定义提供商
  4. 填写字段:
字段必需描述
提供商 ID短标识符(例如 my-llm)。必须唯一、小写、无空格
显示名称在提供商下拉菜单中显示的人类可读名称
端点 URLchat completions 端点的完整 URL(例如 https://my-api.example.com/v1/chat/completions
API 密钥用于身份验证的 Bearer token(如果不需要则留空)
模型此端点可用的模型 ID 的逗号分隔列表
  1. 点击保存
  2. 创建或配置机器人时,提供商会出现在提供商下拉菜单中

编程注册

您可以从浏览器控制台或脚本注册自定义提供商:

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",
});

注册选项

选项类型默认值描述
namestring提供商 ID显示名称
endpointstring必需chat completions 端点的完整 URL
modelsarray[{id: 'default', name: id}]可用模型
apiStylestring'openai'API 格式(目前仅支持 'openai'
extraHeadersobject{}每个请求中包含的额外 HTTP 头
pricingobjectnull定价信息(用于成本跟踪)
maxInputnumber0最大输入上下文长度(仅用于显示)

额外头

如果您的端点需要自定义头(例如,对于 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 流式工厂。此工厂:

  1. 构建标准 OpenAI 格式的请求体(model、messages、temperature、max_tokens、stream 等)
  2. 使用 Authorization: Bearer {apiKey} 头发送 POST 请求
  3. 解析 SSE 流(data: {...} 行)以获取内容增量
  4. 处理流式(delta)和非流式(message)响应格式
  5. 如果存在,从 usage 字段提取 token 使用情况

所有配置字段都适用于自定义提供商:温度、top_p、频率惩罚、存在惩罚、停止序列、响应格式和推理投入。

兼容服务

以下服务实现 OpenAI 兼容 API 格式并可作为自定义提供商工作:

服务端点说明
LiteLLMhttp://localhost:4000/v1/chat/completions统一 100+ 提供商的代理
LocalAIhttp://localhost:8080/v1/chat/completions本地运行开源模型
vLLMhttp://localhost:8000/v1/chat/completions高性能推理服务器
Text Generation Inferencehttp://localhost:8080/v1/chat/completionsHugging Face 推理服务器
Ollamahttp://localhost:11434/v1/chat/completions已内置,但也可作为自定义添加
llama.cpp(服务器模式)http://localhost:8080/v1/chat/completions轻量级 C++ 推理
Janhttp://localhost:1337/v1/chat/completions带有本地模型的桌面应用
LM Studiohttp://localhost:1234/v1/chat/completions带有模型管理的桌面应用
Cloudflare Workers AIhttps://api.cloudflare.com/client/v4/accounts/{id}/ai/v1/chat/completions已内置,但可自定义
Azure OpenAIhttps://{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 与服务期望的匹配
  • 在开发者工具中打开浏览器的网络标签页以检查原始请求和响应