|
9 | 9 | from app.services.logger import setup_logger |
10 | 10 | from app.api.error_utilities import InputValidationError, ErrorResponse |
11 | 11 | from app.tools.utils.tool_utilities import load_tool_metadata, execute_tool, finalize_inputs |
12 | | -from fastapi.responses import FileResponse |
13 | | -from starlette.background import BackgroundTask |
| 12 | +from app.tools.presentation_generator.tools.slides_generator import SlidesGenerator |
| 13 | +import uuid |
| 14 | +from fastapi import FastAPI |
14 | 15 |
|
15 | 16 | logger = setup_logger(__name__) |
16 | 17 | router = APIRouter() |
| 18 | +app = FastAPI() |
| 19 | + |
| 20 | +# Initialize presentation contexts in app state if not exists |
| 21 | +if not hasattr(app.state, "presentation_contexts"): |
| 22 | + app.state.presentation_contexts = {} |
17 | 23 |
|
18 | 24 | @router.get("/") |
19 | 25 | def read_root(): |
20 | 26 | return {"Hello": "World"} |
21 | 27 |
|
| 28 | +# Handles two-step presentation generation: |
| 29 | +# 1. Generate outline with initial inputs |
| 30 | +# 2. Generate slides using stored outline and inputs |
| 31 | +@router.post("/generate-outline", response_model=Union[ToolResponse, ErrorResponse]) |
| 32 | +async def generate_outline(data: ToolRequest, _ = Depends(key_check)): |
| 33 | + try: |
| 34 | + # Execute outline generation and store context for slides |
| 35 | + request_data = data.tool_data |
| 36 | + requested_tool = load_tool_metadata(request_data.tool_id) |
| 37 | + request_inputs_dict = finalize_inputs(request_data.inputs, requested_tool['inputs']) |
| 38 | + result = execute_tool(request_data.tool_id, request_inputs_dict) |
| 39 | + |
| 40 | + # Store in app state, to use as context for slides generation |
| 41 | + presentation_id = str(uuid.uuid4()) |
| 42 | + app.state.presentation_contexts[presentation_id] = { |
| 43 | + "outline": result, |
| 44 | + "inputs": request_inputs_dict |
| 45 | + } |
| 46 | + |
| 47 | + return ToolResponse(data={ |
| 48 | + "outline": result, |
| 49 | + "presentation_id": presentation_id |
| 50 | + }) |
| 51 | + |
| 52 | + except InputValidationError as e: |
| 53 | + logger.error(f"InputValidationError: {e}") |
| 54 | + return JSONResponse( |
| 55 | + status_code=400, |
| 56 | + content=jsonable_encoder(ErrorResponse(status=400, message=e.message)) |
| 57 | + ) |
| 58 | + |
| 59 | + except HTTPException as e: |
| 60 | + logger.error(f"HTTPException: {e}") |
| 61 | + return JSONResponse( |
| 62 | + status_code=e.status_code, |
| 63 | + content=jsonable_encoder(ErrorResponse(status=e.status_code, message=e.detail)) |
| 64 | + ) |
| 65 | + |
| 66 | +@router.post("/generate-slides/{presentation_id}", response_model=Union[ToolResponse, ErrorResponse]) |
| 67 | +async def generate_slides(presentation_id: str, _ = Depends(key_check)): |
| 68 | + try: |
| 69 | + # Retrieve stored context and generate slides |
| 70 | + context = app.state.presentation_contexts.get(presentation_id) |
| 71 | + if not context: |
| 72 | + raise HTTPException( |
| 73 | + status_code=404, |
| 74 | + detail="Presentation context not found" |
| 75 | + ) |
| 76 | + |
| 77 | + slides = SlidesGenerator( |
| 78 | + outline=context["outline"], |
| 79 | + inputs=context["inputs"] |
| 80 | + ).compile() |
| 81 | + |
| 82 | + return ToolResponse(data=slides) |
| 83 | + |
| 84 | + except InputValidationError as e: |
| 85 | + logger.error(f"InputValidationError: {e}") |
| 86 | + return JSONResponse( |
| 87 | + status_code=400, |
| 88 | + content=jsonable_encoder(ErrorResponse(status=400, message=e.message)) |
| 89 | + ) |
| 90 | + |
| 91 | + except HTTPException as e: |
| 92 | + logger.error(f"HTTPException: {e}") |
| 93 | + return JSONResponse( |
| 94 | + status_code=e.status_code, |
| 95 | + content=jsonable_encoder(ErrorResponse(status=e.status_code, message=e.detail)) |
| 96 | + ) |
| 97 | + |
22 | 98 | @router.post("/submit-tool", response_model=Union[ToolResponse, ErrorResponse]) |
23 | 99 | async def submit_tool( data: ToolRequest, _ = Depends(key_check)): |
24 | 100 | try: |
|
0 commit comments