§
    ‚Štjï'  ã                   ó.  — 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#dS )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<   dS )Ú&TransformersTextCompletionCreateParamsÚgeneration_configÚseedÚstreamN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__ÚintÚbool© ó    úa/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/cli/serving/completion.pyr   r   -   s.   € € € € € € ØÐÐÑØ
€I€I�IØ€L€L�L€L€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           
   ƒ   óz  K  — |                       |¦  «         |                     dd¦  «        }t          |t          ¦  «        st	          dd¬¦  «        ‚|                      |¦  «        \  }}}| j                             ||¬¦  «        }| j         	                    ||¦  «        }t                               d|› d|› �¦  «         | j                             ||¬	¦  «        }	t          |d
|¦  «        }
 |
||rdnd¬¦  «        }|s|                     |j        ¦  «        }|                      ||j        |¬	¦  «        }|r|	                     ||¦  «         |                     d¦  «        }|                     d¦  «        }|r|                      |||||||	|¦  «        S |                      |||||||	|¦  «        ƒ d{V —†S )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Ñ'Ô'ˆÝ˜&¥#Ñ&Ô&ð 	TÝ¨CÐ8RÐSÑSÔSÐSà%)×%8Ò%8¸Ñ%>Ô%>Ñ"ˆ�%˜ØÔ%×8Ò8¸È)Ð8ÑTÔTˆØÔ&×>Ò>¸uÀhÑOÔOˆÝ�ŠÐL°HÐLÐLÀFÐLÐLÑMÔMÐMØÔ+×7Ò7¸ÈÐ7ÑPÔPˆå˜I {°IÑ>Ô>ˆ	Ø�˜6¸&Ð2J°$°$ÀdÐKÑKÔKˆØð 	-Ø—Y’Y˜uœ|Ñ,Ô,ˆFà×2Ò2°4¸Ô9PÐY_Ð2Ñ`Ô`ˆ
Øð 	3Ø×Ò  zÑ2Ô2Ð2à—’˜(Ñ#Ô#ˆØ—H’H˜XÑ&Ô&ˆ	àð 	Ø—?’? :¨u°iÀÈ6ÐS]Ð_jÐlrÑsÔsÐsà×,Ò,Ø˜E 9¨h¸À
ÈKÐY_ñô ð ð ð ð ð ð ð r$   NrS   r   r8   z(ProcessorMixin | PreTrainedTokenizerFastrR   rV   rW   r   rU   r>   r
   c	           	      ó2  ‡ ‡‡‡‡‡‡‡— |                      |||‰‰¬¦  «        \  ŠŠ|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                 ó^  •K  — 	 d} | sþ‰
                      ¦   «         ƒ d {V —†}|g}	 	 |                     ‰
                     ¦   «         ¦  «         Œ(# t          j        $ r Y nw xY wg }|D ]�}|€d}  nzt          |t          ¦  «        r9|                     d|j        › d�¦  «         d                     |¦  «        W V —  d S |                     ‰ 	                    ‰‰	|¬¦  «        ¦  «         Œ‚|rd                     |¦  «        W V — | ¯þ‰j
        d uo‰j        ‰j
        k    }|rdnd}‰�‰ 	                    ‰‰	‰¬¦  «        W V — t          ‰‰j        ‰‰j        z   ¬	¦  «        }‰ 	                    ‰‰	||¬
