J.B-Lin commited on
Commit
50bb88b
·
1 Parent(s): 2d207a7

docs: 全面更新README,同步最新UI架构与部署状态

Browse files
Files changed (1) hide show
  1. README.md +89 -13
README.md CHANGED
@@ -39,8 +39,11 @@ PregoPal 是一款面向孕期家庭的 AI 陪护工具,支持:
39
  | 🍽️ 今日菜品推荐(营养+家庭能力) | 基线可用 | `modules/meal_recommender.py` |
40
  | 📝 饮食记录储存(JSON + Markdown) | 已实现 | `modules/diet_logger.py` + `modules/diet_extractor.py` |
41
  | 📊 营养分析与可视化报告 | 基线可用 | `modules/nutrition_analyzer.py` + `modules/nutrition_standards.py` |
 
42
 
43
- **技术栈**: Python 3.13 · Gradio 6.16 · MiniCPM-o 4.5 · Matplotlib · Pandas
 
 
44
 
45
  ---
46
 
@@ -48,7 +51,7 @@ PregoPal 是一款面向孕期家庭的 AI 陪护工具,支持:
48
 
49
  ```
50
  app.py ← Gradio 薄入口
51
- ├── ui/app_builder.py ← 前端 Tab 布局(4 Tab: 首页/家庭/总结/报告)
52
  ├── loop.py ← 每日自动分析循环(状态机)
53
  │ ├── plugins/base.py ← 插件基类(LoopPlugin, PluginRegistry, LoopContext)
54
  │ ├── plugins/family_quiz.py ← 家庭问卷插件(菜谱/体重检查)
@@ -57,7 +60,7 @@ app.py ← Gradio 薄入口
57
  │ ├── plugins/family_memory.py← 家庭记忆处理
58
  │ ├── plugins/dri_analysis.py ← DRIs 营养对比分析
59
  │ ├── plugins/briefing_generator.py ← 今日简报生成
60
- │ ├── plugins/three_day_summary.py ← 三天综合总结
61
  │ └── plugins/preset_writer.py ← 预设/缓存写入
62
  ├── modules/ ← 核心业务逻辑(纯函数/无状态)
63
  │ ├── voiceprint.py ← 声纹识别
@@ -73,7 +76,10 @@ app.py ← Gradio 薄入口
73
  │ ├── vision_processor.py ← 视觉处理
74
  │ └── conversation_manager.py ← 对话管理
75
  ├── config.py ← 全局配置(路径/常量/数据模板)
76
- ├── utils.py ← 工具函数(CSS/翻译/HTML渲染/中文字体设置
 
 
 
77
  └── data/ ← 持久化存储
78
  ├── diet_logs.json ← 结构化饮食记录 JSON
79
  ├── nutrition_db.json ← 营养数据库 JSON
@@ -424,7 +430,7 @@ class LoopPlugin(ABC):
424
  | `FamilyMemoryPlugin` | `SUMMARIZE` | `plugins/family_memory.py` | 提取家庭记忆 |
425
  | `DRIAnalysisPlugin` | `ANALYZE` | `plugins/dri_analysis.py` | DRIs 营养对比 |
426
  | `BriefingGeneratorPlugin` | `BRIEF` | `plugins/briefing_generator.py` | 汇总生成今日简报 |
427
- | `ThreeDaySummaryPlugin` | `THREE_DAY` | `plugins/three_day_summary.py` | 三天综合总结 |
428
  | `PresetWriterPlugin` | `CONSOLIDATE` | `plugins/preset_writer.py` | 写入预设/缓存 |
429
 
430
  **插件向 `ctx.briefing` 写入的 key**(`BriefingGeneratorPlugin` 最终消费):
@@ -440,6 +446,7 @@ ctx.briefing["dri_analysis"] # dict {"focus_nutrients","summary"}
440
  ctx.briefing["recommended_foods"] # list[str]
441
  ctx.briefing["family_memory"] # dict
442
  ctx.briefing["thinking_keywords"] # str
 
443
  ```
444
 
445
  ---
@@ -480,11 +487,15 @@ ctx.briefing["thinking_keywords"] # str
480
 
481
  ```
482
  Cline A: Modules 强化(营养分析对接 DRIs、菜谱推荐 AI 化)
483
- Cline B: UI 界面优化(Gradio 前端增强、报告模板美化) ← 当前 Cline
484
  Cline C: 声纹升级(Whisper encoder 替换频谱特征)
485
  Cline D: 数据处理与插件增强(diet_extractor fallback、新插件)
 
486
  ```
