Ë
    îÍ:jö ã                   óì  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd 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 d dl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&Z&d dl'm(Z(m)Z) d dl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8m9Z9 ddl1m:Z:  e8«       rd dl;Z;d dl&m<Z<m=Z=m>Z>m?Z? ddl@mAZAmBZB  e,«       rd dlCZC e0«       rd dlDmEZE  e.«       xr  e+«       xr  e/«       xr  e-«       ZFeFr½d dlGZGd dlHmIZImJZJ d dlKmLZL d dlMmNZNmOZO d dlPmQZQ d dlRmSZS d dlTmUZU d dlVmWZWmXZXmYZYmZZZm[Z[ d dl\m]Z] d dl^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZm d dlnmoZo d d lpmqZqmrZrmsZs  G d!„ d"eod#¬$«      Zt G d%„ d&e]d#¬$«      Zu G d'„ d(eSd#¬$«      Zv eret«      Zw ereu«      Zx erev«      Zyh d)£Zzh d*£Z{h d+£Z| e9jú                  e~«      Zd,d-d.d/œiZ€ e�e€�j                  «       «      Zƒd0Z„ G d1„ d2e�j
                  «      Z†d3efd4„Z‡d5eˆd6d7d8d7fd9„Z‰ G d:„ d;«      ZŠ G d<„ d=«      Z‹e G d>„ d?«      «       ZŒ G d@„ dAe:«      Z�e~dBk(  r e�«       ZŽeŽ�j                  «        yy)Cé    N)ÚArgumentParserÚ	Namespace)ÚAsyncGeneratorÚ	GeneratorÚIterable)Úasynccontextmanager)Ú	dataclassÚfield)ÚBytesIO)ÚThread)ÚOptionalÚ	TypedDictÚUnion)Ú
model_info)ÚHF_HUB_OFFLINE)ÚDecodeStream)Ú!MODEL_FOR_CAUSAL_LM_MAPPING_NAMESÚ*MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMES)Úis_fastapi_availableÚis_librosa_availableÚis_openai_availableÚis_pydantic_availableÚis_uvicorn_availableÚis_vision_availableé   )Ú
AutoConfigÚLogitsProcessorListÚPreTrainedTokenizerFastÚProcessorMixinÚTextIteratorStreamer)Úis_torch_availableÚloggingé   )ÚBaseTransformersCLICommand)ÚAutoProcessorÚBitsAndBytesConfigÚGenerationConfigÚPreTrainedModel)ÚContinuousBatchingManagerÚRequestStatus)ÚImage)ÚFastAPIÚHTTPException)ÚCORSMiddleware)ÚJSONResponseÚStreamingResponse)ÚTranscription)ÚTranscriptionCreateParamsBase)ÚChatCompletionMessageParam)ÚChatCompletionChunkÚChoiceÚChoiceDeltaÚChoiceDeltaToolCallÚChoiceDeltaToolCallFunction)ÚCompletionCreateParamsStreaming)ÚResponseÚResponseCompletedEventÚResponseContentPartAddedEventÚResponseContentPartDoneEventÚResponseCreatedEventÚResponseErrorÚResponseErrorEventÚResponseFailedEventÚResponseInProgressEventÚResponseOutputItemAddedEventÚResponseOutputItemDoneEventÚResponseOutputMessageÚResponseOutputTextÚResponseTextDeltaEventÚResponseTextDoneEvent)ÚResponseCreateParamsStreaming)Ú	BaseModelÚTypeAdapterÚValidationErrorc                   ó   — e Zd ZU dZeed<   y)Ú)TransformersResponseCreateParamsStreamingz
        OpenAI's ResponseCreateParamsStreaming with an additional field for the generation config (as a json string).
        Úgeneration_configN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__© ó    úr/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/transformers/commands/serving.pyrN   rN   {   ó   … ñ	ð ÔrX   rN   F)Útotalc                   ó   — e Zd ZU dZeed<   y)Ú+TransformersCompletionCreateParamsStreamingz™
        OpenAI's CompletionCreateParamsStreaming with additional fields for the generation config (as a json string) and passing the request_id
        rO   NrP   rW   rX   rY   r]   r]   ‚   rZ   rX   r]   c                   ó4   — e Zd ZU dZeed<   eed<   dZeed<   y)Ú%TransformersTranscriptionCreateParamsz
        OpenAI's TranscriptionCreateParamsBase with an additional field for the generation config (as a json string).
        ÚfilerO   FÚstreamN)	rQ   rR   rS   rT   ÚbytesrV   rU   ra   ÚboolrW   rX   rY   r_   r_   ‰   s   … ñ	ð ‹ØÓØˆ�ÔrX   r_   >   ÚtextÚuserÚstoreÚpromptÚincludeÚ	reasoningÚ
backgroundÚ
truncationÚtool_choiceÚservice_tierÚtop_logprobsÚmax_tool_callsÚprevious_response_id>   ÚnÚstopre   Úaudiorf   ÚlogprobsÚmetadataÚ	functionsÚ
modalitiesÚ
predictionrl   rm   rn   Úfunction_callÚstream_optionsÚresponse_formatÚpresence_penaltyÚreasoning_effortÚweb_search_optionsÚparallel_tool_callsÚmax_completion_tokens>   rg   rh   Úlanguager{   Úchunking_strategyÚtimestamp_granularitiesÚqwenz<tool_call>z</tool_call>)ÚstartÚendzx-request-idc                   ó   — e Zd ZdZdZdZdZy)ÚModalityÚLLMÚVLMÚSTTÚTTSN)rQ   rR   rS   r‰   rŠ   r‹   rŒ   rW   rX   rY   rˆ   rˆ   Ù   s   „ Ø
€CØ
€CØ
€CØ
�CrX   rˆ   Úargsc                 ó   — t        | «      S )z~
    Factory function used to instantiate serving server from provided command line arguments.

    Returns: ServeCommand
    )ÚServeCommand)r�   s    rY   Úserve_command_factoryr�   à   s   € ô ˜ÓÐrX   ÚreqÚmodel_generation_configr'   Úreturnc                 ó`  — | j                  d«      �"t        di t        j                  | d   «      ¤Ž}nt	        j
                  |«      } |j                  di |¤Ž}|j                  «       D ]  \  }}|€Œ	t        |||«       Œ | j                  d«      �t        | d   «      |_
        | j                  d«      �t        | d   «      |_
        | j                  d«      �t        | d   «      |_        | j                  d«      �
| d   |_        | j                  d«      �
| d   |_        | j                  d«      �+t        | d   «      |_        t        | d   «      dk(  rd	|_        | j                  d
«      �t        | d
   «      |_        | j                  d«      �t%        j&                  | d   «       |S )a¬  
    Creates a generation config from the parameters of the request. If a generation config is passed in the request,
    it will be used as a baseline for parameterization. Otherwise, we will use the model's default generation config.
    Other parameters in the request will be applied on top of the baseline.

    Args:
        req (`dict`):
            The request which may optionally contain generation parameters.
        model_generation_config (`GenerationConfig`):
            The model's default generation config.
        kwargs (`dict`):
            Additional parameters to set in the generation config.

    Returns:
        The prepared `GenerationConfig` object.
    rO   Úmax_output_tokensÚ
max_tokensÚfrequency_penaltyÚ
logit_biasrr   Útemperatureg        FÚtop_pÚseedrW   )Úgetr'   ÚjsonÚloadsÚcopyÚdeepcopyÚupdateÚitemsÚsetattrÚintÚmax_new_tokensÚfloatÚrepetition_penaltyÚsequence_biasÚstop_stringsr™   Ú	do_samplerš   ÚtorchÚmanual_seed)r‘   r’   ÚkwargsrO   Únon_standard_kwargsÚkÚvs          rY   Ú!create_generation_config_from_reqr±   é   s°  € ð. ‡w�wÐ"Ó#Ð/Ü,ÑT¬t¯z©z¸#Ð>QÑ:RÓ/SÑTÑä ŸM™MÐ*AÓBÐà2Ð+×2Ñ2Ñ<°VÑ<Ðà#×)Ñ)Ó+ò -‰ˆˆ1Ø‰=ÜÐ% q¨!Õ,ð-ð
 ‡w�wÐ"Ó#Ð/Ü+.¨sÐ3FÑ/GÓ+HÐÔ(ð ‡w�wˆ|ÓÐ(Ü+.¨s°<Ñ/@Ó+AÐÔ(Ø
‡w�wÐ"Ó#Ð/Ü/4°SÐ9LÑ5MÓ/NÐÔ,Ø
‡w�wˆ|ÓÐ(Ø*-¨lÑ*;ÐÔ'Ø
‡w�wˆvƒÐ"Ø),¨V©ÐÔ&Ø
‡w�wˆ}ÓÐ)Ü(-¨c°-Ñ.@Ó(AÐÔ%Ü��]Ñ#Ó$¨Ò+Ø*/ÐÔ'Ø
‡w�wˆwÓÐ#Ü"'¨¨G©Ó"5ÐÔØ
‡w�wˆvƒÐ"Ü×Ñ˜#˜f™+Ô&àÐrX   c                   ó   — e Zd ZdZd„ Zd„ Zy)Ú	ToolStatez7Lightweight class to keep track of the tool call state.c                 ó$   — | j                  «        y ©N)Úreset©Úselfs    rY   Ú__init__zToolState.__init__'  s   € Ø�
‰
�rX   c                 ó<   — d| _         d| _        d| _        d| _        y)z>Reset the tool call state (assumes we're outside a tool call).Fr   Ú N)Úinside_tool_callÚhas_tool_name_definedÚarg_nesting_levelÚbufferr·   s    rY   r¶   zToolState.reset*  s!   € à %ˆÔØ%*ˆÔ"Ø!"ˆÔØˆ�rX   N)rQ   rR   rS   rT   r¹   r¶   rW   rX   rY   r³   r³   $  s   „ ÙAòórX   r³   c            	       óL   — e Zd ZdZ	 ddddedeed      fd„Zd	„ Zd
„ Z	d„ Z
d„ Zy)Ú
TimedModelz˜
    A class that holds a PreTrainedModel instance and its associated processor.
    Automatically deletes the instances after a specified timeout.
    NÚmodelr(   Útimeout_secondsÚ	processor)r   r   c                 óô   — || _         t        |j                  «      | _        || _        || _        t        j                  | j
                  | j                  «      | _	        | j                  j                  «        y rµ   )rÂ   rU   Úname_or_pathÚ_name_or_pathrÄ   rÃ   Ú	threadingÚTimerÚtimeout_reachedÚ_timerr…   )r¸   rÂ   rÃ   rÄ   s       rY   r¹   zTimedModel.__init__8  s[   € ð ˆŒ
Ü  ×!3Ñ!3Ó4ˆÔØ"ˆŒØ.ˆÔÜ—o‘o d×&:Ñ&:¸D×<PÑ<PÓQˆŒØ�‰×ÑÕrX   c                 óÊ   — | j                   j                  «        t        j                  | j                  | j
                  «      | _         | j                   j                  «        y)z2Reset the timer for the deletion of the instances.N)rË   ÚcancelrÈ   rÉ   rÃ   rÊ   r…   r·   s    rY   Úreset_timerzTimedModel.reset_timerE  s@   € à�‰×ÑÔÜ—o‘o d×&:Ñ&:¸D×<PÑ<PÓQˆŒØ�‰×ÑÕrX   c                 ó0  — t        | d«      rŠ| j                  �}| `| `d| _        d| _        t        j                  «        t
        j                  j                  «       rt
        j                  j                  «        | j                  j                  «        yyy)z>Delete the wrapped model and processor and clean up resources.rÂ   N)ÚhasattrrÂ   rÄ   ÚgcÚcollectr«   ÚcudaÚis_availableÚempty_cacherË   rÍ   r·   s    rY   Údelete_modelzTimedModel.delete_modelK  sr   € ä�4˜Ô! d§j¡jÐ&<Ø�
