Update api/routes.py
Browse files- api/routes.py +17 -40
api/routes.py
CHANGED
@@ -1,31 +1,15 @@
|
|
1 |
import json
|
2 |
from fastapi import APIRouter, Depends, HTTPException, Request, Response
|
3 |
from fastapi.responses import StreamingResponse
|
4 |
-
from slowapi import Limiter
|
5 |
-
from slowapi.util import get_remote_address
|
6 |
-
from slowapi.errors import RateLimitExceeded
|
7 |
from api.auth import verify_app_secret
|
8 |
from api.config import ALLOWED_MODELS
|
9 |
from api.models import ChatRequest
|
10 |
from api.utils import process_non_streaming_response, process_streaming_response
|
11 |
from api.logger import setup_logger
|
12 |
-
from api.rpmlimits import check_rate_limit
|
13 |
|
14 |
-
# Set up logging
|
15 |
logger = setup_logger(__name__)
|
16 |
|
17 |
-
# Initialize the router and limiter
|
18 |
router = APIRouter()
|
19 |
-
limiter = Limiter(key_func=get_remote_address)
|
20 |
-
|
21 |
-
# Rate limit exception handler
|
22 |
-
@router.exception_handler(RateLimitExceeded)
|
23 |
-
async def rate_limit_exceeded_handler(request: Request, exc: RateLimitExceeded):
|
24 |
-
return Response(
|
25 |
-
status_code=429,
|
26 |
-
content=json.dumps({"error": {"message": "Rate limit exceeded. Please wait and try again.", "type": "rate_limit"}}),
|
27 |
-
media_type="application/json"
|
28 |
-
)
|
29 |
|
30 |
@router.options("/v1/chat/completions")
|
31 |
@router.options("/api/v1/chat/completions")
|
@@ -46,40 +30,33 @@ async def list_models():
|
|
46 |
|
47 |
@router.post("/v1/chat/completions")
|
48 |
@router.post("/api/v1/chat/completions")
|
49 |
-
@limiter.limit("10/minute") # Limit to 10 requests per minute per IP
|
50 |
async def chat_completions(
|
51 |
-
request:
|
52 |
-
app_secret: str = Depends(verify_app_secret)
|
53 |
):
|
54 |
logger.info("Entering chat_completions route")
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
chat_request = ChatRequest(**request_body)
|
59 |
|
60 |
-
|
61 |
-
|
62 |
-
if chat_request.model not in [model["id"] for model in ALLOWED_MODELS]:
|
63 |
raise HTTPException(
|
64 |
status_code=400,
|
65 |
-
detail=f"Model {
|
66 |
)
|
67 |
|
68 |
-
if
|
69 |
logger.info("Streaming response")
|
70 |
-
return StreamingResponse(
|
71 |
-
process_streaming_response(chat_request, request),
|
72 |
-
media_type="text/event-stream"
|
73 |
-
)
|
74 |
else:
|
75 |
logger.info("Non-streaming response")
|
76 |
-
return await process_non_streaming_response(
|
|
|
77 |
|
78 |
-
@router.route('/')
|
79 |
-
@router.route('/healthz')
|
80 |
-
@router.route('/ready')
|
81 |
-
@router.route('/alive')
|
82 |
-
@router.route('/status')
|
83 |
@router.get("/health")
|
84 |
-
def health_check(request: Request):
|
85 |
-
return Response(content=json.dumps({"status": "ok"}), media_type="application/json")
|
|
|
1 |
import json
|
2 |
from fastapi import APIRouter, Depends, HTTPException, Request, Response
|
3 |
from fastapi.responses import StreamingResponse
|
|
|
|
|
|
|
4 |
from api.auth import verify_app_secret
|
5 |
from api.config import ALLOWED_MODELS
|
6 |
from api.models import ChatRequest
|
7 |
from api.utils import process_non_streaming_response, process_streaming_response
|
8 |
from api.logger import setup_logger
|
|
|
9 |
|
|
|
10 |
logger = setup_logger(__name__)
|
11 |
|
|
|
12 |
router = APIRouter()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
|
14 |
@router.options("/v1/chat/completions")
|
15 |
@router.options("/api/v1/chat/completions")
|
|
|
30 |
|
31 |
@router.post("/v1/chat/completions")
|
32 |
@router.post("/api/v1/chat/completions")
|
|
|
33 |
async def chat_completions(
|
34 |
+
request: ChatRequest, app_secret: str = Depends(verify_app_secret)
|
|
|
35 |
):
|
36 |
logger.info("Entering chat_completions route")
|
37 |
+
logger.info(f"Received request: {request}")
|
38 |
+
logger.info(f"App secret: {app_secret}")
|
39 |
+
logger.info(f"Received chat completion request for model: {request.model}")
|
|
|
40 |
|
41 |
+
if request.model not in [model["id"] for model in ALLOWED_MODELS]:
|
|
|
|
|
42 |
raise HTTPException(
|
43 |
status_code=400,
|
44 |
+
detail=f"Model {request.model} is not allowed. Allowed models are: {', '.join(model['id'] for model in ALLOWED_MODELS)}",
|
45 |
)
|
46 |
|
47 |
+
if request.stream:
|
48 |
logger.info("Streaming response")
|
49 |
+
return StreamingResponse(process_streaming_response(request), media_type="text/event-stream")
|
|
|
|
|
|
|
50 |
else:
|
51 |
logger.info("Non-streaming response")
|
52 |
+
return await process_non_streaming_response(request)
|
53 |
+
|
54 |
|
55 |
+
@router.route('/')
|
56 |
+
@router.route('/healthz')
|
57 |
+
@router.route('/ready')
|
58 |
+
@router.route('/alive')
|
59 |
+
@router.route('/status')
|
60 |
@router.get("/health")
|
61 |
+
def health_check(request: Request):
|
62 |
+
return Response(content=json.dumps({"status": "ok"}), media_type="application/json")
|