¦  «        W V — d S # t          t          j        f$ r ‰                     ¦   «          ‚ w xY 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ˆ   sL  øè è € ð'Ø�Øð 1Ø!&§¢¡¤Ð,Ð,Ð,Ð,Ð,Ð,�DØ!˜F�Eðð=Ø!ŸLšL¨×)9Ò)9Ñ);Ô);Ñ<Ô<Ð<ð=øå"Ô-ð ð ð Ø˜ðøøøð ,.�IØ %ð 	að 	a˜Ø˜<Ø#'˜DØ!˜EÝ% d­LÑ9Ô9ð #Ø%×,Ò,Ð-SÀ$Ä(Ð-SÐ-SÐ-SÑTÔTÐTØ"$§'¢'¨)Ñ"4Ô"4Ð4Ð4Ð4Ð4Ø"˜F˜Fà!×(Ò(¨×)>Ò)>¸zÈ8ÐZ^Ð)>Ñ)_Ô)_Ñ`Ô`Ð`Ð`à ð 1Ø Ÿgšg iÑ0Ô0Ð0Ð0Ð0Ð0ð- ð 1ð0 %Ô3¸4Ð?ÐvÀHÔDYÐ]gÔ]vÒDv�Ø,3Ð ?  ¸�àÐ%Ø×/Ò/°
¸HÈ6Ð/ÑRÔRÐRÐRÐRÐRÝ'Ø"+Ø&.Ô&;Ø!*¨XÔ-BÑ!Bðñ ô �ð
 ×+Ò+¨J¸ÐP]ÐejÐ+ÑkÔkÐkÐkÐkÐkÐkÐkøÝ!¥7Ô#9Ð:ð ð ð Ø—’Ñ!Ô!Ð!Øðøøøs0   …!F  §)A ÁA"ÁF  Á!A"Á"AF  Â?B?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Ôu‰ˆˆxØ˜;Ô'ˆ	Ý&0°½DÑ&AÔ&AÐZ•C˜	‘N”N�NÀyÄÐWYÔGZˆ	ð(	�~­c°4¨iÔ8ð (	ð (	ð (	ð (	ð (	ð (	ð (	ð (	ð (	ð (	ð (	ð (	ð (	õT !  ¡¤Ð7JÐKÑKÔKÐKr$   r	   c	              ƒ   ó¬  K  — |                      |||||¬¦  «        ƒ d{V —†\  }	}
}|�|	|z   }	t          |¦  «        }|j        duo
||j        k    }|rdnd}t          |
||
|z   ¬¦  «        }t	          |t          t          j        ¦   «         ¦  «        |t          |	dd|¬¦  «        gd|¬	¦  «        }t          | 	                    d
¬¦  «        d¬¦  «        S )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
ô 0
ð *
ð *
ð *
ð *
ð *
ð *
Ñ&ˆˆi˜ð ÐØ˜&‘=ˆDå Ñ.Ô.ÐØÔ+°4Ð7ÐjÐ<MÐQ[ÔQjÒ<jˆØ$+Ð7˜˜°ˆåØ#Ø/Ø"Ð%6Ñ6ð
ñ 
ô 
ˆõ ØÝ�œ	™œÑ$Ô$Øå ØØØ!Ø"/ð	ñ ô ðð %Øð
ñ 
ô 
ˆõ  ˜F×-Ò-¸4Ð-Ñ@Ô@ÐM_Ð`Ñ`Ô`Ð`r$   r5   r_   rf   rg   zCompletionUsage | Nonec                 óÊ   — t          j        |dt          t          j        ¦   «         ¦  «        |t	          j        |dd|¬¦  «        g|¬¦  «        }|                      |¦  «        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ç   sv   € õ Ô*ØØ$Ý�œ	™œÑ$Ô$Øå Ô0ØØØ!Ø"/ð	ñ ô ðð ð
ñ 
ô 
ˆð × Ò  Ñ'Ô'Ð'r$   FÚmodel_generation_configr:   c                 óV  •— t          ¦   «                              |||¬¦  «        }|                     d¦  «        �t          |d         ¦  «        |_        |                     d¦  «        �dt          |d         ¦  «        z   |_        |                     d¦  «        �|d         |_        |S )zgApply legacy completion params (``max_tokens``, ``frequency_penalty``, ``stop``) on top of base config.r9   Ú
max_tokensNÚ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œG×<Ò<¸TÐCZÐciÐ<ÑjÔjÐà�8Š8�LÑ!Ô!Ð-Ý/2°4¸Ô3EÑ/FÔ/FÐÔ,Ø�8Š8Ð'Ñ(Ô(Ð4Ø36½¸tÐDWÔ?XÑ9YÔ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ð )ð:Lð �d‘
ð:Lð 
ð:Lð :Lð :Lð :LðN "ð-að -aàð-að !ð-að >ð	-að
 ð-að ð-að 'ð-að )ð-að �d‘
ð-að 
ð-að -að -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Ð 4Ð 4Ð 4Ð 4Ð 4ð ÐÑÔð QØ%Ð%Ð%Ð%Ð%Ð%ØAÐAÐAÐAÐAÐAÐAÐAØJÐJÐJÐJÐJÐJÐJÐJÐJÐJØPÐPÐPÐPÐPÐPð BÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ Að ð hØgÐgÐgÐgÐgÐgÐgÐgÐgÐgÐgÐgðð ð ð ð Ð-GÈuð ñ ô ð ð#ð #ð #Ð ð 
ˆÔ	˜HÑ	%Ô	%€ðQ!ð Q!ð Q!ð Q!ð Q!˜ñ Q!ô Q!ð Q!ð Q!ð Q!r$   