Ø�ØˆDŒJØ!ˆDŒNÜ�J‰JŒLô �z‰z×&Ñ&Ô(Ü—
‘
×&Ñ&Ô(ð �K‰K×ÑÕ ð '=Ð!rX   c                 ó‚   — | j                  «        t        j                  | j                  › d| j                  › d�«       y )Nz was removed from memory after z seconds of inactivity)rÖ   ÚloggerÚinforÇ   rÃ   r·   s    rY   rÊ   zTimedModel.timeout_reached[  s7   € Ø×ÑÔÜ�‰�t×)Ñ)Ð*Ð*IÈ$×J^ÑJ^ÐI_Ð_uÐvÕwrX   c                 ó<   — t        | d«       xs | j                  du S )z)Check if the instances have been deleted.rÂ   N)rÐ   rÂ   r·   s    rY   Ú
is_deletedzTimedModel.is_deleted_  s    € ä˜4 Ó)Ð)Ò?¨T¯Z©Z¸4Ð-?Ð?rX   rµ   )rQ   rR   rS   rT   r¤   r   r   r¹   rÎ   rÖ   rÊ   rÛ   rW   rX   rY   rÁ   rÁ   2  sP   „ ñð SWñ	à ðð ðð ˜EÐ"MÑNÑOó	òò!ò xó@rX   rÁ   c                   ó¬  — e Zd ZU dZ edddi¬«      Zeed<    edddi¬«      Ze	ed	<    ed
dg d¢dœ¬«      Z
ee	   ed<    eddg d¢dœ¬«      Zee	   ed<    edddi¬«      Zeed<    ed
ddi¬«      Zee	   ed<    edddi¬«      Zeed<    edddi¬«      Zeed<    eddddgdœ¬«      Ze	ed<    edddi¬«      Zeed<    eddd i¬«      Ze	ed!<    ed"dd#i¬«      Zeed$<    ed%dd&i¬«      Zeed'<    ed(dd)i¬«      Ze	ed*<    ed
dd+i¬«      Zee   ed,<    eddd-i¬«      Zeed.<    eddd/i¬«      Zeed0<    ed
dd1i¬«      Zee	   ed2<   d3„ Zy
)4ÚServeArgumentsz¥
    Arguments for the serve CLI.

    See the metadata arg for each argument's description -- the metadata will be printed with
    `transformers serve --help`
    FÚhelpz8Whether to use continuous batching for chat completions.)Údefaultru   Úcontinuous_batchingÚautozfDevice to use for inference; will default to `auto` andplace the model on an accelerator if available.ÚdeviceNzA`torch_dtype` is deprecated! Please use `dtype` argument instead.)rá   Úbfloat16Úfloat16Úfloat32)rÞ   ÚchoicesÚtorch_dtypez Override the default `torch.dtype` and load the model under this dtype. If `'auto'` is passed, the dtype will be automatically derived from the model's weights.Údtypez2Whether to trust remote code when loading a model.Útrust_remote_codezÂWhich attention implementation to use; you can run --attn_implementation=flash_attention_2, in which case you must install this manually by running `pip install flash-attn --no-build-isolation`.Úattn_implementationzIWhether to use 8 bit precision for the base model - works only with LoRA.Úload_in_8bitzIWhether to use 4 bit precision for the base model - works only with LoRA.Úload_in_4bitÚnf4zQuantization type.Úfp4Úbnb_4bit_quant_typez#Whether to use nested quantization.Úuse_bnb_nested_quantÚ	localhostz$Interface the server will listen to.Úhosti@  zPort the server will listen to.Úporti,  z@Time in seconds after which a model will be removed from memory.Úmodel_timeoutrÙ   z8Logging level as a string. Example: 'info' or 'warning'.Ú	log_levelz1The default seed for torch, should be an integer.Údefault_seedztWhether to enable CORS. Some apps that make requests from external domains (e.g. Cursor) require CORS to be enabled.Úenable_corsz+Whether to turn on strict input validation.Úinput_validationz€Name of the model to be forced on all requests. This is useful for testing Apps that don't allow changing models in the request.Úforce_modelc                 óØ   — | j                   �^| j                  €| j                   | _        y| j                   | j                  k7  r&t        d| j                   › d| j                  › d�«      ‚yy)z(Only used for BC `torch_dtype` argument.Nz`torch_dtype` z and `dtype` zn have different values. `torch_dtype` is deprecated and will be removed in 4.59.0, please set `dtype` instead.)rç   rè   Ú
ValueErrorr·   s    rY   Ú__post_init__zServeArguments.__post_init__É  su   € ð ×ÑÐ'Ø�z‰zÐ!Ø!×-Ñ-�•
Ø×!Ñ! T§Z¡ZÒ/Ü Ø$ T×%5Ñ%5Ð$6°mÀDÇJÁJÀ<ð PMð Móð ð 0ð (rX   )rQ   rR   rS   rT   r
   rà   rc   rV   râ   rU   rç   r   rè   ré   rê   rë   rì   rï   rð   rò   ró   r¤   rô   rõ   rö   r÷   rø   rù   rü   rW   rX   rY   rÝ   rÝ   d  sT  … ññ !&ØØÐTÐUô!Ð˜ó ñ Øàð >ð
ô€FˆCó ñ "'ØàWÚAñ
ô"€K�˜#‘ó ñ !ØðPâAñ
ô€Eˆ8�C‰=ó ñ $Ø Ð)]Ð ^ôÐ�tó ñ */Øàð rð
ô*Ð˜ #™ó ñ ØØÐeÐfô€L�$ó ñ ØØÐeÐfô€L�$ó ñ  %¨UÐFZÐhmÐotÐguÑ=vÔwÐ˜ÓwÙ!&¨uÀÐHmÐ?nÔ!oÐ˜$Óoñ ˜k°VÐ=cÐ4dÔe€Dˆ#ÓeÙ˜d¨fÐ6WÐ-XÔY€Dˆ#ÓYÙØØÐ\Ð]ô€M�3ó ñ Ø &Ð*dÐ!eô€Iˆsó ñ #(Ø Ð([Ð\ô#€L�(˜3‘-ó ñ Øàð&ð
ô€K�ó ñ #ØàÐBð
ôÐ�dó ñ "'Øàð2ð
ô"€K�˜#‘ó ó
rX   rÝ   c                   óJ  — e Zd Zedefd„«       Zdefd„Zdede	ddd	e
fd
„Zdefd„Zdefd„Zdefd„Z	 	 	 	 	 	 	 	 d1dedee   dee   dee   dee   deed      dee   dee   defd„Zdddefd„Zd„ Zej2                  deeeef      fd„«       Zdededeedf   fd „Zedd!defd"„«       Zed#efd$„«       Z dede!eddf   fd%„Z"dede!eddf   fd&„Z#dede!eddf   fd'„Z$dede%fd(„Z&ededed)   fd*„«       Z'd+edefd,„Z(d-efd.„Z)d-ede*d!ef   fd/„Z+d-ede*d!e,f   fd0„Z-y)2r�   Úparserc                 ód   — t         f}| j                  d|¬«      }|j                  t        ¬«       y)z³
        Register this command to argparse so it's available for the transformer-cli

        Args:
            parser: Root parser to register command-specific arguments
        Úserve)Údataclass_types)ÚfuncN)rÝ   Ú
