Ë
    Gêñiï'  ã                   ó  — 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
«       rddlm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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j@                  e!«      Z" G d„ de«      Z#y)a
  
Handler for the /v1/completions endpoint (OpenAI legacy Completions API).

Accepts a freeform text prompt (no chat template) and returns generated text
in choices[].text. Supports streaming and non-streaming modes, and suffix for
fill-in-the-middle text insertion.
é    N)ÚAsyncGenerator)ÚTYPE_CHECKINGé   )Úlogging)Úis_serve_available)ÚHTTPException)ÚJSONResponseÚStreamingResponse)Ú
CompletionÚCompletionChoiceÚCompletionUsage)ÚCompletionCreateParamsBaseé   )ÚBaseGenerateManagerÚBaseHandlerÚ_StreamError)ÚGenerationConfigÚPreTrainedModelÚPreTrainedTokenizerFastÚProcessorMixinc                   ó,   — e Zd ZU eed<   eed<   eed<   y)Ú&TransformersTextCompletionCreateParamsÚgeneration_configÚseedÚstreamN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__ÚintÚbool© ó    úe/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/transformers/cli/serving/completion.pyr   r   -   s   … ØÓØ
ƒIØ„Lr$   r   F)Útotal>   ÚnÚechoÚuserÚbest_ofÚlogprobsÚstream_optionsÚpresence_penaltyc                   óè   ‡ — e Zd ZdZeZeZdede	ddfd„Z
	 dde	dd	d
dde	dedddede	dz  ddfd„Z	 dde	dd	d
dde	dedddede	dz  ddfd„Z	 	 	 dde	de	de	de	dz  ddde	fd„Zd dedddefˆ fd„Zˆ xZS )!ÚCompletionHandlera  Handler for the `/v1/completions` endpoint.

    Takes a raw text ``prompt`` (no chat template) and generates text returned in
    ``choices[].text``. Supports streaming (SSE) and non-streaming (JSON) responses,
    and ``suffix`` for fill-in-the-middle insertion.
    ÚbodyÚ
request_idÚreturnz StreamingResponse | JSONResponsec           
   ƒ   ó&  K  — | j                  |«       |j                  dd«      }t        |t        «      st	        dd¬«      ‚| j                  |«      \  }}}| j                  j                  ||¬«      }| j                  j                  ||«      }t        j                  d|› d|› �«       | j                  j                  ||¬	«      }	t        |d
|«      }
 |
||rdnd¬«      }|s|j                  |j                  «      }| j!                  ||j"                  |¬	«      }|r|	j%                  ||«       |j                  d«      }|j                  d«      }|r| j'                  |||||||	|«      S | j)                  |||||||	|«      ƒ 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 legacy completions format).
            request_id (`str`): Unique request identifier (from header or auto-generated).

        Returns:
            `StreamingResponse | JSONResponse`: SSE stream or JSON depending on ``body["stream"]``.
        ÚpromptÚ i�  zprompt must be a string.)Ústatus_codeÚdetail)Ú	processorz[Request received] Model: z, CB: ©Úuse_cbÚ	tokenizerNÚpt)Úreturn_tensorsÚsuffixr   )Ú_validate_requestÚgetÚ
isinstancer   r   Ú_resolve_modelÚmodel_managerÚget_model_modalityÚgeneration_stateÚuse_continuous_batchingÚloggerÚwarningÚget_managerÚgetattrÚtoÚdeviceÚ_build_generation_configr   Úinit_cbÚ
_streamingÚ_non_streaming)Úselfr0   r1   r4   Úmodel_idÚmodelr8   Úmodalityr:   Úgen_managerr;   ÚinputsÚ
gen_configr>   Ú	streamings                  r%   Úhandle_requestz CompletionHandler.handle_requestM   s�  è ø€ ð 	×Ñ˜tÔ$à—‘˜( BÓ'ˆÜ˜&¤#Ô&Ü¨CÐ8RÔSÐSà%)×%8Ñ%8¸Ó%>Ñ"ˆ�%˜Ø×%Ñ%×8Ñ8¸È)Ð8ÓTˆØ×&Ñ&×>Ñ>¸uÀhÓOˆÜ�‰Ð3°H°:¸VÀFÀ8ÐLÔMØ×+Ñ+×7Ñ7¸ÈÐ7ÓPˆä˜I {°IÓ>ˆ	Ù˜6¹&±$ÀdÔKˆÙØ—Y‘Y˜uŸ|™|Ó,ˆFà×2Ñ2°4¸×9PÑ9PÐY_Ð2Ó`ˆ
ÙØ×Ñ  zÔ2à—‘˜(Ó#ˆØ—H‘H˜XÓ&ˆ	áØ—?‘? :¨u°iÀÈ6ÐS]Ð_jÐlrÓsÐsà×,Ñ,Ø˜E 9¨h¸À
ÈKÐY_ó÷ ð ð ús   ‚FFÆ
FÆFNrS   r   r8   z(ProcessorMixin | PreTrainedTokenizerFastrR   rV   rW   r   rU   r>   r
   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.©r1   Ú	input_idséÿÿÿÿr2   Nc                 óT  •K  — 	 d} | s=‰
j                  «       ƒ d {  –—† }|g}	 	 |j                  ‰
j                  «       «       Œ ‰j                  d uxr ‰j                  ‰j                  k\  }|rdnd}‰�‰j                  ‰‰	‰¬«      ­–— t        ‰‰j                  ‰‰j                  z   ¬	«      }‰j                  ‰‰	||¬
«      ­–— y 7 Œ¯# t        j                  $ r Y nw xY wg }|D ]p  }|€d}  njt        |t        «      r5|j                  d|j                  › d�«       dj                  |«      ­–—  y |j                  ‰j                  ‰‰	|¬«      «       Œr |rdj                  |«      ­–— | s�Œo�Œ4# t        t        j                  f$ r ‰j                  «        ‚ w xY w­w)NFTzdata: {"error": "z"}

