# SmartDietian **Repository Path**: zeron2022/smart-dietian ## Basic Information - **Project Name**: SmartDietian - **Description**: 一个基于大语言模型的 AI 私人厨师应用。用户上传食材图片或描述食材清单,LangChain/LangGraph Agent 自动识别食材、搜索食谱,从营养价值和制作难度多维度评分排序,返回结构化的推荐报告。 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2026-07-26 - **Last Updated**: 2026-07-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Smart Dietian(智能私厨) 一个基于大语言模型的 AI 私人厨师应用。用户上传食材图片或描述食材清单,LangChain/LangGraph Agent 自动识别食材、搜索食谱,从营养价值和制作难度多维度评分排序,返回结构化的推荐报告。 ## 核心特性 - **多模态识别**:支持上传食材图片,LLM 自动辨识并评估新鲜度与可用量 - **智能食谱搜索**:Agent 自动调用 Tavily 搜索引擎检索可行菜谱 - **多维度评分排序**:从营养价值和制作难度两个维度量化打分,简单又营养的排名靠前 - **结构化推荐报告**:包含食谱信息、得分、推荐理由的完整建议报告 - **流式对话**:基于 SSE (Server-Sent Events) 的实时流式响应 - **会话管理**:支持多会话历史记录,可切换、删除历史会话 - **国际化**:支持中英文界面切换(vue-i18n) - **Markdown 渲染**:AI 回复自动渲染为格式化内容 ## 效果展示 以下是 Smart Dietian 的实际运行效果:
## 技术栈 ### 后端 | 技术 | 版本 | 用途 | |------|------|------| | FastAPI | 0.128.0 | Web 框架 | | LangChain | 1.2.3 | LLM 应用框架 | | LangGraph | 0.7.60 | Agent 状态图编排 | | langgraph-checkpoint-redis | 0.4.0 | Redis 会话记忆持久化 | | langchain-tavily | 0.2.17 | Tavily 网络搜索工具 | | Uvicorn | 0.40.0 | ASGI 服务器 | | Redis Stack | latest | 向量存储 + RediSearch | | 阿里云 OSS v2 | 1.2.4 | 图片对象存储 | **LLM 模型**:通义千问 Qwen 3.7 Plus(通过 DashScope OpenAI 兼容 API) ### 前端 | 技术 | 版本 | 用途 | |------|------|------| | Vue 3 | 3.5.13 | 前端框架 | | TypeScript | 5.8.3 | 类型系统 | | Vite | 6.3.2 | 构建工具 | | TailwindCSS | 3.4.17 | 样式框架 | | Pinia | 3.0.2 | 状态管理 | | vue-i18n | 11.1.3 | 国际化 | | Lucide Vue Next | 0.474.0 | 图标库 | | markdown-it | 14.1.0 | Markdown 渲染 | ## 项目结构 ``` SmartDietian/ ├── app/ # 后端应用 │ ├── agent/ │ │ └── personal_chief.py # LangGraph Agent 核心(LLM、工具、记忆、流式输出) │ ├── api/ │ │ └── v1/ │ │ ├── chat.py # 对话接口(流式对话 / 历史消息 / 会话列表) │ │ └── oss.py # OSS 预签名上传 URL 接口 │ ├── models/ │ │ └── schemas.py # Pydantic 请求/响应模型 │ ├── common/ │ │ └── logger.py # 日志配置 │ ├── static/ # 前端构建产物(Vite build 输出) │ └── main.py # FastAPI 入口(CORS、路由、SPA fallback) ├── frontend/ # 前端源码 │ ├── src/ │ │ ├── api/ # API 调用(chat.ts / oss.ts) │ │ ├── components/ # Vue 组件 │ │ │ ├── AppHeader.vue # 顶部导航栏 │ │ │ ├── AppChat.vue # 主聊天区域(流式消息 + 图片上传) │ │ │ ├── ChatSidebar.vue # 历史会话侧边栏 │ │ │ ├── ChatMessage.vue # 消息气泡(Markdown 渲染) │ │ │ ├── ChatInput.vue # 输入框(文本 + 图片选择) │ │ │ └── ChatEmpty.vue # 空状态引导 │ │ ├── composables/ # 组合式函数 │ │ │ ├── useChat.ts # 会话管理逻辑 │ │ │ └── useImageUpload.ts # 图片上传流程 │ │ ├── locales/ # 国际化文件(zh-CN / en) │ │ └── assets/ # 静态资源 │ ├── index.html │ ├── package.json │ ├── vite.config.ts # Vite 配置(代理 + 构建输出路径) │ └── tailwind.config.js ├── .env # 环境变量(不提交) ├── .gitignore ├── CLAUDE.md # AI 辅助开发指南 ├── pyproject.toml # Python 项目配置 ├── uv.lock # uv 依赖锁文件 └── README.md ``` ## 系统架构 ``` 用户 → Vue 3 SPA → FastAPI → LangGraph Agent ├── Qwen 3.7 Plus (多模态 LLM) ├── Tavily Search (网络搜索) ├── Redis Stack (会话记忆/Checkpoint) └── 阿里云 OSS (图片存储) ``` ### 数据流 1. 用户在前端输入食材描述或上传图片 2. 若上传图片,前端通过 OSS 预签名 URL 直传到阿里云 OSS 3. 前端通过 `POST /api/v1/chat/stream` 以 SSE 方式发送请求 4. Agent 接收多模态消息(文本 + 图片 URL),按流程处理: - 识别食材 → 搜索食谱 → 评分排序 → 生成推荐报告 5. 响应实时流式返回前端,Markdown 渲染展示 6. 会话状态通过 Redis Checkpoint 持久化,支持历史回顾 ## 环境要求 - **Python**: >= 3.13 - **Node.js**: >= 18(推荐 22.22.2) - **Redis Stack**:含 RediSearch 模块(Docker 推荐) - **包管理器**: - Python:`uv`(推荐) - Node.js:`npm` ## 快速开始 ### 1. 克隆项目 ```bash git clone https://gitee.com/yuanwang99/smart-dietian.git cd smart-dietian ``` ### 2. 启动 Redis Stack ```bash docker run -d --name redis-stack -p 6379:6379 redis/redis-stack:latest ``` ### 3. 配置环境变量 创建 `.env` 文件: ```env # 通义千问 API(DashScope OpenAI 兼容接口) DASHSCOPE_API_KEY=your_dashscope_api_key DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1 # Tavily 搜索 API TAVILY_API_KEY=your_tavily_api_key # 阿里云 OSS 配置 OSS_ACCESS_KEY_ID=your_access_key_id OSS_ACCESS_KEY_SECRET=your_access_key_secret OSS_ENDPOINT=oss-cn-beijing.aliyuncs.com OSS_BUCKET=your_bucket_name # Redis 配置 REDIS_HOST=localhost REDIS_PORT=6379 REDIS_DB=0 ``` ### 4. 后端部署 ```bash # 安装依赖 uv sync # 启动开发服务器(热重载) python -m app.main ``` 服务运行在 http://127.0.0.1:8001,访问 `/docs` 查看 Swagger API 文档。 ### 5. 前端开发 ```bash cd frontend # 安装依赖 npm install # 启动开发服务器 npm run dev ``` 前端开发服务器运行在 http://localhost:5173,API 请求自动代理到后端。 ### 6. 生产构建 ```bash # 构建前端(输出到 app/static/) cd frontend && npm run build # 启动生产服务器 cd .. && uvicorn app.main:app --host 0.0.0.0 --port 8001 ``` 构建后前端静态文件集成在后端服务中,只需启动后端即可访问完整应用。 ## API 接口 基础 URL:`http://127.0.0.1:8001/api/v1` ### 对话 | 方法 | 路径 | 说明 | |------|------|------| | POST | `/chat/stream` | 流式对话(SSE),支持文本 + 图片多模态输入 | | GET | `/chat/messages?thread_id=xxx` | 获取指定会话的历史消息 | | DELETE | `/chat/messages?thread_id=xxx` | 删除指定会话 | | GET | `/chat/threads` | 获取所有会话列表 | #### 流式对话请求示例 ```json { "message": "这些食材可以做什么菜?", "image_url": "https://bucket.oss-cn-beijing.aliyuncs.com/food.jpg", "thread_id": "550e8400-e29b-41d4-a716-446655440000" } ``` ### 文件上传 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/oss/presign?filename=food.jpg` | 获取 OSS 预签名上传 URL | 返回 `uploadUrl`(用于客户端直传)和 `accessUrl`(图片访问地址)。 ## Agent 工作流程 ``` 用户输入(食材图片/文字) │ ▼ ┌─────────────────────────────┐ │ 1. 识别和评估食材 │ │ 辨识可见食材,评估新鲜度 │ │ 整理「当前可用食材清单」 │ ├─────────────────────────────┤ │ 2. 智能食谱检索 │ │ 调用 Tavily 搜索食谱 │ ├─────────────────────────────┤ │ 3. 多维度评估排序 │ │ 营养价值 + 制作难度 打分 │ │ 简单营养的排名靠前 │ ├─────────────────────────────┤ │ 4. 结构化方案输出 │ │ 食谱信息 / 得分 / 推荐理由 │ └─────────────────────────────┘ │ ▼ 流式输出 → 前端 Markdown 渲染 ``` ## 核心模块说明 ### Agent(`app/agent/personal_chief.py`) - 基于 LangChain `create_agent` 构建 - 使用 **Qwen 3.7 Plus** 多模态模型,支持图文理解 - 集成 **Tavily Search** 作为网络搜索工具 - 通过 **RedisSaver** 实现 LangGraph Checkpoint 会话持久化 - 支持 `stream_mode="messages"` 逐 token 流式输出 ### 前端会话管理(`useChat.ts` + `ChatSidebar.vue`) - 自动生成 UUID 作为 thread_id,存储在 localStorage - 支持多会话切换、历史消息加载 - 侧边栏展示所有会话预览,支持删除操作 - 流式响应期间可中断(AbortController) ### 图片上传(`useImageUpload.ts` + `oss.ts`) - 前端选择图片后本地预览 - 通过 OSS 预签名 URL 客户端直传,不经过后端中转 - 上传完成后返回可访问的 HTTPS URL,随对话请求发送给 Agent ## 开发指南 ### IDE 配置(Claude Code) 项目包含 `CLAUDE.md` 文件,为 Claude Code(VS Code 扩展)提供上下文指导。推荐使用 Claude Code 作为 AI 辅助开发工具。 ### 代码规范 - **Python**:遵循 PEP 8 - **TypeScript/Vue**:使用 TypeScript 严格模式 - **提交规范**:[Conventional Commits](https://www.conventionalcommits.org/) ``` feat: 新功能 fix: 修复 docs: 文档更新 refactor: 重构 style: 格式调整 chore: 构建/工具配置 ``` ## 常见问题 **Q: Redis 连接失败?** A: 确保 Redis Stack 已启动(`docker ps`),且端口 6379 未被占用。Agent 强制使用 db 0(RediSearch 索引限制)。 **Q: 图片上传失败?** A: 检查 `.env` 中 OSS 相关配置是否正确,Bucket 是否存在且允许跨域访问。 **Q: 前端开发时 API 请求 404?** A: 确保后端已启动在 8001 端口,Vite 代理配置会将 `/api` 请求转发到后端。 ## 许可证 MIT License ## 作者 **袁旺** - [Gitee @yuanwang99](https://gitee.com/yuanwang99) 项目地址:[https://gitee.com/yuanwang99/smart-dietian](https://gitee.com/yuanwang99/smart-dietian) --- ⭐ 如果这个项目对你有帮助,请 Star 支持!