add_parserÚset_defaultsr�   )rþ   r  Úserve_parsers      rY   Úregister_subcommandz ServeCommand.register_subcommand×  s3   € ô *Ð+ˆØ×(Ñ(¨À/Ð(ÓRˆØ×!Ñ!Ô'<Ð!Õ=rX   r�   c           	      ó0  — t         st        d«      ‚|| _        | j                  j                  | _        | j                  r¨t        j                  «       }| j                  j                  €)|| j                  _        t        j                  d|› �«       t        j                  «       }| j                  j                  |vr)t        d|› d| j                  j                  › d|› d�«      ‚| j                  j                  | _        | j                  j                  �)t        j                  | j                  j                  «       t!        j"                  d«      }|j%                  t         j&                  | j                  j(                  j+                  «          «       t!        j"                  d«      }|j%                  t         j&                  | j                  j(                  j+                  «          «       i | _        d | _        d | _        d | _        d | _        y )	NzaMissing dependencies for the serving CLI. Please install with `pip install transformers[serving]`z-No attn_implementation passed, defaulting to z"Continuous batching only supports z as attn_implementation, got z#Try setting `--attn_implementation=ú`Útransformersz+transformers.generation.continuous_batching)Úserve_dependencies_availableÚImportErrorr�   rà   Úuse_continuous_batchingr)   Ú default_attention_implementationrê   rØ   rÙ   Ú#supported_attention_implementationsrû   r÷   rö   r«   r¬   r"   Ú
get_loggerÚsetLevelÚ
log_levelsrõ   ÚlowerÚloaded_modelsÚ#running_continuous_batching_managerÚlast_messagesÚlast_kv_cacheÚ
last_model)r¸   r�   Údefault_attn_implÚsupported_attn_implÚtransformers_loggerÚ	cb_loggers         rY   r¹   zServeCommand.__init__ã  s¹  € Ý+ÜØsóð ð
 ˆŒ	Ø'+§y¡y×'DÑ'DˆÔ$Ø×'Ò'Ü 9× ZÑ ZÓ \Ðà�y‰y×,Ñ,Ð4Ø0A�—	‘	Ô-Ü—‘ÐKÐL]ÐK^Ð_Ô`Ü";×"_Ñ"_Ó"aÐØ�y‰y×,Ñ,Ð4GÑGÜ Ø8Ð9LÐ8MÐMjØ—y‘y×4Ñ4Ð5Ø9Ð:KÐ9LÈAðOóð ð
  Ÿ9™9×0Ñ0ˆÔà�9‰9×!Ñ!Ð-Ü×Ñ˜dŸi™i×4Ñ4Ô5ô &×0Ñ0°Ó@ÐØ×$Ñ$¤W×%7Ñ%7¸¿	¹	×8KÑ8K×8QÑ8QÓ8SÑ%TÔUä×&Ñ&Ð'TÓUˆ	Ø×Ñœ7×-Ñ-¨d¯i©i×.AÑ.A×.GÑ.GÓ.IÑJÔKð 57ˆÔØX\ˆÔ0ð "ˆÔØ!ˆÔØˆ�rX   ÚrequestÚschemaÚ	validatorrK   Úunused_fieldsc                 ó0  — t         j                  d|› �«       t        |j                  «       «      }|j                  }||z
  }|r(t         j                  d|› �«       t        dd|› �¬«      ‚| j                  j                  rB	 |j                  |«       ||z  }	|	r(t         j                  d|	› �«       t        dd|	› �¬«      ‚yy# t        $ rF}t         j                  d|j                  «       › �«       t        d|j                  «       ¬«      ‚d}~ww xY w)a‰  
        Validates the request against the schema, and checks for unexpected keys.

        Args:
            request (`dict`):
                The request to validate.
            schema (`TypedDict`):
                The schema of the request to validate. It is a `TypedDict` definition.
            validator (`TypeAdapter`):
                The validator to use to validate the request. Built from `schema`.
            unused_fields (`set`):
                Fields accepted by `schema`, but not used in `transformers serve`.

        Raises:
            HTTPException: If the request is invalid or contains unexpected or unused fields.
        zValidating request: z Unexpected keys in the request: i¦  )Ústatus_codeÚdetailzValidation error: NzUnused fields in the request: )rØ   ÚdebugÚsetÚkeysÚ__mutable_keys__Úerrorr-   r�   rø   Úvalidate_pythonrL   Úerrors)
r¸   r  r  r  r  Ú
input_keysÚpossible_keysÚunexpected_keysÚeÚunused_fields_in_requests
             rY   Ú_validate_requestzServeCommand._validate_request  s  € ô. 	�‰Ð+¨G¨9Ð5Ô6ô ˜Ÿ™›Ó(ˆ
Ø×/Ñ/ˆØ$ }Ñ4ˆÙÜ�L‰LÐ;¸OÐ;LÐMÔNÜ¨CÐ:ZÐ[jÐZkÐ8lÔmÐmà�9‰9×%Ò%ðHØ×)Ñ)¨'Ô2ð (2°MÑ'AÐ$Ù'Ü—‘Ð=Ð>VÐ=WÐXÔYÜ#Ø #Ð.LÐMeÐLfÐ,gôð ð (ð &øô #ò HÜ—‘Ð1°!·(±(³*°Ð>Ô?Ü#°¸A¿H¹H»JÔGÐGûðHús   ÂC Ã	DÃADÄDc                 óF   — | j                  |t        t        t        ¬«       y ©N)r  r  r  r  )r/  rN   Úresponse_validatorÚUNUSED_RESPONSE_FIELDS©r¸   r  s     rY   Úvalidate_response_requestz&ServeCommand.validate_response_requestA  s!   € Ø×ÑØÜ<Ü(Ü0ð	 	õ 	
rX   c                 óF   — | j                  |t        t        t        ¬«       y r1  )r/  r]   Úcompletion_validatorÚUNUSED_CHAT_COMPLETION_FIELDSr4  s     rY   Ú validate_chat_completion_requestz-ServeCommand.validate_chat_completion_requestI  s!   € Ø×ÑØÜ>Ü*Ü7ð	 	õ 	
rX   c                 óF   — | j                  |t        t        t        ¬«       y r1  )r/  r_   Útranscription_validatorÚUNUSED_TRANSCRIPTION_FIELDSr4  s     rY   Úvalidate_transcription_requestz+ServeCommand.validate_transcription_requestQ  s!   € Ø×ÑØÜ8Ü-Ü5ð	 	õ 	
rX   NÚ
request_idÚcontentrÂ   ÚroleÚfinish_reasonÚ
tool_callsr7   Údecode_streamÚ	tokenizerr“   c	                 óü   — |� |�|�|j                  |j                  |«      }t        |t        t	        j                  «       «      |t        t        |||¬«      d|¬«      gdd¬«      }	d|	j                  d¬	«      › d
�S )aç  
        Builds a chunk of a streaming OpenAI Chat Completion response.

        IMPORTANT: The serialized chunk won't contain empty fields (fields with `None`). Some downstream apps,
        like Cursor, assume that when the field exists, it has data.

        Args:
            request_id (`str`):
                The request ID.
            content (`str`, *optional*):
                Content of the response from the model.
            model (`str`, *optional*):
                The model that generated the content.
            role (`str`, *optional*):
                The role of the next content, until a new role is defined.
            finish_reason (`str`, *optional*):
                The reason the generation by the model has finished.
            tool_calls (`list[ChoiceDeltaToolCall]`, *optional*):
                Data about the tool calls, when they are triggered.

        Returns:
            `str`: The built chunk, a string containing a JSON string with the payload.
        )r?  r@  rB  r   )ÚdeltaÚindexrA  r»   zchat.completion.chunk)ÚidÚcreatedrÂ   ræ   Úsystem_fingerprintÚobjectúdata: T©Úexclude_noneú

)ÚstepÚ
_tokenizerr4   r¤   Útimer5   r6   Úmodel_dump_json)
r¸   r>  r?  rÂ   r@  rA  rB  rC  rD  Úchunks
             rY   Úbuild_chat_completion_chunkz(ServeCommand.build_chat_completion_chunkY  s™   € ðD Ð$¨Ð)<ÀÐAVØ#×(Ñ(¨×)=Ñ)=¸wÓGˆGÜ#ØÜœŸ	™	›Ó$ØäÜ%Ø 'Ø!Ø#-ôð
 Ø"/ôð
ð  "Ø*ô!
ˆð$ ˜×-Ñ-¸4Ð-Ó@ÐAÀÐFÐFrX   ÚresponserJ   c                 ó.   — d|j                  d¬«      › d�S )a  
        Builds a event of a streaming OpenAI Response response.

        IMPORTANT: The serialized chunk won't contain empty fields (fields with `None`). Some downstream apps,
        like Cursor, assume that when the field exists, it has data.

        Args:
            response (`BaseModel`):
                The response to build an event from. One of the multiple OpenAI Response output types

        Returns:
            `str`: The built chunk, a string containing a JSON string with the payload.
        rL  TrM  rO  )rS  )r¸   rV  s     rY   Úbuild_response_eventz!ServeCommand.build_response_event‘  s"   € ð ˜×0Ñ0¸dÐ0ÓCÐDÀDÐIÐIrX   c                 óò  ‡ — t         dt        fˆ fd„«       }t        |¬«      }‰ j                  r2|j                  t        dgddgdg¬«       t
        j                  d«       dd	lm} |j                  d
«      d|dt        fˆ fd„«       }|j                  d«      dt        fˆ fd„«       }|j                  d«      d|fˆ fd„«       }|j                  d«      |j                  d«      ˆ fd„«       «       }|j                  d«      d„ «       }|j                  d«      d|fd„«       }	t        j                  |‰ j                   j"                  ‰ j                   j$                  ‰ j                   j&                  ¬«       y)a  
        Setup and run the FastAPI server for transformers serve.

        Models will be loaded and unloaded automatically based on usage and a timeout.

        The server will expose the following endpoints:
        - POST /v1/chat/completions: Generates chat completions.
        - POST /v1/responses: Generates responses.
        - POST /v1/audio/transcriptions: Generates transcriptions from audio.
        - GET /v1/models: Lists available models for 3rd party tools.

        Requires FastAPI and Uvicorn to be installed.
        Úappc                óÊ   •K  — d ­–— ‰j                   j                  «       D ]  }|j                  «        Œ ‰j                  �‰j                  j	                  dd¬«       y y ­w)NTé   ©ÚblockÚtimeout)r  ÚvaluesrÖ   r  rr   )rZ  rÂ   r¸   s     €rY   Úlifespanz"ServeCommand.run.<locals>.lifespan°  s`   øè ø€ äØ×+Ñ+×2Ñ2Ó4ò %�Ø×"Ñ"Õ$ð%à×7Ñ7ÐCØ×8Ñ8×=Ñ=ÀDÐRSÐ=ÕTð Dùs   ƒA A#)ra  Ú*T)Úallow_originsÚallow_credentialsÚallow_methodsÚallow_headerszUCORS allow origin is set to `*`. This is not recommended for production environments.r   )ÚRequestz/v1/chat/completionsr  Úbodyc                 óÊ   •— ‰j                  |¬«       ‰j                  r'‰j                  || j                  j                  «      }n‰j                  |«      }t        |d¬«      S ©N©r  útext/event-stream©Ú
media_type)r9  r  Ú#continuous_batching_chat_completionÚstater>  Úgenerate_chat_completionr0   )r  rh  Úoutputr¸   s      €rY   Úchat_completionz)ServeCommand.run.<locals>.chat_completionÊ  sW   ø€ à×1Ñ1¸$Ð1Ô?à×+Ò+Ø×AÑAÀ$ÈÏÉ×H`ÑH`Óa‘à×6Ñ6°tÓ<�Ü$ VÐ8KÔLÐLrX   z/v1/responsesc                 ód   •— ‰j                  | ¬«       ‰j                  | «      }t        |d¬«      S rj  )r5  Úgenerate_responser0   )r  rr  r¸   s     €rY   Ú	responsesz#ServeCommand.run.<locals>.responsesÔ  s2   ø€ à×*Ñ*°7Ð*Ô;à×+Ñ+¨GÓ4ˆFÜ$ VÐ8KÔLÐLrX   z/v1/audio/transcriptionsc           
   “   óÚ  •K  — | j                  «       4 ƒd {  –—† }t        |d   j                  «       ƒ d {  –—† |d   ¬«      }t        j	                  d|d   j
                  › d|d   j                  › d|d   j                  dz  d›d	�«       d d d «      ƒd {  –—†  ‰j                  ¬
«       ‰j                  |«      }t        |d¬«      S 7 Œ·7 Œ™7 Œ8# 1 ƒd {  –—†7  sw Y   ŒHxY w­w)Nr`   rÂ   )r`   rÂ   zReceived file: z; MIME type: z; size: é   z.2fz KiBrk  rl  rm  )Úformr_   ÚreadrØ   r#  ÚfilenameÚcontent_typeÚsizer=  Úgenerate_transcriptionr0   )r  ry  Úparsed_requestrr  r¸   s       €rY   Úaudio_transcriptionsz.ServeCommand.run.<locals>.audio_transcriptionsÛ  sò   øè ø€ ð —|‘|“~÷ 	ð 	¨Ü!FØ# F™|×0Ñ0Ó2×2Ø˜w™-ô"�ô
 —‘Ø% d¨6¡l×&;Ñ&;Ð%<¸MÈ$ÈvÉ,×JcÑJcÐIdð eØ! &™\×.Ñ.°Ñ5°cÐ:¸$ð@ô÷	÷ 	ð ×/Ñ/¸Ð/ÔGà×0Ñ0°Ó@ˆFÜ$ VÐ8KÔLÐLð	øà2øð	ø÷ 	÷ 	ñ 	üsU   ƒC+˜C™C+œC¸C
