
    NgC                    j   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j6        e7          Z8 G d de          Z9d dZ:d!dZ;d"dZ<d#dZ=d$dZ>dS )%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dVd3            ZedWd4            Z ed56          edXd8                        ZedYd:            ZedWd;            Z dZd=Z!d[dAZ"	 	 d\d]dGZ#	 	 d\d^dIZ$d_dKZ%d`dNZ&	 	 d\dadQZ'	 	 d\dbdRZ(edcdT            Z)edddU            Z*dS )e	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_namereturnDict[str, str]c                
    ddiS )Nr>   YUAN2_API_KEY selfs    a/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/yuan2.py
lc_secretszChatYuan2.lc_secrets   s    11    c                N    i }| j         r
| j         |d<   | j        r
| j        |d<   |S )Nr@   r>   )r@   r>   )rY   
attributess     rZ   lc_attributeszChatYuan2.lc_attributes   s>    %'
 	?+/+>J'( 	=*.*<J'r\   before)modevaluesc           
        t          |           }|                    di           }t          |          D ]Y}||v rt          d| d          ||vr<t                              d| d| d| d           |                    |          ||<   Z|                    |                                          }|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)clsrb   all_required_field_namesextra
field_nameinvalid_model_kwargss         rZ   build_extrazChatYuan2.build_extra   s4    $<C#@#@ 

>2..v,, 		; 		;JU"" !F*!F!F!FGGG!999N* N NN N)3N N N  
 %+JJz$:$:j!7DDUZZ\\RR 	T2 T T T  
 "'~r\   r   c                n   t          |dd          |d<   	 ddl}n# t          $ r t          d          w xY w|d         |d         |d         |d         d	}|                    d
          s |j        di |j        j        |d
<   |                    d          s |j        di |j        j        |d<   |S )z?Validate that api key and python package exists in environment.r>   rV   r   NzTCould not import openai python package. Please install it with `pip install openai`.r@   rB   rE   )r=   r?   rA   rE   r0   r3   rW   )r"   openaiImportErrorrd   OpenAIchatcompletionsAsyncOpenAI)rl   rb   rs   client_paramss       rZ   validate_environmentzChatYuan2.validate_environment   s    #7O_#
 #
	MMMM 	 	 	?  	 o./0/0!-0	
 
 zz(## 	O,v}==}==BNF8zz.)) 	%7V%7 & && &; >" s    5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   NrH   rB   )r8   rG   rJ   rK   r;   rH   rB   )rY   paramss     rZ   _default_paramszChatYuan2._default_params   sd     _n+Z	
 

 
 ?&#'?F< +(,(<F$%r\   kwargsc                N     t                     }|d fd            } |di |S )z*Use tenacity to retry the completion call.r   r   rS   c                 (     j         j        di | S NrW   )r0   create)r   rY   s    rZ   _completion_with_retryz?ChatYuan2.completion_with_retry.<locals>._completion_with_retry   s    %4;%/////r\   r   r   rS   r   rW   _create_retry_decorator)rY   r   retry_decoratorr   s   `   rZ   completion_with_retryzChatYuan2.completion_with_retry   sQ    1$77		0 	0 	0 	0 	0 
	0 &%/////r\   llm_outputsList[Optional[dict]]dictc                    i }t                               dt          |           d|            |D ]A}||d         }|                                D ]\  }}||v r||xx         |z  cc<   |||<    B|| j        dS )Nztype(llm_outputs): z; llm_outputs: token_usager   r8   )rg   debugtypeitemsr8   )rY   r   overall_token_usageoutputr   kvs          rZ   _combine_llm_outputszChatYuan2._combine_llm_outputs   s    $&Q${"3"3QQKQQ	
 	
 	
 " 		/ 		/F~ /K#))++ / /1+++'***a/****-.'**	/
  3$/RRRr\   messagesList[BaseMessage]run_manager"Optional[CallbackManagerForLLMRun]Iterator[ChatGenerationChunk]c              +    K   |                      ||          \  }}i ||ddi}t          } | j        dd|i|D ]}t          |t                    s|                                }t          |d                   dk    rE|d         d         }	t          |	d         |          }|	                    d          }
|
t	          |
          nd }|j	        }t          ||	          }|r|                    |j        |
           |V  d S )Nr|   Tr   choicesr   deltafinish_reasonr   messagegeneration_infochunkrW   )_create_message_dictsr   r   
