"""Job status endpoints for async LLM operations.""" from arq.jobs import Job, JobStatus from auth import require_auth from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel from redis_client import get_redis router = APIRouter(dependencies=[Depends(require_auth)]) class JobStatusResponse(BaseModel): job_id: str status: str # queued, in_progress, complete, not_found, deferred result: dict | None = None error: str | None = None @router.get("/jobs/{job_id}", response_model=JobStatusResponse) async def get_job_status(job_id: str, user: dict = Depends(require_auth)): """Poll for the result of an async LLM job.""" redis = await get_redis() job = Job(job_id, redis) status = await job.status() if status == JobStatus.not_found: raise HTTPException(status_code=404, detail="Job not found") result = None error = None if status == JobStatus.complete: try: result_data = await job.result(timeout=0) result = result_data if isinstance(result_data, dict) else {"data": str(result_data)} except Exception as exc: error = str(exc) return JobStatusResponse( job_id=job_id, status=status.value, result=result, error=error, )