AI聊天服务

一个基于Python、FastAPI和OpenAI Agents SDK构建的实时AI聊天服务,具有服务器发送事件(SSE)流、持久化对话历史和生产级异步架构。

  • by VCTeck-BinhDaniel
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 VCTeck-BinhDaniel/mcp-agent

使用说明

# 人工智能聊天服务--Rocscience带回家

实时人工智能聊天服务 python, 快速API,以及 OpenAI代理SDK,具有服务器发送事件(SSE)流、持久会话历史和生产级异步架构。


设计选择

该架构严格按照 app/ 目录以分离关注点。此设置提供了高度模块化,确保业务逻辑不受API或数据库层更改的影响。

1.N层架构(存储库模式)

我们把逻辑分成 api/ (演示文稿), core/ (商业),以及 db/ (数据)层。

为什么 它将数据库从流接口中抽象出来,通过允许我们轻松模拟数据库存储库而无需额外开销,使单元测试更简单。

2.有心跳的生产者-消费者模式

我们使用 asyncio.Queue 将LLM生成(生产者)与SSE HTTP响应(消费者)以及并发响应解耦 _heartbeat 任务。

为什么 如果LLM停滞,直接耦合可能会导致超时,从而悄无声息地杀死流。这种去耦,再加上15秒的心跳,可以防止在API生成延迟期间代理/客户端超时。

3.背景持久性

我们使用FastAPI BackgroundTask 以在生成后将LLM响应保存到数据库。

为什么 这将DB写入开销移出SSE流的关键路径,从而减少了面向用户的延迟。根据设计,FastAPI BackgroundTask 仅自然执行 之后 HTTP响应完成,保证它读取最终生成的结果,而不需要复杂的 asyncio.Event 同步或导致比赛条件。

4.有限语境历史

上下文历史记录限制为20条消息(_MAX_HISTORY_MESSAGES). 为什么 LLM上下文窗口是有限的,并且API令牌成本快速扩展。限制历史记录可以防止快速膨胀和延迟尖峰,同时为自然的多回合对话保留足够的上下文。


权衡

  • 非持久背景持久性: 使用 BackgroundTask 意味着如果服务器在运行过程中崩溃,助手的响应就会丢失。一个更可靠的替代方案是像Celery或ARQ这样的持久任务队列。
  • 断开连接的危险生产商: FastAPI StreamingResponse 在干净地传播客户端断开连接信号方面存在局限性。如果用户关闭浏览器,LLM可能会在后台继续生成,直到达到120秒超时,消耗不必要的令牌。
  • 内存历史截断: 我们目前在Python中获取所有会话消息并截断它们。对于长时间的对话,这会带来不必要的内存开销,最好在数据库级别进行优化 LIMIT 和 ORDER BY 查询。

快速设置和使用

为了加快审阅者的评估速度,所有内容都在内部编写脚本 scripts/ 文件夹。

1.配置环境

cp .env.example .env
# Set OPENAI_API_KEY or GEMINI_API_KEY in .env

2.通过Docker Compose运行

bash scripts/run.sh
# API available at http://localhost:8000/api/v1/health

3.运行测试

bash scripts/test.sh
# Ensure Docker is running before this — the integration tests require a live Postgres container

4.尝试直播流媒体端点

bash scripts/chat.sh

项目结构

app/
├── api/v1/        # Routers: chat (SSE stream), sessions (history/delete), health
├── core/          # ChatAgent (LLM wrapper) and model provider selection
├── db/            # SQLAlchemy models, repository classes, async engine setup
├── schemas/       # Pydantic request/response models
└── utils/         # Settings (pydantic-settings), structured logger, SSE serializer
alembic/           # Database migrations (Postgres)
tests/
├── unit/          # Fast, fully mocked unit tests
└── integration/   # DB-backed integration tests via test containers
scripts/           # run.sh, test.sh, chat.sh

SSE事件参考

事件 有效载荷 描述
agent.message.delta { "text": "..." } 模型中的增量文本块
agent.message.done { "session_id": "..." } 流完成;已收到完整回复
agent.workflow.failed { "error": "..." } 未处理的异常或超时
heartbeat {} 保持每15秒ping一次