TinyMCE AI on-premises service 是一个自托管的后端,为 AI 写作辅助提供支持。它可以与 TinyMCE 富文本编辑器(特别是 TinyMCE AI 插件)配合使用,或作为独立服务使用。它完全在主机基础设施内运行。文档内容、对话历史、文件附件和用户数据保留在主机网络内,不会由 Tiny 存储。发送到配置的 LLM 提供商的数据受该提供商的数据处理政策约束。

该服务作为一个单一的 Open Container Initiative (OCI) 容器镜像(registry.containers.tiny.cloud/ai-service-tiny)发布。它提供了 REST API、管理面板、Server-Sent Events 流式传输以及 OpenAPI 规范。

架构

基础设施由三层组成:

  • 浏览器运行带有 tinymceai 插件的 TinyMCE 编辑器。

  • 应用层运行 token 端点(用于签署 JWT)、AI 服务容器以及负载均衡器或反向代理。它可以由负载均衡器后面的一个或多个 AI 服务实例组成(推荐使用轮询)。每个实例运行相同的无状态容器镜像,并监听端口 8000。

  • 数据层由 SQL 数据库、Redis 实例和文件存储组成:

    • SQL 数据库:存储配置和对话等持久化数据。

    • Redis:缓存和协调(SSE 投递、速率限制、发布/订阅)。使 AI 服务保持无状态。

    • 文件存储:存储上传的文件和文档(S3、Azure Blob、文件系统或数据库本身)。

显示浏览器、应用层、数据层和 LLM 提供商连接的部署架构

数据流

单个 AI 请求的数据流:

  1. 客户端应用程序从 token 端点请求 JWT。

  2. 客户端通过 HTTPS 将 prompt 和 JWT 发送到 AI 服务。

  3. AI 服务验证 token,并将 prompt 转发给配置的大语言模型 (LLM)。

  4. LLM 将响应流式传输回 AI 服务。

  5. AI 服务通过 Server-Sent Events (SSE) 将响应传递给客户端。

当与 TinyMCE tinymceai 一起使用时,插件通过 tinymceai_token_provider 回调自动处理步骤 1、2 和 5。

浏览器直接连接到 AI 服务 —— 请求不经过应用程序后端。AI 服务必须能够从最终用户浏览器的网络访问,这意味着它必须有一个公共 URL(或在 intranet 上部署时通过 VPN/内部网络访问)。请相应地配置 CORS 和 TLS。

共享密钥(API Secret)仅存在于应用程序后端(token 端点)和 AI 服务容器中。浏览器和编辑器永远不会看到它 —— 它们只处理签名的 token。

功能

功能详情

对话式 AI 助手

支持文档和文件上下文的多轮 AI 聊天。对话历史通过 JWT 的 sub 声明按用户隔离。

文档审查

审查文档的正确性、清晰度、可读性、语气等,或翻译成其他语言。

快捷操作

重写、总结、扩展、改变语气、修正语法、翻译、续写和改进写作。

LLM 提供商灵活性

OpenAI、Anthropic、Google Gemini、Azure OpenAI、AWS Bedrock、Google Vertex AI 或任何自托管的 OpenAI 兼容端点。多个提供商可以共存。

Model Context Protocol (MCP) 集成

通过基于 Streamable HTTP 传输的 Model Context Protocol 连接内部工具、数据库和知识库。支持静态 token 和 OAuth 2.0 按用户身份验证。

网页抓取和网页搜索

用于抓取网页和运行搜索的可插拔端点。

多租户环境

通过 Environments 实现隔离的对话历史和按租户的访问密钥。

许可证验证

AI 服务在每次容器启动时根据 license.containers.tiny.cloud 验证其许可证密钥。此检查确认许可证处于活动状态且有效。在此检查期间不会传输任何客户数据、对话内容或使用遥测。如果此端点不可达,服务将无法启动。

按用户、按功能的权限

通过 auth.ai.permissions JWT 声明进行细粒度控制。

流式响应

从 LLM 到浏览器的 Server-Sent Events。

文件附件

使用附加文件作为 AI 对话的上下文。存储选项包括数据库、文件系统、Amazon S3 或 Azure Blob Storage。

可观测性

结构化请求日志、OpenTelemetry 和 Langfuse。这三个管道作为独立的同步管道运行。

