快速诊断
在深入研究具体问题之前,运行这些快速检查:安装和设置问题
Docker Compose 启动失败
症状:- 服务无法启动
- 退出代码错误
- 容器立即崩溃
1. Docker 守护进程未运行
1. Docker 守护进程未运行
检查:解决方案:
2. 端口冲突
2. 端口冲突
检查正在使用的端口:解决方案 - 终止冲突进程:解决方案 - 更改 Shannon 端口:
编辑
docker-compose.yml 以使用不同的端口:3. 系统资源不足
3. 系统资源不足
检查 Docker 资源:解决方案 - 增加 Docker 资源:
-
macOS:Docker Desktop → Preferences → Resources
- RAM:最少 8GB(推荐 16GB)
- CPU:最少 4 核
- 磁盘:最少 20GB 可用空间
-
Linux:编辑 Docker 守护进程配置
4. 缺少 .env 文件
4. 缺少 .env 文件
错误:
WARNING: The OPENAI_API_KEY variable is not set解决方案:5. Python WASI 解释器缺失
5. Python WASI 解释器缺失
错误:
python_wasi/bin/python3.11: No such file or directory解决方案:API 和连接问题
401 未授权
症状:- HTTP 401 响应
- “Unauthorized” 错误消息
解决方案 1:禁用认证(开发环境)
解决方案 1:禁用认证(开发环境)
编辑 重启:测试:
.env:解决方案 2:提供有效的 API 密钥(生产环境)
解决方案 2:提供有效的 API 密钥(生产环境)
带 API 密钥的请求:Python SDK:
连接被拒绝/服务不可用
症状:connection refuseddial tcp: connect: connection refused- 服务无响应
解决方案 1:服务未就绪
解决方案 1:服务未就绪
等待所有服务初始化:典型启动时间:30-60 秒
解决方案 2:服务崩溃
解决方案 2:服务崩溃
检查崩溃错误:重启崩溃的服务:如有需要完全重置:
解决方案 3:数据库连接失败
解决方案 3:数据库连接失败
检查 PostgreSQL:解决方案:
任务停留在 RUNNING 或 QUEUED 状态
症状:- 任务从不完成
- 状态保持 RUNNING 几个小时
- 没有进度更新
解决方案 1:LLM API 密钥无效或配额超限
解决方案 1:LLM API 密钥无效或配额超限
检查 LLM 服务日志:解决方案:
解决方案 2:Temporal worker 死锁
解决方案 2:Temporal worker 死锁
重启 Temporal worker:强制终止工作流(最后手段):
解决方案 3:断路器打开
解决方案 3:断路器打开
检查断路器状态:断路器防止级联故障:
- LLM 服务断路器
- 数据库断路器
- Redis 断路器
预算和成本问题
预算超限错误
症状:budget exceeded错误- 任务因成本限制错误而失败
- HTTP 429(速率受限)需要付费
解决方案 1:增加预算限制
解决方案 1:增加预算限制
编辑 重启:预算由服务端环境变量控制。SDK 不支持按请求设置预算参数。
.env:解决方案 2:使用更简单的执行模式
解决方案 2:使用更简单的执行模式
- Simple:1 次 LLM 调用,$0.01-0.05
- Standard:3-5 次 LLM 调用,$0.05-0.20
- Advanced:10+ 次 LLM 调用,$0.20-1.00+
解决方案 3:禁用预算强制执行(仅限开发)
解决方案 3:禁用预算强制执行(仅限开发)
⚠️ 警告:仅用于开发/测试编辑 重启:
.env:性能问题
响应时间慢
症状:- 任务耗时比预期长 2-3 倍
- 高延迟
- 超时
解决方案 1:CPU/内存不足
解决方案 1:CPU/内存不足
检查资源:增加 Docker 资源:
- macOS:Docker Desktop → Resources → 将 RAM 增加到 16GB,CPU 增加到 6
- Linux:更强大的机器或减少并发工作流
.env 中调整 worker 并发性:解决方案 2:冷启动/缓存未命中
解决方案 2:冷启动/缓存未命中
第一个请求总是较慢(10-30秒)后续请求使用缓存:
- LLM 响应缓存(Redis)
- 会话上下文缓存
- 工具结果缓存
解决方案 3:数据库连接池耗尽
解决方案 3:数据库连接池耗尽
在 重启:
.env 中增加池大小:令牌(tokens)> 0,但结果为空
症状:- 日志或数据库显示补全
completion_tokens> 0,但最终result文本为空。 - 复杂问题没有输出,而简单问题正常。
- 部分 GPT‑5 聊天响应以结构化分片返回内容,而不是纯字符串。旧解析可能遗漏这些文本。已通过将 GPT‑5 模型路由到 Responses API,并为聊天响应添加内容规范化来修复。
- LLM 服务将 GPT‑5 模型路由至 Responses API,并优先使用
output_text。 - 聊天提供商在返回列表内容时,会将文本分片合并为字符串。
- 从旧版本升级时,请重启 LLM 服务以清除缓存的空响应。
- 重新运行较长的多段落提示,
result长度应 > 0,且会话历史应包含助手消息。
高内存使用
症状:- OOM(内存不足)错误
- 容器重启
- Swap 使用率高
解决方案:减少缓存大小
解决方案:减少缓存大小
编辑 重启:
config/shannon.yaml 或 设置环境变量:数据和状态问题
会话未持久化
症状:- 请求之间丢失会话上下文
- 代理不记得以前的任务
解决方案 1:Redis 连接失败
解决方案 1:Redis 连接失败
检查 Redis 状态:重启 Redis:测试连接:
解决方案 2:会话过期(TTL)
解决方案 2:会话过期(TTL)
会话默认在 30 天后过期在 检查会话过期:
.env 中增加 TTL:解决方案 3:使用不同的会话 ID
解决方案 3:使用不同的会话 ID
验证会话 ID 一致性:
数据库迁移错误
症状:- 表不存在错误
- 找不到列错误
- 架构版本不匹配
调试工具
查看日志
Temporal UI
访问:http://localhost:8088 功能:- 查看所有工作流
- 查看执行历史
- 重放失败的工作流
- 终止卡住的工作流
- 时间旅行调试
- 导航到 Workflows
- 按工作流 ID(任务 ID)搜索
- 查看执行历史以查看失败的位置
- 检查 Activity 日志以获取详细错误
Prometheus 指标
tasks_submitted_totaltasks_completed_totaltasks_failed_totalllm_requests_totalcircuit_breaker_state
实时仪表板
访问:http://localhost:2111 功能:- 实时任务执行
- 事件流
- 令牌使用图表
- 系统健康状况