
    -h0                    >   S r SSKJr  SSKrSSKrSSKJrJrJrJ	r	J
r
JrJrJrJrJrJrJrJr  SSKJrJr  SSKJr  SSKJr  SSKJrJrJrJrJrJ r J!r!J"r"  SS	K#J$r$J%r%J&r&  SS
K'J(r(  SSK)J*r*  SSK+J,r,  SSK-J.r.J/r/J0r0J1r1J2r2  \Rf                  " \45      r5 " S S\5      r6g)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                  <  ^  \ rS rSr% Sr\" SSS9rS\S'   \" SSS9rS\S'   \" SS	9r	S
\S'    \" SSS9r
S\S'    SrS\S'    \" \S9rS\S'    SrS\S'    SrS\S'    \" SS9r\S.S j5       r\S/S j5       r\S/S j5       r\" S S!9\S0S" j5       5       rS1S# jr\S2S$ j5       r\S3S% j5       r S4     S5S& jjr  S6         S7S' jjr  S6         S8S( jjr  S6         S9S) jjr   S6         S:S* jjr!SS+.       S;U 4S, jjjr"S-r#U =r$$ )<
ChatWriter2   a  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                    g)zReturn type of chat model.zwriter-chat selfs    V/root/34ku/venv/lib/python3.13/site-packages/langchain_community/chat_models/writer.py	_llm_typeChatWriter._llm_type[   s         c                L    U R                   U R                  S.U R                  E$ )zGet the identifying parameters.)r4   r6   )r4   r6   r9   rA   s    rC   _identifying_paramsChatWriter._identifying_params`   s.     //++
 
 	
rF   c                x    U R                   U R                  U R                  U R                  S.U R                  E$ )z2Get the default parameters for calling Writer API.)r1   r6   r<   r=   )r4   r6   r<   r=   r9   rA   s    rC   _default_paramsChatWriter._default_paramsi   s<     __++//	

 
 	
rF   before)modec           
         SSK JnJn  UR	                  S5      (       d"  UR                  SU" [        USS5      S905        UR	                  S	5      (       d"  UR                  S	U" [        USS5      S905        [        UR	                  S5      5      UL a  [        UR	                  S	5      5      UL d  [        S
5      eU$ ! [         a  n[        S5      UeSnAff = f)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-   r0   WRITER_API_KEY)r0   r.   zx'client' attribute must be with type 'Client' and 'async_client' must be with type 'AsyncClient' from 'writerai' package)	writerairP   rQ   ImportErrorgetupdater!   type
ValueError)clsvaluesrP   rQ   es        rC   validate_environmentChatWriter.validate_environmentt   s    	4 zz(##MMf 4"I/?! zz.))MM"K 4"I/?!% H%&&0VZZ/0K?Y 
 K  	A 	s   C 
CCCc                R   / nUR                    HJ  nU R                  UR                  5      n[        U[	        UR
                  S9S9nUR                  U5        ML     0 nUR                  (       a  UR                  R                  nUU R                  UR                  S.n[        X'S9$ )N)finish_reason)messagegeneration_info)token_usager4   system_fingerprint)generations
llm_output)choices_convert_writer_to_langchainr`   r   dictr_   appendusage__dict__r4   rc   r   )rB   responserd   choicer`   genrb   re   s           rC   _create_chat_resultChatWriter._create_chat_result   s    &&F77GG  $63G3G HC s# ' >>"..11K&//"*"="=

 kIIrF   c                ^   SU R                   S.n[        U [        5      (       a  U R                  US'   O[        U [        5      (       a  SUS'   O[        U [
        5      (       aG  SUS'   U R                  (       a0  U R                   Vs/ s H  nUS   SUS   US	   S
.S.PM     snUS'   O\[        U [        5      (       a  SUS'   OA[        U [        5      (       a  SUS'   U R                  US'   O[        S[        U 5       35      eU R                  (       a  U R                  US'   U$ s  snf )z5Convert a LangChain message to a Writer message dict. rolecontentrt   user	assistantidfunctionnameargs)rz   	arguments)rx   rW   ry   
tool_callssystemtooltool_call_idzGot unknown message type: )ru   
isinstancer   rt   r   r   r}   r   r   r   rX   rW   rz   )r`   message_dictr   s      rC   _convert_langchain_to_writer'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   	D*c                   [        U [        5      (       d*  [        R                  " [        R                  " U S S95      n U R                  SS5      nU R                  S5      nU(       d  SnUS:X  a	  [        US9$ US:X  a(  0 nU R                  S	/ 5      =n(       a  XCS	'   [        X#S
9$ US:X  a	  [        US9$ US:X  a+  [        UU R                  SS5      U R                  SS5      S9$ [        X!S9$ )z0Convert a Writer message to a LangChain message.c                    U R                   $ N)rk   )os    rC   <lambda>9ChatWriter._convert_writer_to_langchain.<locals>.<lambda>   s    qzzrF   r/   rt   rr   ru   rv   )ru   rw   r}   )ru   additional_kwargsr~   r   r   rz   )ru   r   rz   )ru   rt   )r   rh   jsonloadsdumpsrU   r   r   r   r   r   )response_messagert   ru   r   r}   s        rC   rg   'ChatWriter._convert_writer_to_langchain   s     *D11#zz

