import requests from fastapi import FastAPI from openai import OpenAI from pydantic import BaseModel app = FastAPI() class ReviewRequest(BaseModel): gitea_token: str gitea_host: str openrouter_key: str model: str repo: str pr_number: int @app.post("/") async def review( request_body: ReviewRequest, ): print('starting bg task with:') print(f'request: {request_body}') gitea_host = request_body.gitea_host.rstrip("/") headers = {"Authorization": f"token {request_body.gitea_token}"} diff_res = requests.get(f"{gitea_host}/api/v1/repos/{request_body.repo}/pulls/{request_body.pr_number}.diff", headers=headers) if diff_res.status_code != 200 or not diff_res.text.strip(): return diff_text = diff_res.text client = OpenAI(base_url="https://openrouter.ai/api/v1", api_key=request_body.openrouter_key) prompt = ( "You are an automated senior code reviewer. Review the following git diff.\n" "Focus on: critical bugs, security vulnerabilities, edge cases, and code smells.\n" "Keep it short and clear, don't give me long solutions." "Format your answer cleanly in Markdown with actionable feedback.\n\n" f"```diff\n{diff_text}\n```" ) completion = client.chat.completions.create( model=request_body.model, messages=[{"role": "user", "content": prompt}] ) review_content = completion.choices[0].message.content review_body = f"# llm review\n\n{review_content}" requests.post( f"{gitea_host}/api/v1/repos/{request_body.repo}/pulls/{request_body.pr_number}/reviews", headers=headers, json={"body": review_body, "event": "COMMENT"} ) return {"status": "done"}