用户不只与角色聊天,还会看动态、参加社区、送礼物、发起邀约和进入线下见面。这些互动必须共享同一段关系历史。
我想解决的,不是缺少一个聊天工具。
真正的问题是传统对话产品无法持续维护角色身份、关系状态和共同经历。
用户能够从创建角色开始,完成对话、记忆沉淀、跨场景互动与线下见面;关闭页面后再次进入,关系状态仍然连续。
聊天不难,难的是让关系连续。
普通聊天机器人只处理眼前一句话。Angel 需要记得角色是谁、关系走到哪里,以及之前发生过什么。
核心问题不是“怎么回复”,而是“为什么此刻会这样回复”。
我把角色、世界、记忆、关系和时间组织成同一个上下文系统。
角色卡定义身份与表达边界,世界书按关键词和作用域补充背景。
重要事件沉淀为长期记忆,并在后续聊天和线下互动中被重新调用。
不是给聊天框加功能,而是建立一套共同生活的系统。
聊天、朋友圈、论坛、微博与线下见面共享同一套角色状态,行为不再彼此割裂。
- 角色卡
- 定义身份、性格、经历与关系基础。
- 世界书
- 按对话内容动态加载背景知识与规则。
- 关系与记忆
- 把关键互动转化为下一次回应的依据。



一次回复背后,经历四次判断。
理解当前场景
识别消息、时间、媒体与互动类型。
组装有效上下文
加载角色、世界书、关系与相关记忆。
约束模型输出
控制文风、长度、格式与留白策略。
写回关系状态
保存消息、候选记忆与新的互动结果。
界面背后,是五层协作。
每一层只处理自己的问题,让角色体验、数据和模型调用可以分别演进。
体验与状态层
手机主屏承载多个应用,但所有应用读取统一账号、角色和时间状态。
- 输入
- 文字、图片、语音、通话、红包与邀约。
- 场景
- 聊天、朋友圈、社区、微博、外卖和线下见面。
- 状态
- 关系、钱包、时间、待回复消息和互动通知。
上下文层
根据当前场景选择角色卡、命中的世界书、近期对话、长期记忆和关系状态,避免把全部历史无差别塞入模型。
模型网关
服务端读取已加密的 API 凭证,代理模型列表、流式对话和 TTS 请求,并兼容不同模型的返回格式。
本地与云端存储
IndexedDB 承担本机读写,Neon 或 D1 保存账号数据,Vercel Blob 或 R2 保存图片;导出与恢复提供迁移能力。
后台触达
Service Worker 保存浏览器订阅,定时任务触发 Web Push。用户点击通知后回到 Angel,再由角色结合最近对话判断是否联系。
从第一次认识,到一次完整见面。
我用一条连续体验验证系统,而不是分别验收孤立功能。
创建角色
导入或新建角色卡,确定身份、经历、性格和表达方式。
建立关系
文字、图片、语音、通话和朋友圈逐步形成共同经历。
沉淀记忆
关键事件进入长期记忆,关系变化作为候选状态等待确认。
进入线下
邀约同步到见面模式,结束后生成记录并写回后续聊天。
核心模块如何共同工作。
功能并非简单并列,每个模块都会读取或写回角色状态。
聊天与多媒体
允许用户连续发送内容,再单独请求角色回复,保留真实聊天节奏。
- 输入形式
- 文字、图片、语音和通话
- 回复控制
- 流式输出、温度、长度和留白
角色与世界书
角色卡确定稳定身份,世界书按关键词、作用域和优先级加载补充规则。
- 兼容能力
- SillyTavern JSON 与 PNG 卡片
- 触发方式
- 始终、关键词和二级关键词
关系与长期记忆
系统从互动中生成记忆和关系候选,经确认后写入长期状态。
- 降低误写
- 候选内容可编辑、确认或跳过
- 重新调用
- 聊天和见面读取相关记忆
跨场景内容
论坛、微博、朋友圈和外卖等内容使用相同角色资料与当前模型生成。
- 一致性
- 共享人物关系和现实时间
- 成本控制
- 由用户主动触发内容刷新
沉浸感之外,也要对真实数据负责。
Angel 保存长期对话、人物资料和用户自己的 API 凭证。安全与可靠性不是附加功能。
- 账号隔离
- 聊天、角色、世界书、图片与设置按用户空间隔离。
- 凭证保护
- API Key 由服务端加密保存,前端不再返回原始值。
- 失败透明
- 请求失败直接展示真实错误,不生成本地假回复。
- 数据可迁移
- 支持云端同步、完整导出、恢复与多窗口冲突控制。
- 开放模型接口
- 兼容 OpenAI 风格的模型列表、流式聊天与 TTS。
- 持续触达
- 使用 Service Worker、Web Push 与定时任务发送提醒。
三个影响体验的关键决策。
这些决定不显眼,但它们直接影响用户是否信任角色和系统。
发送消息与请求回复分开
用户可以连续发送多条消息,再主动让 AI 回复。对话节奏由用户掌控,也减少不必要的模型调用。
记忆先生成候选,再由用户确认
系统不把所有内容都写成长期事实,避免模型误判污染人物关系。
失败时不制造假成功
接口、存储或推送失败时直接展示真实原因,已经生成的文字与用户数据不会被静默覆盖。




我学到的不是如何多做几个页面。
复杂产品真正困难的是让每个功能共享规则,同时让失败尽早暴露。下一步重点是补充自动化测试、演示数据与可观测性。