§
    æ˜ºhph  ã                  óÒ  — 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mZmZmZ ddl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d
l!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+m,Z,m-Z- ddl.m/Z/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6 ddl7m8Z8m9Z9 ddl:m;Z; erddl<Z< ej=        e>¦  «        Z?d(d„Z@	 d)d*d„ZA	 d)d+d„ZBd,d"„ZC ed#d$d%¬&¦  «         G d'„ de¦  «        ¦   «         ZDdS )-zOpenAI chat wrapper.é    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚAsyncIteratorÚCallableÚDictÚIteratorÚListÚMappingÚOptionalÚSequenceÚTupleÚTypeÚUnion)Ú
deprecated)ÚAsyncCallbackManagerForLLMRunÚCallbackManagerForLLMRun)ÚLanguageModelInput)ÚBaseChatModelÚagenerate_from_streamÚgenerate_from_stream)Úcreate_base_retry_decorator)ÚAIMessageChunkÚBaseMessageÚBaseMessageChunkÚChatMessageChunkÚFunctionMessageChunkÚHumanMessageChunkÚSystemMessageChunkÚToolMessageChunk)ÚChatGenerationÚChatGenerationChunkÚ
ChatResult)Ú	BaseModelÚFieldÚroot_validator)ÚRunnable)Úget_from_dict_or_envÚget_pydantic_field_names)Úconvert_dict_to_messageÚconvert_message_to_dict)Úis_openai_v1Ú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Ú
ValueError)r/   s    ún/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain_community/chat_models/openai.pyÚ_import_tiktokenr3   B   sK   € ð
ØˆˆˆˆøÝð 
ð 
ð 
Ýð=ñ
ô 
ð 	
ð
øøøð €Os   ‚ ‡!ÚllmÚ
ChatOpenAIÚrun_managerúHOptional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]]úCallable[[Any], Any]c                óª   — dd l }|j        j        |j        j        |j        j        |j        j        |j        j        g}t          || j        |¬¦  «        S )Nr   )Úerror_typesÚmax_retriesr6   )	ÚopenaiÚerrorÚTimeoutÚAPIErrorÚAPIConnectionErrorÚRateLimitErrorÚServiceUnavailableErrorr   r;   )r4   r6   r<   Úerrorss       r2   Ú_create_retry_decoratorrD   N   s`   € ð €M€M€Mð 	ŒÔØŒÔØŒÔ'ØŒÔ#ØŒÔ,ð€Fõ 'Ø¨¬À[ðñ ô ð ó    ú'Optional[AsyncCallbackManagerForLLMRun]Úkwargsc              ‹  ó®   ‡ K  — t          ¦   «         r ‰ j        j        di |¤Žƒ d{V —†S t          ‰ |¬¦  «        }|dˆ fd„¦   «         } |di |¤Žƒ d{V —†S )	z0Use tenacity to retry the async completion call.N©r6   rG   r   r-   c               ›  ó8   •K  —  ‰j         j        di | ¤Žƒ d {V —†S ©N© )ÚclientÚacreate)rG   r4   s    €r2   Ú_completion_with_retryz6acompletion_with_retry.<locals>._completion_with_retrym   s6   øè è € ð (�S”ZÔ'Ð1Ð1¨&Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1rE   rL   ©rG   r   r-   r   )r,   Úasync_clientÚcreaterD   )r4   r6   rG   Úretry_decoratorrO   s   `    r2   Úacompletion_with_retryrT   b   s¨   øè è € õ �~„~ð 7Ø,�SÔ%Ô,Ð6Ð6¨vÐ6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6å-¨c¸{ÐKÑKÔK€Oàð2ð 2ð 2ð 2ð 2ñ „_ð2ð (Ð'Ð1Ð1¨&Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1rE   Ú_dictúMapping[str, Any]Údefault_classúType[BaseMessageChunk]r   c                óÚ  — |                       d¦  «        }|                       d¦  «        pd}i }|                       d¦  «        r+t          | d         ¦  «        }d|v r|d         €d|d<   ||d<   |                       d¦  «        r| d         |d<   |dk    s|t          k    rt          |¬¦  «        S |d	k    s|t          k    rt          ||¬
¦  «        S |dk    s|t          k    rt	          |¬¦  «        S |dk    s|t
          k    rt          || d         ¬¦  «        S |dk    s|t          k    rt          || d         ¬¦  «        S |s|t          k    rt          ||¬¦  «        S  ||¬¦  «        S )NÚroleÚcontentÚ Úfunction_callÚnameÚ
tool_callsÚuser)r[   Ú	assistant)r[   Úadditional_kwargsÚsystemÚfunction)r[   r^   ÚtoolÚtool_call_id)r[   rf   )r[   rZ   )ÚgetÚdictr   r   r   r   r    r   )rU   rW   rZ   r[   rb   r]   s         r2   Ú_convert_delta_to_message_chunkri   u   s¬  € ð �9Š9�VÑÔ€DØ�iŠi˜	Ñ"Ô"Ð( b€GØ ÐØ‡y‚y�Ñ!Ô!ð ;Ý˜U ?Ô3Ñ4Ô4ˆØ�]Ð"Ð" }°VÔ'<Ð'DØ$&ˆM˜&Ñ!Ø-:Ð˜/Ñ*Ø‡y‚y�ÑÔð >Ø*/°Ô*=Ð˜,Ñ'àˆv‚~€~˜Õ*;Ò;Ð;Ý ¨Ð1Ñ1Ô1Ð1Ø	�Ò	Ð	 µÒ ?Ð ?Ý gÐARÐSÑSÔSÐSØ	�Ò	Ð	˜]Õ.@Ò@Ð@Ý!¨'Ð2Ñ2Ô2Ð2Ø	�Ò	Ð	˜}Õ0DÒDÐDÝ#¨G¸%À¼-ÐHÑHÔHÐHØ	�Šˆ˜=Õ,<Ò<Ð<Ý¨¸eÀNÔ>SÐTÑTÔTÐTØ	ð .�Õ"2Ò2Ð2Ý¨°dÐ;Ñ;Ô;Ð;àˆ} WÐ-Ñ-Ô-Ð-rE   z0.0.10z0.2.0zlangchain_openai.ChatOpenAI)ÚsinceÚremovalÚalternative_importc                  ó¬  ‡ — e Zd ZU dZedhd„¦   «         Zedid„¦   «         Zedjd„¦   «         Zedkd
„¦   «         Z	 e
dd¬¦  «        Zded<    e
dd¬¦  «        Zded<    e
dd¬¦  «        Zded<   	 dZded<   	  e
e¬¦  «        Zded<   	  e
dd¬¦  «        Zded<   	  e
dd¬¦  «        Zded<   	  e
dd ¬¦  «        Zded!<   	 dZde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d0ed1<   dZd2ed3<   dZd4ed5<   	  G d6„ d7¦  «        Z e d¬8¦  «        dld:„¦   «         Z! e ¦   «         dmd<„¦   «         Z"edjd=„¦   «         Z#	 dndodA„Z$dpdE„Z%	 	 dqdrdK„Z&	 	 	 dsdtdO„Z'dudQ„Z(dvdT„Z)	 	 dqdwdW„Z*	 	 	 dsdxdX„Z+edjdY„¦   «         Z,edjdZ„¦   «         Z-	 dndyˆ fd[„Z.edzd\„¦   «         Z/d{d^„Z0d|ˆ fda„Z1d}ˆ fdb„Z2	 dnd~ˆ fdg„Z3ˆ xZ4S )r5   a÷  `OpenAI` Chat large language models API.

    To use, you should have the ``openai`` python package installed, and the
    environment variable ``OPENAI_API_KEY`` set with your API key.

    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 ChatOpenAI
            openai = ChatOpenAI(model_name="gpt-3.5-turbo")
    r-   úDict[str, str]c                ó
   — ddiS )NÚopenai_api_keyÚOPENAI_API_KEYrL   ©Úselfs    r2   Ú
