§
    æ˜ºhð*  ã                  ó  — d Z ddlm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mZ dd
l m!Z!m"Z" ddl#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ÚMappingÚOptionalÚSetÚTupleÚUnion)ÚCallbackManagerForLLMRun)ÚBaseChatModelÚgenerate_from_stream)ÚAIMessageChunkÚBaseMessage)ÚChatGenerationÚChatGenerationChunkÚ
ChatResult)ÚFieldÚ	SecretStrÚroot_validator)Úconvert_to_secret_strÚget_from_dict_or_env)Úconvert_dict_to_messageÚconvert_message_to_dict)Ú_convert_delta_to_message_chunkzhttps://api.konko.ai/v1zmeta-llama/Llama-2-13b-chat-hfc                  ó  ‡ — e Zd ZU dZedDd„¦   «         ZedEd„¦   «         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<   	 dZde	d <   	  e¦   «         dFd#„¦   «         ZedGd$„¦   «         ZeddefdHd(„¦   «         Z	 dIdJd,„ZdKd0„Z	 	 dLdMd6„Z	 	 	 dNdOd:„Z dPd<„Z!dQd?„Z"edGd@„¦   «         Z#edGdA„¦   «         Z$	 dIdRˆ fdB„Z%edSdC„¦   «         Z&ˆ xZ'S )TÚ	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    úm/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain_community/chat_models/konko.pyÚ
lc_secretszChatKonko.lc_secrets;   s   € à!0ÐDTÐUÐUÐUó    Úboolc                ó   — dS )z9Return whether this model can be serialized by Langchain.Fr&   )Úclss    r)   Úis_lc_serializablezChatKonko.is_lc_serializable?   s	   € ð ˆur+   Nr   ÚclientÚmodel)ÚdefaultÚaliasÚstrgffffffæ?ÚfloatÚtemperature)Údefault_factoryúDict[str, Any]Úmodel_kwargszOptional[SecretStr]r%   r$   z+Optional[Union[float, Tuple[float, float]]]Úrequest_timeouté   Ú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	 |j        |d<   n# t          $ r t	          d¦  «        ‚w xY w|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`.r@   r?   zn must be at least 1.r>   zn must be 1 when streaming.)r   r   ÚkonkoÚImportErrorÚ
ValueErrorÚChatCompletionÚAttributeError)r.   rC   rE   s      r)   Úvalidate_environmentzChatKonko.validate_environmentX   sø   € õ #8Ý  ¨¸/ÑJÔJñ#
ô #
ˆˆÑð	ØˆLˆLˆLˆLøåð 	ð 	ð 	Ýð>ñô ð ð	øøøð
	Ø$Ô3ˆF�8ÑÐøÝð 	ð 	ð 	Ýð6ñô ð ð	øøøð �#Œ;˜Š?ˆ?ÝÐ4Ñ5Ô5Ð5Ø�#Œ;˜Š?ˆ?˜v kÔ2ˆ?ÝÐ:Ñ;Ô;Ð;Øˆs   £( ¨AÁ
A ÁA+c                ó^   — | j         | j        | j        | j        | j        | j        dœ| j        ¥S )z1Get the default parameters for calling Konko API.)r1   r:   rB   Ústreamr@   r6   )r1   r:   rB   r>   r@   r6   r9   r'   s    r)   Ú_default_paramszChatKonko._default_paramst   s@   € ð ”ZØ#Ô3Øœ/Ø”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|                     ¦   «         |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   rG   Úget_secret_valueÚrequestsÚgetÚstatus_codeÚjson)r$   r%   rO   Ú
models_urlrS   Úmodels_responses         r)   Úget_available_modelszChatKonko.get_available_models�   s´  € ð ð 	CðÝ!6µr´zÐBRÔ7SÑ!TÔ!T��øÝð ð ð Ø�ðøøøå˜­Ñ,Ô,ð 	CÝ2°>ÑBÔBˆNð ð 		AðÝ 5µb´jÀÔ6QÑ RÔ R��øÝð ð ð Ý ðAñô ð ðøøøõ
 ˜¥sÑ+Ô+ð 	AÝ1°-Ñ@Ô@ˆMà&Ð/Ð/Ð/ˆ
