1212from app .tools .presentation_generator .tools .slides_generator import SlidesGenerator
1313import uuid
1414from fastapi import FastAPI
15+ from fastapi import Request
16+ import json
17+ from app .services .cache_service import CacheInterface
1518
1619logger = setup_logger (__name__ )
1720router = APIRouter ()
2124if not hasattr (app .state , "presentation_contexts" ):
2225 app .state .presentation_contexts = {}
2326
27+
28+ # Dependency injection
29+ async def get_cache_service (request : Request ) -> CacheInterface :
30+ return request .app .state .cache_service
31+
2432@router .get ("/" )
2533def read_root ():
2634 return {"Hello" : "World" }
@@ -29,20 +37,27 @@ def read_root():
2937# 1. Generate outline with initial inputs
3038# 2. Generate slides using stored outline and inputs
3139@router .post ("/generate-outline" , response_model = Union [ToolResponse , ErrorResponse ])
32- async def generate_outline (data : ToolRequest , _ = Depends (key_check )):
40+ async def generate_outline (
41+ data : ToolRequest ,
42+ cache : CacheInterface = Depends (get_cache_service ),
43+ _ = Depends (key_check )
44+ ):
3345 try :
34- # Execute outline generation and store context for slides
46+ # Potential Bottleneck: execute tool can be a blocking operation
47+ # Solution: Use Redis Queue or Celery for background tasks
48+ # Execute outline generation and store context for slides generation
3549 request_data = data .tool_data
3650 requested_tool = load_tool_metadata (request_data .tool_id )
3751 request_inputs_dict = finalize_inputs (request_data .inputs , requested_tool ['inputs' ])
3852 result = execute_tool (request_data .tool_id , request_inputs_dict )
3953
40- # Store in app state , to use as context for slides generation
54+ # Store in app cache , to use as context for slides generation
4155 presentation_id = str (uuid .uuid4 ())
42- app .state .presentation_contexts [presentation_id ] = {
43- "outline" : result ,
44- "inputs" : request_inputs_dict
45- }
56+
57+ await cache .set (
58+ f"presentation:{ presentation_id } " ,
59+ json .dumps ({"outline" : result , "inputs" : request_inputs_dict })
60+ )
4661
4762 return ToolResponse (data = {
4863 "outline" : result ,
@@ -64,16 +79,17 @@ async def generate_outline(data: ToolRequest, _ = Depends(key_check)):
6479 )
6580
6681@router .post ("/generate-slides/{presentation_id}" , response_model = Union [ToolResponse , ErrorResponse ])
67- async def generate_slides (presentation_id : str , _ = Depends (key_check )):
82+ async def generate_slides (
83+ presentation_id : str ,
84+ cache : CacheInterface = Depends (get_cache_service ),
85+ _ = Depends (key_check )
86+ ):
6887 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- )
88+ context_str = await cache .get (f"presentation:{ presentation_id } " )
89+ if not context_str :
90+ raise HTTPException (status_code = 404 )
7691
92+ context = json .loads (context_str )
7793 slides = SlidesGenerator (
7894 outline = context ["outline" ],
7995 inputs = context ["inputs" ]
0 commit comments