
    7|hC                    r   d Z ddlm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 ddlmZmZ ddlmZmZm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" ddl#m$Z$m%Z%m&Z& dd	l'm(Z(m)Z)m*Z* dd
l+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1m2Z2m3Z3m4Z4m5Z5  ejl                  e7      Z8 G d de      Z9ddZ:ddZ;	 	 	 	 	 	 ddZ<ddZ=ddZ>y)zChatYuan2 wrapper.    )annotationsN)AnyAsyncIteratorCallableDictIteratorListMappingOptionalTupleTypeUnion)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseChatModelagenerate_from_streamgenerate_from_stream)	AIMessageAIMessageChunkBaseMessageBaseMessageChunkChatMessageChatMessageChunkFunctionMessageHumanMessageHumanMessageChunkSystemMessageSystemMessageChunk)ChatGenerationChatGenerationChunk
ChatResult)get_from_dict_or_envget_pydantic_field_namespre_init)	BaseModel
ConfigDictFieldmodel_validator)before_sleep_logretryretry_if_exception_typestop_after_attemptwait_exponentialc                     e Zd ZU dZdZded<    edd      Zded<    edd	
      Zded<   	  ee	      Z
ded<   	  edd
      Zded<   	  edd
      Zded<   	  edd
      Zded<   	 dZded<   	 dZded<   	 dZd ed!<   	 d"Zd#ed$<   	 d%Zd&ed'<   	  ed(gd)
      Zd*ed+<   	 d,Zd ed-<   	 d.Zd&ed/<   	  ed0      ZedBd1       ZedCd2       Z ed34      edDd5              ZedEd6       ZedCd7       Z dFd8Z!dGd9Z"	 	 dH	 	 	 	 	 	 	 	 	 dId:Z#	 	 dH	 	 	 	 	 	 	 	 	 dJd;Z$	 	 	 	 	 	 dKd<Z%dLd=Z&	 	 dH	 	 	 	 	 	 	 	 	 dMd>Z'	 	 dH	 	 	 	 	 	 	 	 	 dNd?Z(edOd@       Z)edPdA       Z*y)Q	ChatYuan2a;  `Yuan2.0` Chat models API.

    To use, you should have the ``openai-python`` package installed, if package
    not installed, using ```pip install openai``` to install it. The
    environment variable ``YUAN2_API_KEY`` set to your API key, if not set,
    everyone can access apis.

    Any parameters that are valid to be passed to the openai.create call can be passed
    in, even if not explicitly saved on this class.

    Example:
        .. code-block:: python

            from langchain_community.chat_models import ChatYuan2

            chat = ChatYuan2()
    Nr   clientT)defaultexcludeasync_clientyuan2model)r1   aliasstr
model_name)default_factoryDict[str, Any]model_kwargsEMPTYapi_keyzOptional[str]yuan2_api_keyzhttp://127.0.0.1:8000/v1base_urlyuan2_api_basetimeoutz+Optional[Union[float, Tuple[float, float]]]request_timeout   intmax_retriesFbool	streamingzOptional[int]
max_tokensg      ?floattemperatureg?zOptional[float]top_pz<eod>stop_sequencesOptional[List[str]]stop@   repeat_last_ngzG?repeat_penalty)populate_by_namec                
    ddiS )Nr>   YUAN2_API_KEY selfs    d/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/chat_models/yuan2.py
