added RAG, Multiuser, TG bot
This commit is contained in:
@@ -1,55 +1,94 @@
|
||||
from typing import Any
|
||||
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.fitness.service import FitnessService
|
||||
|
||||
|
||||
def get_fitness_snapshot(db: Session) -> dict[str, Any]:
|
||||
return FitnessService(db).snapshot()
|
||||
|
||||
|
||||
def format_fitness_context(snapshot: dict[str, Any]) -> str:
|
||||
lines = ["[Фитнес — сводка на сегодня]"]
|
||||
|
||||
profile = snapshot.get("profile")
|
||||
if not profile:
|
||||
lines.append("Профиль не настроен. set_fitness_profile для целей ккал/БЖУ/воды.")
|
||||
else:
|
||||
lines.append(
|
||||
f"Цели: {profile.get('calorie_target')} ккал, "
|
||||
f"Б {profile.get('protein_g')} / Ж {profile.get('fat_g')} / У {profile.get('carbs_g')} г, "
|
||||
f"вода {profile.get('water_l')} л"
|
||||
)
|
||||
if profile.get("goal"):
|
||||
lines.append(
|
||||
f"Цель: {profile.get('goal')}, вес {profile.get('weight_kg')} кг, "
|
||||
f"рост {profile.get('height_cm')} см"
|
||||
)
|
||||
|
||||
today = snapshot.get("today") or {}
|
||||
totals = today.get("totals") or {}
|
||||
targets = today.get("targets") or {}
|
||||
water_l = totals.get("water_ml", 0) / 1000
|
||||
water_target = targets.get("water_ml", 2500) / 1000
|
||||
|
||||
lines.append("")
|
||||
lines.append(
|
||||
f"Съедено: {totals.get('calories', 0):.0f}/{targets.get('calories', 0):.0f} ккал · "
|
||||
f"Б {totals.get('protein_g', 0):.0f}/{targets.get('protein_g', 0):.0f} · "
|
||||
f"Ж {totals.get('fat_g', 0):.0f}/{targets.get('fat_g', 0):.0f} · "
|
||||
f"У {totals.get('carbs_g', 0):.0f}/{targets.get('carbs_g', 0):.0f} г"
|
||||
)
|
||||
lines.append(f"Вода: {water_l:.1f}/{water_target:.1f} л")
|
||||
|
||||
workouts = today.get("workouts") or []
|
||||
if workouts:
|
||||
lines.append(f"Тренировок сегодня: {len(workouts)}")
|
||||
|
||||
lines.append("")
|
||||
lines.append(
|
||||
"Правила: log_meal, log_water, log_weight, log_workout, get_fitness_summary (date/days_ago), get_fitness_history, "
|
||||
"set_fitness_profile, calc_fitness_targets, lookup_food, lookup_exercise. "
|
||||
"Еда — оценка LLM (≈), пользователь может уточнить."
|
||||
)
|
||||
return "\n".join(lines)
|
||||
from typing import Any
|
||||
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.fitness.service import FitnessService
|
||||
|
||||
|
||||
def get_fitness_snapshot(db: Session, user_id: int) -> dict[str, Any]:
|
||||
return FitnessService(db, user_id).snapshot()
|
||||
|
||||
|
||||
def format_fitness_context(snapshot: dict[str, Any]) -> str:
|
||||
lines = ["[Фитнес — сводка на сегодня]"]
|
||||
|
||||
profile = snapshot.get("profile")
|
||||
if not profile:
|
||||
lines.append("Профиль не настроен. set_fitness_profile для целей ккал/БЖУ/воды.")
|
||||
else:
|
||||
lines.append(
|
||||
f"Цели (база): {profile.get('calorie_target')} ккал, "
|
||||
f"Б {profile.get('protein_g')} / Ж {profile.get('fat_g')} / У {profile.get('carbs_g')} г, "
|
||||
f"вода {profile.get('water_l')} л"
|
||||
)
|
||||
if profile.get("goal"):
|
||||
lines.append(
|
||||
f"Цель: {profile.get('goal')}, вес {profile.get('weight_kg')} кг, "
|
||||
f"рост {profile.get('height_cm')} см"
|
||||
)
|
||||
|
||||
today = snapshot.get("today") or {}
|
||||
totals = today.get("totals") or {}
|
||||
targets = today.get("targets") or {}
|
||||
targets_base = today.get("targets_base") or {}
|
||||
activity = today.get("activity") or {}
|
||||
steps_total = today.get("steps_total") or 0
|
||||
water_l = totals.get("water_ml", 0) / 1000
|
||||
water_target = targets.get("water_ml", 2500) / 1000
|
||||
|
||||
if profile and (activity.get("total_bonus_kcal") or steps_total):
|
||||
lines.append(
|
||||
f"Активность: шаги {steps_total} (база {activity.get('steps_baseline', 0)}), "
|
||||
f"бонус +{activity.get('total_bonus_kcal', 0)} ккал"
|
||||
)
|
||||
base_cal = targets_base.get("calories", profile.get("calorie_target"))
|
||||
lines.append(f"Эффективная цель ккал: {base_cal} → {targets.get('calories', base_cal)}")
|
||||
|
||||
lines.append("")
|
||||
lines.append(
|
||||
f"Съедено: {totals.get('calories', 0):.0f}/{targets.get('calories', 0):.0f} ккал · "
|
||||
f"Б {totals.get('protein_g', 0):.0f}/{targets.get('protein_g', 0):.0f} · "
|
||||
f"Ж {totals.get('fat_g', 0):.0f}/{targets.get('fat_g', 0):.0f} · "
|
||||
f"У {totals.get('carbs_g', 0):.0f}/{targets.get('carbs_g', 0):.0f} г"
|
||||
)
|
||||
lines.append(f"Вода: {water_l:.1f}/{water_target:.1f} л")
|
||||
|
||||
workouts = today.get("workouts") or []
|
||||
if workouts:
|
||||
lines.append(f"Тренировок сегодня: {len(workouts)}")
|
||||
|
||||
stats = snapshot.get("workout_stats") or {}
|
||||
if stats.get("count"):
|
||||
lines.append(
|
||||
f"Тренировки за {stats.get('days', 7)} дн.: {stats.get('count')} "
|
||||
f"(цель/нед {stats.get('weekly_target')}, серия {stats.get('streak')} дн.)"
|
||||
)
|
||||
|
||||
latest = (snapshot.get("body_metrics") or [None])[0]
|
||||
if latest:
|
||||
lines.append("")
|
||||
lines.append("Антропометрия (последняя):")
|
||||
parts = [f"{latest.get('weight_kg')} кг"]
|
||||
if latest.get("body_fat_pct") is not None:
|
||||
method = latest.get("body_fat_method") or "?"
|
||||
parts.append(f"жир {latest.get('body_fat_pct')}% ({method})")
|
||||
if latest.get("neck_cm"):
|
||||
parts.append(f"шея {latest.get('neck_cm')}")
|
||||
if latest.get("waist_cm"):
|
||||
parts.append(f"талия {latest.get('waist_cm')}")
|
||||
if latest.get("hip_cm"):
|
||||
parts.append(f"бёдра {latest.get('hip_cm')}")
|
||||
if latest.get("whr"):
|
||||
parts.append(f"WHR {latest.get('whr')}")
|
||||
if latest.get("ffmi"):
|
||||
parts.append(f"FFMI {latest.get('ffmi')}")
|
||||
lines.append(" · ".join(parts))
|
||||
|
||||
lines.append("")
|
||||
lines.append(
|
||||
"Правила: log_meal, log_water, log_weight (обхваты → Navy), log_steps, log_workout (date/days_ago), "
|
||||
"calc_body_composition (расчёт без записи), get_fitness_summary (date/days_ago), get_fitness_history, "
|
||||
"set_fitness_profile, calc_fitness_targets, lookup_food, lookup_exercise. "
|
||||
"Еда — оценка LLM (≈), пользователь может уточнить."
|
||||
)
|
||||
return chr(10).join(lines)
|
||||
|
||||
Reference in New Issue
Block a user