1+ import asyncio
2+ import logging
13from fastapi import APIRouter , HTTPException , Depends
24from pydantic import BaseModel , Field
35from typing import List , Union
79from dependencies import verify_signature
810
911router = APIRouter (prefix = "/ai" , tags = ["ai" ], dependencies = [Depends (verify_signature )])
12+ logger = logging .getLogger (__name__ )
1013
1114class FilterItem (BaseModel ):
1215 field : str = Field (description = "The exact field name from the schema" )
@@ -19,7 +22,7 @@ class QueryResult(BaseModel):
1922
2023class QueryBuilderRequest (BaseModel ):
2124 prompt : str
22- schema_fields : list
25+ schema_fields : List [ dict ]
2326
2427@router .post ("/query-builder" , response_model = QueryResult )
2528async def query_builder (request : QueryBuilderRequest ):
@@ -55,13 +58,20 @@ async def query_builder(request: QueryBuilderRequest):
5558 # Create the LangChain chain
5659 chain = prompt | structured_llm
5760
58- # Invoke the chain
59- result = await chain .ainvoke ({
60- "schema" : str (request .schema_fields ),
61- "user_prompt" : request .prompt
62- })
61+ # Invoke the chain with a timeout to prevent hanging requests
62+ result = await asyncio .wait_for (
63+ chain .ainvoke ({
64+ "schema" : str (request .schema_fields ),
65+ "user_prompt" : request .prompt
66+ }),
67+ timeout = 15.0
68+ )
6369
6470 return result
6571
66- except Exception :
67- raise HTTPException (status_code = 500 , detail = "Failed to generate query" )
72+ except asyncio .TimeoutError as e :
73+ logger .error ("AI Query Builder timeout" , exc_info = True )
74+ raise HTTPException (status_code = 504 , detail = "AI request timed out" ) from e
75+ except Exception as e :
76+ logger .error ("AI Query Builder failed" , exc_info = True )
77+ raise HTTPException (status_code = 500 , detail = "Internal server error" ) from e
0 commit comments