
    7|hE0                    6   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jb                  e2      Z3 G d de      Z4y)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                  6    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d,d       Zed-d       Zed-d       Z ed       ed.d!              Zd/d"Zed0d#       Zed1d$       Z	 d2	 	 	 	 	 d3d%Z	 	 d4	 	 	 	 	 	 	 	 	 d5d&Z	 	 d4	 	 	 	 	 	 	 	 	 d6d'Z	 	 d4	 	 	 	 	 	 	 	 	 d7d(Z	 	 d4	 	 	 	 	 	 	 	 	 d8d)Z dd*	 	 	 	 	 	 	 d9 fd+Z! x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)populate_by_namec                     y)zReturn type of chat model.zwriter-chat selfs    e/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/chat_models/writer.py	_llm_typezChatWriter._llm_typeY   s         c                L    | j                   | j                  d| j                  S )zGet the identifying parameters.)r1   r3   )r1   r3   r6   r>   s    r@   _identifying_paramszChatWriter._identifying_params^   s.     //++
 
 	
rB   c                x    | j                   | j                  | j                  | j                  d| j                  S )z2Get the default parameters for calling Writer API.)r.   r3   r9   r:   )r1   r3   r9   r:   r6   r>   s    r@   _default_paramszChatWriter._default_paramsg   s<     __++//	

 
 	
rB   before)modec           
        	 ddl m}m} |j	                  d      s%|j                  d |t        |dd            i       |j	                  d	      s%|j                  d	 |t        |dd            i       t        |j	                  d            |u rt        |j	                  d	            |u st        d
      |S # t        $ r}t        d      |d}~ww xY w)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)	writerairJ   rK   ImportErrorgetupdater   type
ValueError)clsvaluesrJ   rK   es        r@   validate_environmentzChatWriter.validate_environmentr   s    	4 zz(#MMf 4"I/?! zz.)MM"K 4"I/?!% H%&&0VZZ/0K?Y 
 K  	A 	s   B; ;	CCCc                X   g }|j                   D ]O  }| j                  |j                        }t        |t	        |j
                              }|j                  |       Q i }|j                  r|j                  j                  }|| j                  |j                  d}t        ||      S )N)finish_reason)messagegeneration_info)token_usager1   system_fingerprint)generations
llm_output)choices_convert_writer_to_langchainrY   r   dictrX   appendusage__dict__r1   r\   r   )r?   responser]   choicerY   genr[   r^   s           r@   _create_chat_resultzChatWriter._create_chat_result   s    && 	$F77GG  $63G3G HC s#	$ >>"..11K&//"*"="=

 kjIIrB   c                   d| j                   d}t        | t              r| j                  |d<   nt        | t              rd|d<   nt        | t
              r?d|d<   | j                  r| j                  D cg c]  }|d   d|d   |d	   d
d c}|d<   nRt        | t              rd|d<   n<t        | t              rd|d<   | j                  |d<   nt        dt        |              | j                  r| j                  |d<   |S c c}w )z5Convert a LangChain message to a Writer message dict. rolecontentrl   user	assistantidfunctionnameargs)rr   	arguments)rp   rQ   rq   
tool_callssystemtooltool_call_idzGot unknown message type: )rm   
isinstancer   rl   r   r   ru   r   r   rx   rR   rQ   rr   )rY   message_dictrw   s      r@   _convert_langchain_to_writerz'ChatWriter._convert_langchain_to_writer   s    !#w?g{+#*<<L .#)L +#.L !! !( 2 2. 	 #4j *-1&\V$U.\* /#+L -#)L +2+?+?L(9$w-IJJ<<#*<<L '.s   5Dc                   t        | t              s+t        j                  t        j                  | d             } | j                  dd      }| j                  d      }|sd}|dk(  rt        |      S |dk(  r(i }| j                  d	g       x}r||d	<   t        ||
      S |dk(  rt        |      S |dk(  r.t        || j                  dd      | j                  dd            S t        ||      S )z0Convert a Writer message to a LangChain message.c                    | j                   S N)rd   )os    r@   <lambda>z9ChatWriter._convert_writer_to_langchain.<locals>.<lambda>   s
    qzz rB   r,   rl   rj   rm   rn   )rm   ro   ru   )rm   additional_kwargsrv   rw   rx   rr   )rm   rx   rr   )rm   rl   )ry   ra   jsonloadsdumpsrO   r   r   r   r   r   )response_messagerl   rm   r   ru   s        r@   r`   z'ChatWriter._convert_writer_to_langchain   s    *D1#zz

+5IJ   ##FB/"&&y1G6>00[  "-11,CCzC2<!,/!'EVWWX 11V^-11."E%))&"5  wT::rB   c                    | j                   | j                  | j                  d| j                  }|r||d<   | j                  | j                  |d<   |D cg c]  }| j                  |       }}||fS c c}w )z=Convert a list of LangChain messages to List of Writer dicts.)r.   r3   r9   stopr:   )r1   r3   r9   r6   r:   r{   )r?   messagesr   paramsmmessage_dictss         r@   _convert_messages_to_writerz&ChatWriter._convert_messages_to_writer   s    
 __++
 	
 !F6N??&#'??F< GOP!::1=PPf$$ Qs   A5c              +    K   | j                  ||      \  }}i ||ddi} | j                  j                  j                  dd|i|}|D ]u  }|j                  d   j                  }	|	r|	j
                  s+| j                  d|	j
                  d      }t        |      }|r|j                  |j                         | w y w	NstreamTr   r   ro   rk   )rY   r=   )
r   r*   chatr_   deltarm   r`   r   on_llm_new_tokentext
r?   r   r   run_managerkwargsr   r   re   chunkr   s
             r@   _streamzChatWriter._stream  s      !% @ @4 Pv5F5f5h5(4;;##((J-J6J 	EMM!$**E55'$}}E (6E,,UZZ8K	s   CCc                 K   | j                  ||      \  }}i ||ddi} | j                  j                  j                  dd|i| d {   }|2 3 d {   }|j                  d   j                  }	|	r|	j
                  s1| j                  d|	j
                  d      }t        |      }|r#|j                  |j                         d {    | 7 7 7 6 y wr   )
