o
    پi                     @  s   d dl mZ d dlZd dlZd dlZd dlmZmZmZm	Z	m
Z
mZ d dlZd dlm  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 er_d d	lmZ d d
lm Z  e!e"Z#G dd deZ$dS )    )annotationsN)TYPE_CHECKINGAnyDictListOptionalUnion)Request)ORJSONResponse)ClassifyRequestClassifyResponseErrorResponse)OpenAIServingBase)EmbeddingReqInput)TemplateManager)TokenizerManagerc                      sb   e Zd ZdZd$ fddZd%d
dZ	d&d'ddZd(ddZd)ddZd*ddZ	d+d"d#Z
  ZS ),OpenAIServingClassifyz Handler for v1/classify requeststokenizer_managerr   template_managerr   c                   sJ   t  | || _|  | _| jjr| jjn| jjj| _	| js#t
dd S )Nzid2label mapping is missing)super__init__r   _get_id2label_mappingid2labelr   served_model_nameserver_args
model_path
model_name
ValueError)selfr   r   	__class__ b/home/ubuntu/.local/lib/python3.10/site-packages/sglang/srt/entrypoints/openai/serving_classify.pyr      s   

zOpenAIServingClassify.__init__returnstrc                 C  s   dS )Nz	classify-r!   )r   r!   r!   r"   _request_id_prefix/   s   z(OpenAIServingClassify._request_id_prefixNrequestr   raw_requestr	   )tuple[EmbeddingReqInput, ClassifyRequest]c                 C  s~   |j }t|trd|i}n t|tr)t|dkr$t|d tr$d|i}n	d|i}nd|i}tdi ||j|jd}||fS )z3Convert OpenAI embedding request to internal formattextr   	input_ids)ridpriorityNr!   )input
isinstancer$   listlenr   r+   r,   )r   r&   r'   promptprompt_kwargsadapted_requestr!   r!   r"   _convert_to_internal_request2   s   





z2OpenAIServingClassify._convert_to_internal_requestOptional[str]c                 C  s   |j  }sdS t|tr| sdS dS t|tre|d }t|trBt|D ]\}}t|ts3d  S | s?d| d  S q&dS t|tret|D ]\}}t|tsXd  S |dk rdd	| d
  S qKdS )z8Validate that the input is not empty or whitespace only.zInput cannot be emptyz(Input cannot be empty or whitespace onlyNr   z'All items in input list must be stringszInput at index z# cannot be empty or whitespace onlyz(All items in input list must be integerszToken ID at index z must be non-negative)r-   r.   r$   stripr/   	enumerateint)r   r&   r-   
first_itemiitemr!   r!   r"   _validate_requestO   s0   




	

z'OpenAIServingClassify._validate_requestOptional[Dict[int, str]]c              
   C  s   z'| j jj}|jr|jW S t|dr"|jr%|j}dd t|D W S W dS W dS  tyB } zt	d|  W Y d}~dS d}~ww )z'Get id2label mapping from model config.
num_labelsc                 S  s   i | ]}|d | qS )LABEL_r!   ).0r:   r!   r!   r"   
<dictcomp>z   s    z?OpenAIServingClassify._get_id2label_mapping.<locals>.<dictcomp>z Failed to get id2label mapping: N)
r   model_config	hf_configr   hasattrr>   range	Exceptionloggerwarning)r   rC   r>   er!   r!   r"   r   o   s    
z+OpenAIServingClassify._get_id2label_mappingr3   r   6Union[ClassifyResponse, ErrorResponse, ORJSONResponse]c              
     sp   z| j || I dH }W n ty( } z| t|W  Y d}~S d}~ww t|ts1|g}| |}|S )z,Handle non-streaming classification request.N)	r   generate_request	__anext__r   create_error_responser$   r.   r/   _build_classify_response)r   r3   r&   r'   retrI   responser!   r!   r"   _handle_non_streaming_request   s   	

z3OpenAIServingClassify._handle_non_streaming_requestrO   List[Dict[str, Any]]r   c                 C  sR  |    t j }tt }g }d}d}t|D ]w\}}|dg }	|di }
||
dd7 }||
dd7 }|	rztj	|	tj
d}tj|dd }t| }| j| }W n' ty~ } ztd	| d
|  dg}d}W Y d }~n
d }~ww dg}d}|||t|d}|| q|d|| j|||dd dd}tdi |S )Nr   g        	embedding	meta_infoprompt_tokense2e_latency)dtype)dimz$Error processing embedding for item z: g      ?Default)indexlabelprobsnum_classesr/   )rU   total_tokenscompletion_tokensprompt_tokens_details)idobjectcreatedmodeldatausager!   )r%   uuiduuid4hexr8   timer7   gettorchtensorfloat32Fsoftmaxtolistargmaxr;   r   rF   rG   errorr0   appendr   r   )r   rO   
request_idcreated_timeclassify_objectsrU   total_latencyr:   r;   rS   rT   embedding_tensorr\   predicted_classr[   rI   classify_objrP   r!   r!   r"   rN      sT   z.OpenAIServingClassify._build_classify_response)r   r   r   r   )r#   r$   )N)r&   r   r'   r	   r#   r(   )r&   r   r#   r5   )r#   r=   )r3   r   r&   r   r'   r	   r#   rJ   )rO   rR   r#   r   )__name__
__module____qualname____doc__r   r%   r4   r<   r   rQ   rN   __classcell__r!   r!   r   r"   r      s    


 
r   )%
__future__r   loggingrj   rg   typingr   r   r   r   r   r   rl   torch.nn.functionalnn
functionalro   fastapir	   fastapi.responsesr
   &sglang.srt.entrypoints.openai.protocolr   r   r   *sglang.srt.entrypoints.openai.serving_baser   sglang.srt.managers.io_structr   $sglang.srt.managers.template_managerr   %sglang.srt.managers.tokenizer_managerr   	getLoggerr|   rG   r   r!   r!   r!   r"   <module>   s"     
