Spaces:
Sleeping
Sleeping
sachin
commited on
Commit
·
b53b1c3
1
Parent(s):
c1d606a
fix
Browse files- 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,
|
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
|
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 |
-
|
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)}")
|