
    Ng%'                    "   d Z ddlmZ ddlZddl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 ddlZddlmZ ddl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 dd
l m!Z! ddl"m#Z#m$Z$m%Z% ddl&m'Z' dZ(dZ) ej*        e+          Z, G d de#          Z-dS )zKonkoAI chat wrapper.    )annotationsN)	AnyDictIteratorListOptionalSetTupleUnioncast)CallbackManagerForLLMRun)AIMessageChunkBaseMessage)ChatGenerationChunk
ChatResult)convert_to_secret_strget_from_dict_or_envpre_init)Field	SecretStrconvert_message_to_dict)
ChatOpenAI_convert_delta_to_message_chunkgenerate_from_stream)is_openai_v1zhttps://api.konko.ai/v1zmeta-llama/Llama-2-13b-chat-hfc                      e Zd ZU dZed;d            Zed<d            ZdZde	d	<    e
ed
          Zde	d
<   	 dZde	d<   	  e
e          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<   	 dZde	d<   	 ed=d!            Zed>d"            Zeddefd?d&            Z	 d@dAd*Z	 	 dBdCd0Z	 	 	 dDdEd4ZdFd6Zed>d7            Z ed>d8            Z!	 d@dG fd9Z"edHd:            Z# xZ$S )I	ChatKonkoa  `ChatKonko` Chat large language models API.

    To use, you should have the ``konko`` python package installed, and the
    environment variable ``KONKO_API_KEY`` and ``OPENAI_API_KEY`` set with your API key.

    Any parameters that are valid to be passed to the konko.create call can be passed
    in, even if not explicitly saved on this class.

    Example:
        .. code-block:: python

            from langchain_community.chat_models import ChatKonko
            llm = ChatKonko(model="meta-llama/Llama-2-13b-chat-hf")
    returnDict[str, str]c                    dddS )NKONKO_API_KEYOPENAI_API_KEY)konko_api_keyopenai_api_key selfs    a/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/konko.py
lc_secretszChatKonko.lc_secrets=   s    !0DTUUU    boolc                    dS )z9Return whether this model can be serialized by Langchain.Fr&   )clss    r)   is_lc_serializablezChatKonko.is_lc_serializableA   s	     ur+   Nr   clientmodel)defaultaliasstrgffffff?floattemperature)default_factoryDict[str, Any]model_kwargszOptional[str]r%   r$      intmax_retriesF	streaming   n   
max_tokensvaluesr   c                   t          t          |dd                    |d<   	 ddl}n# t          $ r t          d          w xY w	 t	                      r|j        j        |d<   n
|j        |d<   n# t          $ r t          d          w xY wt          |d          st          j        d	           |d
         dk     rt          d          |d
         dk    r|d         rt          d          |S )z?Validate that api key and python package exists in environment.r$   r"   r   NzRCould not import konko python package. Please install it with `pip install konko`.r0   z`konko` has no `ChatCompletion` attribute, this is likely due to an old version of the konko package. Try upgrading it with `pip install --upgrade konko`._is_legacy_openaizhYou are using an older version of the 'konko' package. Please consider upgrading to access new features.r?   r>   zn must be at least 1.r=   zn must be 1 when streaming.)r   r   konkoImportErrorr   chatcompletionsChatCompletionAttributeError
ValueErrorhasattrwarningswarn)r.   rB   rE   s      r)   validate_environmentzChatKonko.validate_environmentX   sC    #8 /JJ#
 #
	LLLL 	 	 	>  	

	~~ 8#(:#9x  #(#7x  	 	 	6  	 u122 	MD  
 #;??4555#;??vk2?:;;;s   ( A(A/ /B	c                R    | j         | j        | j        | j        | j        d| j        S )z1Get the default parameters for calling Konko API.)r1   rA   streamr?   r6   )r1   rA   r=   r?   r6   r9   r'   s    r)   _default_paramszChatKonko._default_params~   s:     Z/n+
 
 
 	
r+   Union[str, SecretStr, None]konko_api_baseSet[str]c                   |s1	 t          t          j        d                   }n4# t          $ r Y n(w xY wt	          |t
                    rt          |          }| s>	 t          t          j        d                   } nA# t          $ r t          d          w xY wt	          | t
                    rt          |           } | d}dd|                                  i}|r*t          t          |                                          |d<   t          j        ||          }|j        d	k    rt          d
| d|j                   d |                                d         D             S )z$Get available models from Konko API.r#   r"   z^Konko API key must be passed as keyword argument or set in environment variable KONKO_API_KEY.z/modelsAuthorizationzBearer zX-OpenAI-Api-Key)headers   zError getting models from z: c                    h | ]
}|d          S )idr&   ).0r1   s     r)   	<setcomp>z1ChatKonko.get_available_models.<locals>.<setcomp>   s    HHHdHHHr+   data)r   osenvironKeyError
isinstancer4   rK   get_secret_valuer   r   requestsgetstatus_codejson)r$   r%   rT   
models_urlrX   models_responses         r)   get_available_modelszChatKonko.get_available_models   s     	C!6rzBR7S!T!T   ,, 	C2>BBN  		A 5bj6Q R R    A  
 s++ 	A1-@@M&///
 I}'E'E'G'GII
  	!*.>+ +   &' #,z7CCC&#--1Z 1 1".1 1  
 IH)=)=)?)?)GHHHHs   $ 
