- usePlayer:paused 且 tts_auto 时清空队列并重置,再播当前片段 - 用 statusRef 与暂停同步,避免 WS 紧连 enqueue 时状态滞后 - 补充 use-player 单测 - api: 调整 copyright_source_pdf 脚本 - docs: 新增软著《岁月时书》软件设计说明书 Co-authored-by: Cursor <cursoragent@cursor.com>
28 KiB
软件设计说明书(兼操作手册)
文档封面信息
| 项目 | 内容 |
|---|---|
| 软件全称 | 岁月留书 |
| 英文名称 | Life Echo |
| 文档名称 | 《岁月留书》软件设计说明书 |
| 文档版本 | 1.0 |
| 对应软件版本 | 1.0 |
| 著作权人 | 上海华嘎科技有限公司 |
| 编写单位 | 上海华嘎科技有限公司 |
| 编写日期 | 2026年5月12日 |
第 1 章 引言
1.1 编写目的
本说明书描述「岁月留书(Life Echo)」一体化软件系统在代码仓库层面的组成结构、总体架构、主要功能规格、核心业务流程、开发与测试状况以及典型环境下的安装与运维使用方法。
1.2 适用范围
本说明书适用于以下组成部分的整体说明:
- 后端 API 服务:路径
api/,基于 FastAPI,对外提供 REST API、WebSocket 实时对话能力及静态资源挂载。 - 客户端应用:路径
app-expo/,基于 Expo Router 与 React Native,面向终端用户提供登录、对话、回忆录浏览与导出相关交互界面。 - 内部评测前端:路径
app-eval-web/,基于 Vite,用于开发与回归评测场景(一般不纳入终端用户交付镜像,与内部评测 API 配合使用)。 - 工程与运维文档:路径
docs/,存放与本项目相关的运维、设计备忘等资料;本说明书为其中面向著作权登记的汇总文档。
1.3 术语与缩写
| 术语 | 含义 |
|---|---|
| JWT | JSON Web Token,访问令牌与刷新令牌组合的认证机制 |
| WebSocket | 全双工通信协议,本项目中用于实时语音与文本对话管线 |
| ASR | Automatic Speech Recognition,语音转文字 |
| TTS | Text-To-Speech,文字转语音 |
| LLM | Large Language Model,大语言模型;后端通过适配层调用兼容 OpenAI API 的服务 |
| Agent | 基于 LangChain 组织的对话与回忆录编排逻辑单元 |
| ChatOrchestrator | 实时对话编排入口,负责将用户输入路由至画像采集或访谈对话等分支 |
| MemoirOrchestrator | 回忆录正文流水线编排入口,负责分段调度抽取、分类与各 Specialist Agent |
| Celery | Python 异步分布式任务队列,用于回忆录 Phase 处理、记忆压实、嵌入调度等后台作业 |
| Phase1 / Phase2 | 回忆录批量处理阶段的工程称谓:Phase1 侧重批次准备与派发,Phase2 按类别执行故事管线 |
| Redis | 内存数据结构存储,用作会话缓存与队列协调等 |
| PostgreSQL | 关系型数据库;会话消息等持久化真源存放于此 |
| pgvector | PostgreSQL 扩展,用于向量检索相关的记忆块存储与检索 |
| Alembic | 数据库 Schema 迁移工具;本项目禁止手写 DDL 绕过迁移脚本 |
第 2 章 系统概述
2.1 建设目标与业务边界
本软件面向「口述回忆录」类产品形态,建设目标包括:
- 实时智能访谈:通过 WebSocket 维持长连接,在移动端采集用户语音或文本输入,经 ASR(若语音)形成可处理文本,再由 LLM 驱动的 Agent 结合传记结构与历史记忆检索结果生成引导性回复。
- 结构化回忆录生成:将多轮对话中的有效叙事内容抽取、归类,按章节与阅读片段组织为可阅读的「回忆录」文稿,并支持章节级素材与图像任务(工程上区分为正文配图与章节封面等管线)。
- 可导出成品:服务端将回忆录内容排版并生成 PDF 等可供用户留存与分享的文档形式(具体能力以当前
features/memoir与相关服务实现为准)。 - 账户、套餐与商业化支撑:提供用户注册登录、套餐(Plan)、配额(Quota)、订单与支付(含微信、支付宝等适配)等能力,保证多租户下的资源可控与可审计。
2.2 非功能需求概要
| 类别 | 要求说明 |
|---|---|
| 实时性 | WebSocket 连接内消息顺序稳定;首轮「边播 TTS 边出字」模式下,服务端按协议先推送音频再推送对应文本分段 |
| 安全 | REST 接口使用 JWT;WebSocket 连接通过 Query 携带 access_token 校验身份 |
| 可运维 | 健康检查路由 /health;请求追踪依赖中间件注入 request id;日志采用统一结构化封装 |
| 可扩展 | 外部厂商能力集中在 adapters,业务仅依赖 ports 协议,便于替换 ASR/TTS/LLM/短信/对象存储等实现 |
| 数据一致性 | 会话消息以数据库表 conversation_messages 为权威存储,Redis 承担缓存与加速读取职责 |
2.3 系统边界图(逻辑)
客户端(Expo 应用或评测前端)仅与本后端 HTTP/WebSocket 交互;后端再访问 PostgreSQL、Redis,并向 Celery Worker 投递异步任务;外部云服务包括 LLM、ASR、TTS、短信、对象存储及支付网关等,经由适配层调用。
第 3 章 总体设计与运行环境
3.1 Monorepo 目录组成
仓库根目录主要包含:
life-echo/
├── api/ # 后端(FastAPI,Python,uv + Alembic + Celery)
├── app-expo/ # 移动端(Expo Router + React Native)
├── app-eval-web/ # 内部评测 Web(Vite)
├── docs/ # 设计与运维文档(含本说明书)
├── package.json # 根级脚本聚合(如 husky、子项目脚本转发)
└── README.md # 项目总览
3.2 后端进程形态
- 主 API 进程:模块入口
api/app/main.py创建 FastAPI 应用app,挂载各业务 Router,注册 WebSocket 路径/ws/conversation/{conversation_id},并在启动阶段执行 Alembic 迁移、Redis 连接、ASR 就绪检查、微信支付客户端预初始化等。 - 内部评测 API 进程(可选隔离部署):模块入口
api/app/internal_main.py创建internal_app,挂载evaluation相关路由,用于回归评测与会话对比,默认与主 API 进程分离以降低评测对线上入口的影响。 - Celery Worker:消费 memoir 处理、记忆压实、嵌入调度、记忆富化等任务队列;具体队列名与路由以
tasks包及环境变量为准。
3.3 客户端组成
app-expo 采用文件式路由,源码主目录为 src/app/,典型路由分组包括:
| 路由分组 | 相对路径示例 | 用途说明 |
|---|---|---|
| 认证 | (auth)/login.tsx、register.tsx、reset-password.tsx |
登录、注册、重置密码 |
| 主导航 Tab | (tabs)/index.tsx、memoir.tsx、profile.tsx |
首页、回忆录、个人中心 |
| 对话与内容 | (main)/conversation/[id].tsx、chapter/[id].tsx |
单会话对话页、章节阅读 |
| 设置与合规 | (main)/personal-info.tsx、export-data.tsx、delete-data.tsx、faq.tsx、feedback.tsx、about.tsx |
个人信息、导入导出与删除数据、常见问题、反馈、关于 |
| 法律文档 | legal/[type].tsx |
法律类展示页 |
3.4 开发与运行依赖(摘要)
后端建议环境:Python 3.10 及以上;依赖与锁文件由 uv 管理(api/pyproject.toml 与 api/uv.lock)。数据库使用 PostgreSQL;缓存与消息代理使用 Redis。容器编排可使用 docker-compose 系列文件(以 api/ 目录下实际文件名为准)。
移动端使用 Node.js 生态执行 npm install 与 npx expo start 等命令。内部评测前端在 app-eval-web/ 目录使用 Vite 开发服务器。
3.5 内部评测前端(app-eval-web)
app-eval-web 为研发与质量保障使用的单页应用工程,默认仅监听本机开发端口(常见为 5174,以 Vite 控制台输出为准)。其通过 HTTP 调用 internal_app 暴露的评测 REST API,前缀固定为 /internal/api/evaluation(见 api/app/internal_main.py 中的 include_router 配置)。该前端不作为终端用户应用商店交付物的一部分描述,仅在说明「Monorepo 完整组成」时列出。
第 4 章 软件结构说明
4.1 后端分层架构
后端严格按功能域拆分,并遵守「路由不写业务 SQL、服务不直连三方 SDK」的边界约定:
| 层次 | 目录 | 职责 |
|---|---|---|
| 接口层 | app/features/*/router.py |
定义 REST 或协议入口,注入服务依赖,返回 Pydantic 模型 |
| 业务层 | app/features/*/service.py |
业务规则、事务边界、编排对多个 repo 与端口的调用 |
| 持久层 | app/features/*/repo.py |
数据库增删查改,不在此层随意 commit(由上层统一事务策略) |
| 领域模型 | app/features/*/models.py |
SQLAlchemy ORM 模型 |
| 端口 | app/ports/ |
协议(Protocol),描述 ASR、TTS、LLM、短信等能力 |
| 适配器 | app/adapters/ |
具体厂商实现,如 DeepSeek、腾讯、OpenAI Whisper 等 |
| 智能体 | app/agents/ |
LangChain Agent 及 ChatOrchestrator、MemoirOrchestrator 等编排类 |
| 核心设施 | app/core/ |
配置、数据库引擎、Redis、安全、日志、中间件、异常处理等 |
| 任务 | api/tasks/ |
Celery 应用与任务定义入口 |
4.2 功能域与源码对应关系
以下功能域均位于 api/app/features/ 下,各自通常包含 router、service、repo(按需)、schemas、deps 等文件:
| 域 | 目录 | 主要职责 |
|---|---|---|
| 认证 | auth/ |
注册、登录、短信验证码、JWT 签发与校验、头像预设等 |
| 用户 | user/ |
用户资料、反馈等对外接口 |
| 对话 | conversation/ |
REST 会话管理、WebSocket 管线、ChatOrchestrator 调用、历史与额度守护 |
| 记忆 | memory/ |
记忆块写入、向量检索、富化管道、压实服务、嵌入调度与对外查询接口 |
| 回忆录 | memoir/ |
章节与阅读素材、PDF 服务、叙事安全、口述规范化、章节封面与正文图像任务、状态服务等 |
| 故事 | story/ |
与篇章素材、同步写入、配图意图等相关的服务与仓储(与回忆录流水线协同) |
| 套餐 | plan/ |
套餐目录与订购相关能力 |
| 配额 | quota/ |
配额检查与扣减策略,供对话、回忆录、支付等场景注入使用 |
| 支付 | payment/ |
订单、微信与支付宝等支付通道封装 |
| 任务 | tasks/ |
任务状态查询等对前端的任务进度暴露 |
| 内容 | content/ |
TTS 等内容相关接口 |
| 资源 | asset/ |
资源存取相关仓储与模型 |
| 评测 | evaluation/ |
内部评测数据模型、打分、会话目录、回放、对比摘要等(由 internal_main 挂载) |
4.3 WebSocket 协议文件
工程在 api/app/features/conversation/ws/protocol.md 中维护 WebSocket 文本协议说明,包括连接 URL 形态、客户端到服务端与服务端到客户端的消息类型枚举、心跳与重连语义等,与实现代码共同构成可审查的契约说明。
第 5 章 功能规格说明
本章按业务域给出可测试的规格化描述:目标、典型输入、处理要点、输出与约束。
5.1 认证与用户(auth / user)
目标:为全站提供可信身份,支撑受保护 REST 与 WebSocket。
典型输入:手机号与密码注册、登录;短信验证码发送与校验;刷新令牌请求。
处理要点:密码经安全哈希存储;签发短期访问令牌与长期刷新令牌;对外 schema 校验在 Pydantic 层完成。
输出:令牌对、用户基础资料、错误码与错误信息遵循 app/core/errors.py 约定的统一错误响应结构(含 error_code、message、request_id)。
约束:成功业务响应可为直接模型或字典,不必统一包装信封;敏感环境变量不得写入代码库。
5.2 对话与实时管线(conversation)
目标:维持长连接会话,完成「语音或文本 →(可选 ASR)→ Agent 推理 →(可选 TTS)→ 客户端展示」闭环。
典型输入:TEXT、AUDIO_SEGMENT、AUDIO_MESSAGE、TRANSCRIBE_ONLY、TTS_REQUEST、TTS_CANCEL、END_CONVERSATION、心跳等,详见 protocol.md。
处理要点:连接 URL 为 /ws/conversation/{conversation_id}?token={jwt_access_token};编排由 ChatOrchestrator 将用户消息路由到画像分支或访谈分支;会话真源写入 conversation_messages,Redis 用于加速与缓存;额度由 quota 相关守护在管线中发挥作用。
输出:TRANSCRIPT、AGENT_RESPONSE 分段、TTS_AUDIO、MEMOIR_UPDATE、ERROR 等下行消息。
约束:同一连接内消息顺序稳定;若本轮开启服务端 TTS,则每一助手分段先 TTS_AUDIO 再对应 AGENT_RESPONSE。
5.3 记忆与检索(memory)
目标:将对话中可复用的事实与摘要以向量块形式持久化,支持后续会话与回忆录生成时的语义检索。
典型输入:会话轮次文本、用户标识、检索 query、富化开关相关配置。
处理要点:写入与切块、嵌入、可选 LLM 富化、定时压实(compaction)等由服务与 Celery 任务协同;异步与同步路径行为可能不同,工程文档中建议以 docs/memory-retrieval.md(若存在)等行为矩阵为准。
输出:检索到的记忆证据、供提示词注入的结构化片段、必要的追踪信息(若开启)。
约束:配置项如 CHAT_MEMORY_RETRIEVAL_ENABLED、MEMORY_COMPACTION_ENABLED 等由 app/core/config.py 集中管理,调参需结合运行环境与负载。
5.4 回忆录与 PDF(memoir)
目标:将多轮叙事整理为结构化章节与阅读体验,并生成可导出的文档与配图。
典型输入:会话 id、回忆录 id、章节 id、导出请求、图像生成相关任务参数。
处理要点:MemoirOrchestrator 负责分段编排;Phase1 批次准备后 process_memoir_phase1 等 Celery 任务派发 Phase2,按类别进入 run_story_pipeline_for_category_batch;图像方面区分正文图 generate_story_image 与章节封面 generate_chapter_cover enqueue 逻辑;PDF 由 pdf_service 等模块调用排版引擎完成。
输出:章节文本、阅读片段、PDF 文件流或 URL、任务状态更新、经由 WebSocket 的 MEMOIR_UPDATE 通知。
约束:涉及对象存储 URI 时需经预签名或受控网关访问;长篇生成依赖队列与超时配置。
5.5 故事与素材(story)
目标:承接回忆录流水线中篇章级写入与配图意图抽取等职责,与 memoir 域协同。
典型输入:批量单元规划结果、叙事路由 Agent 输出、图像意图字段。
处理要点:仓储与服务分层保持与全局架构一致;同步写入路径需考虑与数据库事务的一致性。
输出:持久化的故事单元记录、下游图像任务触发条件。
5.6 套餐与配额(plan / quota)
目标:定义可售卖套餐与用户使用限额,避免超卖与滥用。
典型输入:套餐 id、用户当前订阅状态、对话轮次或回忆录导出等资源计量事件。
处理要点:QuotaService 供会话与回忆录等模块注入调用;不得在功能模块内硬编码配额 SQL。
输出:允许或拒绝决策、剩余额度字段(若接口暴露)。
5.7 支付与订单(payment)
目标:完成下单、渠道拉起、回调处理与订单状态推进。
典型输入:支付方式枚举、订单金额、回调报文。
处理要点:微信与支付宝客户端由适配层封装;支付失败与幂等处理在服务层体现。
输出:支付参数包、订单状态、错误码。
5.8 任务进度(tasks)
目标:向前端暴露长时间运行任务的状态,改善用户对回忆录生成等操作的感知。
典型输入:任务 id 或业务关联键。
处理要点:与 task_tracker 等核心组件协作(若启用)。
输出:状态枚举、进度百分比或步骤文案。
5.9 内容与朗读(content)
目标:提供与朗读相关的服务端能力配合对话气泡交互。
典型输入:文本分段、音色参数(若支持)。
处理要点:与 TTS 适配层衔接;必要时写入缓存或以 URL 形式下发。
5.10 内部评测(evaluation)
目标:支持离线或半离线环境下的会话回放、评分与对比报告生成,服务于研发质量保障。
典型输入:评测会话导入数据、评测脚本、评分 Rubric 版本。
处理要点:评测 HTTP API 运行在 internal_app;浏览器界面由 app-eval-web 调用上述 API。
输出:评测轨迹、对比摘要、门禁报告(gate report)等结构化结果。
第 6 章 核心业务流程与设计说明
6.1 逻辑分层与依赖关系
flowchart TB
subgraph clients [Clients]
ExpoApp[app-expo]
EvalWeb[app-eval-web]
end
subgraph backend [api FastAPI]
Router[features routers]
Service[services]
Repo[repos]
Agents[agents]
Ports[ports]
Adapters[adapters]
end
subgraph infra [Infrastructure]
PG[(PostgreSQL)]
Redis[(Redis)]
Celery[Celery workers]
end
ExpoApp --> Router
EvalWeb --> Router
Router --> Service
Service --> Repo
Service --> Agents
Service --> Ports
Ports --> Adapters
Repo --> PG
Service --> Redis
Service --> Celery
6.2 访问令牌认证与刷新(REST 概要)
sequenceDiagram
participant C as Client
participant A as auth_router
participant S as AuthService
participant DB as PostgreSQL
C->>A: POST login credentials
A->>S: validate_and_issue_tokens
S->>DB: verify user password hash
DB-->>S: user row
S-->>A: access_token refresh_token
A-->>C: 200 JSON tokens
C->>A: GET protected with Authorization Bearer
A->>S: verify access_token
S-->>A: user context
A-->>C: 200 protected resource
C->>A: POST refresh with refresh_token
A->>S: rotate if valid
S-->>A: new token pair
A-->>C: 200 new tokens
6.3 WebSocket 对话主路径(概要)
stateDiagram-v2
[*] --> Connected: JWT valid connect
Connected --> Transcribing: AUDIO or AUDIO_SEGMENT
Transcribing --> AgentThink: TRANSCRIPT ready
Connected --> AgentThink: TEXT input
AgentThink --> StreamingReply: ChatOrchestrator yields
StreamingReply --> Connected: segments sent optional TTS
Connected --> Ending: END_CONVERSATION
Ending --> [*]
Connected --> Connected: PING PONG heartbeat
6.4 回忆录异步流水线(概要)
flowchart LR
subgraph realtime [Realtime path]
WS[WebSocket pipeline]
CO[ChatOrchestrator]
DB1[(conversation_messages)]
end
subgraph batch [Batch path]
MO[MemoirOrchestrator]
P1[Phase1 Celery]
P2[Phase2 by category]
PDF[PDF service]
IMG[Image tasks]
end
WS --> CO
CO --> DB1
DB1 --> MO
MO --> P1
P1 --> P2
P2 --> PDF
P2 --> IMG
6.5 记忆写入、富化与压实(概念)
用户经对话产生的新素材经 memory 域服务切块与嵌入后进入 PostgreSQL/pgvector;可选富化任务进入独立 Celery 队列(如 memory_idle);压实任务按配置周期合并或清理旧块,以降低检索噪声与存储膨胀。详细行为以环境变量开关与代码内服务实现为准。
第 7 章 接口与数据概要
7.1 REST 与 WebSocket 入口形态
主应用 app 注册的路由前缀以各 router 定义为准;OpenAPI 文档在 settings.enable_docs 为真时可通过 /docs 与 /redoc 访问。WebSocket 固定路径模板为 /ws/conversation/{conversation_id},鉴权参数为 Query 中的 token。
内部评测应用 internal_app 的评测相关接口前缀参见 internal_main 中的说明(例如 /internal/api/evaluation/ 一类路径,以实际路由定义为准)。
7.2 统一错误响应
业务错误返回 JSON 结构包含字段:error_code、message、request_id,由全局异常处理器注册,保证客户端可程序化解析。
7.3 数据库与迁移
业务表模型分散于各 features/*/models.py,并在 app/main.py 中间接 import 以聚合到 Base.metadata。一切结构变更必须通过 api/alembic 版本脚本完成。应用启动时可在 run_alembic_upgrade_at_startup 中自动执行 upgrade head,生产可配置失败即退出。
7.4 核心实体(语义级)
| 实体 | 语义 |
|---|---|
| User | 注册用户、凭据哈希、画像字段 |
| Conversation / Session | 对话容器,关联多条消息 |
| ConversationMessage | 单条用户或助手消息,WebSocket 与历史查询的真源 |
| Memoir / Chapter | 回忆录与章节树;阅读片段与导出依赖其内容 |
| MemoryChunk | 向量检索用的记忆块 |
| Order / Payment | 订单与支付流水 |
| Plan / Quota | 套餐定义与用户使用额度 |
第 8 章 开发状况与测试结果说明
8.1 当前实现状态(与仓库说明对齐)
下列能力在根目录 README.md 中标记为已实现或持续演进,著作权文档在此做技术化转述:
- 用户注册与登录(手机号与密码)。
- 基于 JWT 的访问令牌与刷新令牌机制。
- 基于 WebSocket 的实时语音与文本对话。
- AI 引导访谈与画像采集分支(由
ChatOrchestrator路由)。 - 语音识别与语音合成适配(具体厂商由配置与适配器决定)。
- 对话内容向章节与回忆录结构的整理与异步处理。
- 回忆录章节管理与 PDF 导出能力。
- Android 端本地数据能力(Room 等,详见客户端工程)。
- 离线数据同步相关能力(详见客户端工程)。
- 用户套餐与订单支付相关能力。
- 常见问题与反馈入口(用户域接口与客户端页面)。
标记为规划或进行中的能力(如更多传记模板、章节编辑深化、多语言等)以仓库 README.md 最新描述为准,本说明书不将其表述为已完成交付。
8.2 测试策略与自动化范围
后端测试以 pytest 为主,辅以 httpx.AsyncClient 与 ASGITransport 进行异步 HTTP 场景测试。项目规则强调:
- 测试应服务真实业务场景,避免仅为覆盖率堆砌无断言价值的用例。
- 优先覆盖核心用户路径、鉴权与配额、幂等性与关键持久化状态。
- 不优先测试第三方库自身行为或脆弱实现细节。
- 测试应用
dependency_overrides替换数据库与外部依赖,避免直接 import 生产入口带来的环境副作用。
典型可自动化部分包括:注册登录与刷新链路、受保护资源访问、主要 CRUD 与失败分支。依赖真实 ASR、TTS、LLM、短信、支付沙箱的全链路测试多在手工或独立 E2E 环境执行。
8.3 测试结果表述方式建议
在向登记机关提交「测试结果」材料时,可将以下内容整理为附录表格或截图说明:
- 本地或 CI 执行
uv run pytest的命令、通过用例数量与跳过用例原因。 - 关键模块的覆盖率报告(若政策允许附带
pytest-cov摘要)。 - 手工测试用例清单:WebSocket 多轮对话、回忆录生成端到端、支付回调联调(若适用)。
本说明书不嵌入具体 CI 截图,以免与仓库演进不同步;导出 PDF 前由实施者替换为当期报告。
第 9 章 安装、配置与使用方法
9.1 获取源代码
通过版本控制系统克隆 life-echo 仓库,检查 out 的分支与标签与本次登记版本一致。
9.2 后端本地开发(推荐路径)
在 api/ 目录:
- 安装
uv并执行uv sync --dev安装运行与开发依赖。 - 复制环境变量模板为
.env,按api/README.md填入数据库 URL、Redis URL、JWT 密钥、LLM 与 ASR 相关 Key 等。 - 使用
docker compose -f docker-compose.dev.yml up -d或项目提供的一键脚本启动 PostgreSQL 与 Redis。 - 执行
uv run alembic upgrade head(若未依赖启动时自动迁移)。 - 执行
uv run uvicorn main:app --reload --host 0.0.0.0 --port 8000或通过./dev-up.sh拉起 API 与 Celery。
环境变量优先级与 LLM 提供商选择逻辑以 api/README.md 与 app/core/config.py 为准。
9.3 内部评测入口
在 api/ 目录执行 uv run uvicorn app.internal_main:internal_app --host 0.0.0.0 --port 7999(端口以实际环境变量为准)。在另一终端于 app-eval-web/ 执行 npm install 与 npm run dev,通过浏览器访问 Vite 提示的本地地址操作评测台。
9.4 移动端使用
在 app-expo/ 目录执行 npm install 与 npx expo start,按 Expo CLI 提示在模拟器或真机打开应用。将 API 基础地址指向已启动的后端(含合法 TLS 或开发环境豁免配置),完成登录后即可使用对话与回忆录功能。具体网络权限与麦克风权限以各平台 app.json / 插件配置为准。
9.5 生产部署注意
SECRET_KEY与所有第三方密钥必须来自安全存储。- CORS
allow_origins在生产应收敛为前端真实域名,而非通配。 - 建议将
ALEMBIC_STARTUP_FAIL_FAST设为严格模式以避免实例在错误 Schema 下带病运行。 - Celery Worker 与 Beat 应与 API 分离进程或容器,并为
memory_idle等专用队列配置合理并发。
9.6 日志与排错
业务代码使用 app.core.logging.get_logger(__name__) 取得 logger,便于按 request id 关联。出现 4xx/5xx 时优先检查错误体中的 request_id 与服务端日志同一时间窗口。