
    7|hSV                        d dl Z d dl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mZmZmZ d dlZd dlmZmZ d dl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( d d	l)m*Z*m+Z+m,Z, d d
l-m.Z. d dl/m0Z0 d dl1m2Z2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z;m<Z< d dl=m>Z>m?Z?  ej                  eA      ZBdZCdedeDfdZEdeeFef   defdZGdeeFef   dee   defdZHededeFdeFdedef
d       ZI G d de      ZJy)    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                    | j                   }t        | t              r| j                  |d}|S t        | t              rd|d}|S t        | t
              rd|d}d| j                  v r| j                  d   |d<   |S | j                  s| j                  rJ| j                  D cg c]  }t        |       c}| j                  D cg c]  }t        |       c}z   |d<   |S t        | t              r:d| j                  || j                  xs | j                  j                  d      d}|S t        | t              rd|d}|S t!        d	|        c c}w c c}w )
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       g/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/chat_models/baichuan.py_convert_message_to_dictrF   I   sw   ooG';' 'A8 7 
G\	* &7;4 3 
GY	' +@7444)0)B)B<)PL&, ) 7#=#=@G@R@R*:<1"5* "44 :"=*L&&  
G[	)#00LLIG$=$=$A$A&$I	
  
G]	+ (W=  +G9566#*s   "EE_dictc           
         | d   }| j                  dd      }|dk(  rt        |      S |dk(  rQg }g }i }| j                  d      x}r)||d<   |D ]  }	 |j                  t        |d	             ! t        ||||
      S |dk(  r+i }d| v r| d   |d<   t        || j                  d      |      S |dk(  rt        |      S t        ||      S # t        $ r.}|j                  t        |t        |                   Y d }~d }~ww xY w)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   sB   =Dii	2&Gv~G,,		
"YY|44>4.<l+!/ %%omt&TU /!1	
 	
 
U?(-ff%>2/
 	

 
	W--766/ ! &--.}c!fE s   C	D$C??Ddefault_classc                 ,   | 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 )	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d;;W--    clientmethodurlkwargsc                   K   ddl m}  | j                  ||fi |4 d{   } ||       ddd      d{    y7  7 # 1 d{  7  sw Y   yxY ww)a  Async 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}}VS3F3 $ $x(##$ $ $ $ $ $ $sA   AAAAAAAAAAAAc                       e Zd ZU dZedeeef   fd       Zedefd       Z	 e
ed      Zeed<   	  e
d	      Zeed
<   	 dZee   ed<   	 dZeed<   	 dZee   ed<   	  e
dd      Zeed<   	 dZeed<   	  e
d      Zee   ed<   	 dZeed<   	 dZeed<   	 dZeed<   	  e
e      Zeeef   ed<   	  ed       Z  e!d!"      e"d#eeef   defd$              Z# e!d!"      e"d#edefd%              Z$edeeef   fd&       Z%	 	 d8d'e&e'   d(ee&e      d)ee(   d*ede)f
d+Z*	 	 d8d'e&e'   d(ee&e      d)ee(   d*ede+e,   f
d,Z-	 	 	 d9d'e&e'   d(ee&e      d)ee.   d-ee   d*ede)fd.Z/	 	 d8d'e&e'   d(ee&e      d)ee.   d*ede0e,   f
d/Z1d'e&e'   d*ede2jf                  fd0Z4d'e&e'   deeef   fd1Z5deeef   fd2Z6d3e7eef   de)fd4Z8edefd5       Z9d6e:e;eeef   e<e=   e>e?f      d*ede@eAe'f   f fd7ZB xZCS ):ChatBaichuanu  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                 
    ddiS )Nbaichuan_api_keyBAICHUAN_API_KEY selfs    rE   
lc_secretszChatBaichuan.lc_secrets[  s      2
 	
rW   c                      y)NTrg   rh   s    rE   lc_serializablezChatBaichuan.lc_serializablea  s    rW   base_url)defaultaliasbaichuan_api_baseapi_key)ro   re   Nbaichuan_secret_keyF	streaming
max_tokens<   timeoutrequest_timeoutzBaichuan2-Turbo-192Kmodel333333?)rn   temperature   top_k333333?top_pwith_search_enhance)default_factorymodel_kwargsT)populate_by_namebefore)modevaluesc           
      `   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)   rA   list
ValueErrorloggerwarningpopintersectionkeys)clsr   all_required_field_namesextra
field_nameinvalid_model_kwargss         rE   build_extrazChatBaichuan.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 
 "'~rW   c                 f    t        |ddt              |d<   t        t        |ddgd            |d<   |S )Nrp   BAICHUAN_API_BASEre   rq   rf   )r(   DEFAULT_API_BASEr'   )r   r   s     rE   validate_environmentz!ChatBaichuan.validate_environment  sO     ';	'
"# &; #Y/"&
!" rW   c                     | j                   | j                  | j                  | j                  | j                  | j
                  d}i || j                  S )z4Get the default parameters for calling Baichuan API.)rx   rz   r~   r|   r_   rt   )rx   rz   r~   r|   rs   rt   r   )ri   normal_paramss     rE   _default_paramszChatBaichuan._default_params  sO     ZZ++ZZZZnn//
 6-54#4#455rW   messagesstoprun_managerr[   c                     | j                   r! | j                  d|||d|}t        |      S  | j                  |fi |}|j                  dk7  rt        d|       |j                         }| j                  |      S )N)r   r   r      "Error from Baichuan api response: rg   )rs   _streamr   _chatstatus_coder   json_create_chat_result)ri   r   r   r   r[   stream_iterresr`   s           rE   	_generatezChatBaichuan._generate  s     >>&$,, !+IOK (44djj,V,??c!A#GHH88:''11rW   c              +   J  K    | j                   |fddi|}|j                  dk7  rt        d|       t        }|j	                         D ]  }|j                  d      j                  d      }|j                  dd      }t        |      dkD  r|d   nd }|M|d	k(  r y t        j                  |      }	|	j                  d
      D ]X  }
