
    ~
i0                    N   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j5        e6          Z7 G d de          Z8dS )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                  (    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dDd            ZedEd            ZedEd            Z ed !          edFd$                        ZdGd'ZedHd+            ZedId-            Z	 dJdKd3Z	 	 dLdMd8Z	 	 dLdNd;Z	 	 dLdOd<Z	 	 dLdPd=Z 	 dJdQ fdCZ! xZ"S )R
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_namereturnc                    dS )zReturn type of chat model.zwriter-chat selfs    C:\Users\Dell Inspiron 16\Desktop\tws\AgrotaPowerBi\back-agrota-powerbi\mcp-client-agrota\venv\Lib\site-packages\langchain_community/chat_models/writer.py	_llm_typezChatWriter._llm_type\   s	     }    c                .    | j         | j        d| j        S )zGet the identifying parameters.)r5   r7   )r5   r7   r:   rC   s    rE   _identifying_paramszChatWriter._identifying_paramsa   s+     /+
 
 
 	
rG   c                F    | j         | j        | j        | j        d| j        S )z2Get the default parameters for calling Writer API.)r2   r7   r=   r>   )r5   r7   r=   r>   r:   rC   s    rE   _default_paramszChatWriter._default_paramsj   s5     _+/	
 

 
 	
rG   before)modevaluesr   c           
         	 ddl m}m} n"# t          $ r}t          d          |d}~ww xY w|                    d          s0|                    d |t          |dd                    i           |                    d	          s0|                    d	 |t          |dd                    i           t          |                    d                    |u r$t          |                    d	                    |u st          d
          |S )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)	writerairP   rQ   ImportErrorgetupdater"   type
ValueError)clsrN   rP   rQ   es        rE   validate_environmentzChatWriter.validate_environmentu   su   	444444444 	 	 	A  	 zz(## 		MMff 4"I/?! !     zz.)) 		MM"KK 4"I/?! !% % %   H%%&&&00VZZ//00K??Y  
 s    
*%*responser   c                ,   g }|j         D ]U}|                     |j                  }t          |t	          |j                            }|                    |           Vi }|j        r|j        j        }|| j	        |j
        d}t          ||          S )N)finish_reason)messagegeneration_info)token_usager5   system_fingerprint)generations
llm_output)choices_convert_writer_to_langchainr_   r   dictr^   appendusage__dict__r5   rb   r   )rD   r\   rc   choicer_   genra   rd   s           rE   _create_chat_resultzChatWriter._create_chat_result   s    & 	$ 	$F77GGG  $63G H H H  C s####> 	2".1K&/"*"=
 

 kjIIIIrG   r_   r   rg   c                   d| j         d}t          | t                    r| j        |d<   nt          | t                    rd|d<   nt          | t
                    r!d|d<   | j        rd | j        D             |d<   n_t          | t                    rd|d<   nDt          | t                    rd	|d<   | j	        |d
<   nt          dt          |                      | j        r
| j        |d<   |S )z5Convert a LangChain message to a Writer message dict. rolecontentrq   user	assistantc                D    g | ]}|d          d|d         |d         ddS )idfunctionnameargs)rx   	arguments)rv   rW   rw   rB   .0tools     rE   
<listcomp>z;ChatWriter._convert_langchain_to_writer.<locals>.<listcomp>   sN     . . . 	 #4j *-1&\V$U$U . . .rG   
tool_callssystemr}   tool_call_idzGot unknown message type: rx   )rr   
isinstancer   rq   r   r   r   r   r   r   rX   rW   rx   )r_   message_dicts     rE   _convert_langchain_to_writerz'ChatWriter._convert_langchain_to_writer   s.    !#w??g{++ 	K#*<L  .. 	K#)L  ++ 	K#.L ! . . !( 2. . .\* // 	K#+L  -- 	K#)L +2+?L((I$w--IIJJJ< 	0#*<L rG   response_messagec                B   t          | t                    s)t          j        t          j        | d                     } |                     dd          }|                     d          }|sd}|dk    rt          |          S |dk    r0i }|                     d	g           x}r||d	<   t          ||
          S |dk    rt          |          S |dk    r:t          ||                     dd          |                     dd                    S t          ||          S )z0Convert a Writer message to a LangChain message.c                    | j         S N)rj   )os    rE   <lambda>z9ChatWriter._convert_writer_to_langchain.<locals>.<lambda>   s    qz rG   r0   rq   ro   rr   rs   )rr   rt   r   )rr   additional_kwargsr   r}   r   rx   )rr   r   rx   )rr   rq   )r   rg   jsonloadsdumpsrU   r   r   r   r   r   )r   rq   rr   r   r   s        rE   rf   z'ChatWriter._convert_writer_to_langchain   sX    *D11 	#z
