
    Ng/                    :   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j1        e2          Z3 G 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                  *    e Zd ZU dZ edd          Zded<    edd          Zded<    ed          Zd	ed
<   	  edd          Z	ded<   	 dZ
ded<   	  ee          Zded<   	 dZded<   	 dZded<   	  ed          ZedEd            ZedFd            ZedFd            Z ed !          edGd$                        ZdHd'ZedId+            ZedJd-            Z	 dKdLd3Z	 	 dMdNd8Z	 	 dMdOd;Z	 	 dMdPd<Z	 	 dMdQd=Z dd>dR fdDZ! xZ"S )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)populate_by_namereturnc                    dS )zReturn type of chat model.zwriter-chat selfs    b/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/writer.py	_llm_typezChatWriter._llm_typeY   s	     }    c                .    | j         | j        d| j        S )zGet the identifying parameters.)r2   r4   )r2   r4   r7   r@   s    rB   _identifying_paramszChatWriter._identifying_params^   s+     /+
 
 
 	
rD   c                F    | 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@   s    rB   _default_paramszChatWriter._default_paramsg   s5     _+/	
 

 
 	
rD   before)modevaluesr   c           
         	 ddl m}m} n"# t          $ r}t          d          |d}~ww xY w|                    d          s0|                    d |t          |dd                    i           |                    d	          s0|                    d	 |t          |dd                    i           t          |                    d                    |u r$t          |                    d	                    |u st          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.   WRITER_API_KEY)r.   r,   zx'client' attribute must be with type 'Client' and 'async_client' must be with type 'AsyncClient' from 'writerai' package)	writerairM   rN   ImportErrorgetupdater   type
ValueError)clsrK   rM   rN   es        rB   validate_environmentzChatWriter.validate_environmentr   su   	444444444 	 	 	A  	 zz(## 		MMff 4"I/?! !     zz.)) 		MM"KK 4"I/?! !% % %   H%%&&&00VZZ//00K??Y  
 s    
*%*responser   c                ,   g }|j         D ]U}|                     |j                  }t          |t	          |j                            }|                    |           Vi }|j        r|j        j        }|| j	        |j
        d}t          ||          S )N)finish_reason)messagegeneration_info)token_usager2   system_fingerprint)generations
llm_output)choices_convert_writer_to_langchainr\   r   dictr[   appendusage__dict__r2   r_   r   )rA   rY   r`   choicer\   genr^   ra   s           rB   _create_chat_resultzChatWriter._create_chat_result   s    & 	$ 	$F77GGG  $63G H H H  C s####> 	2".1K&/"*"=
 

 kjIIIIrD   r\   r   rd   c                   d| j         d}t          | t                    r| j        |d<   nt          | t                    rd|d<   nt          | t
                    r!d|d<   | j        rd | j        D             |d<   n_t          | t                    rd|d<   nDt          | t                    rd	|d<   | j	        |d
<   nt          dt          |                      | j        r
| j        |d<   |S )z5Convert a LangChain message to a Writer message dict. rolecontentrn   user	assistantc                D    g | ]}|d          d|d         |d         ddS )idfunctionnameargs)ru   	arguments)rs   rT   rt   r?   .0tools     rB   
<listcomp>z;ChatWriter._convert_langchain_to_writer.<locals>.<listcomp>   sN     . . . 	 #4j *-1&\V$U$U . . .rD   
tool_callssystemrz   tool_call_idzGot unknown message type: ru   )ro   
isinstancer   rn   r   r   r|   r   r   r~   rU   rT   ru   )r\   message_dicts     rB   _convert_langchain_to_writerz'ChatWriter._convert_langchain_to_writer   s.    !#w??g{++ 	K#*<L  .. 	K#)L  ++ 	K#.L ! . . !( 2. . .\* // 	K#+L  -- 	K#)L +2+?L((I$w--IIJJJ< 	0#*<L rD   response_messagec                B   t          | t                    s)t          j        t          j        | d                     } |                     dd          }|                     d          }|sd}|dk    rt          |          S |dk    r0i }|                     d	g           x}r||d	<   t          ||
          S |dk    rt          |          S |dk    r:t          ||                     dd          |                     dd                    S t          ||          S )z0Convert a Writer message to a LangChain message.c                    | j         S N)rg   )os    rB   <lambda>z9ChatWriter._convert_writer_to_langchain.<locals>.<lambda>   s    qz rD   r-   rn   rl   ro   rp   )ro   rq   r|   )ro   additional_kwargsr}   rz   r~   ru   )ro   r~   ru   )ro   rn   )r   rd   jsonloadsdumpsrR   r   r   r   r   r   )r   rn   ro   r   r|   s        rB   rc   z'ChatWriter._convert_writer_to_langchain   sX    *D11 	#z
+5I5IJJJ     ##FB//"&&y11 	G6>>0000[   "-11,CCCz =2<!,/!'EVWWWWX 1111V^^-11."EE%))&"55    wT::::rD   messagesList[BaseMessage]stopOptional[List[str]]+Tuple[List[Dict[str, Any]], Dict[str, Any]]c                      j          j         j        d j        }|r||d<    j        
 j        |d<    fd|D             }||fS )z=Convert a list of LangChain messages to List of Writer dicts.)r/   r4   r:   r   Nr;   c                :    g | ]}                     |          S r?   )r   )ry   mrA   s     rB   r{   z:ChatWriter._convert_messages_to_writer.<locals>.<listcomp>  s'    PPP!::1==PPPrD   )r2   r4   r:   r7   r;   )rA   r   r   paramsmessage_dictss   `    rB   _convert_messages_to_writerz&ChatWriter._convert_messages_to_writer   sy    
 _+
 
 	
  	"!F6N?&#'?F< PPPPxPPPf$$rD   run_manager"Optional[CallbackManagerForLLMRun]kwargsIterator[ChatGenerationChunk]c              +  ^  K   |                      ||          \  }}i ||ddi} | j        j        j        dd|i|}|D ]k}|j        d         j        }	|	r|	j        s|                     d|	j        d          }t          |          }|r|                    |j	                   |V  ld S 	NstreamTr   r   rq   rm   )r\   r?   )