487
 
 
 
 
488
  ### 7.2 关键约定
489
 
490
  1. **改接口前先 grep**:用 `search_files` 搜索方法名找到所有调用方
@@ -539,28 +550,37 @@ chore: 配置/依赖/路径调整
539
 
540
  ### 8.1 页面结构
541
 
542
- 4 Tab 布局,使用 **唯一一个 `@gr.render`** 包裹全部 Tab(避免 Gradio 内部字典迭代崩溃):
543
 
544
  | Tab | ID | 功能 |
545
  |-----|----|------|
546
  | 🏠 首页 | `tab_home` | 语音按钮 + AI 思考 + 信息卡片 + 最近记录 |
547
  | 👨‍👩‍👧‍👦 家庭 | `tab_family` | 家庭菜谱/偏好/记事 HTML 卡片展示 |
548
- | 📊 总结 | `tab_summary` | 三天营养分析 + 菜单建议 |
549
- | 📈 报告 | `tab_report` | 纯 HTML 营养仪表盘(无需 matplotlib) |
 
 
 
 
550
 
551
  ### 8.2 设计风格
552
 
553
  - **Glassmorphism 毛玻璃**:`backdrop-filter: blur(20px)` 半透明卡片
554
  - **粉色暖调主题**:主色 `#E91E63`、渐变 `#FF6B9D → #FFD6E0`
555
- - **纯 HTML 渲染**:家庭信息卡、营养报告均使用 HTML + CSS,无需生成图片
556
  - **中英文切换**:`lang_state` 驱动唯一 `@gr.render`
 
 
 
 
557
 
558
  ### 8.3 关键文件
559
 
560
  | 文件 | 职责 |
561
  |------|------|
562
- | `ui/app_builder.py` | Gradio 界面构建(4 Tab + 语言切换) |
563
- | `utils.py` | CSS 定义 + 翻译字典 + HTML 渲染函数(家庭卡片 + 营养仪表盘) |
 
564
 
565
  ---
566
 
@@ -588,8 +608,64 @@ Model to be Used: MiniCPM-o 4.5
588
 
589
  核心能力层(`core/` 目录)提供模型加载、语音处理、视觉处理、对话管理的底层能力封装。详见各文件 docstring。
590
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
591
  ---
592
 
593
- *最后更新: 2026-06-09 | 由 PregoPal Cline 团队维护*
594
 
595
  > **⚠️ 重要提醒**:本 README 是所有并行 Cline 的协作基础,任何 Cline 在修改代码后,若涉及接口、数据格式、配置的变更,必须同步更新本文件。不得随意简化、删除结构性内容。
 
39
  | 🍽️ 今日菜品推荐(营养+家庭能力) | 基线可用 | `modules/meal_recommender.py` |
40
  | 📝 饮食记录储存(JSON + Markdown) | 已实现 | `modules/diet_logger.py` + `modules/diet_extractor.py` |
41
  | 📊 营养分析与可视化报告 | 基线可用 | `modules/nutrition_analyzer.py` + `modules/nutrition_standards.py` |
42
+ | 🤖 多模态大模型后端(MiniCPM-o 4.5) | ✅ 已部署 Modal | `modal_deploy/deploy.py` + `modal_deploy/client.py` |
43
 
