
    NgSV                        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          ZJdS )    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                 8   | j         }t          | t                    r| j        |d}nt          | t                    rd|d}nt          | t
                    rTd|d}d| j        v r| j        d         |d<   n| j        s| j        r&d | j        D             d | j        D             z   |d<   nnt          | t                    r,d| j
        || j        p| j                            d          d	}n-t          | t                    rd
|d}nt          d|            |S )N)rolecontentuser	assistant
tool_callsc                 ,    g | ]}t          |          S  )r2   .0tcs     d/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/baichuan.py
<listcomp>z,_convert_message_to_dict.<locals>.<listcomp>V   s.     * * *:<1"55* * *    c                 ,    g | ]}t          |          S r<   )r1   r=   s     r@   rA   z,_convert_message_to_dict.<locals>.<listcomp>X   s0        :"==  rB   toolname)r6   tool_call_idr7   rE   systemzGot unknown type )r7   
isinstancer   r6   r   r   additional_kwargsr:   invalid_tool_callsr   rF   rE   getr   	TypeError)r3   r7   message_dicts      r@   _convert_message_to_dictrN   I   sx   oG';'' 7 'AA	G\	*	* 7 &7;;	GY	'	' 7 +@@7444)0)B<)PL&& 	7#= 	* *@G@R* * * !4  *L& 
G[	)	) 7#0LIG$=$A$A&$I$I	
 
 
G]	+	+ 7 (W==5G55666rB   _dictc           
         | d         }|                      dd          }|dk    rt          |          S |dk    rg }g }i }|                      d          x}rv||d<   |D ]n}	 |                    t          |d	                     (# t          $ r:}|                    t          |t          |                               Y d }~gd }~ww xY wt          ||||
          S |dk    r6i }d| v r| d         |d<   t          ||                      d          |          S |dk    rt          |          S t          ||          S )Nr6   r7    r8   r7   r9   r:   T)	return_id)r7   rI   r:   rJ   rD   rE   rF   )r7   rF   rI   rG   r7   r6   )rK   r   appendr!   	Exceptionr    strr   r   r   r   )	rO   r6   r7   r:   rJ   rI   raw_tool_callsraw_tool_calles	            r@   _convert_dict_to_messager[   l   s   =Dii	2&&Gv~~G,,,,			
"YY|444> 	.<l+!/  %%omt&T&T&TUUUU    &--.}c!ffEE       
 /!1	
 
 
 	
 
U??(-ff%>22/
 
 
 	

 
		W----76666s   "$B
C0CCdefault_classc                 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 )	Nr6   r7   rQ   r8   rR   r9   rG   rT   )rK   r   r   r   r   )rO   r\   r6   r7   s       r@   _convert_delta_to_message_chunkr^      s     99VDii	""(bGv~~*;;; 1111			 ? ?g....			].@@@!'2222	 ."222d;;;;}W----rB   clientmethodurlkwargsc                   K   ddl m}  | j        ||fi |4 d{V } ||          W V  ddd          d{V  dS # 1 d{V swxY w Y   dS )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_sserd   stream)r_   r`   ra   rb   rd   responses         r@   aconnect_httpx_sserh      s
      &%%%%%v}VS33F33 $ $ $ $ $ $ $xk(######$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s   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e2j3        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'
            }

    r4   c                 
    ddiS )Nbaichuan_api_keyBAICHUAN_API_KEYr<   selfs    r@   
lc_secretszChatBaichuan.lc_secrets[  s      2
 	
rB   c                     dS )NTr<   rn   s    r@   lc_serializablezChatBaichuan.lc_serializablea  s    trB   base_url)defaultaliasbaichuan_api_baseapi_key)ru   rl   Nbaichuan_secret_keyF	streaming
max_tokens<   timeoutrequest_timeoutzBaichuan2-Turbo-192Kmodel333333?)rt   temperature   top_k333333?top_pwith_search_enhance)default_factorymodel_kwargsT)populate_by_name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)   rK   list
ValueErrorloggerwarningpopintersectionkeys)clsr   all_required_field_namesextra
field_nameinvalid_model_kwargss         r@   build_extrazChatBaichuan.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  
 "'~rB   c                     t          |ddt                    |d<   t          t          |ddgd                    |d<   |S )Nrv   BAICHUAN_API_BASErl   rw   rm   )r(   DEFAULT_API_BASEr'   )r   r   s     r@   validate_environmentz!ChatBaichuan.validate_environment  s^     ';	'
 '
