o
    Zh|!                     @   s(  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	m
Z
 d dlZd dlmZ d dlmZmZ d dlmZmZmZmZmZmZmZ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# e$e%Z&d	ee'ef d
efddZ(ded
e)fddZ*d	ee'ef de
e d
efddZ+G dd deZ,dS )    N)AnyDictIteratorListMappingOptionalType)CallbackManagerForLLMRun)BaseChatModelgenerate_from_stream)		AIMessageAIMessageChunkBaseMessageBaseMessageChunkChatMessageChatMessageChunkHumanMessageHumanMessageChunkSystemMessage)ChatGenerationChatGenerationChunk
ChatResult)get_pydantic_field_names)
ConfigDictmodel_validator_dictreturnc                 C   sL   | d }|dkrt | d dS |dkrt| ddpddS t| d |dS )Nroleusercontentr   	assistant r   r   )r   r   getr   )r   r    r%   a/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/chat_models/llama_edge.py_convert_dict_to_message   s   r'   messagec                 C   sx   t | tr| j| jd}|S t | trd| jd}|S t | tr(d| jd}|S t | tr5d| jd}|S td|  )N)r   r   systemr   r!   zGot unknown type )
isinstancer   r   r   r   r   r   	TypeError)r(   Zmessage_dictr%   r%   r&   _convert_message_to_dict(   s   




r,   default_classc                 C   sn   |  d}|  dpd}|dks|tkrt|dS |dks!|tkr&t|dS |s,|tkr2t||dS ||dS )Nr   r   r"   r   r    r!   r#   )r$   r   r   r   )r   r-   r   r   r%   r%   r&   _convert_delta_to_message_chunk8   s   



r.   c                   @   s4  e Zd ZU dZdZeed< 	 dZee	 ed< 	 dZ
e	ed< 	 dZeed	< 	 ed
dZeddedee	ef defddZ		d!dee deee	  dee dedef
ddZ		d!dee deee	  dee dedee f
ddZdee dedejfddZdee	ef defddZ e!de	fdd Z"dS )"LlamaEdgeChatServicezChat with LLMs via `llama-api-server`

    For the information about `llama-api-server`, visit https://github.com/second-state/LlamaEdge
    <   request_timeoutNservice_urlZNAmodelF	streamingT)Zpopulate_by_namebefore)modevaluesr   c              
   C   s   t | }|di }t|D ](}||v rtd| d||vr6td| d| d| d ||||< q|| }|rHtd| d	||d< |S )
z>Build extra kwargs from additional params that were passed in.Zmodel_kwargszFound z supplied twice.z	WARNING! z/ is not default parameter.
                    zJ was transferred to model_kwargs.
                    Please confirm that z is what you intended.zParameters za should be specified explicitly. Instead they were passed in as part of `model_kwargs` parameter.)	r   r$   list
ValueErrorloggerwarningpopintersectionkeys)clsr7   Zall_required_field_namesextra
field_nameZinvalid_model_kwargsr%   r%   r&   build_extra[   s,   
z LlamaEdgeChatService.build_extramessagesstoprun_managerkwargsc                 K   sl   | j r| jd|||d|}t|S | j|fi |}|jdkr-td|j d|j | }| |S )N)rC   rD   rE      zError code: z
, reason: r%   )	r4   _streamr   _chatstatus_coder9   reasonjson_create_chat_result)selfrC   rD   rE   rF   Zstream_iterresresponser%   r%   r&   	_generatev   s   

zLlamaEdgeChatService._generatec              	   k   sj   | j |fi |}t}d}| D ]}g }	|rX|d}
dd t||
D }dt| g| }tt|d D ]}t	|
|| t| ||d  t|  }|	
| q9|	D ]W}t|tse| }t|d dkrnqZ|d d }t|d	 |}|d
d ur|d
dkr n'|d
}|d urt|dnd }|j}t||d}|r|j|j|d |V  qZqd S )Nz!"object":"chat.completion.chunk"}zutf-8c                 S   s   g | ]}|  qS r%   )start.0mr%   r%   r&   
<listcomp>       z0LlamaEdgeChatService._stream.<locals>.<listcomp>   choicesr   deltafinish_reasonrD   )r\   )r(   generation_info)chunk)rI   r   
iter_linesdecoderefinditerlenrangerL   loadsappendr*   dictr.   r$   	__class__r   Zon_llm_new_tokentext)rN   rC   rD   rE   rF   rO   Zdefault_chunk_classZ	substringlinechunksZjson_stringZ	positionsir^   choicer\   r]   Zcg_chunkr%   r%   r&   rH      sZ   



zLlamaEdgeChatService._streamc                 K   s   | j d u rtj }d|_d|_|S | j  d}| jr)| jdd |D | jd}n| jdd |D d}tj|| j	d	d	d
t
|d}|S )Ni  z8The IP address or port of the chat service is incorrect.z/v1/chat/completionsc                 S      g | ]}t |qS r%   r,   rS   r%   r%   r&   rV      rW   z.LlamaEdgeChatService._chat.<locals>.<listcomp>)r3   rC   streamc                 S   rn   r%   ro   rS   r%   r%   r&   rV      rW   )r3   rC   zapplication/json)acceptzContent-Type)urltimeoutheadersdata)r2   requestsmodelsResponserJ   rK   r4   r3   postr1   rL   dumps)rN   rC   rF   rO   r2   payloadr%   r%   r&   rI      s.   


zLlamaEdgeChatService._chatrP   c                 C   sB   t |d d d}t|dg}|d }|| jd}t||dS )NrZ   r   r(   )r(   usage)token_usager3   )generations
llm_output)r'   r$   r   r3   r   )rN   rP   r(   r~   r}   r   r%   r%   r&   rM      s
   z(LlamaEdgeChatService._create_chat_resultc                 C   s   dS )Nz	wasm-chatr%   )rN   r%   r%   r&   	_llm_type   s   zLlamaEdgeChatService._llm_type)NN)#__name__
__module____qualname____doc__r1   int__annotations__r2   r   strr3   r4   boolr   Zmodel_configr   classmethodr   r   rB   r   r   r	   r   rQ   r   r   rH   rv   rx   rI   r   rM   propertyr   r%   r%   r%   r&   r/   H   s\   
 



:!r/   )-rL   loggingra   typingr   r   r   r   r   r   r   rv   Zlangchain_core.callbacksr	   Z*langchain_core.language_models.chat_modelsr
   r   Zlangchain_core.messagesr   r   r   r   r   r   r   r   r   Zlangchain_core.outputsr   r   r   Zlangchain_core.utilsr   Zpydanticr   r   	getLoggerr   r:   r   r'   rg   r,   r.   r/   r%   r%   r%   r&   <module>   s,    $,



