a
    bg%'                     @  s   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*e+Z,G d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                      s  e Zd ZU dZeddddZeddddZd	Zd
e	d< e
eddZde	d< dZde	d< e
e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< dZde	d < ed!d!d"d#d$Zeddd%d&Zed	d	efd'd'dd(d)d*d+ZdHd,d
d
d-d.d/ZdId0d1d,d
d2d3d4d5ZdJd0d1d,d6d
d7d8d9d:Zd0d1d;d<d=d>Zeddd?d@Z edddAdBZ!dKd1d
ddC fdDdEZ"edddFdGZ#  Z$S )L	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")
    zDict[str, str])returnc                 C  s
   dddS )NKONKO_API_KEYOPENAI_API_KEY)konko_api_keyopenai_api_key selfr"   r"   s/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/chat_models/konko.py
lc_secrets=   s    zChatKonko.lc_secretsboolc                 C  s   dS )z9Return whether this model can be serialized by Langchain.Fr"   )clsr"   r"   r%   is_lc_serializableA   s    zChatKonko.is_lc_serializableNr   clientmodel)defaultaliasstrgffffff?floattemperature)default_factoryzDict[str, Any]model_kwargszOptional[str]r!   r       intmax_retriesF	streaming   n   
max_tokensr   )valuesr   c                 C  s   t t|dd|d< zddl}W n ty:   tdY n0 z"t rR|jj|d< n
|j|d< W n tyx   t	dY n0 t
|dstd	 |d
 dk rt	d|d
 dkr|d rt	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`.r*   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`.Z_is_legacy_openaizhYou are using an older version of the 'konko' package. Please consider upgrading to access new features.r8   r7   zn must be at least 1.r6   zn must be 1 when streaming.)r   r   konkoImportErrorr   ZchatZcompletionsZChatCompletionAttributeError
ValueErrorhasattrwarningswarn)r(   r;   r<   r"   r"   r%   validate_environmentX   s4    



zChatKonko.validate_environmentc                 C  s    | j | j| j| j| jd| jS )z1Get the default parameters for calling Konko API.)r+   r:   streamr8   r0   )r+   r:   r6   r8   r0   r2   r#   r"   r"   r%   _default_params~   s    zChatKonko._default_paramszUnion[str, SecretStr, None]zSet[str])r    r!   konko_api_baser   c                 C  s   |s,zt tjd }W q> ty(   Y q>0 nt|tr>t |}| srzt tjd } W q tyn   tdY q0 nt| trt | } | d}dd|   i}|rtt	| |d< t
j||d}|jd	krtd
| d|j d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                 S  s   h | ]}|d  qS )idr"   ).0r+   r"   r"   r%   	<setcomp>       z1ChatKonko.get_available_models.<locals>.<setcomp>data)r   osenvironKeyError
isinstancer.   r?   Zget_secret_valuer   r   requestsgetstatus_codejson)r    r!   rF   Z
models_urlrH   Zmodels_responser"   r"   r%   get_available_models   s>    	



zChatKonko.get_available_modelsz"Optional[CallbackManagerForLLMRun])run_managerkwargsr   c                   s"   ddd fdd}|f i |S )Nr   )rY   r   c                    s    j jf i | S )N)r*   create)rY   r#   r"   r%   _completion_with_retry   s    z?ChatKonko.completion_with_retry.<locals>._completion_with_retryr"   )r$   rX   rY   r[   r"   r#   r%   completion_with_retry   s    zChatKonko.completion_with_retryzList[BaseMessage]zOptional[List[str]]zIterator[ChatGenerationChunk])messagesstoprX   rY   r   c                 k  s   |  ||\}}i ||ddi}t}| jf ||d|D ]|}t|d dkrTq>|d d }	t|	d |}|	d}
|
d urt|
dnd }|j}t||d	}|r|j	|j
|d
 |V  q>d S )NrD   Tr]   rX   choicesr   deltafinish_reason)rb   )messagegeneration_info)chunk)_create_message_dictsr   r\   lenr   rT   dict	__class__r   Zon_llm_new_tokentext)r$   r]   r^   rX   rY   message_dictsparamsZdefault_chunk_classre   choicerb   rd   Zcg_chunkr"   r"   r%   _stream   s0    

zChatKonko._streamzOptional[bool]r   )r]   r^   rX   rD   rY   r   c                 K  sr   |d ur|n| j }|r6| j|f||d|}t|S | ||\}}	i |	|}	| jf ||d|	}
| |
S )N)r^   rX   r_   )r6   rn   r   rf   r\   Z_create_chat_result)r$   r]   r^   rX   rD   rY   Zshould_streamZstream_iterrk   rl   responser"   r"   r%   	_generate   s$    zChatKonko._generatez+Tuple[List[Dict[str, Any]], Dict[str, Any]])r]   r^   r   c                 C  s<   | j }|d ur&d|v rtd||d< dd |D }||fS )Nr^   z2`stop` found in both the input and default params.c                 S  s   g | ]}t |qS r"   r   )rK   mr"   r"   r%   
<listcomp>  rM   z3ChatKonko._create_message_dicts.<locals>.<listcomp>)_client_paramsr?   )r$   r]   r^   rl   rk   r"   r"   r%   rf      s    zChatKonko._create_message_dictsc                 C  s   i d| j i| jS )zGet the identifying parameters.Z
model_name)r+   rE   r#   r"   r"   r%   _identifying_params  s    zChatKonko._identifying_paramsc                 C  s
   i | j S )z-Get the parameters used for the konko client.)rE   r#   r"   r"   r%   rs   
  s    zChatKonko._client_params)r^   rY   r   c                   s"   d| j it j|d| j|S )z,Get the parameters used to invoke the model.r+   )r^   )r+   super_get_invocation_paramsrE   )r$   r^   rY   ri   r"   r%   rv     s    z ChatKonko._get_invocation_paramsc                 C  s   dS )zReturn type of chat model.z
konko-chatr"   r#   r"   r"   r%   	_llm_type  s    zChatKonko._llm_type)N)NN)NNN)N)%__name__
__module____qualname____doc__propertyr&   classmethodr)   r*   __annotations__r   DEFAULT_MODELr+   r0   rh   r2   r!   r    r5   r6   r8   r:   r   rC   rE   staticmethodDEFAULT_API_BASErW   r\   rn   rp   rf   rt   rs   rv   rx   __classcell__r"   r"   rw   r%   r   -   sT   
%2   #    r   ).r|   
__future__r   loggingrO   rA   typingr   r   r   r   r   r   r	   r
   r   rS   Zlangchain_core.callbacksr   Zlangchain_core.messagesr   r   Zlangchain_core.outputsr   r   Zlangchain_core.utilsr   r   r   Zpydanticr   r   Z#langchain_community.adapters.openair   Z&langchain_community.chat_models.openair   r   r   Z langchain_community.utils.openair   r   r   	getLoggerry   loggerr   r"   r"   r"   r%   <module>   s$   ,