"# &; #Y/" &
 &
!" rB   c                 f    | j         | j        | j        | j        | j        | j        d}i || j        S )z4Get the default parameters for calling Baichuan API.)r~   r   r   r   rf   rz   )r~   r   r   r   ry   rz   r   )ro   normal_paramss     r@   _default_paramszChatBaichuan._default_params  sD     Z+ZZn/
 
 6-54#455rB   messagesstoprun_managerrb   c                     | j         r  | j        d|||d|}t          |          S  | j        |fi |}|j        dk    rt          d|           |                                }|                     |          S )N)r   r   r      "Error from Baichuan api response: r<   )ry   _streamr   _chatstatus_coder   json_create_chat_result)ro   r   r   r   rb   stream_iterresrg   s           r@   	_generatezChatBaichuan._generate  s     > 	5&$, !+ IO K (444dj,,V,,?c!!G#GGHHH88::''111rB   c              +   ~  K    | j         |fddi|}|j        dk    rt          d|           t          }|                                D ]}|                    d                              d          }|                    dd          }t          |          dk    r|d         nd }|`|d	k    r d S t          j
        |          }	|	                    d
          D ]^}
t          |
                    d          |          }|j        }t          |          }|r|                    |j        |           |V  _d S )Nrf   Tr   r   zutf-8z
zdata:    z[DONE]choicesdeltar3   chunk)r   r   r   r   
iter_linesdecodestripsplitlenr   loadsrK   r^   	__class__r#   on_llm_new_tokenr7   )ro   r   r   r   rb   r   default_chunk_classr   partsrg   mcg_chunks               r@   r   zChatBaichuan._stream  sq      dj99$9&99?c!!G#GGHHH,^^%% 	 	ELL))//77EKK!,,E #E

QE!HHDE}  z%((H\\),,  7EE'NN$7  ',o#.u=== P00h0OOO	 	rB   rf   c                   K   ||n| j         }|r& | j        |f||d|}t          |           d {V S  | j        di |} | j        |fi |}	dd l}
|
                    || j                  4 d {V 	 }|                    | j	        |	           d {V }|
                                 d d d           d {V  n# 1 d {V swxY w Y   |                     |                                          S )N)r   r   r   headersr|   r   r<   )ry   _astreamr   _create_headers_parameters_create_payload_parametershttpxAsyncClientr}   postrv   raise_for_statusr   r   )ro   r   r   r   rf   rb   should_streamr   r   payloadr   r_   rg   s                r@   
_ageneratezChatBaichuan._agenerate  s      #)"4$. 	<'$-# @F K /{;;;;;;;;;1$1;;F;;1$1(EEfEE$$T%9 % 
 
 	( 	( 	( 	( 	( 	( 	( 	(#[[)?g[NNNNNNNNH%%'''		( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(
 ''888s   87C
CCc                  K    | j         di |} | j        |fddi|}dd l}|                    || j                  4 d {V 	 }t          |d| j        |          4 d {V 	 }	|	                                2 3 d {V }
t          j	        |
j
                  }t          |d                   dk    r:|d         d         }t          |d         t                    }|                    d	d           }|d	|ind }t          ||
          }|r"|                    |j        |           d {V  |W V  | n6 	 d d d           d {V  n# 1 d {V swxY w Y   d d d           d {V  d S # 1 d {V swxY w Y   d S )Nrf   Tr   r   POSTr   r   r   finish_reason)r3   generation_infor   r<   )r   r   r   r   r}   rh   rv   	aiter_sser   r   datar   r^   r   rK   r#   r   text)ro   r   r   r   rb   r   r   r   r_   event_sourcesser   choicer   r   s                  r@   r   zChatBaichuan._astream  s.      2$1;;F;;1$1(RR4R6RR$$T%9 % 
 
 	 	 	 	 	 	 	 	) 6W          !-!7!7!9!9       # Jsx00E5+,,11 "9-a0F;w E %+JJ$E$EM )4 )-88! $
 0 %  E # T)::5:U:SSSSSSSSSKKKK$0 1+ ":!9                          	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	sC   E4'E<D<B;E>E4