isinstancer   
model_dumplen_convert_delta_to_message_chunkrd   	__class__r    on_llm_new_tokencontentrY   r   rN   r   r   message_dictsr}   default_chunk_classr   choicer   r   cg_chunks                rZ   _streamzChatYuan2._stream   s^      !% : :8T J Jv5F5f5h55,/T/QQQ&QQ 	 	EeT** +((**5#$$))9%a(F3w!4 E #JJ77M5B5N=1111TX  #(/* /  H  L,,U](,KKKNNNN)	 	r\   r!   c                    | j         r  | j        d|||d|}t          |          S |                     ||          \  }}i ||} | j        dd|i|}|                     |          S N)r   rN   r   r   rW   )rG   r   r   r   r   _create_chat_result	rY   r   rN   r   r   stream_iterr   r}   responses	            rZ   	_generatezChatYuan2._generate  s     > 	5&$, !+ IO K (444 $ : :8T J Jv%F%f%-4-OO}OOO''111r\   +Tuple[List[Dict[str, Any]], Dict[str, Any]]c                ~    t          | j                  }|d|v rt          d          ||d<   d |D             }||fS )NrN   z2`stop` found in both the input and default params.c                ,    g | ]}t          |          S rW   )_convert_message_to_dict).0ms     rZ   
<listcomp>z3ChatYuan2._create_message_dicts.<locals>.<listcomp>2  s!    GGG1!44GGGr\   )r   _invocation_paramsrf   )rY   r   rN   r}   r   s        rZ   r   zChatYuan2._create_message_dicts*  s[     d-.. !UVVV!F6NGGhGGGf$$r\   r   Union[dict, BaseModel]c                   g }t                               dt          |           d|            t          |t                    s|                                }|d         D ]b}t          |d                   }t	          |d                   }d|v r|d         |d<   t          ||          }|                    |           c|                    d	i           | j	        d
}t          ||          S )Nztype(response): z; response: r   r   r   r   logprobsr   usager   )generations
llm_output)rg   r   r   r   r   _convert_dict_to_messager   appendrd   r8   r!   )rY   r   r   resr   r   genr   s           rZ   r   zChatYuan2._create_chat_result5  s   NXNNHNNOOO(D)) 	'}}HI& 		$ 		$C.s9~>>G"_1EFFFOS  .1*o
+  /  C s#####<<44/
 

 kjIIIIr\   'Optional[AsyncCallbackManagerForLLMRun]"AsyncIterator[ChatGenerationChunk]c               <  K   |                      ||          \  }}i ||ddi}t          }t          | fd|i| d {V 2 3 d {V }t          |t                    s|                                }t          |d                   dk    rJ|d         d         }	t          |	d         |          }|	                    d          }
|
t	          |
          nd }|j	        }t          ||	          }|r"|                    |j        |
           d {V  |W V  6 d S )Nr|   Tr   r   r   r   r   r   r   r   )r   r   acompletion_with_retryr   r   r   r   r   rd   r   r    r   r   r   s                rZ   _astreamzChatYuan2._astreamJ  s      !% : :8T J Jv5F5f5h55,!7"
 "
("
,2"
 "
 
 
 
 
 
 
 	 	 	 	 	 	 	% eT** +((**5#$$))9%a(F3w!4 E #JJ77M5B5N=1111TX  #(/* /  H  R!225=2QQQQQQQQQNNNNN-
 
 
s   Dc                   K   | j         r& | j        d|||d|}t          |           d {V S |                     ||          \  }}i ||}t	          | fd|i| d {V }|                     |          S r   )rG   r   r   r   r   r   r   s	            rZ   
_ageneratezChatYuan2._ageneratem  s       > 	<'$- !+ IO K /{;;;;;;;;; $ : :8T J Jv%F%f%/WW}WPVWWWWWWWW''111r\   Mapping[str, Any]c                *    d| j         i}i || j        S )z,Get the parameters used to invoke the model.r5   )r8   r~   )rY   yuan2_credss     rZ   r   zChatYuan2._invocation_params  s'     T_'
 7+6!566r\   c                    dS )zReturn type of chat model.z
