
    hh&                         d dl Z d dlmZmZmZmZmZmZ d dlm	Z	m
Z
 d dlmZ d dl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mZ  e j        e          Z G d d	ed
          Z G d de          Z dS )    N)AnyDictListMappingOptionalcast)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseChatModel)	AIMessageBaseMessageChatMessageFunctionMessageHumanMessageSystemMessage)ChatGeneration
ChatResult)	BaseModel
ConfigDictField	SecretStrc                   b    e Zd ZU dZdZeed<   dZee	e
                  ed<   dZee         ed<   dS )
ChatParamsz,Parameters for the `Javelin AI Gateway` LLM.g        temperatureNstop
max_tokens)__name__
__module____qualname____doc__r   float__annotations__r   r   r   strr   int     o/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/langchain_community/chat_models/javelin_ai_gateway.pyr   r      sU         66K $D(49
$$$ $J$$$$$r&   r   allow)extrac                       e Zd ZU dZeed<   	 dZee         ed<   	 dZee	         ed<   	 dZ
eed<   	  edd          Zee         ed	<   	  ed
          Zdef fdZedeeef         fd            Z	 	 ddee         deee                  dee         dedef
dZ	 	 ddee         deee                  dee         dedef
dZedeeef         fd            Z	 d deee                  dedeeef         f fdZedefd            Zede eef         defd            Z!ed!d            Z"edede#fd            Z$ede eef         defd            Z% xZ&S )"ChatJavelinAIGatewaya$  `Javelin AI Gateway` chat models API.

    To use, you should have the ``javelin_sdk`` python package installed.
    For more information, see https://docs.getjavelin.io

    Example:
        .. code-block:: python

            from langchain_community.chat_models import ChatJavelinAIGateway

            chat = ChatJavelinAIGateway(
                gateway_uri="<javelin-ai-gateway-uri>",
                route="<javelin-ai-gateway-chat-route>",
                params={
                    "temperature": 0.1
                }
            )
    routeNgateway_uriparamsclientapi_key)aliasjavelin_api_keyT)populate_by_namekwargsc                 X   	 ddl m}m} n# t          $ r t          d          w xY w t	                      j        di | | j        ra	  || j        t          t          | j	                  
                                          | _        d S # |$ r}t          d          |d }~ww xY wd S )Nr   )JavelinClientUnauthorizedErrorz^Could not import javelin_sdk python package. Please install it with `pip install javelin_sdk`.)base_urlr0   zJavelin: Incorrect API Key.r%   )javelin_sdkr6   r7   ImportErrorsuper__init__r-   r   r   r2   get_secret_valuer/   
ValueError)selfr4   r6   r7   e	__class__s        r'   r<   zChatJavelinAIGateway.__init__K   s   		          	 	 	D  	 	""6""" 	GG+m!- D,@AARRTT   % G G G !>??QFG	G 	Gs!    &
AB B'B""B'returnc                     | j         t          t          | j                                                  | j        d| j        r| j                                        ni }|S )N)r-   r2   r,   )r-   r   r   r2   r=   r,   r.   dict)r?   r.   s     r'   _default_paramsz$ChatJavelinAIGateway._default_paramsa   sb      +#It/CDDUUWWZ"
 "
 &*[8t{!!!b	"
 r&   messagesr   run_managerc                     d |D             }d|i| j         r| j                                         ni }| j                            | j        |          }t
                              |                                          S )Nc                 B    g | ]}t                               |          S r%   r+   _convert_message_to_dict.0messages     r'   
<listcomp>z2ChatJavelinAIGateway._generate.<locals>.<listcomp>r   6     
 
 
 !99'BB
 
 
r&   rF   
query_body)r.   rD   r/   query_router,   r+   _create_chat_resultr?   rF   r   rG   r4   message_dictsdataresps           r'   	_generatezChatJavelinAIGateway._generatek   s    
 
#
 
 

  
%)[8t{!!!b 

 {&&tzd&CC#77		DDDr&   c                   K   d |D             }d|i| j         r| j                                         ni }| j                            | j        |           d {V }t
                              |                                          S )Nc                 B    g | ]}t                               |          S r%   rJ   rL   s     r'   rO   z3ChatJavelinAIGateway._agenerate.<locals>.<listcomp>   rP   r&   rF   rQ   )r.   rD   r/   aquery_router,   r+   rT   rU   s           r'   
_ageneratezChatJavelinAIGateway._agenerate   s      
 
