import os from fastapi import FastAPI, UploadFile, File, Form, HTTPException from fastapi.responses import JSONResponse from dotenv import load_dotenv from .core.analyzer import quick_analyze from .core.reviewer import review_single_file from .utils.file_utils import save_upload_temp, read_file_text from .models.schemas import ReviewResponse load_dotenv() app = FastAPI(title="Code Review Agent v0.1", description="Single-file code review using MiniMax-M2 (Ollama).") @app.post("/review/file", response_model=ReviewResponse) async def review_file(file: UploadFile = File(...), persona: str = Form("general")): if not file.filename: raise HTTPException(status_code=400, detail="Missing filename") temp_path = save_upload_temp(file) code = read_file_text(temp_path) ext = os.path.splitext(file.filename)[1].lower() language = "python" if ext in (".py",) else "unknown" analyzer_evidence = quick_analyze(temp_path, language) review = review_single_file(temp_path, file.filename, code, analyzer_evidence, persona=persona) try: os.remove(temp_path) except OSError: pass return JSONResponse(status_code=200, content=review.dict()) @app.get("/health") async def health(): return {"status": "ok", "model": os.getenv("OLLAMA_MODEL", "Minimax-M2"), "engine": "Ollama"} @app.get("/") async def root(): return { "message": "Welcome to Code Review Agent v0.1", "usage": { "endpoint": "/review/file", "method": "POST", "params": {"file": "upload your source file", "persona": "general|security|performance|style"}, "example": "curl -F 'file=@example.py' -F 'persona=security' http://localhost:8080/review/file" } }