chat-yuan2rW   rX   s    rZ   	_llm_typezChatYuan2._llm_type  s	     |r\   )rS   rT   )rS   r:   )rb   r:   rS   r   )rb   r   rS   r   r   )r   r   rS   r   )NN)
r   r   rN   rM   r   r   r   r   rS   r   )
r   r   rN   rM   r   r   r   r   rS   r!   )r   r   rN   rM   rS   r   )r   r   rS   r!   )
r   r   rN   rM   r   r   r   r   rS   r   )
r   r   rN   rM   r   r   r   r   rS   r!   )rS   r   )rS   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propertyr[   r_   r(   classmethodrq   r$   rz   r~   r   r   r   r   r   r   r   r   r   r   rW   r\   rZ   r/   r/   <   s         $ FdD999L9999eG7;;;J;;;;#(5#>#>#>L>>>>V#(5	#J#J#JMJJJJN$)E**% % %N     KCH5ID D DO     PK<I/ $J$$$$/K+ E    . %wi?O P P PDPPPP@#%M%%%%&*N****2:  L 2 2 2 X2 	 	 	 X	 _(###   [ $#2    X>    X0 0 0 0S S S S( %):>	    H %):>	2 2 2 2 2$	% 	% 	% 	%J J J J0 %)?C	! ! ! ! !L %)?C	2 2 2 2 2$ 7 7 7 X7    X  r\   r/   llmrS   Callable[[Any], Any]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)rs   r*   r,   rE   r-   r+   APITimeoutErrorAPIErrorAPIConnectionErrorRateLimitErrorInternalServerErrorr)   rg   loggingWARNING)r   rs   min_secondsmax_secondss       rZ   r   r     s    MMMKK 00MMM#F$:;;%fo667%f&?@@A &f&;<<= &f&@AA	B &fgo>>   r\   r   r   c                ^    K   t                     }|d fd            } |di | d{V S )z0Use tenacity to retry the async completion call.r   r   rS   c                 8   K    j         j        di |  d {V S r   )r3   r   )r   r   s    rZ   r   z6acompletion_with_retry.<locals>._completion_with_retry  s7       -S%,66v666666666r\   Nr   rW   r   )r   r   r   r   s   `   rZ   r   r     sg      -c22O7 7 7 7 7 _7 ('11&111111111r\   _dictr   default_classType[BaseMessageChunk]r   c                t   |                      d          }|                      d          p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   )rd   r   r   r   r   )r   r   r   r   s       rZ   r   r     s     99VDii	""(bGv~~*;;; 1111			 ? ?g....			].@@@!'2222	 ."222d;;;;}W----r\   r   c                r   |                      d          }|dk    r$t          |                      dd                    S |dk    r$t          |                      dd                    S |dk    r$t          |                      dd                    S t	          |                      dd          |          S )	Nr   r   r   r   r   r   r  r  )rd   r   r   r   r   )r   r   s     rZ   r   r     s    99VDv~~EIIi$<$<====			9b!9!9::::			UYYy"%=%=>>>>599Y#;#;$GGGGr\   r   r   c                   t          | t                    r| j        | j        d}nt          | t                    rd| j        d}nxt          | t
                    rd| j        d}nXt          | t                    rd| j        d}n8t          | 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  rf   additional_kwargs)r   message_dicts     rZ   r   r     s     ';'' 8 'II	G\	*	* 8 &7?CC	GY	'	' 8 +HH	G]	+	+ 	8 (W_EE	G_	-	- 8L
 
 6W66777***&8@Vr\   )r   r/   rS   r   )r   r/   r   r   rS   r   )r   r   r   r   rS   r   )r   r   rS   r   )r   r   rS   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   rg   r/   r   r   r   r   r   rW   r\   rZ   <module>r     s     " " " " " "                                          
                          S R R R R R R R R R         
 C B B B B B B B B B B B              
	8	$	$N N N N N N N Nb
   ,	2 	2 	2 	2. . . .$	H 	H 	H 	H     r\   