r   r+   r   r_   r   rm   r`   r   r   r   r   s
             r@   _astreamzChatWriter._astream$  s      !% @ @4 Pv5F5f5h54**//44VmVvVV# 	 	%MM!$**E55'$}}E (6E!225::>>>K# W	 ? $sI   AC"CC"C CC A3C"CC"C C" C"c                    | j                  ||      \  }}i ||} | j                  j                  j                  dd|i|}| j                  |      S Nr   r=   )r   r*   r   rh   r?   r   r   r   r   r   r   re   s           r@   	_generatezChatWriter._generateA  s_     !% @ @4 Pv%F%f%(4;;##((J-J6J''11rB   c                   K   | j                  ||      \  }}i ||} | j                  j                  j                  dd|i| d {   }| j                  |      S 7 wr   )r   r+   r   rh   r   s           r@   
_ageneratezChatWriter._agenerateM  sn      !% @ @4 Pv%F%f%4**//44VmVvVV''11 Ws   AA!	A
A!)tool_choicec                   |D cg c]  }t        |       }}|r|dv r|ndd|id|d<   t        |   dd|i|S c c}w )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
        )autononerq   rr   )rQ   rq   r   toolsr=   )r    superbind)r?   r   r   r   rw   formatted_tools	__class__s         r@   
bind_toolszChatWriter.bind_toolsY  si    " EJJD1$7JJ "22 (v{6KL =! w|</<V<< Ks   =)returnr0   )r   r5   )rT   r   r   r   )re   r   r   r   )rY   r   r   ra   )r   r   r   r   r~   )r   List[BaseMessage]r   Optional[List[str]]r   z+Tuple[List[Dict[str, Any]], Dict[str, Any]])NN)
r   r   r   r   r   "Optional[CallbackManagerForLLMRun]r   r   r   zIterator[ChatGenerationChunk])
r   r   r   r   r   'Optional[AsyncCallbackManagerForLLMRun]r   r   r   z"AsyncIterator[ChatGenerationChunk])
r   r   r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )r   z:Sequence[Union[Dict[str, Any], Type[BaseModel], Callable]]r   z-Optional[Union[str, Literal['auto', 'none']]]r   r   r   z)Runnable[LanguageModelInput, BaseMessage])#__name__
__module____qualname____doc__r#   r*   __annotations__r+   r-   r1   r3   ra   r6   r9   r:   r"   model_configpropertyrA   rD   rF   r%   classmethodrV   rh   staticmethodr{   r`   r   r   r   r   r   r   __classcell__)r   s   @r@   r'   r'   0   sr   " d3FC3dD9L#9#(#6G 6O7CJCK+#(#>L.>VAsJA $J$/t4L  
 
 
 
 (#)  $)VJ,  @ ; ;> HL%)%1D%	4%* %):>	# " 8	
  
'@ %)?C	# " =	
  
,@ %):>	
2#
2 "
2 8	
2
 
2 

2 %)?C	
2#
2 "
2 =	
2
 
2 

2  FJ	=I= C	=
 = 
3= =rB   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=   rB   r@   <module>r      s{     "      >   S R - 5 H M M			8	$C= C=rB   