lc_secretszChatYuan2.lc_secrets   s    11    c                v    i }| j                   r| j                   |d<   | j                  r| j                  |d<   |S )Nr@   r>   )r@   r>   )rW   
attributess     rX   lc_attributeszChatYuan2.lc_attributes   s@    %'
+/+>+>J'(*.*<*<J'rZ   before)modec           
     `   t        |       }|j                  di       }t        |      D ]M  }||v rt        d| d      ||vst        j                  d| d| d| d       |j                  |      ||<   O |j                  |j                               }|rt        d| d	      ||d<   |S )
z>Build extra kwargs from additional params that were passed in.r;   zFound z supplied twice.z	WARNING! z/ is not default parameter.
                    zJ was transferred to model_kwargs.
                    Please confirm that z is what you intended.zParameters za should be specified explicitly. Instead they were passed in as part of `model_kwargs` parameter.)	r#   getlist
ValueErrorloggerwarningpopintersectionkeys)clsvaluesall_required_field_namesextra
field_nameinvalid_model_kwargss         rX   build_extrazChatYuan2.build_extra   s     $<C#@ 

>2.v, 		;JU" 6*5E!FGG!99!* .L !))34JN
 %+JJz$:j!		;  8DDUZZ\R23 4S T 
 "'~rZ   c                n   t        |dd      |d<   	 ddl}|d   |d   |d   |d   d	}|j                  d
      s) |j                  di |j
                  j                  |d
<   |j                  d      s) |j                  di |j
                  j                  |d<   |S # t        $ r t        d      w xY w)z?Validate that api key and python package exists in environment.r>   rT   r   NzTCould not import openai python package. Please install it with `pip install openai`.r@   rB   rE   )r=   r?   rA   rE   r0   r3   rU   )r"   openaiImportErrorra   OpenAIchatcompletionsAsyncOpenAI)ri   rj   rq   client_paramss       rX   validate_environmentzChatYuan2.validate_environment   s     #7O_#
	 o./0/0!-0	
 zz(#,v}}=}=BBNNF8zz.)%7V%7%7 &&d;; >" )  	? 	s   B B4c                    | j                   | j                  | j                  | j                  d| j                  }| j
                  | j
                  |d<   | j                  | j                  |d<   |S )z1Get the default parameters for calling yuan2 API.)r5   streamrJ   rK   rH   rB   )r8   rG   rJ   rK   r;   rH   rB   )rW   paramss     rX   _default_paramszChatYuan2._default_params   su     __nn++ZZ	

 
 ??&#'??F< +(,(<(<F$%rZ   c                @     t               }|d fd       } |di |S )z*Use tenacity to retry the completion call.c                 <     j                   j                  di | S NrU   )r0   create)kwargsrW   s    rX   _completion_with_retryz?ChatYuan2.completion_with_retry.<locals>._completion_with_retry   s    %4;;%%///rZ   r   r   returnr   rU   _create_retry_decorator)rW   r   retry_decoratorr   s   `   rX   completion_with_retryzChatYuan2.completion_with_retry   s/    1$7		0 
	0 &///rZ   c                    i }t         j                  dt        |       d|        |D ]9  }||d   }|j                         D ]  \  }}||v r||xx   |z  cc<   |||<    ; || j                  dS )Nztype(llm_outputs): z; llm_outputs: token_usager   r8   )rd   debugtypeitemsr8   )rW   llm_outputsoverall_token_usageoutputr   kvs          rX   _combine_llm_outputszChatYuan2._combine_llm_outputs   s    $&!${"3!4OK=Q	
 " 		/F~ /K#))+ /1++'*a/*-.'*	/		/  3$//RRrZ   c              +    K   | j                  ||      \  }}i ||ddi}t        } | j                  dd|i|D ]  }t        |t              s|j                         }t        |d         dk(  r5|d   d   }	t        |	d   |      }|	j                  d      }
|
t	        |
      nd }|j                  }t        ||	      }|r|j                  |j                  |
       |  y w)Nrz   Tmessageschoicesr   deltafinish_reasonr   messagegeneration_infochunkrU   )_create_message_dictsr   r   
