Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
LLM_MODEL_ID=""
LLM_API_KEY=""
LLM_BASE_URL=""

# 超时时间(可选,默认60秒)
LLM_TIMEOUT=""

# 服务器配置
HOST=""
PORT=""

# CORS配置
CORS_ORIGINS=""
183 changes: 183 additions & 0 deletions Co-creation-projects/EugeneChanQAQ-smart_fitness_planner/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
# FitnessPlannerAgent - 健身训练规划助手

> 基于HelloAgents框架的健身规划助手

## 📝 项目简介

FitnessPlannerAgent是一个健身训练规划助手,能够根据用户基本信息自动规划每周期的健身计划。

### 核心功能
- ✅ 智能建议:基于LLM和用户提供的基本信息进行分析和规划训练。


## 🛠️ 技术栈

- HelloAgents框架(SimpleAgent)
- QWEN API(智能分析)

## 🚀 快速开始

### 安装依赖

```bash
pip install -r requirements.txt
```

### 配置LLM参数

**方式1: 使用.env文件(推荐)**

```bash
# 复制示例文件
cp .env.example .env

# 编辑.env文件,填入你的配置
# LLM_MODEL_ID=Qwen/Qwen2.5-72B-Instruct
# LLM_API_KEY=your_api_key_here
# LLM_BASE_URL=https://api-inference.modelscope.cn/v1/
```

### 运行项目

在终端进入当项目所在的EugeneChanQAQ-smart_fitness_planner目录激活虚拟环境。

```bash
venv_fit/Scripts/activate
# 激活虚拟环境
python -m uvicorn app.api.main:app --reload --host 0.0.0.0 --port 8000
# 启动项目
```

## 📖 使用示例

### 完整功能

1. 用户输入自己的基本信息(身高、体重、年龄)
2. 系统生成周期性的健身规划

## 🎯 项目亮点

- **智能化**:利用LLM根据个人身体基本数据,提供专业的健身训练建议
- **可扩展**:易于添加新的工具

## 📂 项目结构

```
EugeneChanQAQ-smart_fitness_planner/
├── app/ # 🍱 FastAPI 服务主体
│ ├── config.py # 配置文件(应用名、版本、路径等)
│ ├── api/ # FastAPI 相关
│ │ ├── routers # 路由
│ │ │ └──train.py # 路由
│ │ ├── main.py # FastAPI 主入口
│ ├── agents/ # 核心 Agent 逻辑模块
│ │ ├── train_planner.py #
│ │ ├── state_manager.py # 暂空
│ │ ├── \_\_init__.py
│ ├── models/ # Pydantic 请求模型
│ │ └── schemas.py # 数据模型
│ └── services/
│ └── llm_service.py #
├── tests/
│ └── test_agent.py # 暂空
├── requirements.txt # Python依赖
└── README.md # 项目说明
```

## 🔧 技术实现


### 智能体设计

使用HelloAgents的SimpleAgent。

## 📊 示例输出

```markdown
============================================================
🚀 HelloAgents健身规划助手 v1.0.0
============================================================
应用名称: HelloAgents健身规划助手
版本: 1.0.0
服务器: 0.0.0.0:8000
LLM API Key: 已配置
LLM Base URL: https://dashscope.aliyuncs.com/compatible-mode/v1
LLM Model: qwen-max
日志级别: INFO

✔验证通过

============================================================
📚 API文档: http://localhost:8000/docs
📖 ReDoc文档: http://localhost:8000/redoc
============================================================

INFO: Application startup complete.
INFO: 127.0.0.1:57008 - "GET / HTTP/1.1" 307 Temporary Redirect
INFO: 127.0.0.1:57008 - "GET /train/ HTTP/1.1" 200 OK
INFO: 127.0.0.1:57008 - "GET /favicon.ico HTTP/1.1" 404 Not Found

============================================================
📥 收到训练计划制定请求:
身高: 183
体重: 76
年龄: 21
============================================================

获取Agent系统
开始初始化智能体健身规划系统
✅ LLM服务初始化成功
提供商: qwen
模型: qwen-max
创建健身规划Agent

============================================================
🚀 开始智能体规划训练...
身高:183
体重:76
年龄:21

============================================================
制定训练计划中...
训练规划结果: [
{"day":1,"action":"深蹲","muscle":"腿部","group_num":3,"amount":12},
{"day":1,"action":"卧推","muscle":"胸部","group_num":3,"amount":10},
{"day":1,"action":"引体向上","muscle":"背部","group_num":3,"amount":8},
{"day":2,"action":"休息"},
{"day":3,"action":"硬拉","muscle":"背部","group_num":3,"amount":10},
...

============================================================
✅ 训练计划生成完成!
============================================================

✅ 训练计划生成成功,准备返回响应

INFO: 127.0.0.1:61389 - "POST /train/plan HTTP/1.1" 200 OK
```

## 🚧 未来改进

- [ ] 提供更多的基础信息以及特殊需求填写(性别、健身目的等)
- [ ] 添加食谱规划Agent(帮助提高健身效率)
- [ ] 调用API查找附近的健身餐食
- [ ] 提供周期性反馈,根据用户的最新数据更改健身策略和方案
- [ ] 生成用户身体数据报告

## 👤 作者

