§
    šŠtj=#  ã                  ó"  — d Z ddlmZ ddl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 ddlmZmZ ddlmZmZmZ dd	lmZ dd
lm Z  ddl!m"Z" erddl#Z# ej$        e%¦  «        Z&dZ'dZ(dd„Z) G d„ de ¦  «        Z*dS )z>Anyscale Endpoints chat wrapper. Relies heavily on ChatOpenAI.é    )ÚannotationsN)	ÚTYPE_CHECKINGÚAnyÚCallableÚDictÚOptionalÚSequenceÚSetÚTypeÚUnion)ÚBaseMessage)ÚBaseTool)Úconvert_to_secret_strÚget_from_dict_or_env)ÚFieldÚ	SecretStrÚmodel_validator©Úconvert_message_to_dict)Ú
ChatOpenAI)Úis_openai_v1z%https://api.endpoints.anyscale.com/v1z#meta-llama/Meta-Llama-3-8B-InstructÚreturnr   c                 óL   — 	 dd l } n# t          $ r t          d¦  «        ‚w xY w| S )Nr   zŒCould not import tiktoken python package. This is needed in order to calculate get_token_ids. Please install it with `pip install tiktoken`.)ÚtiktokenÚImportError)r   s    úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/chat_models/anyscale.pyÚ_import_tiktokenr   *   sK   € ð
ØˆˆˆˆøÝð 
ð 
ð 
Ýð=ñ
ô 
ð 	
ð
øøøð €Os   ‚ ‡!c                  ót  ‡ — e Zd ZU dZed&d„¦   «         Zed'd„¦   «         Zed(d„¦   «         Z e	 e
d	¦  «        ¬
¦  «        Zded<   	  e	ed¬¦  «        Zded<   	  e	e¬
¦  «        Zded<   	 dZded<   	 dZded<   	 edefd)d„¦   «         Z ed¬¦  «        ed*d„¦   «         ¦   «         Zd+d„Z	 d,d-ˆ fd%„Zˆ xZS ).ÚChatAnyscalea”  `Anyscale` Chat large language models.

    See https://www.anyscale.com/ for information about Anyscale.

    To use, you should have the ``openai`` python package installed, and the
    environment variable ``ANYSCALE_API_KEY`` set with your API key.
    Alternatively, you can use the anyscale_api_key keyword argument.

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

    Example:
        .. code-block:: python

            from langchain_community.chat_models import ChatAnyscale
            chat = ChatAnyscale(model_name="meta-llama/Llama-2-7b-chat-hf")
    r   Ústrc                ó   — dS )zReturn type of chat model.zanyscale-chat© ©Úselfs    r   Ú	_llm_typezChatAnyscale._llm_typeI   s	   € ð ˆó    úDict[str, str]c                ó
   — ddiS )NÚanyscale_api_keyÚANYSCALE_API_KEYr"   r#   s    r   Ú
lc_secretszChatAnyscale.lc_secretsN   s   € à"Ð$6Ð7Ð7r&   Úboolc                ó   — dS )NFr"   )Úclss    r   Úis_lc_serializablezChatAnyscale.is_lc_serializableR   s   € àˆur&   Ú ©Údefaultr   r)   Úmodel)r2   ÚaliasÚ
model_nameÚanyscale_api_baseNúOptional[str]Úanyscale_proxyzOptional[Set[str]]Úavailable_modelsúSet[str]c                óD  — 	 | pt           j        d         } n"# t          $ r}t          d¦  «        |‚d}~ww xY w|› d�}t	          j        |dd| › �i¬¦  «        }|j        dk    rt          d	|› d
|j        › �¦  «        ‚d„ |                     ¦   «         d         D ¦   «         S )z'Get available models from Anyscale API.r*   zdAnyscale API key must be passed as keyword argument or set in environment variable ANYSCALE_API_KEY.Nz/modelsÚAuthorizationzBearer )ÚheaderséÈ   zError getting models from z: c                ó   — h | ]
}|d          ’ŒS )Úidr"   )Ú.0r3   s     r   ú	<setcomp>z4ChatAnyscale.get_available_models.<locals>.<setcomp>~   s   € ÐHÐHÐH ��d”ÐHÐHÐHr&   Údata)ÚosÚenvironÚKeyErrorÚ
ValueErrorÚrequestsÚgetÚstatus_codeÚjson)r)   r6   ÚeÚ
models_urlÚmodels_responses        r   Úget_available_modelsz!ChatAnyscale.get_available_modelsb   s  € ð	Ø/ÐQµ2´:Ð>PÔ3QÐÐøÝð 	ð 	ð 	Ýð@ñô ð ðøøøøð	øøøð *Ð2Ð2Ð2ˆ
Ý"œ,ØàÐ!=Ð+;Ð!=Ð!=ðð
ñ 
ô 
ˆð Ô&¨#Ò-Ð-Ýð1¨Zð 1ð 1Ø"Ô.ð1ð 1ñô ð ð
 IÐH¨×)=Ò)=Ñ)?Ô)?ÀÔ)GÐHÑHÔHÐHs   ‚ —
