Ë
    ÛÓ^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   è ø€ ô ˜W¤c¨#£hÐ/¸SÔAÐAùs   ‚Ú*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¼#¼d¿j¹j»lÓ: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·}±}×7OÑ7OÓ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Ñ6°t¸W¿]¹]×=UÑ=UÓV×VÐVÐVúrD   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Ñ4°T¸7¿=¹=×;SÑ;SÓT×TÐTÐTúrD   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ÐBús   ƒ˜™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[   øè ø€ å)à—‘˜Ó!ˆØˆ=Ù¨CÐ8dÔeÐeØ -× @Ñ @ÀÓ GÐÜ Ø×.Ñ.Ð/DÓEÐReô
ð 	
ù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   ø€ à×ÑÔ Ü˜X tÐ,Ó-Ð-ó    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°}×7SÑ7SÓ7UÑ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Ñ SÐadÔeÐeÜ˜X tÐ,Ó-Ð-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ò ó ðð 	‡X�XÐ$Ó%ðQ¬ð Q´tô Qó &ðQð 	‡X�XÐÓ ðW¤7ð W´$ô Wó !ðWð 	‡X�XˆoÓðU¤ð U´ô Uó ðUð 	‡X�XÐ(Ó)ðC¬Gô Có *ðCð 	‡X�XˆmÓð	
œtô 	
ó ð	
ð 	‡X�XˆhÓó.ó ð.ð 	‡W�Wˆ\ÓØ‡[�[�ÓóXó ó ðXð 	‡W�WˆYÓó.ó ð.ð
 €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   