lc_secretszChatOpenAI.lc_secrets¦   s   € à Ð"2Ð3Ð3rE   ú	List[str]c                ó
   — g d¢S )z*Get the namespace of the langchain object.)Ú	langchainÚchat_modelsr<   rL   ©Úclss    r2   Úget_lc_namespacezChatOpenAI.get_lc_namespaceª   s   € ð 6Ð5Ð5Ð5rE   úDict[str, Any]c                óp   — i }| j         r
| j         |d<   | j        r
| j        |d<   | j        r
| j        |d<   |S )NÚopenai_organizationÚopenai_api_baseÚopenai_proxy)r~   r   r€   )rs   Ú
attributess     r2   Úlc_attributeszChatOpenAI.lc_attributes¯   sY   € à%'ˆ
àÔ#ð 	IØ04Ô0HˆJÐ,Ñ-àÔð 	AØ,0Ô,@ˆJÐ(Ñ)àÔð 	;Ø)-Ô):ˆJ�~Ñ&àÐrE   Úboolc                ó   — dS )z9Return whether this model can be serialized by Langchain.TrL   ry   s    r2   Úis_lc_serializablezChatOpenAI.is_lc_serializable¾   s	   € ð ˆtrE   NT)ÚdefaultÚexcluder   rM   rQ   úgpt-3.5-turboÚmodel)r†   ÚaliasÚstrÚ
model_namegffffffæ?ÚfloatÚtemperature)Údefault_factoryÚmodel_kwargsÚapi_keyúOptional[str]rp   Úbase_urlr   Úorganizationr~   r€   Útimeoutz,Union[float, Tuple[float, float], Any, None]Úrequest_timeouté   Úintr;   FÚ	streamingé   ÚnzOptional[int]Ú
max_tokensÚtiktoken_model_namezUnion[Mapping[str, str], None]Údefault_headersz!Union[Mapping[str, object], None]Údefault_queryzUnion[Any, None]Úhttp_clientc                  ó   — e Zd ZdZdZdS )úChatOpenAI.Configz'Configuration for this pydantic object.TN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úallow_population_by_field_namerL   rE   r2   ÚConfigr¢   õ   s   € € € € € Ø5Ð5à)-Ð&Ð&Ð&rE   r¨   )ÚpreÚvaluesc           
     ó¤  — t          | ¦  «        }|                     di ¦  «        }t          |¦  «        D ]Y}||v rt          d|› d�¦  «        ‚||vr<t                               d|› d|› d|› d�¦  «         |                     |¦  «        ||<   ŒZ|                     |                     ¦   «         ¦  «        }|rt          d|› d	�¦  «        ‚||d<   |S )
