
    ^j                        d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	  e	       rddl
mZmZ dd	lmZ dd
lmZmZ erddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZmZmZ  ej>                  e       Z!	 d dedddddddddede"ddfdZ#y)!z
FastAPI app factory.
    N)asynccontextmanager)TYPE_CHECKING   )logging)is_serve_available)FastAPIRequest)CORSMiddleware)JSONResponseStreamingResponse   )ChatCompletionHandler)CompletionHandler)ResponseHandler)TranscriptionHandler)ModelManager)X_REQUEST_IDCBWorkerDeadErrorGenerationStatemodel_managerchat_handlerr   completion_handlerr   response_handlerr   transcription_handlerr   generation_stateenable_corsreturnr   c                 j    t         dt        f fd       }t        |      }|j                  t              dt        dt        fd       }	|r2|j                  t        dgddgdg	       t        j                  d
       |j                  d      dt        fd       }
|j                  d      dt        dt        ffd       }|j                  d      dt        dt        ffd       }|j                  d      dt        dt        ffd       }|j                  d      dt        ffd       }|j                  d      dt        f fd       }|j                  d       fd       }|j                  d      |j                  d       fd              }|j                  d      fd       }|S )a{  Build and return a configured FastAPI application.

    Args:
        model_manager: Handles model loading, caching, and cleanup.
        chat_handler: Handles `/v1/chat/completions` requests.
        response_handler: Handles `/v1/responses` requests.
        generation_state: Owns the per-model generation managers (regular and CB). Passed
            in here so `/health` can check whether the CB worker has died and respond with
            503 instead of a misleading 200.
        enable_cors: If `True`, adds permissive CORS middleware (allow all origins).

    Returns:
        A FastAPI app ready to be passed to uvicorn.
    appc                8   K   d  j                          y wN)shutdown)r   r   s    j/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/cli/serving/server.pylifespanzbuild_server.<locals>.lifespanD   s      s   )r$   _requestexcc                 :   K   t        dt        |      id      S w)Nerror  status_code)r   str)r%   r&   s     r#   _cb_dead_handlerz&build_server.<locals>._cb_dead_handlerK   s      Wc#h/SAAs   *T)allow_originsallow_credentialsallow_methodsallow_headersz@CORS allow origin is set to `*`. Not recommended for production.httprequestc                    K   | j                   j                  t              xs t        t	        j
                               }|| j                  _         ||        d{   }||j                   t        <   |S 7 w)z(Get or set the request ID in the header.N)headersgetr   r,   uuiduuid4state
request_id)r4   	call_nextr;   responses       r#   request_id_middlewarez+build_server.<locals>.request_id_middleware\   s_      __((6K#djjl:K
#- "7++)3& ,s   AA9A7A9z/v1/chat/completionsbodyc                 l   K   j                  || j                  j                         d {   S 7 wr!   handle_requestr:   r;   )r4   r?   r   s     r#   chat_completionsz&build_server.<locals>.chat_completionsg   s*     !00w}}7O7OPPPP   *424z/v1/completionsc                 l   K   j                  || j                  j                         d {   S 7 wr!   rA   )r4   r?   r   s     r#   completionsz!build_server.<locals>.completionsk   s*     '66tW]]=U=UVVVVrD   z/v1/responsesc                 l   K   j                  || j                  j                         d {   S 7 wr!   rA   )r4   r?   r   s     r#   	responseszbuild_server.<locals>.responseso   s*     %44T7==;S;STTTTrD   z/v1/audio/transcriptionsc                 B   K   j                  |        d {   S 7 wr!   )rB   )r4   r   s    r#   audio_transcriptionsz*build_server.<locals>.audio_transcriptionss   s     *99'BBBBs   z/load_modelc                    K   ddl m} | j                  d      }|
 |dd      j                  |      }t	        j                  |      d      S w)	Nr   )HTTPExceptionmodeli  z*Missing `model` field in the request body.)r+   detailztext/event-stream)
media_type)fastapirL   r7   process_model_namer   load_model_streaming)r?   rL   rM   model_id_and_revisionr   s       r#   
load_modelz build_server.<locals>.load_modelw   s[     )!=C8dee - @ @ G ../DERe
 	
s   AAz/resetc                  >     j                          t        ddi      S )Nstatusok)r"   r   r   s   r#   resetzbuild_server.<locals>.reset   s     Xt,--    z
/v1/modelsc                  <    t        d j                         d      S )Nlist)objectdata)r   get_gen_modelsrX   s   r#   list_modelsz!build_server.<locals>.list_models   s     v}7S7S7UVWWrZ   z/healthc                  ^     j                         st        dddd      S t        ddi      S )N	unhealthycb_worker_dead)rV   reasonr)   r*   rV   rW   )is_cb_aliver   )r   s   r#   healthzbuild_server.<locals>.health   s3    ++-;BR SadeeXt,--rZ   )r   r   exception_handlerr   r	   add_middlewarer
   loggerwarning_once
middlewarepostdictr7   options)r   r   r   r   r   r   r   r$   r   r-   r>   rC   rF   rH   rJ   rT   rY   r`   rf   s   ``````             r#   build_serverro   ,   s	   0 !G ! ! 8
$C,-B B7H B .B %"%% 	 	
 	^_ 	^^FW   	XX$%Q Qt Q &Q 	XX W7 W$ W !W 	XXoU U U U 	XX()CG C *C 	XXm	
t 	
 	
 	XXh. . 	WW\[[X  X 	WWY. .
 JrZ   )F)$__doc__r8   
contextlibr   typingr   utilsr   utils.import_utilsr   rP   r   r	   fastapi.middleware.corsr
   fastapi.responsesr   r   chat_completionr   
completionr   r=   r   transcriptionr   r   r   r   r   r   
get_logger__name__ri   boolro    rZ   r#   <module>r~      s     *    4 (6A6-)3 ' C C 
		H	% gg)g ,g (	g
 2g &g g grZ   