将症状与下面的修复方法进行匹配。如果症状不属于任何部分,请连同 docker logs ai-service --tail 200 的输出和 PROVIDERS 值的脱敏副本一起提交至 Tiny Support。
快速分诊
按此列表逐步排查以确定症状范围:
容器是否在运行? 运行
docker ps进行检查。如果容器已退出或无法拉取,请参阅容器启动失败。/health是否返回 200? 运行curl -fsS http://localhost:8000/health。如果超时或返回 5xx,请参阅容器启动失败。API 是否返回认证错误? 如果响应为 401、
allowed:false或invalid-jwt-*,请参阅 API 和 JSON Web Token (JWT) 认证。SSE 流是否携带来自 LLM 的
event: error? 如果是,请参阅大语言模型 (LLM) 提供商错误。编辑器端是否损坏? 工具栏缺失、token 401 或流挂起?请参阅编辑器和前端。
负载下缓慢、超时或失败? 请参阅性能。
关于扩容、升级或部署的问题? 请参阅 生产部署。
需要了解服务日志消息的含义? 请参阅日志参考。
如果上述都不匹配,请参阅诊断配方,然后提交至 Tiny Support。
容器启动失败
首先运行 docker logs ai-service。以下所有条目均假设日志输出可用。
| 错误 / 症状 | 原因 | 修复 |
|---|---|---|
| 密钥被截断、包含换行符或周围有空格 | 将密钥粘贴为一行无间断的字符串。对照原始密钥验证前八位和后八位字符。 |
|
| 切换到 |
| MySQL 用户在 AI 服务数据库上缺少列出的权限。全局授予的权限( | 在 AI 服务数据库本身上授予权限( |
| Postgres schema 未预先创建 | 运行 |
尽管用户和授权正确, | 托管的 PostgreSQL 服务器需要 TLS(Amazon RDS 上的 | 请参阅 托管数据库 TLS。 |
首次启动时出现 | 多个副本同时针对新数据库启动并并发运行了 schema 迁移。 | 副本会自动重启并恢复。为避免此错误,先启动一个副本,等待其健康,然后再扩容。请参阅 升级过程。 |
|
| 在 compose 文件中固定使用 |
|
| 更正 |
出现带有压缩标识符的 |
| 从 LLM 提供商页面上的提供商示例开始,逐字段添加。 |
容器退出且无有用日志
缺少必需的环境变量,或 PROVIDERS / MODELS 中的 JSON 格式错误
运行 docker inspect ai-service | jq '.[0].Config.Env' 并与环境变量参考进行对比。使用 echo "$PROVIDERS" | jq . 验证 JSON
Pod 在 Amazon EKS Auto Mode 上一直处于未就绪状态,在存活探针失败后重启,且 kubectl logs 对当前或上一个容器无输出
数据库和 Redis 安全组允许来自节点安全组的入站流量,但 EKS Auto Mode 将集群主安全组附加到 Pod 上。
允许来自集群主安全组的入站数据库和 Redis 流量。请参阅基础设施建议。
尽管启动成功,但 /health 超时
缺少端口映射
在 docker run 中添加 -p 8000:8000,或在 compose 中添加 ports: ["8000:8000"]。使用 docker port ai-service 进行确认。
getaddrinfo EAI_AGAIN mysql 或 getaddrinfo ENOTFOUND redis
AI 服务与数据层处于不同的 Docker 网络上
使用 docker compose(共享网络),或设置 DATABASE_HOST=host.docker.internal。在 Linux 上,向 AI 服务添加 extra_hosts: ["host.docker.internal:host-gateway"]。
API 和 JSON Web Token (JWT) 认证
这些假设容器正在运行且 /health 返回 OK。
| 错误 / 症状 | 原因 | 修复方法 |
|---|---|---|
| 使用错误的密钥对令牌进行签名。最常见的是,使用 | 从 |
|
| 从 |
| 令牌已超过其 | 颁发具有合理生存期(例如 |
| 未通过 Management Panel UI 创建环境 | 通过 |
JWT 被静默拒绝 | 令牌使用 RS256 而不是 HS256 签名 | 使用 |
| 流中止导致临时状态阻塞对话 | 开始新对话或重新加载页面。自定义 UI 应在取消后创建新对话。 |
每个端点上均显示 |
| 使用显式数组形式: {
"auth": {
"ai": {
"permissions": [
"ai:conversations:*",
"ai:models:agent",
"ai:actions:system:*",
"ai:reviews:system:*"
]
}
}
}常见错误: |
大语言模型 (LLM) 提供商错误
大多数错误在 SSE 流中显示为 event: error,并且 HTTP 响应仍为 200。NoValidApiKeysFoundError 是例外:消息请求失败并返回 HTTP 500,原因显示在容器日志中。
云提供商(OpenAI、Anthropic、Google)
| 错误 | 修复方法 |
|---|---|
| 更新 |
AWS Bedrock
| 错误 | 修复方法 |
|---|---|
| 在 |
| 在 Bedrock console → Model access 中启用模型访问权限。附加包含 |
| 在 Bedrock console → Model access → Anthropic 中完成 AWS Marketplace 对 Anthropic 的订阅。 |
| 使用带有区域前缀的 inference profile ID(例如 |
Google Vertex AI
| 错误 | 解决方法 |
|---|---|
| 在 |
服务账号有效但出现认证错误 |
|
| 运行 |
被 GCP 组织策略阻止 | 检查 |
Azure OpenAI
| 错误 | 解决方法 |
|---|---|
找不到模型 / |
|
API 错误但没有 provider 消息 | 显式设置 |
OpenAI-compatible (Ollama, vLLM, LM Studio)
| 错误 | 解决方法 |
|---|---|
SSE 错误中显示 "Not Found" |
|
Linux 上出现 | 使用 |
"不支持工具" | 使用官方模型( |
| 模型对于默认超时时间来说太慢了。将 |
编辑器和前端
在排查编辑器问题之前,请确认 /health 正常且直接对 /v1/conversations 执行 curl 可以正常工作。
| 症状 | 解决方法 |
|---|---|
工具栏中没有 AI 按钮 | 确保加载了 TinyMCE 8+,设置了 |
Token 获取返回 401 | Token 端点自身的认证中间件拒绝了请求。在浏览器网络选项卡中检查会话 cookie、跨域资源共享 (CORS) 凭据以及 bearer token。 |
Token 返回但被 AI 服务拒绝 | 请参阅上面的 API 和 JSON Web Token (JWT) 认证:密钥错误、 |
AI 响应在浏览器中卡住 | 反向代理正在缓冲 SSE 流。在 nginx 中设置 |
| 将编辑器的 origin(scheme + host + port)添加到 |
编辑器渲染后消失 (Next.js / Nuxt / SvelteKit) | TinyMCE 在加载时会引用 |
| Token 端点返回了无效的 JWT 或非 JSON 响应。使用 |
性能
| 症状 | 解决方法 |
|---|---|
通过 AI 服务的自托管模型比直接使用 | 将推理服务器与 AI 服务部署在同一位置。使用更小或更多量化的模型。在开发期间禁用遥测( |
容器出现 OOM 或 MySQL 启动时间超过 60 秒(Colima) | 默认的 Colima 虚拟机太小。运行 |
日志参考
使用 docker logs ai-service 读取 AI 服务日志,或在 Kubernetes 上使用 kubectl logs。要将多个实例的日志收集到一个地方,请参阅 分布式日志记录。
日志格式
错误和致命条目是 JSON 对象,每行一个:
| 字段 | 内容 |
|---|---|
| 严重程度,用数字表示: |
| 条目的时间,采用 ISO 8601 格式,以 UTC 表示。 |
| 消息内容。错误和致命消息以 |
| 可选。条目的详细信息,例如错误的 |
| 可选。错误的堆栈跟踪。 |
例如,没有所需架构的 PostgreSQL 部署会以此条目停止:
{"level":60,"time":"2026-05-05T11:19:07.634Z","msg":"[FATAL] PostgreSQL Error: schema \"cs-on-premises\" does not exist","data":{"name":"PostgreSQL Error","message":"PostgreSQL Error: schema \"cs-on-premises\" does not exist"}}要仅显示错误和致命条目,请使用 jq 过滤日志。fromjson? 过滤器会跳过任何不是 JSON 的行:
docker logs ai-service 2>&1 | jq -R -c 'fromjson? | select(.level >= 50)'
重要的日志消息
启动失败会记录带有 [FATAL] 前缀的消息,并会导致 AI 服务停止。有关这些消息及其解决方法,请参阅容器启动失败。有关 MCP 和网络搜索消息,请参阅 MCP 故障排除。
| 消息 | 含义 | 操作 |
|---|---|---|
| AI 服务已启动并接受请求。 | 无需操作。 |
| 消息请求失败,返回 HTTP | 为提供者添加内联凭据。请参阅大语言模型 (LLM) 提供者错误。 |
| 文件上传失败,返回 HTTP | 关闭存储桶的统一存储桶级访问权限。请参阅 GCP (GKE)。 |
跟踪失败的请求
来自 AI 服务的每个错误响应都带有一个 traceId,用于标识该请求。有关错误响应的结构,请参阅 错误响应。
TinyMCE AI 插件会在浏览器控制台中将每个错误打印为 TinyMCE AI Error: 条目,后面跟着状态代码、Trace ID: 行和错误代码。
诊断方案
展开以获取可直接复制的诊断命令跟踪日志:
docker logs ai-service --tail 200 -f
实时检查:
curl -fsS http://localhost:8000/health
解码 JWT(检查有效负载而不进行验证):
python3 -c "import jwt,sys,json; print(json.dumps(jwt.decode(sys.argv[1], options={'verify_signature': False}), indent=2))" <token>环境变量更改后重新创建:
docker compose up -d --force-recreate ai-service
检查有效的环境变量:
docker inspect ai-service | jq '.[0].Config.Env'
验证 PROVIDERS JSON:
echo "$PROVIDERS" | jq .
测试容器内的数据层连接:
docker exec ai-service /bin/sh -c "nc -zv mysql 3306" docker exec ai-service /bin/sh -c "nc -zv redis 6379"
将 mysql 和 redis 替换为在 DATABASE_HOST 和 REDIS_HOST 中配置的实际主机名。如果 AI 服务是通过 docker compose 而不是独立的 docker run 启动的,请使用 docker compose exec ai-service。
端到端冒烟测试(从令牌生成到流式响应):
TOKEN=$(curl -s -X POST http://localhost:3000/api/ai-token | jq -r '.token')
curl -s -X POST http://localhost:8000/v1/conversations \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"id":"smoke-1","title":"Smoke test"}'
# 将'agent-1'替换为MODELS中的模型ID,如果明确配置
curl -N -X POST http://localhost:8000/v1/conversations/smoke-1/messages \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"prompt":"Say hi in five words.","model":"agent-1"}'