
    dhU                        S SK r S SKrS SKJ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  S SKrS SKJrJr  S SKJr  S SKJrJrJ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%  S SK&J'r'J(r(  S S	K)J*r*J+r+J,r,  S S
K-J.r.  S SK/J0r0  S SK1J2r2J3r3J4r4  S SK5J6r6  S SK7J8r8J9r9J:r:J;r;J<r<  S SK=J>r>J?r?  \R                  " \A5      rBSrCS\S\D4S jrES\\F\4   S\4S jrGS\\F\4   S\\   S\4S jrH\S\S\FS\FS\S\4
S j5       rI " S S\5      rJg)    N)asynccontextmanager)AnyAsyncIteratorCallableDictIteratorListMappingOptionalSequenceTypeUnion)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)LanguageModelInput)BaseChatModelagenerate_from_streamgenerate_from_stream)	AIMessageAIMessageChunkBaseMessageBaseMessageChunkChatMessageChatMessageChunkHumanMessageHumanMessageChunkSystemMessageSystemMessageChunkToolMessage)make_invalid_tool_callparse_tool_call)ChatGenerationChatGenerationChunk
ChatResult)Runnable)BaseTool)convert_to_secret_strget_from_dict_or_envget_pydantic_field_names)convert_to_openai_tool)	BaseModel
ConfigDictField	SecretStrmodel_validator))_lc_invalid_tool_call_to_openai_tool_call!_lc_tool_call_to_openai_tool_callz/https://api.baichuan-ai.com/v1/chat/completionsmessagereturnc                    U R                   n[        U [        5      (       a  U R                  US.nU$ [        U [        5      (       a  SUS.nU$ [        U [
        5      (       a  SUS.nSU R                  ;   a  U R                  S   US'   U$ U R                  (       d  U R                  (       aN  U R                   Vs/ sH  n[        U5      PM     snU R                   Vs/ sH  n[        U5      PM     sn-   US'   U$ [        U [        5      (       a?  SU R                  UU R                  =(       d    U R                  R                  S5      S.nU$ [        U [        5      (       a  SUS.nU$ [!        S	U  35      es  snf s  snf )
N)rolecontentuser	assistant
tool_callstoolname)r5   tool_call_idr6   r;   systemzGot unknown type )r6   
isinstancer   r5   r   r   additional_kwargsr9   invalid_tool_callsr1   r0   r   r<   r;   getr   	TypeError)r2   r6   message_dicttcs       `/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/chat_models/baichuan.py_convert_message_to_dictrF   I   s   ooG';'' 'A8 7 
G\	*	* &7;4 3 
GY	'	' +@7444)0)B)B<)PL&, ) 7#=#=@G@R@R*@R"1"5@R* "444B :"=4*L&&  
G[	)	)#00LLIG$=$=$A$A&$I	
  
G]	+	+ (W=  +G9566#*s   =E=!F_dictc           
         U S   nU R                  SS5      nUS:X  a	  [        US9$ US:X  aQ  / n/ n0 nU R                  S5      =n(       a'  XeS'   U H  n UR                  [        USS	95        M     [        UUUUS
9$ US:X  a*  0 nSU ;   a  U S   US'   [        UU R                  S5      US9$ US:X  a	  [        US9$ [        X!S9$ ! [         a/  nUR                  [        U[        U5      5      5         S nAM  S nAff = f)Nr5   r6    r7   r6   r8   r9   T)	return_id)r6   r?   r9   r@   r:   r;   r<   )r6   r<   r?   r=   r6   r5   )rA   r   appendr!   	Exceptionr    strr   r   r   r   )	rG   r5   r6   r9   r@   r?   raw_tool_callsraw_tool_calles	            rE   _convert_dict_to_messagerS   l   s8   =Dii	2&Gv~G,,		
"YY|44>4.<l+!/%%omt&TU "0 /!1	
 	
 
U?(-ff%>2/
 	

 
	W--766/ ! &--.}c!fE s   C
C?$C::C?default_classc                 .   U R                  S5      nU R                  S5      =(       d    SnUS:X  d
  U[        :X  a	  [        US9$ US:X  d
  U[        :X  a	  [        US9$ US:X  d
  U[        :X  a	  [        US9$ U(       d
  U[        :X  a	  [	        X2S9$ U" US9$ )	Nr5   r6   rI   r7   rJ   r8   r=   rL   )rA   r   r   r   r   )rG   rT   r5   r6   s       rE   _convert_delta_to_message_chunkrV      s     99VDii	"(bGv~*;; 11		 ?g..		].@@!'22	"22;;W--    clientmethodurlkwargsc                   #    SSK Jn  U R                  " X40 UD6 ISh  vN nU" U5      7v   SSS5      ISh  vN   g N  N! , ISh  vN  (       d  f       g= f7f)zAsync context manager for connecting to an SSE stream.

Args:
    client: The httpx client.
    method: The HTTP method.
    url: The URL to connect to.
    kwargs: Additional keyword arguments to pass to the client.

Yields:
    An EventSource object.
r   )EventSourceN)	httpx_sser]   stream)rX   rY   rZ   r[   r]   responses         rE   aconnect_httpx_ssera      s?      &}}V3F33x(## 433333sA   AAAAAAAAAAAAc                     ^  \ rS rSr% Sr\S\\\4   4S j5       r\S\	4S j5       r
\" \SS9r\\S'    \" S	S
9r\\S'    Sr\\   \S'    Sr\	\S'    Sr\\   \S'    \" SSS9r\\S'    Sr\\S'    \" SS9r\\   \S'    Sr\\S'    Sr\\S'    Sr\	\S'    \" \S9r\\\4   \S'    \ " S S!9r!\"" S"S#9\#S$\\\4   S\4S% j5       5       r$\"" S"S#9\#S$\S\4S& j5       5       r%\S\\\4   4S' j5       r&  S:S(\'\(   S)\\'\      S*\\)   S+\S\*4
S, jjr+  S:S(\'\(   S)\\'\      S*\\)   S+\S\,\-   4
S- jjr.   S;S(\'\(   S)\\'\      S*\\/   S.\\	   S+\S\*4S/ jjr0  S:S(\'\(   S)\\'\      S*\\/   S+\S\1\-   4
S0 jjr2S(\'\(   S+\S\3Rh                  4S1 jr5S(\'\(   S+\S\\\4   4S2 jr6S+\S\\\4   4S3 jr7S4\8\\4   S\*4S5 jr9\S\4S6 j5       r:S7\;\<\\\4   \=\>   \?\@4      S+\S\A\B\(4   4U 4S8 jjrCS9rDU =rE$ )<ChatBaichuan   u  Baichuan chat model integration.

Setup:
    To use, you should have the environment variable``BAICHUAN_API_KEY`` set with
your API KEY.

    .. code-block:: bash

        export BAICHUAN_API_KEY="your-api-key"

Key init args — completion params:
    model: Optional[str]
        Name of Baichuan model to use.
    max_tokens: Optional[int]
        Max number of tokens to generate.
    streaming: Optional[bool]
        Whether to stream the results or not.
    temperature: Optional[float]
        Sampling temperature.
    top_p: Optional[float]
        What probability mass to use.
    top_k: Optional[int]
        What search sampling control to use.

Key init args — client params:
    api_key: Optional[str]
        Baichuan API key. If not passed in will be read from env var BAICHUAN_API_KEY.
    base_url: Optional[str]
        Base URL for API requests.

See full list of supported init args and their descriptions in the params section.

Instantiate:
    .. code-block:: python

        from langchain_community.chat_models import ChatBaichuan

        chat = ChatBaichuan(
            api_key=api_key,
            model='Baichuan4',
            # temperature=...,
            # other params...
        )

Invoke:
    .. code-block:: python

        messages = [
            ("system", "你是一名专业的翻译家，可以将用户的中文翻译为英文。"),
            ("human", "我喜欢编程。"),
        ]
        chat.invoke(messages)

    .. code-block:: python

        AIMessage(
            content='I enjoy programming.',
            response_metadata={
                'token_usage': {
                    'prompt_tokens': 93,
                    'completion_tokens': 5,
                    'total_tokens': 98
                },
                'model': 'Baichuan4'
            },
            id='run-944ff552-6a93-44cf-a861-4e4d849746f9-0'
        )

Stream:
    .. code-block:: python

        for chunk in chat.stream(messages):
            print(chunk)

    .. code-block:: python

        content='I' id='run-f99fcd6f-dd31-46d5-be8f-0b6a22bf77d8'
        content=' enjoy programming.' id='run-f99fcd6f-dd31-46d5-be8f-0b6a22bf77d8

    .. code-block:: python

        stream = chat.stream(messages)
        full = next(stream)
        for chunk in stream:
            full += chunk
        full

    .. code-block:: python

        AIMessageChunk(
            content='I like programming.',
            id='run-74689970-dc31-461d-b729-3b6aa93508d2'
        )

Async:
    .. code-block:: python

        await chat.ainvoke(messages)

        # stream
        # async for chunk in chat.astream(messages):
        #     print(chunk)

        # batch
        # await chat.abatch([messages])

    .. code-block:: python

        AIMessage(
            content='I enjoy programming.',
            response_metadata={
                'token_usage': {
                    'prompt_tokens': 93,
                    'completion_tokens': 5,
                    'total_tokens': 98
                },
                'model': 'Baichuan4'
            },
            id='run-952509ed-9154-4ff9-b187-e616d7ddfbba-0'
        )
Tool calling:

    .. code-block:: python
        class get_current_weather(BaseModel):
            '''Get current weather.'''

            location: str = Field('City or province, such as Shanghai')


        llm_with_tools = ChatBaichuan(model='Baichuan3-Turbo').bind_tools([get_current_weather])
        llm_with_tools.invoke('How is the weather today?')

    .. code-block:: python

        [{'name': 'get_current_weather',
        'args': {'location': 'New York'},
        'id': '3951017OF8doB0A',
        'type': 'tool_call'}]

Response metadata
    .. code-block:: python

        ai_msg = chat.invoke(messages)
        ai_msg.response_metadata

    .. code-block:: python

        {
            'token_usage': {
                'prompt_tokens': 93,
                'completion_tokens': 5,
                'total_tokens': 98
            },
            'model': 'Baichuan4'
        }

r3   c                 
    SS0$ )Nbaichuan_api_keyBAICHUAN_API_KEY selfs    rE   
lc_secretsChatBaichuan.lc_secrets[  s      2
 	
rW   c                     g)NTrh   ri   s    rE   lc_serializableChatBaichuan.lc_serializablea  s    rW   base_url)defaultaliasbaichuan_api_baseapi_key)rr   rf   Nbaichuan_secret_keyF	streaming
max_tokens<   timeoutrequest_timeoutzBaichuan2-Turbo-192Kmodel333333?)rq   temperature   top_k333333?top_pwith_search_enhance)default_factorymodel_kwargsT)populate_by_namebefore)modevaluesc           
      p   [        U 5      nUR                  S0 5      n[        U5       HP  nXC;   a  [        SU S35      eXB;  d  M  [        R                  SU SU SU S35        UR                  U5      X4'   MR     UR                  UR                  5       5      nU(       a  [        SU S	35      eX1S'   U$ )
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)   rA   list
ValueErrorloggerwarningpopintersectionkeys)clsr   all_required_field_namesextra
field_nameinvalid_model_kwargss         rE   build_extraChatBaichuan.build_extra  s     $<C#@ 

>2.v,J" 6*5E!FGG9!* .L !))34JN
 %+JJz$:! '  8DDUZZ\R23 4S T 
 "'~rW   c                 f    [        USS[        5      US'   [        [        USS/S5      5      US'   U$ )Nrs   BAICHUAN_API_BASErf   rt   rg   )r(   DEFAULT_API_BASEr'   )r   r   s     rE   validate_environment!ChatBaichuan.validate_environment  sO     ';	'
"# &; #Y/"&
!" rW   c                     U R                   U R                  U R                  U R                  U R                  U R
                  S.n0 UEU R                  E$ )z4Get the default parameters for calling Baichuan API.)r{   r}   r   r   r_   rw   )r{   r}   r   r   rv   rw   r   )rj   normal_paramss     rE   _default_paramsChatBaichuan._default_params  sO     ZZ++ZZZZnn//
 6-54#4#455rW   messagesstoprun_managerr[   c                    U R                   (       a   U R                  " SXUS.UD6n[        U5      $ U R                  " U40 UD6nUR                  S:w  a  [        SU 35      eUR                  5       nU R                  U5      $ )N)r   r   r      "Error from Baichuan api response: rh   )rv   _streamr   _chatstatus_coder   json_create_chat_result)rj   r   r   r   r[   stream_iterresr`   s           rE   	_generateChatBaichuan._generate  s     >>,, !+IOK (44jj,V,??c!A#GHH88:''11rW   c              +   \  #    U R                   " U4SS0UD6nUR                  S:w  a  [        SU 35      e[        nUR	                  5        H  nUR                  S5      R                  S5      nUR                  SS5      n[        U5      S:  a  US   OS nUc  MP  US	:X  a    g [        R                  " U5      n	U	R                  S
5       HX  n
[        U
R                  S5      U5      nUR                  n[        US9nU(       a  UR                  UR                   US9  Uv   MZ     M     g 7f)Nr_   Tr   r   zutf-8z
zdata:    z[DONE]choicesdeltar2   chunk)r   r   r   r   
iter_linesdecodestripsplitlenr   loadsrA   rV   	__class__r#   on_llm_new_tokenr6   )rj   r   r   r   r[   r   default_chunk_classr   partsr`   mcg_chunks               rE   r   ChatBaichuan._stream  s     jj9$9&9??c!A#GHH,^^%ELL)//7EKK!,E #E
QE!HDE} zz%(H\\),7EE'N$7 ',oo#.u=00h0O - &s   D*D,r_   c                 &  #    Ub  UOU R                   nU(       a(  U R                  " U4X#S.UD6n[        U5      I S h  vN $ U R                  " S0 UD6nU R                  " U40 UD6n	SS Kn
U
R                  XR                  S9 IS h  vN nUR                  U R                  U	S9I S h  vN nUR                  5         S S S 5      IS h  vN   U R                  WR                  5       5      $  N Ng NG N)! , IS h  vN  (       d  f       N>= f7f)N)r   r   r   headersry   r   rh   )rv   _astreamr   _create_headers_parameters_create_payload_parametershttpxAsyncClientrz   postrs   raise_for_statusr   r   )rj   r   r   r   r_   r[   should_streamr   r   payloadr   rX   r`   s                rE   
_agenerateChatBaichuan._agenerate  s     #)"4$..--#@FK /{;;;11;F;11(EfE$$%9%9 % 
 
#[[)?)?g[NNH%%'	
 

 ''88 <
 O
 
 
 
sj   <DC/A
D	C1
DC7+C3,C7 DC5$D1D3C75D7D=D >D
Dc                *  #    U R                   " S0 UD6nU R                  " U4SS0UD6nSS KnUR                  XPR                  S9 IS h  vN n[        USU R                  US9 IS h  vN n	U	R                  5         S h  vN n
[        R                  " U
R                  5      n[        US   5      S:X  a  M=  US   S   n[        US   [        5      nUR                  S	S 5      nUb  S	U0OS n[        XS
9nU(       a"  UR!                  UR"                  US9I S h  vN   U7v   Uc  M    S S S 5      IS h  vN   S S S 5      IS h  vN   g  GN N N N7
 N, N ! , IS h  vN  (       d  f       N5= f N,! , IS h  vN  (       d  f       g = f7f)Nr_   Tr   r   POSTr   r   r   finish_reason)r2   generation_infor   rh   )r   r   r   r   rz   ra   rs   	aiter_sser   r   datar   rV   r   rA   r#   r   text)rj   r   r   r   r[   r   r   r   rX   event_sourcesser   choicer   r   s                  rE   r   ChatBaichuan._astream  s     11;F;11(R4R6R$$%9%9 % 
 
) 6 6W !-!7!7!9 # JJsxx0E5+,1 "9-a0F;wE %+JJ$EM )4 )-8! $
 0 %E #)::5::U:SSSK$03 
 
 
& T' ":   
 
 
 
s   A	FEFE9*E+E9.E?EE
EBEE
 
E.E/E9:E;E9?F
E7FE9EEEE9E4	#E&$E4	0E97F9F?F FFc                     U R                   " U40 UD6nU R                  nU R                  " S0 UD6n[        R                  " UU R
                  UUU R                  S9nU$ )N)rZ   ry   r   r   r_   rh   )r   rs   r   requestsr   rz   rv   )rj   r   r[   r   rZ   r   r   s          rE   r   ChatBaichuan._chat4  sc    11(EfE$$11;F;mm((>>
 
rW   c           	      r   0 U R                   EUEnUR                  SS5      nUR                  SS5      nUR                  SS5      nUR                  S5      nUR                  SS	5      nUR                  S
S	5      n	UR                  S/ 5      n
UU Vs/ sH  n[        U5      PM     snUUUUU	U
S.nU$ s  snf )Nr}   r|   r   r~   r   r   r{   r   Fr_   tools)r{   r   r   r   r}   r   r_   r   )r   r   rF   )rj   r   r[   
parametersr}   r   r   r{   r   r_   r   r   r   s                rE   r   'ChatBaichuan._create_payload_parametersB  s     8,,77
 nn]C8w*w-w'(nn-BEJ%0w+ >FGh1!4hG&#6	
  Hs   B4c                     0 U R                   EUEnUR                  S0 5      nSnU R                  (       a  U R                  R                  5       nSSU 3S.UEnU$ )Nr   rI   zapplication/jsonzBearer )zContent-TypeAuthorization)r   r   rf   get_secret_value)rj   r[   r   default_headersrt   r   s         rE   r   'ChatBaichuan._create_headers_parameters[  sp    7,,77
$..B7  ++<<>G /&wi0
 

 rW   r`   c                     / nUS    H+  n[        US   5      n[        US9nUR                  U5        M-     US   nX`R                  S.n[	        X'S9$ )Nr   r2   r   usage)token_usager{   )generations
llm_output)rS   r"   rM   r{   r$   )rj   r`   r   cr2   genr   r   s           rE   r    ChatBaichuan._create_chat_resulti  s_    )$A.q|<G 1Cs# %
 w'%0::F
kIIrW   c                     g)Nzbaichuan-chatrh   ri   s    rE   	_llm_typeChatBaichuan._llm_typet  s    rW   r   c                 f   > U Vs/ sH  n[        U5      PM     nn[        TU ]  " SSU0UD6$ s  snf )a  Bind tool-like objects to this chat model.

Args:
    tools: A list of tool definitions to bind to this chat model.
        Can be a dictionary, pydantic model, callable, or BaseTool.
        Pydantic
        models, callables, and BaseTools will be automatically converted to
        their schema dictionary representation.
    **kwargs: Any additional parameters to pass to the
        :class:`~langchain.runnable.Runnable` constructor.
r   rh   )r*   superbind)rj   r   r[   r:   formatted_toolsr   s        rE   
bind_toolsChatBaichuan.bind_toolsx  s>    " EJJED1$7EJw|</<V<< Ks   .rh   )NN)NNN)F__name__
__module____qualname____firstlineno____doc__propertyr   rO   rk   boolrn   r-   r   rs   __annotations__rf   r.   ru   r   rv   rw   intrz   r{   r}   floatr   r   r   dictr   r   r,   model_configr/   classmethodr   r   r   r	   r   r   r$   r   r   r#   r   r   r   r   r   r   Responser   r   r   r
   r   r   r   r   r   r+   r   r&   r%   r   r   __static_attributes____classcell__)r   s   @rE   rc   rc      s   \| 
DcN 
 

    #+;:NsN#"'i"8i8/3),3UIt/ $J$/ 9=OS=0'E3'/#(#5K%5+E3N.E5' %%8#(#>L$sCx.>QL (#c3h C   $2 (#$ 3   $  6c3h 6 6  %):>	2{#2 tCy!2 67	2
 2 
2, %):>	{# tCy! 67	
  
%	&B %)?C!%9{#9 tCy!9 ;<	9
 9 9 
9< %)?C	'{#' tCy!' ;<	'
 ' 
*	+'Rd;/ 3 8CTCT [)58	c3h23 4S> 	JGCH,= 	J* 	J 3  =d38nd9oxQRS= = 
$k1	2	= =rW   rc   )Kr   logging
contextlibr   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   r   r   langchain_core.messagesr   r   r   r   r   r   r   r   r   r   r   *langchain_core.output_parsers.openai_toolsr    r!   langchain_core.outputsr"   r#   r$   langchain_core.runnablesr%   langchain_core.toolsr&   langchain_core.utilsr'   r(   r)   %langchain_core.utils.function_callingr*   pydanticr+   r,   r-   r.   r/   (langchain_community.chat_models.llamacppr0   r1   	getLoggerr   r   r   r  rF   rO   rS   rV   ra   rc   rh   rW   rE   <module>r     sA     *     > 
    S R - ) 
 I 
 
		8	$D  k  d  F&7GCH$5 &7+ &7R.38.-12B-C..$ $$$#&$25$$ $(N== N=rW   