¹ACÂC+ÂCÂ5C+ÃCÃC+ÃC(ÃCÃC(Ã$C+z
/v1/modelsc                  ó<   •— t        d‰ j                  «       dœ«      S )NÚlist)rK  Údata)r/   Úget_gen_modelsr·   s   €rY   Úget_all_modelsz(ServeCommand.run.<locals>.get_all_modelsí  s   ø€ ô  ¨6¸4×;NÑ;NÓ;PÑ QÓRÐRrX   z/healthc                  ó   — t        ddi«      S )NÚstatusÚok)r/   rW   rX   rY   Úhealthcheckz%ServeCommand.run.<locals>.healthcheckò  s   € ä ¨4Ð 0Ó1Ð1rX   Úhttpc              “   óö   K  — | j                   j                  t        «      xs t        t	        j
                  «       «      }|| j                  _         || «      ƒ d {  –—† }||j                   t        <   |S 7 Œ­wrµ   )Úheadersrœ   ÚX_REQUEST_IDrU   ÚuuidÚuuid4rp  r>  )r  Ú	call_nextr>  rV  s       rY   Úget_or_set_request_idz/ServeCommand.run.<locals>.get_or_set_request_idö  s]   è ø€ à Ÿ™×,Ñ,¬\Ó:ÒO¼cÄ$Ç*Á*Ã,Ó>OˆJØ'1ˆG�M‰MÔ$Ù& wÓ/×/ˆHØ-7ˆH×Ñœ\Ñ*ØˆOð 0ús   ‚AA9ÁA7ÁA9)rò   ró   rõ   N)r   r,   r÷   Úadd_middlewarer.   rØ   Úwarning_onceÚfastapirg  ÚpostÚdictÚoptionsrœ   Ú
middlewareÚuvicornÚrunr�   rò   ró   rõ   )
r¸   ra  rZ  rg  rs  rv  r€  r…  r‰  r‘  s
   `         rY   rš  zServeCommand.run¡  s”  ø€ ô 
ð	U¤ô 	Uó 
ð	Uô ˜xÔ(ˆð ×ÒØ×ÑÜØ"˜eØ"&Ø"˜eØ"˜eð ô ô ×ÑØgôõ 	$à	�‰Ð(Ó	)ð	M Wð 	M´Dô 	Mó 
*ð	Mð 
�‰�/Ó	"ð	Mœtô 	Mó 
#ð	Mð 
�‰Ð,Ó	-ð	M°ô 	Mó 
.ð	Mð" 
�‰�\Ó	"Ø	�‰�Ó	ó	Só 
ó 
#ð	Sð 
�‰�Ó	ñ	2ó 
ð	2ð 
�‰˜Ó	ð	°ò 	ó 
 ð	ô 	�‰�C˜dŸi™iŸn™n°4·9±9·>±>ÈTÏYÉY×M`ÑM`ÖarX   c           	      óˆ  — g d¢}t         rQ|D �cg c]E  }|dt        j                  j                  «       j                  «       |j	                  d«      d   dœ‘ŒG c}S |D �cg c]  }t        |«      ‘Œ }}|D �cg c]5  }|j                  d|j                  j                  «       |j                  dœ‘Œ7 c}S c c}w c c}w c c}w )a.  
        This is by no means a limit to which models may be instantiated with `transformers serve`: any chat-based
        model working with generate can work.

        This is a limited list of models to ensure we have a discoverable /v1/models endpoint for third-party
        integrations.
        )zMenlo/Jan-nanozMenlo/Jan-nano-128kzQwen/Qwen2.5-0.5B-InstructzQwen/Qwen2.5-3B-InstructzQwen/Qwen2.5-7B-InstructzQwen/Qwen2.5-14B-Instructz meta-llama/Llama-3.1-8B-Instructz meta-llama/Llama-3.2-1B-Instructz!meta-llama/Llama-3.3-70B-InstructzHuggingFaceTB/SmolVLM-Instructz!ibm-granite/granite-vision-3.2-2bzQwen/Qwen2.5-VL-7B-InstructrÂ   ú/r   )rH  rK  rI  Úowned_by)	r   ÚdatetimeÚnowÚ	timestampÚsplitr   rH  Ú
created_atÚauthor)r¸   ÚmodelsrÂ   Úmodel_infoss       rY   r„  zServeCommand.get_gen_models   sÐ   € ò
ˆõ ð $öð ð  Ø%Ü'×0Ñ0×4Ñ4Ó6×@Ñ@ÓBØ %§¡¨CÓ 0°Ñ 3ó	òð ð ;AÖA°œ: eÕ,ÐAˆKÐAð )öð ð  Ÿ(™(Ø%Ø$×/Ñ/×9Ñ9Ó;Ø %§¡ó	òð ùòùò Bùòs   �A
B5Á B:Á8:B?r‘   c           	      óÂ  ‡ ‡‡	‡
‡— ‰ j                  |d   «      Š	‰	‰ j                  k7  }‰	‰ _        |r0‰ j                  �$‰ j                  j                  dd¬«       d‰ _        ‰ j	                  ‰	«      \  }}t        |d«      r|j                  n|Št        ||j                  ‰j                  ‰j                  ddd¬	«      Š‰ j                  €K|j                  ‰d¬
«      ‰ _        t        «       ‰ j                  _        ‰ j                  j                  «        |j                  |d   dd¬«      j!                  |j"                  «      }ˆ	ˆ ˆfd„Š
ˆˆ ˆ
fd„} ||d   |«      S )a'  
        Generates an OpenAI Chat Completion using continuous batching.

        Args:
            req (`dict`): The request to generate an OpenAI Chat Completion for.

        Returns:
            `Generator[str, None, None]`: A generator that yields the OpenAI Chat Completion chunks.
        rÂ   NTr   r]  rD  FÚfifo)r’   Úeos_token_idÚpad_token_idÚ	use_cacherª   Ú	scheduler)rO   Ú	streamingÚmessagesÚpt)Úreturn_tensorsÚadd_generation_promptc              3   óð  •K  — 	 ‰j                  | d‰¬«      –— ‰j                  j                  | «      D ]\  }|j                  t        j
                  k(  r‰j                  | d‰¬«      –—  y ‰j                  | |j                  d   ‰|‰¬«      –— Œ^ y # t        $ rT}t        j                  t        |«      «       ‰j                  j                  | «       dt        |«      › d�–— Y d }~y d }~ww xY w­w)	NÚ	assistant©r@  rÂ   rr   ©rA  rÂ   éÿÿÿÿ)r>  r?  rÂ   rC  rD  údata: {"error": "ú"})rU  r  Úrequest_id_iterr‡  r*   ÚFINISHEDÚgenerated_tokensÚ	ExceptionrØ   r'  rU   Úcancel_request)r>  rC  Úresultr-  Úmodel_id_and_revisionr¸   rD  s       €€€rY   Ústream_chat_completionzPServeCommand.continuous_batching_chat_completion.<locals>.stream_chat_completion^  sú   øè ø€ ð7ð ×6Ñ6°zÈÐ[pÐ6ÓqÒqà"×FÑF×VÑVÐWaÓbò �FØ—}‘}¬×(>Ñ(>Ò>Ø"×>Ñ>Ø&Ø*0Ø"7ð ?ó ò ñ
 à"×>Ñ>Ø'1Ø$*×$;Ñ$;¸BÑ$?Ø"7Ø*7Ø&/ð ?ó ó ñøô" ò 7Ü—‘œS ›VÔ$Ø×8Ñ8×GÑGÈ
ÔSØ*¬3¨q«6¨(°#Ð6×6ûð7üs<   ƒC6…A(B Á-C6Á.'B ÂC6Â	C3ÂA
C.Ã)C6Ã.C3Ã3C6c                ó’  •K  — 	 t        | j                  «       d«      }‰j                  j                  | |‰j                  ¬«      } ‰||«      D ]$  }|­–— t        j                  d«      ƒ d {  –—†  Œ& y 7 Œ# t
        j                  $ r7 ‰j                  j                  |«       t        j                  d|› d�«       Y y w xY w­w)NF)r>  r¥   r   zRequest z was cancelled.)r   Útolistr  Úadd_requestr¥   ÚasyncioÚsleepÚCancelledErrorr¼  rØ   Úwarning)Ú_inputsr>  rC  rT  rO   r¸   r¿  s       €€€rY   Úcancellation_wrapperzNServeCommand.continuous_batching_chat_completion.<locals>.cancellation_wrapperz  s»   øè ø€ ðGÜ ,¨W¯^©^Ó-=¸uÓ E�à!×EÑE×QÑQØ¨
ÐCT×CcÑCcð Ró �
ñ 4°JÀÓNò +�EØ“KÜ!Ÿ-™-¨Ó*×*Ñ*ñ+à*ùÜ×)Ñ)ò GØ×8Ñ8×GÑGÈ
ÔSÜ—‘ ¨*¨°_ÐEÖFðGüs<   ƒC…A+A: Á0A8Á1A: Á7CÁ8A: Á:ACÃCÃCÃCr   )Úprocess_model_namer  r  rr   Úload_model_and_processorrÐ   rD  r±   rO   r¨  r©  Úinit_continuous_batchingr   Úlogit_processorr…   Úapply_chat_templateÚtorâ   )r¸   r‘   r>  Úmust_discard_cacherÂ   rÄ   ÚinputsrÈ  rO   r¾  r¿  rD  s   `       @@@@rY   ro  z0ServeCommand.continuous_batching_chat_completion.  sa  ü€ ð !%× 7Ñ 7¸¸G¹Ó EÐØ2°d·o±oÑEÐØ/ˆŒÙà×7Ñ7ÐCØ×8Ñ8×=Ñ=ÀDÐRSÐ=ÔTØ;?�Ô8Ø×8Ñ8Ð9NÓOÑˆˆyä+2°9¸kÔ+J�I×'Ò'ÐPYˆ	ä=ØØ$)×$;Ñ$;Ø"×/Ñ/Ø"×/Ñ/ØØØô
Ðð ×3Ñ3Ð;Ø7<×7UÑ7UØ"3¸tð 8Vó 8ˆDÔ4ô H[ÓG\ˆD×4Ñ4ÔDØ×4Ñ4×:Ñ:Ô<ð ×.Ñ.¨s°:©ÈtÐkoÐ.Óp×sÑsØ�L‰Ló
ˆö	7ö8	Gñ $ F¨1¡I¨zÓ:Ð:rX   r(   c                 óê   — | j                   j                  }|t        j                  «       v rt        j
                  }|S |t        j                  «       v rt        j                  }|S t        d|› �«      ‚)NzUnknown modality: )	Ú	__class__rQ   r   r`  rˆ   rŠ   r   r‰   rû   )rÂ   Úmodel_classnameÚmodalitys      rY   Úget_model_modalityzServeCommand.get_model_modalityŠ  sm   € àŸ/™/×2Ñ2ˆØÔH×OÑOÓQÑQÜ—|‘|ˆHð ˆð Ô A× HÑ HÓ JÑJÜ—|‘|ˆHð ˆô Ð1°/Ð1BÐCÓDÐDrX   rÔ  c           	      óž  — g }| D �]Ä  }|d   g dœ}|t         j                  k(  rmt        |d   t        «      r|d   }nMt        |d   t        «      r:g }|d   D ]  }|d   dk(  sŒ|j                  |d   «       Œ! dj                  |«      }|d<   �n(|t         j                  k(  �rt        |d   t        «      r|d   j                  d|d   dœ«       næ|d   D ]Þ  }|d   dk(  r|d   j                  |«       Œ |d   dk(  sŒ)d	|d   d
   v r�t        j                  dd|d   d
   «      }t        j                  t        t        j                  |«      «      «      }t        j                   dd¬«      }	|	j"                  }
|j%                  |	j"                  «       n|d   d
   }
|d   j                  d|
dœ«       Œà |j                  |«       �ŒÇ |S )Nr@  ©r@  r?  r?  Útyperd   ú )rØ  rd   Ú	image_urlÚbase64Úurlz^data:image/.+;base64,r»   z.pngF)ÚsuffixÚdeleteÚimage)rØ  rÜ  )rˆ   r‰   Ú
isinstancerU   r‚  ÚappendÚjoinrŠ   ÚreÚsubr+   Úopenr   rÛ  Ú	b64decodeÚtempfileÚNamedTemporaryFileÚnameÚsave)r­  rÔ  Úprocessor_inputsÚmessageÚparsed_messageÚparsed_contentr?  Ú
image_datarß  r`   rÜ  s              rY   Ú*get_processor_inputs_from_inbound_messagesz7ServeCommand.get_processor_inputs_from_inbound_messages–  sè  € àÐàó '	4ˆGØ&-¨f¡oÀ"ÑEˆNàœ8Ÿ<™<Ò'ô ˜g iÑ0´#Ô6Ø%,¨YÑ%7‘NÜ ¨	Ñ 2´DÔ9Ø%'�NØ#*¨9Ñ#5ò C˜Ø" 6™?¨fÓ4Ø*×1Ñ1°'¸&±/ÕBðCð &)§X¡X¨nÓ%=�NØ,:�˜yÓ)àœXŸ\™\Ó)ô ˜g iÑ0´#Ô6Ø" 9Ñ-×4Ñ4¸fÈgÐV_ÑN`Ñ5aÕbà#*¨9Ñ#5ò \˜Ø" 6™?¨fÒ4Ø*¨9Ñ5×<Ñ<¸WÕEØ$ V™_°Ó;Ø'¨7°;Ñ+?ÀÑ+FÑFÜ-/¯V©VÐ4LÈbÐRYÐZeÑRfÐglÑRmÓ-n 
Ü(-¯
©
´7¼6×;KÑ;KÈJÓ;WÓ3XÓ(Y ä'/×'BÑ'BÈ&ÐY^Ô'_ Ø&*§i¡i à %§
¡
¨4¯9©9Õ 5à&-¨kÑ&:¸5Ñ&A à*¨9Ñ5×<Ñ<ÀgÐVYÑ=ZÕ[ð\ð  ×#Ñ# NÖ3ðO'	4ðP  ÐrX   c                 óê  ‡ ‡‡‡‡‡— ‰ j                   j                  �‰ j                   j                  |d<   |d   }|d   d   dk(  ry‰ j                  |d   «      Š‰‰ j                  k7  }‰‰ _        ‰ j	                  ‰«      \  Š}‰ j                  ‰«      }‰ j                  ||«      }dŠt        D ]/  }|‰j                  j                  d   j                  «       v sŒ-|Š n |j                  |d|j                  d	«      d
dd¬«      }|j                  ‰j                  «      }|j                  dd«      Šd}	d‰j                  j                  d   j                  «       v rd}	t        ||	d¬«      }
t!        |‰j"                  ¬«      }d}‰ j%                  |«      r=|s;‰ j&                  j)                  «       }|d   j*                  d   |kD  r‰ j&                  }i |¥|
|d|dœ¥Šˆˆˆˆˆ ˆfd„} ||
‰«      S )a  
        Generates an OpenAI Chat Completion using `generate`.

        Args:
            req (`dict`): The request to generate an OpenAI Chat Completion for.

        Returns:
            `Generator[str, None, None]`: A generator that yields the OpenAI Chat Completion chunks.
        NrÂ   r­  rµ  r@  r²  r   TÚtoolsr®  )r°  rò  r¯  Úreturn_dictÚtokenizer>  Úreq_0ÚgptossF©Úskip_special_tokensÚskip_prompt©r’   Ú	input_ids)ÚstreamerrO   Úreturn_dict_in_generateÚpast_key_valuesc              3   ón  •K  — d}d }d‰j                   j                  d   j                  «       v rd}d}ˆˆfd„}t        |‰¬«      }d}	 |j	                  «        t        «       }‰j                  ‰d	‰¬
