sachin
commited on
Commit
·
45d1513
1
Parent(s):
97bd4ea
add-visual query
Browse files- src/server/main.py +93 -0
src/server/main.py
CHANGED
@@ -520,6 +520,99 @@ async def translate(
|
|
520 |
except ValueError as e:
|
521 |
logger.error(f"Invalid JSON response: {str(e)}")
|
522 |
raise HTTPException(status_code=500, detail="Invalid response format from translation service")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
523 |
|
524 |
if __name__ == "__main__":
|
525 |
parser = argparse.ArgumentParser(description="Run the FastAPI server.")
|
|
|
520 |
except ValueError as e:
|
521 |
logger.error(f"Invalid JSON response: {str(e)}")
|
522 |
raise HTTPException(status_code=500, detail="Invalid response format from translation service")
|
523 |
+
|
524 |
+
|
525 |
+
# Request/Response Models for Visual Query
|
526 |
+
class VisualQueryRequest(BaseModel):
|
527 |
+
query: str
|
528 |
+
src_lang: str = "kan_Knda" # Default to Kannada
|
529 |
+
tgt_lang: str = "kan_Knda" # Default to Kannada
|
530 |
+
|
531 |
+
@field_validator("query")
|
532 |
+
def query_must_be_valid(cls, v):
|
533 |
+
if len(v) > 1000:
|
534 |
+
raise ValueError("Query cannot exceed 1000 characters")
|
535 |
+
return v.strip()
|
536 |
+
|
537 |
+
class VisualQueryResponse(BaseModel):
|
538 |
+
answer: str
|
539 |
+
|
540 |
+
@app.post("/v1/visual_query", response_model=VisualQueryResponse)
|
541 |
+
@limiter.limit(settings.chat_rate_limit) # Reusing chat rate limit
|
542 |
+
async def visual_query(
|
543 |
+
request: Request,
|
544 |
+
query: str = Form(...),
|
545 |
+
file: UploadFile = File(...),
|
546 |
+
src_lang: str = Query(default="kan_Knda"),
|
547 |
+
tgt_lang: str = Query(default="kan_Knda"),
|
548 |
+
#api_key: str = Depends(get_api_key) # Uncomment if authentication is needed
|
549 |
+
):
|
550 |
+
"""
|
551 |
+
Endpoint to process visual queries with an image and text question.
|
552 |
+
Calls an external API to analyze the image and provide a response.
|
553 |
+
"""
|
554 |
+
if not query.strip():
|
555 |
+
raise HTTPException(status_code=400, detail="Query cannot be empty")
|
556 |
+
|
557 |
+
logger.info("Processing visual query request", extra={
|
558 |
+
"endpoint": "/v1/visual_query",
|
559 |
+
"query_length": len(query),
|
560 |
+
"filename": file.filename,
|
561 |
+
"client_ip": get_remote_address(request),
|
562 |
+
"src_lang": src_lang,
|
563 |
+
"tgt_lang": tgt_lang
|
564 |
+
})
|
565 |
+
|
566 |
+
# External API URL
|
567 |
+
external_url = f"https://slabstech-dhwani-internal-api-server.hf.space/v1/visual_query/?src_lang={src_lang}&tgt_lang={tgt_lang}"
|
568 |
+
|
569 |
+
try:
|
570 |
+
# Read file content
|
571 |
+
file_content = await file.read()
|
572 |
+
|
573 |
+
# Prepare multipart/form-data
|
574 |
+
files = {
|
575 |
+
"file": (file.filename, file_content, file.content_type)
|
576 |
+
}
|
577 |
+
data = {
|
578 |
+
"query": query
|
579 |
+
}
|
580 |
+
|
581 |
+
# Make the POST request to external API
|
582 |
+
response = requests.post(
|
583 |
+
external_url,
|
584 |
+
files=files,
|
585 |
+
data=data,
|
586 |
+
headers={"accept": "application/json"},
|
587 |
+
timeout=60
|
588 |
+
)
|
589 |
+
|
590 |
+
# Raise an exception for bad status codes
|
591 |
+
response.raise_for_status()
|
592 |
+
|
593 |
+
# Parse the response
|
594 |
+
response_data = response.json()
|
595 |
+
answer = response_data.get("answer", "")
|
596 |
+
|
597 |
+
if not answer:
|
598 |
+
logger.warning(f"Empty answer received from external API: {response_data}")
|
599 |
+
raise HTTPException(status_code=500, detail="No answer provided by visual query service")
|
600 |
+
|
601 |
+
logger.info(f"Visual query successful: {answer}")
|
602 |
+
return VisualQueryResponse(answer=answer)
|
603 |
+
|
604 |
+
except requests.Timeout:
|
605 |
+
logger.error("Visual query request timed out")
|
606 |
+
raise HTTPException(status_code=504, detail="Visual query service timeout")
|
607 |
+
except requests.RequestException as e:
|
608 |
+
logger.error(f"Error during visual query: {str(e)}")
|
609 |
+
raise HTTPException(status_code=500, detail=f"Visual query failed: {str(e)}")
|
610 |
+
except ValueError as e:
|
611 |
+
logger.error(f"Invalid JSON response: {str(e)}")
|
612 |
+
raise HTTPException(status_code=500, detail="Invalid response format from visual query service")
|
613 |
+
except Exception as e:
|
614 |
+
logger.error(f"Unexpected error in visual query: {str(e)}", exc_info=True)
|
615 |
+
raise HTTPException(status_code=500, detail=f"An error occurred: {str(e)}")
|
616 |
|
617 |
if __name__ == "__main__":
|
618 |
parser = argparse.ArgumentParser(description="Run the FastAPI server.")
|