
    h0                    >   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jf                  e4      Z5 G d de      Z6y)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                  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/aiagenthome/venv/lib/python3.12/site-packages/langchain_community/chat_models/writer.py	_llm_typezChatWriter._llm_type[   s         c                L    | j                   | j                  d| j                  S )zGet the identifying parameters.)r3   r5   )r3   r5   r8   r@   s    rB   _identifying_paramszChatWriter._identifying_params`   s.     //++
 
 	
rD   c                x    | j                   | j                  | j                  | j                  d| j                  S )z2Get the default parameters for calling Writer API.)r0   r5   r;   r<   )r3   r5   r;   r<   r8   r@   s    rB   _default_paramszChatWriter._default_paramsi   s<     __++//	

 
 	
rD   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)	writerairL   rM   ImportErrorgetupdater!   type
ValueError)clsvaluesrL   rM   es        rB   validate_environmentzChatWriter.validate_environmentt   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_usager3   system_fingerprint)generations
llm_output)choices_convert_writer_to_langchainr[   r   dictrZ   appendusage__dict__r3   r^   r   )rA   responser_   choicer[   genr]   r`   s           rB   _create_chat_resultzChatWriter._create_chat_result   s    &&F77GG  $63G3G HC s# ' >>"..11K&//"*"="=

 kjIIrD   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contentrn   user	assistantidfunctionnameargs)rt   	arguments)rr   rS   rs   
tool_callssystemtooltool_call_idzGot unknown message type: )ro   
isinstancer   rn   r   r   rw   r   r   rz   rT   rS   rt   )r[   message_dictry   s      rB   _convert_langchain_to_writerz'ChatWriter._convert_langchain_to_writer   s    !#w?g{+#*<<L .#)L +#.L !! !( 2 2. !3	 #4j *-1&\V$U
 !3.\* /#+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)rf   )os    rB   <lambda>z9ChatWriter._convert_writer_to_langchain.<locals>.<lambda>   s    qzzrD   r.   rn   rl   ro   rp   )ro   rq   rw   )ro   additional_kwargsrx   ry   rz   rt   )ro   rz   rt   )ro   rn   )r{   rc   jsonloadsdumpsrQ   r   r   r   r   r   )response_messagern   ro   r   rw   s        rB   rb   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::rD   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.)r0   r5   r;   stopr<   )r3   r5   r;   r8   r<   r}   )rA   messagesr   paramsmmessage_dictss         rB   _convert_messages_to_writerz&ChatWriter._convert_messages_to_writer   s    
 __++
 	
 !F6N??&#'??F< GOPx!::1=xPf$$ Qs   A5c              +    K   | j                  ||      \  }}i ||ddi} | j                  j                  j                  dd|i|}|D ]  }|j                  d   j                  }	|	r|	j
                  s+| j                  d|	j
                  d      }
t        t        t        |
            }|r|j                  |j                         |  y w	NstreamTr   r   rq   rm   )r[   r?   )r   r,   chatra   deltaro   rb   r   r   r   on_llm_new_tokentextrA   r   r   run_managerkwargsr   r   rg   chunkr   message_chunks              rB   _streamzChatWriter._stream	  s      !% @ @4 Pv5F5f5h5(4;;##((J-J6JEMM!$**E =='$}}M (5E}0UVE,,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        t        t        |
            }|r#|j                  |j                         d {    | 7 7 7 6 y wr   )r   r-   r   ra   r   ro   rb   r   r   r   r   r   r   s              rB   _astreamzChatWriter._astream&  s      !% @ @4 Pv5F5f5h54**//44VmVvVV# 	%MM!$**E =='$}}M (5E}0UVE!225::>>>K# W	 ? $sI   AC0C(C0C.C*C.BC0C,C0*C.,C0.C0c                    | j                  ||      \  }}i ||} | j                  j                  j                  dd|i|}| j                  |      S Nr   r?   )r   r,   r   rj   rA   r   r   r   r   r   r   rg   s           rB   	_generatezChatWriter._generateC  s_     !% @ @4 Pv%F%f%(4;;##((J-J6J''11rD   c                   K   | j                  ||      \  }}i ||} | j                  j                  j                  dd|i| d {   }| j                  |      S 7 wr   )r   r-   r   rj   r   s           rB   
_ageneratezChatWriter._agenerateO  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noners   rt   )rS   rs   r   toolsr?   )r"   superbind)rA   r   r   r   ry   formatted_tools	__class__s         rB   
bind_toolszChatWriter.bind_tools[  sj    " EJJED1$7EJ "22 (v{6KL =! w|</<V<< Ks   =)returnr2   )r   r7   )rV   r   r   r   )rg   r   r   r   )r[   r   r   rc   )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/   r3   r5   rc   r8   r;   r<   r$   model_configpropertyrC   rF   rH   r'   classmethodrX   rj   staticmethodr}   rb   r   r   r   r   r   r   __classcell__)r   s   @rB   r)   r)   2   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= =rD   r)   )7r   
__future__r   r   loggingtypingr   r   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   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 - 5 H M M			8	$C= C=rD   