226 lines
17 KiB
Markdown
226 lines
17 KiB
Markdown
# 项目进度追踪
|
||
|
||
> 最后更新: 2026-08-20 15:45
|
||
|
||
## 服务运行状态
|
||
|
||
| 服务 | 节点 | 地址 | 状态 | 验证结果 |
|
||
|------|------|------|------|---------|
|
||
| FAM-Core | NAS | 0.0.0.0:8000 | ✅ 运行中 | health=ok, gunicorn --threads 4, scheduler+dispatcher+poller 全部 running |
|
||
| FAM-Edge | Oracle | 0.0.0.0:5000 | ✅ 运行中 | v2.0, SQLite 异步队列 + 消费者线程 + TokenBucket 速率限制 |
|
||
| MariaDB | NAS | 127.0.0.1:3306 | ✅ 运行中 | 10.11.11, 6 张表, utf8mb4 |
|
||
| Ollama | Oracle | 127.0.0.1:11434 | ✅ 运行中 | qwen2.5:7b,仅智能问答兜底(不参与视觉/融合) |
|
||
| Tailscale | Oracle ↔ NAS | 100.74 ↔ 100.70 | ⚠️ 待修复 | Tailscale 运行但端口不通,当前用公网IP |
|
||
| FAM-UI | NAS | 0.0.0.0:8501 | ✅ 运行中 | Streamlit 1.61.1, HTTP 200, health=ok |
|
||
|
||
## 环境状态
|
||
|
||
### Oracle Cloud (129.146.203.203) - FAM-Edge 节点
|
||
| 项目 | 状态 | 备注 |
|
||
|------|------|------|
|
||
| OS | Ubuntu 20.04 ARM64 | Ampere A1 2C12G |
|
||
| Python | 3.8.10 | python3-venv 已安装 |
|
||
| pip | 25.0.1 (venv内) | |
|
||
| FFmpeg | 已安装 | apt 安装 |
|
||
| Ollama | 0.32.14 | |
|
||
| qwen2.5:7b | 已拉取 | 纯文本模型,仅问答兜底(原 llava-phi3 已废弃) |
|
||
| Python 依赖 | 全部安装成功 | flask, gunicorn, requests, PyYAML, opencv, numpy |
|
||
| 模块导入验证 | PASS | FAM-Edge 全部 8 个模块导入正常 |
|
||
| 代码部署 | /opt/fam-edge/ | rsync 同步 |
|
||
| venv | /opt/fam-edge/venv/ | 已创建 |
|
||
| Tailscale | 1.102.2 已安装 | **待用户认证** |
|
||
|
||
### Synology NAS (192.168.50.64) - FAM-Core + FAM-UI 节点
|
||
| 项目 | 状态 | 备注 |
|
||
|------|------|------|
|
||
| 型号 | DS220+ (Geminilake) | DSM 7 |
|
||
| Python | 3.8.15 (系统) + 3.10.20 (venv) | FAM-Core/UI venv 使用 Python 3.10 |
|
||
| pip3 | venv 内可用 | fam-core/venv + fam-ui/venv |
|
||
| MariaDB | **10.11.11 已运行** | 端口 3306, root 密码 iLoveJava5! |
|
||
| sentinel_home_ai 库 | **6 张表已创建** | DDL 执行成功 |
|
||
| Docker | 24.0.2 (ContainerManager) | 路径 /var/packages/ContainerManager/target/usr/bin/docker |
|
||
| Tailscale | **已运行** | IP: 100.70.234.39, hostname: ericwyuan-nas |
|
||
| FAM-Core venv | ✅ 已创建 | Python 3.10.20, flask/PyMySQL/gunicorn/PyYAML/requests |
|
||
| FAM-UI venv | ✅ 已创建 | Python 3.10.20, Streamlit 1.61.1 + pandas 2.3.3 |
|
||
| Streamlit | ✅ 已安装 | 1.61.1, 运行于 0.0.0.0:8501 (headless) |
|
||
|
||
### 网络互通 (Tailscale)
|
||
| 节点 | Tailscale IP | 状态 |
|
||
|------|-------------|------|
|
||
| NAS (ericwyuan-nas) | 100.70.234.39 | 已连接 |
|
||
| Oracle (oracle-fam-edge) | 待认证 | **需用户访问认证 URL** |
|
||
| 当前方案 | Oracle Tailscale 待认证,认证后可直连 | |
|
||
|
||
## 模型可行性基准测试 (Task 1.4)
|
||
|
||
### 测试环境
|
||
- Oracle Ampere A1 2C12G ARM64
|
||
- Ollama 0.32.14 + llava-phi3:latest (2.9 GB)
|
||
- Python 3.8.10 + requests
|
||
|
||
### 测试结果
|
||
|
||
| 场景 | 加载时间 | Prompt 处理 | 生成时间 | Token 数 | 总耗时 | 是否达标(≤8s) |
|
||
|------|---------|------------|---------|---------|--------|-------------|
|
||
| 冷启动 (首次推理) | 54.56s | 37.40s | 17.22s | 86 | 109.21s | 否 (首次加载) |
|
||
| 预热 (无限制) | 0.06s | 0.20s | 13.06s | 65 | 13.35s | 否 |
|
||
| 预热 (num_predict=30) | 0.07s | 1.41s | 2.83s | 15 | **4.34s** | **PASS** |
|
||
|
||
### 结论
|
||
1. **冷启动延迟**: 首次推理需加载 2.9GB 模型到内存,耗时 ~55s。建议通过 systemd keep-alive 或定时心跳保持模型常驻
|
||
2. **预热性能**: 模型加载后,单图推理可控制在 4-5s(限制输出 30 token),满足 ≤8s 设计目标
|
||
3. **ARM CPU 瓶颈**: token 生成速度 ~0.1-0.2s/token,多帧分析(5-8帧)需合理设置 `num_predict`(默认 500)
|
||
4. **已优化**: OllamaAdapter 新增 `num_predict` 可配置参数,默认 500
|
||
|
||
## 任务进度
|
||
|
||
### 已完成
|
||
|
||
| # | 任务 | 提交 | 日期 |
|
||
|---|------|------|------|
|
||
| 1 | 项目骨架 + 全部 Python 模块代码 | `d741ade` 等 | 2026-08-19 |
|
||
| 2 | DDL 数据库建表脚本 | `d741ade` | 2026-08-19 |
|
||
| 3 | 部署脚本 + 文档 | `d741ade` | 2026-08-19 |
|
||
| 4 | __init__.py 导出链路 | `c45464c` | 2026-08-19 |
|
||
| 5 | Storage-Cleaner 补全 | `5e4587b` | 2026-08-19 |
|
||
| 6 | 服务器凭证写入 README | `ba905d2` | 2026-08-19 |
|
||
| 7 | requirements.txt 兼容 Python 3.8 | `c1bfac5` | 2026-08-19 |
|
||
| 8 | Oracle 部署: venv + 依赖 + 导入验证 | `50d8353` | 2026-08-19 |
|
||
| 9 | 模型基准测试 (llava-phi3 ≤8s PASS) | `50d8353` | 2026-08-19 |
|
||
| 10 | OllamaAdapter 优化 (num_predict) | `50d8353` | 2026-08-19 |
|
||
| 11 | Tailscale 安装 (Oracle + NAS) + 认证 | `e5ac667` | 2026-08-19 |
|
||
| 12 | NAS MariaDB DDL 执行 (6 张表) | `e5ac667` | 2026-08-19 |
|
||
| 13 | db_layer.py 切换 PyMySQL (45KB 替代 19MB) | ✅ 完成 | 2026-08-19 |
|
||
| 14 | config_loader.py 路径修复 (3 级 dirname) | ✅ 完成 | 2026-08-19 |
|
||
| 15 | NAS Python 依赖安装 (flask/gunicorn/pymysql/PyYAML) | ✅ 完成 | 2026-08-19 |
|
||
| 16 | NAS 代码部署 + FAM-Core 导入验证 PASS | ✅ 完成 | 2026-08-19 |
|
||
| 17 | NAS DB 连接验证 PASS (PyMySQL → MariaDB 10.11.11) | ✅ 完成 | 2026-08-19 |
|
||
| 18 | config.yaml 实际配置 (FAM-Core + FAM-Edge + FAM-UI) | ✅ 完成 | 2026-08-19 |
|
||
| 19 | NAS 启动 FAM-Core (gunicorn, Python 3.10 venv) | ✅ 完成 | 2026-08-19 |
|
||
| 20 | Oracle 启动 FAM-Edge (gunicorn) | ✅ 完成 | 2026-08-19 |
|
||
| 21 | MariaDB JSON 路径兼容修复 (name_member) | ✅ 完成 | 2026-08-20 |
|
||
| 22 | FAM-Core API 全端点测试通过 | ✅ 完成 | 2026-08-20 |
|
||
| 23 | FAM-Edge 聊天代理端点 (/api/edge/chat) | ✅ 完成 | 2026-08-20 |
|
||
| 24 | FAM-UI PyMySQL 迁移 | ✅ 完成 | 2026-08-20 |
|
||
| 25 | FAM-Core 配置切换至 Oracle 公网 IP | ✅ 完成 | 2026-08-20 |
|
||
| 26 | 端到端聊天验证 (Core→Edge→Ollama) | ✅ 完成 | 2026-08-20 |
|
||
| 27 | NAS 安装 Streamlit + pandas + 部署 FAM-UI | ✅ 完成 | 2026-08-20 |
|
||
| 28 | Ollama 模型常驻内存 (OLLAMA_KEEP_ALIVE=-1) | ✅ 完成 | 2026-08-20 |
|
||
| 29 | 关键帧提取改为自适应帧数 (随视频时长动态计算) | ✅ 完成 | 2026-08-20 |
|
||
| 30 | FFmpeg 快速 seek 替代 fps 滤镜 (6-8x 提速) | `7ce8aff` | 2026-08-20 |
|
||
| 31 | 真实视频性能基准测试 (30min 360MB 视频) | ✅ 完成 | 2026-08-20 |
|
||
| 32 | 视频端到端集成测试 (task 289 → SUCCESS, 落库正确) | ✅ 完成 | 2026-08-20 |
|
||
| 33 | 生产目录切换 forward-only (285 历史视频占位跳过) | ✅ 完成 | 2026-08-20 |
|
||
| 34 | 今日 17 片段诊断(根因:Ollama 本地融合 300s 超时) | ✅ 完成 | 2026-08-20 |
|
||
| 35 | **架构重构**:移除本地融合(run_text_fusion),云端 VLM 直出 JSON → format_cloud_result → 直存 DB | `babf5b0` | 2026-08-20 |
|
||
| 36 | 适配器 chat() 方法 + run_qa 三模型降级(Gemini→NVIDIA→Ollama 兜底) | `babf5b0` | 2026-08-20 |
|
||
| 37 | 端点 /api/edge/chat/ask + chat_handler 改走 Edge 编排(qa_url) | `babf5b0` | 2026-08-20 |
|
||
| 38 | 双端部署验证:Oracle 7 文件 + 重启;NAS chat_handler + config 手术 + HUP;实测 /api/edge/chat/ask provider=nvidia、NAS→Edge 编排 43s 落库 | ✅ 完成 | 2026-08-20 |
|
||
| 39 | **fix: NVIDIA 单帧 JSON 解析** — parse_vlm_json 要求全 schema 但 NVIDIA 只返回单帧 JSON,改用轻量 _parse_single_frame_json | `853cb21` | 2026-08-20 |
|
||
| 40 | **fix: Gemini timeout 30s→90s + 熔断器 threshold 3→5 cooldown 600→300** | `853cb21` | 2026-08-20 |
|
||
| 41 | **fix: dispatcher crash on invalid failure_stage** — Edge 返回 'process' 不在 ENUM 中导致 DataError 崩溃,db_layer 加容错映射 + dispatcher per-task try/except | `d75c745` | 2026-08-20 |
|
||
| 42 | **视频管线批量处理验证** — task 291/297 SUCCESS,NVIDIA 6 帧分析 ~15s/任务,events + event_details 落库正确 | ✅ 完成 | 2026-08-20 |
|
||
| 43 | **异步任务队列架构** — Edge 端 SQLite 队列 + TokenBucket 速率限制 (Gemini 1000 RPM, NVIDIA 40 RPM, burst 2x) + 消费者线程 | `02da23e` | 2026-08-20 |
|
||
| 44 | **NAS Dispatcher 重构为 enqueue 模式** — 上传视频后立即返回 202,不等 AI 处理结果 | `02da23e` | 2026-08-20 |
|
||
| 45 | **NAS Poller 线程** — 定期从 Edge /api/edge/results 拉取处理结果写 MariaDB | `02da23e` | 2026-08-20 |
|
||
| 46 | **fix: dispatcher/poller 超时分离模式** — timeout 改为 (connect, read) 元组,stale_timeout 3600→600s | `4f0f19b` | 2026-08-20 |
|
||
| 47 | **异步队列端到端验证** — task 312 (5.7MB e2e clip): 上传38s + Edge处理54s + Poller落库 = 93s 总耗时,event_id=12 落库 PASS | ✅ 完成 | 2026-08-20 |
|
||
| 48 | **分块断点续传上传** — 20MB/块 + 分块级重试(3次) + 断点查询 + /assemble 合并入队 | `b6c13a9` | 2026-08-20 |
|
||
| 49 | **串行上传 + 看门狗** — Dispatcher limit=1 避免带宽争抢 + 线程存活检测(is_alive) + 60s 看门狗自动重启 + 退避缩短至 30×(n+1)s | `881ea3f` | 2026-08-20 |
|
||
| 50 | **fix: 分块大小 5MB + chunk_size 变更防护** — Edge 端 total_chunks 变更自动清理旧分块;NAS 端断点续传检测 total_chunks 不匹配时从头上传;timeout (60,180) | `5915cf4` | 2026-08-20 |
|
||
|
||
### 待完成
|
||
|
||
| # | 任务 | 依赖 | 优先级 |
|
||
|---|------|------|--------|
|
||
| 48 | 单元测试 (JSON parser, circuit breaker, schema) | - | 中 |
|
||
| 49 | Tailscale 防火墙修复 (NAS↔Oracle) | - | 低 |
|
||
| 50 | daily_summaries 每日摘要 | - | 低 |
|
||
| 51 | **视频预压缩** — 360MB 生产视频 HTTP 上传超时/断连,需在 NAS 端预压缩后再上传 Edge(5MB 分块已缓解但 72 块仍需 ~18min) | - | 中 |
|
||
|
||
## 技术决策记录
|
||
|
||
1. **移除 google-generativeai SDK 硬依赖** - 代码用 requests 直接调 REST API,兼容 Python 3.8
|
||
2. **rsync 替代 git clone** - Oracle 无法直连 NAS Gitea (无 Tailscale),用 rsync 从本地同步
|
||
3. **num_predict 参数** - ARM CPU 上 qwen2.5:7b 生成速度较慢,限制输出 token 数控制延迟
|
||
4. **PyMySQL 替代 mysql-connector-python** - 45KB 纯 Python 替代 19MB C 扩展,NAS 无需编译
|
||
5. **MariaDB JSON 路径兼容** - MariaDB 10.11 不支持 MySQL 的 `$[*]` 通配符 JSON 路径和 `->` 操作符,name_member() 改用 Python 层解析 + 逐行 UPDATE
|
||
6. **Python 3.10 venv** - NAS 系统 Python 3.8 过旧,用 Synology Python3.10 包创建 venv
|
||
7. **FAM-Edge 聊天代理** - 历史:/api/edge/chat 直连 Ollama 代理;架构重构后被 `/api/edge/chat/ask` 三模型编排端点取代(旧端点保留兼容)
|
||
8. **Oracle 公网 IP 替代 Tailscale** - Tailscale 两节点在线但端口不通(防火墙),edge_url 和 qa_url 改用 Oracle 公网 IP 129.146.203.203
|
||
9. **Ollama 模型常驻内存** - systemd 加 `OLLAMA_KEEP_ALIVE=-1`,模型加载后永不卸载,消除 55s 冷启动延迟,常驻占用 4.3GB 内存(系统 12GB 够用)
|
||
10. **关键帧自适应帧数** - 原固定 5-8 帧对长视频太稀疏(30分钟仅8帧=每3.75分钟1帧),改为随视频时长自适应:候选帧 `clamp(duration_min×2, 30, 120)`,关键帧上限 `clamp(duration/150s, 8, 30)`。30分钟→12帧,60分钟→24帧,封顶30帧
|
||
11. **云端直出直存(架构重构)** - 本地 Ollama 完全移出视频链路:云端 VLM(Gemini 多图单请求 / NVIDIA 逐帧聚合)直接产出结构化 JSON,Edge 仅 `format_cloud_result` 格式化/校验(无模型调用)后直存 NAS DB。根因:CPU 版 Ollama 对无上限融合 prompt 预填充极慢导致 300s 超时
|
||
12. **Q&A 三模型降级编排** - 智能问答由 Edge `run_qa` 编排:Gemini → NVIDIA → 本地 Ollama(仅两云端都失败才启用本地兜底);各适配器实现 `chat()` 纯文本接口
|
||
13. **FFmpeg 快速 seek 替代 fps 滤镜** - 原方案 `ffmpeg -vf fps=1/interval` 需全解码视频,30min 360MB 视频在 ARM CPU 上需 180s+(超 120s 超时)。改为逐帧 `ffmpeg -ss <ts> -frames:v 1` 快速 seek,仅 33s(6-8x 提速)
|
||
14. **异步任务队列架构 (SQLite + TokenBucket)** - 原 Dispatcher 同步推送 360MB 视频至 Edge 等待 AI 处理,单任务阻塞 15+ 分钟导致后续任务积压。重构为:NAS Dispatcher 仅上传视频入 Edge SQLite 队列(202 立即返回)→ Edge 消费者线程异步处理(TokenBucket 按 API 限制 2x 速率:Gemini 1000 RPM / NVIDIA 40 RPM)→ NAS Poller 定期拉取结果写 MariaDB。e2e 验证:5.7MB 视频全链路 93s (上传 38s + 处理 54s + 落库 1s)
|
||
15. **超时分离模式** - `requests.post(timeout=300)` 对大文件上传无总超时限制(per-write 不触发),改为 `timeout=(10, 60)` 分离连接/读取超时,配合 stale_timeout 600s 回收僵尸任务
|
||
16. **生产视频预压缩(待实施)** - 360MB 30min 1080p H.264 视频跨公网 HTTP 上传超时/断连,需在 NAS 端 FFmpeg 预压缩(降分辨率/码率)后再上传
|
||
17. **串行上传策略** - Dispatcher 轮询 limit=1,一次只处理一个任务,避免多任务并行上传争抢带宽。NAS 上行带宽仅 ~1Mbps,并行上传会导致所有任务都超时
|
||
18. **5MB 分块大小** - 实测 NAS→Oracle 上行带宽 ~1Mbps:1MB 需 6s,5MB 需 35s,10MB 需 85s。20MB 分块在 ~1Mbps 下需 170s 超出 120s 读取超时。5MB 分块 + timeout(60,180) 在 ~35s/块 下有充裕余量,72 块 360MB 约 18min 完成上传
|
||
19. **chunk_size 变更防护** - Edge 端 upload_chunk 检测 total_chunks 变更(由 chunk_size 变化导致),自动清理旧分块防止混合不同大小分块导致 assemble 后文件损坏。NAS 端 _query_uploaded_chunks 比对 expected_total != edge_total 时跳过断点续传
|
||
20. **看门狗机制** - app.py 启动 daemon 看门狗线程,每 60s 检查 scheduler/dispatcher/poller 线程 is_alive(),崩溃自动 check_and_restart()。/api/status 改用 thread.is_alive() 替代 _running 标志,防止线程假死误报
|
||
|
||
## 视频上传问题根因排查与修复 (2026-08-20 15:45, commit 8cb5553)
|
||
|
||
**问题定性**: 网络问题 + 逻辑问题双重叠加
|
||
|
||
**网络层(已解决)**: NAS→Oracle 跨境上行带宽仅 ~1Mbps,360MB 原始视频上传需 10-20 分钟且频繁超时。
|
||
方案: NAS 端 FFmpeg 预压缩 (480p/CRF28/veryfast, 36 倍压缩比 360MB→22MB) + 5MB 分块断点续传。
|
||
|
||
**逻辑层(本次修复)**: 压缩方案生效后上传成功,但 Edge 端分析全部失败 "All models failed in visual analysis":
|
||
|
||
| # | Bug | 根因 | 修复 |
|
||
|---|-----|------|------|
|
||
| 1 | 全部视觉模型调用失败 | Edge 服务手动重启时未 source .env,GEMINI/NVIDIA API key 丢失 | config_loader 启动时自动加载 .env(export KEY=VALUE 格式,不覆盖已有环境变量) |
|
||
| 2 | 失败结果黑洞 | get_undelivered_results 只查 SUCCESS,FAILED 永不回传 NAS | 包含 FAILED 状态,/results 构造 failed 负载,NAS Poller 标记任务 FAILED |
|
||
| 3 | 重派发死锁 | INSERT OR IGNORE + UNIQUE(nas_task_id),失败后重传被静默忽略 | enqueue 检测 FAILED/已交付 SUCCESS 行时重置为 PENDING 重跑 |
|
||
| 4 | Poller 落库崩溃 | db_layer valid_stages 含 'process' 但 MariaDB ENUM 不含 → pymysql DataError 1265 | ALTER TABLE 扩展 ENUM + ddl.sql 同步 |
|
||
|
||
**验证结果**:
|
||
- Task 293 (压缩后 22.2MB): NVIDIA 降级路径分析成功,event_id=13 落库(Gemini 临时 503 自动降级)
|
||
- Task 295: 全链路成功 event_id=14(压缩 9.3min → 上传 1min → 分析 55s → Poller 落库)
|
||
- 流水线单任务周期 ~12 分钟,积压 ~20 个任务自动消化中
|
||
|
||
**运维要点**: Edge 重启务必 `source /opt/fam-edge/.env` 或使用 start_gunicorn.sh(代码已兜底自动加载 .env,双保险)
|
||
|
||
## 真实视频性能基准测试 (2026-08-20)
|
||
|
||
测试视频: `Generic_ONVIF-001-20260819-210403` (30分钟, 360MB, 1080p H.264)
|
||
|
||
| 步骤 | 耗时 | 详情 |
|
||
|------|------|------|
|
||
| 1. 视频传输 (NAS→Oracle) | 70s | 360MB, 5.1 MB/s (Tailscale) |
|
||
| 2a. FFmpeg 快速 seek 抽帧 | 33s | 60 张候选帧 (每30s一张) |
|
||
| 2b. OpenCV 关键帧筛选 | 5s | MSE 帧差 → 12 张关键帧 |
|
||
| 2c. 压缩 | 0.6s | 12 帧, 总 1.9MB |
|
||
| 3. Ollama llava-phi3 分析 | 820s | 12 帧, avg 68s/帧, 0.9 tokens/s |
|
||
| **总计** | **929s (15.5min)** | 30 分钟视频处理 |
|
||
|
||
AI 分析瓶颈: 帧5耗时 229s (疑似 ARM CPU 热降频), 其余帧 50-65s
|
||
|
||
## FAM-Core API 测试结果 (2026-08-20)
|
||
|
||
| 端点 | 方法 | 测试数据 | 结果 |
|
||
|------|------|---------|------|
|
||
| /health | GET | - | ✅ `{"service":"fam-core","status":"ok"}` |
|
||
| /api/status | GET | - | ✅ `{"dispatcher_running":true,"scheduler_running":true}` |
|
||
| /api/member/list | GET | - | ✅ 返回 2 名成员 (人物A未命名, 人物B=汤圆) |
|
||
| /api/member/unnamed | GET | - | ✅ 返回 1 名未命名成员 (人物A) |
|
||
| /api/member/name | POST | 人物A→张三 | ✅ 成功命名, 0 条事件记录回溯更新 |
|
||
| /api/chat/ask | POST | "今天有什么事件?" | ✅ 端到端成功, 回答"今天没有观察到张三" |
|
||
|
||
## 端到端聊天链路验证 (2026-08-20,新架构)
|
||
|
||
```
|
||
用户 → FAM-Core (NAS:8000) → FAM-Edge (Oracle:5000) → Gemini / NVIDIA NIM / 本地 Ollama (兜底)
|
||
/api/edge/chat/ask run_qa 三模型降级编排
|
||
```
|
||
|
||
- FAM-Core Chat-Handler 调用 `qa_url` 配置的 `http://129.146.203.203:5000/api/edge/chat/ask`(不再直连 Ollama)
|
||
- FAM-Edge `run_qa` 按 Gemini → NVIDIA → 本地 Ollama 顺序调用 `chat()`,首个成功即返回 `{answer, provider}`
|
||
- **验证结果**:
|
||
- Edge 单测:`/api/edge/chat/ask` → 200,`provider=nvidia`(Gemini 30s 超时后 NVIDIA 兜底成功,耗时 51s)
|
||
- NAS E2E:插入临时事件上下文后 `/api/chat/ask` → 43s 返回模型回答,`context_summary` 命中 1 条事件,chat_id 落库;测试数据已清理
|
||
- 无上下文时走短路分支(直接返回提示,不调 Edge),响应 <1s,属正常设计
|