统一对话与联络
- 一套对话体验:与同事单聊、与智能体单聊、工作区群聊,共用会话列表、气泡时间线、附件与未读。
来源 docs/core-mechanisms/统一对话与联络.md
状态:产品决策已确认(2026-05-23),待实现。
真值:用户可见能力以
docs/产品规格.md§4.6 为准;本文供设计与实现对照。表述:界面与帮助文案用用户表达;表名、路径等仅在本文给出。
1. 目标
- 一套对话体验:与同事单聊、与智能体单聊、工作区群聊,共用会话列表、气泡时间线、附件与未读。
- 智能体即一种「对话成员」:可单聊、可入群;拥有者可把智能体上架 公开市场 供他人 租用。
- 真人规则分场景:同工作区同事信任畅聊;非同事陌生人「一条 → 回复后短期 → 长期需好友」。
与现有 /api/v1/chat + chat_sessions(用户 ↔ LLM、帮助智能体)的关系:中期 收敛到统一对话模型;智能体回复仍经 Cadau Runtime,但会话成员、群、租用鉴权走新域(下文 im_* 示意名)。
人工客服(docs/core-mechanisms/人工客服.md):用户转人工后,客服接单创建的 用户↔客服 单聊走 im_* 联络;与智能体 LLM 对话、服务通知分轨。
2. 已确认产品决策(摘要)
| # | 主题 | 结论 |
|---|---|---|
| 1 | 架构 | 统一对话;智能体与真人并列;租用智能体可进群 |
| 1a | 展示 | 以智能体身份为主;出租方与租用方均可 备注名 |
| 1b | 授权 | 首期 公开市场(浏览、申请/付费租用) |
| 1c | 配额 | 按 租用合同/套餐 约定计费主体 |
| 1d | 进群 | 租用方可在有权限的群里加入已租用智能体 |
| 2 | 同事单聊 | 同工作区成员 信任,直接畅聊 |
| 3 | 非同事单聊 | 未回复前 1 条 → 回复后 短期(天数/条数实现定)→ 长期须好友 |
| 4 | 工作区群 | 默认全员群 + 自建子群;成员与工作区同步(全员群) |
3. 会话与成员(实现模型)
3.1 会话类型 conversation.type
| 类型 | 说明 | |
|---|---|---|
direct | 两人(或「人 ↔ 智能体」)单聊 | |
workspace_group | 工作区群;subtype: all_member \ | custom |
3.2 成员 conversation_member.member_kind
| kind | 标识 | 说明 |
|---|---|---|
user | user_id | 真人 |
agent | user_agent_id | 用户智能体;关联 owner_user_id |
群消息来自智能体时:sender_kind=agent,并记录 operated_by_user_id(触发租用的真人,若有)。
3.3 与「运行时 Workspace」区分
- 产品 工作区
workspace_id:协作边界、全员群归属。 - 运行时 Workspace(
SOUL.md等):仍属 单个user_agent_id实例;租用对话时 Runtime 上下文须绑定 租用者 + 工作区(若群在工作区内)+ 租用合同策略。
4. 智能体租用(公开市场)
4.1 实体(示意)
agent_listings:上架信息(描述、技能标签、价格/套餐引用、可见性)。agent_leases:租用订单;状态pending | active | expired | revoked;含 计费条款(消耗算出租方 / 租用方 / 工作区)。agent_display_aliases:(viewer_user_id, user_agent_id) -> display_name;出租方、租用方各可设备注名(展示优先备注,可查看原名)。
4.2 鉴权
- 发消息给租用智能体:校验
agent_leases.active且lessee_user_id = 当前用户(或合同允许的操作者)。 - 拉智能体入群:校验 群资格 + 租用权(决策 A)。
4.3 计费
- 按
lease.billing_policy(合同)在对话扣费时选择扣减 出租方配额 / 租用方配额 / 工作区配额。 - 管理端可审计:会话 id、消息 id、token 用量、lease id。
5. 真人消息规则
账号级能力:加好友、真人单聊 不要求 已加入工作区;仅工作区群、同事信任规则依赖 workspace_members。
| 关系 | 规则 |
|---|---|
| 互为好友 | 畅聊 |
| 同工作区成员(至少一个共同工作区) | 畅聊(信任) |
| 非同事、非好友 | 首条仅 1 条 → 对方回复后进入 短期窗口 → 过期后须 好友 才能继续 |
| 拉黑 | 单向拒绝收发 |
实现字段(单聊 direct):stranger_phase: none | locked | short_term | friend;short_term_expires_at;由服务端在 POST message 前强制校验。
智能体对话:不适用陌生人条数限制;仅校验 所有权或租用权。
6. 工作区群
- 全员群:创建工作区时自动创建;成员 加入/退出工作区 时同步入群/退群。
- 子群:成员或管理员创建;成员邀请策略可分阶段(首期:群管理员拉人)。
- 群内可有 真人 + 已授权/租用的智能体;@ 智能体或触发策略后由 Runtime 生成回复(异步任务,写入
im_messages)。
7. API 草案(前缀 /api/v1/im/)
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /im/conversations | 当前用户会话列表(含未读) |
| POST | /im/conversations/direct | 发起单聊 { peer_user_id } 或 { user_agent_id } |
| GET | /im/conversations/{id}/messages | 历史分页 |
| POST | /im/conversations/{id}/messages | 发消息(幂等 client_message_id) |
| POST | /im/conversations/{id}/read | 已读水位 |
| GET/POST | /im/friend-requests … | 好友申请 |
| GET | /im/friends | 好友列表 |
| POST | /im/blocks | 拉黑 |
| GET | /im/agent-listings | 公开市场列表 |
| POST | /im/agent-leases | 租用/申请 |
| PATCH | /im/agent-aliases | 备注名 |
| GET | /workspaces/{id}/conversations | 工作区相关群(含默认全员群 id) |
| POST | /workspaces/{id}/groups | 创建子群 |
错误码示例:stranger_quota_exceeded、lease_required、not_group_member、peer_blocked。
实时:首期 轮询 GET /im/sync?since=;二期 WebSocket。
8. 客户端
- 现有顶栏 「消息」 演进为 统一对话入口(会话列表含人、智能体、群);与智能体对话不再使用独立 IA 仅
chat_sessions列表 的交互范式(迁移期可双轨)。 - B 区(若保留):展示 当前会话成员(含租用智能体备注名),而非仅「智能体市场」列表。
- 工作区协作 成员行:「发消息」「租用 Ta 的智能体」跳转统一对话或市场。
9. 分阶段实施建议
| 阶段 | 内容 |
|---|---|
| P0 | 表结构 + 单聊(人↔人规则 + 人↔己有智能体)+ 好友 |
| P1 | 默认全员群 + 子群 + 群内消息 |
| P2 | 市场上架 + 租用 + 双端备注 + 计费条款 |
| P3 | 租用智能体进群 + 群内 Runtime 回复 |
| P4 | 迁移旧 chat 会话、WS 推送、移动端 |
10. 相关文档
docs/产品规格.md§4.6docs/界面与布局.md(统一对话后需修订「消息」区描述)docs/产品规格.md§3.6 / §7.4(智能体市场与训练)