o
    پi                     @  s   d dl mZ d dlmZmZmZmZmZmZ d dl	m
Z
 d dlmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ erRd d	lmZ d d
lmZ G dd deZdS )    )annotations)TYPE_CHECKINGAnyDictListOptionalUnion)Request)ORJSONResponse)EmbeddingObjectEmbeddingRequestEmbeddingResponseErrorResponseMultimodalEmbeddingInput	UsageInfo)OpenAIServingBase)EmbeddingReqInput)generate_embedding_convs)TemplateManager)TokenizerManagerc                      sX   e Zd ZdZd! fddZd"d
dZd#ddZ	d$d%ddZd&ddZd'dd Z	  Z
S )(OpenAIServingEmbeddingz"Handler for v1/embeddings requeststokenizer_managerr   template_managerr   c                   s   t  | || _d S N)super__init__r   )selfr   r   	__class__ c/home/ubuntu/.local/lib/python3.10/site-packages/sglang/srt/entrypoints/openai/serving_embedding.pyr      s   
zOpenAIServingEmbedding.__init__returnstrc                 C  s   dS )Nzembd-r   )r   r   r   r    _request_id_prefix$   s   z)OpenAIServingEmbedding._request_id_prefixrequestr   Optional[str]c                 C  s   |j  }sdS t|tr| sdS dS t|trmt|dkr!dS |d }t|trJt|D ]\}}t|ts;d  S | sGd| d  S q.dS t|trmt|D ]\}}t|ts`d  S |dk rld	| d
  S qSd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)input
isinstancer"   striplistlen	enumerateint)r   r$   r&   
first_itemiitemr   r   r    _validate_request'   s4   




	

z(OpenAIServingEmbedding._validate_requestNraw_requestr	   *tuple[EmbeddingReqInput, EmbeddingRequest]c              	   C  s  |j }t|trd|i}nt|trt|dkr$t|d tr$d|i}nt|dkrt|d trg }g }g }|D ])}||jdurE|jnd ||jdurR|jnd ||j	dur_|j	nd q9g }	| j
jdurt|||| j
j}
|
D ]	}|	|  qvn|}	t|	dkr|	d |d |d d}n|	||d}n	d|i}nd|i}| |j|j}td	i ||j|j| ||j|d}||fS )
z3Convert OpenAI embedding request to internal formattextr   Npadding   )r3   
image_data
video_data	input_ids)ridpriorityrouting_key
dimensions	lora_pathr   )r&   r'   r"   r)   r*   r   appendr3   imagevideor   chat_template_namer   
get_prompt_resolve_lora_pathmodelr=   r   r9   r:   extract_routing_keyr<   )r   r$   r1   promptprompt_kwargstextsimagesvideosr/   generate_promptsconvsconvr=   adapted_requestr   r   r    _convert_to_internal_requestJ   sZ   





	z3OpenAIServingEmbedding._convert_to_internal_requestrN   r   7Union[EmbeddingResponse, 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 the embedding requestN)	r   generate_request	__anext__
ValueErrorcreate_error_responser"   r'   r)   _build_embedding_response)r   rN   r$   r1   reteresponser   r   r    _handle_non_streaming_request   s   

z4OpenAIServingEmbedding._handle_non_streaming_requestrV   List[Dict[str, Any]]r   c                 C  sf   g }d}t |D ]\}}|t|d |d |di }||dd7 }qt|| jjt||ddS )zBuild the embedding responser   	embedding)r[   index	meta_infoprompt_tokens)r^   total_tokens)datarD   usage)r+   r>   r   getr   r   
model_pathr   )r   rV   embedding_objectsr^   idxret_itemr]   r   r   r    rU      s&   z0OpenAIServingEmbedding._build_embedding_response)r   r   r   r   )r!   r"   )r$   r   r!   r%   r   )r$   r   r1   r	   r!   r2   )rN   r   r$   r   r1   r	   r!   rP   )rV   rZ   r!   r   )__name__
__module____qualname____doc__r   r#   r0   rO   rY   rU   __classcell__r   r   r   r    r      s    

&
Er   N)
__future__r   typingr   r   r   r   r   r   fastapir	   fastapi.responsesr
   &sglang.srt.entrypoints.openai.protocolr   r   r   r   r   r   *sglang.srt.entrypoints.openai.serving_baser   sglang.srt.managers.io_structr   sglang.srt.parser.conversationr   $sglang.srt.managers.template_managerr   %sglang.srt.managers.tokenizer_managerr   r   r   r   r   r    <module>   s      