from fastapi import FastAPI, HTTPException, WebSocket, WebSocketDisconnect, Depends from fastapi.security import OAuth2PasswordBearer from pydantic import BaseModel from typing import Optional, Dict, Any from ..core.model import CogenBAI from ..languages.generator import LanguageGenerator from ..collaboration.session import SessionManager from ..collaboration.websocket import collaboration_manager from ..review.analyzer import CodeReviewAnalyzer from ..testing.generator import TestGenerator app = FastAPI(title="COGENBAI API") model = CogenBAI() lang_generator = LanguageGenerator() session_manager = SessionManager() code_reviewer = CodeReviewAnalyzer() test_generator = TestGenerator() oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") class CodeRequest(BaseModel): prompt: str language: str framework: Optional[str] = None max_length: Optional[int] = 1024 temperature: float = 0.7 @app.post("/generate") async def generate_code(request: CodeRequest, token: str = Depends(oauth2_scheme)) -> Dict[str, Any]: try: code = model.generate_code( prompt=request.prompt, language=request.language, max_length=request.max_length, temperature=request.temperature ) return {"status": "success", "code": code} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.get("/supported-languages") async def get_supported_languages(): return {"languages": list(lang_generator.language_configs.keys())} @app.websocket("/ws/{session_id}/{user_id}") async def websocket_endpoint(websocket: WebSocket, session_id: str, user_id: str): await collaboration_manager.connect(session_id, websocket) try: session = await session_manager.join_session(session_id, user_id) if not session: await websocket.close() return while True: data = await websocket.receive_json() if data["type"] == "code_update": await session_manager.update_code(session_id, data["code"]) await collaboration_manager.broadcast(session_id, { "type": "code_update", "code": data["code"], "user_id": user_id }) except WebSocketDisconnect: await collaboration_manager.disconnect(session_id, websocket) @app.post("/sessions/create") async def create_session(user_id: str): session_id = f"session_{len(session_manager.sessions) + 1}" session = await session_manager.create_session(session_id, user_id) return session.to_dict() @app.post("/review") async def review_code(code: str, language: str) -> Dict[str, Any]: try: review_results = code_reviewer.review_code(code, language) return {"status": "success", "review": review_results} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.post("/generate-tests") async def generate_tests(code: str, language: str, test_type: str = 'unit') -> Dict[str, str]: try: tests = test_generator.generate_tests(code, language, test_type) return {"status": "success", "tests": tests} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @app.post("/projects/create") async def create_project( name: str, language: str, framework: str, initial_description: str ) -> Dict[str, Any]: project_id = f"proj_{int(time.time())}" project = ProjectState( project_id=project_id, name=name, language=language, framework=framework, status="active", completion_percentage=0.0, last_modified=datetime.now(), code_snippets={}, dependencies=[] ) if model.project_tracker.create_project(project): initial_code = model.generate_code(initial_description, language, framework) project.code_snippets["initial"] = initial_code model.project_tracker.update_project( project_id, {"code_snippets": json.dumps(project.code_snippets)} ) return {"status": "success", "project_id": project_id, "code": initial_code} raise HTTPException(status_code=500, detail="Failed to create project") @app.post("/projects/{project_id}/continue") async def continue_project( project_id: str, feature_description: str ) -> Dict[str, Any]: try: new_code = model.continue_project(project_id, feature_description) return {"status": "success", "code": new_code} except Exception as e: raise HTTPException(status_code=500, detail=str(e))