
    3fi0                    J   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. ddl/m0Z0m1Z1m2Z2m3Z3m4Z4  ejj                  e6      Z7 G d de      Z8y)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                  4    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d/d#       Zed0d$       Z	 d1	 	 	 	 	 d2d%Z	 	 d3	 	 	 	 	 	 	 	 	 d4d&Z	 	 d3	 	 	 	 	 	 	 	 	 d5d'Z	 	 d3	 	 	 	 	 	 	 	 	 d6d(Z	 	 d3	 	 	 	 	 	 	 	 	 d7d)Z 	 d1	 	 	 	 	 	 	 d8 fd*Z! xZ"S )9
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    d/var/www/auto_recruiter/arenv/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.)r4   r6   )r4   r6   r9   rA   s    rC   _identifying_paramszChatWriter._identifying_paramsa   s.     //++
 
 	
rE   c                x    | j                   | j                  | j                  | j                  d| j                  S )z2Get the default parameters for calling Writer API.)r1   r6   r<   r=   )r4   r6   r<   r=   r9   rA   s    rC   _default_paramszChatWriter._default_paramsj   s<     __++//	

 
 	
rE   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-   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)	writerairM   rN   ImportErrorgetupdater"   type
ValueError)clsvaluesrM   rN   es        rC   validate_environmentzChatWriter.validate_environmentu   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_usager4   system_fingerprint)generations
llm_output)choices_convert_writer_to_langchainr\   r   dictr[   appendusage__dict__r4   r_   r   )rB   responser`   choicer\   genr^   ra   s           rC   _create_chat_resultzChatWriter._create_chat_result   s    && 	$F77GG  $63G3G HC s#	$ >>"..11K&//"*"="=

 kjIIrE   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contentro   user	assistantidfunctionnameargs)ru   	arguments)rs   rT   rt   
tool_callssystemtooltool_call_idzGot unknown message type: )rp   
isinstancer   ro   r   r   rx   r   r   r{   rU   rT   ru   )r\   message_dictrz   s      rC   _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)rg   )os    rC   <lambda>z9ChatWriter._convert_writer_to_langchain.<locals>.<lambda>   s
    qzz rE   r/   ro   rm   rp   rq   )rp   rr   rx   )rp   additional_kwargsry   rz   r{   ru   )rp   r{   ru   )rp   ro   )r|   rd   jsonloadsdumpsrR   r   r   r   r   r   )response_messagero   rp   r   rx   s        rC   rc   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::rE   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.)r1   r6   r<   stopr=   )r4   r6   r<   r9   r=   r~   )rB   messagesr   paramsmmessage_dictss         rC   _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 ]  }|j                  d   j                  }	|	r|	j
                  s+| j                  d|	j
                  d      }
t        t        t        |
            }|r|j                  |j                         |  y w	NstreamTr   r   rr   rn   )r\   r@   )r   r-   chatrb   deltarp   rc   r   r   r   on_llm_new_tokentextrB   r   r   run_managerkwargsr   r   rh   chunkr   message_chunks              rC   _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   rb   r   rp   rc   r   r   r   r   r   r   s              rC   _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   rk   rB   r   r   r   r   r   r   rh   s           rC   	_generatezChatWriter._generateD  s_     !% @ @4 Pv%F%f%(4;;##((J-J6J''11rE   c                   K   | j                  ||      \  }}i ||} | j                  j                  j                  dd|i| d {   }| j                  |      S 7 wr   )r   r.   r   rk   r   s           rC   
_ageneratezChatWriter._agenerateP  sn      !% @ @4 Pv%F%f%4**//44VmVvVV''11 Ws   AA!	A
A!c                    |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nonert   ru   )rT   rt   tool_choicetoolsr@   )r#   superbind)rB   r   r   r   rz   formatted_tools	__class__s         rC   
bind_toolszChatWriter.bind_tools\  si      EJJD1$7JJ "22 (v{6KL =! w|</<V<< Ks   =)returnr3   )r   r8   )rW   r   r   r   )rh   r   r   r   )r\   r   r   rd   )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____doc__r&   r-   __annotations__r.   r0   r4   r6   rd   r9   r<   r=   r%   model_configpropertyrD   rG   rI   r(   classmethodrY   rk   staticmethodr~   rc   r   r   r   r   r   r   __classcell__)r   s   @rC   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= =rE   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*   r@   rE   rC   <module>r      s~     "       >	 	 	 S R - ) 5 H M M			8	$B= B=rE   