+5I5IJJJ     ##FB//"&&y11 	G6>>0000[   "-11,CCCz =2<!,/!'EVWWWWX 1111V^^-11."EE%))&"55    wT::::rG   messagesList[BaseMessage]stopOptional[List[str]]+Tuple[List[Dict[str, Any]], Dict[str, Any]]c                      j          j         j        d j        }|r||d<    j        
 j        |d<    fd|D             }||fS )z=Convert a list of LangChain messages to List of Writer dicts.)r2   r7   r=   r   Nr>   c                :    g | ]}                     |          S rB   )r   )r|   mrD   s     rE   r~   z:ChatWriter._convert_messages_to_writer.<locals>.<listcomp>  s'    PPP!::1==PPPrG   )r5   r7   r=   r:   r>   )rD   r   r   paramsmessage_dictss   `    rE   _convert_messages_to_writerz&ChatWriter._convert_messages_to_writer   sy    
 _+
 
 	
  	"!F6N?&#'?F< PPPPxPPPf$$rG   run_manager"Optional[CallbackManagerForLLMRun]kwargsIterator[ChatGenerationChunk]c              +    K   |                      ||          \  }}i ||ddi} | j        j        j        dd|i|}|D ]~}|j        d         j        }	|	r|	j        s|                     d|	j        d          }
t          t          t          |
                    }|r|
                    |j                   |V  d S 	NstreamTr   r   rt   rp   )r_   rB   )r   r.   chatre   deltarr   rf   r   r   r   on_llm_new_tokentextrD   r   r   r   r   r   r   r\   chunkr   message_chunks              rE   _streamzChatWriter._stream
  s      !% @ @4 P Pv5F5f5h55(4;#(JJ-J6JJ 	 	EM!$*E   =='$}  M (5E}0U0UVVVE 9,,UZ888KKKK	 	rG   'Optional[AsyncCallbackManagerForLLMRun]"AsyncIterator[ChatGenerationChunk]c                 K   |                      ||          \  }}i ||ddi} | j        j        j        dd|i| d {V }|2 3 d {V }|j        d         j        }	|	r|	j        s#|                     d|	j        d          }
t          t          t          |
                    }|r |
                    |j                   d {V  |W V  6 d S r   )r   r/   r   re   r   rr   rf   r   r   r   r   r   r   s              rE   _astreamzChatWriter._astream'  sE      !% @ @4 P Pv5F5f5h554*/4VVmVvVVVVVVVV# 	 	 	 	 	 	 	%M!$*E   =='$}  M (5E}0U0UVVVE ?!225:>>>>>>>>>KKKKK $88s   Cc                    |                      ||          \  }}i ||} | j        j        j        dd|i|}|                     |          S Nr   rB   )r   r.   r   rm   rD   r   r   r   r   r   r   r\   s           rE   	_generatezChatWriter._generateD  sc     !% @ @4 P Pv%F%f%(4;#(JJ-J6JJ''111rG   c                   K   |                      ||          \  }}i ||} | j        j        j        dd|i| d {V }|                     |          S r   )r   r/   r   rm   r   s           rE   
_ageneratezChatWriter._agenerateP  sz       !% @ @4 P Pv%F%f%4*/4VVmVvVVVVVVVV''111rG   toolsDSequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]]tool_choice-Optional[Union[str, Literal['auto', 'none']]]'Runnable[LanguageModelInput, AIMessage]c                v    d |D             }|r|dv r|ndd|id|d<    t                      j        dd|i|S )	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
        c                ,    g | ]}t          |          S rB   r#   r{   s     rE   r~   z)ChatWriter.bind_tools.<locals>.<listcomp>l  s!    JJJD1$77JJJrG   )autononerw   rx   )rW   rw   r   r   rB   )superbind)rD   r   r   r   formatted_tools	__class__s        rE   
bind_toolszChatWriter.bind_tools\  ss      KJEJJJ 	 "222 (v{6KLL =! uww|<</<V<<<rG   )r@   r4   )r@   r9   )rN   r   r@   r   )r\   r   r@   r   )r_   r   r@   rg   )r   r   r@   r   r   )r   r   r   r   r@   r   )NN)
r   r   r   r   r   r   r   r   r@   r   )
r   r   r   r   r   r   r   r   r@   r   )
r   r   r   r   r   r   r   r   r@   r   )
r   r   r   r   r   r   r   r   r@   r   )r   r   r   r   r   r   r@   r   )#__name__
__module____qualname____doc__r'   r.   __annotations__r/   r1   r5   r7   rg   r:   r=   r>   r&   model_configpropertyrF   rI   rK   r)   classmethodr[   rm   staticmethodr   rf   r   r   r   r   r   r   __classcell__)r   s   @rE   r+   r+   3   s         " %d333F3333dD999L9999#(5#6#6#6G6666eO7CCCJCCCCK+#(5#>#>#>L>>>>VAJJJJA $J$$$$/:t444L   X 
 
 
 X
 
 
 
 X
 _(###) ) ) [ $#)VJ J J J,    \@ ; ; ; \;> HL% % % % %* %):>	    @ %)?C	    @ %):>	
2 
2 
2 
2 
2 %)?C	
2 
2 
2 
2 
2 FJ= = = = = = = = = = =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+   rB   rG   rE   <module>r      sf     " " " " " "                                        > = = = = =     	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 S R R R R R R R R R - - - - - - ) ) ) ) ) ) 5 5 5 5 5 5 H H H H H H M M M M M M M M M M M M M M		8	$	$B= B= B= B= B= B= B= B= B= B=rG   