a
    bg/                     @  s  d Z ddlm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mZmZmZmZmZ ddl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m Z  dd	l!m"Z"m#Z#m$Z$ dd
l%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/m0Z0 e1e2Z3G dd deZ4dS )zWriter chat wrapper.    )annotationsN)AnyAsyncIteratorCallableDictIteratorListLiteralOptionalSequenceTupleTypeUnion)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)LanguageModelInput)BaseChatModel)	AIMessageAIMessageChunkBaseMessageChatMessageHumanMessageSystemMessageToolMessage)ChatGenerationChatGenerationChunk
ChatResult)Runnable)get_from_dict_or_envconvert_to_openai_tool)	BaseModel
ConfigDictField	SecretStrmodel_validatorc                      s  e Zd ZU dZedddZded< edddZded< eddZd	ed
< edddZ	ded< dZ
ded< eedZded< dZded< dZded< eddZeddddZedddd Zeddd!d"Zed#d$ed%dd&d'd(Zdd)d*d+d,Zed-d.d/d0d1Zedd-d2d3d4ZdOd5d6d7d8d9d:ZdPd5d6d;dd<d=d>d?ZdQd5d6d@ddAd=dBdCZdRd5d6d;dd)d=dDdEZdSd5d6d@dd)d=dFdGZ ddHdIdJddKdL fdMdNZ!  Z"S )T
ChatWritera  Writer chat model.

    To use, you should have the ``writer-sdk`` Python package installed, and the
    environment variable ``WRITER_API_KEY`` set with your API key or pass 'api_key'
    init param.

    Example:
        .. code-block:: python

            from langchain_community.chat_models import ChatWriter

            chat = ChatWriter(
                api_key="your key"
                model="palmyra-x-004"
            )
    NT)defaultexcluder   clientasync_clientr'   zOptional[SecretStr]api_keyzpalmyra-x-004model)r'   aliasstr
model_namegffffff?floattemperature)default_factoryzDict[str, Any]model_kwargs   intnzOptional[int]
max_tokens)Zpopulate_by_name)returnc                 C  s   dS )zReturn type of chat model.zwriter-chat selfr:   r:   t/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/chat_models/writer.py	_llm_typeY   s    zChatWriter._llm_typec                 C  s   | j | jd| jS )zGet the identifying parameters.)r0   r2   )r0   r2   r4   r;   r:   r:   r=   _identifying_params^   s
    zChatWriter._identifying_paramsc                 C  s   | j | j| j| jd| jS )z2Get the default parameters for calling Writer API.)r-   r2   r7   r8   )r0   r2   r7   r8   r4   r;   r:   r:   r=   _default_paramsg   s    zChatWriter._default_paramsbefore)moder   )valuesr9   c              
   C  s   zddl m}m} W n. tyB } ztd|W Y d}~n
d}~0 0 |dsj|d|t|dddi |d	s|d	|t|dddi t|d|u rt|d	|u std
|S )z<Validates that api key is passed and creates Writer clients.r   )AsyncClientClientzXCould not import writerai python package. Please install it with `pip install writerai`.Nr)   r,   ZWRITER_API_KEY)r,   r*   zx'client' attribute must be with type 'Client' and 'async_client' must be with type 'AsyncClient' from 'writerai' package)	ZwriterairD   rE   ImportErrorgetupdater   type
ValueError)clsrC   rD   rE   er:   r:   r=   validate_environmentr   sD    


zChatWriter.validate_environmentr   )responser9   c                 C  sh   g }|j D ].}| |j}t|t|jdd}|| q
i }|jrL|jj}|| j	|j
d}t||dS )N)finish_reason)messageZgeneration_info)token_usager0   system_fingerprint)generations
llm_output)choices_convert_writer_to_langchainrP   r   dictrO   appendusage__dict__r0   rR   r   )r<   rN   rS   choicerP   genrQ   rT   r:   r:   r=   _create_chat_result   s     

