o
    ZhE0                     @  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                      sz  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dRddZedSdd ZedSd!d"Zed#d$edTd'd(ZdUd+d,ZedVd0d1ZedWd3d4Z	dXdYd:d;Z		dZd[d@dAZ		dZd\dDdEZ		dZd]dFdGZ		dZd^dHdIZ ddJd_ fdPdQZ!  Z"S )`
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_factory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;   ]/var/www/html/lang_env/lib/python3.10/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   r5   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   r8   r9   )r0   r2   r8   r9   r5   r<   r;   r;   r>   _default_paramsg   s   zChatWriter._default_paramsbefore)modevaluesr   c              
   C  s   z
ddl m}m} W n ty } ztd|d}~ww |ds/|d|t|dddi |d	sB|d	|t|dddi t|d|u rTt|d	|u sXt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writerairE   rF   ImportErrorgetupdater   type
ValueError)clsrD   rE   rF   er;   r;   r>   validate_environmentr   sD   


zChatWriter.validate_environmentresponser   c                 C  sh   g }|j D ]}| |j}t|t|jdd}|| qi }|jr&|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_langchainrQ   r   dictrP   appendusage__dict__r0   rS   r   )r=   rO   rT   choicerQ   genrR   rU   r;   r;   r>   _create_chat_result   s    

zChatWriter._create_chat_resultrQ   r   rX   c                 C  s   d| j d}t| tr| j|d< nCt| trd|d< n9t| tr2d|d< | jr1dd | jD |d< n"t| tr<d	|d< nt| trKd
|d< | j	|d< n	t
dt|  | jr\| j|d< |S )z5Convert a LangChain message to a Writer message dict. rolecontentra   user	assistantc                 S  s*   g | ]}|d  d|d |d ddqS )idfunctionnameargs)rg   	arguments)re   rJ   rf   r;   .0toolr;   r;   r>   
<listcomp>   s    z;ChatWriter._convert_langchain_to_writer.<locals>.<listcomp>
tool_callssystemrl   tool_call_idzGot unknown message type: rg   )rb   
isinstancer   ra   r   r   rn   r   r   rp   rK   rJ   rg   )rQ   Zmessage_dictr;   r;   r>   _convert_langchain_to_writer   s*   








z'ChatWriter._convert_langchain_to_writerresponse_messagec                 C  s   t | tsttj| dd d} | dd}| d}|s d}|dkr)t|dS |d	krAi }| d
g  }r;||d
< t||dS |dkrJt|dS |dkr]t	|| dd| dddS t
||dS )z0Convert a Writer message to a LangChain message.c                 S  s   | j S N)r[   )or;   r;   r>   <lambda>   s    z9ChatWriter._convert_writer_to_langchain.<locals>.<lambda>r+   ra   r_   rb   rc   )rb   rd   rn   )rb   additional_kwargsro   rl   rp   rg   )rb   rp   rg   )rb   ra   )rq   rX   jsonloadsdumpsrH   r   r   r   r   r   )rs   ra   rb   rw   rn   r;   r;   r>   rW      s0   





z'ChatWriter._convert_writer_to_langchainmessagesList[BaseMessage]stopOptional[List[str]]+Tuple[List[Dict[str, Any]], Dict[str, Any]]c                   sR    j  j jd j}|r||d<  jdur j|d<  fdd|D }||fS )z=Convert a list of LangChain messages to List of Writer dicts.)r-   r2   r8   r}   Nr9   c                   s   g | ]}  |qS r;   )rr   )rk   mr<   r;   r>   rm     s    z:ChatWriter._convert_messages_to_writer.<locals>.<listcomp>)r0   r2   r8   r5   r9   )r=   r{   r}   paramsmessage_dictsr;   r<   r>   _convert_messages_to_writer   s   

z&ChatWriter._convert_messages_to_writerrun_manager"Optional[CallbackManagerForLLMRun]kwargsIterator[ChatGenerationChunk]c           
      k  s    |  ||\}}i ||ddi}| jjjdd|i|}|D ]'}|jd j}	|	r.|	js/q!| d|	jd}t|d}|rE||j	 |V  q!d S 	NstreamTr{   r   rd   r`   )rQ   r;   )
r   r)   chatrV   deltarb   rW   r   on_llm_new_tokentext
r=   r{   r}   r   r   r   r   rO   chunkr   r;   r;   r>   _stream  s$   

zChatWriter._stream'Optional[AsyncCallbackManagerForLLMRun]"AsyncIterator[ChatGenerationChunk]c           
      K s   |  ||\}}i ||ddi}| jjjdd|i|I d H }|2 z.3 d H W }|jd j}	|	r5|	js6q$| d|	jd}t|d}|rO||j	I d H  |V  q$6 d S r   )
r   r*   r   rV   r   rb   rW   r   r   r   r   r;   r;   r>   _astream$  s$   

zChatWriter._astreamc                 K  s>   |  ||\}}i ||}| jjjdd|i|}| |S Nr{   r;   )r   r)   r   r^   r=   r{   r}   r   r   r   r   rO   r;   r;   r>   	_generateA  s   
zChatWriter._generatec                   sF   |  ||\}}i ||}| jjjdd|i|I d H }| |S r   )r   r*   r   r^   r   r;   r;   r>   
_agenerateM  s
   
zChatWriter._agenerate)tool_choicetools:Sequence[Union[Dict[str, Any], Type[BaseModel], Callable]]r   -Optional[Union[str, Literal['auto', 'none']]])Runnable[LanguageModelInput, BaseMessage]c                  sF   dd |D }|r|dv r|ndd|id|d< t  jd
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   rj   r;   r;   r>   rm   j  s    z)ChatWriter.bind_tools.<locals>.<listcomp>)autononerf   rg   )rJ   rf   r   r   Nr;   )superbind)r=   r   r   r   Zformatted_tools	__class__r;   r>   
bind_toolsY  s   zChatWriter.bind_tools)r:   r/   )r:   r4   )rD   r   r:   r   )rO   r   r:   r   )rQ   r   r:   rX   )rs   r   r:   r   rt   )r{   r|   r}   r~   r:   r   )NN)
r{   r|   r}   r~   r   r   r   r   r:   r   )
r{   r|   r}   r~   r   r   r   r   r:   r   )
r{   r|   r}   r~   r   r   r   r   r:   r   )
r{   r|   r}   r~   r   r   r   r   r:   r   )r   r   r   r   r   r   r:   r   )#__name__
__module____qualname____doc__r#   r)   __annotations__r*   r,   r0   r2   rX   r5   r8   r9   r"   Zmodel_configpropertyr?   r@   rA   r%   classmethodrN   r^   staticmethodrr   rW   r   r   r   r   r   r   __classcell__r;   r;   r   r>   r&   0   s^   
 


+   r&   )5r   
__future__r   rx   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$	