ð ÐI }×'EÒ'EÑ'GÔ'GÐIÐIð
ˆð ð 	LØ*8×*IÒ*IÑ*KÔ*KˆGÐ&Ñ'å"œ, z¸7ÐCÑCÔCˆàÔ&¨#Ò-Ð-Ýð1¨Zð 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 )Nrh   r   r   c                 ó(   •—  ‰j         j        di | ¤ŽS )Nr&   )r0   Úcreate)rh   r(   s    €r)   Ú_completion_with_retryz?ChatKonko.completion_with_retry.<locals>._completion_with_retry´   s   ø€ Ø%�4”;Ô%Ð/Ð/¨Ð/Ð/Ð/r+   )rh   r   r   r   r&   r&   )r(   rf   rh   rl   s   `   r)   Úcompletion_with_retryzChatKonko.completion_with_retry±   s:   ø€ ð	0ð 	0ð 	0ð 	0ð 	0ð 	0ð &Ð%Ð/Ð/¨Ð/Ð/Ð/r+   Úllm_outputsúList[Optional[dict]]Údictc                ó¢   — i }|D ]A}|€Œ|d         }|                      ¦   «         D ]\  }}||v r||xx         |z  cc<   Œ|||<   Œ ŒB|| j        dœS )NÚtoken_usage©rr   Ú
model_name)Úitemsr1   )r(   rn   Úoverall_token_usageÚoutputrr   ÚkÚvs          r)   Ú_combine_llm_outputszChatKonko._combine_llm_outputs¹   s˜   € Ø$&ÐØ!ð 		/ð 		/ˆFØˆ~àØ  Ô/ˆKØ#×)Ò)Ñ+Ô+ð /ð /‘��1ØÐ+Ð+Ð+Ø'¨Ð*Ð*Ô*¨aÑ/Ð*Ð*Ñ*Ð*à-.Ð'¨Ñ*Ð*ð	/ð
  3À$Ä*ÐMÐMÐMr+   Ú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          ||¬	¦  «        }|V — |r| 	                    |j
        |¬
¦  «         Œ¤d S )NrL   T©r{   rf   Úchoicesr   ÚdeltaÚfinish_reason©r„   ©ÚmessageÚgeneration_info)Úchunkr&   )Ú_create_message_dictsr   rm   Úlenr   r`   rp   Ú	__class__r   Úon_llm_new_tokenÚtext)r(   r{   r}   rf   rh   Úmessage_dictsÚparamsÚdefault_chunk_classr‰   Úchoicer„   rˆ   s               r)   Ú_streamzChatKonko._streamÇ   sD  è è € ð !%× :Ò :¸8ÀTÑ JÔ JÑˆ�vØ5�FÐ5˜fÐ5 h°Ð5Ð5ˆå,ÐØ/�TÔ/ð 
Ø"°ð
ð 
Ø?Eð
ð 
ð 	Fð 	FˆEõ �5˜Ô#Ñ$Ô$¨Ò)Ð)ØØ˜9Ô% aÔ(ˆFÝ3Ø�w”Ð!4ñô ˆEð #ŸJšJ Ñ7Ô7ˆMà5BÐ5N• =Ð1Ñ1Ô1Ð1ÐTXð ð #(¤/ÐÝ'°ÀÐWÑWÔWˆEØˆKˆKˆKØð FØ×,Ò,¨U¬Z¸uÐ,ÑEÔEÐEøð#	Fð 	Fr+   rL   úOptional[bool]r   c                óä   — |�|n| j         }|r  | j        |f||dœ|¤Ž}t          |¦  «        S |                      ||¦  «        \  }}	i |	¥|¥}	 | j        d||dœ|	¤Ž}
|                      |
¦  «        S )N)r}   rf   r�   r&   )r>   r“   r   rŠ   rm   Ú_create_chat_result)r(   r{   r}   rf   rL   rh   Úshould_streamÚstream_iterr�   r�   Úresponses              r)   Ú	_generatezChatKonko._generateå   sÃ   € ð #)Ð"4˜˜¸$¼.ˆØð 	5Ø&˜$œ,ØðØ#°ðð Ø@Fðð ˆKõ (¨Ñ4Ô4Ð4à $× :Ò :¸8ÀTÑ 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 )Nr}   z2`stop` found in both the input and default params.c                ó,   — g | ]}t          |¦  «        ‘ŒS r&   )r   )rW   Úms     r)   ú
<listcomp>z3ChatKonko._create_message_dicts.<locals>.<listcomp>  s!   € ÐFÐFÐF¸Õ0°Ñ3Ô3ÐFÐFÐFr+   )Ú_client_paramsrG   )r(   r{   r}   r�   r�   s        r)   rŠ   zChatKonko._create_message_dictsû   sS   € ð Ô$ˆØÐØ˜ÐÐÝ Ð!UÑVÔVÐVØ!ˆF�6‰NØFÐF¸XÐFÑFÔFˆØ˜fÐ$Ð$r+   r™   úMapping[str, Any]c           	     ó6  — g }|d         D ]^}t          |d         ¦  «        }t          |t          |                     d¦  «        ¬¦  «        ¬¦  «        }|                     |¦  «         Œ_|                     di ¦  «        }|| j        dœ}t          ||¬¦  «        S )	Nr‚   r‡   r„   r…   r†   Úusagers   )ÚgenerationsÚ
llm_output)r   r   rp   r`   Úappendr1   r   )r(   r™   r¤   Úresr‡   Úgenrr   r¥   s           r)   r–   zChatKonko._create_chat_result  s«   € ØˆØ˜IÔ&ð 	$ð 	$ˆCÝ-¨c°)¬nÑ=Ô=ˆGÝ ØÝ $°3·7²7¸?Ñ3KÔ3KÐ LÑ LÔ Lðñ ô ˆCð ×Ò˜sÑ#Ô#Ð#Ð#Ø—l’l 7¨BÑ/Ô/ˆØ%0ÀÄ
ÐKÐKˆ
Ý k¸jÐIÑIÔIÐIr+   c                ó&   — i d| j         i¥| j        ¥S )zGet the identifying parameters.rt   )r1   rM   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.)rM   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   )r}   )r1   ÚsuperÚ_get_invocation_paramsrM   )r(   r}   rh   rŒ   s      €r)   r®   z ChatKonko._get_invocation_params  sJ   ø€ ð
 �T”Zð
