diff --git a/FEATURES.md b/FEATURES.md new file mode 100644 index 0000000..e1c39a2 --- /dev/null +++ b/FEATURES.md @@ -0,0 +1,156 @@ +# Hermes Live Show — 功能清单 + +## 一、剧本管理 + +| 功能 | 说明 | +|------|------| +| 自然语言剧本导入 | 粘贴文本,由 AI 自动解析为结构化数据(角色、线索、阶段) | +| JSON 剧本导入 | 精确导入 JSON 格式的剧本 | +| 剧本解析预览 | 上传后在确认导入前预览解析结果 | +| 剧本列表 | 查看所有已导入剧本,显示角色数量、创建时间 | +| 剧本选中 | 选择当前使用的剧本(高亮标记) | +| 剧本删除 | 删除不需要的剧本 | +| 解析降级兜底 | AI 解析失败时,用正则 fallback 提取角色名 | + +--- + +## 二、AI 角色系统 + +| 功能 | 说明 | +|------|------| +| 自动角色生成 | 根据剧本中的角色名批量创建角色 | +| 随机凶手分配 | 自动随机指定 1 个 KILLER,其余为 SUSPECT | +| SOUL 人格配置 | 每个角色生成 `SOUL.md`(性格、说话风格、秘密、动机等) | +| Hermes Profile 管理 | 为每个角色创建独立的 AI persona(文件系统存储) | +| 角色 SOUL 编辑 | 手动更新角色的 SOUL 内容和知识库 | +| 角色状态管理 | 支持 ALIVE / DEAD / INACTIVE 三种状态切换 | +| 角色删除 | 删除角色及其 Hermes profile | +| 手动触发角色发言 | 输入提示词让指定角色即时回应 | + +--- + +## 三、8 阶段游戏流程 + +``` +intro → round1_speak → round1_search → round2_speak → round2_search → final_discuss → voting → reveal +``` + +| 阶段 | 说明 | +|------|------| +| intro | 开场介绍 | +| round1_speak | 第一轮发言 | +| round1_search | 第一轮搜证 | +| round2_speak | 第二轮发言 | +| round2_search | 第二轮搜证 | +| final_discuss | 最终讨论 | +| voting | 投票环节 | +| reveal | 揭晓真凶 | + +- 前进 / 后退阶段 +- 进度条百分比实时显示 + +--- + +## 四、AI 自动对话 + +| 功能 | 说明 | +|------|------| +| 自动轮流发言 | AI 角色按顺序依次发言,每人 2-4 句中文 | +| 上下文感知 | 基于最近 20 条消息构建上下文 | +| 可配置间隔 | 发言间隔默认 8 秒,可自定义 | +| 可配置轮数 | 支持多轮自动发言 | +| 随时启停 | 主播可随时开始/停止自动对话 | +| 自动投票 | 触发后所有 AI 角色根据讨论摘要投票选出凶手 | +| 投票 JSON 输出 | 每个角色返回 `{"target": "角色名", "reason": "理由"}` | +| 投票容错 | 解析失败时随机投给他人 | + +--- + +## 五、主播控制台(ControlView) + +| 功能 | 说明 | +|------|------| +| 阶段控制器 | 按钮式阶段切换、开始/暂停/恢复/重置游戏 | +| 手动注入消息 | 选择角色 → 输入提示词 → AI 即时回应 | +| 进度条 | 游戏进度可视化 | +| 角色列表面板 | 点击角色弹出详情弹窗(RoleModal) | +| 线索面板 | 查看所有线索及解锁状态 | +| 一键生成 Profiles | 为所有角色创建 AI 人格 | +| Socket 连接状态 | WebSocket 连接状态指示(绿点/红点) | +| 导航 | 可跳转到观众视角和剧本管理 | + +--- + +## 六、观众视角(LiveView) + +| 功能 | 说明 | +|------|------| +| 实时聊天日志 | 查看所有角色的实时发言 | +| LIVE 标识 | 游戏进行中有脉冲动画 LIVE 标识 | +| 阶段显示 | 当前阶段的中文标签(如"💬 第一轮发言") | +| 登场角色列表 | 侧边栏展示角色名及首字母头像 | +| 已死亡角色灰显 | DEAD 状态角色降低透明度 | +| 已解锁线索 | 实时展示已解锁的线索 | +| 待解锁线索计数 | 提示剩余未解锁线索数量 | +| 进度条 | 游戏整体进度 | + +--- + +## 七、线索系统 + +| 功能 | 说明 | +|------|------| +| 5 种线索类型 | PHYSICAL(物证)、TESTIMONY(证词)、MOTIVE(动机)、ALIBI(不在场证明)、FORENSIC(法医) | +| 线索归属 | 可指定线索属于某个角色 | +| 按阶段分配 | 线索绑定到 round1_search 或 round2_search | +| 3 种可见性 | ALL(全员可见)、SPECIFIC(指定角色可见)、HIDDEN(隐藏) | +| 线索解锁 | 通过 Socket 实时解锁并广播 | +| 解锁记录 | 记录谁、何时解锁了线索 | + +--- + +## 八、投票系统 + +| 功能 | 说明 | +|------|------| +| 手动投票 | API 创建投票记录 | +| AI 自动投票 | 所有 AI 角色自动投票(带理由) | +| 多轮投票 | 支持 round_number 区分轮次 | +| 投票实时广播 | Socket 广播 `vote_cast` 和 `voting_results` 事件 | +| 投票查询 | 按轮次查询投票结果 | + +--- + +## 九、实时通信(Socket.IO) + +| 事件 | 方向 | 用途 | +|------|------|------| +| `new_message` | S→C | 新消息广播 | +| `state_change` | S→C | 游戏阶段/进度变更 | +| `speaker_change` | S→C | 当前发言者变更 | +| `vote_cast` | S→C | 投票投出 | +| `voting_results` | S→C | 投票结果汇总 | +| `clue_unlocked` | S→C | 线索解锁通知 | +| `system` | S→C | 系统消息 | +| `send_message` | C→S | 发送消息 | +| `dm_command` | C→S | 主播命令(阶段切换/自动对话/触发投票) | +| `request_state` | C→S | 请求当前游戏状态 | + +--- + +## 十、AI 退化容错 + +| 场景 | 处理方式 | +|------|----------| +| Hermes 超时 / 连接失败 | 显示「AI引擎暂时不可用,请稍后再试」 | +| Profile 列表获取失败 | 回退到上次成功获取的列表 | +| JSON 解析失败 | 自动 fallback 到正则解析 | +| 投票目标无效 | 随机选择他人投票 | + +--- + +## 十一、部署 + +- Docker Compose 一键启动 4 个服务(Postgres + Hermes + Backend + Frontend) +- 开发环境热重载(volume 挂载) +- 健康检查(Postgres pg_isready / Hermes /models 端点)