跳到主要内容

添加自定义提供商

任何自定义提供商都可以添加到 AI 插件中。为此,请按照以下说明操作。

先决条件

  • 基础 URL。发送 API 请求的网络地址。在某些情况下,基础 URL 可能包含指定所使用模型的端点:

    https://ai-provider-base-url
  • 模型版本。所访问模型的版本。有时,模型版本会包含在基础 URL 中:

    https://ai-provider-base-url/v1

    在这个示例中,模型版本是 v1

  • API 密钥。服务提供商提供的唯一密钥,用于身份验证。

备注

向自定义提供商发送的请求是跨域请求,因此提供商的端点必须允许插件的来源——桌面应用中为 onlyoffice://plugin,编辑器在浏览器中运行时则为您的文档服务器地址——并且必须以 2xx 状态码响应 CORS 预检 OPTIONS 请求。公有云 API 通常默认满足这些要求;对于本地服务器和位于代理后面的端点,请参见下方的 CORS 要求

步骤 1. 创建外部 JavaScript 文件

要添加自定义提供商并在 AI 插件的可用提供商列表中显示它,请创建并上传一个外部 JS 文件。此类文件的示例可在此处找到。

从此文件解析的自定义提供商是 Provider 类的实例,该类扩展了 AI.Provider。此类管理插件中所有可用的提供商。

Provider 类

class Provider {
constructor(name, url, key, addon) {
this.name = name || "";
this.url = url || "";
this.key = key || "";
this.addon = addon || "";

this.models = [];
this.modelsUI = [];
}
}

参数

名称类型示例描述
namestring"阿里云"将在插件中显示的提供商名称。
urlstring"https://dashscope.aliyuncs.com/compatible-mode"发送 API 请求的网络地址。
keystring"yourAPIKey"提供商颁发的 API 密钥。这是一个可选字段。有些提供商可能需要密钥才能访问。
addonstring"v1"URL 附加内容(例如,版本标签)。

示例

"use strict";

class Provider extends AI.Provider {

constructor() {
super("阿里云", "https://dashscope.aliyuncs.com/compatible-mode", "yourAPIKey", "v1");
}
}

步骤 2. 在 AI 插件中配置提供商

要将自定义提供商添加到 AI 插件:

  1. 打开 ONLYOFFICE 编辑器顶部工具栏中的 AI 选项卡。

  2. 选择 设置

  3. AI 配置 窗口中,选择 编辑 AI 模型

  4. AI 模型列表 窗口中,点击 编辑图标编辑图标 来编辑模型。

  5. 编辑 AI 模型 窗口中,点击 自定义提供商

    自定义提供商自定义提供商

  6. 点击 加号图标加号图标 并上传包含您的自定义提供商设置的 JavaScript 文件。

    添加自定义提供商添加自定义提供商

  7. 点击 返回 退出 自定义提供商 窗口。

  8. 编辑 AI 模型 窗口的列表中选择您的自定义提供商,然后点击 确定

  9. 点击 返回 退出 AI 模型列表 窗口。

  10. AI 配置 窗口中为特定任务设置自定义提供商模型。

AI 插件已完全配置好,可处理各种任务。

CORS 要求

AI 插件运行在 Web 环境中,因此每个发往自定义提供商的请求都是跨域请求,而浏览器能否读取响应,则由提供商的端点决定。如果端点不允许该插件访问,提供商就无法使用:模型列表将始终为空,浏览器控制台会报告 Access to fetch at '.../v1/models' from origin 'onlyoffice://plugin' has been blocked by CORS policy: ...。冒号之后的内容会指出具体原因——最常见的是缺少 Access-Control-Allow-Origin 头。您是否需要进行配置,取决于所使用的端点类型。

端点必须返回的内容

在插件调用的每一个 API 路径上——不仅仅是 /v1/models——端点都必须以下列响应头回应预检请求:

Access-Control-Allow-Origin: onlyoffice://plugin
Access-Control-Allow-Headers: Authorization, Content-Type
Access-Control-Allow-Methods: GET, POST, OPTIONS

实际响应也需要包含 Access-Control-Allow-Origin。而 Access-Control-Allow-HeadersAccess-Control-Allow-Methods 只会从预检响应中读取。

在桌面应用中,插件运行在 onlyoffice:// 协议上,ONLYOFFICE 将其注册为标准、安全且启用了 CORS 的协议,因此来自插件的请求会携带 Origin 头,并遵循与普通网页相同的 CORS 规则。插件页面由 onlyoffice://plugin/ 提供,因此需要允许的来源就是 onlyoffice://plugin。当编辑器在浏览器中运行时,来源则是您的文档服务器地址——请在下方所有示例中用它替换 onlyoffice://pluginAccess-Control-Allow-Origin 只能包含一个值,因此若要同时支持这两种情况,请返回 *,或者回显传入请求的来源。如果选择回显来源,请同时添加 Vary: Origin,以免缓存把某个来源的响应返回给另一个来源。回显任意来源会使该端点可被任何网站调用,因此对于可公开访问的端点,请改为将传入的来源与允许列表进行匹配——参见 Ollama 指南中基本 Nginx 配置下的安全提示

