| 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)) |