z>Build extra kwargs from additional params that were passed in.r�   zFound z supplied twice.z	WARNING! z/ is not default parameter.
                    zJ was transferred to model_kwargs.
                    Please confirm that z is what you intended.zParameters za should be specified explicitly. Instead they were passed in as part of `model_kwargs` parameter.)	r)   rg   Úlistr1   ÚloggerÚwarningÚpopÚintersectionÚkeys)rz   rª   Úall_required_field_namesÚextraÚ
field_nameÚinvalid_model_kwargss         r2   Úbuild_extrazChatOpenAI.build_extraú   s4  € õ $<¸CÑ#@Ô#@Ð Ø—
’
˜>¨2Ñ.Ô.ˆÝ˜v™,œ,ð 		;ð 		;ˆJØ˜UÐ"Ð"Ý Ð!F¨*Ð!FÐ!FÐ!FÑGÔGÐGØÐ!9Ð9Ð9Ý—’ðN *ð Nð NØðNð Nà)3ðNð Nð Nñô ð ð
 %+§J¢J¨zÑ$:Ô$:��jÑ!øà7×DÒDÀUÇZÂZÁ\Ä\ÑRÔRÐØð 	ÝðTÐ2ð Tð Tð Tñô ð ð
 "'ˆˆ~ÑØˆrE   r   c           	     óR  — |d         dk     rt          d¦  «        ‚|d         dk    r|d         rt          d¦  «        ‚t          |dd¦  «        |d<   |d         p't          j        d	¦  «        pt          j        d
¦  «        |d<   |d         pt          j        d¦  «        |d<   t          |ddd¬¦  «        |d<   	 ddl}n# t
          $ r t          d¦  «        ‚w xY wt          ¦   «         rš|d         |d         |d         |d         |d         |d         |d         |d         dœ}|                     d¦  «        s |j        di |¤Žj	        j
        |d<   |                     d¦  «        s |j        di |¤Žj	        j
        |d<   n!|                     d¦  «        s|j        |d<   n	 |S )z?Validate that api key and python package exists in environment.r›   rš   zn must be at least 1.r™   zn must be 1 when streaming.rp   rq   r~   ÚOPENAI_ORG_IDÚOPENAI_ORGANIZATIONr   ÚOPENAI_API_BASEr€   ÚOPENAI_PROXYr\   )r†   r   NzTCould not import openai python package. Please install it with `pip install openai`.r–   r;   rž   rŸ   r    )r‘   r”   r“   r•   r;   rž   rŸ   r    rM   rQ   rL   )r1   r(   ÚosÚgetenvr<   r0   r,   rg   ÚOpenAIÚchatÚcompletionsÚAsyncOpenAIÚChatCompletion)rz   rª   r<   Úclient_paramss       r2   Úvalidate_environmentzChatOpenAI.validate_environment  s;  € ð �#Œ;˜Š?ˆ?ÝÐ4Ñ5Ô5Ð5Ø�#Œ;˜Š?ˆ?˜v kÔ2ˆ?ÝÐ:Ñ;Ô;Ð;å#7ØÐ$Ð&6ñ$
ô $
ˆÐÑ ð
 Ð(Ô)ð 0ÝŒy˜Ñ)Ô)ð0åŒyÐ.Ñ/Ô/ð 	Ð$Ñ%ð
 %+Ð+<Ô$=ð %
ÅÄØñB
ô B
ˆÐ Ñ!õ "6ØØØØð	"
ñ "
ô "
ˆˆ~Ñð	ØˆMˆMˆMˆMøåð 	ð 	ð 	Ýð?ñô ð ð	øøøõ ‰>Œ>ð 	à!Ð"2Ô3Ø &Ð'<Ô =Ø"Ð#4Ô5Ø!Ð"3Ô4Ø% mÔ4Ø#)Ð*;Ô#<Ø!'¨Ô!8Ø% mÔ4ð	ð 	ˆMð —:’:˜hÑ'Ô'ð SØ#0 6¤=Ð#AÐ#A°=Ð#AÐ#AÔ#FÔ#R��xÑ Ø—:’:˜nÑ-Ô-ð #Ø);¨Ô);ð *ð *Ø#ð*ð *ä”{ð �~Ñ&øð —’˜HÑ%Ô%ð 	Ø%Ô4ˆF�8ÑÐàØˆs   Â<C ÃCc                óª   — | j         | j        | j        | j        dœ| j        ¥}| j        �
| j        |d<   | j        �t          ¦   «         s
| j        |d<   |S )z2Get the default parameters for calling OpenAI API.)r‰   Ústreamr›   rŽ   Nrœ   r–   )rŒ   r™   r›   rŽ   r�   rœ   r–   r,   )rs   Úparamss     r2   Ú_default_paramszChatOpenAI._default_paramsO  sm   € ð ”_Ø”nØ”ØÔ+ð	
ð 
ð
 Ôð