#
 
 

  
%)[8t{!!!b 

 [--djT-JJJJJJJJ#77		DDDr&   c                     | j         S N)rE   r?   s    r'   _identifying_paramsz(ChatJavelinAIGateway._identifying_params   s    ##r&   c                 L    i | j          t                      j        dd|i|S )z>Get the parameters used to invoke the model FOR THE CALLBACKS.r   r%   )rE   r;   _get_invocation_params)r?   r   r4   rA   s      r'   rc   z+ChatJavelinAIGateway._get_invocation_params   s<    
"
,egg,AA$A&AA
 	
r&   c                     dS )zReturn type of chat model.zjavelin-ai-gateway-chatr%   r`   s    r'   	_llm_typezChatJavelinAIGateway._llm_type   s
     )(r&   _dictc                     | d         }| d         }|dk    rt          |          S |dk    rt          |          S |dk    rt          |          S t          ||          S )Nrolecontentuser)ri   	assistantsystem)ri   rh   )r   r   r   r   )rf   rh   ri   s      r'   _convert_dict_to_messagez-ChatJavelinAIGateway._convert_dict_to_message   sz    V}	"6>>0000[  W----X 1111wT::::r&   c                       t          d          )N|Function messages are not supported by the Javelin AI Gateway. Please create a feature request at https://docs.getjavelin.io)r>   r%   r&   r'   _raise_functions_not_supportedz3ChatJavelinAIGateway._raise_functions_not_supported   s    F
 
 	
r&   rN   c                    t          | t                    r| j        | j        d}nt          | t                    rd| j        d}nvt          | t
                    rd| j        d}nVt          | t                    rd| j        d}n6t          | t                    rt          d          t          d|            d| j	        v rt                                           | j	        r t                              d| j	                   |S )	N)rh   ri   rj   rk   rl   ro   zGot unknown message type: function_callz[Additional message arguments are unsupported by Javelin AI Gateway  and will be ignored: %s)
isinstancer   rh   ri   r   r   r   r   r>   additional_kwargsr+   rp   loggerwarning)rN   message_dicts     r'   rK   z-ChatJavelinAIGateway._convert_message_to_dict   s,   g{++ 	E$+LW_MMLL.. 	E$*wGGLL++ 
	E$/GOLLLL// 	E$,IILL11 	EJ  
 C'CCDDDg777 ??AAA$ 	NN+)  
 r&   responsec                 H   g }| d         d         D ]k}t                               |d                   }|                    di           }t          |t	          |                    }|                    |           l|                     di           }t          ||          S )Nllm_responsechoicesrN   metadata)rN   generation_info)generations
llm_output)r+   rm   getr   rD   appendr   )rx   r~   	candidaterN   message_metadatagenresponse_metadatas          r'   rT   z(ChatJavelinAIGateway._create_chat_result   s    !.1)< 		$ 		$I*CC)$ G  )}}Z<<  $%5 6 6  C s####$LLR88k>OPPPPr&   )NNr_   )rB   N)'r   r   r   r    r#   r"   r-   r   r.   r   r/   r   r   r2   r   r   model_configr<   propertyr   rE   r   r   r
   r   rY   r	   r]   ra   rc   re   staticmethodr   rm   rp   rD   rK   rT   __classcell__)rA   s   @r'   r+   r+   $   sa         & JJJ:!%K#%%%1#'FHZ '''4FC+05Y+G+G+GOXi(GGG1:  LG G G G G G G, c3h    X %):>	E E{#E tCy!E 67	E
 E 
E E E E. %)?C	E E{#E tCy!E ;<	E
 E 
E E E E( $T#s(^ $ $ $ X$ +/
 
T#Y'
:=
	c3h
 
 
 
 
 
 )3 ) ) ) X) 
;S(9 
;k 
; 
; 
; \
; 
 
 
 \
 + $    \6 Qgc3h&7 QJ Q Q Q \Q Q Q Q Qr&   r+   )!loggingtypingr   r   r   r   r   r   langchain_core.callbacksr	   r
   *langchain_core.language_models.chat_modelsr   langchain_core.messagesr   r   r   r   r   r   langchain_core.outputsr   r   pydanticr   r   r   r   	getLoggerr   ru   r   r+   r%   r&   r'   <module>r      s    ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;        E D D D D D                       = < < < < < < < < < < <		8	$	$
% % % % %' % % % %@Q @Q @Q @Q @Q= @Q @Q @Q @Q @Qr&   