r5   )ÚtextÚlengthÚstop©Úprompt_tokensÚcompletion_tokensÚtotal_tokens)Úfinish_reasonÚusage)r@   ÚappendÚ
get_nowaitÚasyncioÚ
QueueEmptyrA   r   ÚmsgÚjoinÚ_build_chunk_sseÚmax_new_tokensre   r   ÚGeneratorExitÚCancelledErrorÚcancel)Údoner_   ÚbatchÚ	sse_partsÚhit_maxrf   rg   rW   Ú	input_lenrR   Úqueuer1   rQ   Ústreamerr>   s          €€€€€€€€r%   Ússe_genz-CompletionHandler._streaming.<locals>.sse_genˆ   s½  øè ø€ ð'Ø�ÙØ!&§¡£×,�DØ!˜F�EðØ"Ø!ŸL™L¨×)9Ñ)9Ó);Ô<ð #ð( %×3Ñ3¸4Ð?ÒvÀH×DYÑDYÐ]g×]vÑ]vÑDv�Ù,3¡¸�àÐ%Ø×/Ñ/°
¸HÈ6Ð/ÓRÓRÜ'Ø"+Ø&.×&;Ñ&;Ø!*¨X×-BÑ-BÑ!Bô�ð
 ×+Ñ+¨J¸ÐP]ÐejÐ+ÓkÔkðC -ùô
 #×-Ñ-ò Ùðúð ,.�IØ %ò 	a˜Ø˜<Ø#'˜DÙ!Ü% d¬LÔ9Ø%×,Ñ,Ð/AÀ$Ç(Á(ÀÈ7Ð-SÔTØ"$§'¡'¨)Ó"4Ó4Ù"à!×(Ñ(¨×)>Ñ)>¸zÈ8ÐZ^Ð)>Ó)_Õ`ð	añ !Ø Ÿg™g iÓ0Ó0ó- úôF "¤7×#9Ñ#9Ð:ò Ø—‘Ô!Øðüs]   ƒF(…E: œC�E: ¥!C ÁBE: ÃF(ÃE: ÃC$Ã!E: Ã#C$Ã$AE: Ä8F(Ä9=E: Å:+F%Æ%F(ztext/event-stream©Ú