44
+ **技术栈**: Python 3.13 · Gradio 6.16 · MiniCPM-o 4.5 · Modal · Matplotlib · Pandas
45
+
46
+ **大模型部署状态**:✅ 已完成,详见 [第11节](#11-多模态大模型部署-modal)
47
 
48
  ---
49
 
 
51
 
52
  ```
53
  app.py ← Gradio 薄入口
54
+ ├── ui/app_builder.py ← 前端 Tab 布局(3 Tab: 首页/家庭/营养报告)
55
  ├── loop.py ← 每日自动分析循环(状态机)
56
  │ ├── plugins/base.py ← 插件基类(LoopPlugin, PluginRegistry, LoopContext)
57
  │ ├── plugins/family_quiz.py ← 家庭问卷插件(菜谱/体重检查)
 
60
  │ ├── plugins/family_memory.py← 家庭记忆处理
61
  │ ├── plugins/dri_analysis.py ← DRIs 营养对比分析
62
  │ ├── plugins/briefing_generator.py ← 今日简报生成
63
+ │ ├── plugins/three_day_summary.py ← 三天深度缺失分析(数据由营养报告Tab调用)
64
  │ └── plugins/preset_writer.py ← 预设/缓存写入
65
  ├── modules/ ← 核心业务逻辑(纯函数/无状态)
66
  │ ├── voiceprint.py ← 声纹识别
 
76
  │ ├── vision_processor.py ← 视觉处理
77
  │ └── conversation_manager.py ← 对话管理
78
  ├── config.py ← 全局配置(路径/常量/数据模板)
79
+ ├── utils.py ← 工具函数(CSS/翻译/HTML渲染/营养报告+三天缺失分析
80
+ ├── modal_deploy/ ← Modal 部署层
81
+ │ ├── deploy.py ← Modal ASGI 部署入口(llama-server → FastAPI)
82
+ │ └── client.py ← Python API 客户端(chat / chat_with_image / embed)
83
  └── data/ ← 持久化存储
84
  ├── diet_logs.json ← 结构化饮食记录 JSON
85
  ├── nutrition_db.json ← 营养数据库 JSON
 
430
  | `FamilyMemoryPlugin` | `SUMMARIZE` | `plugins/family_memory.py` | 提取家庭记忆 |
431
  | `DRIAnalysisPlugin` | `ANALYZE` | `plugins/dri_analysis.py` | DRIs 营养对比 |
432
  | `BriefingGeneratorPlugin` | `BRIEF` | `plugins/briefing_generator.py` | 汇总生成今日简报 |
433
+ | `ThreeDaySummaryPlugin` | `THREE_DAY` | `plugins/three_day_summary.py` | 三天深度缺失分析(被营养报告Tab调用) |
434
  | `PresetWriterPlugin` | `CONSOLIDATE` | `plugins/preset_writer.py` | 写入预设/缓存 |
435
 
436
  **插件向 `ctx.briefing` 写入的 key**(`BriefingGeneratorPlugin` 最终消费):
 
446
  ctx.briefing["recommended_foods"] # list[str]
447
  ctx.briefing["family_memory"] # dict
448
  ctx.briefing["thinking_keywords"] # str
449
+ ctx.briefing["three_day_summary"] # dict(由报告Tab选择性地读取)
450
  ```
451
 
452
  ---
 
487
 
488
  ```
489
  Cline A: Modules 强化(营养分析对接 DRIs、菜谱推荐 AI 化)
490
+ Cline B: UI 界面优化(Gradio 前端增强、报告模板美化) ← 当前 Cline
491
  Cline C: 声纹升级(Whisper encoder 替换频谱特征)
492
  Cline D: 数据处理与插件增强(diet_extractor fallback、新插件)
493
+ Cline E: 大模型集成(对接 Modal API,实现全双工语音对话) ← 新增(部署已完成)
494
  ```
495
 
496
+ > 注:MiniCPM-o 4.5 已在 Modal 完成部署,API 客户端 `modal_deploy/client.py` 已就绪。
497
+ > 接下来可并行推进:A) 前端接入大模型 B) 营养分析对接 DRIs C) 声纹升级。
498
+
499
  ### 7.2 关键约定
500
 
501
  1. **改接口前先 grep**:用 `search_files` 搜索方法名找到所有调用方
 
550
 
551
  ### 8.1 页面结构
552
 
553
+ 3 Tab 布局,使用 **唯一一个 `@gr.render`** 包裹全部 Tab(避免 Gradio 内部字典迭代崩溃):
554
 
555
  | Tab | ID | 功能 |
556
  |-----|----|------|
557
  | 🏠 首页 | `tab_home` | 语音按钮 + AI 思考 + 信息卡片 + 最近记录 |
558
  | 👨‍👩‍👧‍👦 家庭 | `tab_family` | 家庭菜谱/偏好/记事 HTML 卡片展示 |
559
+ | 📈 营养报告 | `tab_report` | 纯 HTML 营养仪表盘 + 三天缺失深度分析(已合并) |
560
+
561
+ > **架构变更说明**(v2.0):
562
+ > - 原「三天总结」Tab **已合并到营养报告 Tab** 中,作为一个统一下沉展示区块
563
+ > - 营养报告使用 Slider 防抖自动生成(0.8s),包含基础营养评分 + 三天缺失深度分析
564
+ > - 三天缺失分析页面使用与营养报告一致的设计语言(渐变 Header + 紧凑标签 + 结构化 Summary)
565
 
566
  ### 8.2 设计风格
567
 
568
  - **Glassmorphism 毛玻璃**:`backdrop-filter: blur(20px)` 半透明卡片