插件始终发送 Content-Type: application/json,并在提供商配置了 API 密钥时添加 Authorization: Bearer <key>application/json 不属于 CORS 安全列表中的值,因此浏览器会在实际请求之前发送预检 OPTIONS 请求。端点必须以 200204 响应该预检请求,且绝不能是重定向

提供商类可以重写 isUseProxy(),让请求经由代理服务转发而不是直接调用端点,从而绕过 CORS。这只适用于非 GET 请求,而获取模型列表使用的是 GET 请求,因此端点始终需要返回上述响应头。

公有云 API

OpenAI、OpenRouter、Mistral 等服务默认会发送 CORS 头,因此无需任何配置。部分 API 需要额外的选择加入(opt-in)请求头才会响应浏览器请求,因此如果模型列表无法加载,请查阅相应提供商自己的文档。

本地 AI 服务器

Ollama、LM Studio 和 Open WebUI 只接受显式列出的来源,因此需要将插件的来源添加到该列表中:Ollama 中为 OLLAMA_ORIGINS=http://*,https://*,onlyoffice://*,Open WebUI 中为 CORS_ALLOW_ORIGIN,LM Studio 则可在服务器设置中的 CORS 开关处添加。OLLAMA_ORIGINS 支持 * 通配符,因此 onlyoffice://* 即可覆盖插件的来源;而严格的允许列表——例如 nginx 的 map、Traefik 的 accessControlAllowOriginList——则需要填写精确值 onlyoffice://plugin。llama.cpp 和 vLLM 默认允许所有来源,无需任何配置;在 vLLM 中可以使用 --allowed-origins 缩小允许的来源范围。关于 Ollama 的完整操作指南——在各操作系统上设置该变量、重启服务、验证响应头,以及通过 TLS 终止的 nginx 代理对外暴露服务——请参见配置 Ollama 的 CORS

反向代理配置

对于通过自己的反向代理(nginx、Traefik、Caddy、API 网关等)发布的端点,仅配置应用程序本身并不总是足够的:代理还必须放行预检请求,并确保相关头信息能够透传下去。请只在应用程序或代理中二选一配置 CORS,切勿同时在两处配置——重复的 Access-Control-Allow-Origin 头会被浏览器拒绝。

nginx

直接在代理层处理预检请求:

location /v1/ {
if ($request_method = OPTIONS) {
add_header Access-Control-Allow-Origin "onlyoffice://plugin" always;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS" always;
add_header Access-Control-Allow-Headers "Authorization, Content-Type" always;
add_header Access-Control-Max-Age "86400" always;
return 204;
}
add_header Access-Control-Allow-Origin "onlyoffice://plugin" always;
proxy_pass http://your-backend;
}

Traefik

中间件与路由标签:

traefik.http.middlewares.ai-cors.headers.accessControlAllowOriginList=onlyoffice://plugin
traefik.http.middlewares.ai-cors.headers.accessControlAllowMethods=GET,POST,OPTIONS
traefik.http.middlewares.ai-cors.headers.accessControlAllowHeaders=Authorization,Content-Type
traefik.http.middlewares.ai-cors.headers.accessControlMaxAge=86400
traefik.http.middlewares.ai-cors.headers.addVaryHeader=true
traefik.http.routers.<router-name>.middlewares=ai-cors@docker

前面几行标签只是声明中间件,最后一行才是把中间件关联到路由上——如果缺少这一行,中间件永远不会生效,也就不会添加任何 CORS 头。@docker 后缀指明该中间件所在的 Traefik 配置提供方(provider)——如果您通过文件而不是 Docker 标签声明中间件,请改用 @file

如果入口点配置了 HTTP 到 HTTPS 的重定向,或者在此中间件之前还评估了另一个重定向中间件,预检请求就会收到 308 响应且不带任何 CORS 头——此时请将基础 URL 改用 HTTPS 地址。

验证端点

在将端点添加为提供商之前,请先对其进行验证。

检查预检请求:

curl -i -X OPTIONS 'https://<base-url>/v1/models' \
-H 'Origin: onlyoffice://plugin' \
-H 'Access-Control-Request-Method: GET' \
-H 'Access-Control-Request-Headers: authorization,content-type'

然后检查实际请求:

curl -i 'https://<base-url>/v1/models' \
-H 'Origin: onlyoffice://plugin' \
-H 'Authorization: Bearer <your-api-key>'

第一个响应必须是 200204,并且必须包含 Access-Control-Allow-OriginAccess-Control-Allow-Methods,以及列出了 authorizationcontent-typeAccess-Control-Allow-Headers。第二个响应必须是 200,并包含 Access-Control-Allow-Origin。如果两者都满足,但模型列表仍然无法加载,请查看控制台错误中提示的来源:它可能与您所允许的来源不同。