+5IJ   ##FB/"&&y1G6>00[  "-11,CCzC2<,/!'WWX 11V^-11."E%))&"5  w::rF   c                    U R                   U R                  U R                  S.U R                  EnU(       a  X#S'   U R                  b  U R                  US'   U Vs/ s H  o@R                  U5      PM     nnXS4$ s  snf )z=Convert a list of LangChain messages to List of Writer dicts.)r1   r6   r<   stopr=   )r4   r6   r<   r9   r=   r   )rB   messagesr   paramsmmessage_dictss         rC   _convert_messages_to_writer&ChatWriter._convert_messages_to_writer   s    
 __++
 	
 !6N??&#'??F< GOPx!::1=xP$$ Qs   A;c              +    #    U R                  X5      u  pV0 UEUESS0EnU R                  R                  R                  " SSU0UD6nU H  nUR                  S   R                  n	U	(       a  U	R
                  (       d  M6  U R                  SU	R
                  S.5      n
[        [        [        U
5      S9nU(       a  UR                  UR                  5        Uv   M     g 7f	NstreamTr   r   rw   rs   )r`   r@   )r   r-   chatrf   deltaru   rg   r   r   r   on_llm_new_tokentextrB   r   r   run_managerkwargsr   r   rl   chunkr   message_chunks              rC   _streamChatWriter._stream	  s      !% @ @ P5F5f5h5;;##((J-J6JEMM!$**E =='$}}M (5E}0UVE,,UZZ8K s   CC c                 #    U R                  X5      u  pV0 UEUESS0EnU R                  R                  R                  " SSU0UD6I S h  vN nU  S h  vN nUR                  S   R                  n	U	(       a  U	R
                  (       d  M<  U R                  SU	R
                  S.5      n
[        [        [        U
5      S9nU(       a#  UR                  UR                  5      I S h  vN   U7v   M   N N N
 g 7fr   )r   r.   r   rf   r   ru   rg   r   r   r   r   r   r   s              rC   _astreamChatWriter._astream&  s      !% @ @ P5F5f5h5**//44VmVvVV# 	%MM!$**E =='$}}M (5E}0UVE!225::>>>K# W	 ? $sI   A	C<C4C<C:C6C:BC<(C8)C<6C:8C<:C<c                    U R                  X5      u  pV0 UEUEnU R                  R                  R                  " SSU0UD6nU R                  U5      $ Nr   r@   )r   r-   r   ro   rB   r   r   r   r   r   r   rl   s           rC   	_generateChatWriter._generateC  sY     !% @ @ P%F%f%;;##((J-J6J''11rF   c                   #    U R                  X5      u  pV0 UEUEnU R                  R                  R                  " SSU0UD6I S h  vN nU R                  U5      $  N7fr   )r   r.   r   ro   r   s           rC   
_agenerateChatWriter._agenerateO  sg      !% @ @ P%F%f%**//44VmVvVV''11 Ws   AAAA)tool_choicec                  > U Vs/ s H  n[        U5      PM     nnU(       a  US;   a  UOSSU0S.US'   [        TU ]  " SSU0UD6$ s  snf )a	  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nonery   rz   )rW   ry   r   toolsr@   )r"   superbind)rB   r   r   r   r   formatted_tools	__class__s         rC   
bind_toolsChatWriter.bind_tools[  sj    " EJJED1$7EJ "22 (v{6KL =! w|</<V<< Ks   Ar@   )returnr3   )r   r8   )rZ   r   r   r   )rl   r   r   r   )r`   r   r   rh   )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____firstlineno____doc__r%   r-   __annotations__r.   r0   r4   r6   rh   r9   r<   r=   r$   model_configpropertyrD   rH   rK   r'   classmethodr\   ro   staticmethodr   rg   r   r   r   r   r   r   __static_attributes____classcell__)r   s   @rC   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= =rF   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@   rF   rC   <module>r      sy     "       >	 	 	 S R - 5 H M M			8	$C= C=rF   