ˆð Œ?Ð&Ø#'¤?ˆF�<Ñ ØÔÐ+µL±N´NÐ+Ø(,Ô(<ˆFÐ$Ñ%ØˆrE   r6   ú"Optional[CallbackManagerForLLMRun]rG   c                ó’   ‡ — t          ¦   «         r ‰ j        j        di |¤ŽS t          ‰ |¬¦  «        }|dˆ fd„¦   «         } |di |¤ŽS )z*Use tenacity to retry the completion call.rI   rG   r   r-   c                 ó(   •—  ‰j         j        di | ¤ŽS rK   )rM   rR   )rG   rs   s    €r2   rO   z@ChatOpenAI.completion_with_retry.<locals>._completion_with_retryh  s   ø€ à%�4”;Ô%Ð/Ð/¨Ð/Ð/Ð/rE   rL   rP   )r,   rM   rR   rD   )rs   r6   rG   rS   rO   s   `    r2   Úcompletion_with_retryz ChatOpenAI.completion_with_retry_  s   ø€ õ ‰>Œ>ð 	0Ø%�4”;Ô%Ð/Ð/¨Ð/Ð/Ð/å1°$ÀKÐPÑPÔPˆà	ð	0ð 	0ð 	0ð 	0ð 	0ñ 
Œð	0ð &Ð%Ð/Ð/¨Ð/Ð/Ð/rE   Úllm_outputsúList[Optional[dict]]rh   c                óê   — i }d }|D ]Z}|€Œ|d         }|�4|                      ¦   «         D ]\  }}||v r||xx         |z  cc<   Œ|||<   Œ |€|                     d¦  «        }Œ[|| j        dœ}|r||d<   |S )NÚtoken_usageÚsystem_fingerprint)rÐ   rŒ   )Úitemsrg   rŒ   )	rs   rÍ   Úoverall_token_usagerÑ   ÚoutputrÐ   ÚkÚvÚcombineds	            r2   Ú_combine_llm_outputszChatOpenAI._combine_llm_outputsn  sÑ   € Ø$&ÐØ!ÐØ!ð 	Fð 	FˆFØˆ~àØ  Ô/ˆKØÐ&Ø'×-Ò-Ñ/Ô/ð 3ð 3‘D�A�qØÐ/Ð/Ð/Ø+¨AÐ.Ð.Ô.°!Ñ3Ð.Ð.Ñ.Ð.à12Ð+¨AÑ.Ð.Ø!Ð)Ø%+§Z¢ZÐ0DÑ%EÔ%EÐ"øØ#6ÀdÄoÐVÐVˆØð 	@Ø-?ˆHÐ)Ñ*ØˆrE   ÚmessagesúList[BaseMessage]ÚstopúOptional[List[str]]úIterator[ChatGenerationChunk]c              +  ó  K  — |                       ||¦  «        \  }}i |¥|¥ddi¥}t          } | j        d||dœ|¤ŽD ]Ì}t          |t          ¦  «        s|                     ¦   «         }t          |d         ¦  «        dk    rŒE|d         d         }	t          |	d         |¦  «        }|	                     d¦  «        }
|
�t	          |
¬¦  «        nd }|j        }t          ||¬	¦  «        }|V — |r| 
                    |j        |¬
¦  «         ŒÍd S )NrÆ   T©rÙ   r6   Úchoicesr   ÚdeltaÚfinish_reason©râ   ©ÚmessageÚgeneration_info)ÚchunkrL   )Ú_create_message_dictsr   rÌ   Ú
isinstancerh   Úlenri   rg   Ú	__class__r"   Úon_llm_new_tokenÚtext©rs   rÙ   rÛ   r6   rG   Úmessage_dictsrÇ   Údefault_chunk_classrç   Úchoicerâ   ræ   s               r2   Ú_streamzChatOpenAI._streamƒ  sc  è è € ð !%× :Ò :¸8ÀTÑ JÔ JÑˆ�vØ5�FÐ5˜fÐ5 h°Ð5Ð5ˆå,ÐØ/�TÔ/ð 
Ø"°ð
ð 
Ø?Eð
ð 
ð 	Fð 	FˆEõ ˜e¥TÑ*Ô*ð %ØŸ
š
™œ�Ý�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rE   rÆ   úOptional[bool]r#   c                óô   — |�|n| j         }|r  | j        |f||dœ|¤Ž}t          |¦  «        S |                      ||¦  «        \  }}	i |	¥|�d|ini ¥|¥}	 | j        d||dœ|	¤Ž}
|                      |
¦  «        S )N©rÛ   r6   rÆ   rß   rL   )r™   rò   r   rè   rÌ   Ú_create_chat_result©rs   rÙ   rÛ   r6   rÆ   rG   Úshould_streamÚstream_iterrï   rÇ   Úresponses              r2   Ú	_generatezChatOpenAI._generate£  sæ   € ð #)Ð"4˜˜¸$¼.ˆØð 	5Ø&˜$œ,ØðØ#°ðð Ø@Fðð ˆKõ (¨Ñ4Ô4Ð4Ø $× :Ò :¸8ÀTÑ JÔ JÑˆ�vð
Øð
à%+Ð%7�˜&Ð!Ð!¸Rð
ð ð
ˆð
 .�4Ô-ð 
