sachin commited on
Commit
45d1513
·
1 Parent(s): 97bd4ea

add-visual query

Browse files
Files changed (1) hide show
  1. 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.")