|
|
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" |
|
|
} |
|
|
} |
|
|
|