6¡1±6Úbefore)ÚmodeÚvaluesÚdictr   c                ó¼  — t          t          |dd¦  «        ¦  «        |d<   t          |ddt          ¬¦  «        |d<   t          |ddd¬¦  «        |d	<   	 d
dl}n"# t          $ r}t	          d¦  «        |‚d}~ww xY w	 t          ¦   «         r‚|d                              ¦   «         |d         dœ}|                     d¦  «        s |j        di |¤Žj	        j
        |d<   |                     d¦  «        s |j        di |¤Žj	        j
        |d<   n2|d         |d<   |d                              ¦   «         |d<   |j        |d<   n"# t          $ r}t          d¦  «        |‚d}~ww xY wd|                     ¦   «         vr
t           |d<   |d         }|                      |d                              ¦   «         |d         ¦  «        }||vrt          d|› d|› d�¦  «        ‚||d<   |S )z?Validate that api key and python package exists in environment.r)   r*   r6   ÚANYSCALE_API_BASEr1   r8   ÚANYSCALE_PROXYr0   Úopenai_proxyr   NzTCould not import openai python package. Please install it with `pip install openai`.)Úapi_keyÚbase_urlÚclientÚasync_clientÚopenai_api_baseÚopenai_api_keyz�`openai` has no `ChatCompletion` attribute, this is likely due to an old version of the openai package. Try upgrading it with `pip install --upgrade openai`.r5   zModel name z  not found in available models: ú.r9   r"   )r   r   ÚDEFAULT_API_BASEÚopenair   r   Úget_secret_valuerI   ÚOpenAIÚchatÚcompletionsÚAsyncOpenAIÚChatCompletionÚAttributeErrorrG   ÚkeysÚDEFAULT_MODELrO   )r.   rR   r`   rL   Úclient_paramsÚexcr5   r9   s           r   Úvalidate_environmentz!ChatAnyscale.validate_environment€   s«  € õ &;Ý ØØ"Ø"ñô ñ&
ô &
ˆÐ!Ñ"õ ';ØØØÝ$ð	'
ñ '
ô '
ˆÐ"Ñ#õ "6ØØØØð	"
ñ "
ô "
ˆˆ~Ñð	ØˆMˆMˆMˆMøåð 	ð 	ð 	Ýð?ñô ð ðøøøøð	øøøð
	Ý‰~Œ~ð 9à%Ð&8Ô9×JÒJÑLÔLØ &Ð':Ô ;ð
!ð 
!�ð —z’z (Ñ+Ô+ð WØ'4 v¤}Ð'EÐ'E°}Ð'EÐ'EÔ'JÔ'V�F˜8Ñ$Ø—z’z .Ñ1Ô1ð 'Ø-?¨VÔ-?ð .ð .Ø'ð.ð .äœ;ð ˜>Ñ*øð -3Ð3FÔ,G�Ð(Ñ)Ø+1Ð2DÔ+E×+VÒ+VÑ+XÔ+X�Ð'Ñ(Ø#)Ô#8��xÑ øøÝð 	ð 	ð 	Ýð7ñô ð ð	øøøøð	øøøð ˜vŸ{š{™}œ}Ð,Ð,Ý#0ˆF�<Ñ à˜LÔ)ˆ
Ø×3Ò3ØÐ%Ô&×7Ò7Ñ9Ô9ØÐ&Ô'ñ
ô 
Ðð
 Ð-Ð-Ð-Ýð'˜jð 'ð 'Ø#ð'ð 'ð 'ñô ð ð
 &6ˆÐ!Ñ"àˆs1   ÁA Á
A8Á#A3Á3A8Á<CD? Ä?
EÅ	EÅEútuple[str, tiktoken.Encoding]c                ó  — t          ¦   «         }| j        �| j        }n| j        }	 |                     d¦  «        }nA# t          $ r4 t
                               d¦  «         d}|                     |¦  «        }Y nw xY w||fS )Nzgpt-3.5-turbo-0301z5Warning: model not found. Using cl100k_base encoding.Úcl100k_base)r   Útiktoken_model_namer5   Úencoding_for_modelrF   ÚloggerÚwarningÚget_encoding)r$   Ú	tiktoken_r3   Úencodings       r   Ú_get_encoding_modelz ChatAnyscale._get_encoding_modelÐ   s˜   € Ý$Ñ&Ô&ˆ	ØÔ#Ð/ØÔ,ˆEˆEà”OˆEð	5Ø ×3Ò3Ð4HÑIÔIˆHˆHøÝð 	5ð 	5ð 	5Ý�NŠNÐRÑSÔSÐSØ!ˆEØ ×-Ò-¨eÑ4Ô4ˆHˆHˆHð	5øøøð �hˆÐs   ¦< ¼;A:Á9A:Úmessagesúlist[BaseMessage]ÚtoolsúCOptional[Sequence[Union[Dict[str, Any], Type, Callable, BaseTool]]]Úintc           
     óÀ  •— |�t          j        d¦  «         t          j        d         dk    r!t	          ¦   «                              |¦  «        S |                      ¦   «         \  }}d}d}d}d„ |D ¦   «         }|D ]^}	||z  }|	                     ¦   «         D ]B\  }
}|t          | 	                    t          |¦  «        ¦  «        ¦  «        z  }|
dk    r||z  }ŒCŒ_|dz  }|S )	z¾Calculate num tokens with tiktoken package.
        Official documentation: https://github.com/openai/openai-cookbook/blob/main/examples/How_to_format_inputs_to_ChatGPT_models.ipynb
        NzECounting tokens in tool schemas is not yet supported. Ignoring tools.é   é   é   r   c                ó,   — g | ]}t          |¦  «        ‘ŒS r"   r   )rA   Úms     r   ú
