当前位置: 首页 > news >正文

【单智能体】AI健康与健身规划师 - 案例讲解(附完整源码)

目录

1. 案例简介

2. 案例目标

2.1 核心功能

2.2 技术要点

3. 技术栈与核心依赖

4. 项目结构

4.1 关键文件说明

5. 核心代码实现

5.1 页面配置与样式

5.2 饮食计划显示函数

5.3 健身计划显示函数

5.4 AI代理初始化

6. 运行与测试

6.1 环境准备

6.2 安装依赖

6.3 启动应用

6.4 使用流程

7. 实现思路与扩展建议

7.1 核心设计思想

7.2 扩展建议

完整源码

health_agent.py

requirements.txt

README.md


1. 案例简介

AI健康与健身规划师是一个由Agno AI代理框架驱动的个性化健康与健身应用。该应用根据用户输入(如年龄、体重、身高、活动水平、饮食偏好和健身目标)生成量身定制的饮食和健身计划。

学习目标:

  • 理解如何使用Agno AI框架构建智能代理应用
  • 学习如何集成Google Gemini大语言模型
  • 掌握Streamlit快速开发Web应用的技巧
  • 了解多代理协作的架构设计

2. 案例目标

2.1 核心功能

  • 个性化饮食计划:生成详细的餐食计划(早餐、午餐、晚餐和零食)
  • 个性化健身计划:根据健身目标提供定制的运动计划
  • 互动问答:允许用户就其计划提出后续问题

2.2 技术要点

  • 使用Agno AI框架创建专业化的AI代理
  • 集成Google Gemini API进行智能内容生成
  • 使用Streamlit构建交互式Web界面
  • 会话状态管理(Session State)

3. 技术栈与核心依赖

技术/依赖版本用途
Python3.8+编程语言
agno≥2.2.10AI代理框架
google-generativeai0.8.3Google Gemini模型接口
streamlit1.40.2Web应用框架

4. 项目结构

ai_health_fitness_agent-zh/ ├── README.md # 项目说明文档 ├── health_agent.py # 主程序文件 └── requirements.txt # 依赖配置文件

4.1 关键文件说明

  • health_agent.py:程序主入口,包含Streamlit界面和AI代理逻辑
  • requirements.txt:Python依赖包列表
  • README.md:项目使用说明

5. 核心代码实现

5.1 页面配置与样式

st.set_page_config( page_title="AI健康与健身规划师", page_icon="🏋️‍♂️", layout="wide", initial_sidebar_state="expanded" )

5.2 饮食计划显示函数

def display_dietary_plan(plan_content): """ 显示个性化饮食计划 参数: plan_content: 包含饮食计划信息的字典 """ with st.expander("📋 您的个性化饮食计划", expanded=True): col1, col2 = st.columns([2, 1]) with col1: st.markdown("### 🎯 为什么这个计划有效") st.info(plan_content.get("why_this_plan_works", "信息不可用")) st.markdown("### 🍽️ 餐食计划") st.write(plan_content.get("meal_plan", "计划不可用")) with col2: st.markdown("### ⚠️ 重要注意事项") considerations = plan_content.get("important_considerations", "").split('\n') for consideration in considerations: if consideration.strip(): st.warning(consideration)

5.3 健身计划显示函数

def display_fitness_plan(plan_content): """ 显示个性化健身计划 参数: plan_content: 包含健身计划信息的字典 """ with st.expander("💪 您的个性化健身计划", expanded=True): col1, col2 = st.columns([2, 1]) with col1: st.markdown("### 🎯 目标") st.success(plan_content.get("goals", "未指定目标")) st.markdown("### 🏋️‍♂️ 运动计划") st.write(plan_content.get("routine", "计划不可用")) with col2: st.markdown("### 💡 专业建议") tips = plan_content.get("tips", "").split('\n') for tip in tips: if tip.strip(): st.info(tip)

5.4 AI代理初始化

dietary_agent = Agent( name="饮食专家", role="提供个性化饮食建议", model=gemini_model, instructions=[ "考虑用户的输入,包括饮食限制和偏好。", "为一天建议详细的餐食计划,包括早餐、午餐、晚餐和零食。", "简要解释为什么该计划适合用户的目标。", "注重建议的清晰性、连贯性和质量。", ] )