«      –— | D �]#  }d‰j                   j                  d   j                  «       v r|j                  d«      }||z  }|r||v rd}ŒLŒM‰��·|j                  «       t        ‰   d   k(  rd|_
        Œu|j                  «       t        ‰   d   k(  r(|j                  «        ‰j                  |d d‰¬«      –— Œº|j                  �r@|xj                  |z  c_        |j                  sYt        j                  d|j                  «      }	|	€�Œ|	j!                  d«      }	d|_        t#        t%        |	¬«      dd|dz   ¬«      }
n¬|dk(  r�ŒHd|j                  vr�ŒX|xj&                  |j)                  d«      z  c_        |xj&                  |j)                  d«      z  c_        |j&                  dk  r&dj+                  |j-                  d«      d d «      dz   }t#        t%        |¬«      dd¬«      }
‰j                  |d |
g‰¬«      –— �Œ|dk7  s�Œ‰j                  ||‰¬«      –— �Œ& ‰j                  |d‰¬«      –— |j+                  «        |j+                  «        y # t.        $ r9}t0        j3                  t5        |«      «       d t5        |«      › d!�–— Y d }~ŒNd }~ww xY w# |j+                  «        w xY w­w)"NFrö  r   Tú<|channel|>final<|message|>c                  óL   •—  ‰j                   di | ¤Ž}|j                  ‰_        y ©NrW   ©Úgeneraterþ  r  ©r­   Úgenerate_outputrÂ   r¸   s     €€rY   Úgenerate_with_cachezbServeCommand.generate_chat_completion.<locals>.stream_chat_completion.<locals>.generate_with_cache  ó$   ø€ Ø"0 %§.¡.Ñ":°6Ñ":�Ø%4×%DÑ%D�Õ"rX   ©Útargetr­   r»   r²  r³  ú
<|return|>r…   r†   rB  )r>  r@  rA  rÂ   z\"name\": \"(.*?)\"r#   )ré  ÚfunctionÚ
_tool_call)r  rG  rØ  rH  z"arguments": {ú{ú}éþÿÿÿ)Ú	arguments)r  rG  rØ  )r>  r@  rB  rÂ   )r?  rÂ   rr   r´  r¶  r·  )ÚconfigÚarchitecturesr  r   r…   r³   rU  ÚremovesuffixÚstripÚ_TOOL_CALL_TOKENSr¼   r¶   r¿   r½   rã  ÚsearchÚgroupr7   r8   r¾   Úcountrâ  r¡  r»  rØ   r'  rU   )rü  Ú_request_idÚ
filter_cotÚcot_trace_endr  ÚthreadÚresultsÚ
tool_stater½  Ú	tool_nameÚtoolr-  Úgeneration_kwargsrÂ   r¾  r>  r¸   Útool_model_familys               €€€€€€rY   r¿  zEServeCommand.generate_chat_completion.<locals>.stream_chat_completion  sN  øè ø€ ð ˆJØ ˆMØ˜5Ÿ<™<×5Ñ5°aÑ8×>Ñ>Ó@Ñ@Ø!�
Ø =�õEô Ð#6Ð?PÔQˆFØˆGðgØ—‘”Ü&›[�
ð ×6Ñ6°zÈÐ[pÐ6ÓqÒqà&ó V�Fà 5§<¡<×#=Ñ#=¸aÑ#@×#FÑ#FÓ#HÑHØ!'×!4Ñ!4°\Ó!B˜Ø˜vÑ%�Gñ "Ø(¨GÑ3Ø).˜JØ$à$ð )Ñ4à!Ÿ<™<›>Ô->Ð?PÑ-QÐRYÑ-ZÒZØ:>˜JÔ7Ø$ð "Ÿ<™<›>Ô->Ð?PÑ-QÐRWÑ-XÒXØ&×,Ñ,Ô.Ø"&×"BÑ"BØ+6Ø%)Ø.:Ø&;ð	 #Có #ò ð %à%×6Ó6Ø&×-Ò-°Ñ7Õ-ð $.×#CÒ#CÜ,.¯I©IÐ6LÈj×N_ÑN_Ó,` 	Ø#,Ð#4Ù$,à09·±ÀÓ0B IØCG 
Ô @Ü':Ü-HÈiÔ-XØ*+Ø)3Ø'2°\Ñ'Aô	("¡ð $*¨R¢<Ù$,ð $4¸:×;LÑ;LÑ#LÙ$,ð !+× <Ò <ÀÇÁÈSÓ@QÑ QÕ <Ø *× <Ò <ÀÇÁÈSÓ@QÑ QÕ <Ø#-×#?Ñ#?À!Ò#CØ-/¯W©W°V·\±\À#Ó5FÀsÈÐ5KÓ-LÈsÑ-R Fä':Ü-HÐSYÔ-ZØ*+Ø)3ô(" ð #'×"BÑ"BØ+6¸TÈtÈfÐ\qð #Có #ò ñ %ð  ”|Ø"×>Ñ>Ø'°Ð?Tð ?ó ô ðiVðn ×6Ñ6°{ÐRXÐ`uÐ6ÓvÒvà—‘”ð —‘•øô ò 7Ü—‘œS ›VÔ$Ø*¬3¨q«6¨(°#Ð6×6ûð7ûð
 —‘•üsC   ƒAL5ÁH>K Ê?K Ë
L5Ë	LË$/LÌL  ÌLÌL  Ì L2Ì2L5)r�   rù   rÉ  r  rÊ  rÕ  rð  Ú_MODELS_WITH_TOOL_SUPPORTr  r  r  rÍ  rœ   rÎ  râ   r    r±   rO   Úis_continuationr  Úget_seq_lengthÚshape)r¸   r‘   r­  rÏ  rÄ   rÔ  rë  Úsupported_model_familiesrÐ  rø  Úgeneration_streamerrO   r  Úseq_lenr¿  r"  rÂ   r¾  r>  r#  s   `              @@@@@rY   rq  z%ServeCommand.generate_chat_completionÄ  s&  ý€ ð �9‰9× Ñ Ð,ØŸ9™9×0Ñ0ˆC�‰Là9<¸Z¹ˆð �B‰<˜Ñ ;Ò.Øà $× 7Ñ 7¸¸G¹Ó EÐØ2°d·o±oÑEÐà/ˆŒØ×8Ñ8Ð9NÓOÑˆˆyà×*Ñ*¨5Ó1ˆØ×JÑJÈ8ÐU]Ó^Ðð !ÐÜ(Aò 	Ð$Ø'¨5¯<©<×+EÑ+EÀaÑ+H×+NÑ+NÓ+PÒPØ$<Ð!Ùð	ð ×.Ñ.ØØ"&Ø—'‘'˜'Ó"ØØØð /ó 
ˆð —‘˜5Ÿ<™<Ó(ˆØ—W‘W˜\¨7Ó3ˆ
ð #ÐØ�u—|‘|×1Ñ1°!Ñ4×:Ñ:Ó<Ñ<Ø"'Ðä2ØØ 3Øô
Ðô
 >¸cÐ[`×[rÑ[rÔsÐàˆØ×Ñ Ô$Ñ-?Ø×(Ñ(×7Ñ7Ó9ˆGØ�kÑ"×(Ñ(¨Ñ,¨wÒ6Ø $× 2Ñ 2�ð
Øð
à+Ø!2Ø'+Ø,ò
Ð÷x	ñ x	ñt &Ð&9¸:ÓFÐFrX   c                 ó<  ‡ ‡‡‡‡‡— ‰ j                  ‰d   «      Š‰‰ j                  k7  }‰‰ _        ‰ j                  ‰«      \  Š}t        ‰d   t        «      r'd‰v r	d‰d   dœgng }|j                  d‰d   dœ«       n�t        ‰d   t        «      r8d‰v r.‰d   d   d   dk7  rd‰d   dœg‰d   ¢}nY‰d   }‰d   |d   d	<   nH‰d   }nBt        ‰d   t        «      r$d‰v r	d‰d   dœgng }|j                  ‰d   «       nt        d
«      ‚|j                  |dd¬«      }|j                  ‰j                  «      }‰j                  dd«      Šd}d‰j                  j                  d   j                  «       v rd}t!        ||d¬«      }t#        ‰‰j$                  ¬«      }d}‰ j'                  ‰«      r=|s;‰ j(                  j+                  «       }	|d   j,                  d   |	kD  r‰ j(                  }|t/        j0                  |«      ||d|dœŠˆˆˆˆˆˆ fd„}
 |
|‰«      S )a	  
        Generates an OpenAI Response using `generate`.

        Args:
            req (`dict`): The request to generate an OpenAI Response for.

        Returns:
            `Generator[str, None, None]`: A generator that yields the OpenAI Response events.
        rÂ   ÚinputÚinstructionsÚsystemr×  re   r   r@  r?  z%inputs should be a list, dict, or strTr®  )r°  r¯  rp   rõ  rö  Fr÷  rú  Nrû  rµ  )rÐ  Úattention_maskrü  rO   rý  rþ  c              3   ó.	  •K  — d}d }d‰j                   j                  d   j                  «       v rd}d}ˆˆfd„}t        |‰¬«      }d}d}d}	 |j	                  «        t        j
                  «       }	t        d|t        d	‰› �|	d
‰‰j                  d«      dddiidg g ‰j                  dd«      d‰j                  d«      ¬«      ¬«      }
|dz  }‰j                  |
«      –— t        d|t        d	‰› �|	d‰‰j                  d«      dddiidg g ‰j                  dd«      d‰j                  d«      ¬«      ¬«      }|dz  }‰j                  |«      –— t        d||t        d‰› �dddg ¬«      ¬«      }|dz  }‰j                  |«      –— t        dd‰› �|||t        dd g ¬!«      ¬"«      }|dz  }‰j                  |«      –— d }| D ]~  }d‰j                   j                  d   j                  «       v r|j                  d#«      }||z  }|r
||v rd}d }ŒMŒNt!        d$d‰› �||||d d%d&œg¬'«      }|dz  }‰j                  |«      –— Œ€ t#        d(d‰› �||d|d d%d&œg¬)«      }|dz  }‰j                  |«      –— t%        d*d‰› �|||t        d|j&                  g ¬!«      ¬"«      }|dz  }|dz  }‰j                  |«      –— t)        d+||t        d‰› �dd,d|j*                  gg ¬-«      ¬«      }|dz  }|dz  }‰j                  |«      –— t-        d.|t        d	‰› �|	d,‰‰j                  d«      dddii|j.                  gdg ‰j                  dd«      d‰j                  d«      ¬/«      ¬«      }|dz  }‰j                  |«      –— |j1                  «        |j1                  «        y # t2        $ rÏ}t4        j7                  d0t9        |«      › �«       t;        d1|t9        |«      ¬2«      }|dz  }‰j                  |«      –— t=        d3|t        d	‰› �	d4‰‰j                  d«      dddiig dg dd‰j                  d«      t?        d5t9        |«      ¬6«      ¬7«      ¬«      }|dz  }‰j                  |«      –— Y d }~Œäd }~ww xY w# |j1                  «        w xY w­w)8NFrö  r   Tr   c                  óL   •—  ‰j                   di | ¤Ž}|j                  ‰_        y r  r  r  s     €€rY   r  zTServeCommand.generate_response.<locals>.stream_response.<locals>.generate_with_cacheØ  r  rX   r	  zresponse.createdÚresp_Úqueuedr-  ÚformatrØ  rd   rV  r   rá   ru   )rH  r¢  r‡  rÂ   r-  rd   rK  rò  rr  r   rl   ru   )rØ  Úsequence_numberrV  r#   zresponse.in_progressÚin_progresszresponse.output_item.addedÚmsg_rì  r²  )rH  rØ  r‡  r@  r?  )rØ  r5  Úoutput_indexÚitemzresponse.content_part.addedÚoutput_textr»   )rØ  rd   Úannotations)rØ  Úitem_idr5  r8  Úcontent_indexÚpartr  zresponse.output_text.deltagš™™™™ùX@)ÚtokenÚlogprob)rØ  r<  r5  r8  r=  rF  rt   zresponse.output_text.done)rØ  r<  r5  r8  r=  rd   rt   zresponse.content_part.donezresponse.output_item.doneÚ	completed)rH  rØ  r‡  r@  r?  r;  zresponse.completed)rH  r¢  r‡  rÂ   r-  rd   rr  rK  rò  r   rl   ru   z"Exception in response generation: r'  )rØ  r5  rì  zresponse.failedÚfailedÚserver_error)Úcoderì  )rH  r¢  r‡  rÂ   r-  rd   rr  rK  rò  r   rl   ru   r'  ) r  r  r  r   r…   rR  r>   r:   rœ   rX  rB   rC   rE   r<   rF   r  rG   rH   r=   rd   rD   r>  r;   r9  râ  r»  rØ   r'  rU   r@   rA   r?   )rü  r  r  r  r  r  r5  r8  r=  r¢  Úresponse_createdÚresponse_in_progressÚresponse_output_item_addedÚresponse_content_part_addedr  r½  Úresponse_output_text_deltaÚresponse_output_text_doneÚresponse_content_part_doneÚresponse_output_item_doneÚresponse_completedr-  Úerror_eventÚresponse_failedr"  rÂ   r¾  r‘   r>  r¸   s                           €€€€€€rY   Ústream_responsez7ServeCommand.generate_response.<locals>.stream_responseÎ  s­  øè ø€ ð ˆJØ ˆMØ˜5Ÿ<™<×5Ñ5°aÑ8×>Ñ>Ó@Ñ@Ø!�
Ø =�õEô Ð#6Ð?PÔQˆFØˆOØˆLØˆMðMØ—‘”Ü!ŸY™Y›[�
ô $8Ø+Ø$3Ü%Ø" : ,Ð/Ø#-Ø'Ø3Ø%(§W¡W¨^Ó%<Ø&¨°Ð(8Ð9Ø)Ø Ø!Ø,/¯G©GÐ4IÈ5Ó,QØ$*Ø!$§¡¨Ó!4ôô$Ð ð$   1Ñ$�Ø×/Ñ/Ð0@ÓAÒAä'>Ø/Ø$3Ü%Ø" : ,Ð/Ø#-Ø,Ø3Ø%(§W¡W¨^Ó%<Ø&¨°Ð(8Ð9Ø)Ø Ø!Ø,/¯G©GÐ4IÈ5Ó,QØ$*Ø!$§¡¨Ó!4ôô(Ð$ð$   1Ñ$�Ø×/Ñ/Ð0DÓEÒEô .JØ5Ø$3Ø!-Ü.Ø! * Ð.°YÀ}Ð[fÐprôô	.Ð*ð   1Ñ$�Ø×/Ñ/Ð0JÓKÒKô /LØ6Ø" : ,Ð/Ø$3Ø!-Ø"/Ü+°ÀRÐUWÔXô/Ð+ð   1Ñ$�Ø×/Ñ/Ð0KÓLÒLð �Ø&ò P�Fà 5§<¡<×#=Ñ#=¸aÑ#@×#FÑ#FÓ#HÑHØ!'×!4Ñ!4°\Ó!B˜Ø˜vÑ%�Gñ "Ø(¨GÑ3Ø).˜JØ&(˜GØ$à$ä1GØ9Ø"& z lÐ 3Ø(7Ø%1Ø&3Ø$Ø,.¸4Ñ"@Ð!Aô2Ð.ð $ qÑ(�OØ×3Ñ3Ð4NÓOÓOð3Pô8 -BØ4Ø" : ,Ð/Ø$3Ø!-Ø"#Ø Ø(*°tÑ<Ð=ô-Ð)ð   1Ñ$�Ø×/Ñ/Ð0IÓJÒJô .JØ5Ø" : ,Ð/Ø$3Ø!-Ø"/Ü+°ÐE^×EcÑEcÐqsÔtô.Ð*ð   1Ñ$�Ø Ñ"�Ø×/Ñ/Ð0JÓKÒKô -HØ4Ø$3Ø!-Ü.Ø! * Ð.Ø&Ø*Ø(Ø!;×!@Ñ!@Ð AØ$&ôô	-Ð)ð   1Ñ$�Ø Ñ!�Ø×/Ñ/Ð0IÓJÒJô &<Ø-Ø$3Ü%Ø" : ,Ð/Ø#-Ø*Ø3Ø%(§W¡W¨^Ó%<Ø&¨°Ð(8Ð9Ø 9× >Ñ >Ð?Ø)Ø Ø,/¯G©GÐ4IÈ5Ó,QØ$*Ø!$§¡¨Ó!4ôô&Ð"ð$   1Ñ$�Ø×/Ñ/Ð0BÓCÒCà—‘”ðJ —‘•øôI ò !AÜ—‘ÐAÄ#ÀaÃ&ÀÐJÔKÜ0Ø Ø$3Ü ›Fô�ð
   1Ñ$�Ø×/Ñ/°Ó<Ò<ä"5Ø*Ø$3Ü%Ø" : ,Ð/Ø#-Ø'Ø3Ø%(§W¡W¨^Ó%<Ø&¨°Ð(8Ð9Ø!Ø)Ø Ø,1Ø$*Ø!$§¡¨Ó!4Ü+Ø!/Ü$'¨£Fôôô#�ð,   1Ñ$�Ø×/Ñ/°Ó@×@ûðC!AûðH —‘•üs>   ƒARÁMN% ÎRÎ%	Q=Î.CQ8Ñ3R  Ñ8Q=Ñ=R  Ò RÒR)rÉ  r  rÊ  rà  rU   rá  r‚  r–  rû   rÍ  rÎ  râ   rœ   r  r  r  r    r±   rO   r%  r  r&  r'  r«   Ú	ones_like)r¸   r‘   rÏ  rÄ   rÐ  rø  r)  rO   r  r*  rP  r"  rÂ   r¾  r>  s   ``         @@@@rY   ru  zServeCommand.generate_response�  s]  ý€ ð !%× 7Ñ 7¸¸G¹Ó EÐØ2°d·o±oÑEÐØ/ˆŒØ×8Ñ8Ð9NÓOÑˆˆyä�c˜'‘l¤CÔ(ØM[Ð_bÑMb˜x°C¸Ñ4GÑHÑIÐhjˆFØ�M‰M 6°c¸'±lÑCÕDÜ˜˜G™¤dÔ+Ø Ñ$Ø�w‘< ‘? 6Ñ*¨hÒ6Ø'/¸CÀÑ<OÑPÐ`ÐSVÐW^ÑS_Ð`‘Fà  ™\�FØ+.¨~Ñ+>�F˜1‘I˜iÒ(à˜W™‘Ü˜˜G™¤dÔ+ØM[Ð_bÑMb˜x°C¸Ñ4GÑHÑIÐhjˆFØ�M‰M˜#˜g™,Õ'äÐDÓEÐEà×.Ñ.¨vÈTÐbfÐ.ÓgˆØ—‘˜5Ÿ<™<Ó(ˆØ—W‘WÐ3°WÓ=ˆ
ð #ÐØ�u—|‘|×1Ñ1°!Ñ4×:Ñ:Ó<Ñ<Ø"'Ðä2ØØ 3Øô
Ðô
 >¸cÐ[`×[rÑ[rÔsÐàˆØ×Ñ Ô$Ñ-?Ø×(Ñ(×7Ñ7Ó9ˆGØ�kÑ"×(Ñ(¨Ñ,¨wÒ6Ø $× 2Ñ 2�ð Ü#Ÿo™o¨fÓ5Ø+Ø!2Ø'+Ø,ñ
Ð÷`	ñ `	ñD Ð2°JÓ?Ð?rX   c                 ó(  ‡
‡‡‡— t        «       st        d«      ‚| j                  |d   «      }| j                  |«      \  ŠŠt	        ‰j
                  dd¬«      }t        |‰j                  ¬«      }‰j                  j                  }t        j                  |d   «      }t        j                  ||d¬«      \  }} ‰||d¬	«      j                  ‰j                  «      Š