569
  - **粉色暖调主题**:主色 `#E91E63`、渐变 `#FF6B9D → #FFD6E0`
570
+ - **纯 HTML 渲染**:家庭信息卡、营养报告、三天缺失分析均使用 HTML + CSS,无需生成图片
571
  - **中英文切换**:`lang_state` 驱动唯一 `@gr.render`
572
+ - **三天缺失分析**:
573
+ - 持续不足营养素采用**紧凑标签式**显示(pill 标签,一行多个)
574
+ - 食材补充建议区域采用 **1:2 扩大布局**(右侧占 2/3 宽度,每行 6 个食物标签)
575
+ - 总结部分采用**结构化 UI 卡片**(红色/橙色/绿色 左侧边框,按严重程度分类显示)
576
 
577
  ### 8.3 关键文件
578
 
579
  | 文件 | 职责 |
580
  |------|------|
581
+ | `ui/app_builder.py` | Gradio 界面构建(3 Tab + 语言切换 + 报告自动生成) |
582
+ | `utils.py` | CSS 定义 + 翻译字典 + HTML 渲染函数(家庭卡片 + 营养仪表盘 + 三天缺失分析) |
583
+ | `plugins/three_day_summary.py` | 三天缺失分析插件(数据层,被报告 Tab 异步调用) |
584
 
585
  ---
586
 
 
608
 
609
  核心能力层(`core/` 目录)提供模型加载、语音处理、视觉处理、对话管理的底层能力封装。详见各文件 docstring。
610
 
611
+ **部署状态**: ✅ 已完成 Modal 部署(见第11节)
612
+
613
+ ---
614
+
615
+ ## 11. 多模态大模型部署 (Modal)
616
+
617
+ ### 11.1 部署状态
618
+
619
+ | 项目 | 状态 |
620
+ |------|------|
621
+ | API URL | `https://andrew-jiabin--prego-pal-minicpm-serve.modal.run` |
622
+ | Modal App | `prego-pal-minicpm` |
623
+ | GPU | A100 (40GB) |
624
+ | 模型 | MiniCPM-o 4.5 Q4_K_M (~12GB) + vision/audio/TTS 投影层 |
625
+ | 冷启动 | ~2-8 分钟(首次请求触发容器启动 + 模型加载) |
626
+ | 闲置缩容 | 300s 无请求自动缩容 |
627
+ | 并发 | `max_inputs=10` |
628
+
629
+ ### 11.2 API 端点
630
+
631
+ | 端点 | 方法 | 功能 |
632
+ |------|------|------|
633
+ | `/v1/chat/completions` | POST | OpenAI 兼容聊天(文本) |
634
+ | `/v1/embeddings` | POST | 文本嵌入 |
635
+ | `/v1/models` | GET | 模型列表 |
636
+ | `/v1/multimodal/chat` | POST | 多模态(图片+文本) |
637
+ | `/health` | GET | 健康检查 |
638
+ | `/` | GET | 服务信息 |
639
+
640
+ ### 11.3 Python 客户端
641
+
642
+ ```python
643
+ from modal_deploy.client import MiniCPMClient
644
+
645
+ client = MiniCPMClient(base_url="https://andrew-jiabin--prego-pal-minicpm-serve.modal.run")
646
+
647
+ # 文本对话
648
+ response = client.ask("今天孕妇可以吃什么?")
649
+
650
+ # 多模态(图片理解)
651
+ response = client.describe_image(image_base64_str)
652
+
653
+ # 嵌入向量
654
+ embeddings = client.embed(["孕期饮食建议", "番茄牛腩"])
655
+ ```
656
+
657
+ 详见 `modal_deploy/client.py` 完整文档。
658
+
659
+ ### 11.4 部署文件
660
+
661
+ | 文件 | 说明 |
662
+ |------|------|
663
+ | `modal_deploy/deploy.py` | Modal ASGI 部署入口(llama-server → FastAPI 包装) |
664
+ | `modal_deploy/client.py` | Python API 客户端(chat / chat_with_image / embed) |
665
+ | `docs/部署经验_Modal_MiniCPM-o.md` | 详细部署经验文档(踩坑记录、成本估算、后续优化) |
666
+
667
  ---
668
 
669
+ *最后更新: 2026-06-10 | 由 PregoPal Cline 团队维护*
670
 
671
  > **⚠️ 重要提醒**:本 README 是所有并行 Cline 的协作基础,任何 Cline 在修改代码后,若涉及接口、数据格式、配置的变更,必须同步更新本文件。不得随意简化、删除结构性内容。