
    MKi0                    J   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.  SSK/J0r0J1r1J2r2J3r3J4r4  \Rj                  " \65      r7 " S S\5      r8g)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)BaseTool)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\S/S" j5       5       rS0S# jr\S1S$ j5       r\S2S% j5       r S3     S4S& jjr  S5         S6S' jjr  S5         S7S( jjr  S5         S8S) jjr   S5         S9S* jjr! S3       S:U 4S+ jjjr"S,r#U =r$$ );
ChatWriter3   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    h/var/www/html/dynamic-report/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.)r5   r7   )r5   r7   r:   rB   s    rD   _identifying_paramsChatWriter._identifying_paramsa   s.     //++
 
 	
rG   c                x    U R                   U R                  U R                  U R                  S.U R                  E$ )z2Get the default parameters for calling Writer API.)r2   r7   r=   r>   )r5   r7   r=   r>   r:   rB   s    rD   _default_paramsChatWriter._default_paramsj   s<     __++//	

 
 	
rG   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.   r1   WRITER_API_KEY)r1   r/   zx'client' attribute must be with type 'Client' and 'async_client' must be with type 'AsyncClient' from 'writerai' package)	writerairQ   rR   ImportErrorgetupdater"   type
ValueError)clsvaluesrQ   rR   es        rD   validate_environmentChatWriter.validate_environmentu   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_usager5   system_fingerprint)generations
llm_output)choices_convert_writer_to_langchainra   r   dictr`   appendusage__dict__r5   rd   r   )rC   responsere   choicera   genrc   rf   s           rD   _create_chat_resultChatWriter._create_chat_result   s    &&F77GG  $63G3G HC s# ' >>"..11K&//"*"="=

 kIIrG   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contentru   user	assistantidfunctionnameargs)r{   	arguments)ry   rX   rz   
tool_callssystemtooltool_call_idzGot unknown message type: )rv   
isinstancer   ru   r   r   r~   r   r   r   rY   rX   r{   )ra   message_dictr   s      rD   _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)rl   )os    rD   <lambda>9ChatWriter._convert_writer_to_langchain.<locals>.<lambda>   s    qzzrG   r0   ru   rs   rv   rw   )rv   rx   r~   )rv   additional_kwargsr   r   r   r{   )rv   r   r{   )rv   ru   )r   ri   jsonloadsdumpsrV   r   r   r   r   r   )response_messageru   rv   r   r~   s        rD   rh   '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::rG   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.)r2   r7   r=   stopr>   )r5   r7   r=   r:   r>   r   )rC   messagesr   paramsmmessage_dictss         rD   _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   rx   rt   )ra   rA   )r   r.   chatrg   deltarv   rh   r   r   r   on_llm_new_tokentextrC   r   r   run_managerkwargsr   r   rm   chunkr   message_chunks              rD   _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   rg   r   rv   rh   r   r   r   r   r   r   s              rD   _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   rA   )r   r.   r   rp   rC   r   r   r   r   r   r   rm   s           rD   	_generateChatWriter._generateD  sY     !% @ @ P%F%f%;;##((J-J6J''11rG   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   rp   r   s           rD   
_agenerateChatWriter._agenerateP  sg      !% @ @ P%F%f%**//44VmVvVV''11 Ws   AAAAc                   > 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nonerz   r{   )rX   rz   tool_choicetoolsrA   )r#   superbind)rC   r   r   r   r   formatted_tools	__class__s         rD   
bind_toolsChatWriter.bind_tools\  sj      EJJED1$7EJ "22 (v{6KL =! w|</<V<< Ks   ArA   )returnr4   )r   r9   )r[   r   r   r   )rm   r   r   r   )ra   r   r   ri   )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   zDSequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]]r   z-Optional[Union[str, Literal['auto', 'none']]]r   r   r   z'Runnable[LanguageModelInput, AIMessage])%__name__
__module____qualname____firstlineno____doc__r&   r.   __annotations__r/   r1   r5   r7   ri   r:   r=   r>   r%   model_configpropertyrE   rI   rL   r(   classmethodr]   rp   staticmethodr   rh   r   r   r   r   r   r   __static_attributes____classcell__)r   s   @rD   r*   r*   3   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=S= C= 	=
 
1= =rG   r*   )9r   
__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.toolsr!   langchain_core.utilsr"   %langchain_core.utils.function_callingr#   pydanticr$   r%   r&   r'   r(   	getLoggerr   loggerr*   rA   rG   rD   <module>r      s|     "       >	 	 	 S R - ) 5 H M M			8	$B= B=rG   