Ë
    ÛÓ^jžE  ã                   ób  — d Z ddl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
«       r4ddlmZmZ dd	lmZmZmZ dd
lmZ ddlmZmZ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m Z m!Z!m"Z"m#Z#m$Z$m%Z% erddl&m'Z'm(Z(m)Z)m*Z*  G d„ ded¬«      Z+h d£Z, ejZ                  e.«      Z/ G d„ de«      Z0y)z�
Handler for the /v1/chat/completions endpoint.

Supports streaming (SSE via DirectStreamer) and non-streaming (JSON) responses.
é    N)ÚAsyncGenerator)ÚTYPE_CHECKINGé   )Úlogging)Úis_serve_available)ÚJSONResponseÚStreamingResponse)ÚChatCompletionÚChatCompletionMessageÚChatCompletionMessageToolCall)ÚChoice)ÚChatCompletionChunkÚChoiceDeltaÚChoiceDeltaToolCall)ÚCompletionCreateParamsStreaming)ÚCompletionUsageé   )	ÚBaseGenerateManagerÚBaseHandlerÚModalityÚReasoningTextÚ_StreamErrorÚget_reasoning_configÚget_tool_call_configÚparse_reasoningÚparse_tool_calls)ÚGenerationConfigÚPreTrainedModelÚPreTrainedTokenizerFastÚProcessorMixinc                   ó,   — e Zd ZU eed<   eed<   eed<   y)Ú+TransformersCompletionCreateParamsStreamingÚgeneration_configÚseedÚchat_template_kwargsN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__ÚintÚdict© ó    ús/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/cli/serving/chat_completion.pyr"   r"   @   s   … ØÓØ
ƒIØÔr.   r"   F)Útotal>   ÚnÚuserÚaudioÚstoreÚlogprobsÚmetadataÚ	functionsÚ
modalitiesÚ
predictionÚtool_choiceÚservice_tierÚtop_logprobsÚfunction_callÚstream_optionsÚresponse_formatÚpresence_penaltyÚreasoning_effortÚweb_search_optionsÚparallel_tool_callsÚmax_completion_tokensc                   óˆ  ‡ — e Zd ZdZeZeZdede	de
ez  fd„Z	 	 dde	ddd	d
de	dedddededz  dedz  de
fd„Z	 	 dde	ddd	d
de	dedddededz  dedz  defd„Zd dedddefˆ fd„Z	 	 	 d!de	de	de	de	dedz  dee   dz  de	dz  defd„Z	 	 	 	 	 	 	 	 d"de	de	dz  de	dz  de	dz  de	dz  dedz  dedz  de	dz  de	fd„Zˆ xZS )#ÚChatCompletionHandlerz|Handler for the `/v1/chat/completions` endpoint.

    Supports both streaming (SSE) and non-streaming (JSON) responses.
    ÚbodyÚ
request_idÚreturnc              ƒ   ó2  K  — | j                  |«       | j                  |«      \  }}}| j                  j                  ||¬«      }| j                  j                  ||«      }t        j                  d|› d|› �«       | j                  j                  ||¬«      }| j                  |d   |«      }	t        d„ |	D «       «      }
i }|
rd|d<   |j                  | j                  «       |j                  |j                  d	i «      «        |j                  |	fd
|j                  d«      |rdndd
d
|t        j                   k(  xr |
dœ|¤Ž}|s|j#                  |j$                  «      }| j'                  ||j(                  |¬«      }|r|j+                  ||«       |j                  d«      rt-        ||«      nd}t/        |||d   «      }|j                  d«      }|r| j1                  |||||||||¬«	      S | j3                  |||||||||¬«	      ƒ d{  –—† S 7 Œ­w)a�  Validate the request, load the model, and dispatch to streaming or non-streaming.

        Args:
            body (`dict`): The raw JSON request body (OpenAI chat completion format).
            request_id (`str`): Unique request identifier (from header or auto-generated).

        Returns:
            `StreamingResponse | JSONResponse`: SSE stream or JSON depending on ``body["stream"]``.
        )Ú	processorz[Request received] Model: z, CB: ©Úuse_cbÚmessagesc              3   ó²   K  — | ]O  }t        |j                  d «      t        «      r|j                  d «      ng D ]  }|j                  d«      dk(  –— Œ ŒQ y­w)ÚcontentÚtypeÚvideoN)Ú
