| 22 | |
| 23 | |
| 24 | async def chat_completions( |
| 25 | request: ChatCompletionRequest, |
| 26 | http_request: Request, |
| 27 | logger: logging.Logger = Depends(get_logger), |
| 28 | request_queue: Queue = Depends(get_request_queue), |
| 29 | server_state: dict = Depends(get_server_state), |
| 30 | worker_task=Depends(get_worker_task), |
| 31 | _lock: None = Depends(ensure_request_lock), |
| 32 | ) -> JSONResponse: |
| 33 | req_id = "".join(random.choices("abcdefghijklmnopqrstuvwxyz0123456789", k=7)) |
| 34 | |
| 35 | # Set log context (Grid Logger) |
| 36 | set_request_id(req_id) |
| 37 | set_source("API") |
| 38 | |
| 39 | logger.info(f"Received /v1/chat/completions request (Stream={request.stream})") |
| 40 | |
| 41 | launch_mode = get_environment_variable("LAUNCH_MODE", "unknown") |
| 42 | browser_page_critical = launch_mode != "direct_debug_no_browser" |
| 43 | |
| 44 | is_service_unavailable = ( |
| 45 | server_state["is_initializing"] |
| 46 | or not server_state["is_playwright_ready"] |
| 47 | or ( |
| 48 | browser_page_critical |
| 49 | and ( |
| 50 | not server_state["is_page_ready"] |
| 51 | or not server_state["is_browser_connected"] |
| 52 | ) |
| 53 | ) |
| 54 | or not worker_task |
| 55 | or worker_task.done() |
| 56 | ) |
| 57 | |
| 58 | if is_service_unavailable: |
| 59 | raise service_unavailable(req_id) |
| 60 | |
| 61 | result_future = Future() |
| 62 | queue_item = { |
| 63 | "req_id": req_id, |
| 64 | "request_data": request, |
| 65 | "http_request": http_request, |
| 66 | "result_future": result_future, |
| 67 | "enqueue_time": time.time(), |
| 68 | "cancelled": False, |
| 69 | } |
| 70 | await request_queue.put(queue_item) |
| 71 | |
| 72 | try: |
| 73 | timeout_seconds = RESPONSE_COMPLETION_TIMEOUT / 1000 + 120 |
| 74 | return await asyncio.wait_for(result_future, timeout=timeout_seconds) |
| 75 | except asyncio.TimeoutError: |
| 76 | raise HTTPException( |
| 77 | status_code=504, detail=f"[{req_id}] Request processing timed out." |
| 78 | ) |
| 79 | except asyncio.CancelledError: |
| 80 | logger.info(f"Request cancelled by client: {req_id}") |
| 81 | raise |