feat: chat integration, tenant admin spec, backend chat service, miniprogram updates, DEMO moved to tmp, XCX-TEST removed, migrations & docs

This commit is contained in:
Neo
2026-03-20 09:02:10 +08:00
parent 3d2e5f8165
commit beb88d5bea
388 changed files with 6436 additions and 25458 deletions

View File

@@ -286,15 +286,102 @@ async def build_page_text(
- 主观信息需在 Prompt 中标注【来源XXX请甄别信息真实性】
- reference 从 `ai_cache` 获取 app8 最新 + 最近 2 套历史
### 3.6 应用 1页面上下文文本化
### 3.6 应用 1biz_params 权限隔离(已实现,需确认)
应用 1 的 `_build_page_context()``_build_source_context()` 需要根据 `source_page` 类型,调用对应的数据获取函数并格式化为文本
> ✅ RNS1.4 已在 `app1_chat.py` 的 `_build_system_prompt()` 中实现 biz_params 拼接
实现要点
- 每个页面类型对应一个文本化函数
- 文本化输出为结构化中文描述(非 JSON便于 AI 理解
应用 1 通过 `biz_params.user_prompt_params` 向百炼 AI 传入用户身份信息,实现数据查询隔离
```python
system_content = {
"task": "你是台球门店的 AI 助手...",
"biz_params": {
"user_prompt_params": {
"User_ID": str(user_id),
"Role": role, # "助教" | "管理者"
"Nickname": nickname,
},
},
}
```
权限控制规则(百炼平台侧执行):
- 助教身份:仅允许查询与该助教相关的数据,禁止查询其他助教业绩/工资/客户关系等敏感数据,禁止查询门店级财务数据
- 管理者身份:可查询该门店下所有数据
- 所有查询必须包含 `site_id` 过滤
NS2 需确认事项:
- 前端调用 `POST /api/chat/conversations/:id/messages` 时,是否正确传入 `user_id`/`role`/`nickname`
- 后端从 JWT token 中提取用户信息并传入 `_build_system_prompt()`,确保不可伪造
### 3.7 应用 1页面上下文传递与文本化
#### 当前问题P5 PRD 与 RNS1.4 实现的差异)
P5 PRD 原始设计:
```
前端跳转 chat.html 时传入 source_page + page_context + screen_content
→ 后端接收后文本化 → 拼接为首条 user message
```
RNS1.4 当前实现:
```
前端跳转 chat 页面时仅传入 contextType + contextId如 task/12345
→ 后端 _build_page_context() 为占位实现page_context 和 screen_content 为空
→ AI 无法获得页面上下文
```
#### 解决方案:后端根据 contextType 自动获取页面上下文
采用方案 B简化前端后端自动查询与 RNS1.4 已有的 `contextType`/`contextId` 参数兼容:
```
前端传入 contextType="task-detail" + contextId="12345"
→ 后端 build_page_text("task-detail", 12345, site_id)
→ 后端从数据库获取任务详情、客户信息、备注、AI 分析等
→ 格式化为结构化中文文本
→ 拼接为首条 user message 的 page_context 字段
```
#### contextType 映射表
| 前端 contextType | 后端数据获取 | 文本化内容 |
|-----------------|-------------|-----------|
| `task-detail` | coach_tasks + member + notes + ai_cache | 任务信息 + 客户信息 + 备注 + AI 分析 |
| `customer-detail` | member + consumption + clues | 客户全信息 + 消费记录 + 维客线索 |
| `coach-detail` | assistant + tasks + notes | 助教信息 + 任务统计 + 备注 |
| `board-finance` | finance DWS 汇总(按当前筛选条件) | 财务数据摘要 |
| `board-customer` | 当前筛选维度 top 列表 | 客户排名摘要 |
| `board-coach` | 当前筛选维度排名 | 助教排名摘要 |
| `performance` | salary_calc + daily_detail | 绩效数据摘要 |
| `my-profile` | user info + assistant binding | 个人信息摘要 |
| `task-list` | 长按的任务摘要 + 客户-助教关系 | 任务概要 |
| `customer-service-records` | 服务记录列表 | 服务记录摘要 |
#### 前端需要补充的参数
当前前端仅传 `contextType` + `contextId`,对于看板类页面需要额外传入筛选条件:
| contextType | 必传参数 | 可选参数 |
|-------------|---------|---------|
| `task-detail` | contextIdtaskId | — |
| `customer-detail` | contextIdmemberId | — |
| `coach-detail` | contextIdassistantId | — |
| `board-finance` | — | `timeDimension`(时间维度)、`areaFilter`(区域筛选) |
| `board-customer` | — | `dimension`(排序维度)、`typeFilter`(类型筛选) |
| `board-coach` | — | `dimension``projectFilter``timeDimension` |
| `performance` | — | `timeDimension` |
| `task-list` | contextIdtaskId | — |
| `my-profile` | — | — |
#### 实现要点
- 每个页面类型对应一个文本化函数,在 `data_fetchers/page_context.py` 中实现
- 文本化输出为结构化中文描述(非 JSON便于 AI 理解上下文
- 数据量控制:每个页面上下文不超过 2000 字符,避免 token 浪费
- 敏感信息脱敏:不传入 member_phone 等断档字段
- 看板类页面:若前端未传筛选条件,使用默认值(如 board-finance 默认"本月"
- 错误降级数据获取失败时page_context 传入"页面上下文获取失败",不阻断对话
---
@@ -348,12 +435,18 @@ async def build_page_text(
```
用户点击 AI 入口
→ 前端传入 source_page + context_data
→ 后端 build_page_text(source_page, context_data)
拼接为首条 user message
→ 前端传入 contextType + contextId+ 可选筛选参数)
→ 后端 build_page_text(contextType, contextId, site_id, filters?)
从数据库获取对应页面数据,格式化为结构化中文文本
→ 拼接为首条 user message 的 page_context 字段
→ 注入 biz_paramsUser_ID/Role/Nickname到 system prompt
→ SSE 流式调用百炼 API
```
> ⚠️ 与 P5 PRD 原始设计的差异P5 设计为前端传入 `source_page` + `page_context` + `screen_content`
> RNS1.4 实际实现为前端传入 `contextType` + `contextId`,后端自动查询数据库获取上下文。
> NS2 沿用 RNS1.4 方案(后端自动获取),不要求前端传入原始页面数据。
---
## 六、参考文档
@@ -361,12 +454,16 @@ async def build_page_text(
| 文档 | 路径 | 用途 |
|------|------|------|
| P5 AI 集成 spec | `docs/prd/specs/P5-miniapp-ai-integration.md` | Prompt JSON 结构定义、调用链时序 |
| AI 应用 Prompt | `docs/prd/ai-app-prompts.md` | 8 个应用的 System Prompt、biz_params 定义 |
| AI 需求文档 | `docs/prd/AI需求2.md` | 8 个应用的详细需求表、传参格式 |
| AI 应用→页面映射 | `docs/reports/2026-03-20__ai_app_page_mapping.md` | 各应用输出内容在哪个页面的什么位置展示 |
| API 契约 | `docs/miniprogram-dev/API-contract.md` | 接口响应格式(决定数据结构) |
| DWD-DOC 标杆 | `docs/reports/DWD-DOC/` | 金额口径、字段语义权威参考 |
| AI 应用骨架代码 | `apps/backend/app/ai/apps/app*.py` | 当前骨架实现 |
| AI 应用骨架代码 | `apps/backend/app/ai/apps/app*.py` | 当前骨架实现(含 biz_params 已实现) |
| 百炼客户端 | `apps/backend/app/ai/bailian_client.py` | API 调用封装 |
| 缓存服务 | `apps/backend/app/ai/cache_service.py` | ai_cache 读写 |
| NS1 接口设计 | `docs/prd/Neo_Specs/NS1-xcx-backend-api.md` | 后端数据结构参考 |
| RNS1.4 任务计划 | `.kiro/specs/rns1-chat-integration/tasks.md` | 当前 chat 模块实施进度 |
---
@@ -413,7 +510,12 @@ async def build_page_text(
- [ ] T7完善 `app6_note.py``build_prompt()`(备注+客户数据 → 备注分析)
- [ ] T8完善 `app7_customer.py``build_prompt()`(客户全量数据 → 运营策略)
### Batch C应用 1 页面文本化 + 联调
### Batch C应用 1 页面文本化 + 前端配合
- [ ] T9实现各页面类型的文本化函数task-detail/customer-detail/board-*/performance 等)
- [ ] T10补充 `app1_chat.py``_build_page_context()` 调用文本化函数
- [ ] T11端到端联调(触发事件 → Prompt 拼接 → 百炼调用 → 缓存写入 → 前端展示
- [ ] T10补充 `app1_chat.py``_build_page_context()` 调用文本化函数,根据 `contextType` 路由到对应文本化函数
- [ ] T11前端补充看板类页面的筛选参数传递board-finance/board-customer/board-coach 跳转 chat 时传入当前筛选条件
- [ ] T12确认 biz_params 端到端正确性(前端 JWT → 后端提取 user_id/role/nickname → system prompt 注入 → 百炼权限隔离生效)
### Batch D联调与验证
- [ ] T13端到端联调触发事件 → Prompt 拼接 → 百炼调用 → 缓存写入 → 前端展示)
- [ ] T14应用 1 页面上下文联调(各入口页面 → contextType/contextId → 后端文本化 → AI 对话验证上下文感知)