fix: MariaDB JSON path compat for name_member + FAM-Core API verified
- name_member(): replace MySQL-only JSON_REPLACE/JSON_CONTAINS with wildcard JSON paths (unsupported in MariaDB 10.11) with Python-side JSON parsing - FAM-Core venv rebuilt with Python 3.10.20 on NAS - All API endpoints tested: health, status, member list, unnamed, naming - POST /api/member/name: 人物A successfully named to 张三 - PROGRESS.md updated with full test results and task completion
This commit is contained in:
52
PROGRESS.md
52
PROGRESS.md
@@ -1,16 +1,17 @@
|
|||||||
# 项目进度追踪
|
# 项目进度追踪
|
||||||
|
|
||||||
> 最后更新: 2026-08-19 23:30
|
> 最后更新: 2026-08-20 00:15
|
||||||
|
|
||||||
## 服务运行状态
|
## 服务运行状态
|
||||||
|
|
||||||
| 服务 | 节点 | 地址 | 状态 | 验证结果 |
|
| 服务 | 节点 | 地址 | 状态 | 验证结果 |
|
||||||
|------|------|------|------|---------|
|
|------|------|------|------|---------|
|
||||||
| FAM-Core | NAS | 0.0.0.0:8000 | ✅ 运行中 | health=ok, scheduler+dispatcher active |
|
| FAM-Core | NAS | 0.0.0.0:8000 | ✅ 运行中 | health=ok, Python 3.10 venv, API 全部测试通过 |
|
||||||
| FAM-Edge | Oracle | 0.0.0.0:5000 | ✅ 运行中 | health=ok, ollama healthy |
|
| FAM-Edge | Oracle | 0.0.0.0:5000 | ✅ 运行中 | health=ok, ollama healthy |
|
||||||
| MariaDB | NAS | 127.0.0.1:3306 | ✅ 运行中 | 10.11.11, 6 张表 |
|
| MariaDB | NAS | 127.0.0.1:3306 | ✅ 运行中 | 10.11.11, 6 张表, utf8mb4 |
|
||||||
| Ollama | Oracle | 127.0.0.1:11434 | ✅ 运行中 | llava-phi3, ≤8s (num_predict=30) |
|
| Ollama | Oracle | 127.0.0.1:11434 | ✅ 运行中 | llava-phi3, ≤8s (num_predict=30) |
|
||||||
| Tailscale | Oracle ↔ NAS | 100.74 ↔ 100.70 | ✅ 已组网 | 跨服务器健康检查通过 |
|
| Tailscale | Oracle ↔ NAS | 100.74 ↔ 100.70 | ✅ 已组网 | 跨服务器健康检查通过 |
|
||||||
|
| FAM-UI | NAS | 待启动:8501 | ⏳ 安装中 | Streamlit 安装进行中 |
|
||||||
|
|
||||||
## 环境状态
|
## 环境状态
|
||||||
|
|
||||||
@@ -33,13 +34,15 @@
|
|||||||
| 项目 | 状态 | 备注 |
|
| 项目 | 状态 | 备注 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
| 型号 | DS220+ (Geminilake) | DSM 7 |
|
| 型号 | DS220+ (Geminilake) | DSM 7 |
|
||||||
| Python | 3.8.15 | |
|
| Python | 3.8.15 (系统) + 3.10.20 (venv) | FAM-Core/UI venv 使用 Python 3.10 |
|
||||||
| pip3 | 未安装 | 待安装 |
|
| pip3 | venv 内可用 | fam-core/venv + fam-ui/venv |
|
||||||
| MariaDB | **10.11.11 已运行** | 端口 3306, root 密码 iLoveJava5! |
|
| MariaDB | **10.11.11 已运行** | 端口 3306, root 密码 iLoveJava5! |
|
||||||
| sentinel_home_ai 库 | **6 张表已创建** | DDL 执行成功 |
|
| sentinel_home_ai 库 | **6 张表已创建** | DDL 执行成功 |
|
||||||
| Docker | 24.0.2 (ContainerManager) | 路径 /var/packages/ContainerManager/target/usr/bin/docker |
|
| Docker | 24.0.2 (ContainerManager) | 路径 /var/packages/ContainerManager/target/usr/bin/docker |
|
||||||
| Tailscale | **已运行** | IP: 100.70.234.39, hostname: ericwyuan-nas |
|
| Tailscale | **已运行** | IP: 100.70.234.39, hostname: ericwyuan-nas |
|
||||||
| Streamlit | 未安装 | 待安装 |
|
| FAM-Core venv | ✅ 已创建 | Python 3.10.20, flask/PyMySQL/gunicorn/PyYAML/requests |
|
||||||
|
| FAM-UI venv | ✅ 已创建 | Python 3.10.20, Streamlit 安装中 |
|
||||||
|
| Streamlit | ⏳ 安装中 | pip install streamlit 后台运行 |
|
||||||
|
|
||||||
### 网络互通 (Tailscale)
|
### 网络互通 (Tailscale)
|
||||||
| 节点 | Tailscale IP | 状态 |
|
| 节点 | Tailscale IP | 状态 |
|
||||||
@@ -87,25 +90,40 @@
|
|||||||
| 10 | OllamaAdapter 优化 (num_predict) | `50d8353` | 2026-08-19 |
|
| 10 | OllamaAdapter 优化 (num_predict) | `50d8353` | 2026-08-19 |
|
||||||
| 11 | Tailscale 安装 (Oracle + NAS) + 认证 | `e5ac667` | 2026-08-19 |
|
| 11 | Tailscale 安装 (Oracle + NAS) + 认证 | `e5ac667` | 2026-08-19 |
|
||||||
| 12 | NAS MariaDB DDL 执行 (6 张表) | `e5ac667` | 2026-08-19 |
|
| 12 | NAS MariaDB DDL 执行 (6 张表) | `e5ac667` | 2026-08-19 |
|
||||||
| 13 | db_layer.py 切换 PyMySQL (45KB 替代 19MB) | 进行中 | 2026-08-19 |
|
| 13 | db_layer.py 切换 PyMySQL (45KB 替代 19MB) | ✅ 完成 | 2026-08-19 |
|
||||||
| 14 | config_loader.py 路径修复 (3 级 dirname) | 进行中 | 2026-08-19 |
|
| 14 | config_loader.py 路径修复 (3 级 dirname) | ✅ 完成 | 2026-08-19 |
|
||||||
| 15 | NAS Python 依赖安装 (flask/gunicorn/pymysql/PyYAML) | 进行中 | 2026-08-19 |
|
| 15 | NAS Python 依赖安装 (flask/gunicorn/pymysql/PyYAML) | ✅ 完成 | 2026-08-19 |
|
||||||
| 16 | NAS 代码部署 + FAM-Core 导入验证 PASS | 进行中 | 2026-08-19 |
|
| 16 | NAS 代码部署 + FAM-Core 导入验证 PASS | ✅ 完成 | 2026-08-19 |
|
||||||
| 17 | NAS DB 连接验证 PASS (PyMySQL → MariaDB 10.11.11) | 进行中 | 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 |
|
| 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 |
|
||||||
|
|
||||||
### 待完成
|
### 待完成
|
||||||
|
|
||||||
| # | 任务 | 依赖 | 优先级 |
|
| # | 任务 | 依赖 | 优先级 |
|
||||||
|---|------|------|--------|
|
|---|------|------|--------|
|
||||||
| 19 | NAS 启动 FAM-Core (gunicorn) | 依赖安装 ✅ | 高 |
|
| 23 | NAS 安装 Streamlit + 部署 FAM-UI | pip3 ✅ | 中 |
|
||||||
| 20 | Oracle 启动 FAM-Edge (gunicorn) | 依赖安装 ✅ | 高 |
|
| 24 | 端到端集成测试 | FAM-Core ✅ + FAM-Edge ✅ | 高 |
|
||||||
| 21 | NAS 安装 Streamlit + 部署 FAM-UI | pip3 ✅ | 中 |
|
| 25 | 单元测试 (JSON parser, circuit breaker, schema) | - | 中 |
|
||||||
| 22 | 端到端集成测试 | FAM-Core + FAM-Edge 启动 | 高 |
|
|
||||||
| 23 | 单元测试 (JSON parser, circuit breaker, schema) | - | 中 |
|
|
||||||
|
|
||||||
## 技术决策记录
|
## 技术决策记录
|
||||||
|
|
||||||
1. **移除 google-generativeai SDK 硬依赖** - 代码用 requests 直接调 REST API,兼容 Python 3.8
|
1. **移除 google-generativeai SDK 硬依赖** - 代码用 requests 直接调 REST API,兼容 Python 3.8
|
||||||
2. **rsync 替代 git clone** - Oracle 无法直连 NAS Gitea (无 Tailscale),用 rsync 从本地同步
|
2. **rsync 替代 git clone** - Oracle 无法直连 NAS Gitea (无 Tailscale),用 rsync 从本地同步
|
||||||
3. **num_predict 参数** - ARM CPU 上 llava-phi3 生成速度较慢,限制输出 token 数控制延迟
|
3. **num_predict 参数** - ARM CPU 上 llava-phi3 生成速度较慢,限制输出 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
|
||||||
|
|
||||||
|
## 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 条事件记录回溯更新 |
|
||||||
|
|||||||
@@ -384,15 +384,33 @@ def name_member(abstract_label: str, real_name: str, named_by: str) -> Dict:
|
|||||||
updated_details_count = cursor.rowcount
|
updated_details_count = cursor.rowcount
|
||||||
|
|
||||||
# 4. 批量回溯更新 monitor_events.entities_json
|
# 4. 批量回溯更新 monitor_events.entities_json
|
||||||
|
# MariaDB 10.11 不支持 MySQL 的 $[*] 通配符 JSON 路径,
|
||||||
|
# 改用 Python 层解析 + 逐行更新
|
||||||
cursor.execute(
|
cursor.execute(
|
||||||
"""UPDATE monitor_events
|
"SELECT event_id, entities_json FROM monitor_events WHERE entities_json LIKE %s",
|
||||||
SET entities_json = JSON_REPLACE(
|
(f'%{abstract_label}%',)
|
||||||
entities_json, '$[*].person', %s
|
|
||||||
)
|
|
||||||
WHERE JSON_CONTAINS(entities_json->'$[*].person', JSON_QUOTE(%s))""",
|
|
||||||
(real_name, abstract_label)
|
|
||||||
)
|
)
|
||||||
updated_events_count = cursor.rowcount
|
import json as _json
|
||||||
|
updated_events_count = 0
|
||||||
|
for eid, entities_raw in cursor.fetchall():
|
||||||
|
if not entities_raw:
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
entities = _json.loads(entities_raw) if isinstance(entities_raw, str) else entities_raw
|
||||||
|
except (ValueError, TypeError):
|
||||||
|
continue
|
||||||
|
changed = False
|
||||||
|
if isinstance(entities, list):
|
||||||
|
for ent in entities:
|
||||||
|
if isinstance(ent, dict) and ent.get('person') == abstract_label:
|
||||||
|
ent['person'] = real_name
|
||||||
|
changed = True
|
||||||
|
if changed:
|
||||||
|
cursor.execute(
|
||||||
|
"UPDATE monitor_events SET entities_json = %s WHERE event_id = %s",
|
||||||
|
(_json.dumps(entities, ensure_ascii=False), eid)
|
||||||
|
)
|
||||||
|
updated_events_count += 1
|
||||||
|
|
||||||
conn.commit()
|
conn.commit()
|
||||||
return {
|
return {
|
||||||
|
|||||||
Reference in New Issue
Block a user