feat: expand companion platform, device controls, and memoir workflows
ci / verify (push) Canceled after 0s

Add customer and operator login, BLE provisioning, device fleet controls, call memory, memoir generation, and refreshed family and maintenance portals. Include API contracts, migrations, firmware sources, tests, assets, and deployment documentation.
This commit is contained in:
Codex Local
2026-10-08 10:06:44 +08:00
parent 98fb2965d0
commit bf1233d5df
861 changed files with 94614 additions and 3209 deletions
+36
View File
@@ -0,0 +1,36 @@
# 老人档案与火山专属智能体同步
资料保存成功后立即尝试更新专属 Bot;同步失败不会回滚已保存资料。第 76 个迁移在 `subject_voice_agent` 中记录待同步版本、已确认版本、状态与重试时间,档案更新和待同步登记在同一数据库事务内完成。隐私更正走同一触发器。头像、内部备注、单独的档案版本号更新不会触发供应商更新。
## 发给模型的内容
- 基础角色:保留现有专属 Bot 的基础人设,迁移只移除旧编译器追加的末尾称呼句。
- 交流设置:称呼、语言、节奏、避免主动提及的话题。
- 个性化资料:背景、兴趣、长期陪伴方向、优先话题;需要现有 `personalized_memory` 授权和有效语音聊天授权。
- 本通上下文:开场、已授权记忆、最近问题线索;只在开聊准备时追加,不写回基础配置。
完整档案使用 JSON 编码,作为事实和偏好资料;自由文本不能改变基础角色和安全规则。避免主动提及列表作为交流边界,不能用于主动开场、引导或追问;长者主动提起时尊重当前意愿。优先话题不强制转题,长期陪伴方向不要求每通完成。头像、内部备注和其他扩展字段不会进入模型上下文。原生 `MemoryConfig.Enable` 保持关闭。
## 同步与并发
API 保存后调用 `Sync`。worker 每两秒扫描待同步项目,失败按 1、2、4……256 秒的间隔持续重试。任务只保存版本和固定错误码,不记录供应商错误正文、档案正文或凭据。连续编辑会合并为最新版本。
资料更新、同步和新通话准备使用同一个内部老人 ID 的锁。已有活动通话时不更新供应商配置;直连通话需要结束记录、音频关闭和 SDK 停止,才可同步。状态显示“当前通话结束后同步,下次聊天生效”。供应商更新返回后会读取 Bot,核验人设、欢迎语、回调地址、验签配置及原生记忆关闭状态;凭据可能被供应商遮蔽,不比较或输出凭据。
开聊准备使用相同编译器读取最新档案,再附加本通上下文。更新或核验失败时沿用现有 `VOICE_AGENT_CONFIG_FAILED` 启动错误,不使用旧禁提配置启动新通话。同一会话续约仍复用冻结参数。通话结束后后台清理供应商上的临时开场、记忆和回调,恢复专属 Bot 的稳定配置。
授权撤回会登记待同步;授权到期由扫描器重新检查并清理个性化内容。更新过程中发生授权变化时,旧请求不能确认新版本。已有的通话隐私停止机制继续生效。
## 前端与接口
`Subject.voice_agent` 增加 `persona_sync_status`(PENDING/SYNCED/DEFERRED/FAILED)、`persona_revision`、`persona_synced_revision`、`persona_synced_at` 和 `personalization_included`。同步状态与 Bot 创建状态分开;同步失败不把 READY Bot 改成创建失败。
资料编辑页显示同步状态。待同步期间每五秒只刷新同步元数据,不重置未保存的编辑。同步失败可使用原有 `POST /api/v1/subjects/{id}/voice-agent` 重试;该接口现在会同步 READY Bot 的待处理资料。缺少个性化授权时页面明确说明相关字段尚未进入模型。
## 发布与验证
需要先应用迁移 `000076_elder_persona_sync`,再发布 API、worker 和 Web。worker 需要同 API 一样可读取 `DIRECT_CHAT_TEMPLATE_FILE` 或 `VOLC_VOICE_CHAT_TEMPLATE_FILE`,并具有火山更新、查询权限。迁移将现有专属 Bot 标为 PENDING,由后台补同步;正在通话的 Bot 延后处理。尚未创建成功的 Bot 继续使用既有创建重试入口。
运行 `scripts/test-elder-persona-sync.ps1` 验证迁移回填、升级回滚、真实数据库事务与现有相关功能。脚本创建独立的临时 PostgreSQL/Redis 容器,只发布到本机,使用合成数据和本地供应商替身,结束后自动清理,不接触 Compose 或生产服务。
本次本地验证四个相关包共有 372 项测试(包含子案例)通过,无跳过;火山接口通过本机 HTTP 模拟验证更新和查询回读。上线后仍需对真实 Bot 做读取核验和实际语音交流验收,接口同步成功不代表模型在每一轮都遵守全部偏好。