Ø"°ð
ð 
Ø?Eð
ð 
ˆð ×'Ò'¨Ñ1Ô1Ð1rE   ú+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 rL   ©r+   ©Ú.0Úms     r2   ú
<listcomp>z4ChatOpenAI._create_message_dicts.<locals>.<listcomp>Ä  ó!   € ÐFÐFÐF¸Õ0°Ñ3Ô3ÐFÐFÐFrE   )Ú_client_paramsr1   )rs   rÙ   rÛ   rÇ   rï   s        r2   rè   z ChatOpenAI._create_message_dicts¼  sS   € ð Ô$ˆØÐØ˜ÐÐÝ Ð!UÑVÔVÐVØ!ˆF�6‰NØFÐF¸XÐFÑFÔFˆØ˜fÐ$Ð$rE   rú   úUnion[dict, BaseModel]c                óÔ  — g }t          |t          ¦  «        s|                     ¦   «         }|d         D ]o}t          |d         ¦  «        }t          |                     d¦  «        ¬¦  «        }d|v r|d         |d<   t	          ||¬¦  «        }|                     |¦  «         Œp|                     di ¦  «        }|| j        |                     dd	¦  «        d
œ}t          ||¬¦  «        S )Nrà   rå   râ   rã   Úlogprobsrä   ÚusagerÑ   r\   )rÐ   rŒ   rÑ   )ÚgenerationsÚ
llm_output)ré   rh   r*   rg   r!   ÚappendrŒ   r#   )	rs   rú   r
  Úresrå   ræ   ÚgenrÐ   r  s	            r2   rö   zChatOpenAI._create_chat_resultÇ  s  € ØˆÝ˜(¥DÑ)Ô)ð 	'Ø—}’}‘”ˆHØ˜IÔ&ð 		$ð 		$ˆCÝ-¨c°)¬nÑ=Ô=ˆGÝ"°·²¸Ñ1IÔ1IÐJÑJÔJˆOØ˜SÐ Ð Ø.1°*¬o� 
Ñ+Ý ØØ /ðñ ô ˆCð ×Ò˜sÑ#Ô#Ð#Ð#Ø—l’l 7¨BÑ/Ô/ˆà&Øœ/Ø"*§,¢,Ð/CÀRÑ"HÔ"Hð
ð 
ˆ
õ
  k¸jÐIÑIÔIÐIrE   rF   ú"AsyncIterator[ChatGenerationChunk]c               ó>  K  — |                       ||¦  «        \  }}i |¥|¥ddi¥}t          }t          | f||dœ|¤Žƒ d {V —†2 3 d {V —†}t          |t          ¦  «        s|                     ¦   «         }t          |d         ¦  «        dk    rŒJ|d         d         }	t          |	d         |¦  «        }|	                     d¦  «        }
|
�t	          |
¬¦  «        nd }|j        }t          ||¬	¦  «        }|W V — |r"| 
                    |j        |¬
¦  «        ƒ d {V —† ŒÙ6 d S )NrÆ   Trß   rà   r   rá   râ   rã   rä   )Útokenrç   )rè   r   rT   ré   rh   rê   ri   rg   rë   r"   rì   rí   rî   s               r2   Ú_astreamzChatOpenAI._astreamÝ  s´  è è € ð !%× :Ò :¸8ÀTÑ JÔ JÑˆ�vØ5�FÐ5˜fÐ5 h°Ð5Ð5ˆå,ÐÝ!7Øð"
Ø(°kð"
ð "
ØEKð"
ð "
ð 
ð 
ð 
ð 
ð 
ð 
ð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	R�%õ ˜e¥TÑ*Ô*ð %ØŸ
š
™œ�Ý�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ˆKØð RØ!×2Ò2¸¼È5Ð2ÑQÔQÐQÐQÐQÐQÐQÐQÐQøð'
ð 
ð 
s   ÁDc              ‹  ó  K  — |�|n| j         }|r& | j        |f||dœ|¤Ž}t          |¦  «        ƒ d {V —†S |                      ||¦  «        \  }}	i |	¥|�d|ini ¥|¥}	t	          | f||dœ|	¤Žƒ d {V —†}
|                      |
¦  «        S )Nrõ   rÆ   rß   )r™   r  r   rè   rT   rö   r÷   s              r2   Ú
_ageneratezChatOpenAI._agenerateý  s  è è € ð #)Ð"4˜˜¸$¼.ˆØð 	<Ø'˜$œ-ØðØ#°ðð Ø@Fðð ˆKõ /¨{Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;à $× :Ò :¸8ÀTÑ JÔ JÑˆ�vð
Øð
à%+Ð%7�˜&Ð!Ð!¸Rð
ð ð
ˆõ
 0Øð