‰
d
   j                  ‰j                   «      ‰
d
<   ||ddœŠˆ
ˆˆˆfd„}	 |	«       S )a  
        Generates an OpenAI Transcription using the audio file.

        Args:
            req (`dict`): The request containing the audio file and model information.

        Returns:
            `Generator[str, None, None]`: A generator that yields the transcription result.
        z]Missing librosa dependency for audio transcription. Please install with `pip install librosa`rÂ   Tr÷  rú  r`   )ÚsrÚmonor®  )Úsampling_rater¯  Úinput_features)rü  rO   rý  c               3   ó¸   •K  —  ‰j                   di ‰¤‰¤Ž} ‰j                  | j                  d¬«      d   }t        |¬«      }|j	                  d¬«      › –— y ­w)NT)rø  r   )rd   rM  rW   )r  Úbatch_decodeÚ	sequencesr1   rS  )Úgenerated_idsÚtranscription_textÚtranscriptionÚaudio_inputsÚaudio_modelÚaudio_processorr"  s      €€€€rY   Ú_generate_transcriptionzDServeCommand.generate_transcription.<locals>._generate_transcriptionÚ  sg   øè ø€ Ø0˜K×0Ñ0ÑU°<ÐUÐCTÑUˆMØ!0×!=Ñ!=¸m×>UÑ>UÐkoÐ!=Ó!pÐqrÑ!sÐÜ)Ð/AÔBˆMØ"×2Ñ2ÀÐ2ÓEÐFÓGùs   ƒAA)r   r  rÉ  Úload_audio_model_and_processorr    rD  r±   rO   Úfeature_extractorrU  Úior   ÚlibrosaÚloadrÎ  râ   rè   )r¸   r‘   r¾  r)  rO   Úmodel_sampling_rateÚaudio_bytesÚaudio_arrayÚ_r`  r]  r^  r_  r"  s             @@@@rY   r~  z#ServeCommand.generate_transcription²  s"  û€ ô $Ô%ÜØoóð ð !%× 7Ñ 7¸¸G¹Ó EÐØ'+×'JÑ'JÐK`Ó'aÑ$ˆ�_ä2Ø×%Ñ%¸4ÈTô
