ó
    ‡Ž¡j B  ã                   ól  • S r SSKrSSKrSSKJr  SSKJr  SSKJr  SSK	J
r
  \
" 5       (       a4  SSKJrJr  SS	KJrJrJr  SS
KJr  SSKJrJrJr  SS
KJr  SSKJr  SSKJr  SSKJrJrJrJ r J!r!J"r"J#r#J$r$  \(       a  SSK%J&r&J'r'J(r(J)r)   " S S\SS9r*1 Skr+\RX                  " \-5      r. " S S\5      r/g)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ÚToolCallÚ_StreamErrorÚbuild_response_parserÚparse_assistant_message)ÚGenerationConfigÚPreTrainedModelÚPreTrainedTokenizerFastÚProcessorMixinc                   ó4   • \ rS rSr% \\S'   \\S'   \\S'   Srg)Ú+TransformersCompletionCreateParamsStreamingé?   Úgeneration_configÚseedÚchat_template_kwargs© N)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__ÚstrÚ__annotations__ÚintÚdictÚ__static_attributes__r&   ó    Ú¶C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\transformers/cli/serving/chat_completion.pyr!   r!   ?   s   ‡ ØÓØ
ƒIØÖr0   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                   óp  ^ • \ rS rSrSr\r\rS\	S\
S\\-  4S jrS\
SSS	S
S\
S\	SSS\S\4S jrS\
SSS	S
S\
S\	SSS\S\4S jrSS\	SSS\4U 4S jjjr   S S\
S\
S\
S\
S\S-  S\\	   S-  S\
S-  S\	4S jjr        S!S\
S\
S-  S\
S-  S\
S-  S\
S-  S\S-  S\S-  S\
S-  S\
4S jjrSrU =r$ )"ÚChatCompletionHandleréc   ztHandler for the `/v1/chat/completions` endpoint.

Supports both streaming (SSE) and non-streaming (JSON) responses.
ÚbodyÚ
request_idÚreturnc           
   ƒ   óÞ  #   • U R                  U5        U R                  U5      u  p4nU R                  R                  XES9nU R                  R                  XF5      n[        R                  SU SU 35        U R                  R                  X7S9nU R                  US   U5      n	[        S U	 5       5      n