r   r+   chatrb   deltaro   rc   r   on_llm_new_tokentext
rA   r   r   r   r   r   r   rY   chunkr   s
             rB   _streamzChatWriter._stream  s       !% @ @4 P Pv5F5f5h55(4;#(JJ-J6JJ 	 	EM!$*E  55$?? E (666E 9,,UZ888KKKK	 	rD   'Optional[AsyncCallbackManagerForLLMRun]"AsyncIterator[ChatGenerationChunk]c                 K   |                      ||          \  }}i ||ddi} | j        j        j        dd|i| d {V }|2 3 d {V }|j        d         j        }	|	r|	j        s#|                     d|	j        d          }t          |          }|r |                    |j	                   d {V  |W V  x6 d S r   )
r   r,   r   rb   r   ro   rc   r   r   r   r   s
             rB   _astreamzChatWriter._astream!  s5      !% @ @4 P Pv5F5f5h554*/4VVmVvVVVVVVVV# 	 	 	 	 	 	 	%M!$*E  55$?? E (666E ?!225:>>>>>>>>>KKKKK $88s   B?c                    |                      ||          \  }}i ||} | j        j        j        dd|i|}|                     |          S Nr   r?   )r   r+   r   rj   rA   r   r   r   r   r   r   rY   s           rB   	_generatezChatWriter._generate;  sc     !% @ @4 P Pv%F%f%(4;#(JJ-J6JJ''111rD   c                   K   |                      ||          \  }}i ||} | j        j        j        dd|i| d {V }|                     |          S r   )r   r,   r   rj   r   s           rB   
_ageneratezChatWriter._agenerateG  sz       !% @ @4 P Pv%F%f%4*/4VVmVvVVVVVVVV''111rD   )tool_choicetools:Sequence[Union[Dict[str, Any], Type[BaseModel], Callable]]r   -Optional[Union[str, Literal['auto', 'none']]])Runnable[LanguageModelInput, BaseMessage]c               v    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                ,    g | ]}t          |          S r?   r    rx   s     rB   r{   z)ChatWriter.bind_tools.<locals>.<listcomp>d  s!    JJJD1$77JJJrD   )autononert   ru   )rT   rt   r   r   r?   )superbind)rA   r   r   r   formatted_tools	__class__s        rB   
bind_toolszChatWriter.bind_toolsS  ss    " KJEJJJ 	 "222 (v{6KLL =! uww|<</<V<<<rD   )r=   r1   )r=   r6   )rK   r   r=   r   )rY   r   r=   r   )r\   r   r=   rd   )r   r   r=   r   r   )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   rd   r7   r:   r;   r#   model_configpropertyrC   rF   rH   r&   classmethodrX   rj   staticmethodr   rc   r   r   r   r   r   r   __classcell__)r   s   @rB   r(   r(   0   s         " %d333F3333dD999L9999#(5#6#6#6G6666eO7CCCJCCCCK+#(5#>#>#>L>>>>VAJJJJA $J$$$$/:t444L   X 
 
 
 X
 
 
 
 X
 _(###) ) ) [ $#)VJ J J J,    \@ ; ; ; \;> HL% % % % %* %):>	    : %)?C	    : %):>	
2 
2 
2 
2 
2 %)?C	
2 
2 
2 
2 
2  FJ	= = = = = = = = = = = =rD   r(   )5r   
__future__r   r   loggingtypingr   r   r   r   r   r	   r
   r   r   r   r   r   langchain_core.callbacksr   r   langchain_core.language_modelsr   *langchain_core.language_models.chat_modelsr   langchain_core.messagesr   r   r   r   r   r   r   langchain_core.outputsr   r   r   langchain_core.runnablesr   langchain_core.utilsr   %langchain_core.utils.function_callingr!   pydanticr"   r#   r$   r%   r&   	getLoggerr   loggerr(   r?   rD   rB   <module>r      s@     " " " " " "                                     > = = = = =                       S R R R R R R R R R - - - - - - 5 5 5 5 5 5 H H H H H H M M M M M M M M M M M M M M		8	$	$}= }= }= }= }= }= }= }= }= }=rD   