水平扩展

服务无状态;可在 load balancer 背后添加 replicas,无需共享本地状态。

OpenAPI specification

发布于 /v1/api/doc.json,交互式文档位于 /v1/api/docs(/docs/ 会重定向至该处)。可用任意语言自动生成 client。

凭据

在本地部署中会涉及两个 license key。它们彼此不同,来自不同来源,且用途各异。

凭据存放位置作用是否必需?

服务 license key(LICENSE_KEY)

作为环境变量传入 AI 服务容器(例如在 docker run 命令或 Compose 文件中)

在运行时激活本地 AI 服务。通过 Tiny 客户门户提供的长字符串。

是 — 运行服务必需。

TinyMCE 编辑器 license key(license_key)

添加到编辑器配置中:tinymce.init({ license_key: 'T8LK:…​' })

为 TinyMCE 编辑器配置 license 模式,并激活 TinyMCE 高级功能。

是 — TinyMCE AI 高级功能必需。

服务 license key(LICENSE_KEY)与 TinyMCE 编辑器 license key(license_key)不可互换。欲了解更多信息,请参阅 Service license keys 和 License key。

前提条件

要求详情

容器运行时

Docker 20.10+、Podman 4+ 或任意 OCI 兼容运行时。同时支持 Kubernetes、AWS ECS 或 Azure Container Apps。

SQL 数据库

MySQL 8.0 或 PostgreSQL 13+(推荐 16)。

Redis

3.2.6+(推荐 7.x)。支持单节点或 Cluster 模式。不支持 Sentinel。

LLM 访问

至少一个 provider。多个 provider 可并存。

License key 与 registry 凭据

由 Tiny 账户代表提供。

Token 端点

一个可签名 HS256 JWT 的后端。

反向代理(推荐)

AI 服务不终止 Transport Layer Security (TLS)。建议在生产环境中使用 nginx、HAProxy 或云负载均衡器等反向代理进行 TLS 终止。

选择部署路径

若用于评估,请从 Getting started 指南开始(单机 Docker Compose)。若要用于生产,请按顺序逐步完成各主题指南 —— 无论部署目标为何(Kubernetes、ECS 或独立 Docker),所使用的组件相同。

部署路径决策树

主题指南

首次部署时,请按顺序完成各指南。每个指南也可作为特定主题的独立参考。

指南范围

Getting started

五分钟 Docker Compose 快速上手。启动 AI 服务、数据库、Redis、token 服务器及浏览器编辑器。

数据库、Redis 与存储

数据层设置:MySQL 与 PostgreSQL 配置、Redis 连接、文件存储选项(S3、Azure Blob、文件系统、数据库)以及主机本地数据库连接。

LLM 提供商

连接 OpenAI、Anthropic、Google Gemini、Azure OpenAI、AWS Bedrock、Google Vertex AI 或任意 OpenAI 兼容端点(Ollama、vLLM、LM Studio)。支持自定义模型目录及 API key 轮换。

JWT 认证

HS256 签名模型、必需与可选 claims、权限参考、8 种语言的 token 端点示例,以及多租户部署模式。

TinyMCE 集成

编辑器端配置:plugin 选项、token provider、认证模式、Cross-Origin Resource Sharing (CORS) 以及部署检查清单。

生产部署

Kubernetes manifests、AWS ECS 任务定义、水平扩展、安全加固、速率限制、可观测性、备份与恢复以及升级。

MCP 与 Web 集成(可选)

Model Context Protocol (MCP) 工具集成、Web 抓取端点及 Web 搜索端点。初始设置并非必需。

故障排查

快速分流、容器启动失败、JWT 错误、LLM 提供商错误、编辑器问题、性能以及诊断配方。

参考文档

环境变量参考、API 端点参考、Server-Sent Events 参考和错误代码参考。

支持

提交支持请求时,请包含:

容器日志
docker logs ai-service --tail 200
健康检查
curl -fsS http://localhost:8000/health

预期响应:

{"serviceName":"on-premises-http","uptime":1234}
解码后的 JWT 负载

去除签名并使用 JWT 库进行解码。

环境变量

提交前请对机密信息进行脱敏处理。

docker inspect ai-service | jq '.[0].Config.Env'
镜像版本
docker inspect ai-service | jq '.[0].Config.Image'