o
    |qi0                     @  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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!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/m0Z0m1Z1m2Z2 e3e4Z5G dd deZ6dS )zWriter chat wrapper.    )annotationsN)AnyAsyncIteratorCallableDictIteratorListLiteralOptionalSequenceTupleTypeUnioncast)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)LanguageModelInput)BaseChatModel)	AIMessageAIMessageChunkBaseMessageBaseMessageChunk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=   m/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/langchain_community/chat_models/writer.py	_llm_type[   s   zChatWriter._llm_typec                 C  s   | j | jd| jS )zGet the identifying parameters.)r2   r4   )r2   r4   r7   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/   r4   r:   r;   )r2   r4   r:   r;   r7   r>   r=   r=   r@   _default_paramsi   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writerairG   rH   ImportErrorgetupdater    type
ValueError)clsrF   rG   rH   er=   r=   r@   validate_environmentt   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_usager2   system_fingerprint)generations
llm_output)choices_convert_writer_to_langchainrS   r   dictrR   appendusage__dict__r2   rU   r   )r?   rQ   rV   choicerS   genrT   rW   r=   r=   r@   _create_chat_result   s    

zChatWriter._create_chat_resultrS   r   rZ   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contentrc   user	assistantc                 S  s*   g | ]}|d  d|d |d ddqS )idfunctionnameargs)ri   	arguments)rg   rL   rh   r=   .0toolr=   r=   r@   
<listcomp>   s    z;ChatWriter._convert_langchain_to_writer.<locals>.<listcomp>
tool_callssystemrn   tool_call_idzGot unknown message type: ri   )rd   
isinstancer   rc   r   r   rp   r   r   rr   rM   rL   ri   )rS   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-   rc   ra   rd   re   )rd   rf   rp   )rd   additional_kwargsrq   rn   rr   ri   )rd   rr   ri   )rd   rc   )rs   rZ   jsonloadsdumpsrJ   r   r   r   r   r   )ru   rc   rd   ry   rp   r=   r=   r@   rY      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/   r4   r:   r   Nr;   c                   s   g | ]}  |qS r=   )rt   )rm   mr>   r=   r@   ro     s    z:ChatWriter._convert_messages_to_writer.<locals>.<listcomp>)r2   r4   r:   r7   r;   )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tt	|
d}|rH|
|j |V  q!d S 	NstreamTr}   r   rf   rb   )rS   r=   )r   r+   chatrX   deltard   rY   r   r   r   on_llm_new_tokentextr?   r}   r   r   r   r   r   rQ   chunkr   Zmessage_chunkr=   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 z13 d H W }|jd j}	|	r5|	js6q$| d|	jd}
ttt	|
d}|rR|
|jI d H  |V  q$6 d S r   )r   r,   r   rX   r   rd   rY   r   r   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   rQ   r=   r=   r@   	_generateC  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@   
_agenerateO  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!   rl   r=   r=   r@   ro   l  s    z)ChatWriter.bind_tools.<locals>.<listcomp>)autononerh   ri   )rL   rh   r   r   Nr=   )superbind)r?   r   r   r   Zformatted_tools	__class__r=   r@   
bind_tools[  s   zChatWriter.bind_tools)r<   r1   )r<   r6   )rF   r   r<   r   )rQ   r   r<   r   )rS   r   r<   rZ   )ru   r   r<   r   rv   )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.   r2   r4   rZ   r7   r:   r;   r$   Zmodel_configpropertyrA   rB   rC   r'   classmethodrP   r`   staticmethodrt   rY   r   r   r   r   r   r   __classcell__r=   r=   r   r@   r(   2   s^   
 


+   r(   )7r   
__future__r   rz   loggingtypingr   r   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   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     <(