isinstancedict
model_dumplen_convert_delta_to_message_chunkra   	__class__r    on_llm_new_tokencontentrW   r   rN   run_managerr   message_dictsr{   default_chunk_classr   choicer   r   cg_chunks                rX   _streamzChatYuan2._stream   s     !% : :8T Jv5F5f5h5,/T//QQ&Q 	EeT*((*5#$)9%a(F3w!4E #JJ7M5B5N=1TX  #(//* /H ,,U]](,KN)	s   C&C(c                    | j                   r! | j                  d|||d|}t        |      S | j                  ||      \  }}i ||} | j                  dd|i|}| j                  |      S N)r   rN   r   r   rU   )rG   r   r   r   r   _create_chat_result	rW   r   rN   r   r   stream_iterr   r{   responses	            rX   	_generatezChatYuan2._generate  s     >>&$,, !+IOK (44 $ : :8T Jv%F%f%-4--O}OO''11rZ   c                    t        | j                        }|d|v rt        d      ||d<   |D cg c]  }t        |       }}||fS c c}w )NrN   z2`stop` found in both the input and default params.)r   _invocation_paramsrc   _convert_message_to_dict)rW   r   rN   r{   mr   s         rX   r   zChatYuan2._create_message_dicts*  sa     d--. !UVV!F6N>FG1!4GGf$$ Hs   Ac                   g }t         j                  dt        |       d|        t        |t              s|j	                         }|d   D ]I  }t        |d         }t	        |d         }d|v r|d   |d<   t        ||      }|j                  |       K |j                  d	i       | j                  d
}t        ||      S )Nztype(response): z; response: r   r   r   r   logprobsr   usager   )generations
llm_output)rd   r   r   r   r   _convert_dict_to_messager   appendra   r8   r!   )rW   r   r   resr   r   genr   s           rX   r   zChatYuan2._create_chat_result5  s    'X'7|H:NO(D)}}HI& 		$C.s9~>G"_1EFOS .1*o
+  /C s#		$ $<<4//

 kjIIrZ   c                 K   | j                  ||      \  }}i ||ddi}t        }t        | fd|i| d {   2 3 d {   }t        |t              s|j                         }t        |d         dk(  r;|d   d   }	t        |	d   |      }|	j                  d      }
|
t	        |
      nd }|j                  }t        ||	      }|r%|j                  |j                  |
       d {    | 7 7 7 6 y w)Nrz   Tr   r   r   r   r   r   r   r   )r   r   acompletion_with_retryr   r   r   r   r   ra   r   r    r   r   r   s                rX   _astreamzChatYuan2._astreamJ  s9     !% : :8T Jv5F5f5h5,!7"
("
,2"
 
 	 	% eT*((*5#$)9%a(F3w!4E #JJ7M5B5N=1TX  #(//* /H !225==2QQQN-
 	* R+
sE   7C?C7C?C=C9C=B&C?,C;-C?9C=;C?=C?c                   K   | j                   r) | j                  d|||d|}t        |       d {   S | j                  ||      \  }}i ||}t	        | fd|i| d {   }| j                  |      S 7 F7 wr   )rG   r   r   r   r   r   r   s	            rX   
_ageneratezChatYuan2._ageneratem  s      >>'$-- !+IOK /{;;; $ : :8T Jv%F%f%/W}WPVWW''11 < Xs!   1A>A:0A>$A<%A><A>c                >    d| j                   i}i || j                  S )z,Get the parameters used to invoke the model.r5   )r8   r|   )rW   yuan2_credss     rX   r   zChatYuan2._invocation_params  s,     T__'
 7+6!5!566rZ   c                     y)zReturn type of chat model.z
chat-yuan2rU   rV   s    rX   	_llm_typezChatYuan2._llm_type  s     rZ   )r   zDict[str, str])r   r:   )rj   r:   r   r   )rj   r   r   r   r   )r   zList[Optional[dict]]r   r   )NN)
r   List[BaseMessage]rN   rM   r   "Optional[CallbackManagerForLLMRun]r   r   r   zIterator[ChatGenerationChunk])
r   r   rN   rM   r   r   r   r   r   r!   )r   r   rN   rM   r   z+Tuple[List[Dict[str, Any]], Dict[str, Any]])r   zUnion[dict, BaseModel]r   r!   )
r   r   rN   rM   r   'Optional[AsyncCallbackManagerForLLMRun]r   r   r   z"AsyncIterator[ChatGenerationChunk])
r   r   rN   rM   r   r   r   r   r   r!   )r   Mapping[str, Any])r   r7   )+__name__
__module____qualname____doc__r0   __annotations__r'   r3   r8   r   r;   r>   r@   rB   rE   rG   rH   rJ   rK   rN   rP   rQ   r&   model_configpropertyrY   r]   r(   classmethodro   r$   rx   r|   r   r   r   r   r   r   r   r   r   r   rU   rZ   rX   r/   r/   <   s   $ FCdD9L#9G7;J;#(#>L.>V#(	#JM=JN$)**%NM  KCHIDO@  PK<It/ $J$/K+ E? . %wi?O PD
P@#%M=%&*NO*2L 2 2 	 	 (#  $2  >  0S( %):>	# " 8	
  