<listcomp>z=ChatAnyscale.get_num_tokens_from_messages.<locals>.<listcomp>ó   s!   € ÐFÐFÐF¸Õ0°Ñ3Ô3ÐFÐFÐFr&   Úname)ÚwarningsÚwarnÚsysÚversion_infoÚsuperÚget_num_tokens_from_messagesrw   ÚitemsÚlenÚencoder    )r$   rx   rz   r3   rv   Útokens_per_messageÚtokens_per_nameÚ
num_tokensÚmessages_dictÚmessageÚkeyÚvalueÚ	__class__s               €r   rŠ   z)ChatAnyscale.get_num_tokens_from_messagesß   s  ø€ ð ÐÝŒMØWñô ð õ Ô˜AÔ !Ò#Ð#Ý‘7”7×7Ò7¸ÑAÔAÐAØ×2Ò2Ñ4Ô4‰ˆˆxØÐØˆØˆ
ØFÐF¸XÐFÑFÔFˆØ$ð 	2ð 	2ˆGØÐ,Ñ,ˆJØ%Ÿmšm™oœoð 2ð 2‘
��Uð �c (§/¢/µ#°e±*´*Ñ"=Ô"=Ñ>Ô>Ñ>�
Ø˜&’=�=Ø /Ñ1�Jøð2ð 	�a‰ˆ
ØÐr&   )r   r    )r   r'   )r   r,   )r)   r7   r6   r    r   r:   )rR   rS   r   r   )r   rm   )N)rx   ry   rz   r{   r   r|   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr%   r+   Úclassmethodr/   r   r   r)   Ú__annotations__ri   r5   r_   r6   r8   r9   ÚstaticmethodrO   r   rl   rw   rŠ   Ú__classcell__)r•   s   @r   r   r   6   sÏ  ø€ € € € € € ðð ð$ ðð ð ñ „Xðð ð8ð 8ð 8ñ „Xð8ð ðð ð ñ „[ðð #( %°	°	¸"±´Ð">Ñ">Ô">ÐÐ>Ð>Ð>Ñ>Ø&Ø�e M¸ÐAÑAÔA€JÐAÐAÐAÑAØØ"˜UÐ+;Ð<Ñ<Ô<ÐÐ<Ð<Ð<Ñ<ð=à$(€NÐ(Ð(Ð(Ñ(Ø1Ø+/ÐÐ/Ð/Ð/Ñ/Ø-àà*.Ø!1ðIð Ið Ið Iñ „\ðIð: €_˜(Ð#Ñ#Ô#ØðLð Lð Lñ „[ñ $Ô#ðLð\ð ð ð ð( ðð ð ð ð ð ð ð ð ð ð r&   r   )r   r   )+r™   Ú
__future__r   ÚloggingrD   r‡   r…   Útypingr   r   r   r   r   r	   r
   r   r   rH   Úlangchain_core.messagesr   Úlangchain_core.toolsr   Úlangchain_core.utilsr   r   Úpydanticr   r   r   Ú#langchain_community.adapters.openair   Ú&langchain_community.chat_models.openair   Ú langchain_community.utils.openair   r   Ú	getLoggerr–   rr   r_   ri   r   r   r"   r&   r   ú<module>rª      sØ  ðØ DÐ Dà "Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø 
€
€
€
Ø €€€ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð €€€Ø /Ð /Ð /Ð /Ð /Ð /Ø )Ð )Ð )Ð )Ð )Ð )Ø LÐ LÐ LÐ LÐ LÐ LÐ LÐ LØ 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6à GÐ GÐ GÐ GÐ GÐ Gðð ð ð ð ð ð :Ð 9Ð 9Ð 9Ð 9Ð 9àð Ø€O€O€Oà	ˆÔ	˜8Ñ	$Ô	$€à:Ð Ø5€ð	ð 	ð 	ð 	ðHð Hð Hð Hð H�:ñ Hô Hð Hð Hð Hr&   