alexcpn/code-review-agent
0
1import grpc2from concurrent import futures3import logging as log4import os5import asyncio6import protos.agent_pb2 as agent_pb27import protos.agent_pb2_grpc as agent_pb2_grpc8from review_orchestrator import CodeReviewOrchestrator9from load_dotenv import load_dotenv10load_dotenv()11 12# Configure logging13log.basicConfig(level=log.INFO, format="%(asctime)s [%(levelname)s] %(message)s")14 15class CodeReviewAgentServicer(agent_pb2_grpc.CodeReviewAgentServicer):16 def __init__(self):17 self.orchestrator = CodeReviewOrchestrator()18 19 def ReviewPR(self, request, context):20 repo_url = request.repo_url21 async def ReviewPR(self, request, context):22 log.info(f"Received review request for PR #{request.pr_number}")23 try:24 async for result in self.orchestrator.review_pr_stream(request.repo_url, request.pr_number):25 yield agent_pb2.ReviewResponse(26 status="Success",27 review_comment=result["comment"],28 file_path=result["file_path"]29 )30 except Exception as e:31 log.error(f"Error during review: {e}")32 yield agent_pb2.ReviewResponse(33 status="Error",34 review_comment=str(e),35 file_path=""36 )37 38async def serve():39 server = grpc.aio.server()40 agent_pb2_grpc.add_CodeReviewAgentServicer_to_server(CodeReviewAgentServicer(), server)41 server.add_insecure_port('[::]:50051')42 log.info("Starting Async gRPC server on port 50051...")43 await server.start()44 await server.wait_for_termination()45 46if __name__ == '__main__':47 import asyncio48 asyncio.run(serve())49 