Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fcbd728457 |
@@ -24,9 +24,7 @@
|
||||
| ----- | ------------------------------------------- |
|
||||
| 后端 | Python Django + Django REST Framework |
|
||||
| ORM | Django ORM + Django Migrations |
|
||||
| 数据库 | PostgreSQL 18.x,作为唯一数据源;业务表、AI 对话记忆、上下文快照和日志都落同一套 PostgreSQL |
|
||||
| AI 对话记忆 | PostgreSQL 表 + `jsonb`,用于老板秘书会话、对话消息、BotContext 快照、模型请求/响应和 Agent 决策快照;AI 记忆表不能替代正式业务表 |
|
||||
| Agent 编排 | 第一版不引入 LangChain / LangGraph,先用 Django service 层实现轻量 `AiSecretaryAgent` |
|
||||
| 数据库 | MySQL 8,使用平台自有应用库 |
|
||||
| 定时任务 | Django management command + 独立 scheduler 进程 |
|
||||
| 后台管理 | Django Admin |
|
||||
| AI 接入 | 阿里百炼 API,后端封装薄 `ai_client` |
|
||||
@@ -49,19 +47,6 @@
|
||||
|
||||
1. `docs/contracts/数据对象约定.md`
|
||||
|
||||
涉及老板 AI 秘书、Agent、意图识别、上下文和草稿生成时先读:
|
||||
|
||||
1. `docs/specs/01_老板AI秘书与AI草稿.md`
|
||||
2. `docs/contracts/数据对象约定.md`
|
||||
3. `docs/contracts/API接口约定.md`
|
||||
|
||||
涉及 AI 对话记忆、上下文恢复、多账号会话或 PostgreSQL `jsonb` 上下文表时再读:
|
||||
|
||||
1. `docs/specs/01_老板AI秘书与AI草稿.md`
|
||||
2. `docs/contracts/数据对象约定.md`
|
||||
|
||||
只处理任务、提醒、通知等业务状态时,以 PostgreSQL 正式业务表为准,不要把 AI 记忆表当业务事实源。
|
||||
|
||||
涉及状态流转时再读:
|
||||
|
||||
1. `docs/contracts/状态流转约定.md`
|
||||
@@ -87,12 +72,6 @@
|
||||
|
||||
如果 spec 和 contract 冲突,以 contract 为准,并提出文档修正建议。
|
||||
|
||||
PostgreSQL 是唯一事实源,保存用户、人员映射、AI 草稿、任务、提醒、通知、反馈、失败记录、操作日志、AI 对话消息和 BotContext 快照。
|
||||
|
||||
AI 对话记忆也保存在 PostgreSQL 中,第一阶段使用 `secretary_conversations`、`secretary_messages`、`bot_contexts` 等表;`bot_context_snapshot`、`extracted_facts`、模型请求/响应摘要等结构化弹性字段使用 `jsonb`。
|
||||
|
||||
PostgreSQL 中的 AI 记忆表只能辅助 AI 理解、追问、恢复会话和生成草稿,不能直接作为创建任务、提醒或通知的最终依据。
|
||||
|
||||
## 生成代码禁止事项
|
||||
|
||||
1. 不允许 AI 未经人工确认直接创建事项、提醒或发送通知。
|
||||
@@ -102,9 +81,6 @@ PostgreSQL 中的 AI 记忆表只能辅助 AI 理解、追问、恢复会话和
|
||||
5. 不允许把 API Key、App Secret、飞书 token、完整手机号、完整邮箱写进代码或普通日志。
|
||||
6. 不允许把老板解释中的游戏化表达写进事项标题、接收人、时间、反馈要求等结构化字段。
|
||||
7. 不允许把第一版明确不做的功能混入主线。
|
||||
8. 不允许只写 AI 记忆表就认为任务、提醒或通知已经创建成功。
|
||||
9. 不允许 AI 根据 PostgreSQL AI 记忆表绕过正式业务表中的权限、草稿确认和业务状态校验。
|
||||
10. 不允许把老板 AI 秘书写成普通聊天接口;必须经过 `AiSecretaryAgent` 的意图识别、上下文读取、JSON 校验、草稿/追问/降级流程。
|
||||
|
||||
## AI 写代码推荐流程
|
||||
|
||||
|
||||
+5
-6
@@ -21,22 +21,22 @@
|
||||
| Web 框架 | `Django==5.2.15` |
|
||||
| API 框架 | `djangorestframework==3.17.1` |
|
||||
| ORM / Migration | Django ORM + Django Migrations,跟随 `Django==5.2.15` |
|
||||
| 数据库 | PostgreSQL `18.x`,作为唯一数据源;业务表、AI 对话记忆、上下文快照和日志都落同一套 PostgreSQL |
|
||||
| PostgreSQL 驱动 | `psycopg[binary]`,具体 patch 版本以 `requirements.txt` 锁定为准 |
|
||||
| 数据库 | MySQL `8.4.10` LTS,使用平台自有应用库 |
|
||||
| MySQL 驱动 | `mysqlclient==2.2.8` |
|
||||
| 定时任务 | `APScheduler==3.11.2` + `django-apscheduler==0.7.0`,通过独立 management command 进程运行 |
|
||||
| AI 接入 | `dashscope==1.25.23`;百炼管理类 OpenAPI 可选 `alibabacloud-bailian20231229==2.13.1` |
|
||||
| 飞书接入 | `lark-oapi==1.6.8` |
|
||||
| 登录态 / 加解密 | `PyJWT==2.13.0` + `cryptography==49.0.0` |
|
||||
| HTTP / 配置 | `requests==2.34.2`、`httpx==0.28.1`、`python-dotenv==1.2.2` |
|
||||
| WSGI | `gunicorn==26.0.0` |
|
||||
| Docker 基础镜像 | `python:3.12.13-slim-bookworm`、`postgres:18`、`nginx:stable-alpine` |
|
||||
| Docker 基础镜像 | `python:3.12.13-slim-bookworm`、`mysql:8.4.10`、`nginx:stable-alpine` |
|
||||
|
||||
Python 依赖基线:
|
||||
|
||||
```txt
|
||||
Django==5.2.15
|
||||
djangorestframework==3.17.1
|
||||
psycopg[binary]
|
||||
mysqlclient==2.2.8
|
||||
asgiref==3.11.1
|
||||
sqlparse==0.5.5
|
||||
tzdata==2026.2
|
||||
@@ -59,7 +59,7 @@ gunicorn==26.0.0
|
||||
| --- | --- |
|
||||
| `accounts` | 自定义用户、角色、登录态、飞书身份绑定 |
|
||||
| `people` | 人员映射、称呼匹配、第一批试用人员 |
|
||||
| `drafts` | `AiSecretaryAgent`、AI 草稿、补充/重说、BotContext、对话消息和草稿状态流转 |
|
||||
| `drafts` | AI 草稿、补充/重说、草稿状态流转 |
|
||||
| `tasks` | 事项创建、程经理确认、事项状态流转 |
|
||||
| `reminders` | 定时提醒、固定周期、触发记录 |
|
||||
| `notifications` | 飞书通知、通知补发、通知状态 |
|
||||
@@ -96,7 +96,6 @@ views
|
||||
3. `notifications` 通过 `feishu` client 发送消息。
|
||||
4. `feishu` 回调通过 service 更新 `drafts`、`feedbacks`、`tasks`、`reminders`。
|
||||
5. 所有模块写入 `audit`。
|
||||
6. `drafts` 中的 AI 对话记忆只辅助理解和草稿修订,不替代 `tasks`、`reminders`、`notifications` 等正式业务表。
|
||||
|
||||
避免:
|
||||
|
||||
|
||||
@@ -20,8 +20,7 @@
|
||||
| ----- | ------------------------------------------- |
|
||||
| 后端 | Python Django + Django REST Framework |
|
||||
| ORM | Django ORM + Django Migrations |
|
||||
| 数据库 | PostgreSQL 18.x,作为唯一数据源;业务表、AI 对话记忆、上下文快照和日志都落同一套 PostgreSQL |
|
||||
| AI 对话记忆 | PostgreSQL 表 + `jsonb`,保存老板秘书会话、消息、BotContext 和模型调用快照 |
|
||||
| 数据库 | MySQL 8,使用平台自有应用库 |
|
||||
| 定时任务 | Django management command + 独立 scheduler 进程 |
|
||||
| 后台管理 | Django Admin |
|
||||
| AI 接入 | 阿里百炼 API,后端封装薄 `ai_client` |
|
||||
@@ -34,7 +33,6 @@
|
||||
2. Docker / 部署环境固定 Python `3.12.13`;本地开发允许 Python 3.11 或 3.12,提交前必须在 Python 3.12.13 上跑完整测试。
|
||||
3. 后端开发先采用 mock-first:单元测试和最小闭环测试不得访问真实百炼、真实飞书或公网回调。
|
||||
4. 定时提醒 scheduler 独立于 Gunicorn worker,同一环境同一应用库同时只能运行一个 scheduler 进程。
|
||||
5. 老板 AI 秘书统一走 `POST /api/secretary/handle-message`,AI 只生成草稿、追问或回复,不直接创建任务、提醒或通知。
|
||||
|
||||
## 文档入口
|
||||
|
||||
|
||||
+2
-3
@@ -27,7 +27,7 @@ AI 只负责整理、建议和生成草稿,不直接创建事项、不直接
|
||||
|
||||
## 核心模块
|
||||
|
||||
1. 老板 AI 秘书:一句话入口、`AiSecretaryAgent`、意图分类、AI 草稿、补充/重说、普通问答兜底、对话记忆和 BotContext。
|
||||
1. 老板 AI 秘书:一句话入口、意图分类、AI 草稿、补充/重说、普通问答兜底。
|
||||
2. 事项任务:承接确认后的事项、通知、反馈和状态查看。
|
||||
3. 定时提醒:承接一次性和固定周期提醒,到点通知并记录结果。
|
||||
4. 飞书集成:身份登录、老板机器人私聊、个人消息、交互卡片和回调。
|
||||
@@ -75,8 +75,7 @@ AI 解析失败 / 通知失败 / 回调失败 / 定时触发失败
|
||||
| --- | --- |
|
||||
| 后端 | Python Django + Django REST Framework |
|
||||
| ORM | Django ORM + Django Migrations |
|
||||
| 数据库 | PostgreSQL 18.x,作为唯一数据源 |
|
||||
| AI 对话记忆 | PostgreSQL 表 + `jsonb`,保存老板秘书会话、消息、BotContext 和模型调用快照 |
|
||||
| 数据库 | MySQL 8,使用平台自有应用库 |
|
||||
| 定时任务 | Django management command + 独立 scheduler 进程 |
|
||||
| 后台管理 | Django Admin |
|
||||
| AI 接入 | 阿里百炼 API,后端封装薄 `ai_client` |
|
||||
|
||||
+20
-21
@@ -4,29 +4,29 @@
|
||||
|
||||
## 当前迭代目标
|
||||
|
||||
按本地 `docs/specs/01_老板AI秘书与AI草稿.md` 的老板 AI 秘书方案,统一压缩包内后端协作文档、contract、active plan 和 checklist,让后续 AI 与开发者可以按同一套口径写 Django 后端代码。
|
||||
补齐后端协作文档和第一份 active plan,让后续 AI 与开发者可以按同一套 spec、contract、plan 和 checklist 写 Django 后端代码。
|
||||
|
||||
本轮不直接实现业务代码,因为当前仓库还没有 Django 项目骨架。文档重点是先统一 AI 秘书入口、PostgreSQL 数据源、AI 对话记忆、BotContext、稳定 JSON 输出、任务/提醒/通知边界和失败记录。
|
||||
本轮不直接实现业务代码,因为当前仓库还没有 Django 项目骨架,且原 `docs/specs`、`docs/contracts`、`docs/checklists` 和 `docs/plans/active` 基本为空。
|
||||
|
||||
可行性审查后,active plan 已补充 mock-first、Django 5.2 LTS、PostgreSQL 18.x、Task 1 可执行顺序、自定义用户模型首次迁移前设置、AI 对话记忆、周期提醒状态和 scheduler 单实例约束。
|
||||
可行性审查后,active plan 已补充 mock-first、Django 5.2 LTS、Task 1 可执行顺序、自定义用户模型首次迁移前设置、周期提醒状态和 scheduler 单实例约束。
|
||||
|
||||
## 本周任务
|
||||
|
||||
| 事项 | 负责人 | 状态 |
|
||||
| --- | --- | --- |
|
||||
| 补齐 `README.md` 项目说明 | 泽源 | 进行中 |
|
||||
| 补齐 `docs/00_项目总览.md` | 王一多 / 泽源协作 | 进行中 |
|
||||
| 补齐 `docs/specs/01_老板AI秘书与AI草稿.md` | 王一多 / 泽源 / 焕然 | 进行中 |
|
||||
| 补齐 `docs/specs/02_事项任务.md` | 乔大卫 / 泽源 | 进行中 |
|
||||
| 补齐 `docs/specs/03_飞书通知与反馈.md` | 田宇 | 进行中 |
|
||||
| 补齐 `docs/specs/04_定时提醒.md` | 田宇 / 乔大卫 | 进行中 |
|
||||
| 补齐 `docs/specs/05_权限日志失败记录.md` | 乔大卫 | 进行中 |
|
||||
| 补齐 `docs/contracts/API接口约定.md` | 田宇 / 泽源 | 进行中 |
|
||||
| 补齐 `docs/contracts/数据对象约定.md` | 乔大卫 / 泽源 | 进行中 |
|
||||
| 补齐 `docs/contracts/状态流转约定.md` | 乔大卫 | 进行中 |
|
||||
| 补齐 `docs/checklists/AI生成代码检查清单.md` | 泽源 | 进行中 |
|
||||
| 补齐 `docs/checklists/后端Review清单.md` | 乔大卫 / 田宇 | 进行中 |
|
||||
| 补齐第一份 active plan | 泽源 / 焕然 | 进行中 |
|
||||
| 事项 | 负责人 | 状态 |
|
||||
| ---------------------------------- | ------------- | --- |
|
||||
| 补齐 `README.md` 项目说明 | 泽源 | 进行中 |
|
||||
| 补齐 `docs/00_项目总览.md` | 王一多 / 泽源协作 | 进行中 |
|
||||
| 补齐 `docs/specs/01_老板AI秘书与AI草稿.md` | 王一多 / 泽源 / 焕然 | 进行中 |
|
||||
| 补齐 `docs/specs/02_事项任务.md` | 乔大卫 / 泽源 | 进行中 |
|
||||
| 补齐 `docs/specs/03_飞书通知与反馈.md` | 田宇 | 进行中 |
|
||||
| 补齐 `docs/specs/04_定时提醒.md` | 田宇 / 乔大卫 | 进行中 |
|
||||
| 补齐 `docs/specs/05_权限日志失败记录.md` | 乔大卫 | 进行中 |
|
||||
| 补齐 `docs/contracts/API接口约定.md` | 田宇 / 泽源 | 进行中 |
|
||||
| 补齐 `docs/contracts/数据对象约定.md` | 乔大卫 / 泽源 | 进行中 |
|
||||
| 补齐 `docs/contracts/状态流转约定.md` | 乔大卫 | 进行中 |
|
||||
| 补齐 `docs/checklists/AI生成代码检查清单.md` | 泽源 | 进行中 |
|
||||
| 补齐 `docs/checklists/后端Review清单.md` | 乔大卫 / 田宇 | 进行中 |
|
||||
| 补齐第一份 active plan | 泽源 / 焕然 | 进行中 |
|
||||
|
||||
## 当前卡点
|
||||
|
||||
@@ -34,8 +34,7 @@
|
||||
2. 飞书正式应用配置、回调地址、个人消息权限和第一批试用人员映射还需要联调确认。
|
||||
3. 阿里百炼 API Key、飞书 App Secret 等密钥不能写入仓库,需要后续通过环境变量配置。
|
||||
4. 第一批试用人员姓名、常见称呼、手机号或邮箱映射需要后续维护。
|
||||
5. PostgreSQL 连接、迁移和 `jsonb` 字段使用方式需要在项目骨架创建后验证。
|
||||
6. 本地当前 Python 可能不是部署基线;提交前需要在 Python 3.12.13 环境跑完整测试。
|
||||
5. 本地当前 Python 可能不是部署基线;提交前需要在 Python 3.12.13 环境跑完整测试。
|
||||
|
||||
## 待确认问题
|
||||
|
||||
@@ -48,6 +47,6 @@
|
||||
## 下一步
|
||||
|
||||
1. 完成本轮文档补齐。
|
||||
2. 由泽源按修订后的 active plan 创建 Django 项目骨架、基础 app、PostgreSQL 模型和迁移。
|
||||
2. 由泽源按修订后的 active plan 创建 Django 项目骨架、基础 app、模型和迁移。
|
||||
3. 先用 mock 百炼和 mock 飞书跑通后端最小闭环测试。
|
||||
4. 优先跑通 AI 草稿、人工确认、事项创建、飞书通知和反馈记录这条最小链路。
|
||||
|
||||
@@ -9,7 +9,6 @@ AI 生成或修改后端代码前后都要检查本清单。checklists 是 Revie
|
||||
- [ ] 已读当前 active plan。
|
||||
- [ ] 涉及接口时已读 `docs/contracts/API接口约定.md`。
|
||||
- [ ] 涉及字段或数据库时已读 `docs/contracts/数据对象约定.md`。
|
||||
- [ ] 涉及老板 AI 秘书、Agent、BotContext 或对话记忆时已读 `docs/specs/01_老板AI秘书与AI草稿.md`。
|
||||
- [ ] 涉及状态流转时已读 `docs/contracts/状态流转约定.md`。
|
||||
- [ ] 涉及飞书时已读 `docs/specs/03_飞书通知与反馈.md`。
|
||||
|
||||
@@ -32,13 +31,9 @@ AI 生成或修改后端代码前后都要检查本清单。checklists 是 Revie
|
||||
## 4. AI 草稿
|
||||
|
||||
- [ ] AI 只生成草稿,不直接创建事项、提醒或通知。
|
||||
- [ ] 老板消息统一走 `POST /api/secretary/handle-message`。
|
||||
- [ ] `source + message_id` 幂等,不重复调用模型、不重复创建草稿、不重复写 `secretary_messages`。
|
||||
- [ ] AI 输出 JSON 已做结构校验。
|
||||
- [ ] `qa/realtime_qa/note/need_more_info/unsupported` 不创建事项、提醒或通知。
|
||||
- [ ] `qa` 和 `realtime_qa` 不创建事项、提醒或通知。
|
||||
- [ ] 实时问答第一版只做暂不支持提示,不做交易判断。
|
||||
- [ ] `need_more_info` 最多 3 个问题、最多 3 轮追问。
|
||||
- [ ] PostgreSQL AI 对话记忆只辅助理解和草稿修订,不替代任务、提醒、通知等正式业务表。
|
||||
- [ ] 结构化字段没有写入游戏化表达。
|
||||
- [ ] 模型调用记录了背景摘要、老板风格和业务规则版本。
|
||||
- [ ] AI 解析失败会写 `model_call_logs` 和 `failure_records`。
|
||||
|
||||
@@ -40,14 +40,10 @@
|
||||
## 5. AI
|
||||
|
||||
- [ ] AI 输出只进入草稿。
|
||||
- [ ] 老板消息统一走 `POST /api/secretary/handle-message`。
|
||||
- [ ] `source + message_id` 幂等覆盖模型调用、草稿创建和 `secretary_messages`。
|
||||
- [ ] 模型 JSON 有 validator。
|
||||
- [ ] `qa` / `realtime_qa` / `note` / `need_more_info` / `unsupported` 不创建事项或提醒。
|
||||
- [ ] `qa` / `realtime_qa` 不创建事项或提醒。
|
||||
- [ ] 实时问答不做交易判断。
|
||||
- [ ] PromptContext 版本被记录。
|
||||
- [ ] PostgreSQL AI 对话记忆只辅助理解和草稿修订,不替代正式业务表。
|
||||
- [ ] PostgreSQL AI 记忆读写失败会写 `memory_store_failed`,不继续依赖内存确认草稿。
|
||||
- [ ] prompt_contexts 版本被记录。
|
||||
- [ ] 游戏化表达没有进入结构化字段。
|
||||
|
||||
## 6. 定时提醒
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
- [ ] 飞书登录可以匹配到平台用户和角色。
|
||||
- [ ] 未匹配用户或停用用户不能进入平台,并有失败记录。
|
||||
- [ ] 老板可以通过飞书机器人私聊提交一句话。
|
||||
- [ ] 老板消息统一进入 `POST /api/secretary/handle-message`。
|
||||
- [ ] 非老板私聊机器人不会触发 AI,并有未授权访问记录。
|
||||
|
||||
## 2. AI 草稿
|
||||
@@ -16,10 +15,8 @@
|
||||
- [ ] AI 可以把老板一句话解析为结构化草稿。
|
||||
- [ ] AI 草稿可以展示原始输入、类型、内容、接收人候选、时间、反馈要求和缺失字段。
|
||||
- [ ] 草稿必须人工确认后才创建事项或提醒。
|
||||
- [ ] 普通聊天、普通记录、实时问答兜底不会创建草稿、事项或提醒。
|
||||
- [ ] 老板可以确认、补充/重说、取消草稿。
|
||||
- [ ] 补充/重说 30 分钟上下文可以生效并过期。
|
||||
- [ ] PostgreSQL 中可以查看 `secretary_messages` 和当前 `BotContext`。
|
||||
- [ ] 实时问答不会创建事项、提醒或通知。
|
||||
|
||||
## 3. 事项闭环
|
||||
@@ -56,7 +53,6 @@
|
||||
## 6. 失败复盘
|
||||
|
||||
- [ ] AI 解析失败有记录。
|
||||
- [ ] PostgreSQL AI 记忆读写失败有记录。
|
||||
- [ ] 人员映射缺失有记录。
|
||||
- [ ] 飞书登录失败有记录。
|
||||
- [ ] 飞书通知失败有记录。
|
||||
|
||||
@@ -67,13 +67,10 @@
|
||||
| `state_conflict` | 409 | 当前状态不允许该操作 |
|
||||
| `idempotency_conflict` | 409 | 幂等键冲突或重复请求 |
|
||||
| `ai_parse_failed` | 422 | AI 输出无法解析或不符合结构 |
|
||||
| `ai_model_failed` | 502 | 百炼或模型网关失败,重试后仍不可用 |
|
||||
| `missing_person_mapping` | 422 | 缺少人员映射 |
|
||||
| `memory_store_failed` | 500 | AI 对话记忆、消息或 BotContext 保存/读取失败 |
|
||||
| `draft_convert_failed` | 500 | 草稿确认后转换任务或提醒失败 |
|
||||
| `person_mapping_missing` | 422 | 缺少人员映射 |
|
||||
| `feishu_signature_invalid` | 401 | 飞书回调验签失败 |
|
||||
| `feishu_api_failed` | 502 | 飞书接口调用失败 |
|
||||
| `reminder_trigger_failed` | 500 | 定时提醒触发失败 |
|
||||
| `scheduler_trigger_failed` | 500 | 定时提醒触发失败 |
|
||||
| `internal_error` | 500 | 未分类服务端错误 |
|
||||
|
||||
## 4. 用户与人员映射
|
||||
@@ -102,7 +99,7 @@
|
||||
|
||||
| 方法 | 路径 | 作用 | 权限 |
|
||||
| --- | --- | --- | --- |
|
||||
| POST | `/api/secretary/handle-message` | 统一老板消息入口,返回草稿、追问、普通回复、上下文回顾或错误降级 | 老板;调试入口需管理员 token |
|
||||
| POST | `/api/ai-drafts/parse` | 提交一句话并生成草稿 | 老板;平台兜底可允许管理员测试 |
|
||||
| GET | `/api/ai-drafts` | 草稿列表 | 相关用户、程经理、管理员 |
|
||||
| GET | `/api/ai-drafts/{id}` | 草稿详情 | 相关用户、程经理、管理员 |
|
||||
| PATCH | `/api/ai-drafts/{id}` | 修改草稿字段 | 草稿发起人、待确认程经理 |
|
||||
@@ -111,42 +108,17 @@
|
||||
| POST | `/api/ai-drafts/{id}/convert` | 转换为事项或提醒 | 草稿发起人、待确认程经理 |
|
||||
| POST | `/api/ai-drafts/{id}/follow-up` | 根据补充/重说重新生成草稿 | 草稿发起人 |
|
||||
|
||||
`POST /api/secretary/handle-message` 请求示例:
|
||||
`POST /api/ai-drafts/parse` 请求示例:
|
||||
|
||||
```json
|
||||
{
|
||||
"source": "feishu",
|
||||
"message_id": "msg_xxx",
|
||||
"sender": {
|
||||
"open_id": "ou_xxx",
|
||||
"name": "老板",
|
||||
"role": "boss"
|
||||
},
|
||||
"text": "明天上午提醒东东给我订会议室",
|
||||
"context": {}
|
||||
"input_text": "明天上午提醒东东给我订会议室",
|
||||
"source": "platform",
|
||||
"client_context": {}
|
||||
}
|
||||
```
|
||||
|
||||
响应 `data` 建议包含:
|
||||
|
||||
- `intent`
|
||||
- `reply_type`
|
||||
- `answer`
|
||||
- `draft`
|
||||
- `questions`
|
||||
- `context_summary`
|
||||
- `failure`
|
||||
|
||||
`reply_type` 建议取值:
|
||||
|
||||
- `draft_preview`
|
||||
- `follow_up_question`
|
||||
- `plain_answer`
|
||||
- `context_summary`
|
||||
- `unsupported`
|
||||
- `error`
|
||||
|
||||
兼容接口 `/api/ai-drafts/parse`、`/api/demo/boss-message` 可以保留,但内部必须转发到 `/api/secretary/handle-message`。
|
||||
响应 `data` 必须包含 `draft_id`、`draft_type`、`status`、`summary`、`missing_fields` 和 `follow_up_questions`。
|
||||
|
||||
## 7. 事项
|
||||
|
||||
|
||||
+30
-71
@@ -76,66 +76,29 @@
|
||||
| `failure_reason` | 失败原因 |
|
||||
| `completed_at` | 完成时间 |
|
||||
|
||||
## 5. secretary_conversations
|
||||
|
||||
老板 AI 秘书会话。第一阶段只有一个老板秘书入口,可先固定 `conversation_id=boss_secretary_default`,但表结构要能支持后续多会话。
|
||||
|
||||
| 字段 | 说明 |
|
||||
| --- | --- |
|
||||
| `id` | 会话 ID |
|
||||
| `conversation_id` | 业务会话唯一标识 |
|
||||
| `boss_id` | 关联老板用户 |
|
||||
| `source` | `feishu`、`web`、`debug` |
|
||||
| `status` | `active`、`closed` |
|
||||
| `last_message_at` | 最近消息时间 |
|
||||
|
||||
## 6. secretary_messages
|
||||
|
||||
老板输入、AI 回复、AI 追问、普通记录和上下文回顾的统一消息记录。该表只追加,不修改,用于对话回放、上下文回顾和问题复盘。
|
||||
|
||||
| 字段 | 说明 |
|
||||
| --- | --- |
|
||||
| `id` | 消息 ID |
|
||||
| `conversation_id` | 关联 `secretary_conversations.conversation_id` |
|
||||
| `boss_id` | 关联老板用户 |
|
||||
| `source` | `feishu`、`web`、`debug` |
|
||||
| `message_id` | 外部消息 ID 或内部生成 ID,和 `source` 组成幂等键 |
|
||||
| `role` | `boss`、`assistant`、`system` |
|
||||
| `text` | 原始输入或 AI 回复 |
|
||||
| `answer` | AI 给老板的回复,可为空 |
|
||||
| `intent_type` | `task`、`reminder`、`qa`、`realtime_qa`、`note`、`need_more_info`、`unsupported`、`context_summary` |
|
||||
| `draft_id` | 关联 AI 草稿,可为空 |
|
||||
| `raw_payload` | 原始请求摘要,避免保存密钥 |
|
||||
| `bot_context_snapshot` | JSONB,消息发生时的上下文快照 |
|
||||
| `created_at` | 消息时间 |
|
||||
|
||||
## 7. bot_contexts
|
||||
## 5. bot_contexts
|
||||
|
||||
记录老板机器人私聊中的补充/重说上下文。
|
||||
|
||||
| 字段 | 说明 |
|
||||
| --- | --- |
|
||||
| `id` | 上下文 ID |
|
||||
| `conversation_id` | 当前老板秘书会话 ID |
|
||||
| `boss_id` | PostgreSQL 中的老板用户 ID |
|
||||
| `status` | `empty`、`awaiting_more_info`、`awaiting_confirm`、`expired`、`cleared` |
|
||||
| `pending_draft_id` | 当前待补充或待确认的草稿 ID |
|
||||
| `pending_draft_type` | `task`、`reminder`、`none` |
|
||||
| `last_intent` | 上一条有效意图 |
|
||||
| `expires_at` | 上下文有效期,进入待补充或待确认时重置为 30 分钟后 |
|
||||
| `follow_up_count` | 当前草稿累计追问轮次 |
|
||||
| `last_message_id` | 最近一次参与上下文判断的消息 ID |
|
||||
| `extracted_facts` | JSONB,从多轮对话提取的候选事实,只用于草稿修订 |
|
||||
| `updated_at` | 上下文最近更新时间 |
|
||||
| `user_id` | 平台用户 ID,第一版应为老板 |
|
||||
| `feishu_open_id` | 飞书发送人 open_id |
|
||||
| `current_draft_id` | 等待补充的草稿 ID |
|
||||
| `status` | `idle`、`awaiting_follow_up`、`expired`、`closed` |
|
||||
| `expires_at` | 补充/重说有效期,默认 30 分钟 |
|
||||
| `last_message_id` | 最近一条飞书消息 ID |
|
||||
| `last_message_text` | 最近一条消息内容 |
|
||||
|
||||
## 8. prompt_contexts
|
||||
## 6. prompt_contexts
|
||||
|
||||
维护 AI 秘书调用模型时加载的上下文版本。
|
||||
|
||||
| 字段 | 说明 |
|
||||
| --- | --- |
|
||||
| `id` | 上下文 ID |
|
||||
| `context_type` | `company_background_summary`、`boss_communication_style`、`ai_secretary_rules`、`role_and_alias_rules` |
|
||||
| `context_type` | `company_background`、`boss_style`、`business_rules` |
|
||||
| `version` | 版本号 |
|
||||
| `title` | 标题 |
|
||||
| `content` | 实际使用的摘要或规则文本 |
|
||||
@@ -145,7 +108,7 @@
|
||||
|
||||
模型调用日志只保存本次使用的摘要、版本号和必要规则,避免反复保存完整背景库全文。
|
||||
|
||||
## 9. ai_drafts
|
||||
## 7. ai_drafts
|
||||
|
||||
保存 AI 从一句话整理出的可确认草稿。
|
||||
|
||||
@@ -155,26 +118,22 @@
|
||||
| `source` | `platform`、`feishu_bot` |
|
||||
| `created_by` | 发起人 |
|
||||
| `raw_input` | 原始输入 |
|
||||
| `intent` | `task`、`reminder` |
|
||||
| `draft_type` | `task`、`reminder` |
|
||||
| `should_create_draft` | 固定为 true;`qa/realtime_qa/note/need_more_info/unsupported` 不落 ai_drafts |
|
||||
| `draft_type` | `task`、`reminder`、`qa`、`realtime_qa`、`note`、`unknown` |
|
||||
| `status` | 见状态流转约定 |
|
||||
| `title` | 草稿标题 |
|
||||
| `content` | 事项或提醒内容 |
|
||||
| `receiver_candidates` | JSON,接收人候选和置信度 |
|
||||
| `receiver_text` | 未映射成功时保留老板原始称呼 |
|
||||
| `scheduled_at` | 提醒时间,可为空;任务可使用 `schedule_text` 表达期望时间 |
|
||||
| `schedule_text` | 老板原始时间表达 |
|
||||
| `recurrence_type` | `none`、`daily`、`weekly`、`monthly` |
|
||||
| `scheduled_time` | 提醒或期望处理时间,可为空 |
|
||||
| `repeat_rule` | `none`、`daily`、`weekly`、`monthly` |
|
||||
| `requires_feedback` | 是否需要反馈 |
|
||||
| `route_type` | `direct_after_boss_confirm`、`manager_confirm_required` |
|
||||
| `need_manager_confirm` | 是否需要程经理确认 |
|
||||
| `route_type` | `direct_notify`、`manager_confirm`、`needs_clarification` |
|
||||
| `missing_fields` | JSON 数组 |
|
||||
| `questions` | JSON 数组,最多 3 个;确认草稿一般为空 |
|
||||
| `answer` | 给老板看的回复摘要;不得写“已通知、已创建、已发送”等执行语义 |
|
||||
| `follow_up_questions` | JSON 数组,最多 3 个 |
|
||||
| `answer` | `qa` / `realtime_qa` 的回答 |
|
||||
| `parent_draft_id` | 补充/重说生成的新草稿指向上一版 |
|
||||
| `model_call_log_id` | 关联模型调用日志 |
|
||||
|
||||
## 10. model_call_logs
|
||||
## 8. model_call_logs
|
||||
|
||||
记录模型输入输出、模型名、耗时和结果。
|
||||
|
||||
@@ -186,13 +145,13 @@
|
||||
| `prompt_context_snapshot` | 本次使用的上下文版本和摘要 |
|
||||
| `request_payload` | 请求摘要,避免保存密钥 |
|
||||
| `raw_response` | 模型原始响应 |
|
||||
| `parsed_json` | 解析后的 `AiSecretaryResponse` JSON |
|
||||
| `parsed_json` | 解析后的 JSON |
|
||||
| `status` | `success`、`failed` |
|
||||
| `failure_reason` | 失败原因 |
|
||||
| `latency_ms` | 耗时 |
|
||||
| `created_by` | 调用发起人 |
|
||||
|
||||
## 11. tasks
|
||||
## 9. tasks
|
||||
|
||||
需要接收人处理并反馈的事情。
|
||||
|
||||
@@ -214,7 +173,7 @@
|
||||
| `completed_at` | 完成时间 |
|
||||
| `problem_reason` | 有问题原因,可选 |
|
||||
|
||||
## 12. reminders
|
||||
## 10. reminders
|
||||
|
||||
未来某个时间触发的提醒。
|
||||
|
||||
@@ -228,14 +187,14 @@
|
||||
| `initiator_id` | 发起人 |
|
||||
| `receiver_id` | 接收人 |
|
||||
| `status` | 见状态流转约定 |
|
||||
| `scheduled_at` | 首次提醒时间 |
|
||||
| `remind_at` | 首次提醒时间 |
|
||||
| `next_trigger_at` | 下一次触发时间 |
|
||||
| `recurrence_type` | `none`、`daily`、`weekly`、`monthly` |
|
||||
| `repeat_rule` | `none`、`daily`、`weekly`、`monthly` |
|
||||
| `requires_feedback` | 是否需要反馈 |
|
||||
| `last_triggered_at` | 最近触发时间 |
|
||||
| `cancelled_at` | 取消时间 |
|
||||
|
||||
## 13. notifications
|
||||
## 11. notifications
|
||||
|
||||
飞书或平台内通知发送记录。
|
||||
|
||||
@@ -255,7 +214,7 @@
|
||||
| `sent_at` | 发送时间 |
|
||||
| `failure_reason` | 失败原因 |
|
||||
|
||||
## 14. feedbacks
|
||||
## 12. feedbacks
|
||||
|
||||
接收人的反馈状态和问题原因。
|
||||
|
||||
@@ -271,7 +230,7 @@
|
||||
| `notification_id` | 关联通知 |
|
||||
| `created_at` | 反馈时间 |
|
||||
|
||||
## 15. failure_records
|
||||
## 13. failure_records
|
||||
|
||||
AI、通知、回调、调度等失败原因。
|
||||
|
||||
@@ -289,7 +248,7 @@ AI、通知、回调、调度等失败原因。
|
||||
| `handled_at` | 处理时间 |
|
||||
| `handle_result` | 处理结果 |
|
||||
|
||||
## 16. operation_logs
|
||||
## 14. operation_logs
|
||||
|
||||
人工确认、修改、取消、补发等过程留痕。
|
||||
|
||||
@@ -306,7 +265,7 @@ AI、通知、回调、调度等失败原因。
|
||||
| `metadata` | JSON,避免敏感明文 |
|
||||
| `created_at` | 操作时间 |
|
||||
|
||||
## 17. feishu_events
|
||||
## 15. feishu_events
|
||||
|
||||
飞书回调原始事件和处理结果。
|
||||
|
||||
@@ -325,7 +284,7 @@ AI、通知、回调、调度等失败原因。
|
||||
| `process_result` | 处理结果 |
|
||||
| `created_at` | 接收时间 |
|
||||
|
||||
## 18. 敏感字段规则
|
||||
## 16. 敏感字段规则
|
||||
|
||||
1. `phone`、`email` 可入库,但普通日志和普通列表接口默认脱敏。
|
||||
2. API Key、App Secret、飞书 token 不得入库到业务表或普通日志。
|
||||
|
||||
+31
-32
@@ -14,31 +14,35 @@
|
||||
|
||||
| 状态 | 含义 |
|
||||
| --- | --- |
|
||||
| `PENDING_CONFIRM` | 草稿已整理完成,等待老板确认、修改、取消或转经理 |
|
||||
| `NEED_MANAGER_CONFIRM` | 老板已确认,但复杂任务需要程经理确认 |
|
||||
| `CONFIRMED` | 已人工确认,等待转换任务或提醒 |
|
||||
| `CONVERTED` | 已转换为事项或提醒 |
|
||||
| `CANCELLED` | 已取消 |
|
||||
| `FAILED` | AI 解析或草稿处理失败,仅用于调试追踪 |
|
||||
| `pending_confirmation` | 等待老板确认 |
|
||||
| `awaiting_follow_up` | 等待老板补充/重说 |
|
||||
| `pending_manager_confirm` | 等待程经理确认 |
|
||||
| `confirmed` | 已人工确认 |
|
||||
| `converted` | 已转换为事项或提醒 |
|
||||
| `cancelled` | 已取消 |
|
||||
| `parse_failed` | AI 输出解析失败 |
|
||||
| `expired` | 补充/重说上下文过期 |
|
||||
|
||||
允许流转:
|
||||
|
||||
```text
|
||||
PENDING_CONFIRM -> CONFIRMED
|
||||
PENDING_CONFIRM -> NEED_MANAGER_CONFIRM
|
||||
PENDING_CONFIRM -> CANCELLED
|
||||
PENDING_CONFIRM -> FAILED
|
||||
NEED_MANAGER_CONFIRM -> CONFIRMED
|
||||
CONFIRMED -> CONVERTED
|
||||
CONFIRMED -> FAILED
|
||||
pending_confirmation -> awaiting_follow_up
|
||||
pending_confirmation -> pending_manager_confirm
|
||||
pending_confirmation -> confirmed
|
||||
pending_confirmation -> cancelled
|
||||
pending_confirmation -> parse_failed
|
||||
awaiting_follow_up -> pending_confirmation
|
||||
awaiting_follow_up -> expired
|
||||
pending_manager_confirm -> confirmed
|
||||
pending_manager_confirm -> cancelled
|
||||
confirmed -> converted
|
||||
```
|
||||
|
||||
约束:
|
||||
|
||||
1. `FAILED`、`CANCELLED`、`CONVERTED` 为终态。
|
||||
2. 未进入 `CONFIRMED` 的草稿不得转换。
|
||||
3. `need_more_info`、`answered`、`context_summary` 是非草稿处理结果,不落 `ai_drafts.status`。
|
||||
4. 多次补充/重说优先合并到同一个 `pending_draft`,直到老板确认、取消、过期或明确新建,不要求每次补充都新建草稿。
|
||||
1. `parse_failed`、`cancelled`、`converted` 为终态。
|
||||
2. 未进入 `confirmed` 的草稿不得转换。
|
||||
3. 补充/重说生成的新草稿应写 `parent_draft_id`。
|
||||
|
||||
## 3. 事项状态
|
||||
|
||||
@@ -224,21 +228,17 @@ processing -> cancelled
|
||||
| 类型 | 含义 |
|
||||
| --- | --- |
|
||||
| `ai_parse_failed` | AI 输出解析失败 |
|
||||
| `ai_model_failed` | 百炼或模型网关超时、网络失败、服务异常,重试后仍失败 |
|
||||
| `bot_message_failed` | 入口消息结构缺失、无法解析文本或 sender 信息 |
|
||||
| `missing_person_mapping` | 缺少人员映射 |
|
||||
| `memory_store_failed` | PostgreSQL AI 记忆表、上下文或快照保存/读取失败 |
|
||||
| `draft_convert_failed` | 老板或程经理确认后,转换任务/提醒失败 |
|
||||
| `person_mapping_missing` | 缺少人员映射 |
|
||||
| `feishu_auth_failed` | 飞书登录失败 |
|
||||
| `feishu_send_failed` | 飞书通知失败 |
|
||||
| `feishu_notify_failed` | 飞书通知失败 |
|
||||
| `feishu_callback_failed` | 飞书回调处理失败 |
|
||||
| `feishu_signature_invalid` | 飞书验签失败 |
|
||||
| `reminder_trigger_failed` | 定时提醒触发失败 |
|
||||
| `bot_unauthorized` | 非老板使用机器人入口 |
|
||||
| `follow_up_expired` | 补充/重说上下文过期 |
|
||||
| `scheduler_trigger_failed` | 定时提醒触发失败 |
|
||||
| `unauthorized_bot_access` | 非老板使用机器人入口 |
|
||||
| `bot_context_expired` | 补充/重说上下文过期 |
|
||||
| `user_feedback_problem` | 用户反馈有问题 |
|
||||
| `permission_error` | 权限拒绝 |
|
||||
| `system_error` | 未归类系统异常 |
|
||||
| `permission_denied` | 权限拒绝 |
|
||||
| `other` | 其他 |
|
||||
|
||||
## 11. 飞书事件处理状态
|
||||
|
||||
@@ -292,8 +292,7 @@ Prompt 上下文状态:
|
||||
|
||||
| 状态 | 含义 |
|
||||
| --- | --- |
|
||||
| `empty` | 当前没有可补充或可确认的草稿 |
|
||||
| `awaiting_more_info` | AI 已追问,等待老板补充 |
|
||||
| `awaiting_confirm` | 草稿已整理完成,等待老板确认、修改、取消或转经理 |
|
||||
| `idle` | 空闲 |
|
||||
| `awaiting_follow_up` | 等待补充/重说 |
|
||||
| `expired` | 已过期 |
|
||||
| `cleared` | 草稿已确认、取消或转换完成,上下文已清空 |
|
||||
| `closed` | 已关闭 |
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
**Architecture:** 使用 Django 模块化单体。DRF view 负责请求入口,serializer 负责入参出参校验,service 负责权限、状态流转、事务和幂等,client 负责阿里百炼和飞书外部调用,audit 负责操作日志和失败记录。
|
||||
|
||||
**Tech Stack:** 部署 Python 3.12.13、本地开发 Python 3.11/3.12、Django 5.2 LTS、Django REST Framework、Django ORM、PostgreSQL 18.x、Django management command scheduler、阿里百炼 API、飞书开放平台。
|
||||
**Tech Stack:** 部署 Python 3.12.13、本地开发 Python 3.11/3.12、Django 5.2 LTS、Django REST Framework、Django ORM、MySQL 8、Django management command scheduler、阿里百炼 API、飞书开放平台。
|
||||
|
||||
---
|
||||
|
||||
@@ -137,7 +137,7 @@ apps/feishu/signature.py
|
||||
```txt
|
||||
Django==5.2.15
|
||||
djangorestframework==3.17.1
|
||||
psycopg[binary]
|
||||
mysqlclient==2.2.8
|
||||
asgiref==3.11.1
|
||||
sqlparse==0.5.5
|
||||
tzdata==2026.2
|
||||
@@ -180,7 +180,7 @@ Expected: `System check identified no issues`。
|
||||
|
||||
---
|
||||
|
||||
### Task 2: 账号、人员映射、Prompt、AI 记忆和审计基础模型
|
||||
### Task 2: 账号、人员映射、Prompt 和审计基础模型
|
||||
|
||||
**Files:**
|
||||
- Modify: `config/settings.py`
|
||||
@@ -188,7 +188,6 @@ Expected: `System check identified no issues`。
|
||||
- Create: `apps/people/models.py`
|
||||
- Create: `apps/prompts/models.py`
|
||||
- Create: `apps/audit/models.py`
|
||||
- Create: `apps/drafts/models.py`
|
||||
- Create: `apps/accounts/admin.py`
|
||||
- Create: `apps/people/admin.py`
|
||||
- Create: `apps/prompts/admin.py`
|
||||
@@ -206,17 +205,13 @@ Expected: `System check identified no issues`。
|
||||
|
||||
- [ ] **Step 3: 实现 PromptContext**
|
||||
|
||||
支持 `company_background_summary`、`boss_communication_style`、`ai_secretary_rules`、`role_and_alias_rules` 四类上下文,只允许同类一个 `active` 版本。
|
||||
支持 `company_background`、`boss_style`、`business_rules` 三类上下文,只允许同类一个 `active` 版本。
|
||||
|
||||
- [ ] **Step 4: 实现 AI 对话记忆基础表**
|
||||
|
||||
实现 `secretary_conversations`、`secretary_messages`、`bot_contexts`。`secretary_messages` 只追加,不修改;`bot_contexts` 保存当前待确认草稿、30 分钟过期时间、`follow_up_count` 和 `extracted_facts`。JSON 弹性字段使用 PostgreSQL `jsonb`,不得用内存隐藏保存可确认状态。
|
||||
|
||||
- [ ] **Step 5: 实现 FailureRecord、OperationLog、ModelCallLog**
|
||||
- [ ] **Step 4: 实现 FailureRecord、OperationLog、ModelCallLog**
|
||||
|
||||
失败类型和状态必须来自 `docs/contracts/状态流转约定.md`。
|
||||
|
||||
- [ ] **Step 6: 写权限、AI 记忆和脱敏测试**
|
||||
- [ ] **Step 5: 写权限和脱敏测试**
|
||||
|
||||
测试必须覆盖:
|
||||
|
||||
@@ -224,27 +219,25 @@ Expected: `System check identified no issues`。
|
||||
2. 普通日志工具不会输出完整手机号。
|
||||
3. 普通日志工具不会输出完整邮箱。
|
||||
4. 日志元数据不会保存 API Key、App Secret 或飞书 token。
|
||||
5. `secretary_messages` 幂等键 `source + message_id` 不重复写入。
|
||||
6. PostgreSQL AI 记忆读写失败时返回 `memory_store_failed`,不继续依赖内存确认草稿。
|
||||
|
||||
- [ ] **Step 7: 生成并运行迁移**
|
||||
- [ ] **Step 6: 生成并运行迁移**
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
python manage.py makemigrations
|
||||
python manage.py migrate
|
||||
python manage.py test apps.accounts apps.audit apps.drafts
|
||||
python manage.py test apps.accounts apps.audit
|
||||
```
|
||||
|
||||
Expected: migrations 成功,权限、审计和 AI 记忆测试通过。
|
||||
Expected: migrations 成功,测试通过。
|
||||
|
||||
---
|
||||
|
||||
### Task 3: AiSecretaryAgent、AI 输出校验和统一消息入口
|
||||
### Task 3: AI 草稿模型、AI 输出校验和解析服务
|
||||
|
||||
**Files:**
|
||||
- Modify: `apps/drafts/models.py`
|
||||
- Create: `apps/drafts/models.py`
|
||||
- Create: `apps/drafts/serializers.py`
|
||||
- Create: `apps/drafts/ai_client.py`
|
||||
- Create: `apps/drafts/services.py`
|
||||
@@ -253,58 +246,50 @@ Expected: migrations 成功,权限、审计和 AI 记忆测试通过。
|
||||
- Test: `apps/drafts/tests/test_ai_output_validator.py`
|
||||
- Test: `apps/drafts/tests/test_parse_service.py`
|
||||
|
||||
- [ ] **Step 1: 实现 AiDraft 模型和 AiSecretaryResponse 结构**
|
||||
- [ ] **Step 1: 实现 AiDraft 模型**
|
||||
|
||||
字段必须覆盖 `ai_drafts`,状态必须来自 `状态流转约定.md`。`qa/realtime_qa/note/need_more_info/unsupported/context_summary` 不落 `ai_drafts`,只写 `secretary_messages`、`model_call_logs` 和必要 `operation_logs`。
|
||||
字段必须覆盖 `ai_drafts`,状态必须来自 `状态流转约定.md`。
|
||||
|
||||
- [ ] **Step 2: 实现 AI 输出 validator**
|
||||
|
||||
validator 必须校验:
|
||||
|
||||
1. JSON 可解析。
|
||||
2. `intent` 只能是 `task/reminder/qa/realtime_qa/note/need_more_info/unsupported`。
|
||||
3. `task` / `reminder` 才允许 `should_create_draft = true`,`draft_type` 必须对应为 `task` 或 `reminder`。
|
||||
4. `qa/realtime_qa/note/need_more_info/unsupported` 必须 `should_create_draft=false`、`draft_type=none`。
|
||||
5. `need_more_info` 时 `questions` 至少 1 个、最多 3 个;其他 intent 时 `questions` 为空数组。
|
||||
6. `task` 时 `route_type` 只能是 `direct_after_boss_confirm` 或 `manager_confirm_required`,其他 intent 为 `none`。
|
||||
7. `answer` 不得出现“已通知、已创建、已发送”等执行语义。
|
||||
8. 结构化字段不得包含明显游戏化表达,也不得编造老板没说过的业务结论。
|
||||
2. `draft_type` 在允许范围内。
|
||||
3. `task` / `reminder` 才允许 `should_create_draft = true`。
|
||||
4. `qa` / `realtime_qa` 必须有 `answer`,且不得创建事项、提醒或通知。
|
||||
5. `follow_up_questions` 最多 3 个。
|
||||
6. `route_type` 在允许范围内。
|
||||
7. 结构化字段不得包含明显游戏化表达。
|
||||
|
||||
- [ ] **Step 3: 实现可 mock 的 ai_client**
|
||||
|
||||
`ai_client` 只封装阿里百炼调用,不修改业务表。测试中必须使用 mock,不访问真实网络。
|
||||
|
||||
- [ ] **Step 4: 实现 AiSecretaryAgent service**
|
||||
- [ ] **Step 4: 实现 parse service**
|
||||
|
||||
service 流程:
|
||||
|
||||
```text
|
||||
记录原始消息
|
||||
-> 按 source + message_id 做幂等检查
|
||||
-> 校验老板角色
|
||||
-> 读取 BotContext
|
||||
-> 判断 follow_up / new_request / qa / realtime_qa / note / unsupported / command
|
||||
-> 组装 PromptContext
|
||||
加载 active prompt_contexts
|
||||
-> 调用 ai_client
|
||||
-> 写 model_call_logs
|
||||
-> 校验 AiSecretaryResponse JSON
|
||||
-> 生成草稿 / 追问 / 直接回复
|
||||
-> 写 secretary_messages、operation_logs 和必要 failure_records
|
||||
-> 校验 JSON
|
||||
-> 成功创建 ai_drafts
|
||||
-> 失败创建 parse_failed 草稿和 failure_records
|
||||
```
|
||||
|
||||
- [ ] **Step 5: 实现 API**
|
||||
|
||||
实现:
|
||||
|
||||
1. `POST /api/secretary/handle-message`
|
||||
1. `POST /api/ai-drafts/parse`
|
||||
2. `GET /api/ai-drafts`
|
||||
3. `GET /api/ai-drafts/{id}`
|
||||
4. `PATCH /api/ai-drafts/{id}`
|
||||
5. `POST /api/ai-drafts/{id}/cancel`
|
||||
6. `POST /api/ai-drafts/{id}/follow-up`
|
||||
|
||||
兼容接口 `/api/ai-drafts/parse`、`/api/demo/boss-message` 可以保留,但内部必须转发到 `/api/secretary/handle-message`。
|
||||
|
||||
- [ ] **Step 6: 跑测试**
|
||||
|
||||
Run:
|
||||
@@ -365,7 +350,7 @@ Expected: AI 输出校验、解析失败、实时问答、补充/重说测试全
|
||||
1. 生成飞书通知记录。
|
||||
2. 使用幂等键避免重复通知。
|
||||
3. 接收人反馈。
|
||||
4. 非接收人反馈返回 `permission_denied`,并写 `FailureRecord(permission_error)`。
|
||||
4. 非接收人反馈返回 `permission_denied`。
|
||||
|
||||
- [ ] **Step 5: 实现 API**
|
||||
|
||||
@@ -419,7 +404,7 @@ Expected: 权限、状态、反馈原因和通知失败测试通过。
|
||||
不调用 AI
|
||||
不生成草稿
|
||||
回复当前入口仅对老板开放
|
||||
写 bot_unauthorized 失败记录
|
||||
写 unauthorized_bot_access 失败记录
|
||||
```
|
||||
|
||||
- [ ] **Step 5: 实现卡片回调**
|
||||
@@ -458,11 +443,11 @@ Expected: 验签、幂等、非老板访问、卡片反馈测试通过。
|
||||
|
||||
- [ ] **Step 1: 实现草稿确认和转换**
|
||||
|
||||
`CONFIRMED -> CONVERTED` 只允许执行一次。`task` 草稿转换为事项,`reminder` 草稿转换为提醒。转换失败时不回滚老板确认,写 `FailureRecord(draft_convert_failed)`。
|
||||
`confirmed -> converted` 只允许执行一次。`task` 草稿转换为事项,`reminder` 草稿转换为提醒。
|
||||
|
||||
- [ ] **Step 2: 实现复杂事项转程经理确认**
|
||||
|
||||
`route_type = manager_confirm_required` 时,草稿先进入 `NEED_MANAGER_CONFIRM`,创建程经理待确认记录,并生成给程经理的飞书提醒;程经理确认后才进入 `CONFIRMED` 并转换任务。
|
||||
`route_type = manager_confirm` 时创建程经理待确认记录,并生成给程经理的飞书提醒。
|
||||
|
||||
- [ ] **Step 3: 实现 scheduler command**
|
||||
|
||||
@@ -512,15 +497,14 @@ Expected: 草稿不重复转换、提醒不重复触发、通知补发测试通
|
||||
|
||||
`config/urls.py` 挂载:
|
||||
|
||||
1. `/api/secretary/`
|
||||
2. `/api/ai-drafts/`
|
||||
3. `/api/tasks/`
|
||||
4. `/api/reminders/`
|
||||
5. `/api/notifications/`
|
||||
6. `/api/feedbacks/`
|
||||
7. `/api/failure-records/`
|
||||
8. `/api/feishu/`
|
||||
9. `/api/auth/feishu/`
|
||||
1. `/api/ai-drafts/`
|
||||
2. `/api/tasks/`
|
||||
3. `/api/reminders/`
|
||||
4. `/api/notifications/`
|
||||
5. `/api/feedbacks/`
|
||||
6. `/api/failure-records/`
|
||||
7. `/api/feishu/`
|
||||
8. `/api/auth/feishu/`
|
||||
|
||||
- [ ] **Step 2: 注册 Admin**
|
||||
|
||||
|
||||
+108
-862
File diff suppressed because it is too large
Load Diff
@@ -6,8 +6,8 @@
|
||||
|
||||
## 2. 第一版做什么
|
||||
|
||||
1. 事项可以来自 AI 草稿 `CONFIRMED` 后转换。
|
||||
2. 事项可以由程经理确认复杂草稿后生成,复杂草稿来自 `route_type=manager_confirm_required`。
|
||||
1. 事项可以来自 AI 草稿确认。
|
||||
2. 事项可以由程经理确认复杂草稿后生成。
|
||||
3. 事项可以由老板或程经理手动创建。
|
||||
4. 普通员工第一版不默认给别人创建事项。
|
||||
5. 事项必须有发起人、接收人、事项内容、反馈要求和状态。
|
||||
@@ -36,7 +36,6 @@
|
||||
```text
|
||||
AI 草稿或手动输入
|
||||
-> 人工确认
|
||||
-> AI 草稿进入 CONFIRMED
|
||||
-> 创建 tasks
|
||||
-> 创建 notifications
|
||||
-> 飞书通知接收人
|
||||
@@ -49,11 +48,9 @@ AI 草稿或手动输入
|
||||
|
||||
```text
|
||||
老板确认转程经理
|
||||
-> AI 草稿进入 NEED_MANAGER_CONFIRM
|
||||
-> 创建 pending_manager_confirm 事项或待确认记录
|
||||
-> 给程经理发飞书提醒
|
||||
-> 程经理进入平台确认、修改和分发
|
||||
-> 草稿进入 CONFIRMED 后转换任务
|
||||
-> 通知接收人
|
||||
-> 接收反馈
|
||||
```
|
||||
@@ -101,10 +98,9 @@ AI 草稿或手动输入
|
||||
|
||||
1. 未确认事项不得通知接收人。
|
||||
2. `pending_manager_confirm` 必须由程经理确认后才能进入通知流程。
|
||||
3. 01 模块中的 `NEED_MANAGER_CONFIRM` 不能绕过程经理直接创建正式任务。
|
||||
4. 通知失败进入 `notify_failed`,不得假装已通知。
|
||||
5. 已取消事项不能反馈、通知或补发。
|
||||
6. 有问题反馈会将事项标记为 `problem`,并记录原因。
|
||||
3. 通知失败进入 `notify_failed`,不得假装已通知。
|
||||
4. 已取消事项不能反馈、通知或补发。
|
||||
5. 有问题反馈会将事项标记为 `problem`,并记录原因。
|
||||
|
||||
## 9. 失败和日志
|
||||
|
||||
|
||||
@@ -48,8 +48,8 @@
|
||||
-> 记录 feishu_events
|
||||
-> 匹配平台用户
|
||||
-> 校验 boss 角色
|
||||
-> 转发到 POST /api/secretary/handle-message
|
||||
-> 根据 reply_type 发送确认卡片、追问或普通回复
|
||||
-> 调用 AI 草稿服务
|
||||
-> 发送确认卡片
|
||||
```
|
||||
|
||||
卡片回调:
|
||||
@@ -76,9 +76,8 @@
|
||||
5. `notifications`
|
||||
6. `feedbacks`
|
||||
7. `bot_contexts`
|
||||
8. `secretary_messages`
|
||||
9. `failure_records`
|
||||
10. `operation_logs`
|
||||
8. `failure_records`
|
||||
9. `operation_logs`
|
||||
|
||||
字段以 `docs/contracts/数据对象约定.md` 为准。
|
||||
|
||||
@@ -111,8 +110,7 @@
|
||||
1. 同一个飞书 `event_id` 只处理一次。
|
||||
2. 同一个通知只允许一个有效发送结果。
|
||||
3. 同一个卡片按钮重复点击不得重复创建事项、提醒或反馈。
|
||||
4. 同一个机器人消息还必须按 `source + message_id` 在老板秘书入口二次幂等,不重复追加 `secretary_messages`。
|
||||
5. 回调处理失败必须标记 `feishu_events.process_status = failed` 并写失败记录。
|
||||
4. 回调处理失败必须标记 `feishu_events.process_status = failed` 并写失败记录。
|
||||
|
||||
## 9. 失败和日志
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
1. 支持一次性提醒。
|
||||
2. 支持每天、每周、每月固定周期提醒。
|
||||
3. 支持提醒来自手动创建。
|
||||
4. 支持提醒来自老板 AI 草稿 `CONFIRMED` 后转换。
|
||||
4. 支持提醒来自老板 AI 草稿确认。
|
||||
5. 支持提醒与事项关联。
|
||||
6. 到点后通知接收人。
|
||||
7. 通知成功或失败都要记录。
|
||||
@@ -33,7 +33,6 @@
|
||||
```text
|
||||
手动创建或草稿确认
|
||||
-> 后端校验创建权限
|
||||
-> AI 提醒草稿必须有明确 scheduled_at
|
||||
-> 写入 reminders
|
||||
-> 计算 next_trigger_at
|
||||
-> 写 operation_logs
|
||||
@@ -110,7 +109,6 @@ scheduler 扫描 due reminders
|
||||
5. 同一个提醒同一触发时间同一接收人只能生成一条有效通知。
|
||||
6. 一次性提醒成功触发后进入 `triggered`;周期提醒成功触发后保持 `active` 并计算下一次 `next_trigger_at`。
|
||||
7. 提醒反馈不改变提醒调度状态,反馈结果通过 `feedbacks` 展示。
|
||||
8. AI 提醒草稿缺少明确时间时不得创建 active 提醒,应由 01 模块追问或标记 `missing_fields`。
|
||||
|
||||
## 9. 失败和日志
|
||||
|
||||
|
||||
+10
-14
@@ -9,7 +9,7 @@
|
||||
1. 定义老板、程经理、普通员工、管理员 / AI 团队四类角色。
|
||||
2. 控制事项、提醒、草稿、反馈、失败记录的可见范围和操作范围。
|
||||
3. 记录关键操作日志。
|
||||
4. 记录 AI 解析失败、模型调用失败、AI 记忆读写失败、草稿转换失败、人员映射缺失、飞书通知失败、回调失败、定时触发失败、用户反馈有问题等失败。
|
||||
4. 记录 AI 解析失败、人员映射缺失、飞书通知失败、回调失败、定时触发失败、用户反馈有问题等失败。
|
||||
5. 支持管理员 / AI 团队查看和处理失败记录。
|
||||
6. 对敏感信息做日志边界约束。
|
||||
|
||||
@@ -63,8 +63,6 @@
|
||||
3. `operation_logs`
|
||||
4. `model_call_logs`
|
||||
5. `feishu_events`
|
||||
6. `secretary_messages`
|
||||
7. `bot_contexts`
|
||||
|
||||
字段以 `docs/contracts/数据对象约定.md` 为准。
|
||||
|
||||
@@ -109,16 +107,15 @@
|
||||
2. 机器人收到老板消息。
|
||||
3. 非老板私聊机器人。
|
||||
4. AI 生成草稿、解析失败。
|
||||
5. AI 追问、普通记录、上下文回顾和 BotContext 变化。
|
||||
6. 人工确认、修改、取消草稿。
|
||||
7. 老板点击补充/重说。
|
||||
8. 程经理确认复杂事项。
|
||||
9. 创建事项、创建提醒。
|
||||
10. 发送通知、补发通知、通知失败。
|
||||
11. 接收反馈,尤其是有问题反馈。
|
||||
12. 定时提醒触发成功或失败。
|
||||
13. AI 记忆读写失败、草稿转换失败和失败记录处理。
|
||||
14. 背景摘要或老板风格提示词版本启用。
|
||||
5. 人工确认、修改、取消草稿。
|
||||
6. 老板点击补充/重说。
|
||||
7. 程经理确认复杂事项。
|
||||
8. 创建事项、创建提醒。
|
||||
9. 发送通知、补发通知、通知失败。
|
||||
10. 接收反馈,尤其是有问题反馈。
|
||||
11. 定时提醒触发成功或失败。
|
||||
12. 失败记录处理。
|
||||
13. 背景摘要或老板风格提示词版本启用。
|
||||
|
||||
## 10. 给 AI 的测试样例
|
||||
|
||||
@@ -128,7 +125,6 @@
|
||||
4. 管理员处理失败记录时,必须留下处理结果。
|
||||
5. 日志中不得包含完整手机号、完整邮箱、飞书 token 或密钥。
|
||||
6. 未匹配平台用户的飞书登录应失败并写失败记录。
|
||||
7. PostgreSQL AI 记忆读写失败时,应写 `memory_store_failed`,不得继续依赖内存确认草稿。
|
||||
|
||||
## 11. Review 重点
|
||||
|
||||
|
||||
Reference in New Issue
Block a user