Ø(°kð
ð 
ØEKð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð ×'Ò'¨Ñ1Ô1Ð1rE   c                ó&   — i d| j         i¥| j        ¥S )zGet the identifying parameters.rŒ   )rŒ   rÈ   rr   s    r2   Ú_identifying_paramszChatOpenAI._identifying_params  s   € ð K�< ¤Ð1ÐJ°TÔ5IÐJÐJrE   c                óÔ   — d| j         i}t          ¦   «         s(|                     | j        | j        | j        dœ¦  «         | j        rddl}| j        | j        dœ|_        i | j	        ¥|¥S )z.Get the parameters used for the openai client.r‰   )r‘   Úapi_baser”   r   N)ÚhttpÚhttps)
rŒ   r,   Úupdaterp   r   r~   r€   r<   ÚproxyrÈ   )rs   Úopenai_credsr<   s      r2   r  zChatOpenAI._client_params  s“   € ð �T”_ð(
ˆõ ‰~Œ~ð 	Ø×Òà#Ô2Ø $Ô 4Ø$(Ô$<ðð ñô ð ð Ôð 	SØˆMˆMˆMà$(Ô$5ÀÔ@QÐRÐRˆFŒLØ7�$Ô&Ð7¨,Ð7Ð7rE   c                ól   •— d| j         it          ¦   «                              |¬¦  «        ¥| j        ¥|¥S )z,Get the parameters used to invoke the model.r‰   )rÛ   )rŒ   ÚsuperÚ_get_invocation_paramsrÈ   )rs   rÛ   rG   rë   s      €r2   r   z!ChatOpenAI._get_invocation_params0  sJ   ø€ ð
 �T”_ð
å‰gŒg×,Ò,°$Ð,Ñ7Ô7ð
ð Ô"ð
ð ð	
ð 	
rE   c                ó   — dS )zReturn type of chat model.zopenai-chatrL   rr   s    r2   Ú	_llm_typezChatOpenAI._llm_type;  s	   € ð ˆ}rE   úTuple[str, tiktoken.Encoding]c                ó$  — t          ¦   «         }| j        �| j        }n| j        }|dk    rd}n|dk    rd}	 |                     |¦  «        }nA# t          $ r4 t
                               d¦  «         d}|                     |¦  «        }Y nw xY w||fS )Nrˆ   úgpt-3.5-turbo-0301úgpt-4z
gpt-4-0314z5Warning: model not found. Using cl100k_base encoding.Úcl100k_base)r3   r�   rŒ   Úencoding_for_modelÚKeyErrorr­   r®   Úget_encoding)rs   Ú	tiktoken_r‰   Úencodings       r2   Ú_get_encoding_modelzChatOpenAI._get_encoding_model@  s½   € Ý$Ñ&Ô&ˆ	ØÔ#Ð/ØÔ,ˆEˆEà”OˆEØ˜Ò'Ð'ð -��Ø˜'Ò!Ð!ð %�ð	5Ø ×3Ò3°EÑ:Ô:ˆHˆHøÝð 	5ð 	5ð 	5Ý�NŠNÐRÑSÔSÐSØ!ˆEØ ×-Ò-¨eÑ4Ô4ˆHˆHˆHð	5øøøð �hˆÐs   ·A Á;BÂ
Brí   ú	List[int]c                óÊ   •— t           j        d         dk    r!t          ¦   «                              |¦  «        S |                      ¦   «         \  }}|                     |¦  «        S )z9Get the tokens present in the text with tiktoken package.rš   é   )ÚsysÚversion_infor  Úget_token_idsr-  Úencode)rs   rí   Ú_Úencoding_modelrë   s       €r2   r3  zChatOpenAI.get_token_idsW  sZ   ø€ õ Ô˜AÔ !Ò#Ð#Ý‘7”7×(Ò(¨Ñ.Ô.Ð.Ø ×4Ò4Ñ6Ô6Ñˆˆ>Ø×$Ò$ TÑ*Ô*Ð*rE   c           
     óD  •— t           j        d         dk    r!t          ¦   «                              |¦  «        S |                      ¦   «         \  }}|                     d¦  «        rd}d}nB|                     d¦  «        s|                     d¦  «        rd}d}nt          d	|› d
�¦  «        ‚d}d„ |D ¦   «         }|D ]^}||z  }|                     ¦   «         D ]B\  }	}
|t          | 	                    t          |
¦  «        ¦  «        ¦  «        z  }|	dk    r||z  }ŒCŒ_|dz  }|S )zÛCalculate num tokens for gpt-3.5-turbo and gpt-4 with tiktoken package.

        Official documentation: https://github.com/openai/openai-cookbook/blob/
        main/examples/How_to_format_inputs_to_ChatGPT_models.ipynbrš   r0  r%  é   éÿÿÿÿrˆ   r&  é   zFget_num_tokens_from_messages() is not presently implemented for model zy.See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens.r   c                ó,   — g | ]}t          |¦  «        ‘ŒS rL   rÿ   r   s     r2   r  z;ChatOpenAI.get_num_tokens_from_messages.<locals>.<listcomp>w  r  rE   r^   )r1  r2  r  Úget_num_tokens_from_messagesr-  Ú
