Files
ai-video-fullstack/docs-developer/development-plan.mdx
T
Xin Wang 2649d64b55
Quality gate / backend (push) Canceled after 0s
Quality gate / frontend (push) Canceled after 0s
feat: harden public OpenAI API contracts
2026-09-07 14:25:48 +08:00

362 lines
16 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 单租户生产化开发计划
description: 以标准接口、实时可观测性、运行可靠性和全链路质量门禁为主线的建设计划。
icon: list-checks
---
# 单租户生产化开发计划
## 目标
本计划把当前平台从“功能完整的单租户 MVP”推进到“可以稳定对外提供服务的单租户生产平台”。建设顺序固定为:
1. 标准接口契约;
2. 实时可观测性与 SLO;
3. 生产运行可靠性;
4. 全链路质量门禁。
顺序不能颠倒:先确定平台对调用方承诺的行为,再测量真实质量,然后根据数据加固运行时,最后用自动化门禁持续证明质量。
## 范围
本计划包含:
- OpenAI-compatible Responses 和 Realtime 公开接口;
- HTTP、SSE、WebSocket 和 WebRTC 的协议契约;
- Pipecat Pipeline、Provider、工具、知识库和后台任务的指标与追踪;
- 单实例优先的生产部署、优雅停机、任务恢复和资源保护;
- 协议、浏览器媒体链路、弱网、故障和负载测试。
本计划暂不包含:
- 多用户、组织、工作空间和 RBAC;
- `/v1/chat/completions` 兼容层;
- 完整实现 OpenAI Responses 的所有可选能力;
- SIP、跨区域部署和 Realtime 断线续传;
- 助手草稿、发布版本和环境晋级体系。
<Note>
即使暂不建设完整权限体系,公网部署前仍必须移除默认凭证、分离签名密钥、启用 TLS,并设置基本的请求与并发限制。
</Note>
## 当前基线
- `POST /v1/responses` 和 `GET /v1/responses/{response_id}` 已支持持久化状态、`previous_response_id`、SSE 和 Client Tool 续传。
- `/v1/realtime/client_secrets`、`/v1/realtime/calls` 和 `/v1/realtime` WebSocket 已支持标准事件与项目扩展事件。
- Realtime 已支持 WebRTC、WebSocket、Server VAD、PTT、打断、函数调用和条件视觉输入。
- 后端现有 342 个自动化测试,并通过统一入口处理本地 NLTK 运行环境。
- 前端可以通过构建和 lint,已增加官方 SDK 契约测试,但尚无系统性的组件测试和浏览器端到端测试。
- Responses 已启用 Provider token usage 采集;延迟等 Pipecat metrics 尚未启用,健康检查仍只有进程存活语义。
- 知识库处理、通话后分析、Webhook 和批量测试仍有进程内任务或 Worker。
## 里程碑一:标准接口契约
### 目标
让第三方调用方只依赖公开文档、OpenAPI 和标准 SDK 即可完成接入,并清楚知道哪些 OpenAI 能力受支持、哪些能力被平台锁定或尚未实现。
### 1.1 建立兼容性规范
- [x] 将公开协议命名为 `OpenAI-compatible subset v1`。
- [x] 为 Responses 请求字段、返回对象、SSE 事件和错误码维护兼容矩阵。
- [x] 为 Realtime 客户端事件、服务端事件、传输限制和扩展事件维护兼容矩阵。
- [x] 区分三种字段状态:支持、平台锁定、不支持。
- [x] 为 `x.interactive_media.*` 扩展增加独立版本号和能力协商说明。
- [x] 规定新增字段向后兼容、废弃字段通知和破坏性变更升级规则。
### 1.2 补全公开 API Schema
- [x] 为 Responses create、retrieve 和错误对象建立 Pydantic 模型。
- [x] 使用判别联合描述 `message`、`function_call` 和 `function_call_output`。
- [x] 在 OpenAPI 中声明 JSON、multipart/form-data、application/sdp 和 text/event-stream。
- [x] 为 Realtime JSON 事件维护可校验的 JSON Schema。
- [x] 为所有公开响应声明状态码、错误结构和示例。
- [x] 生成并提交稳定的 OpenAPI snapshot,CI 检查未审查的契约变化。
### 1.3 完善 Responses 资源接口
- [x] 增加 `GET /v1/responses/{response_id}/input_items`,支持稳定排序和分页。
- [x] 增加 `DELETE /v1/responses/{response_id}`。
- [x] 删除 Response 时使用逻辑删除或内部 tombstone,不能破坏已有子 Response 的祖先链。
- [x] 增加 `Idempotency-Key`:同 Key、同请求返回原结果;同 Key、不同请求返回冲突。
- [x] Provider 可以提供 Token 统计时返回真实 `usage`;无法提供时保持 `null` 并写入兼容说明。
- [x] 暂不实现 background 时,明确拒绝 `/cancel`,而不是静默接受。
### 1.4 增加模型发现与统一错误
- [x] 增加 `GET /v1/models`,列出当前可以通过公开接口调用的助手。
- [x] 第一版继续返回 `assistant:asst_xxx`;响应结构为未来稳定助手别名保留字段。
- [x] 所有公开 HTTP 错误统一为 OpenAI 风格的 `error` 对象。
- [x] 所有 HTTP 响应返回或透传 `X-Request-ID`。
- [x] Realtime `error.event_id` 必须关联原客户端事件。
- [x] 401、404、409、422、429、503 的使用规则写入协议文档。
### 1.5 SDK 契约测试
- [x] 使用官方 OpenAI Python SDK 测试 Responses 非流式、多轮和 SSE。
- [x] 使用官方 OpenAI JavaScript SDK 测试相同场景。
- [x] 测试 Client Tool 调用及 `function_call_output` 续传。
- [x] 测试跨 API Key 隐藏、重复幂等键和不支持字段。
- [x] 对 Realtime WebSocket 事件运行 JSON Schema 与事件顺序测试。
### 验收标准
- OpenAPI 中所有公开 HTTP 接口都有请求体、响应体和错误 schema。
- 官方 Python 和 JavaScript SDK 可以通过自定义 `base_url` 完成三轮 Responses 对话。
- 非流式结果、SSE 最终结果和 GET 查询结果语义一致。
- 公开兼容矩阵与代码自动化测试一一对应。
- 调用方不阅读项目源码也能完成首次接入。
## 里程碑二:实时可观测性与 SLO
### 目标
能够回答“慢在哪里、错在哪里、影响了多少会话”,并用可量化指标定义实时对话质量。
### 2.1 建立统一关联标识
每次执行使用以下层级:
```text
request_id
└─ session_id / response_id
└─ conversation_id
└─ turn_id
├─ asr span
├─ llm span
├─ tts span
├─ knowledge span
└─ tool span
```
- [ ] 使用 `contextvars` 在异步任务中传播关联标识。
- [ ] HTTP、SSE、WebSocket、WebRTC、后台任务和 Webhook 使用同一套标识命名。
- [ ] 日志中输出关联标识,但不把提示词、转写、密钥或动态变量作为默认日志字段。
- [ ] 指标标签禁止使用 response ID、session ID 等高基数字段。
### 2.2 接入 Metrics 和 Tracing
- [ ] 启用 Pipecat Pipeline metrics。
- [ ] 接入 Prometheus 指标端点。
- [ ] 接入 OpenTelemetry SDK,并允许通过 OTLP 环境变量配置 exporter。
- [ ] 为 FastAPI、HTTP Provider 调用和 PostgreSQL 增加基础自动插桩。
- [ ] 为 Pipeline 阶段、工具、知识库、SSE 和后台任务增加业务 span。
- [ ] exporter 不可用时不得阻塞或终止实时对话。
### 2.3 第一批指标
| 指标 | 类型 | 推荐标签 |
| --- | --- | --- |
| 活跃 Realtime 会话 | Gauge | channel、runtime_mode |
| 会话建立和结束 | Counter | channel、status、reason |
| 用户停说到首音频 | Histogram | runtime_mode、provider |
| ASR final 延迟 | Histogram | interface_type、status |
| LLM 首 Token 延迟 | Histogram | interface_type、status |
| TTS 首音频延迟 | Histogram | interface_type、status |
| 打断处理延迟 | Histogram | channel、status |
| 工具调用延迟 | Histogram | tool_type、status |
| 知识库检索延迟 | Histogram | mode、status |
| Responses 请求 | Counter/Histogram | stream、status |
| 后台任务 | Counter/Histogram | kind、status |
- [ ] 统一定义成功、取消、客户端断开、超时和内部失败状态。
- [ ] Provider 错误按鉴权、限流、超时、网络和服务端错误分类。
- [ ] WebRTC 首版从服务端可见统计开始;浏览器 `getStats()` 上报作为后续增强。
### 2.4 仪表盘与初始 SLO
- [ ] 建立 Realtime 总览、Provider、Responses、工具与后台任务仪表盘。
- [ ] 至少展示 p50、p95、p99 和最近错误样本。
- [ ] 先采集基线,再确认正式阈值。
- [ ] 为会话建立失败率、首音频延迟、Provider 错误率和任务积压设置告警。
初始候选目标:
| 项目 | 候选目标 |
| --- | --- |
| Realtime 会话建立成功率 | ≥ 99.5% |
| 用户停说到首音频 | p95 ≤ 2 秒 |
| 服务端打断处理 | p95 ≤ 250 ms |
| 平台自身导致的 turn 失败率 | ≤ 0.5% |
| Responses 非流式成功率 | ≥ 99.5% |
正式 SLO 必须在目标部署环境和真实 Provider 上取得基线后确认。
### 验收标准
- 可以从一次失败的会话追踪到具体 Provider、工具或存储阶段。
- 仪表盘能展示首音频延迟、错误率、活跃会话和任务积压。
- 关闭监控后端不会影响对话主链路。
- 日志和指标不泄漏用户内容或密钥。
## 里程碑三:生产运行可靠性
### 目标
在单租户、单区域、单个 Realtime API 进程优先的约束下,实现可恢复、可排空、有限流和可备份的生产运行方式。
### 3.1 Realtime 进程生命周期
- [ ] 增加服务状态:starting、ready、draining、stopped。
- [ ] draining 后停止签发 Client Secret,并拒绝新 Calls 和 WebSocket 会话。
- [ ] 已建立会话在可配置的宽限期内继续运行。
- [ ] 宽限期结束后取消剩余 Pipeline,并持久化明确终态。
- [ ] 统一 WebRTC、WebSocket、RTVI 和 Responses 的关闭及取消路径。
- [ ] 为 Pipeline 启动、关闭和资源释放增加超时保护。
Realtime Pipeline 与媒体连接绑定,继续保留在 API 进程内,不迁移到普通任务队列。
### 3.2 健康检查和资源保护
- [ ] 增加 `/health/live`,只判断事件循环和进程是否存活。
- [ ] 增加 `/health/ready`,检查数据库、迁移版本、必要配置和对象存储。
- [ ] readiness 失败时不接收新会话,但 liveness 不应因此触发无限重启。
- [ ] 设置全局活跃会话上限和每 API Key 并发上限。
- [ ] 为请求体、音频缓冲、SSE 队列和工具结果设置大小上限。
- [ ] 数据库连接池、HTTP 连接池和线程池使用显式上限。
- [ ] 达到容量上限时返回可识别的 429 或 503。
### 3.3 Provider 可靠性策略
- [ ] 统一 Provider 错误分类和超时配置。
- [ ] 只有在尚未向客户端输出内容时才允许自动重试。
- [ ] 流式输出开始后禁止透明重试,避免重复文字、音频或工具调用。
- [ ] 对新会话实现轻量熔断和恢复探测。
- [ ] 模型资源测试与生产请求共享同一套连接和错误分类逻辑。
- [ ] 备用 Provider 或模型作为后续可选能力,不在第一批强制实现。
### 3.4 迁移后台任务
第一批迁移以下任务:
- 知识库文档解析与向量化;
- 通话后分析;
- Webhook 投递;
- 批量测试和 Prompt 改进。
实现约束:
- [ ] 使用 Redis + ARQ 作为单租户 MVP 队列。
- [ ] PostgreSQL 保存任务业务状态,Redis 只负责投递、租约和重试。
- [ ] 每类任务都有幂等键、最大重试次数和明确终态。
- [ ] Worker 崩溃后任务可以重新领取。
- [ ] 重复执行不能重复发送 Webhook 或写入重复结果。
- [ ] API 能查询任务状态,服务启动不再直接恢复和执行全部后台工作。
### 3.5 生产部署和恢复
- [ ] 增加生产 API 镜像,移除 `--reload`。
- [ ] 前端使用 `next build` 与 `next start` 或静态生产部署。
- [ ] 数据库迁移作为独立部署步骤,不能由多个 API 实例同时执行。
- [ ] 为 PostgreSQL 和对象存储编写备份、恢复和校验步骤。
- [ ] 设置日志轮转、磁盘水位和录音/Response 保留策略。
- [ ] 完成一次从备份恢复到新环境的演练。
### 验收标准
- 服务进入 draining 后不接收新会话,已有会话可以正常结束或在超时后被正确取消。
- Worker 被强制终止后,未完成任务可以恢复且不会重复产生副作用。
- Provider 超时不会无限占用 Pipeline 或连接。
- 数据库或对象存储不可用时 readiness 会失败并给出可诊断原因。
- 生产部署不运行开发热更新服务。
## 里程碑四:全链路质量门禁
### 目标
把协议正确性、实时体验和故障恢复变成每次变更都能重复验证的发布条件。
### 4.1 测试分层
| 层级 | 运行时机 | 内容 |
| --- | --- | --- |
| 单元和组件测试 | 每次提交 | 协议解析、状态机、工具、工作流、指标 |
| 契约测试 | 每次提交 | OpenAPI、JSON Schema、Python/JS SDK |
| 服务集成测试 | 每次提交 | PostgreSQL、Redis、对象存储、Fake Provider |
| 浏览器媒体测试 | 主分支或发布前 | WebRTC、假麦克风、DataChannel、打断 |
| 基础设施测试 | 每日或发布前 | TURN、弱网、故障注入 |
| 真实 Provider smoke | 每日或发布前 | 限量 ASR、LLM、TTS、Realtime 调用 |
| 负载和长稳测试 | 发布前 | 并发、容量、内存、连接和任务泄漏 |
### 4.2 每次提交门禁
- [ ] 提供一个无需隐藏环境变量的后端测试命令。
- [ ] 运行后端全部测试、前端 lint 和 production build。
- [ ] 从空数据库执行所有 Alembic migrations。
- [ ] 校验 OpenAPI snapshot 和 Realtime JSON Schema。
- [ ] 使用 Fake Provider 完成 Responses 三轮对话、分支和 Client Tool 续传。
- [ ] 测试 SSE 断开、Pipeline 失败、超时和取消后的数据库终态。
- [ ] 测试 Worker 幂等、重试和任务恢复。
### 4.3 浏览器和媒体链路
- [ ] 使用 Playwright Chromium 假麦克风输入固定音频文件。
- [ ] 验证 WebRTC SDP、远端音频轨道和 `oai-events` DataChannel。
- [ ] 验证 Server VAD、PTT、打断和 Client Tool。
- [ ] 使用固定 PCM fixture 测试 Realtime WebSocket。
- [ ] 在独立环境中强制只走 TURN,避免测试误用直连路径。
- [ ] 保存失败时的浏览器日志、协议事件和服务端 trace。
### 4.4 弱网、故障和负载
- [ ] 使用 Linux `tc netem` 注入延迟、抖动、丢包和短时断网。
- [ ] 注入 ASR、LLM、TTS、工具、数据库、Redis 和对象存储超时。
- [ ] 验证客户端断开后 Pipeline 与资源及时释放。
- [ ] 对 Responses HTTP/SSE 和 Realtime WebSocket 运行并发测试。
- [ ] 使用 aiortc 测试客户端运行 WebRTC 并发场景。
- [ ] 运行 30 至 60 分钟长连接 soak test,观察内存、Task 和连接数量。
### 4.5 发布判定
一次生产发布至少满足:
- [ ] 单元、契约、集成和浏览器关键路径全部通过。
- [ ] 没有未审查的公开协议变化。
- [ ] p95 首音频延迟未超过允许回归范围。
- [ ] 错误率、超时率和异常断开率未超过阈值。
- [ ] 没有持续增长的 Pipeline、asyncio Task、数据库连接或 WebRTC peer。
- [ ] 备份恢复和 Worker 恢复机制在当前版本仍然有效。
## 推荐交付批次
### 批次 A:契约与工程入口
- 修复统一测试命令;
- 建立后端、前端和 migration CI;
- 为 Responses 增加 Pydantic/OpenAPI schema;
- 增加统一错误对象、Request ID 和 OpenAPI snapshot;
- 增加 Python SDK Responses 契约测试。
### 批次 B:Realtime 契约与观测基础
- 建立 Realtime 事件 JSON Schema;
- 增加 JavaScript SDK 和 WebSocket 契约测试;
- 建立关联 ID 和结构化日志;
- 接入 Prometheus 与 OpenTelemetry;
- 输出第一版运行基线仪表盘。
### 批次 C:生命周期与 Worker
- 增加 live、ready 和 draining;
- 增加会话、缓冲和连接池上限;
- 统一 Provider 超时和重试边界;
- 引入 ARQ Worker 并逐类迁移后台任务;
- 增加生产镜像与备份恢复说明。
### 批次 D:全链路发布门禁
- 建立 PostgreSQL、Redis、对象存储和 Fake Provider 集成环境;
- 增加 Playwright WebRTC 与 PCM WebSocket 测试;
- 增加 TURN、弱网、故障注入和真实 Provider smoke;
- 建立负载、长稳测试和发布阈值。
## 总体验收
完成本计划后,平台应满足以下定义:
1. 对外接口有明确、可生成、可测试的稳定契约;
2. 每个请求、会话和对话轮次都可以被测量和追踪;
3. 服务、Provider 或 Worker 故障不会留下无法恢复的模糊状态;
4. 发布前可以自动证明标准接口、实时媒体链路和核心 SLO 没有回归;
5. 无需引入多用户体系,也能作为单租户生产服务安全、稳定地运行。