isinstanceÚgetÚlist)Ú.0ÚmsgÚcs      r/   ú	<genexpr>z7ChatCompletionHandler.handle_request.<locals>.<genexpr>€   sX   è ø€ ò 
àÜ,6°s·w±w¸yÓ7IÌ4Ô,P�c—g‘g˜iÔ(ÐVXò
ð ð �E‰E�&‹M˜WÕ$ð
Ø$ñ
ùs   ‚AAé    Ú
num_framesr%   TÚtoolsNÚpt)Úadd_generation_promptr\   Úreturn_tensorsÚreturn_dictÚtokenizeÚload_audio_from_videoÚ	input_idsÚstream)Úgen_managerÚtool_configÚreasoning_config)Ú_validate_requestÚ_resolve_modelÚmodel_managerÚget_model_modalityÚgeneration_stateÚuse_continuous_batchingÚloggerÚwarningÚget_managerÚ"get_processor_inputs_from_messagesÚanyÚupdater%   rT   Úapply_chat_templater   Ú
MULTIMODALÚtoÚdeviceÚ_build_generation_configr#   Úinit_cbr   r   Ú
_streamingÚ_non_streaming)ÚselfrG   rH   Úmodel_idÚmodelrK   ÚmodalityrM   re   Úprocessor_inputsÚ	has_videor%   ÚinputsÚ
gen_configrf   rg   Ú	streamings                    r/   Úhandle_requestz$ChatCompletionHandler.handle_requestm   sT  è ø€ ð 	×Ñ˜tÔ$à%)×%8Ñ%8¸Ó%>Ñ"ˆ�%˜Ø×%Ñ%×8Ñ8¸È)Ð8ÓTˆØ×&Ñ&×>Ñ>¸uÀhÓOˆÜ�‰Ð3°H°:¸VÀFÀ8ÐLÔMØ×+Ñ+×7Ñ7¸ÈÐ7ÓPˆØ×BÑBÀ4È
ÑCSÐU]Ó^Ðäñ 
à'ô
ó 
ˆ	ð &(ÐÙØ13Ð  Ñ.Ø×#Ñ# D×$=Ñ$=Ô>Ø×#Ñ# D§H¡HÐ-CÀRÓ$HÔIØ.�×.Ñ.Øð	
à"&Ø—(‘(˜7Ó#Ù#)™4¨tØØØ"*¬h×.AÑ.AÑ"AÒ"OÀiñ	
ð #ñ	
ˆñ Ø—Y‘Y˜uŸ|™|Ó,ˆFà×2Ñ2°4¸×9PÑ9PÐY_Ð2Ó`ˆ
áØ×Ñ  zÔ2à@DÇÁÈÔ@QÔ*¨9°eÔ<ÐW[ˆÜ/°	¸5À&ÈÑBUÓVÐà—H‘H˜XÓ&ˆ	ÙØ—?‘?ØØØØØØØ'Ø'Ø!1ð #ó 
ð 
ð ×,Ñ,ØØØØØØØ'Ø'Ø!1ð -ó 
÷ 
ð 
ð 
ús   ‚HHÈHÈHNr~   r   rK   z(ProcessorMixin | PreTrainedTokenizerFastr}   r‚   rƒ   r   re   rf   rg   c
           
      ó  ‡ ‡‡‡‡‡‡‡‡— |j                  |‰|‰‰‰|	¬«      \  ŠŠ|d   }
t        |
t        «      rt        |
«      n|
j                  d   Šdt
        t        df   fˆˆˆˆˆˆˆ ˆˆf	d„}t         |«       d¬«      S )	z(Stream tokens as SSE via DirectStreamer.)rH   rf   rg   rc   éÿÿÿÿrI   Nc                 ó–  •	K  — 	 ‰j                  ‰d‰¬«      ­–— d} | s=‰j                  «       ƒ d {  –—† }|g}	 	 |j                  ‰j                  «       «       Œ d}‰rdt        ‰‰j                  ‰d
   «      }|rHd}t        |«      D ]8  \  }}‰j                  ‰‰t        |d‰› d|› �|d   |d   dœ¬«      g¬«      ­–— Œ: ‰j                  d uxr ‰j                   ‰j                  k\  }|rd}	n|rd}	nd}	t#        ‰‰j                   ‰‰j                   z   ¬«      }
‰j                  ‰|	‰|
¬«      ­–— y 7 �Œ# t        j
                  $ r Y nw xY wg }|D ]¤  }|€d}  nžt        |t        «      r5|j                  d|j                  › d�«       dj                  |«      ­–—  y t        |t        «      r$|j                  ‰j                  ‰‰|¬«      «       Œ‚|j                  ‰j                  ‰‰|¬	«      «       Œ¦ |rdj                  |«      ­–— | s�Œù�Œ¾# t$        t        j&                  f$ r ‰j)                  «        ‚ w xY w­w)NÚ	assistant)Úroler~   FTzdata: {"error": "z"}

Ú )r~   Úreasoning_content)r~   rP   ÚschemaÚfunctionÚ_tool_call_ÚnameÚ	arguments©r�   r‘   )ÚindexrQ   ÚidrŽ   )r~   Ú
tool_callsr•   ÚlengthÚstop©Úprompt_tokensÚcompletion_tokensÚtotal_tokens)Úfinish_reasonr~   Úusage)Ú_build_chunk_sserT   ÚappendÚ
get_nowaitÚasyncioÚ
QueueEmptyrS   r   rW   Újoinr   r   Úgenerated_token_idsÚ	enumerater   Úmax_new_tokensr›   r   ÚGeneratorExitÚCancelledErrorÚcancel)ÚdoneÚtextÚbatchÚ	sse_partsÚhas_tool_callsÚparsedÚiÚtcÚhit_maxrœ   r�   rƒ   Ú	input_lenr}   rK   ÚqueuerH   r|   Ústreamerrf   s              €€€€€€€€€r/   Ússe_genz1ChatCompletionHandler._streaming.<locals>.sse_gen×   s“  øè ø€ ðJØ×+Ñ+¨J¸[ÐPXÐ+ÓYÓYà�ÙØ!&§¡£×,�DØ!˜F�EðØ"Ø!ŸL™L¨×)9Ñ)9Ó);Ô<ð #ð2 "'�ÙÜ-¨i¸×9UÑ9UÐWbÐckÑWlÓm�FÙØ)-˜Ü%.¨vÓ%6ò ™E˜A˜rØ"&×"7Ñ"7Ø *Ø&.ä$7Ø./Ø-7Ø.8¨\¸ÀQÀCÐ+HØ:<¸V¹*ÐSUÐVaÑSbÑ1cô	%&ð,"ð #8ó #ô ðð %×3Ñ3¸4Ð?ÒvÀH×DYÑDYÐ]g×]vÑ]vÑDv�Ù!Ø$0‘MÙØ$,‘Mà$*�MÜ'Ø"+Ø&.×&;Ñ&;Ø!*¨X×-BÑ-BÑ!Bô�ð
 ×+Ñ+ØØ"/Ø"Øð	 ,ó ô ðw -úô
 #×-Ñ-ò Ùðúð ,.�IØ %ò n˜Ø˜<Ø#'˜DÙ!Ü% d¬LÔ9Ø%×,Ñ,Ð/AÀ$Ç(Á(ÀÈ7Ð-SÔTØ"$§'¡'¨)Ó"4Ó4Ù"ä% d¬MÔ:Ø%×,Ñ,¨T×-BÑ-BÀ:ÐU]ÐquÐ-BÓ-vÕwà%×,Ñ,¨T×-BÑ-BÀ:ÐU]ÐgkÐ-BÓ-lÕmðnñ !Ø Ÿg™g iÓ0Ó0ó3 úôD "¤7×#9Ñ#9Ð:ò ð —‘Ô!Øð	üs^   ƒI	….H ³D8´H ¼!D; ÁCH Ä7I	Ä8H Ä;EÅH ÅEÅAH Æ%I	Æ&A1H È+IÉI	ztext/event-stream©Ú
media_type)Úgenerate_streamingrS   rU   ÚlenÚshaper   r)   r	   )r|   rH   r~   rK   r}   r‚   rƒ   re   rf   rg   rc   r¶   r³   r´   rµ   s   `` `` ` `   @@@r/   rz   z ChatCompletionHandler._streaming½   sŽ   ÿø€ ð &×8Ñ8ØØØØØ!Ø#Ø-ð 9ó 
‰ˆˆxð ˜;Ñ'ˆ	ä&0°¼DÔ&A”C˜	”NÀyÇÁÐWYÑGZˆ	ðK	œ~¬c°4¨iÑ8÷ K	õ K	ôZ !¡£Ð7JÔKÐKr.   c
              ƒ   ó  K  — |j                  |||||¬«      ƒ d{  –—† \  }
}}|j                  duxr t        |«      |j                  k\  }t        |«      }t        ||||z   ¬«      }d}|�It	        |||d   «      }|r7t        |«      D ��cg c]!  \  }}t        |› d|› �d|d   |d   d	œ¬
«      ‘Œ# }}}d}|	�t        |||
|	«      \  }
}|�d}n|rd}nd}t        | j                  ||
|||||¬«      d¬«      S 7 ŒÝc c}}w ­w)z)Run generation and return a JSONResponse.)rH   Nr˜   r�   r�   rŽ   r�   r‘   r’   )r”   rQ   rŽ   r•   r–   r—   )rœ   r�   r•   rŒ   zapplication/jsonr·   )
Úgenerate_non_streamingr¦   rº   r   r   r¥   r   r   r   Ú_build_completion)r|   rH   r~   rK   r}   r‚   rƒ   re   rf   rg   rP   r³   Úgenerated_idsr²   rš   r�   r•   r¯   r°   r±   rŒ   rœ   s                         r/   r{   z$ChatCompletionHandler._non_streaming(  sw  è ø€ ð 3>×2TÑ2TØ�9˜f j¸Zð 3Uó 3
÷ -
Ñ)ˆ�˜Mð ×+Ñ+°4Ð7Òk¼CÀÓ<NÐR\×RkÑRkÑ<kˆÜ Ó.ÐÜØ#Ø/Ø"Ð%6Ñ6ô
ˆð ˆ
ØÐ"Ü% i°ÀÈHÑ@UÓVˆFÙô "+¨6Ó!2÷ñ ˜˜2ô 2Ø(˜\¨°Q°CÐ8Ø'Ø*,¨V©*À2ÀkÁ?Ñ!Söð�
ñ ð !ÐØÐ'Ü)8¸ÀMÐSZÐ\lÓ)mÑ&ˆGÐ&àÐ!Ø(‰MÙØ$‰Mà"ˆMäØ×"Ñ"ØØØØ+ØØ%Ø"3ð #ó ð *ô
ð 	
ðI-
úó ùs#   ‚DœC:�A0DÂ&C<Â3ADÃ<DÚmodel_generation_configrM   c                 ó’  •— t         ‰| �  |||¬«      }|j                  d«      �t        |d   «      |_        |j                  d«      �dt        |d   «      z   |_        |j                  d«      �6|d   j                  «       D ��ci c]  \  }}t        |«      f|“Œ c}}|_        |j                  d«      �
|d   |_	        |S c c}}w )z�Apply Chat Completions params (``max_tokens``, ``frequency_penalty``, ``logit_bias``,
        ``stop``) on top of the base generation config.rL   Ú
max_tokensÚfrequency_penaltyg      ð?Ú
logit_biasr—   )
Úsuperrx   rT   r+   r¦   ÚfloatÚrepetition_penaltyÚitemsÚsequence_biasÚstop_strings)r|   rG   rÀ   rM   r#   ÚkÚvÚ	__class__s          €r/   rx   z.ChatCompletionHandler._build_generation_configh  sÐ   ø€ ô "™GÑ<¸TÐCZÐciÐ<ÓjÐà�8‰8�LÓ!Ð-Ü/2°4¸Ñ3EÓ/FÐÔ,Ø�8‰8Ð'Ó(Ð4Ø36¼¸tÐDWÑ?XÓ9YÑ3YÐÔ0Ø�8‰8�LÓ!Ð-ØHLÈ\ÑHZ×H`ÑH`ÓHb×.cÁÀÀ1´°A³¨y¸!©|Ó.cÐÔ+Ø�8‰8�FÓÐ'Ø-1°&©\ÐÔ*à Ð ùó	 /ds   ÂCrP   rœ   r�   r•   rŒ   c                 óÌ   — t        j                  |d||dœ«      }t        |t        t	        j                  «       «      d|t        d||¬«      g|¬«      }	|	j                  d¬«      S )	aÁ  Build a non-streaming ChatCompletion response dict.

        Args:
            request_id (`str`): Unique request identifier.
            content (`str`): The generated text.
            model_id (`str`): Model ID to include in the response.
            finish_reason (`str`): Why generation stopped (``"stop"``, ``"length"``, ``"tool_calls"``).
            usage (`CompletionUsage`, *optional*): Token usage statistics.
            tool_calls (`list[dict]`, *optional*): Parsed tool calls, if any.
            reasoning_content (`str`, *optional*): Chain-of-thought content extracted from the response.

        Returns:
            `dict`: Serialized ``ChatCompletion`` ready for JSON response.
        r‰   ©rP   rŠ   r•   rŒ   zchat.completionr   )r“   Úmessagerœ   )r”   ÚcreatedÚobjectr~   Úchoicesr�   T)Úexclude_none)r   Úmodel_validater
   r+   Útimer   Ú
model_dump)
r|   rH   rP   r}   rœ   r�   r•   rŒ   rÐ   Úresults
             r/   r¾   z'ChatCompletionHandler._build_completionz  sl   € ô4 (×6Ñ6Ø¨ÀJÐevÑwó
ˆô  ØÜœŸ	™	›Ó$Ø$ØÜ !¨WÀMÔRÐSØô
ˆð × Ñ ¨dÐ Ó3Ð3r.   rŠ   c	           
      óÌ   — t        j                  ||||dœ«      }	t        |t        t	        j                  «       «      |t        |	d|¬«      g|dd¬«      }
| j                  |
«      S )aí  Build a streaming ``ChatCompletionChunk`` and format it as an SSE ``data:`` line.

        Args:
            request_id (`str`): Unique request identifier.
            content (`str`, *optional*): Text content delta.
            model (`str`, *optional*): Model ID.
            role (`str`, *optional*): Role (only sent in the first chunk).
            finish_reason (`str`, *optional*): Set on the final chunk.
            tool_calls (`list`, *optional*): Tool call deltas.
            usage (`CompletionUsage`, *optional*): Token usage (sent with the final chunk).
            reasoning_content (`str`, *optional*): Reasoning/thinking delta (OpenAI-compatible extension).

        Returns:
            `str`: A formatted SSE event string.
        rÏ   r   )Údeltar“   rœ   r‹   zchat.completion.chunk)r”   rÑ   r~   rÓ   r�   Úsystem_fingerprintrÒ   )r   rÕ   r   r+   rÖ   ÚChoiceChunkÚchunk_to_sse)r|   rH   rP   r~   rŠ   rœ   r•   r�   rŒ   rÚ   Úchunks              r/   rž   z&ChatCompletionHandler._build_chunk_sse¡  sl   € ô8 ×*Ñ*Ø¨¸ZÐ^oÑpó
ˆô $ØÜœŸ	™	›Ó$ØÜ  u°AÀ]ÔSÐTØØ!Ø*ô
ˆð × Ñ  Ó'Ð'r.   )NN)F)NNN)r‹   NNNNNNN)r&   r'   r(   Ú__doc__r"   Ú_valid_params_classÚUNUSED_CHAT_COMPLETION_FIELDSÚ_unused_fieldsr,   r)   r	   r   r…   r   rz   r{   Úboolrx   r   rU   r¾   rž   Ú__classcell__)rÍ   s   @r/   rF   rF   d   sc  ø„ ñð
 FÐØ2€NðL¨ð L¸3ð LÐCTÐWcÑCcó Lðr $(Ø(,ñgLàðgLð !ðgLð >ð	gLð
 ðgLð ðgLð 'ðgLð )ðgLð ˜D‘[ðgLð  ™+ðgLð 
ógLðh $(Ø(,ñ<
àð<
ð !ð<
ð >ð	<
ð
 ð<
ð ð<
ð 'ð<
ð )ð<
ð ˜D‘[ð<
ð  ™+ð<
ð 
ó<
ñ@!¨Tð !ÐL^ð !Ðhlõ !ð0 )-Ø(,Ø(,ñ%4àð%4ð ð%4ð ð	%4ð
 ð%4ð  Ñ%ð%4ð ˜‘J Ñ%ð%4ð  ™:ð%4ð 
ó%4ðR Ø"Ø ØØ$(Ø"&Ø(,Ø(,ñ((àð((ð �t‘ð((ð �T‰zð	((ð
 �D‰jð((ð ˜T‘zð((ð ˜4‘Kð((ð  Ñ%ð((ð  ™:ð((ð 
÷((r.   rF   )1rß   r¡   rÖ   Úcollections.abcr   Útypingr   Úutilsr   Úutils.import_utilsr   Úfastapi.responsesr   r	   Úopenai.types.chatr
   r   r   Ú!openai.types.chat.chat_completionr   Ú'openai.types.chat.chat_completion_chunkr   r   r   rÜ   Ú*openai.types.chat.completion_create_paramsr   Úopenai.types.completion_usager   r   r   r   r   r   r   r   r   r   Útransformersr   r   r   r    r"   rá   Ú
get_loggerr&   rn   rF   r-   r.   r/   ú<module>rñ      s¢   ðñó Û Ý *Ý  å Ý 4ñ ÔßA÷ñ õ
 9÷ñ õ
 NÝZÝ=÷
÷ 
õ 
ñ ßgÓgôÐ2QÐY^õ ò!Ð ð0 
ˆ×	Ñ	˜HÓ	%€ôe(˜Kõ e(r.   