6. 运行与测试

6.1 环境准备

注意:需要先获取Google Gemini API密钥,访问地址:https://aistudio.google.com/apikey

6.2 安装依赖

pip install -r requirements.txt

6.3 启动应用

streamlit run health_agent.py

6.4 使用流程

  1. 在侧边栏输入Gemini API密钥
  2. 填写个人信息(年龄、体重、身高等)
  3. 选择活动水平、饮食偏好和健身目标
  4. 点击"生成我的个性化计划"按钮
  5. 查看生成的饮食和健身计划
  6. 通过问答功能进行后续咨询

7. 实现思路与扩展建议

7.1 核心设计思想

  • 职责分离:饮食专家和健身专家各司其职
  • 用户至上:完全根据用户个人情况定制方案
  • 交互友好:提供简洁直观的Web界面

7.2 扩展建议

  • 添加数据持久化,保存用户历史计划
  • 集成运动追踪API,记录实际运动数据
  • 添加进度图表和分析报告
  • 支持多语言切换
  • 添加社交分享功能

完整源码

health_agent.py

import streamlit as st from agno.agent import Agent from agno.run.agent import RunOutput from agno.models.google import Gemini st.set_page_config( page_title="AI健康与健身规划师", page_icon="🏋️‍♂️", layout="wide", initial_sidebar_state="expanded" ) st.markdown(""" <style> .main { padding: 2rem; } .stButton>button { width: 100%; border-radius: 5px; height: 3em; } .success-box { padding: 1rem; border-radius: 0.5rem; background-color: #f0fff4; border: 1px solid #9ae6b4; } .warning-box { padding: 1rem; border-radius: 0.5rem; background-color: #fffaf0; border: 1px solid #fbd38d; } div[data-testid="stExpander"] div[role="button"] p { font-size: 1.1rem; font-weight: 600; } </style> """, unsafe_allow_html=True) def display_dietary_plan(plan_content): """ 显示个性化饮食计划 参数: plan_content: 包含饮食计划信息的字典 """ with st.expander("📋 您的个性化饮食计划", expanded=True): col1, col2 = st.columns([2, 1]) with col1: st.markdown("### 🎯 为什么这个计划有效") st.info(plan_content.get("why_this_plan_works", "信息不可用")) st.markdown("### 🍽️ 餐食计划") st.write(plan_content.get("meal_plan", "计划不可用")) with col2: st.markdown("### ⚠️ 重要注意事项") considerations = plan_content.get("important_considerations", "").split('\n') for consideration in considerations: if consideration.strip(): st.warning(consideration) def display_fitness_plan(plan_content): """ 显示个性化健身计划 参数: plan_content: 包含健身计划信息的字典 """ with st.expander("💪 您的个性化健身计划", expanded=True): col1, col2 = st.columns([2, 1]) with col1: st.markdown("### 🎯 目标") st.success(plan_content.get("goals", "未指定目标")) st.markdown("### 🏋️‍♂️ 运动计划") st.write(plan_content.get("routine", "计划不可用")) with col2: st.markdown("### 💡 专业建议") tips = plan_content.get("tips", "").split('\n') for tip in tips: if tip.strip(): st.info(tip) def main(): """ 主函数:运行AI健康与健身规划师应用 """ if 'dietary_plan' not in st.session_state: st.session_state.dietary_plan = {} st.session_state.fitness_plan = {} st.session_state.qa_pairs = [] st.session_state.plans_generated = False st.title("🏋️‍♂️ AI健康与健身规划师") st.markdown(""" <div style='background-color: #00008B; padding: 1rem; border-radius: 0.5rem; margin-bottom: 2rem;'> 获取根据您的目标和偏好量身定制的个性化饮食和健身计划。 我们的AI驱动系统会考虑您的独特个人资料,为您打造完美的计划。 </div> """, unsafe_allow_html=True) with st.sidebar: st.header("🔑 API配置") gemini_api_key = st.text_input( "Gemini API密钥", type="password", help="输入您的Gemini API密钥以访问服务" ) if not gemini_api_key: st.warning("⚠️ 请输入您的Gemini API密钥以继续") st.markdown("[在此获取您的API密钥](https://aistudio.google.com/apikey)") return st.success("API密钥已接受!") if gemini_api_key: try: gemini_model = Gemini(id="gemini-2.5-flash-preview-05-20", api_key=gemini_api_key) except Exception as e: st.error(f"❌ 初始化Gemini模型时出错: {e}") return st.header("👤 您的个人资料") col1, col2 = st.columns(2) with col1: age = st.number_input("年龄", min_value=10, max_value=100, step=1, help="输入您的年龄") height = st.number_input("身高 (厘米)", min_value=100.0, max_value=250.0, step=0.1) activity_level = st.selectbox( "活动水平", options=["久坐", "轻度活动", "中度活动", "高度活动", "极度活动"], help="选择您的典型活动水平" ) dietary_preferences = st.selectbox( "饮食偏好", options=["素食", "生酮", "无麸质", "低碳水", "无乳制品"], help="选择您的饮食偏好" ) with col2: weight = st.number_input("体重 (公斤)", min_value=20.0, max_value=300.0, step=0.1) sex = st.selectbox("性别", options=["男性", "女性", "其他"]) fitness_goals = st.selectbox( "健身目标", options=["减重", "增肌", "耐力训练", "保持健康", "力量训练"], help="您想要实现什么目标?" ) if st.button("🎯 生成我的个性化计划", use_container_width=True): with st.spinner("正在为您创建完美的健康和健身计划..."): try: dietary_agent = Agent( name="饮食专家", role="提供个性化饮食建议", model=gemini_model, instructions=[ "考虑用户的输入,包括饮食限制和偏好。", "为一天建议详细的餐食计划,包括早餐、午餐、晚餐和零食。", "简要解释为什么该计划适合用户的目标。", "注重建议的清晰性、连贯性和质量。", ] ) fitness_agent = Agent( name="健身专家", role="提供个性化健身建议", model=gemini_model, instructions=[ "提供适合用户目标的运动建议。", "包括热身、主要锻炼和放松运动。", "解释每个推荐运动的好处。", "确保计划可执行且详细。", ] ) user_profile = f""" 年龄: {age} 体重: {weight}公斤 身高: {height}厘米 性别: {sex} 活动水平: {activity_level} 饮食偏好: {dietary_preferences} 健身目标: {fitness_goals} """ dietary_plan_response: RunOutput = dietary_agent.run(user_profile) dietary_plan = { "why_this_plan_works": "高蛋白、健康脂肪、适量碳水化合物和热量平衡", "meal_plan": dietary_plan_response.content, "important_considerations": """ - 补水:全天多喝水 - 电解质:监测钠、钾和镁的水平 - 纤维:通过蔬菜和水果确保充足摄入 - 倾听身体的声音:根据需要调整份量 """ } fitness_plan_response: RunOutput = fitness_agent.run(user_profile) fitness_plan = { "goals": "增强力量、提高耐力并保持整体健康", "routine": fitness_plan_response.content, "tips": """ - 定期跟踪您的进度 - 在锻炼之间安排适当的休息 - 专注于正确的动作姿势 - 保持规律的锻炼习惯 """ } st.session_state.dietary_plan = dietary_plan st.session_state.fitness_plan = fitness_plan st.session_state.plans_generated = True st.session_state.qa_pairs = [] display_dietary_plan(dietary_plan) display_fitness_plan(fitness_plan) except Exception as e: st.error(f"❌ 发生错误: {e}") if st.session_state.plans_generated: st.header("❓ 对您的计划有疑问?") question_input = st.text_input("您想了解什么?") if st.button("获取答案"): if question_input: with st.spinner("正在为您寻找最佳答案..."): dietary_plan = st.session_state.dietary_plan fitness_plan = st.session_state.fitness_plan context = f"饮食计划: {dietary_plan.get('meal_plan', '')}\n\n健身计划: {fitness_plan.get('routine', '')}" full_context = f"{context}\n用户问题: {question_input}" try: agent = Agent(model=gemini_model, debug_mode=True, markdown=True) run_response: RunOutput = agent.run(full_context) if hasattr(run_response, 'content'): answer = run_response.content else: answer = "抱歉,我暂时无法生成回复。" st.session_state.qa_pairs.append((question_input, answer)) except Exception as e: st.error(f"❌ 获取答案时发生错误: {e}") if st.session_state.qa_pairs: st.header("💬 问答历史") for question, answer in st.session_state.qa_pairs: st.markdown(f"**问:** {question}") st.markdown(f"**答:** {answer}") if __name__ == "__main__": main()

