sachin commited on
Commit
853bd86
·
1 Parent(s): c9a1140

docuyment-query

Browse files
Files changed (1) hide show
  1. src/server/main.py +87 -0
src/server/main.py CHANGED
@@ -560,7 +560,94 @@ async def visual_query(
560
  except ValueError as e:
561
  logger.error(f"Invalid JSON response: {str(e)}")
562
  raise HTTPException(status_code=500, detail="Invalid response format from visual query service")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
563
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
564
  from enum import Enum
565
 
566
  class SupportedLanguage(str, Enum):
 
560
  except ValueError as e:
561
  logger.error(f"Invalid JSON response: {str(e)}")
562
  raise HTTPException(status_code=500, detail="Invalid response format from visual query service")
563
+
564
+
565
+ from fastapi import FastAPI, File, HTTPException, Request, UploadFile, Form, Query
566
+ from pydantic import BaseModel, Field
567
+
568
+ class DocumentQueryResponse(BaseModel):
569
+ answer: str
570
+
571
+ class Config:
572
+ schema_extra = {"example": {"answer": "The image shows a screenshot of a webpage."}}
573
+
574
+ @app.post("/v1/document_query",
575
+ response_model=DocumentQueryResponse,
576
+ summary="Docuemnt Query with Image",
577
+ description="Process a Document query with a text query, image, and language codes. Provide the query and image as form data, and source/target languages as query parameters.",
578
+ tags=["Chat"],
579
+ responses={
580
+ 200: {"description": "Query response", "model": DocumentQueryResponse},
581
+ 400: {"description": "Invalid query or language codes"},
582
+ 422: {"description": "Validation error in request body"},
583
+ 504: {"description": "Visual query service timeout"}
584
+ })
585
+ async def document_query(
586
+ request: Request,
587
+ query: str = Form(..., description="Text query to describe or analyze the image (e.g., 'describe the image')"),
588
+ file: UploadFile = File(..., description="Image file to analyze (e.g., PNG, JPEG)"),
589
+ src_lang: str = Query(..., description="Source language code (e.g., kan_Knda, en)"),
590
+ tgt_lang: str = Query(..., description="Target language code (e.g., kan_Knda, en)")
591
+ ):
592
+ # Validate query
593
+ if not query.strip():
594
+ raise HTTPException(status_code=400, detail="Query cannot be empty")
595
+ if len(query) > 1000:
596
+ raise HTTPException(status_code=400, detail="Query cannot exceed 1000 characters")
597
+
598
+ # Validate language codes
599
+ supported_languages = ["kan_Knda", "hin_Deva", "tam_Taml", "eng_Latn"] # Add more as needed
600
+ if src_lang not in supported_languages:
601
+ raise HTTPException(status_code=400, detail=f"Unsupported source language: {src_lang}. Must be one of {supported_languages}")
602
+ if tgt_lang not in supported_languages:
603
+ raise HTTPException(status_code=400, detail=f"Unsupported target language: {tgt_lang}. Must be one of {supported_languages}")
604
+
605
+ logger.info("Processing document query request", extra={
606
+ "endpoint": "/v1/document_query",
607
+ "query_length": len(query),
608
+ "file_name": file.filename,
609
+ "client_ip": request.client.host,
610
+ "src_lang": src_lang,
611
+ "tgt_lang": tgt_lang
612
+ })
613
+
614
+ external_url = f"{os.getenv('EXTERNAL_API_BASE_URL')}/v1/document_query/?src_lang={src_lang}&tgt_lang={tgt_lang}"
615
+
616
+ try:
617
+ file_content = await file.read()
618
+ files = {"file": (file.filename, file_content, file.content_type)}
619
+ data = {"query": query}
620
 
621
+ response = requests.post(
622
+ external_url,
623
+ files=files,
624
+ data=data,
625
+ headers={"accept": "application/json"},
626
+ timeout=60
627
+ )
628
+ response.raise_for_status()
629
+
630
+ response_data = response.json()
631
+ answer = response_data.get("answer", "")
632
+
633
+ if not answer:
634
+ logger.warning(f"Empty answer received from external API: {response_data}")
635
+ raise HTTPException(status_code=500, detail="No answer provided by visual query service")
636
+
637
+ logger.info(f"document_query query successful: {answer}")
638
+ return VisualQueryResponse(answer=answer)
639
+
640
+ except requests.Timeout:
641
+ logger.error("document_query query request timed out")
642
+ raise HTTPException(status_code=504, detail="document_query query service timeout")
643
+ except requests.RequestException as e:
644
+ logger.error(f"Error during document_query query: {str(e)}")
645
+ raise HTTPException(status_code=500, detail=f"document_query query failed: {str(e)}")
646
+ except ValueError as e:
647
+ logger.error(f"Invalid JSON response: {str(e)}")
648
+ raise HTTPException(status_code=500, detail="Invalid response format from document_query query service")
649
+
650
+
651
  from enum import Enum
652
 
653
  class SupportedLanguage(str, Enum):