2 Commits

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