t        |
j                  d      |      }|j                  }t        |      }|r|j                  |j                   |       | Z  y w)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   )ri   r   r   r   r[   r   default_chunk_classr   partsr`   mcg_chunks               rE   r   zChatBaichuan._stream  s!     djj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                    K   ||n| j                   }|r) | j                  |f||d|}t        |       d {   S  | j                  di |} | j                  |fi |}	dd l}
|
j                  || j                        4 d {   }|j                  | j                  |	       d {   }|j                          d d d       d {    | j                  j                               S 7 7 j7 G7 )# 1 d {  7  sw Y   9xY ww)N)r   r   r   headersrv   r   rg   )rs   _astreamr   _create_headers_parameters_create_payload_parametershttpxAsyncClientrw   postrp   raise_for_statusr   r   )ri   r   r   r   r_   r[   should_streamr   r   payloadr   rX   r`   s                rE   
_ageneratezChatBaichuan._agenerate  s     #)"4$..'$--#@FK /{;;;1$11;F;1$11(EfE$$T%9%9 % 
 	( 	(#[[)?)?g[NNH%%'		( 	(
 ''88 <	( O	( 	( 	( 	(sj   7DC1ADC3	D!C9-C5.C9DC7$D3D5C97D9D?D DDc                  K    | j                   di |} | j                  |fddi|}dd l}|j                  || j                        4 d {   }t        |d| j                  |      4 d {   }	|	j                         2 3 d {   }
t        j                  |
j                        }t        |d         dk(  r:|d   d   }t        |d   t              }|j                  d	d       }|d	|ind }t        ||
      }|r%|j!                  |j"                  |       d {    | | d d d       d {    d d d       d {    y 7 7 7 7 56 ,7  # 1 d {  7  sw Y   0xY w7 '# 1 d {  7  sw Y   y xY ww)Nr_   Tr   r   POSTr   r   r   finish_reason)r2   generation_infor   rg   )r   r   r   r   rw   ra   rp   	aiter_sser   r   datar   rV   r   rA   r#   r   text)ri   r   r   r   r[   r   r   r   rX   event_sourcesser   choicer   r   s                  rE   r   zChatBaichuan._astream  s     2$11;F;1$11(R4R6R$$T%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E71E2E75E E
E
EBE $E
%E 1E 2E7=E>E7FE5FE7EE E E7 E2	&E)'E2	.E75F7F	=F >F	Fc                      | j                   |fi |}| j                  } | j                  di |}t        j                  || j
                  ||| j                        }|S )N)rZ   rv   r   r   r_   rg   )r   rp   r   requestsr   rw   rs   )ri   r   r[   r   rZ   r   r   s          rE   r   zChatBaichuan._chat4  sg    1$11(EfE$$1$11;F;mm((>>
 
rW   c           	      n   i | j                   |}|j                  dd      }|j                  dd      }|j                  dd      }|j                  d      }|j                  dd	      }|j                  d
d	      }	|j                  dg       }
||D cg c]  }t        |       c}|||||	|
d}|S c c}w )Nrz   ry   r|   r{   r~   r}   rx   r   Fr_   tools)rx   r   r|   r~   rz   r   r_   r   )r   r   rF   )ri   r   r[   
parametersrz   r|   r~   rx   r   r_   r   r   r   s                rE   r   z'ChatBaichuan._create_payload_parametersB  s     8,,77
 nn]C8w*w-w'(nn-BEJ%0w+ >FG1!4G&#6	
  Hs   B2c                     i | j                   |}|j                  di       }d}| j                  r| j                  j                         }dd| d|}|S )Nr   rI   zapplication/jsonzBearer )zContent-TypeAuthorization)r   r   re   get_secret_value)ri   r[   r   default_headersrq   r   s         rE   r   z'ChatBaichuan._create_headers_parameters[  sp    7,,77
$..B7  ++<<>G /&wi0
 

 rW   r`   c                     g }|d   D ]-  }t        |d         }t        |      }|j                  |       / |d   }|| j                  d}t	        ||      S )Nr   r2   r   usage)token_usagerx   )generations
llm_output)rS   r"   rM   rx   r$   )ri   r`   r   cr2   genr   r   s           rE   r   z ChatBaichuan._create_chat_resulti  sh    )$ 	$A.q|<G 1Cs#	$
 w'%04::F
kjIIrW   c                      y)Nzbaichuan-chatrg   rh   s    rE   	_llm_typezChatBaichuan._llm_typet  s    rW   r   c                 `    |D cg c]  }t        |       }}t        |   dd|i|S c c}w )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   rg   )r*   superbind)ri   r   r[   r:   formatted_toolsr   s        rE   
bind_toolszChatBaichuan.bind_toolsx  s=    " EJJD1$7JJw|</<V<< Ks   +)NN)NNN)D__name__
__module____qualname____doc__propertyr   rO   rj   boolrl   r-   r   rp   __annotations__re   r.   rr   r   rs   rt   intrw   rx   rz   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   __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 [)	c3h2d38n 	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   rg   rW   rE   <module>r	     sC     *     > 
    S R - ) 
 I 
 
		8	$D  k  d  F&7GCH$5 &7+ &7R.38.-12B-C..$ $$$#&$25$$ $(N== N=rW   