0 nU
(       a  SUS'   UR                  U R                  5        UR                  UR                  S	0 5      5        UR                  " U	4S
UR                  S5      U(       a  SOSS
S
U[        R                   :H  =(       a    U
S.UD6nU(       d  UR#                  UR$                  5      nU R'                  XR(                  US9nU(       a  UR+                  XM5        UR                  S5      nU(       a  U R-                  UUUUUUUS9$ U R/                  UUUUUUUS9I Sh  v•N $  N7f)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   óÈ   #   • U  HX  n[        UR                  S 5      [        5      (       a  UR                  S 5      O/   H  nUR                  S5      S:H  v •  M     MZ     g7f)ÚcontentÚtypeÚvideoN)Ú
isinstanceÚgetÚlist)Ú.0ÚmsgÚcs      r1   Ú	<genexpr>Ú7ChatCompletionHandler.handle_request.<locals>.<genexpr>   sU   é € ð 
â'�Ü,6°s·w±w¸yÓ7IÌ4×,PÑ,P�c—g‘g˜iÔ(ÐVXÓX�ð �E‰E�&‹M˜WÖ$áXñ %Ú'ùs   ‚A A"é    Ú
num_framesr%   TÚtoolsNÚpt)Úadd_generation_promptr`   Úreturn_tensorsÚreturn_dictÚtokenizeÚload_audio_from_videoÚstream)Úgen_manager)Ú_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%   rW   Úapply_chat_templater   Ú
MULTIMODALÚtoÚdeviceÚ_build_generation_configr#   Úinit_cbÚ
_streamingÚ_non_streaming)ÚselfrJ   rK   Úmodel_idÚmodelrN   ÚmodalityrP   rh   Úprocessor_inputsÚ	has_videor%   ÚinputsÚ
gen_configÚ	streamings                  r1   Úhandle_requestÚ$ChatCompletionHandler.handle_requestl   s
  é € ð 	×Ñ˜tÔ$à%)×%8Ñ%8¸Ó%>Ñ"ˆ˜Ø×%Ñ%×8Ñ8¸Ð8ÐTˆØ×&Ñ&×>Ñ>¸uÓ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Ð`ˆ
æØ×Ñ Ô2à—H‘H˜XÓ&ˆ	ÞØ—?‘?ØØØØØØØ'ð #ð ð ð ×,Ñ,ØØØØØØØ'ð -ð ÷ ð ñ ùs   ‚G$G-Ç&G+Ç'G-r   r   rN   z(ProcessorMixin | PreTrainedTokenizerFastr~   rƒ   r„   r   rh   c           	      ó  ^ ^^^^^^• [        X2US   5      nUR                  UUUTTUS9u  mmUS   n	[        U	[        5      (       a  [	        U	5      OU	R
                  S   mS[        [        S4   4UUUUUU U4S jjn
[        U
" 5       SS9$ )	z(Stream tokens as SSE via DirectStreamer.Ú	input_ids)rK   Úresponse_parseréÿÿÿÿrL   Nc                 óÞ  >#   •  TR                  TSTS97v •  Sn SnSnU(       d>  TR                  5       I S h  v•N nU/n  UR                  TR                  5       5        M!  T	R                  S L=(       a    TR                   T	R                  :¬  nU(       a  SnOU(       a  SnOSn[#        T
TR                   T
TR                   -   S9nTR                  TUTUS97v •  g  N¦! [        R
                   a     Of = f/ nU GH  nUc  Sn  GO[        U[        5      (       a5  UR                  SUR                   S35        SR                  U5      7v •    g [        U[        5      (       aP  SnUR                  TR                  TT[        U S	T S
U  3UR                  UR                  S.S9/S95        U S-  n M»  [        U[        5      (       a"  UR                  TR                  TTUS95        Mò  UR                  TR                  TTUS95        GM     U(       a  SR                  U5      7v •  U(       d  GM  GNÚ! [$        [        R&                  4 a    TR)                  5         e f = f7f)NÚ	assistant)Úroler   r   FTzdata: {"error": "z"}

Ú ÚfunctionÚ_tool_call_©ÚnameÚ	arguments)ÚindexrT   Úidr�   )r   Ú
tool_callsr   )r   Úreasoning_content)r   rS   r—   ÚlengthÚstop©Úprompt_tokensÚcompletion_tokensÚtotal_tokens)Úfinish_reasonr   Úusage)Ú_build_chunk_sserW   ÚappendÚ
get_nowaitÚasyncioÚ
QueueEmptyrV   r   rZ   Újoinr   r   r“   r”   r   Úmax_new_tokensrž   r   ÚGeneratorExitÚCancelledErrorÚcancel)Útool_call_indexÚhas_tool_callsÚdoneÚitemÚbatchÚ	sse_partsÚhit_maxrŸ   r    r„   Ú	input_lenr~   ÚqueuerK   r}   Ústreamers            €€€€€€€r1   Ússe_genÚ1ChatCompletionHandler._streaming.<locals>.sse_genÍ   s‚  øé € ðGØ×+Ñ+¨J¸[ÐPXÐ+ÐYÓYà"#�Ø!&�Ø�ÞØ!&§¡£×,�DØ!˜F�EðØ"Ø!ŸL™L¨×)9Ñ)9Ó);Ô<ñ #ðN %×3Ñ3¸4Ð?×vÀH×DYÑDYÐ]g×]vÑ]vÑDv�Þ!Ø$0‘MÞØ$,‘Mà$*�MÜ'Ø"+Ø&.×&;Ñ&;Ø!*¨X×-BÑ-BÑ!Bñ�ð
 ×+Ñ+ØØ"/Ø"Øð	 ,ð ô ñm -øô
 #×-Ñ-ó Ùðúð ,.�IÜ %˜Ø™<Ø#'˜DÚ!Ü% d¬L×9Ñ9Ø%×,Ñ,Ð/AÀ$Ç(Á(ÀÈ7Ð-SÔTØ"$§'¡'¨)Ó"4Ó4Ù"Ü% d¬H×5Ñ5Ø-1˜NØ%×,Ñ,Ø $× 5Ñ 5Ø$.Ø*2ä(;Ø2AØ1;Ø2<°¸[ÈÐHYÐ/ZØ>B¿i¹iÐVZ×VdÑVdÑ5eñ	)*ð0&ð !6ð !"ôð ,¨qÑ0šOÜ'¨¬m×<Ñ<Ø%×,Ñ,¨T×-BÑ-BÀ:ÐU]ÐquÐ-BÐ-vÖwà%×,Ñ,¨T×-BÑ-BÀ:ÐU]ÐgkÐ-BÐ-l×mñ9 !&ö< !Ø Ÿg™g iÓ0Ó0÷S ›$øôz "¤7×#9Ñ#9Ð:ó ð —‘Ô!Øð	üs_   ƒI-…4H> ¹C ºH> Á"C" Á$A;H> ÃI-Ã H> Ã"C9Ã6H> Ã8C9Ã9AH> ÅI-ÅC#H> È>,I*É*I-ztext/event-stream©Ú
media_type)	r   Úgenerate_streamingrV   rX   ÚlenÚshaper   r+   r	   )r}   rK   r   rN   r~   rƒ   r„   rh   rŠ   r‰   rµ   r²   r³   r´   s   ``  ` `    @@@r1   r{   Ú ChatCompletionHandler._streamingµ   sž   þ€ ô 0°	À&ÈÑBUÓVˆØ%×8Ñ8ØØØØØ!Ø+ð 9ð 
‰ˆˆxð ˜;Ñ'ˆ	ä&0°¼D×&AÑ&A”C˜	”NÀyÇÁÐWYÑGZˆ	ðH	œ~¬c°4¨iÑ8÷ H	õ H	ôT !¡£Ð7JÑKÐKr0   c              ƒ   óø  #   • UR                  X#XVUS9I Sh  v•N u  p‰n
UR                  SL=(       a    [        U
5      UR                  :¬  n[        U
5      n[        U	UXœ-   S9n[	        X2X¥S   US9u  pŽnSnU(       aE  [        U5       VVs/ s H-  u  nn[        U SU 3SUR                  UR                  S.S	9PM/     nnnUb  S
nOU(       a  SnOSn[        U R                  UUUUUUUS9SS9$  NÚs  snnf 7f)z)Run generation and return a JSONResponse.)rK   Nr›   r‰   )r‰   Úcleaned_contentr‘   r�   r’   )r–   rT   r�   r—   r™   rš   )rŸ   r    r—   r˜   zapplication/jsonr·   )Úgenerate_non_streamingr§   rº   r   r   Ú	enumerater   r“   r”   r   Ú_build_completion)r}   rK   r   rN   r~   rƒ   r„   rh   rS   r²   Úgenerated_idsr±   r�   r    r˜   Úparsed_tool_callsr—   ÚiÚtcrŸ   s                       r1   r|   Ú$ChatCompletionHandler._non_streaming  sV  é € ð 3>×2TÑ2TØ˜f¸Zð 3Uð 3
÷ -
Ñ)ˆ˜Mð ×+Ñ+°4Ð7×k¼CÀÓ<NÐR\×RkÑRkÑ<kˆÜ Ó.ÐÜØ#Ø/Ø"Ñ6ñ
ˆô 9PØ˜m¸kÑ7JÐ\cñ9
Ñ5ˆÐ$5ð ˆ
Þô 'Ð'8Ô9ôò :‘E�A�rô .Ø$˜ [°°Ð4Ø#Ø&(§g¡g¸B¿L¹LÑIôñ
 :ð ñ ð Ñ!Ø(‰MÞØ$‰Mà"ˆMäØ×"Ñ"ØØØØ+ØØ%Ø"3ð #ð ð *ñ
ð 	
ñC-
ùó"ùs"   ‚C:—C2˜A4C:Â4C4Ã 3C:Ã4C:Úmodel_generation_configrP   c                 ó–  >• [         TU ]  XUS9nUR                  S5      b  [        US   5      Ul        UR                  S5      b  S[        US   5      -   Ul        UR                  S5      b8  US   R                  5        VVs0 s H  u  pV[        U5      4U_M     snnUl        UR                  S5      b
  US   Ul	        U$ s  snnf )z…Apply Chat Completions params (``max_tokens``, ``frequency_penalty``, ``logit_bias``,
``stop``) on top of the base generation config.rO   Ú
max_tokensÚfrequency_penaltyg      ð?Ú
logit_biasrš   )
Úsuperry   rW   r-   r§   ÚfloatÚrepetition_penaltyÚitemsÚsequence_biasÚstop_strings)r}   rJ   rÇ   rP   r#   ÚkÚvÚ	__class__s          €r1   ry   Ú.ChatCompletionHandler._build_generation_configV  sÑ   ø€ ô "™GÑ<¸TÐ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ÒHbÁÀ´°A³¨y¸!ª|ÑHbÒ.cÐÔ+Ø�8‰8�FÓÑ'Ø-1°&©\ÐÔ*à Ð ùó	 /ds   ÂCNrS   rŸ   r    r—   r˜   c                 óº   • [         R                  " USXgS.5      n[        U[        [        R                  " 5       5      SU[        SX„S9/US9n	U	R                  SS9$ )	ai  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�   ©rS   rŽ   r—   r˜   zchat.completionr   )r•   ÚmessagerŸ   )r–   ÚcreatedÚobjectr   Úchoicesr    T)Úexclude_none)r   Úmodel_validater
   r-   Útimer   Ú
model_dump)
r}   rK   rS   r~   rŸ   r    r—   r˜   rØ   Úresults
             r1   rÁ   Ú'ChatCompletionHandler._build_completionh  sg   € ô4 (×6Ò6Ø¨ÀJÑwó
ˆô  ØÜœŸ	š	›Ó$Ø$ØÜ !¨WÑRÐSØñ
ˆð × Ñ ¨dÐ Ð3Ð3r0   rŽ   c	                 óÀ   • [         R                  " X$XhS.5      n	[        U[        [        R                  " 5       5      U[        U	SUS9/USSS9n
U R                  U
5      $ )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}   rK   rS   r   rŽ   rŸ   r—   r    r˜   rã   Úchunks              r1   r¡   Ú&ChatCompletionHandler._build_chunk_sse�  sg   € ô8 ×*Ò*Ø¸ZÑpó
ˆô $ØÜœŸ	š	›Ó$ØÜ  u°AÀ]ÑSÐTØØ!Ø*ñ
ˆð × Ñ  Ó'Ð'r0   r&   )F)NNN)r�   NNNNNNN)r'   r(   r)   r*   Ú__doc__r!   Ú_valid_params_classÚUNUSED_CHAT_COMPLETION_FIELDSÚ_unused_fieldsr.   r+   r	   r   r†   r   r{   r|   Úboolry   r   rX   rÁ   r¡   r/   Ú__classcell__)rÔ   s   @r1   rH   rH   c   s!  ø† ñð
 FÐØ2€NðE¨ð E¸3ð EÐCTÐWcÑCcô EðRbLàðbLð !ðbLð >ð	bLð
 ðbLð ðbLð 'ðbLð )ðbLð 
ôbLðL7
àð7
ð !ð7
ð >ð	7
ð
 ð7
ð ð7
ð 'ð7
ð )ð7
ð 
ô7
ñv!¨Tð !ÐL^ð !Ðhl÷ !ð !ð0 )-Ø(,Ø(,ñ%4àð%4ð ð%4ð ð	%4ð
 ð%4ð  Ñ%ð%4ð ˜‘J Ñ%ð%4ð  ™:ð%4ð 
õ%4ðR Ø"Ø ØØ$(Ø"&Ø(,Ø(,ñ((àð((ð �t‘ð((ð �T‰zð	((ð
 �D‰jð((ð ˜T‘zð((ð ˜4‘Kð((ð  Ñ%ð((ð  ™:ð((ð 
÷((ó ((r0   rH   )0ré   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   Útransformersr   r   r   r   r!   rë   Ú
get_loggerr'   ro   rH   r&   r0   r1   Ú<module>rû      s£   ðñó Û Ý *Ý  å Ý 4ñ ×ÑßA÷ñ õ
 9÷ñ õ
 NÝZÝ=÷	÷ 	ó 	ö ßgÓgôÐ2QÐY^ò ò!Ð ð0 
×	Ò	˜HÓ	%€ôT(˜Kõ T(r0   