
    dhE0                    6   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  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   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-J.r.J/r/J0r0  \Rb                  " \25      r3 " S S\5      r4g)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                  <  ^  \ 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$$ )<
ChatWriter0   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    ^/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/chat_models/writer.py	_llm_typeChatWriter._llm_typeY   s         c                L    U R                   U R                  S.U R                  E$ )zGet the identifying parameters.)r2   r4   )r2   r4   r7   r?   s    rA   _identifying_paramsChatWriter._identifying_params^   s.     //++
 
 	
rD   c                x    U R                   U R                  U R                  U R                  S.U R                  E$ )z2Get the default parameters for calling Writer API.)r/   r4   r:   r;   )r2   r4   r:   r;   r7   r?   s    rA   _default_paramsChatWriter._default_paramsg   s<     __++//	

 
 	
rD   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+   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)	writerairN   rO   ImportErrorgetupdater   type
ValueError)clsvaluesrN   rO   es        rA   validate_environmentChatWriter.validate_environmentr   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_usager2   system_fingerprint)generations
llm_output)choices_convert_writer_to_langchainr^   r   dictr]   appendusage__dict__r2   ra   r   )r@   responserb   choicer^   genr`   rc   s           rA   _create_chat_resultChatWriter._create_chat_result   s    &&F77GG  $63G3G HC s# ' >>"..11K&//"*"="=

 kIIrD   c                \   SU R                   S.n[        U [        5      (       a  U R                  US'   O[        U [        5      (       a  SUS'   O[        U [
        5      (       aF  SUS'   U R                  (       a/  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contentrr   user	assistantidfunctionnameargs)rx   	arguments)rv   rU   rw   
tool_callssystemtooltool_call_idzGot unknown message type: )rs   
isinstancer   rr   r   r   r{   r   r   r~   rV   rU   rx   )r^   message_dictr}   s      rA   _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)ri   )os    rA   <lambda>9ChatWriter._convert_writer_to_langchain.<locals>.<lambda>   s    qzzrD   r-   rr   rp   rs   rt   )rs   ru   r{   )rs   additional_kwargsr|   r}   r~   rx   )rs   r~   rx   )rs   rr   )r   rf   jsonloadsdumpsrS   r   r   r   r   r   )response_messagerr   rs   r   r{   s        rA   re   '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::rD   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.)r/   r4   r:   stopr;   )r2   r4   r:   r7   r;   r   )r@   messagesr   paramsmmessage_dictss         rA   _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S9nU(       a  UR                  UR                  5        Uv   M     g 7f	NstreamTr   r   ru   rq   )r^   r>   )
r   r+   chatrd   deltars   re   r   on_llm_new_tokentext
r@   r   r   run_managerkwargsr   r   rj   chunkr   s
             rA   _streamChatWriter._stream  s      !% @ @ P5F5f5h5;;##((J-J6JEMM!$**E55'$}}E (6E,,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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   rd   r   rs   re   r   r   r   r   s
             rA   _astreamChatWriter._astream$  s      !% @ @ P5F5f5h5**//44VmVvVV# 	%MM!$**E55'$}}E (6E!225::>>>K# W	 ? $sI   A	C.C&C.C,C(C,B C.C*C.(C,*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   rm   r@   r   r   r   r   r   r   rj   s           rA   	_generateChatWriter._generateA  sY     !% @ @ P%F%f%;;##((J-J6J''11rD   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   rm   r   s           rA   
_agenerateChatWriter._agenerateM  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nonerw   rx   )rU   rw   r   toolsr>   )r    superbind)r@   r   r   r   r}   formatted_tools	__class__s         rA   
bind_toolsChatWriter.bind_toolsY  sj    " EJJED1$7EJ "22 (v{6KL =! w|</<V<< Ks   Ar>   )returnr1   )r   r6   )rX   r   r   r   )rj   r   r   r   )r^   r   r   rf   )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,   r.   r2   r4   rf   r7   r:   r;   r"   model_configpropertyrB   rF   rI   r%   classmethodrZ   rm   staticmethodr   re   r   r   r   r   r   r   __static_attributes____classcell__)r   s   @rA   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= =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   rA   <module>r      sy     "      >   S R - 5 H M M			8	$C= C=rD   