o
    Zh'                     @  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                      sn  e Zd ZU dZedHddZedId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dJd#d$ZedKd%d&Zed	d	efdLd*d+Z		dMdNd/d0Z				dOdPd6d7Z						dQdRd;d<ZdSd>d?ZedKd@dAZ edKdBdCZ!		dMdT fdDdEZ"edUdFdGZ#  Z$S )V	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                 C  s
   dddS )NKONKO_API_KEYOPENAI_API_KEY)konko_api_keyopenai_api_key selfr#   r#   \/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/chat_models/konko.py
lc_secrets=   s   
zChatKonko.lc_secretsboolc                 C     dS )z9Return whether this model can be serialized by Langchain.Fr#   )clsr#   r#   r&   is_lc_serializableA      zChatKonko.is_lc_serializableNr   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                 C  s   t t|dd|d< zddl}W n ty   tdw zt r'|jj|d< n|j|d< W n ty8   t	dw t
|dsCtd	 |d
 dk rMt	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`.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.r<   r;   zn must be at least 1.r:   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   s:   


zChatKonko.validate_environmentc                 C  s    | j | j| j| j| jd| jS )z1Get the default parameters for calling Konko API.)r.   r>   streamr<   r3   )r.   r>   r:   r<   r3   r6   r$   r#   r#   r&   _default_params~   s   zChatKonko._default_paramsUnion[str, SecretStr, None]konko_api_baseSet[str]c                 C  s   |sz	t tjd }W n ty   Y n
w t|trt |}| s5z	t tjd } W n ty4   tdw t| tr>t | } | d}dd|   i}|rWtt	| |d< t
j||d}|jd	krnt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
isinstancer1   rC   Zget_secret_valuer   r   requestsgetstatus_codejson)r!   r"   rK   Z
models_urlrN   Zmodels_responser#   r#   r&   get_available_models   sB   	



zChatKonko.get_available_modelsrun_manager"Optional[CallbackManagerForLLMRun]kwargsc                   s   d fdd}|di |S )Nr`   r   r   c                    s    j jdi | S )Nr#   )r-   create)r`   r$   r#   r&   _completion_with_retry   s   z?ChatKonko.completion_with_retry.<locals>._completion_with_retry)r`   r   r   r   r#   r#   )r%   r^   r`   rb   r#   r$   r&   completion_with_retry   s   zChatKonko.completion_with_retrymessagesList[BaseMessage]stopOptional[List[str]]Iterator[ChatGenerationChunk]c                 k  s    |  ||\}}i ||ddi}t}| jd||d|D ]>}t|d dkr+q |d d }	t|	d |}|	d}
|
d urFt|
dnd }|j}t||d	}|r[|j	|j
|d
 |V  q d S )NrH   Trd   r^   choicesr   deltafinish_reason)rl   )messagegeneration_info)chunkr#   )_create_message_dictsr   rc   lenr   rZ   dict	__class__r   Zon_llm_new_tokentext)r%   rd   rf   r^   r`   message_dictsparamsZdefault_chunk_classro   choicerl   rn   Zcg_chunkr#   r#   r&   _stream   s4   

zChatKonko._streamrH   Optional[bool]r   c                 K  sr   |d ur|n| j }|r| j|f||d|}t|S | ||\}}	i |	|}	| jd||d|	}
| |
S )N)rf   r^   ri   r#   )r:   rx   r   rp   rc   Z_create_chat_result)r%   rd   rf   r^   rH   r`   Zshould_streamZstream_iterru   rv   responser#   r#   r&   	_generate   s$   
zChatKonko._generate+Tuple[List[Dict[str, Any]], Dict[str, Any]]c                 C  s<   | j }|d urd|v rtd||d< dd |D }||fS )Nrf   z2`stop` found in both the input and default params.c                 S  s   g | ]}t |qS r#   r   )rQ   mr#   r#   r&   
<listcomp>  rS   z3ChatKonko._create_message_dicts.<locals>.<listcomp>)_client_paramsrC   )r%   rd   rf   rv   ru   r#   r#   r&   rp      s   zChatKonko._create_message_dictsc                 C  s   i d| j i| jS )zGet the identifying parameters.Z
model_name)r.   rI   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.)rI   r$   r#   r#   r&   r   	  s   
zChatKonko._client_paramsc                   s"   d| j it j|d| j|S )z,Get the parameters used to invoke the model.r.   )rf   )r.   super_get_invocation_paramsrI   )r%   rf   r`   rs   r#   r&   r     s   z ChatKonko._get_invocation_paramsc                 C  r)   )zReturn type of chat model.z
konko-chatr#   r$   r#   r#   r&   	_llm_type  r,   zChatKonko._llm_type)r   r   )r   r(   )r?   r   r   r   )r   r5   )r!   rJ   r"   rJ   rK   r1   r   rL   )N)r^   r_   r`   r   r   r   )NN)
rd   re   rf   rg   r^   r_   r`   r   r   rh   )NNN)rd   re   rf   rg   r^   r_   rH   ry   r`   r   r   r   )rd   re   rf   rg   r   r|   )rf   rg   r`   r   r   r5   )r   r1   )%__name__
__module____qualname____doc__propertyr'   classmethodr+   r-   __annotations__r   DEFAULT_MODELr.   r3   rr   r6   r"   r!   r9   r:   r<   r>   r   rG   rI   staticmethodDEFAULT_API_BASEr]   rc   rx   r{   rp   r   r   r   r   __classcell__r#   r#   r   r&   r   -   sd   
 %1#
r   ).r   
__future__r   loggingrU   rE   typingr   r   r   r   r   r   r	   r
   r   rY   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   	getLoggerr   loggerr   r#   r#   r#   r&   <module>   s&    ,