'H %):>	2#2 "2 8	2
 2 
2$	%)	%1D	%	4	%J0 %)?C	!#! "! =	!
 ! 
,!L %)?C	2#2 "2 =	2
 2 
2$ 7 7  rZ   r/   c           
     ~   dd l }d}d}t        dt        | j                        t	        d||      t        |j                        t        |j                        z  t        |j                        z  t        |j                        z  t        |j                        z  t        t        t        j                              S )Nr      <   T)
multiplierminmax)reraiserN   waitr*   before_sleep)rq   r*   r,   rE   r-   r+   APITimeoutErrorAPIErrorAPIConnectionErrorRateLimitErrorInternalServerErrorr)   rd   loggingWARNING)llmrq   min_secondsmax_secondss       rX   r   r     s    KK 0M#F$:$:;%foo67%f&?&?@A &f&;&;<= &f&@&@A	B &fgoo> rZ   c                \    K   t               }|d fd       } |di | d{   S 7 w)z0Use tenacity to retry the async completion call.c                 X   K    j                   j                  di |  d {   S 7 wr   )r3   r   )r   r   s    rX   r   z6acompletion_with_retry.<locals>._completion_with_retry  s+      -S%%,,6v6666s    *(*Nr   rU   r   )r   r   r   r   s   `   rX   r   r     s9     -c2O7 7 (1&1111s   ",*,c                ,   | j                  d      }| j                  d      xs d}|dk(  s	|t        k(  rt        |      S |dk(  s	|t        k(  rt        |      S |dk(  s	|t        k(  rt        |      S |s	|t        k(  rt	        ||      S  ||      S )	Nroler    userr   	assistantsystemr   r   )ra   r   r   r   r   )_dictdefault_classr   r   s       rX   r   r     s     99VDii	"(bGv~*;; 11		 ?g..		].@@!'22	"22d;;W--rZ   c                $   | j                  d      }|dk(  rt        | j                  dd            S |dk(  rt        | j                  dd            S |dk(  rt        | j                  dd            S t	        | j                  dd      |      S )	Nr   r   r   r   r   r   r   r   )ra   r   r   r   r   )r   r   s     rX   r   r     s    99VDv~EIIi$<==		9b!9::		UYYy"%=>>599Y#;$GGrZ   c                   t        | t              r| j                  | j                  d}nt        | t              rd| j                  d}nyt        | t
              rd| j                  d}nYt        | t              rd| j                  d}n9t        | t              rd| j                  | j                  d}nt        d|        d| j                  v r| j                  d   |d<   |S )	zConvert a LangChain message to a dictionary.

    Args:
        message: The LangChain message.

    Returns:
        The dictionary.
    )r   r   r   r   r   function)r   namer   zGot unknown type r   )r   r   r   r   r   r   r   r   r   rc   additional_kwargs)r   message_dicts     rX   r   r     s     ';' 'I	G\	* &7??C	GY	' +H	G]	+ (W__E	G_	-LL
 ,WI677***&88@VrZ   )r   r/   r   zCallable[[Any], Any])r   r/   r   r   r   r   )r   r   r   zType[BaseMessageChunk]r   r   )r   r   r   r   )r   r   r   r   )?r   
__future__r   r   typingr   r   r   r   r   r	   r
   r   r   r   r   langchain_core.callbacksr   r   *langchain_core.language_models.chat_modelsr   r   r   langchain_core.messagesr   r   r   r   r   r   r   r   r   r   r   langchain_core.outputsr   r    r!   langchain_core.utilsr"   r#   r$   pydanticr%   r&   r'   r(   tenacityr)   r*   r+   r,   r-   	getLoggerr   rd   r/   r   r   r   r   r   rU   rZ   rX   <module>r     s     "     
    S R 
 C B  
		8	$N Nb
,	2..-C..$	HrZ   