a
    bg|!                     @   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&ee'ef ed	d
dZ(ee)dddZ*ee'ef e
e ed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   sP   | d }|dkrt | d dS |dkr<t| ddp6ddS t| d |dS d S )Nroleusercontentr   	assistant r   r   )r   r   getr   )r   r    r%   x/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/chat_models/llama_edge.py_convert_dict_to_message   s    r'   )messager   c                 C   st   t | tr| j| jd}nVt | tr2d| jd}n>t | trJd| jd}n&t | trbd| jd}ntd|  |S )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,   )r   default_classr   c                 C   sr   |  d}|  dpd}|dks(|tkr2t|dS |dksB|tkrLt|dS |sX|tkrdt||dS ||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                   @   s  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ee	ef edddZdee eee	  ee eedddZd ee eee	  ee eee dddZee eejdddZee	ef edddZ e!e	d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 ]P}||v r8td| d||vrtd| d| d| d ||||< q|| }|rt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kwargsr   c                 K   sl   | j r&| jf |||d|}t|S | j|fi |}|jdkrZtd|j d|j | }| |S )N)rC   rD   rE      zError code: z
, reason: )	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   sr  | j |fi |}t}d}| D ]H}g }	|r|d}
dd t||
D }dt| g| }tt|d D ]<}t	|
|| t| ||d  t|  }|	
| qr|	D ]}t|ts| }t|d dkrq|d d }t|d	 |}|d
d ur|d
dkr q"|d
}|d ur8t|dnd }|j}t||d}|rd|j|j|d |V  qq"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      sX    


zLlamaEdgeChatService._stream)rC   rF   r   c                 K   s   | j d u r$tj }d|_d|_|S | j  d}| jrR| 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   s   g | ]}t |qS r%   r,   rS   r%   r%   r&   rV      rW   z.LlamaEdgeChatService._chat.<locals>.<listcomp>)r3   rC   streamc                 S   s   g | ]}t |qS r%   rn   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._chat)rP   r   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_result)r   c                 C   s   dS )Nz	wasm-chatr%   )rN   r%   r%   r&   	_llm_type   s    zLlamaEdgeChatService._llm_type)NN)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   ru   rw   rI   r   rM   propertyr   r%   r%   r%   r&   r/   H   sB   
  
  
:!r/   )-rL   loggingra   typingr   r   r   r   r   r   r   ru   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"   $,

