from fastapi import APIRouter, HTTPException, Header from fastapi.responses import FileResponse import json import tempfile from datetime import datetime from core.state import results, completed_task_ids from core.database import save_results_to_hf, load_results_from_hf from config import MASTER_SECRET router = APIRouter(prefix="/api/results", tags=["results"]) @router.get("/") async def get_results(): try: memory_results = results[-50:] hf_results = load_results_from_hf(50) all_results = memory_results.copy() existing_ids = {r.get("task_id") for r in all_results} for r in hf_results: if r.get("task_id") not in existing_ids: all_results.append(r) existing_ids.add(r.get("task_id")) return { "total": len(all_results), "results": all_results[-100:], "memory_count": len(memory_results), "hf_count": len(hf_results), "completed_task_ids": list(completed_task_ids)[-100:], "total_completed": len(completed_task_ids), } except Exception as e: print(f"❌ Results error: {e}") raise HTTPException(500, str(e)) @router.post("/save") async def force_save(api_key: str = Header(..., alias="X-API-Key")): try: if api_key != MASTER_SECRET: raise HTTPException(401, "Invalid API key") success = save_results_to_hf(results) return {"status": "saved" if success else "failed", "count": len(results)} except HTTPException: raise except Exception as e: print(f"❌ Force save error: {e}") raise HTTPException(500, str(e)) @router.get("/export") async def export_results(): try: timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") filename = f"results_export_{timestamp}.json" with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f: json.dump(results, f, indent=2, default=str) tmp_path = f.name return FileResponse(path=tmp_path, filename=filename, media_type="application/json") except Exception as e: raise HTTPException(500, str(e))