å‰gŒg×,Ò,°$Ð,Ñ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,   )rC   r   r   r   )r   r8   )r$   rN   r%   rN   rO   r4   r   rP   )N)rf   rg   rh   r   r   r   )rn   ro   r   rp   )NN)
r{   r|   r}   r~   rf   rg   rh   r   r   r   )NNN)r{   r|   r}   r~   rf   rg   rL   r”   rh   r   r   r   )r{   r|   r}   r~   r   r›   )r™   r¡   r   r   )r}   r~   rh   r   r   r8   )r   r4   )(Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr*   Úclassmethodr/   r0   Ú__annotations__r   ÚDEFAULT_MODELr1   r6   rp   r9   r%   r$   r:   r=   r>   r@   rB   r   rJ   rM   ÚstaticmethodÚDEFAULT_API_BASEre   rm   rz   r“   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Ð-Ð-Ð-Ñ-ØCG€OÐGÐGÐGÑGØ7Ø€KÐÐÐÑØ<Ø€IÐÐÐÑØ/Ø€A€J€J€J�JØAØ€JÐÐÐÑØ/à€^ÑÔðð ð ñ Ôðð6 ð

ð 

ð 

ñ „Xð

ð à59Ø6:Ø.ð-Ið -Ið -Ið -Iñ „\ð-Ið` AEð0ð 0ð 0ð 0ð 0ðNð Nð Nð Nð" %)Ø:>ð	Fð Fð Fð Fð FðB %)Ø:>Ø!%ð2ð 2ð 2ð 2ð 2ð,	%ð 	%ð 	%ð 	%ðJð Jð Jð Jð ðFð Fð Fñ „XðFð ð(ð (ð (ñ „Xð(ð
 +/ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ðð ð ñ „Xðð ð ð ð r+   r   ).r´   Ú
__future__r   ÚloggingrZ   Útypingr   r   r   r   r   r	   r
   r   r   r_   Úlangchain_core.callbacksr   Ú*langchain_core.language_models.chat_modelsr   r   Úlangchain_core.messagesr   r   Úlangchain_core.outputsr   r   r   Úlangchain_core.pydantic_v1r   r   r   Úlangchain_core.utilsr   r   Ú#langchain_community.adapters.openair   r   Ú&langchain_community.chat_models.openair   rº   r¸   Ú	getLoggerr±   Úloggerr   r&   r+   r)   ú<module>rÉ      sõ  ðØ Ð Ø "Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð €€€ðð ð ð ð ð ðð ð ð ð ð ð ð ð @Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RØ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GØ LÐ LÐ LÐ LÐ LÐ LÐ LÐ Lðð ð ð ð ð ð ð ð SÐ RÐ RÐ RÐ RÐ Rà,Ð Ø0€à	ˆÔ	˜8Ñ	$Ô	$€ð@ð @ð @ð @ð @�ñ @ô @ð @ð @ð @r+   