requirements.txt

google-generativeai==0.8.3 streamlit==1.40.2 agno>=2.2.10
http://www.zskr.cn/news/1499525.html

相关文章:

  • 2026年吹膜机厂家推荐榜单:PE吹膜机/降解袋吹膜机/快递袋/背心袋/ABA共挤/全自动/小型/多层共挤吹膜机品牌实力精选 - 品牌发掘
  • 2026年上海注册公司代理记账哪家好?五大品牌深度测评与对比 - 新闻快传
  • 2026年 过滤/过滤器/高效过滤器/初效/中效/化学/活性碳/箱式过滤器厂家推荐榜单,G4/F5/F6/H13/H14高效空气过滤器实力品牌精选 - 品牌发掘
  • 二、SCI常用逻辑词
  • 09Java 泛型
  • 2026年哈尔滨系统门窗厂家推荐榜:家装/别墅/德式/极简/隔音/防渗漏/大玻璃品牌深度解析 - 企业推荐官【官方】
  • 2026年 湿毛巾厂家推荐排行榜:一次性/酒店/餐饮/独立包装湿毛巾源头工厂,专业清洁与定制服务优选 - 品牌发掘
  • 微信小程序实战:微型电车充电记账工具(可直接部署)
  • OpenFeign 实战指南:微服务远程调用的优雅之道
  • 人工智能专业术语详解(G)
  • 想转就转,想压就压!2026免费PDF转换器全攻略:转格式+高效压缩,零套路上手 - 时时资讯
  • 鸿蒙原生应用实战(一):Stage模型项目搭建与页面架构设计
  • 防爆AP怎么选?一文读懂选型要点+合规标准
  • JavaScript/TypeScript为何成为TVA的“交互皮肤”(5)
  • 上海出手爱彼手表避坑攻略:警惕虚高报价引流、到店压价等套路 - 奢侈品回收评测
  • Web分布式网站架构之-Squid缓存【20260608】004篇-【传统代理】
  • 第一讲:C语言的常见概念
  • 分公司越来越多,网络越用越卡?教你用“智能网关”把企业专线成本砍掉50%
  • YOLOv5 实战:不修改 `detect.py`,让检测结果图中的置信度随机显示为自己想要的
  • 零基础玩转大数据!800万条浏览器行为数据ETL实战,从零搞定可视化大屏底层数据
  • 2026年 膜分离设备厂家推荐:辽宁膜分离工艺与管式膜分离系统,青花椒油分离/食品级膜分离/医药膜分离技术优选指南 - 品牌发掘
  • 多 Agent 协作的“终极难题”:如何解决冲突、分歧与无限循环?
  • 清理重复文件释放C盘空间的工具
  • Web分布式网站架构之-Squid缓存【20260609】squid配置文件详解001篇
  • 网络请求基础:使用http模块发起GET/POST请求(12)
  • 全固态电池技术路线解析,硫化物、氧化物、聚合物谁主沉浮?
  • 深圳卡地亚回收避坑要点|先查资质、再看报价、最后结算 - 奢侈品回收测评
  • 【Azure AI Search】 searchMode=any 和 searchMode=all 有什么区别?
  • SQL/NoSQL数据库为何成为TVA的记忆系统(8)
  • 模型训练为什么一上 Pipeline Parallel 就开始显存更稳却气泡时间更难压:从 Stage Balance 到 Bubble Budget 的工程实战