원 레포랑 완전 분리
This commit is contained in:
80
workspace/routers/yolo_router.py
Normal file
80
workspace/routers/yolo_router.py
Normal file
@@ -0,0 +1,80 @@
|
||||
# llmgateway/routers/stt_proxy.py
|
||||
import io
|
||||
import logging
|
||||
|
||||
import httpx
|
||||
from fastapi import APIRouter, Depends, File, HTTPException, Request, UploadFile
|
||||
from fastapi.responses import JSONResponse, StreamingResponse
|
||||
from utils.checking_keys import create_key
|
||||
from utils.logging_utils import EndpointLogger
|
||||
from utils.minio_utils import upload_file_to_minio_v2
|
||||
|
||||
router = APIRouter(tags=["YOLO Gateway"])
|
||||
|
||||
YOLO_BASE_URL = "http://yolo_gateway:8891" # docker-compose 내 서비스명 기반
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@router.post("/detect_view")
|
||||
async def proxy_audio(
|
||||
request_info: Request,
|
||||
image_file: UploadFile = File(...),
|
||||
endpoint_logger: EndpointLogger = Depends(EndpointLogger),
|
||||
):
|
||||
request_id = create_key()
|
||||
bucket_name = "yolo-gateway"
|
||||
object_name = f"{request_id}/{image_file.filename}"
|
||||
|
||||
try:
|
||||
presigned_url = upload_file_to_minio_v2(
|
||||
file=image_file,
|
||||
bucket_name=bucket_name,
|
||||
object_name=object_name,
|
||||
)
|
||||
except Exception as e:
|
||||
logger.error(f"MinIO upload failed: {e}")
|
||||
raise HTTPException(status_code=500, detail="File upload to storage failed.")
|
||||
|
||||
endpoint_logger.log(
|
||||
model="yolo11x", input_filename=image_file.filename, context_length=0
|
||||
)
|
||||
|
||||
try:
|
||||
async with httpx.AsyncClient() as client:
|
||||
payload = {
|
||||
"request_id": request_id,
|
||||
"file_url": presigned_url,
|
||||
}
|
||||
response = await client.post(f"{YOLO_BASE_URL}/detect", json=payload)
|
||||
return JSONResponse(content=response.json(), status_code=response.status_code)
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"YOLO API 호출 실패: {str(e)}")
|
||||
|
||||
|
||||
# YOLO 서버의 이미지 프록시
|
||||
@router.get("/detect_view/images/{request_id}")
|
||||
async def proxy_get_image(request_id: str):
|
||||
try:
|
||||
async with httpx.AsyncClient() as client:
|
||||
yolo_url = f"{YOLO_BASE_URL}/images/{request_id}"
|
||||
response = await client.get(yolo_url)
|
||||
response.raise_for_status()
|
||||
except httpx.HTTPError as e:
|
||||
raise HTTPException(status_code=500, detail=f"YOLO 이미지 요청 실패: {str(e)}")
|
||||
|
||||
return StreamingResponse(io.BytesIO(response.content), media_type="image/jpeg")
|
||||
|
||||
|
||||
# YOLO 서버의 JSON 결과 프록시
|
||||
@router.get("/detect_view/results/{request_id}")
|
||||
async def proxy_get_results(request_id: str):
|
||||
try:
|
||||
async with httpx.AsyncClient() as client:
|
||||
yolo_url = f"{YOLO_BASE_URL}/results/{request_id}"
|
||||
response = await client.get(yolo_url)
|
||||
response.raise_for_status()
|
||||
except httpx.HTTPError as e:
|
||||
raise HTTPException(status_code=500, detail=f"YOLO 결과 요청 실패: {str(e)}")
|
||||
|
||||
return JSONResponse(content=response.json(), status_code=response.status_code)
|
||||
Reference in New Issue
Block a user