sachin commited on
Commit
b53b1c3
·
1 Parent(s): c1d606a
Files changed (1) hide show
  1. src/server/main.py +17 -10
src/server/main.py CHANGED
@@ -5,7 +5,7 @@ from typing import List, Optional
5
  from abc import ABC, abstractmethod
6
 
7
  import uvicorn
8
- from fastapi import Depends, FastAPI, File, HTTPException, Query, Request, UploadFile, Form, Header
9
  from fastapi.middleware.cors import CORSMiddleware
10
  from fastapi.responses import JSONResponse, RedirectResponse, StreamingResponse
11
  from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
@@ -119,7 +119,7 @@ class AudioProcessingResponse(BaseModel):
119
 
120
  class ChatRequest(BaseModel):
121
  prompt: str = Field(..., description="Base64-encoded encrypted prompt (max 1000 characters after decryption)")
122
- src_lang: str = Field(..., description="Base64-encoded encrypted source language code (default: kan_Knda after decryption)")
123
 
124
  @field_validator("prompt", "src_lang")
125
  def must_be_valid_base64(cls, v):
@@ -191,6 +191,15 @@ class VisualQueryRequest(BaseModel):
191
  raise ValueError("Field must be valid base64-encoded data")
192
  return v
193
 
 
 
 
 
 
 
 
 
 
194
  class VisualQueryResponse(BaseModel):
195
  answer: str
196
 
@@ -282,7 +291,7 @@ async def register_user(
282
 
283
  @app.post("/v1/app/register",
284
  response_model=TokenResponse,
285
- summary="Register New App User ",
286
  description="Create a new user account for the mobile app in the `app_users` table using an encrypted email and device token. Returns an access token and refresh token. Rate limited to 5 requests per minute per IP. Requires X-Session-Key header.",
287
  tags=["Authentication"],
288
  responses={
@@ -688,7 +697,7 @@ async def translate(
688
  @app.post("/v1/visual_query",
689
  response_model=VisualQueryResponse,
690
  summary="Visual Query with Image",
691
- description="Process a visual query with an encrypted text query, encrypted image, and encrypted language codes. Rate limited to 100 requests per minute per user. Requires authentication and X-Session-Key header.",
692
  tags=["Chat"],
693
  responses={
694
  200: {"description": "Query response", "model": VisualQueryResponse},
@@ -700,10 +709,8 @@ async def translate(
700
  @limiter.limit(settings.chat_rate_limit)
701
  async def visual_query(
702
  request: Request,
703
- query: str = Form(..., description="Base64-encoded encrypted text query"),
704
  file: UploadFile = File(..., description="Encrypted image file to analyze"),
705
- src_lang: str = Form(..., description="Base64-encoded encrypted source language code"),
706
- tgt_lang: str = Form(..., description="Base64-encoded encrypted target language code"),
707
  credentials: HTTPAuthorizationCredentials = Depends(bearer_scheme),
708
  x_session_key: str = Header(..., alias="X-Session-Key")
709
  ):
@@ -712,7 +719,7 @@ async def visual_query(
712
 
713
  # Decrypt query
714
  try:
715
- encrypted_query = base64.b64decode(query)
716
  decrypted_query = decrypt_data(encrypted_query, session_key).decode("utf-8")
717
  except Exception as e:
718
  logger.error(f"Query decryption failed: {str(e)}")
@@ -720,7 +727,7 @@ async def visual_query(
720
 
721
  # Decrypt source language
722
  try:
723
- encrypted_src_lang = base64.b64decode(src_lang)
724
  decrypted_src_lang = decrypt_data(encrypted_src_lang, session_key).decode("utf-8")
725
  except Exception as e:
726
  logger.error(f"Source language decryption failed: {str(e)}")
@@ -728,7 +735,7 @@ async def visual_query(
728
 
729
  # Decrypt target language
730
  try:
731
- encrypted_tgt_lang = base64.b64decode(tgt_lang)
732
  decrypted_tgt_lang = decrypt_data(encrypted_tgt_lang, session_key).decode("utf-8")
733
  except Exception as e:
734
  logger.error(f"Target language decryption failed: {str(e)}")
 
5
  from abc import ABC, abstractmethod
6
 
7
  import uvicorn
8
+ from fastapi import Depends, FastAPI, File, HTTPException, Query, Request, UploadFile, Header
9
  from fastapi.middleware.cors import CORSMiddleware
10
  from fastapi.responses import JSONResponse, RedirectResponse, StreamingResponse
11
  from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
 
119
 
120
  class ChatRequest(BaseModel):
121
  prompt: str = Field(..., description="Base64-encoded encrypted prompt (max 1000 characters after decryption)")
122
+ src_lang: str = Field(..., description="Base64-encoded encrypted source language code")
123
 
124
  @field_validator("prompt", "src_lang")
125
  def must_be_valid_base64(cls, v):
 
191
  raise ValueError("Field must be valid base64-encoded data")
192
  return v
193
 
194
+ class Config:
195
+ schema_extra = {
196
+ "example": {
197
+ "query": "base64_encoded_encrypted_describe_image",
198
+ "src_lang": "base64_encoded_encrypted_kan_Knda",
199
+ "tgt_lang": "base64_encoded_encrypted_kan_Knda"
200
+ }
201
+ }
202
+
203
  class VisualQueryResponse(BaseModel):
204
  answer: str
205
 
 
291
 
292
  @app.post("/v1/app/register",
293
  response_model=TokenResponse,
294
+ summary="Register New App User",
295
  description="Create a new user account for the mobile app in the `app_users` table using an encrypted email and device token. Returns an access token and refresh token. Rate limited to 5 requests per minute per IP. Requires X-Session-Key header.",
296
  tags=["Authentication"],
297
  responses={
 
697
  @app.post("/v1/visual_query",
698
  response_model=VisualQueryResponse,
699
  summary="Visual Query with Image",
700
+ description="Process a visual query with an encrypted text query, encrypted image, and encrypted language codes provided in a JSON body. Rate limited to 100 requests per minute per user. Requires authentication and X-Session-Key header.",
701
  tags=["Chat"],
702
  responses={
703
  200: {"description": "Query response", "model": VisualQueryResponse},
 
709
  @limiter.limit(settings.chat_rate_limit)
710
  async def visual_query(
711
  request: Request,
712
+ visual_query_request: VisualQueryRequest,
713
  file: UploadFile = File(..., description="Encrypted image file to analyze"),
 
 
714
  credentials: HTTPAuthorizationCredentials = Depends(bearer_scheme),
715
  x_session_key: str = Header(..., alias="X-Session-Key")
716
  ):
 
719
 
720
  # Decrypt query
721
  try:
722
+ encrypted_query = base64.b64decode(visual_query_request.query)
723
  decrypted_query = decrypt_data(encrypted_query, session_key).decode("utf-8")
724
  except Exception as e:
725
  logger.error(f"Query decryption failed: {str(e)}")
 
727
 
728
  # Decrypt source language
729
  try:
730
+ encrypted_src_lang = base64.b64decode(visual_query_request.src_lang)
731
  decrypted_src_lang = decrypt_data(encrypted_src_lang, session_key).decode("utf-8")
732
  except Exception as e:
733
  logger.error(f"Source language decryption failed: {str(e)}")
 
735
 
736
  # Decrypt target language
737
  try:
738
+ encrypted_tgt_lang = base64.b64decode(visual_query_request.tgt_lang)
739
  decrypted_tgt_lang = decrypt_data(encrypted_tgt_lang, session_key).decode("utf-8")
740
  except Exception as e:
741
  logger.error(f"Target language decryption failed: {str(e)}")