E	E4E	E44
E>E>c                      | j         |fi |}| j        } | j        di |}t          j        || j        ||| j                  }|S )N)ra   r|   r   r   rf   r<   )r   rv   r   requestsr   r}   ry   )ro   r   rb   r   ra   r   r   s          r@   r   zChatBaichuan._chat4  sm    1$1(EEfEE$1$1;;F;;m(>
 
 
 
rB   c           	      x   i | j         |}|                    dd          }|                    dd          }|                    dd          }|                    d          }|                    dd	          }|                    d
d	          }	|                    dg           }
|d |D             |||||	|
d}|S )Nr   r   r   r   r   r   r~   r   Frf   toolsc                 ,    g | ]}t          |          S r<   )rN   )r>   r   s     r@   rA   z;ChatBaichuan._create_payload_parameters.<locals>.<listcomp>P  s!    GGG1!44GGGrB   )r~   r   r   r   r   r   rf   r   )r   r   )ro   r   rb   
parametersr   r   r   r~   r   rf   r   r   s               r@   r   z'ChatBaichuan._create_payload_parametersB  s     8,77
 nn]C88w**w--w''(nn-BEJJ%00w++ GGhGGG&#6	
 	
 rB   c                     i | j         |}|                    di           }d}| j        r| j                                        }dd| d|}|S )Nr   rQ   zapplication/jsonzBearer )zContent-TypeAuthorization)r   r   rl   get_secret_value)ro   rb   r   default_headersrw   r   s         r@   r   z'ChatBaichuan._create_headers_parameters[  sx    7,77
$..B77  	?+<<>>G /0w00
 
 

 rB   rg   c                     g }|d         D ]<}t          |d                   }t          |          }|                    |           =|d         }|| j        d}t	          ||          S )Nr   r3   r   usage)token_usager~   )generations
llm_output)r[   r"   rU   r~   r$   )ro   rg   r   cr3   genr   r   s           r@   r   z ChatBaichuan._create_chat_resulti  s    )$ 	$ 	$A.q|<<G 111Cs####w'%04:FF
kjIIIIrB   c                     dS )Nzbaichuan-chatr<   rn   s    r@   	_llm_typezChatBaichuan._llm_typet  s    rB   r   c                 R    d |D             } t                      j        dd|i|S )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.
        c                 ,    g | ]}t          |          S r<   r*   )r>   rD   s     r@   rA   z+ChatBaichuan.bind_tools.<locals>.<listcomp>  s!    JJJD1$77JJJrB   r   r<   )superbind)ro   r   rb   formatted_toolsr   s       r@   
bind_toolszChatBaichuan.bind_toolsx  s:    " KJEJJJuww|<</<V<<<rB   )NN)NNN)D__name__
__module____qualname____doc__propertyr   rW   rp   boolrr   r.   r   rv   __annotations__rl   r/   rx   r   ry   rz   intr}   r~   r   floatr   r   r   dictr   r   r-   model_configr0   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   @r@   rj   rj      s        \ \| 
DcN 
 
 
 X

     X #U+;:NNNsNNN#"'%i"8"8"8i888/3),333UIt/ $J$$$/ 59===OS===0'E3'''/#(5#5#5#5K%555+E3NNN.E5' %%%%8#(5#>#>#>L$sCx.>>>Q:  L _(###c3h C    [ $#2 _(###$ 3    [ $#  6c3h 6 6 6 X6  %):>	2 2{#2 tCy!2 67	2
 2 
2 2 2 2, %):>	 {# tCy! 67	
  
%	&   B %)?C!%9 9{#9 tCy!9 ;<	9
 9 9 
9 9 9 9< %)?C	' '{#' tCy!' ;<	'
 ' 
*	+' ' ' 'Rd;/ 3 8CT    [)	c3h   2d38n    	JGCH,= 	J* 	J 	J 	J 	J 3    X=d38nd9oxQRS= = 
$k1	2	= = = = = = = = = =rB   rj   )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/   r0   (langchain_community.chat_models.llamacppr1   r2   	getLoggerr   r   r   r   rN   rW   r[   r^   rh   rj   r<   rB   r@   <module>r     s     * * * * * *                                  > = = = = =         
                                 S R R R R R R R R R - - - - - - ) ) ) ) ) )         
 I H H H H H                    
 
	8	$	$D  k  d        F&7GCH$5 &7+ &7 &7 &7 &7R.38.-12B-C.. . . .$ $$$#&$25$$ $ $ $(N= N= N= N= N== N= N= N= N= N=rB   