zChatWriter._create_chat_resultr   rW   )rP   r9   c                 C  s   d| j d}t| tr"| j|d< nt| tr6d|d< nrt| trdd|d< | jrdd | jD |d< nDt| trxd	|d< n0t| trd
|d< | j	|d< nt
dt|  | jr| j|d< |S )z5Convert a LangChain message to a Writer message dict. rolecontentr`   user	assistantc                 S  s*   g | ]"}|d  d|d |d ddqS )idfunctionnameargs)rf   	arguments)rd   rI   re   r:   .0toolr:   r:   r=   
<listcomp>   s
   z;ChatWriter._convert_langchain_to_writer.<locals>.<listcomp>
tool_callssystemrk   tool_call_idzGot unknown message type: rf   )ra   
isinstancer   r`   r   r   rm   r   r   ro   rJ   rI   rf   )rP   Zmessage_dictr:   r:   r=   _convert_langchain_to_writer   s(    







z'ChatWriter._convert_langchain_to_writer)response_messager9   c                 C  s   t | ts"ttj| dd d} | dd}| d}|s@d}|dkrRt|dS |d	kri }| d
g  }rv||d
< t||dS |dkrt|dS |dkrt	|| dd| dddS t
||dS dS )z0Convert a Writer message to a LangChain message.c                 S  s   | j S )N)rZ   )or:   r:   r=   <lambda>       z9ChatWriter._convert_writer_to_langchain.<locals>.<lambda>r+   r`   r^   ra   rb   )ra   rc   rm   )ra   additional_kwargsrn   rk   ro   rf   )ra   ro   rf   )ra   r`   N)rp   rW   jsonloadsdumpsrG   r   r   r   r   r   )rr   r`   ra   rv   rm   r:   r:   r=   rV      s0    





z'ChatWriter._convert_writer_to_langchainzList[BaseMessage]zOptional[List[str]]z+Tuple[List[Dict[str, Any]], Dict[str, Any]])messagesstopr9   c                   sR    j  j jd j}|r$||d<  jdur8 j|d<  fdd|D }||fS )z=Convert a list of LangChain messages to List of Writer dicts.)r-   r2   r7   r{   Nr8   c                   s   g | ]}  |qS r:   )rq   )rj   mr;   r:   r=   rl     ru   z:ChatWriter._convert_messages_to_writer.<locals>.<listcomp>)r0   r2   r7   r4   r8   )r<   rz   r{   paramsmessage_dictsr:   r;   r=   _convert_messages_to_writer   s    

z&ChatWriter._convert_messages_to_writerz"Optional[CallbackManagerForLLMRun]zIterator[ChatGenerationChunk])rz   r{   run_managerkwargsr9   c           
      k  s   |  ||\}}i ||ddi}| jjjf d|i|}|D ]N}|jd j}	|	r@|	js\q@| d|	jd}t|d}|r||j	 |V  q@d S NstreamTrz   r   rc   r_   )rP   )
r   r)   chatrU   deltara   rV   r   on_llm_new_tokentext
r<   rz   r{   r   r   r~   r}   rN   chunkr   r:   r:   r=   _stream  s    


zChatWriter._streamz'Optional[AsyncCallbackManagerForLLMRun]z"AsyncIterator[ChatGenerationChunk]c           
      K s   |  ||\}}i ||ddi}| jjjf d|i|I d H }|2 z\3 d H W }|jd j}	|	rF|	jsjqF| d|	jd}t|d}|r||j	I d H  |V  qF6 d S r   )
r   r*   r   rU   r   ra   rV   r   r   r   r   r:   r:   r=   _astream!  s    


zChatWriter._astreamc                 K  s>   |  ||\}}i ||}| jjjf d|i|}| |S Nrz   )r   r)   r   r]   r<   rz   r{   r   r   r~   r}   rN   r:   r:   r=   	_generate;  s    zChatWriter._generatec                   sD   |  ||\}}i ||}| jjjf d|i|I d H }| |S r   )r   r*   r   r]   r   r:   r:   r=   
_agenerateG  s    zChatWriter._agenerate)tool_choicez:Sequence[Union[Dict[str, Any], Type[BaseModel], Callable]]z-Optional[Union[str, Literal['auto', 'none']]]z)Runnable[LanguageModelInput, BaseMessage])toolsr   r   r9   c                  sF   dd |D }|r0|dv r|ndd|id|d< t  jf d|i|S )	aA  Bind tools to the chat model.

        Args:
            tools: Tools to bind to the model
            tool_choice: Which tool to require ('auto', 'none', or specific tool name)
            **kwargs: Additional parameters to pass to the chat model

        Returns:
            A runnable that will use the tools
        c                 S  s   g | ]}t |qS r:   r   ri   r:   r:   r=   rl   d  ru   z)ChatWriter.bind_tools.<locals>.<listcomp>)autononere   rf   )rI   re   r   r   )superbind)r<   r   r   r   Zformatted_tools	__class__r:   r=   
bind_toolsS  s    zChatWriter.bind_tools)N)NN)NN)NN)NN)#__name__
__module____qualname____doc__r#   r)   __annotations__r*   r,   r0   r2   rW   r4   r7   r8   r"   Zmodel_configpropertyr>   r?   r@   r%   classmethodrM   r]   staticmethodrq   rV   r   r   r   r   r   r   __classcell__r:   r:   r   r=   r&   0   sP   


+          r&   )5r   
__future__r   rw   loggingtypingr   r   r   r   r   r   r	   r
   r   r   r   r   Zlangchain_core.callbacksr   r   Zlangchain_core.language_modelsr   Z*langchain_core.language_models.chat_modelsr   Zlangchain_core.messagesr   r   r   r   r   r   r   Zlangchain_core.outputsr   r   r   Zlangchain_core.runnablesr   Zlangchain_core.utilsr   Z%langchain_core.utils.function_callingr    Zpydanticr!   r"   r#   r$   r%   	getLoggerr   loggerr&   r:   r:   r:   r=   <module>   s   8$	