media_type)Úgenerate_streamingrA   ÚlistÚlenÚshaper   r   r
   )rQ   r1   rS   r8   rR   rV   rW   rU   r>   r\   rz   rw   rx   ry   s   ``  ` ` `  @@@r%   rO   zCompletionHandler._streamingx   s{   ÿ€ ð &×8Ñ8¸À	È6ÐS]ÐjtÐ8Óu‰ˆˆxØ˜;Ñ'ˆ	Ü&0°¼DÔ&A”C˜	”NÀyÇÁÐWYÑGZˆ	ð(	œ~¬c°4¨iÑ8÷ (	ô (	ôT !¡£Ð7JÔKÐKr$   r	   c	              ƒ   ó�  K  — |j                  |||||¬«      ƒ d{  –—† \  }	}
}|�|	|z   }	t        |«      }|j                  duxr ||j                  k\  }|rdnd}t        |
||
|z   ¬«      }t	        |t        t        j                  «       «      |t        |	dd|¬«      gd|¬	«      }t        |j                  d
¬«      d¬«      S 7 Œ§­w)z)Run generation and return a JSONResponse.r[   Nr`   ra   rb   r   ©r_   Úindexr+   rf   Útext_completion)ÚidÚcreatedrS   ÚchoicesÚobjectrg   T)Úexclude_nonezapplication/jsonr{   )
Úgenerate_non_streamingr   ro   r   r   r!   Útimer   r	   Ú
model_dump)rQ   r1   rS   r8   rR   rV   rW   rU   r>   r_   rw   Úgenerated_idsrd   rv   rf   rg   Úresults                    r%   rP   z CompletionHandler._non_streaming¶   sú   è ø€ ð 0;×/QÑ/QØ�9˜f j¸Zð 0Ró 0
÷ *
Ñ&ˆˆi˜ð ÐØ˜&‘=ˆDä Ó.ÐØ×+Ñ+°4Ð7ÒjÐ<MÐQ[×QjÑQjÑ<jˆÙ$+™°ˆäØ#Ø/Ø"Ð%6Ñ6ô
ˆô ØÜœŸ	™	›Ó$Øä ØØØ!Ø"/ô	ðð %Øô
ˆô  ˜F×-Ñ-¸4Ð-Ó@ÐM_Ô`Ð`ðC*
ús   ‚CœC�B(Cr_   rf   rg   zCompletionUsage | Nonec                 óÀ   — t        j                  |dt        t        j                  «       «      |t	        j                  |dd|¬«      g|¬«      }| j                  |«      S )a,  Build a streaming ``Completion`` chunk and format it as an SSE ``data:`` line.

        Uses ``model_construct`` to bypass pydantic validation so that ``finish_reason``
        can be ``None`` for mid-stream chunks (the OpenAI SDK's ``CompletionChoice`` only
        accepts literal values).
        r„   r   Nr‚   )r…   rˆ   r†   rS   r‡   rg   )r   Úmodel_constructr!   r‹   r   Úchunk_to_sse)rQ   r1   rR   r_   rf   rg   Úchunks          r%   rn   z"CompletionHandler._build_chunk_sseç   sb   € ô ×*Ñ*ØØ$ÜœŸ	™	›Ó$Øä ×0Ñ0ØØØ!Ø"/ô	ðð ô
ˆð × Ñ  Ó'Ð'r$   Úmodel_generation_configr:   c                 óø   •— t         ‰| �  |||¬«      }|j                  d«      �t        |d   «      |_        |j                  d«      �dt        |d   «      z   |_        |j                  d«      �
|d   |_        |S )zgApply legacy completion params (``max_tokens``, ``frequency_penalty``, ``stop``) on top of base config.r9   Ú
max_tokensÚfrequency_penaltyg      ð?ra   )ÚsuperrM   r@   r!   ro   ÚfloatÚrepetition_penaltyÚstop_strings)rQ   r0   r“   r:   r   Ú	__class__s        €r%   rM   z*CompletionHandler._build_generation_config  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�FÓÐ'Ø-1°&©\ÐÔ*à Ð r$   )N)r5   NN)F)r   r   r   Ú__doc__r   Ú_valid_params_classÚUNUSED_LEGACY_COMPLETION_FIELDSÚ_unused_fieldsÚdictr   rY   r   rO   rP   rn   r"   rM   Ú__classcell__)r›   s   @r%   r/   r/   B   s„  ø„ ñð AÐØ4€Nð'¨ð '¸3ð 'ÐCeó 'ðh "ñ:Làð:Lð !ð:Lð >ð	:Lð
 ð:Lð ð:Lð 'ð:Lð )ð:Lð �d‘
ð:Lð 
ó:LðN "ñ-aàð-að !ð-að >ð	-að
 ð-að ð-að 'ð-að )ð-að �d‘
ð-að 
ó-aðj Ø$(Ø*.ñ(àð(ð ð(ð ð	(ð
 ˜T‘zð(ð (ð(ð 
ó(ñB!¨Tð !ÐL^ð !Ðhl÷ !ñ !r$   r/   )$rœ   rj   r‹   Úcollections.abcr   Útypingr   Úutilsr   Úutils.import_utilsr   Úfastapir   Úfastapi.responsesr	   r
   Úopenai.typesr   r   r   Ú%openai.types.completion_create_paramsr   r   r   r   Útransformersr   r   r   r   r   rž   Ú
get_loggerr   rG   r/   r#   r$   r%   ú<module>r¬      s‚   ðñó Û Ý *Ý  å Ý 4ñ ÔÝ%ßAßJÑJÝP÷ BÑ Añ ßgÓgôÐ-GÈuõ ò#Ð ð 
ˆ×	Ñ	˜HÓ	%€ôQ!˜õ Q!r$   