sachin
commited on
Commit
·
853bd86
1
Parent(s):
c9a1140
docuyment-query
Browse files- 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):
|