1 Commits

Author SHA1 Message Date
talesofzes fcbd728457 文档:完善泽源后端协作基线 2026-06-22 16:27:57 +08:00
17 changed files with 267 additions and 1161 deletions
+1 -25
View File
@@ -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
View File
@@ -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` 等正式业务表。
避免:
+1 -3
View File
@@ -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
View File
@@ -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` |
+6 -7
View File
@@ -4,16 +4,16 @@
## 当前迭代目标
按本地 `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` | 王一多 / 泽源 / 焕然 | 进行中 |
@@ -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`
+2 -6
View File
@@ -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. 定时提醒
-4
View File
@@ -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 记忆读写失败有记录。
- [ ] 人员映射缺失有记录。
- [ ] 飞书登录失败有记录。
- [ ] 飞书通知失败有记录。
+8 -36
View File
@@ -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
View File
@@ -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
View File
@@ -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**
File diff suppressed because it is too large Load Diff
+5 -9
View File
@@ -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. 失败和日志
+5 -7
View File
@@ -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. 失败和日志
+1 -3
View File
@@ -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
View File
@@ -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 重点