11A; ;Brun_manager"Optional[CallbackManagerForLLMRun]kwargsc                      d fd} |di |S )Nrm   r   r   c                 (     j         j        di | S )Nr&   )r0   create)rm   r(   s    r)   _completion_with_retryz?ChatKonko.completion_with_retry.<locals>._completion_with_retry   s    %4;%/////r+   )rm   r   r   r   r&   r&   )r(   rk   rm   rq   s   `   r)   completion_with_retryzChatKonko.completion_with_retry   s:    	0 	0 	0 	0 	0 	0 &%/////r+   messagesList[BaseMessage]stopOptional[List[str]]Iterator[ChatGenerationChunk]c              +    K   |                      ||          \  }}i ||ddi}t          } | j        d||d|D ]}t          |d                   dk    r|d         d         }	t	          |	d         |          }|	                    d          }
|
t          |
          nd }|j        }t          ||	          }|r|	                    |j
        |
           |V  d S )NrQ   Trs   rk   choicesr   deltafinish_reason)r|   )messagegeneration_info)chunkr&   )_create_message_dictsr   rr   lenr   re   dict	__class__r   on_llm_new_tokentext)r(   rs   ru   rk   rm   message_dictsparamsdefault_chunk_classr   choicer|   r~   cg_chunks                r)   _streamzChatKonko._stream   sJ      !% : :8T J Jv5F5f5h55,/T/ 
"
 
?E
 
 	 	E 5#$$))9%a(F3w!4 E #JJ77M5B5N=1111TX  #(/*  H  L,,X](,KKKNNNN'	 	r+   rQ   Optional[bool]r   c                    ||n| j         }|r  | j        |f||d|}t          |          S |                     ||          \  }}	i |	|}	 | j        d||d|	}
|                     |
          S )N)ru   rk   ry   r&   )r=   r   r   r   rr   _create_chat_result)r(   rs   ru   rk   rQ   rm   should_streamstream_iterr   r   responses              r)   	_generatezChatKonko._generate   s     #)"4$. 	5&$,# @F K (444 $ : :8T J Jv%F%f%-4- 
"
 
?E
 
 ''111r+   +Tuple[List[Dict[str, Any]], Dict[str, Any]]c                d    | j         }|d|v rt          d          ||d<   d |D             }||fS )Nru   z2`stop` found in both the input and default params.c                ,    g | ]}t          |          S r&   r   )r\   ms     r)   
<listcomp>z3ChatKonko._create_message_dicts.<locals>.<listcomp>  s!    FFF033FFFr+   )_client_paramsrK   )r(   rs   ru   r   r   s        r)   r   zChatKonko._create_message_dicts   sS     $ !UVVV!F6NFFXFFFf$$r+   c                &    i d| j         i| j        S )zGet the identifying parameters.
model_name)r1   rR   r'   s    r)   _identifying_paramszChatKonko._identifying_params  s     F<,E0DEEr+   c                    i | j         S )z-Get the parameters used for the konko client.)rR   r'   s    r)   r   zChatKonko._client_params
  s     ($&''r+   c                l    d| j         it                                          |          | j        |S )z,Get the parameters used to invoke the model.r1   )ru   )r1   super_get_invocation_paramsrR   )r(   ru   rm   r   s      r)   r   z ChatKonko._get_invocation_params  sJ    
 TZ
gg,,$,77
 "
 	
 	
r+   c                    dS )zReturn type of chat model.z
konko-chatr&   r'   s    r)   	_llm_typezChatKonko._llm_type  s	     |r+   )r   r    )r   r,   )rB   r   r   r   )r   r8   )r$   rS   r%   rS   rT   r4   r   rU   )N)rk   rl   rm   r   r   r   )NN)
rs   rt   ru   rv   rk   rl   rm   r   r   rw   )NNN)rs   rt   ru   rv   rk   rl   rQ   r   rm   r   r   r   )rs   rt   ru   rv   r   r   )ru   rv   rm   r   r   r8   )r   r4   )%__name__
__module____qualname____doc__propertyr*   classmethodr/   r0   __annotations__r   DEFAULT_MODELr1   r6   r   r9   r%   r$   r<   r=   r?   rA   r   rO   rR   staticmethodDEFAULT_API_BASErj   rr   r   r   r   r   r   r   r   __classcell__)r   s   @r)   r   r   -   s          V V V XV    [ F}G<<<E<<<<K+#(5#>#>#>L>>>>V$(N((((#'M''''K<I/AJJJJAJ/# # # X#J 	
 	
 	
 X	
 596:./I /I /I /I \/Id AE0 0 0 0 0 %):>	    F %):>!%2 2 2 2 2,	% 	% 	% 	% F F F XF ( ( ( X(
 +/	
 	
 	
 	
 	
 	
 	
    X    r+   r   ).r   
__future__r   loggingr_   rM   typingr   r   r   r   r   r	   r
   r   r   rd   langchain_core.callbacksr   langchain_core.messagesr   r   langchain_core.outputsr   r   langchain_core.utilsr   r   r   pydanticr   r   #langchain_community.adapters.openair   &langchain_community.chat_models.openair   r   r    langchain_community.utils.openair   r   r   	getLoggerr   loggerr   r&   r+   r)   <module>r      s     " " " " " "  				 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
       @ ? ? ? ? ? ? ? B B B B B B B B V V V V V V V V V V % % % % % % % %              
 : 9 9 9 9 9, 0		8	$	$p p p p p
 p p p p pr+   