
    ^j'                        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     n/var/www/ramen.bs-engineer-server.com/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'&#&C8RSS%)%8%8%>"%%%88)8T&&>>uhO3H:VF8LM++777PI{I>	6&$dKYYu||,F2249P9PY_2`
z2(#HHX&	??:ui6S]_jlrss,,E9h
KY_   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_idsr2   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!FE"!LL)9)9);< #( %334?vHDYDY]g]v]vDv,3%//
H6/RR'"+&.&;&;!*X-B-B!B
 ++JP]ej+kkC -
 #--  ,.I % 	a<#'D!%dL9%,,/A$((7-ST"$'')"44"!(()>)>z8Z^)>)_`	a ! ggi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	6S]jt8ux;'	&0D&AC	NyWYGZ	(	~c4i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9fjZ 0R 0
 *
&i &=D.++47j<MQ[QjQj<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<TCZci<j88L!-/243E/F,88'(436tDW?X9Y3Y088F'-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4N' '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 $(*.(( ( 	(
 Tz( (( 
(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-Gu #  
		H	%Q! Q!r$   