refactor: 移除 crewai agent 架构相关代码并更新 LLM 配置

This commit is contained in:
qzl
2026-03-04 11:37:09 +08:00
parent 87399f74c8
commit b02a322bf3
71 changed files with 1045 additions and 7499 deletions
+116
View File
@@ -0,0 +1,116 @@
# 前后端 API 对比分析
**Date:** 2026-03-04
**Status:** Open
**Type:** 架构分析
---
## 一、后端已有、前端缺失的 API
### 1. Friendships API (`/api/v1/friends`)
| 方法 | 路径 | 功能 | 前端状态 |
|------|------|------|----------|
| POST | `/requests` | 发送好友请求 | **缺失** |
| GET | `/requests/inbox` | 获取收件箱 | **缺失** |
| GET | `/requests/outgoing` | 获取发出的请求 | **缺失** |
| POST | `/requests/{id}/accept` | 接受好友请求 | **缺失** |
| POST | `/requests/{id}/decline` | 拒绝好友请求 | **缺失** |
| DELETE | `/requests/{id}` | 取消好友请求 | **缺失** |
| GET | `` | 获取好友列表 | **缺失** |
| DELETE | `/{id}` | 删除好友 | **缺失** |
### 2. Inbox Messages API (`/api/v1/inbox/messages`)
| 方法 | 路径 | 功能 | 前端状态 |
|------|------|------|----------|
| GET | `` | 获取消息列表 | **缺失** |
| POST | `/{id}/accept` | 接受邀请 | **缺失** |
| POST | `/{id}/dismiss` | 忽略消息 | **缺失** |
### 3. Chat/AgUi 流式 API
| 功能 | 前端状态 |
|------|----------|
| 发送消息 SSE 流式 | **仅有 Mock** |
| 加载历史记录 | **仅有 Mock** |
> 前端 `AgUiService` 只有本地 mock (`throw UnimplementedError`),未实现真实 API 调用。
### 4. Infra API
| 方法 | 路径 | 功能 | 前端状态 |
|------|------|------|----------|
| GET | `/infra/health` | 基础设施健康检查 | **未使用** |
---
## 二、前端已有、后端已实现的 API
### Auth API (`/api/v1/auth`)
| 方法 | 路径 | 后端 | 前端 |
|------|------|------|------|
| POST | `/verifications` | ✅ | ✅ |
| POST | `/verifications/verify` | ✅ | ✅ |
| POST | `/verifications/resend` | ✅ | ✅ |
| POST | `/sessions` | ✅ | ✅ |
| POST | `/sessions/refresh` | ✅ | ✅ |
| DELETE | `/sessions` | ✅ | ✅ |
| POST | `/password-reset` | ✅ | ✅ |
| POST | `/password-reset/confirm` | ✅ | ✅ |
| GET | `/users` | ✅ | **未使用** |
### Users API (`/api/v1/users`)
| 方法 | 路径 | 后端 | 前端 |
|------|------|------|------|
| GET | `/me` | ✅ | ✅ |
| PATCH | `/me` | ✅ | ✅ |
| POST | `/search` | ✅ | ✅ |
### Schedule Items API (`/api/v1/schedule-items`)
| 方法 | 路径 | 后端 | 前端 |
|------|------|------|------|
| POST | `` | ✅ | **仅有 Mock** |
| GET | `` (range query) | ✅ | **仅有 Mock** |
| GET | `/{id}` | ✅ | **仅有 Mock** |
| PATCH | `/{id}` | ✅ | **仅有 Mock** |
| DELETE | `/{id}` | ✅ | **仅有 Mock** |
| POST | `/{id}/share` | ✅ | **缺失** |
---
## 三、待实现功能清单
| 优先级 | 功能 | 说明 |
|--------|------|------|
| **P0** | FriendsApi | 前端无 Friendships API 客户端 |
| **P0** | InboxMessagesApi | 前端无 Inbox Messages API 客户端 |
| **P0** | Chat/AgUi 后端连接 | 前端 AgUiService 未实现真实 API |
| **P1** | CalendarService 真实 API | MockCalendarService → 真实 API 调用 |
| **P1** | Schedule Share 接口 | 前端未调用 `POST /{id}/share` |
| **P2** | Infra Health 集成 | 可用于前端健康检查 |
---
## 四、相关文件位置
### 前端 API 客户端
- `apps/lib/features/auth/data/auth_api.dart` - Auth API
- `apps/lib/features/users/data/users_api.dart` - Users API
- `apps/lib/features/calendar/data/services/mock_calendar_service.dart` - Calendar Mock
- `apps/lib/features/chat/data/services/ag_ui_service.dart` - Chat/AgUi Mock
- `apps/lib/features/chat/data/services/mock_history_service.dart` - History Mock
### 后端 Router
- `backend/src/v1/auth/router.py` - Auth 路由
- `backend/src/v1/users/router.py` - Users 路由
- `backend/src/v1/friendships/router.py` - Friendships 路由
- `backend/src/v1/inbox_messages/router.py` - Inbox Messages 路由
- `backend/src/v1/schedule_items/router.py` - Schedule Items 路由
- `backend/src/v1/infra/router.py` - Infra 路由
-92
View File
@@ -1,92 +0,0 @@
# Backlog - Known Issues & Improvements
## Database Triggers
### [TRIGGER-001] user_agents 自动创建
**Status**: ✅ Resolved
**Priority**: Medium
**Created**: 2026-02-27
**Resolved**: 2026-03-02
**Description**:
当新用户注册时,`user_agents` 表未自动创建默认 Agent 配置记录。
**Current Behavior**:
- `auth.users``profiles` 已有 trigger 自动创建
- `user_agents` 无自动创建机制
**Expected Behavior**:
新用户注册后,应有默认的 Agent 配置(如 INTENT_RECOGNITION、TASK_EXECUTION、RESULT_REPORTING 三种类型)。
**Impact**:
- 用户首次使用 Agent Chat 功能时可能失败
- 需要应用层手动初始化或前端引导配置
**Solution**:
1. 创建 `user_agent_catalog.yaml` 配置文件定义 3 种 agent 类型
2. 创建 `user_agent_catalog` 表存储配置(持久化)
3. 修改 `user_agents` 表唯一约束:`user_id``(user_id, agent_type)` 允许每个用户有多个 agents
4. 扩展 `create_profile_for_new_user()` trigger 从 catalog 批量插入 user_agents
5. 实现配置动态更新:修改 YAML → 重启应用 → 自动同步到数据库
6. 为已存在用户补充 user_agents 记录
**Verification**:
- ✅ 新用户注册自动创建 3 个 agents
- ✅ Catalog 表已填充(INTENT_RECOGNITION, TASK_EXECUTION, RESULT_REPORTING
- ✅ 已为 1 个存在用户补充 3 个 agents
- ✅ Backend tests: 247 passed
**Related Files**:
- `backend/src/core/config/static/database/user_agent_catalog.yaml`
- `backend/src/models/user_agent_catalog.py`
- `backend/alembic/versions/50ae013ce530_add_user_agent_catalog.py`
- `backend/src/core/config/initial/init_data.py`
---
## Flutter Design Tokens
### [TOKEN-001] 大量硬编码颜色违反 AGENTS.md 规则
**Status**: ✅ Resolved (Partial)
**Priority**: Medium
**Created**: 2026-03-02
**Resolved**: 2026-03-02
**Description**:
`apps/AGENTS.md` 规则要求禁止硬编码颜色,必须使用 `design_tokens.dart` 中的 `AppColors`。但实际代码中存在大量硬编码。
**Current Behavior**:
- `apps/AGENTS.md` 规定:"NEVER hardcode colors, sizes, or spacing values"
- 代码中有 **126 处**硬编码 `Color(0xFF...)`(扫描发现比预期多 17 处)
**Expected Behavior**:
所有颜色应使用 `AppColors` 中定义的值。
**Impact**:
- 与项目规范不一致
- 后续 theme 统一修改困难
- 代码审查难以发现
**Solution** (渐进式迁移):
1. **扫描分析**: 发现 126 个硬编码颜色,Top 3: `FFF8FAFC` (11), `FFF8FAFF` (9), `FFE2E8F0` (5)
2. **扩展 AppColors**: 添加 11 个语义化 tokensurfaceSecondary, borderSecondary, success, warning 等)
3. **优先迁移**: 8 个高频文件(settings, contacts, calendar_event_detail 等)
4. **批量替换**: 37 个硬编码颜色已替换为 tokens
5. **测试验证**: 140/140 Flutter tests 通过
**Migration Results**:
- ✅ 新增 token: 11 个(覆盖 57 次使用)
- ✅ 已迁移: 37 个硬编码颜色
- ⚠️ 剩余: 90 个(建议后续迭代继续迁移)
**Recommendations**:
1. 继续迁移剩余 90 个硬编码颜色
2. 优先处理 `contacts_screen.dart`, `settings_screen.dart`, `features_screen.dart` (46% of remaining)
3. 考虑添加 lint rule 防止新增硬编码颜色
**Related Files**:
- `apps/lib/core/theme/design_tokens.dart`
- `apps/lib/features/*/ui/screens/*.dart` (8 files migrated)
- `apps/AGENTS.md`
-127
View File
@@ -1,127 +0,0 @@
# 日历功能新增 Bug 记录
**Created**: 2026-03-02
**Feature**: 日历事件创建功能
**Status**: Partial (Bug 5, 7 pending)
---
## Bug 1: 日视图时间范围不完整
**Severity**: High
**Status**: Fixed
**修复内容**:
- 修改循环范围从 `for (var hour = 7; hour <= 22; hour++)` 改为 `for (var hour = 0; hour <= 23; hour++)`
- 现在日视图显示完整的 00:00-24:00 时间线
---
## Bug 2: 日历事件保存后视图不刷新
**Severity**: High
**Status**: Fixed
**修复内容**:
-`CreateEventSheet` 添加 `onSaved` 回调参数
- 在月视图和日视图中使用 `setState` + `UniqueKey` 强制刷新事件列表
- 保存后自动刷新,无需手动切换页面
---
## Bug 3: 日视图事件高度未按时间范围渲染
**Severity**: Medium
**Status**: Fixed
**修复内容**:
- 使用 `Positioned` + `Stack` 替代原来的 `Wrap` 布局
- 根据事件实际持续时间计算高度:`持续分钟数 / 60 * _hourHeight`
- 事件垂直位置根据开始时间计算:`开始分钟数 / 60 * _hourHeight`
---
## Bug 4: 月视图事件超过3个后无法显示
**Severity**: Medium
**Status**: Fixed
**修复内容**:
- 显示前 2 个事件
- 超过 2 个时显示 `+N` 按钮
- 点击 `+N` 跳转到日视图
---
## Bug 5: 日视图点击事件跳转到错误页面
**Severity**: High
**Status**: Pending
**现象描述**:
- 在日视图中点击日历事件
- 跳转到的页面不是日历详情页,而是显示了类似首页的聊天输入框
- 页面显示"输入消息..."和麦克风图标
- 路由应该是 `/calendar/events/evt_xxx` 但显示的是首页布局
**已尝试的修复**:
-`/calendar/events/:id` 路由移到最前面优先匹配
- 调试日志显示 eventId 正确传递
- 添加了 `clipBehavior: Clip.none``Material + InkWell`
**可能原因**:
- 路由配置问题,可能被其他路由或 Shell 组件影响
- 页面布局问题导致显示异常
**修复建议**:
- 检查路由配置,确认 CalendarEventDetailScreen 正确加载
- 检查页面布局是否正确渲染
---
## Bug 6: 日视图多事件重叠时布局错乱
**Severity**: Medium
**Status**: Fixed
**修复内容**:
- 使用 `_calculateEventColumns` 方法计算事件列位置
- 最早开始的事件放在最左边
- 其余事件依次向右排列,每个事件宽度 = 总宽度 / 列数
- 使用 `Positioned` 绝对定位控制事件位置
---
## Bug 7: 日历详情页布局错误
**Severity**: High
**Status**: Pending
**现象描述**:
- 点击跳转到的页面显示异常
- 页面顶部显示聊天输入框("输入消息..."和麦克风图标)
- 应该是日历详情页但显示了类似首页的布局
- 渲染错误:RenderFlex children have non-zero flex but incoming width constraints are unbounded
**已尝试的修复**:
-`_buildInputContainer` 中的 Container 添加 `width: double.infinity`
- 修改内部的 Row 使用 const
**修复建议**:
- 需要重新设计详情页布局
- 确认底部输入框组件是否需要(可能复制自其他页面)
---
## 相关文件清单
### 新增文件
- `apps/lib/features/calendar/data/models/schedule_item_model.dart` - 日历事件数据模型
- `apps/lib/features/calendar/data/services/mock_calendar_service.dart` - Mock 服务
- `apps/lib/features/calendar/ui/widgets/create_event_sheet.dart` - 创建事件底部弹窗
### 修改文件
- `apps/lib/features/calendar/ui/screens/calendar_month_screen.dart` - 月视图
- `apps/lib/features/calendar/ui/screens/calendar_dayweek_screen.dart` - 日视图
- `apps/lib/features/calendar/ui/screens/calendar_event_detail_screen.dart` - 事件详情页
- `apps/lib/core/router/app_router.dart` - 路由配置
+145
View File
@@ -0,0 +1,145 @@
# 前后端测试分析报告
**Date:** 2026-03-04
**Status:** Completed
---
## 测试统计
### 后端测试
| 类型 | 数量 | 状态 |
|------|------|------|
| Unit Tests | ~100+ | 可运行 |
| Integration Tests | ~70+ | 可运行 |
| E2E Tests | 5 | **无法运行** (缺少 playwright 依赖) |
### 前端测试
| 类型 | 数量 | 状态 |
|------|------|------|
| Flutter Tests | 140 | ✅ 全部通过 |
---
## 问题发现
### 1. 后端 E2E 测试无法运行 (HIGH)
**问题**: 5 个 E2E 测试文件需要 `playwright` 模块,但依赖未安装。
**影响文件**:
- `tests/e2e/test_auth_flow.py`
- `tests/e2e/test_infra_health_e2e.py`
- `tests/e2e/test_logging_e2e.py`
- `tests/e2e/test_mobile_health_e2e.py`
- `tests/e2e/test_profile_flow.py`
**错误**:
```
ModuleNotFoundError: No module named 'playwright'
```
**建议**:
- 安装 playwright: `uv add playwright && uv run playwright install`
- 或者移除这些无法运行的 E2E 测试文件
---
### 2. 测试文件命名冲突导致收集警告 (LOW)
**问题**: 存在多个同名 `test_schemas.py` 文件在不同目录,导致 pytest 收集时显示警告。
**影响文件**:
- `tests/unit/v1/schedule_items/test_schemas.py`
- `tests/unit/v1/profile/test_schemas.py`
- `tests/unit/v1/inbox_messages/test_schemas.py`
- `tests/unit/v1/friendships/test_schemas.py`
**状态**: 测试实际可以正常运行,只是有警告提示。
**建议**: 可保持现状(这是合理的代码组织方式),或重命名为 `test_*.py` 以消除警告。
---
### 3. 遗留测试验证旧字段 (INFO)
**文件**: `tests/unit/v1/profile/test_schemas.py`
**测试**: `test_profile_update_rejects_display_name_field`
**说明**: 此测试验证旧的 `display_name` 字段被正确拒绝。字段已在之前的重构中删除。
**状态**: **有效** - 这是一个回归测试,确保旧字段不被使用。
---
## 未发现的问题
### 冗余测试
经过检查,未发现明显冗余的测试:
- 每个模块的测试覆盖不同的功能
- Unit tests、Integration tests、E2E tests 有清晰的职责划分
### 死代码
未发现测试文件中有未使用的:
- imports
- mock 类
- helper 函数
### 缺失测试
未发现对应已实现功能但缺少测试的情况。
---
## 测试覆盖模块
### 后端
| 模块 | Unit | Integration | E2E |
|------|------|-------------|-----|
| Auth | ✅ | ✅ | ❌ |
| Users | - | ✅ | - |
| Profile | ✅ | - | ❌ |
| Friendships | ✅ | ✅ | - |
| Inbox Messages | ✅ | ✅ | - |
| Schedule Items | ✅ | ✅ | - |
| Logging | ✅ | ✅ | ✅ |
| Settings | ✅ | - | - |
### 前端
| 模块 | 测试数 |
|------|--------|
| Auth | ~20 |
| Chat | ~70 |
| Home | ~15 |
| Calendar | ~5 |
| Core (API, Storage) | ~30 |
---
## 建议
1. **立即**: 解决 E2E 测试依赖问题或移除无法运行的测试文件
2. **可选**: 清理 test_schemas.py 重名警告(低优先级)
3. **保持**: 现有的测试结构良好,无需重大重构
---
## 附: 测试代码质量问题
### 测试类未完全实现 Protocol (LSP 警告)
**文件**: `tests/unit/v1/auth/test_auth_service.py`
**问题**: `FakeGateway``LogoutAssertingGateway` 类没有实现 `AuthServiceGateway` Protocol 的全部方法:
- `request_password_reset`
- `confirm_password_reset`
**影响**: LSP 类型检查器报告错误,但运行时不受影响(因为这些方法在测试中不会被调用)。
**建议**: 可选择补充缺失的方法实现,或使用 `@pytest.mark.skip` 标记不需要的协议方法。
---
*报告生成时间: 2026-03-04*