- GitHub: [@EugeneChanQAQ](https://github.com/EugeneChanQAQ)
- 项目链接:[FitnessPlannerAgent](https://github.com/datawhalechina/Hello-Agents/tree/main/Co-creation-projects/EugeneChanQAQ-smart_fitness_planner)

## 🙏 致谢

感谢Datawhale社区和Hello-Agents项目!

## 📄 许可证

所有共创项目遵循CC BY-NC-SA 4.0 License,欢迎学习和共创。


Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
__all__ = [
"train_planner.py",
"state_manager",
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
import json
from typing import Dict, Any, List
from hello_agents import SimpleAgent

from ..models.schemas import FitnessRequest, TrainPlan
from ..services.llm_service import get_llm
from ..config import get_settings

# ========== Agent 提示词 ==========
PLANNER_AGENT_PROMPT = """你是健身规划专家,你的任务是根据客户的身高、体重和年龄,生成详细的健身计划。

请为以下用户生成个性化的健身计划:
- 年龄:{request.age}岁
- 身高:{request.height}cm
- 体重:{request.weight}kg

要求:
1. 包含训练计划(每周3-5天)
2. 包含营养建议
3. 包含注意事项
4. 用中文回复,格式美观

"""

class FitnessPlanner:

def __init__(self):
print("开始初始化智能体健身规划系统")

try:
settings = get_settings()
self.llm = get_llm()

print("创建健身规划Agent")
self.planner_agent = SimpleAgent(
name="健身规划专家",
llm=self.llm,
system_prompt=PLANNER_AGENT_PROMPT
)

except Exception as e:
print(f"❌ 智能体系统初始化失败: {str(e)}")
import traceback
traceback.print_exc()
raise

def plan_train(self, request: FitnessRequest) -> List[TrainPlan]:
try:
print(f"\n{'=' * 60}")
print(f"🚀 开始智能体规划训练...")
print(f"身高:{request.height}")
print(f"体重:{request.weight}")
print(f"年龄:{request.age}")
print(f"\n{'=' * 60}")

print("制定训练计划中...")
planner_query = self._build_planner_query(request)
planner_response = self.planner_agent.run(planner_query)
print(f"训练规划结果: {planner_response[:300]}...\n")

# 解析响应为列表
train_plan_list = self._parse_response(planner_response, request)

# 确保返回 7 天列表,如果不足则用休息日填充
full_plan = []
for day in range(1, 8):
day_plan = next((p for p in train_plan_list if p.get("day") == day), None)
if day_plan:
# 转换为 TrainPlan 对象
full_plan.append(TrainPlan(**day_plan))
else:
# 休息日占位
full_plan.append(TrainPlan(
day=day,
action="休息",
muscle=None,
group_num=None,
amount=None
))

print(f"{'=' * 60}")
print(f"✅ 训练计划生成完成!")
print(f"{'=' * 60}\n")

return full_plan

except Exception as e:
print(f"❌ 生成训练计划失败: {str(e)}")
import traceback
traceback.print_exc()
return self._create_fallback_plan(request)

def _build_planner_query(self, request: FitnessRequest) -> str:

query = f"""
你是一个健身训练计划生成器,只能返回 JSON 格式。

请根据以下信息生成 **7 天训练计划**,并严格按下面的 JSON schema 输出:

每条数据格式必须如下:
{{
"day": int,
"action": str,
"muscle": str,
"group_num": int,
"amount": int
}}

输出格式必须是一个 JSON 数组,例如:
[
{{ ... }},
{{ ... }},
...
]

用户信息:
- 身高: {request.height}
- 体重: {request.weight}
- 年龄: {request.age}

生成要求:
1. 输出完整 7 天计划,每天 3~4 个动作(可拆成多条 JSON)
2. 返回标准 JSON 数组
3. 严禁输出解释、文字、标题,只能输出 JSON

"""
return query

def _parse_response(self, response: str, request: FitnessRequest) -> List[dict]:
"""
解析 Agent 响应为字典列表,每个元素对应一天训练计划
"""
try:
import json

# 提取 JSON 部分
if "```json" in response:
start = response.find("```json") + 7
end = response.find("```", start)
json_str = response[start:end].strip()
elif "```" in response:
start = response.find("```") + 3
end = response.find("```", start)
json_str = response[start:end].strip()
else:
# 尝试直接解析 JSON
json_str = response.strip()

data = json.loads(json_str)

# 确保返回的是列表
if isinstance(data, dict):
return [data]
elif isinstance(data, list):
return data
else:
raise ValueError("Agent 返回数据格式不正确")

except Exception as e:
print(f"⚠️ 解析响应失败: {str(e)}")
print(f" 将使用备用方案生成计划")
return [p.dict() for p in self._create_fallback_plan(request)]

def _create_fallback_plan(self, request: FitnessRequest) -> List[TrainPlan]:
"""
生成 7 天 fallback 计划
"""
fallback = []
for day in range(1, 8):
if day % 2 == 0:
fallback.append(TrainPlan(day=day, action="休息", muscle=None, group_num=None, amount=None))
else:
fallback.append(TrainPlan(day=day, action="深蹲", muscle="腿部", group_num=4, amount=12))
return fallback


_fitness_planner = None

def get_fitness_planner_agent() -> FitnessPlanner:
global _fitness_planner

if _fitness_planner is None:
_fitness_planner = FitnessPlanner()

return _fitness_planner
Loading