Ðô >Ø¨×)FÑ)Fô
Ðð
 .×?Ñ?×MÑMÐÜ—j‘j  V¡Ó-ˆÜ Ÿ™ kÐ6IÐPTÔU‰ˆ�QÙ& {ÐBUÐfjÔk×nÑnØ×Ñó
ˆð *6Ð6FÑ)G×)JÑ)JÈ;×K\ÑK\Ó)]ˆÐ%Ñ&ð ,Ø!2Ø'+ñ
Ð÷	Hñ 'Ó(Ð(rX   c                 ó>  — |j                  d«      xs |j                  d«      }d}| j                  €d}n`t        | j                  «      t        |«      k\  rd}n<t        t        | j                  «      «      D ]  }| j                  |   ||   k7  sŒd} n || _        |S )aD  
        Determines whether the current request is a continuation of the last request. In other words, if it is the
        same chat session.

        Args:
            req (`dict`): The request to check.

        Returns:
            `True` if the request is a continuation of the last request, `False` otherwise.
        r­  r,  TF)rœ   r  ÚlenÚrange)r¸   r‘   r­  Úreq_continues_last_messagesÚis        rY   r%  zServeCommand.is_continuationâ  s¨   € ð —7‘7˜:Ó&Ò:¨#¯'©'°'Ó*:ˆØ&*Ð#ð ×ÑÐ%Ø*/Ñ'ä�×#Ñ#Ó$¬¨H«Ò5Ø*/Ñ'ô œ3˜t×1Ñ1Ó2Ó3ò �Ø×%Ñ% aÑ(¨H°Q©KÓ7Ø27Ð/Ùðð
 &ˆÔØ*Ð*rX   r&   c                 óÊ   — | j                   r:t        d| j                  | j                  | j                  | j                  ¬«      }|S | j
                  rt        d¬«      }|S d}|S )a  
        Returns the quantization config for the given CLI arguments.

        Args:
            args (`ServeArguments`): The serve arguments. May contain quantization settings, device, etc.

        Returns:
            `Optional[BitsAndBytesConfig]`: The quantization config.
        T)rì   Úbnb_4bit_compute_dtyperï   Úbnb_4bit_use_double_quantÚbnb_4bit_quant_storage)rë   N)rì   r&   rè   rï   rð   rë   )r�   Úquantization_configs     rY   Úget_quantization_configz$ServeCommand.get_quantization_config   sr   € ð ×ÒÜ"4Ø!à'+§z¡zØ$(×$<Ñ$<Ø*.×*CÑ*CØ'+§z¡zô#Ðð #Ð"ð ×ÒÜ"4Ø!ô#Ðð #Ð"ð #'Ðà"Ð"rX   Úmodel_idc                 óp   — | j                   j                  �| j                   j                  }d|v r|S |› d�S )aR  
        Applies the `force_model` CLI argument and canonicalizes the model name to the format "model_id@revision".
        If the model_id DOESN'T contain an @, it defaults to "model_id@main".

        Args:
            model_id (`str`): The model ID.

        Returns:
            `str`: The canonicalized model name to be used
        ú@z@main)r�   rù   )r¸   ru  s     rY   rÉ  zServeCommand.process_model_name  s<   € ð �9‰9× Ñ Ð,Ø—y‘y×,Ñ,ˆHØ�(‰?ØˆOØ�˜5Ð!Ð!rX   r¾  c                 ó¤  — | j                   }t        j                  d|› �«       d|v r|j                  dd«      \  }}n|d}}t	        j
                  |||j                  ¬«      }|j                  dv r|j                  nt        t        |j                  «      }| j                  |«      }||j                  |d|j                  dœ}|�||d