startswithÚNotImplementedErrorrÒ   rê   r4  r‹   )rs   rÙ   r‰   r,  Útokens_per_messageÚtokens_per_nameÚ
num_tokensÚmessages_dictrå   ÚkeyÚvaluerë   s              €r2   r<  z'ChatOpenAI.get_num_tokens_from_messages_  sm  ø€ õ
 Ô˜AÔ !Ò#Ð#Ý‘7”7×7Ò7¸ÑAÔAÐAØ×2Ò2Ñ4Ô4‰ˆˆxØ×ÒÐ0Ñ1Ô1ð 	à!"Ðà ˆOˆOØ×Ò˜oÑ.Ô.ð 		°%×2BÒ2BÀ7Ñ2KÔ2Kð 		Ø!"ÐØˆOˆOå%ðGØ"ðGð Gð Gñô ð ð ˆ
ØFÐF¸XÐFÑFÔFˆØ$ð 	2ð 	2ˆGØÐ,Ñ,ˆJØ%Ÿmšm™oœoð 2ð 2‘
��Uð �c (§/¢/µ#°e±*´*Ñ"=Ô"=Ñ>Ô>Ñ>�
Ø˜&’=�=Ø /Ñ1�Jøð2ð 	�a‰ˆ
ØÐrE   Ú	functionsú:Sequence[Union[Dict[str, Any], Type[BaseModel], Callable]]r]   ú)Runnable[LanguageModelInput, BaseMessage]c                ó,  •‡— ddl mŠ ˆfd„|D ¦   «         }|�bt          |¦  «        dk    rt          d¦  «        ‚|d         d         |k    r"t          d|› d	|d         d         › d
�¦  «        ‚d|i}i |¥d|i¥} t	          ¦   «         j        dd|i|¤ŽS )aÛ  Bind functions (and other objects) to this chat model.

        Args:
            functions: A list of function definitions to bind to this chat model.
                Can be  a dictionary, pydantic model, or callable. Pydantic
                models and callables will be automatically converted to
                their schema dictionary representation.
            function_call: Which function to require the model to call.
                Must be the name of the single provided function or
                "auto" to automatically determine which function to call
                (if any).
            kwargs: Any additional parameters to pass to the
                :class:`~langchain.runnable.Runnable` constructor.
        r   )Úconvert_to_openai_functionc                ó&   •— g | ]} ‰|¦  «        ‘ŒS rL   rL   )r  ÚfnrI  s     €r2   r  z-ChatOpenAI.bind_functions.<locals>.<listcomp>š  s%   ø€ ÐRÐRÐRÀ"Ð9Ð9¸"Ñ=Ô=ÐRÐRÐRrE   Nrš   zGWhen specifying `function_call`, you must provide exactly one function.r^   zFunction call z3 was specified, but the only provided function was ú.r]   rE  rL   )Ú&langchain.chains.openai_functions.baserI  rê   r1   r  Úbind)rs   rE  r]   rG   Úformatted_functionsÚfunction_call_rI  rë   s         @€r2   Úbind_functionszChatOpenAI.bind_functions„  s  øø€ ð( 	VÐUÐUÐUÐUÐUàRÐRÐRÐRÈ	ÐRÑRÔRÐØÐ$ÝÐ&Ñ'Ô'¨1Ò,Ð,Ý ð ñô ð ð # 1Ô% fÔ-°Ò>Ð>Ý ðO ]ð Oð OØ-@ÀÔ-CÀFÔ-KðOð Oð Oñô ð ð % mÐ4ˆNØ@˜Ð@ °Ð@Ð@ˆFØ�u‰wŒwŒ|ð 
ð 
Ø)ð
àð
ð 
ð 	
rE   )r-   rn   )r-   ru   )r-   r|   )r-   rƒ   )rª   r|   r-   r|   )rª   r   r-   r   ©N)r6   rÉ   rG   r   r-   r   )rÍ   rÎ   r-   rh   )NN)
rÙ   rÚ   rÛ   rÜ   r6   rÉ   rG   r   r-   rÝ   )NNN)rÙ   rÚ   rÛ   rÜ   r6   rÉ   rÆ   ró   rG   r   r-   r#   )rÙ   rÚ   rÛ   rÜ   r-   rü   )rú   r  r-   r#   )
rÙ   rÚ   rÛ   rÜ   r6   rF   rG   r   r-   r  )rÙ   rÚ   rÛ   rÜ   r6   rF   rÆ   ró   rG   r   r-   r#   )rÛ   rÜ   rG   r   r-   r|   )r-   r‹   )r-   r#  )rí   r‹   r-   r.  )rÙ   rÚ   r-   r˜   )rE  rF  r]   r’   rG   r   r-   rG  )5r£   r¤   r¥   r¦   Úpropertyrt   Úclassmethodr{   r‚   r…   r%   rM   Ú__annotations__rQ   rŒ   rŽ   rh   r�   rp   r   r~   r€   r–   r;   r™   r›   rœ   r�   rž   rŸ   r    r¨   r&   r¶   rÄ   rÈ   rÌ   rØ   rò   rû   rè   rö   r  r  r  r  r   r"  r-  r3  r<  rQ  Ú__classcell__)rë   s   @r2   r5   r5   “   s4  ø€ € € € € € ðð ð ð4ð 4ð 4ñ „Xð4ð ð6ð 6ð 6ñ „[ð6ð ðð ð ñ „Xðð ðð ð ñ „[ðð �% ¨dÐ3Ñ3Ô3€FÐ3Ð3Ð3Ñ3Ø˜ d°DÐ9Ñ9Ô9€LÐ9Ð9Ð9Ñ9Ø�e O¸7ÐCÑCÔC€JÐCÐCÐCÑCØØ€KÐÐÐÑØ+Ø#( 5¸Ð#>Ñ#>Ô#>€LÐ>Ð>Ð>Ñ>ØVð %* E°$¸iÐ$HÑ$HÔ$H€NÐHÐHÐHÑHØOØ%* U°4¸zÐ%JÑ%JÔ%J€OÐJÐJÐJÑJðà).¨°tÀ>Ð)RÑ)RÔ)RÐÐRÐRÐRÑRØNà"&€LÐ&Ð&Ð&Ñ&ØDIÀEØ˜IðEñ Eô E€Oð ð ð ñ ðà€KÐÐÐÑØ<Ø€IÐÐÐÑØ/Ø€A€J€J€J�JØAØ $€JÐ$Ð$Ð$Ñ$Ø/Ø)-ÐÐ-Ð-Ð-Ñ-ðJð 7;€OÐ:Ð:Ð:Ñ:Ø7;€MÐ;Ð;Ð;Ñ;ð %)€KÐ(Ð(Ð(Ñ(Ø ð.ð .ð .ð .ð .ñ .ô .ð .ð
 €^˜ÐÑÔðð ð ñ Ôðð2 €^ÑÔð8ð 8ð 8ñ Ôð8ðt ðð ð ñ „Xðð  AEð0ð 0ð 0ð 0ð 0ðð ð ð ð0 %)Ø:>ð	Fð Fð Fð Fð FðF %)Ø:>Ø!%ð2ð 2ð 2ð 2ð 2ð2	%ð 	%ð 	%ð 	%ðJð Jð Jð Jð2 %)Ø?Cð	Rð Rð Rð Rð RðF %)Ø?CØ!%ð2ð 2ð 2ð 2ð 2ð4 ðKð Kð Kñ „XðKð ð8ð 8ð 8ñ „Xð8ð( +/ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ðð ð ñ „Xððð ð ð ð.+ð +ð +ð +ð +ð +ð#ð #ð #ð #ð #ð #ðP (,ð'
ð '
ð '
ð '
ð '
ð '
ð '
ð '
ð '
ð '
ð '
rE   )r-   r   rR  )r4   r5   r6   r7   r-   r8   )r4   r5   r6   rF   rG   r   r-   r   )rU   rV   rW   rX   r-   r   )Er¦   Ú
__future__r   Úloggingr¼   r1  Útypingr   r   r   r   r   r	   r
   r   r   r   r   r   r   Úlangchain_core._api.deprecationr   Úlangchain_core.callbacksr   r   Úlangchain_core.language_modelsr   Ú*langchain_core.language_models.chat_modelsr   r   r   Ú#langchain_core.language_models.llmsr   Úlangchain_core.messagesr   r   r   r   r   r   r   r    Úlangchain_core.outputsr!   r"   r#   Úlangchain_core.pydantic_v1r$   r%   r&   Úlangchain_core.runnablesr'   Úlangchain_core.utilsr(   r)   Ú#langchain_community.adapters.openair*   r+   Ú langchain_community.utils.openair,   r/   Ú	getLoggerr£   r­   r3   rD   rT   ri   r5   rL   rE   r2   ú<module>rg     sn  ðØ Ð Ø "Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø 
€
€
€
ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð  7Ð 6Ð 6Ð 6Ð 6Ð 6ðð ð ð ð ð ð ð ð >Ð =Ð =Ð =Ð =Ð =ðð ð ð ð ð ð ð ð ð ð
 LÐ KÐ KÐ KÐ KÐ Kð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð SÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RØ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GØ -Ð -Ð -Ð -Ð -Ð -ðð ð ð ð ð ð ð ð
ð ð ð ð ð ð ð ð :Ð 9Ð 9Ð 9Ð 9Ð 9àð Ø€O€O€Oð 
ˆÔ	˜8Ñ	$Ô	$€ð	ð 	ð 	ð 	ð  	ð	ð ð ð ð ð, <@ð2ð 2ð 2ð 2ð 2ð&.ð .ð .ð .ð< €Ø
˜GÐ8Uðñ ô ðU
ð U
ð U
ð U
ð U
�ñ U
ô U
ñô ðU
ð U
ð U
rE   