OR_Training / app.py
rogarces85's picture
Update app.py
3bcd6b5 verified
import os, json, io
lines = []
try:
path = hf_hub_download(repo_id=OUT_DATASET, repo_type="dataset", filename=OUT_FILE, token=HF_TOKEN)
with open(path, "r", encoding="utf-8") as f:
lines = f.read().splitlines()
except Exception:
lines = []
lines.append(json.dumps(record, ensure_ascii=False))
content = "\n".join(lines).encode("utf-8")
upload_file(
path_or_fileobj=io.BytesIO(content),
path_in_repo=OUT_FILE,
repo_id=OUT_DATASET,
repo_type="dataset",
token=HF_TOKEN
)
return f"Guardado en {OUT_DATASET}/{OUT_FILE}"
# --- Callback principal ---
def on_generate(name, age, sex, distance, target_date,
days_per_week, long_run_day, current_5k_pace, long_run_km, experience,
keywords, topk):
# 1) búsqueda en el dataset
table = search_papers(keywords, topk)
# 2) generar plan
plan = build_plan(distance, target_date, int(days_per_week), long_run_day,
float(current_5k_pace), float(long_run_km), experience)
# 3) guardar
record = {
"ts": datetime.utcnow().isoformat()+"Z",
"user": {"name": name, "age": age, "sex": sex},
"goal": {"distance": distance, "target_date": target_date},
"prefs": {"days_per_week": days_per_week, "long_run_day": long_run_day, "experience": experience},
"benchmarks": {"current_5k_pace_min_per_km": current_5k_pace, "long_run_km": long_run_km},
"keywords": keywords,
"plan": plan
}
saved = ensure_repo_and_push(record)
return table, json.dumps(plan, ensure_ascii=False, indent=2), saved
# --- UI ---
with gr.Blocks(title="OR_Training — Running Plan Builder") as demo:
gr.Markdown("""
# 🏃 OR_Training — Running Plan Builder
Este Space busca en literatura (dataset NCBI extraído) y genera un **plan básico** personalizado.
- Dataset: `florentgbelidji/ncbi_extracted_running` (recomendado **duplicarlo** a `rogarces85/ncbi_extracted_running`).
- Cada envío puede guardarse como una línea en `dataset` propio (`OR_Training_submissions`).
""")
with gr.Row():
with gr.Column():
gr.Markdown("### 🔎 Búsqueda en el dataset")
keywords = gr.Textbox(label="Palabras clave (ej: injury, marathon, VO2max)")
topk = gr.Slider(1, 20, value=5, step=1, label="Resultados (top-k)")
table_out = gr.Dataframe(label="Artículos coincidentes (id, title, date, authors, language, snippet)", wrap=True, height=300)
with gr.Column():
gr.Markdown("### 📝 Formulario del atleta")
name = gr.Textbox(label="Nombre", value="")
age = gr.Number(label="Edad", value=30)
sex = gr.Radio(["F","M","Otro"], label="Sexo", value="F")
distance = gr.Dropdown(["5K","10K","21K","42K"], value="21K", label="Objetivo")
target_date = gr.Textbox(label="Fecha objetivo (YYYY-MM-DD)", value="2026-03-01")
days_per_week = gr.Slider(3,6,value=4,step=1,label="Días/semana")
long_run_day = gr.Dropdown(["Sábado","Domingo"], value="Domingo", label="Día de fondo")
current_5k_pace = gr.Number(label="Ritmo actual 5K (min/km)", value=5.30)
long_run_km = gr.Number(label="Fondo actual (km)", value=12)
experience = gr.Dropdown(["Principiante","Intermedio","Avanzado"], value="Intermedio", label="Experiencia")
btn = gr.Button("Generar plan y guardar envío")
plan_json = gr.Code(label="Plan (JSON)", language="json", lines=20)
saved_label = gr.Markdown()
btn.click(on_generate,
inputs=[name, age, sex, distance, target_date, days_per_week, long_run_day,
current_5k_pace, long_run_km, experience, keywords, topk],
outputs=[table_out, plan_json, saved_label])
if __name__ == "__main__":
demo.launch()