<   t        j
                  |fi |¤Ž}	t        t        |	j                  d   «      }
 |
j
                  |fi |¤Ž}t        |dd	«      €|j                  |j                   «      }|j"                  j$                  d	u xr |j"                  j&                  dk(  }|j"                  j$                  d	uxr |j"                  j$                  dk  }|s|rd|j"                  _        t        j                  d|› �«       ||fS )a  
        Generic method to load a model and a data processor from a model ID and revision, making use of the serve CLI
        arguments.

        Args:
            model_id_and_revision (`str`):
                The model ID and revision to load.
            model_cls (`type[PreTrainedModel]`):
                The model class to load.

        Returns:
            `tuple[PreTrainedModel, Union[ProcessorMixin, PreTrainedTokenizerFast]]`: The loaded model and
            data processor (tokenizer, audio processor, etc.).
        zLoading rw  r#   Úmain)Úrevisionré   )rá   Nrá   )rz  rê   rè   Ú
device_mapré   Nrs  r   Úhf_device_mapé   rx  zLoaded model )r�   rØ   rÙ   r¡  r%   Úfrom_pretrainedré   rè   Úgetattrr«   rt  rê   r   r	  r  rÎ  râ   rO   r¥   Ú
max_length)r¸   r¾  r�   ru  rz  Údata_processorrè   rs  Úmodel_kwargsr  ÚarchitecturerÂ   Úhas_default_max_lengthÚhas_short_max_new_tokenss                 rY   Ú_load_model_and_data_processorz+ServeCommand._load_model_and_data_processor.  sÓ  € ð �y‰yˆÜ�‰�hÐ4Ð5Ð6Ô7àÐ'Ñ'Ø!6×!<Ñ!<¸SÀ!Ó!DÑˆH‘hà!6¸�hˆHä&×6Ñ6ØØØ"×4Ñ4ô
ˆð #Ÿj™j¨NÑ:�—
’
ÄÌÈtÏzÉzÓ@ZˆØ"×:Ñ:¸4Ó@Ðð !Ø#'×#;Ñ#;ØØ Ø!%×!7Ñ!7ñ
ˆð Ð*Ø2EˆLÐ.Ñ/ä×+Ñ+¨HÑE¸ÑEˆÜœ|¨V×-AÑ-AÀ!Ñ-DÓEˆØ,�×,Ñ,¨XÑF¸ÑFˆä�5˜/¨4Ó0Ð8Ø—H‘H˜TŸ[™[Ó)ˆEð ×#Ñ#×2Ñ2°dÐ:Òg¸u×?VÑ?V×?aÑ?aÐegÑ?gð 	ð ×#Ñ#×2Ñ2¸$Ð>ÒpÀ5×CZÑCZ×CiÑCiÐlpÑCpð 	!ñ "Ñ%=Ø59ˆE×#Ñ#Ô2ä�‰�mÐ$9Ð#:Ð;Ô<Ø�nÐ$Ð$rX   c                 óŒ  — || j                   vs| j                   |   j                  «       rG| j                  |«      \  }}t        || j                  j
                  |¬«      | j                   |<   ||fS | j                   |   j                  «        | j                   |   j                  }| j                   |   j                  }||fS )a\  
        Loads the text model and processor from the given model ID and revision into the ServeCommand instance.

        Args:
            model_id_and_revision (`str`):
                The model ID and revision to load.

        Returns:
            `tuple[PreTrainedModel, PreTrainedTokenizerFast]`: The loaded text model and processor.
        ©rÃ   rÄ   ©	r  rÛ   r†  rÁ   r�   rô   rÎ   rÂ   rÄ   )r¸   r¾  rÂ   rÄ   s       rY   rÊ  z%ServeCommand.load_model_and_processork  sÈ   € ð !¨×(:Ñ(:Ñ:¸d×>PÑ>PÐQfÑ>g×>rÑ>rÔ>tØ#×BÑBÐCXÓYÑˆE�9Ü8BØØ $§	¡	× 7Ñ 7Ø#ô9ˆD×ÑÐ4Ñ5ð �iÐÐð	 ×ÑÐ4Ñ5×AÑAÔCØ×&Ñ&Ð'<Ñ=×CÑCˆEØ×*Ñ*Ð+@ÑA×KÑKˆIà�iÐÐrX   c                 óŒ  — || j                   vs| j                   |   j                  «       rG| j                  |«      \  }}t        || j                  j
                  |¬«      | j                   |<   ||fS | j                   |   j                  «        | j                   |   j                  }| j                   |   j                  }||fS )aU  
        Loads the audio model and processor from the given model ID and revision into the ServeCommand instance.

        Args:
            model_id_and_revision (`str`):
                The model ID and revision to load.

        Returns:
            `tuple[PreTrainedModel, ProcessorMixin]`: The loaded audio model and processor.
        rˆ  r‰  )r¸   r¾  r^  r_  s       rY   ra  z+ServeCommand.load_audio_model_and_processor†  sÈ   € ð !¨×(:Ñ(:Ñ:¸d×>PÑ>PÐQfÑ>g×>rÑ>rÔ>tØ+/×+NÑ+NÐOdÓ+eÑ(ˆK˜Ü8BØØ $§	¡	× 7Ñ 7Ø)ô9ˆD×ÑÐ4Ñ5ð ˜OÐ+Ð+ð	 ×ÑÐ4Ñ5×AÑAÔCØ×,Ñ,Ð-BÑC×IÑIˆKØ"×0Ñ0Ð1FÑG×QÑQˆOà˜OÐ+Ð+rX   )r»   NNNNNNN).rQ   rR   rS   Ústaticmethodr   r  rÝ   r¹   r–  r   r$  r/  r5  r9  r=  rU   r   r¤   r‚  r   r   rU  rX  rš  Ú	functoolsÚcacheÚanyr„  r   ro  rˆ   rÕ  rð  r   rq  ru  r~  rc   r%  rt  rÉ  r†  ÚtuplerÊ  r   ra  rW   rX   rY   r�   r�   Ö  sÚ  „ Øð	> Nò 	>ó ð	>ð+˜^ó +ðZ/àð/ð ð/ð !ð	/ð
 ó/ðb
°ó 
ð
¸ó 
ð
°dó 
ð Ø!%Ø#Ø"Ø'+Ø<@Ø04Ø7;ñ6Gàð6Gð ˜#‘ð6Gð ˜‰}ð	6Gð
 �s‰mð6Gð   ‘}ð6Gð ˜TÐ"7Ñ8Ñ9ð6Gð   Ñ-ð6Gð Ð3Ñ4ð6Gð 
ó6GðpJ¨[ð J¸Só Jò ]bð~ ‡_�_ð+  T¨#¨s¨(¡^Ñ 4ò +ó ð+ðZZ;°tð Z;Èð Z;ÐQ_Ð`cÐeiÐ`iÑQjó Z;ðx ð	Ð"3ð 	¸ò 	ó ð	ð ð+ Àxò + ó ð+ ðZGG¨Dð GG°Y¸sÀDÈ$¸Ñ5Oó GGðRc@ Tð c@¨i¸¸TÀ4¸Ñ.Hó c@ðJ	.)¨$ð .)°9¸SÀ$È¸_Ñ3Mó .)ð`+ 4ð +¨Dó +ð< ð# nð #¸ÐBVÑ9Wò #ó ð#ð8"¨3ð "°3ó "ð";%ÀCó ;%ðz Ø%(ð à	Ð Ð"9Ð9Ñ	:ó ð6,ÀCð ,ÈEÐRcÐesÐRsÑLtô ,rX   r�   Ú__main__)�rÃ  rÛ  rŸ   rž  ÚenumrŒ  rÑ   rc  r�   rã  rç  rÈ   rR  rŽ  Úargparser   r   Úcollections.abcr   r   r   Ú
contextlibr   Údataclassesr	   r
   r   r   Útypingr   r   r   Úhuggingface_hubr   Úhuggingface_hub.constantsr   Útokenizers.decodersr   r	  Ú&transformers.models.auto.modeling_autor   r   Útransformers.utils.import_utilsr   r   r   r   r   r   r»   r   r   r   r   r    Úutilsr!   r"   r$   r«   r%   r&   r'   r(   Úgeneration.continuous_batchingr)   r*   rd  ÚPILr+   r
  r™  r”  r,   r-   Úfastapi.middleware.corsr.   Úfastapi.responsesr/   r0   Ú openai.types.audio.transcriptionr1   Ú.openai.types.audio.transcription_create_paramsr2   Úopenai.types.chatr3   Ú'openai.types.chat.chat_completion_chunkr4   r5   r6   r7   r8   Ú*openai.types.chat.completion_create_paramsr9   Úopenai.types.responsesr:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   Ú-openai.types.responses.response_create_paramsrI   ÚpydanticrJ   rK   rL   rN   r]   r_   r2  r7  r;  r3  r8  r<  r  rQ   rØ   r  r‚  r%  r$  r�  ÚEnumrˆ   r�   r–  r±   r³   rÁ   rÝ   r�   r   rš  rW   rX   rY   ú<module>rª     sr  ðó Û Û Û Û Û Û 	Û 	Û Û 	Û Û Û Û ß .ß ?Ñ ?Ý *ß (Ý Ý ß -Ñ -å &Ý 4Ý ,ã ÷÷÷ ÷õ ÷ 0Ý (ñ ÔÛ÷ó ÷ ZáÔÛáÔÝñ ÓÒkÑ 4Ó 6ÒkÑ;OÓ;QÒkÑViÓVkð ñ  Ûß.Ý6ßAÝ>Ý\Ý<÷õ õ [÷÷ ÷ ÷ ñ õ" \ß@Ñ@ôÐ4QÐY^õ ôÐ6UÐ]bõ ôÐ0MÐUZõ ñ %Ð%NÓOÐÙ&Ð'RÓSÐÙ)Ð*OÓPÐòÐò %Ð!ò.#Ðð 
ˆ×	Ñ	˜HÓ	%€ð
 ØØñðÐ ñ !Ð!2×!7Ò!7Ó!9Ó:Ð à€ôˆt�yŠyô ð 	ó ð8Ø	ð8à/ð8ð ó	8÷vñ ÷/@ñ /@ðd ÷nð nó ðnôbG,Ð-ô G,ðT& ˆzÒÙ‹N€EØ	‡I‚I…Kð rX   