o
    a+ i+'                     @  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mZ ddlZddlmZ ddl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 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TypeUnioncast)CallbackManagerForLLMRun)AIMessageChunkBaseMessageBaseMessageChunk)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%   q/home/app/PaddleOCR-VL-test/.venv_paddleocr/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_serializableB      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,   rA   rB   r%   r%   r(   validate_environmentY   s:   


zChatKonko.validate_environmentc                 C  s    | j | j| j| j| jd| jS )z1Get the default parameters for calling Konko API.)r0   r@   streamr>   r5   )r0   r@   r<   r>   r5   r8   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%   ).0r0   r%   r%   r(   	<setcomp>       z1ChatKonko.get_available_models.<locals>.<setcomp>data)r   osenvironKeyError
isinstancer3   rE   Zget_secret_valuer   r   requestsgetstatus_codejson)r#   r$   rM   Z
models_urlrP   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 )Nrb   r   r   c                    s    j jdi | S )Nr%   )r/   create)rb   r&   r%   r(   _completion_with_retry   s   z?ChatKonko.completion_with_retry.<locals>._completion_with_retry)rb   r   r   r   r%   r%   )r'   r`   rb   rd   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 )NrJ   Trf   r`   choicesr   deltafinish_reason)rn   )messagegeneration_info)chunkr%   )_create_message_dictsr   re   lenr   r\   dict	__class__r   Zon_llm_new_tokentext)r'   rf   rh   r`   rb   message_dictsparamsZdefault_chunk_classrq   choicern   rp   Zcg_chunkr%   r%   r(   _stream   s4   

zChatKonko._streamrJ   Optional[bool]r   c                 K  sr   |d ur|n| j }|r| j|f||d|}t|S | ||\}}	i |	|}	| jd||d|	}
| |
S )N)rh   r`   rk   r%   )r<   rz   r   rr   re   Z_create_chat_result)r'   rf   rh   r`   rJ   rb   Zshould_streamZstream_iterrw   rx   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 )Nrh   z2`stop` found in both the input and default params.c                 S  s   g | ]}t |qS r%   r   )rS   mr%   r%   r(   
<listcomp>  rU   z3ChatKonko._create_message_dicts.<locals>.<listcomp>)_client_paramsrE   )r'   rf   rh   rx   rw   r%   r%   r(   rr      s   zChatKonko._create_message_dictsc                 C  s   i d| j i| jS )zGet the identifying parameters.Z
model_name)r0   rK   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.)rK   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.r0   )rh   )r0   super_get_invocation_paramsrK   )r'   rh   rb   ru   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*   )rA   r   r   r   )r   r7   )r#   rL   r$   rL   rM   r3   r   rN   )N)r`   ra   rb   r   r   r   )NN)
rf   rg   rh   ri   r`   ra   rb   r   r   rj   )NNN)rf   rg   rh   ri   r`   ra   rJ   r{   rb   r   r   r   )rf   rg   rh   ri   r   r~   )rh   ri   rb   r   r   r7   )r   r3   )%__name__
__module____qualname____doc__propertyr)   classmethodr-   r/   __annotations__r   DEFAULT_MODELr0   r5   rt   r8   r$   r#   r;   r<   r>   r@   r   rI   rK   staticmethodDEFAULT_API_BASEr_   re   rz   r}   rr   r   r   r   r   __classcell__r%   r%   r   r(   r   .   sd   
 %1#
r   )0r   
__future__r   loggingrW   rG   typingr   r   r   r   r   r   r	   r
   r   r   r[   Zlangchain_core.callbacksr   Zlangchain_core.messagesr   r   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&    0
