sachin commited on
Commit
4d4186f
·
1 Parent(s): 79ebe50
Files changed (1) hide show
  1. src/server/main.py +30 -29
src/server/main.py CHANGED
@@ -476,60 +476,61 @@ async def extract_text(
476
  logger.error(f"Invalid JSON response from external API: {str(e)}")
477
  raise HTTPException(status_code=500, detail="Invalid response format from external API")
478
 
479
- from fastapi import FastAPI, File, HTTPException, Request, UploadFile, Form
480
- from pydantic import ValidationError
481
- import json
 
 
 
 
 
482
 
483
  @app.post("/v1/visual_query",
484
  response_model=VisualQueryResponse,
485
  summary="Visual Query with Image",
486
- description="Process a visual query with a text query, image, and language codes provided in a JSON body named 'data'. The JSON must contain 'query', 'src_lang', and 'tgt_lang' fields.",
487
  tags=["Chat"],
488
  responses={
489
  200: {"description": "Query response", "model": VisualQueryResponse},
490
  400: {"description": "Invalid query or language codes"},
491
- 422: {"description": "Validation error in request body or invalid JSON"},
492
  504: {"description": "Visual query service timeout"}
493
  })
494
  async def visual_query(
495
  request: Request,
496
- data: str = Form(..., description="JSON string containing query, src_lang, and tgt_lang (e.g., {\"query\": \"describe the image\", \"src_lang\": \"en\", \"tgt_lang\": \"en\"})"),
497
- file: UploadFile = File(..., description="Image file to analyze")
 
 
498
  ):
499
- # Parse and validate JSON data
500
- try:
501
- visual_query_request = VisualQueryRequest.model_validate_json(data)
502
- logger.info(f"Received visual query JSON: {data}")
503
- except json.JSONDecodeError as e:
504
- logger.error(f"Invalid JSON format: {str(e)}")
505
- raise HTTPException(status_code=422, detail=f"Invalid JSON format: {str(e)}")
506
- except ValidationError as e:
507
- logger.error(f"Validation error in JSON data: {str(e)}")
508
- raise HTTPException(status_code=422, detail=f"Invalid data: {str(e)}")
509
- except Exception as e:
510
- logger.error(f"Unexpected error parsing JSON data: {str(e)}")
511
- raise HTTPException(status_code=422, detail=f"Failed to parse JSON data: {str(e)}")
512
-
513
- if not visual_query_request.query.strip():
514
  raise HTTPException(status_code=400, detail="Query cannot be empty")
515
- if len(visual_query_request.query) > 1000:
516
  raise HTTPException(status_code=400, detail="Query cannot exceed 1000 characters")
517
 
 
 
 
 
 
 
 
518
  logger.info("Processing visual query request", extra={
519
  "endpoint": "/v1/visual_query",
520
- "query_length": len(visual_query_request.query),
521
  "file_name": file.filename,
522
  "client_ip": request.client.host,
523
- "src_lang": visual_query_request.src_lang,
524
- "tgt_lang": visual_query_request.tgt_lang
525
  })
526
 
527
- external_url = f"{os.getenv('EXTERNAL_API_BASE_URL')}/v1/visual_query/?src_lang={visual_query_request.src_lang}&tgt_lang={visual_query_request.tgt_lang}"
528
 
529
  try:
530
  file_content = await file.read()
531
  files = {"file": (file.filename, file_content, file.content_type)}
532
- data = {"query": visual_query_request.query}
533
 
534
  response = requests.post(
535
  external_url,
@@ -559,7 +560,7 @@ async def visual_query(
559
  except ValueError as e:
560
  logger.error(f"Invalid JSON response: {str(e)}")
561
  raise HTTPException(status_code=500, detail="Invalid response format from visual query service")
562
-
563
  from enum import Enum
564
 
565
  class SupportedLanguage(str, Enum):
 
476
  logger.error(f"Invalid JSON response from external API: {str(e)}")
477
  raise HTTPException(status_code=500, detail="Invalid response format from external API")
478
 
479
+ from fastapi import FastAPI, File, HTTPException, Request, UploadFile, Form, Query
480
+ from pydantic import BaseModel, Field
481
+
482
+ class VisualQueryResponse(BaseModel):
483
+ answer: str
484
+
485
+ class Config:
486
+ schema_extra = {"example": {"answer": "The image shows a screenshot of a webpage."}}
487
 
488
  @app.post("/v1/visual_query",
489
  response_model=VisualQueryResponse,
490
  summary="Visual Query with Image",
491
+ description="Process a visual query with a text query, image, and language codes. Provide the query and image as form data, and source/target languages as query parameters.",
492
  tags=["Chat"],
493
  responses={
494
  200: {"description": "Query response", "model": VisualQueryResponse},
495
  400: {"description": "Invalid query or language codes"},
496
+ 422: {"description": "Validation error in request body"},
497
  504: {"description": "Visual query service timeout"}
498
  })
499
  async def visual_query(
500
  request: Request,
501
+ query: str = Form(..., description="Text query to describe or analyze the image (e.g., 'describe the image')"),
502
+ file: UploadFile = File(..., description="Image file to analyze (e.g., PNG, JPEG)"),
503
+ src_lang: str = Query(..., description="Source language code (e.g., kan_Knda, en)"),
504
+ tgt_lang: str = Query(..., description="Target language code (e.g., kan_Knda, en)")
505
  ):
506
+ # Validate query
507
+ if not query.strip():
 
 
 
 
 
 
 
 
 
 
 
 
 
508
  raise HTTPException(status_code=400, detail="Query cannot be empty")
509
+ if len(query) > 1000:
510
  raise HTTPException(status_code=400, detail="Query cannot exceed 1000 characters")
511
 
512
+ # Validate language codes
513
+ supported_languages = ["kan_Knda", "hin_Deva", "tam_Taml", "en"] # Add more as needed
514
+ if src_lang not in supported_languages:
515
+ raise HTTPException(status_code=400, detail=f"Unsupported source language: {src_lang}. Must be one of {supported_languages}")
516
+ if tgt_lang not in supported_languages:
517
+ raise HTTPException(status_code=400, detail=f"Unsupported target language: {tgt_lang}. Must be one of {supported_languages}")
518
+
519
  logger.info("Processing visual query request", extra={
520
  "endpoint": "/v1/visual_query",
521
+ "query_length": len(query),
522
  "file_name": file.filename,
523
  "client_ip": request.client.host,
524
+ "src_lang": src_lang,
525
+ "tgt_lang": tgt_lang
526
  })
527
 
528
+ external_url = f"{os.getenv('EXTERNAL_API_BASE_URL')}/v1/visual_query/?src_lang={src_lang}&tgt_lang={tgt_lang}"
529
 
530
  try:
531
  file_content = await file.read()
532
  files = {"file": (file.filename, file_content, file.content_type)}
533
+ data = {"query": query}
534
 
535
  response = requests.post(
536
  external_url,
 
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):