Ë
    µŒjHo  ã                  ó  — 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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/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z; ddl<m=Z=m>Z> ddl?m@Z@ erddlAZA ej„                  eC«      ZDdd„ZE	 d	 	 	 	 	 dd„ZF	 d	 	 	 	 	 	 	 d d„ZG	 	 	 	 	 	 d!d„ZH	 	 	 	 	 	 d"d„ZI eddd¬«       G d„ de«      «       ZJy)#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)ÚRunnable)ÚBaseTool)Úget_from_dict_or_envÚget_pydantic_field_namesÚpre_init)Ú	BaseModelÚ
ConfigDictÚFieldÚmodel_validator)Úconvert_dict_to_messageÚconvert_message_to_dict)Úis_openai_v1c                 ó@   — 	 dd l } | S # t        $ r t        d«      ‚w xY w)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)r1   s    úp/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/chat_models/openai.pyÚ_import_tiktokenr4   F   s4   € ð
Ûð €Oøô ò 
Üð=ó
ð 	
ð
ús   ‚ ˆÚ
ChatOpenAIc                ó  — dd l }|j                  j                  |j                  j                  |j                  j                  |j                  j
                  |j                  j                  g}t        || j                  |¬«      S )Nr   )Úerror_typesÚmax_retriesÚrun_manager)	ÚopenaiÚerrorÚTimeoutÚAPIErrorÚAPIConnectionErrorÚRateLimitErrorÚServiceUnavailableErrorr   r8   )Úllmr9   r:   Úerrorss       r3   Ú_create_retry_decoratorrC   R   sk   € ó ð 	�‰×ÑØ�‰×ÑØ�‰×'Ñ'Ø�‰×#Ñ#Ø�‰×,Ñ,ð€Fô 'Ø¨¯©À[ôð ó    c              ‹  óÀ   ‡ K  — t        «       r$ ‰ j                  j                  di |¤Žƒ d{  –—† S t        ‰ |¬«      }|dˆ fd„«       } |di |¤Žƒ d{  –—† S 7 Œ,7 Œ­w)z0Use tenacity to retry the async completion call.N©r9   c               ›  óX   •K  —  ‰j                   j                  di | ¤Žƒ d {  –—† S 7 Œ­w©N© )ÚclientÚacreate)ÚkwargsrA   s    €r3   Ú_completion_with_retryz6acompletion_with_retry.<locals>._completion_with_retryq   s)   øè ø€ ð (�S—Z‘Z×'Ñ'Ñ1¨&Ñ1×1Ð1Ð1ús   ƒ *£(¤*rI   ©rL   r   Úreturnr   )r/   Úasync_clientÚcreaterC   )rA   r9   rL   Úretry_decoratorrM   s   `    r3   Úacompletion_with_retryrS   f   si   øè ø€ ô „~Ø,�S×%Ñ%×,Ñ,Ñ6¨vÑ6×6Ð6ä-¨c¸{ÔK€Oàô2ó ð2ñ (Ñ1¨&Ñ1×1Ð1ð 7øð 2ús!   ƒ*A­A®'AÁAÁAÁAc                ó@  — | j                  d«      }| j                  d«      xs d}i }| j                  d«      r!t        | d   «      }d|v r
|d   €d|d<   ||d<   | j                  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)rV   Ú	assistant)rV   Úadditional_kwargsÚsystemÚfunction)rV   rY   ÚtoolÚtool_call_id)rV   ra   )rV   rU   )ÚgetÚdictr   r   r   r   r    r   )Ú_dictÚdefault_classrU   rV   r]   rX   s         r3   Ú_convert_delta_to_message_chunkrf   y   s@  € ð �9‰9�VÓ€DØ�i‰i˜	Ó"Ò( b€GØ ÐØ‡y�y�Ô!Ü˜U ?Ñ3Ó4ˆØ�]Ñ" }°VÑ'<Ð'DØ$&ˆM˜&Ñ!Ø-:Ð˜/Ñ*Ø‡y�y�ÔØ*/°Ñ*=Ð˜,Ñ'àˆv‚~˜Ô*;Ò;Ü ¨Ô1Ð1Ø	�Ò	 ´Ò ?Ü gÐARÔSÐSØ	�Ò	˜]Ô.@Ò@Ü!¨'Ô2Ð2Ø	�Ò	˜}Ô0DÒDÜ#¨G¸%À¹-ÔHÐHØ	�Š˜=Ô,<Ò<Ü¨¸eÀNÑ>SÔTÐTÙ	�Ô"2Ò2Ü¨°dÔ;Ð;á WÔ-Ð-rD   c                óæ  — t        |t        «      r8t        | t        «      s#t        dt        |«      › dt        | «      › �«      ‚|| z   S t        |t        «      rqt        | t        «      s#t        dt        |«      › dt        | «      › �«      ‚|j                  «       D ��ci c]"  \  }}|t        | j                  |d«      |«      “Œ$ c}}S t        j                  dt        |«      › �«       |S c c}}w )Nz%Got different types for token usage: z and r   z!Unexpected type for token usage: )
Ú
isinstanceÚintÚ
ValueErrorÚtyperc   ÚitemsÚ_update_token_usagerb   ÚwarningsÚwarn)Úoverall_token_usageÚ	new_usageÚkÚvs       r3   rm   rm   —   s  € ô
 �)œSÔ!ÜÐ-¬sÔ3ÜØ7Ü˜	“?Ð# 5¬Ð.AÓ)BÐ(CðEóð ð Ð.Ñ.Ð.Ü	�IœtÔ	$ÜÐ-¬tÔ4ÜØ7Ü˜	“?Ð# 5¬Ð.AÓ)BÐ(CðEóð ð "Ÿ™Ô)ô
á)‘��1ð Ô"Ð#6×#:Ñ#:¸1¸aÓ#@À!ÓDÑDØ)ò
ð 	
ô
 	�‰Ð9¼$¸y»/Ð9JÐKÔLØÐùó
s   Â'C-z0.0.10z1.0zlangchain_openai.ChatOpenAI)ÚsinceÚremovalÚalternative_importc                  óÆ  ‡ — e Zd ZU dZedJd„«       ZedKd„«       ZedLd„«       ZedMd„«       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"<   	  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d0ed1<   dZd2ed3<   	  ed	¬4«      Z  e!d5¬6«      edNd7„«       «       Z"e#dOd8„«       Z$edLd9„«       Z%	 dP	 	 	 	 	 dQd:„Z&dRd;„Z'	 	 dS	 	 	 	 	 	 	 	 	 dTd<„Z(	 	 	 dU	 	 	 	 	 	 	 	 	 	 	 dVd=„Z)	 	 	 	 	 	 dWd>„Z*dXd?„Z+	 	 dS	 	 	 	 	 	 	 	 	 dYd@„Z,	 	 	 dU	 	 	 	 	 	 	 	 	 	 	 dZdA„Z-edLdB„«       Z.edLdC„«       Z/	 dP	 	 	 	 	 d[ˆ fdD„Z0ed\dE„«       Z1d]dF„Z2d^ˆ fdG„Z3	 dP	 	 	 	 	 d_ˆ fdH„Z4	 dP	 	 	 	 	 	 	 d`ˆ fdI„Z5ˆ xZ6S )ar5   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="gpt-3.5-turbo")
    c                ó
   — ddiS )NÚopenai_api_keyÚOPENAI_API_KEYrI   ©Úselfs    r3   Ú
lc_secretszChatOpenAI.lc_secretsÅ   s   € à Ð"2Ð3Ð3rD   c                ó
   — g d¢S )z*Get the namespace of the langchain object.)Ú	langchainÚchat_modelsr:   rI   ©Úclss    r3   Úget_lc_namespacezChatOpenAI.get_lc_namespaceÉ   s
   € ò 6Ð5rD   úDict[str, Any]c                ó¬   — 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ˆ   )r|   Ú
attributess     r3   Úlc_attributeszChatOpenAI.lc_attributesÎ   sZ   € à%'ˆ
à×#Ò#Ø04×0HÑ0HˆJÐ,Ñ-à×ÒØ,0×,@Ñ,@ˆJÐ(Ñ)à×ÒØ)-×):Ñ):ˆJ�~Ñ&àÐrD   Úboolc                 ó   — y)z9Return whether this model can be serialized by Langchain.TrI   r�   s    r3   Úis_lc_serializablezChatOpenAI.is_lc_serializableÝ   s   € ð rD   NT)ÚdefaultÚexcluder   rJ   rP   úgpt-3.5-turboÚmodel)rŽ   ÚaliasÚstrÚ
model_namegffffffæ?ÚfloatÚtemperature)Údefault_factoryÚmodel_kwargsÚapi_keyúOptional[str]ry   Úbase_urlr‡   Úorganizationr†   rˆ   Útimeoutz,Union[float, Tuple[float, float], Any, None]Úrequest_timeouté   ©rŽ   ri   r8   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_client)Úpopulate_by_nameÚbefore)Úmodec           
     ó`  — t        | «      }|j                  di «      }t        |«      D ]M  }||v rt        d|› d�«      ‚||vsŒt        j                  d|› d|› d|› d�«       |j                  |«      ||<   ŒO |j                  |j                  «       «      }|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'   rb   Úlistrj   ÚloggerÚwarningÚpopÚintersectionÚkeys)r‚   ÚvaluesÚall_required_field_namesÚextraÚ
field_nameÚinvalid_model_kwargss         r3   Úbuild_extrazChatOpenAI.build_extra  sç   € ô $<¸CÓ#@Ð Ø—
‘
˜>¨2Ó.ˆÜ˜vž,ˆJØ˜UÑ"Ü  6¨*¨Ð5EÐ!FÓGÐGØÐ!9Ò9Ü—‘Ø! * ð .Ø�Lð !)Ø)3¨Ð4JðNôð
 %+§J¡J¨zÓ$:��jÒ!ð 'ð  8×DÑDÀUÇZÁZÃ\ÓRÐÙÜØÐ2Ð3ð 4Sð Tóð ð
 "'ˆˆ~ÑØˆrD   c           	     ó  — |d   dk  rt        d«      ‚|d   dkD  r|d   rt        d«      ‚t        |dd«      |d<   |d   xs, t        j                  d	«      xs t        j                  d
«      |d<   |d   xs t        j                  d«      |d<   t        |ddd¬«      |d<   	 ddl}t        «       r™|d   |d   |d   |d   |d   |d   |d   |d   dœ}|j                  d«      s) |j                  di |¤Žj                  j                  |d<   |j                  d«      s) |j                  di |¤Žj                  j                  |d<   |S |j                  d«      s|j                  |d<   |S 	 |S # t
        $ r t        d«      ‚w xY w)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.ry   rz   r†   ÚOPENAI_ORG_IDÚOPENAI_ORGANIZATIONr‡   ÚOPENAI_API_BASErˆ   ÚOPENAI_PROXYrW   r    r   NzTCould not import openai python package. Please install it with `pip install openai`.rž   r8   r¦   r§   r¨   )r™   rœ   r›   r�   r8   r¦   r§   r¨   rJ   rP   rI   )rj   r&   ÚosÚgetenvr:   r2   r/   rb   ÚOpenAIÚchatÚcompletionsÚAsyncOpenAIÚChatCompletion)r‚   r³   r:   Úclient_paramss       r3   Úvalidate_environmentzChatOpenAI.validate_environment3  sì  € ð �#‰;˜Š?ÜÐ4Ó5Ð5Ø�#‰;˜Š?˜v kÒ2ÜÐ:Ó;Ð;ä#7ØÐ$Ð&6ó$
ˆÐÑ ð
 Ð(Ñ)ò 0Ü�y‰y˜Ó)ò0ä�y‰yÐ.Ó/ð 	Ð$Ñ%ð
 %+Ð+<Ñ$=ò %
ÄÇÁØóB
ˆÐ Ñ!ô "6ØØØØô	"
ˆˆ~Ñð	Ûô Œ>à!Ð"2Ñ3Ø &Ð'<Ñ =Ø"Ð#4Ñ5Ø!Ð"3Ñ4Ø% mÑ4Ø#)Ð*;Ñ#<Ø!'¨Ñ!8Ø% mÑ4ñ	ˆMð —:‘:˜hÔ'Ø#0 6§=¡=Ñ#A°=Ñ#A×#FÑ#F×#RÑ#R��xÑ Ø—:‘:˜nÔ-Ø);¨×);Ñ);ñ *Ø#ñ*ç‘$—{‘{ð �~Ñ&ð ˆð	 —‘˜HÔ%Ø%×4Ñ4ˆF�8Ñð ˆð Øˆøô9 ò 	Üð?óð ð	ús   Â$E0 Å0F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–   r¤   rž   )r”   r¡   r£   r–   r˜   r¤   rž   r/   )r|   Úparamss     r3   Ú_default_paramszChatOpenAI._default_paramsn  sy   € ð —_‘_Ø—n‘nØ—‘Ø×+Ñ+ñ	
ð
 ×Ñð
ˆð �?‰?Ð&Ø#'§?¡?ˆF�<Ñ Ø×ÑÐ+´L´NØ(,×(<Ñ(<ˆFÐ$Ñ%ØˆrD   c                ó�   ‡ — t        «       r ‰ j                  j                  di |¤ŽS t        ‰ |¬«      }|dˆ fd„«       } |di |¤ŽS )z*Use tenacity to retry the completion call.rF   c                 ó<   •—  ‰j                   j                  di | ¤ŽS rH   )rJ   rQ   )rL   r|   s    €r3   rM   z@ChatOpenAI.completion_with_retry.<locals>._completion_with_retry‡  s   ø€ à%�4—;‘;×%Ñ%Ñ/¨Ñ/Ð/rD   rI   rN   )r/   rJ   rQ   rC   )r|   r9   rL   rR   rM   s   `    r3   Úcompletion_with_retryz ChatOpenAI.completion_with_retry~  sR   ø€ ô Œ>Ø%�4—;‘;×%Ñ%Ñ/¨Ñ/Ð/ä1°$ÀKÔPˆà	ô	0ó 
ð	0ñ &Ñ/¨Ñ/Ð/rD   c                óì   — i }d }|D ]T  }|€Œ|d   }|�4|j                  «       D ]!  \  }}||v rt        ||   |«      ||<   Œ|||<   Œ# |�ŒD|j                  d«      }ŒV || j                  dœ}|r||d<   |S )NÚtoken_usageÚsystem_fingerprint)rÏ   r”   )rl   rm   rb   r”   )	r|   Úllm_outputsrp   rÐ   ÚoutputrÏ   rr   rs   Úcombineds	            r3   Ú_combine_llm_outputszChatOpenAI._combine_llm_outputs�  s²   € Ø$&ÐØ!ÐÛ!ˆFØˆ~àØ  Ñ/ˆKØÐ&Ø'×-Ñ-Ö/‘D�A�qØÐ/Ñ/Ü1DØ/°Ñ2°Aó2Ð+¨AÒ.ð 23Ð+¨AÒ.ð 0ð "Ñ)Ø%+§Z¡ZÐ0DÓ%EÑ"ð "ð $7ÀdÇoÁoÑVˆÙØ-?ˆHÐ)Ñ*ØˆrD   c              +  óâ  K  — | j                  ||«      \  }}i |¥|¥ddi¥}t        } | j                  d||dœ|¤ŽD ]®  }t        |t        «      s|j	                  «       }t        |d   «      dk(  rŒ5|d   d   }	|	d   €ŒCt        |	d   |«      }|	j                  d«      }
|
�t	        |
¬«      nd }|j                  }t        ||¬	«      }|r|j                  |j                  |¬
«       |–— Œ° y ­w)NrÈ   T©Úmessagesr9   Úchoicesr   ÚdeltaÚfinish_reason©rÚ   ©ÚmessageÚgeneration_info)ÚchunkrI   )Ú_create_message_dictsr   rÍ   rh   rc   Úlenrf   rb   Ú	__class__r"   Úon_llm_new_tokenÚtext©r|   r×   Ústopr9   rL   Úmessage_dictsrÉ   Údefault_chunk_classrß   ÚchoicerÚ   rÞ   Úcg_chunks                r3   Ú_streamzChatOpenAI._stream¤  s!  è ø€ ð !%× :Ñ :¸8ÀTÓ JÑˆ�vØ5�FÐ5˜fÐ5 h°Ñ5ˆä6DÐØ/�T×/Ñ/ð 
Ø"°ñ
Ø?Eô
ˆEô ˜e¤TÔ*ØŸ
™
›�Ü�5˜Ñ#Ó$¨Ò)ØØ˜9Ñ% aÑ(ˆFØ�g‰Ð&ØÜ3Ø�w‘Ð!4óˆEð #ŸJ™J Ó7ˆMà5BÐ5N” =Õ1ÐTXð ð #(§/¡/ÐÜ*Ø¨ôˆHñ Ø×,Ñ,¨X¯]©]À(Ð,ÔKØ‹Nñ/
ùs   ‚C-C/c                óú   — |�|n| j                   }|r! | j                  |f||dœ|¤Ž}t        |«      S | j                  ||«      \  }}	i |	¥|�d|ini ¥|¥}	 | j                  d||dœ|	¤Ž}
| j                  |
«      S )N©ræ   r9   rÈ   rÖ   rI   )r¡   rë   r   rà   rÍ   Ú_create_chat_result©r|   r×   ræ   r9   rÈ   rL   Úshould_streamÚstream_iterrç   rÉ   Úresponses              r3   Ú	_generatezChatOpenAI._generateÈ  sÆ   € ð #)Ð"4™¸$¿.¹.ˆÙØ&˜$Ÿ,™,ØðØ#°ñØ@FñˆKô (¨Ó4Ð4Ø $× :Ñ :¸8ÀTÓ JÑˆ�vð
Øð
à%+Ð%7�˜&Ñ!¸Rð
ð ð
ˆð
 .�4×-Ñ-ð 
Ø"°ñ
Ø?Eñ
ˆð ×'Ñ'¨Ó1Ð1rD   c                óˆ   — | j                   }|�d|v rt        d«      ‚||d<   |D �cg c]  }t        |«      ‘Œ }}||fS c c}w )Nræ   z2`stop` found in both the input and default params.)Ú_client_paramsrj   r.   )r|   r×   ræ   rÉ   Úmrç   s         r3   rà   z ChatOpenAI._create_message_dictsá  s]   € ð ×$Ñ$ˆØÐØ˜ÑÜ Ð!UÓVÐVØ!ˆF�6‰NÙ=EÓF¹X¸Ô0°Õ3¸XˆÐFØ˜fÐ$Ð$ùò Gs   §?c                ó~  — g }t        |t        «      s|j                  «       }|d   D ]U  }t        |d   «      }t        |j                  d«      ¬«      }d|v r|d   |d<   t	        ||¬«      }|j                  |«       ŒW |j                  di «      }|| j                  |j                  dd	«      d
œ}t        ||¬«      S )NrØ   rÝ   rÚ   rÛ   ÚlogprobsrÜ   ÚusagerÐ   rW   )rÏ   r”   rÐ   )ÚgenerationsÚ
llm_output)rh   rc   r-   rb   r!   Úappendr”   r#   )	r|   rò   rú   ÚresrÝ   rÞ   ÚgenrÏ   rû   s	            r3   rî   zChatOpenAI._create_chat_resultì  sÃ   € ØˆÜ˜(¤DÔ)Ø—}‘}“ˆHØ˜IÔ&ˆCÜ-¨c°)©nÓ=ˆGÜ"°·±¸Ó1IÔJˆOØ˜SÑ Ø.1°*©o� 
Ñ+Ü ØØ /ôˆCð ×Ñ˜sÕ#ð 'ð —l‘l 7¨BÓ/ˆà&ØŸ/™/Ø"*§,¡,Ð/CÀRÓ"Hñ
ˆ
ô
  k¸jÔIÐIrD   c               ó  K  — | j                  ||«      \  }}i |¥|¥ddi¥}t        }t        | f||dœ|¤Žƒ d {  –—† 2 3 d {  –—† }t        |t        «      s|j	                  «       }t        |d   «      dk(  rŒ;|d   d   }	|	d   €ŒIt        |	d   |«      }|	j                  d«      }
|
�t	        |
¬«      nd }|j                  }t        ||¬	«      }|r%|j                  |j                  |¬
«      ƒ d {  –—†  |­–— Œ¿7 ŒÃ7 Œ¼7 Œ6 y ­w)NrÈ   TrÖ   rØ   r   rÙ   rÚ   rÛ   rÜ   )Útokenrß   )rà   r   rS   rh   rc   rá   rf   rb   râ   r"   rã   rä   rå   s                r3   Ú_astreamzChatOpenAI._astream  sD  è ø€ ð !%× :Ñ :¸8ÀTÓ JÑˆ�vØ5�FÐ5˜fÐ5 h°Ñ5ˆä6DÐÜ!7Øð"
Ø(°kñ"
ØEKñ"
÷ 
ð 
÷ 	�%ô ˜e¤TÔ*ØŸ
™
›�Ü�5˜Ñ#Ó$¨Ò)ØØ˜9Ñ% aÑ(ˆFØ�g‰Ð&ØÜ3Ø�w‘Ð!4óˆEð #ŸJ™J Ó7ˆMà5BÐ5N” =Õ1ÐTXð ð #(§/¡/ÐÜ*Ø¨ôˆHñ Ø!×2Ñ2¸¿¹ÈhÐ2ÓW×WÐWØŒNð/
øð 	øð, Xøñ-
ùsE   ‚8DºC>»D¿DÁD ÁDÁB,DÃ3DÃ4DÄ DÄDÄDc              ‹  ó  K  — |�|n| j                   }|r) | j                  |f||dœ|¤Ž}t        |«      ƒ d {  –—† S | j                  ||«      \  }}	i |	¥|�d|ini ¥|¥}	t	        | f||dœ|	¤Žƒ d {  –—† }
| j                  |
«      S 7 ŒO7 Œ­w)Nrí   rÈ   rÖ   )r¡   r  r   rà   rS   rî   rï   s              r3   Ú
_ageneratezChatOpenAI._agenerate&  sØ   è ø€ ð #)Ð"4™¸$¿.¹.ˆÙØ'˜$Ÿ-™-ØðØ#°ñØ@FñˆKô /¨{Ó;×;Ð;à $× :Ñ :¸8ÀTÓ JÑˆ�vð
Øð
à%+Ð%7�˜&Ñ!¸Rð
ð ð
ˆô
 0Øð
Ø(°kñ
ØEKñ
÷ 
ˆð ×'Ñ'¨Ó1Ð1ð <øð
ús!   ‚7B¹B	º9BÁ3BÁ4BÂBc                ó:   — i d| j                   i¥| j                  ¥S )zGet the identifying parameters.r”   )r”   rÊ   r{   s    r3   Ú_identifying_paramszChatOpenAI._identifying_params@  s$   € ð K�< §¡Ð1ÐJ°T×5IÑ5IÐJÐJrD   c                ó  — d| j                   i}t        «       s3|j                  | 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/   Úupdatery   r‡   r†   rˆ   r:   ÚproxyrÊ   )r|   Úopenai_credsr:   s      r3   rõ   zChatOpenAI._client_paramsE  s…   € ð �T—_‘_ð(
ˆô Œ~Ø×Ñà#×2Ñ2Ø $× 4Ñ 4Ø$(×$<Ñ$<ñôð ×ÒÛà$(×$5Ñ$5À×@QÑ@QÑRˆFŒLØ7�$×&Ñ&Ð7¨,Ð7Ð7rD   c                ó\   •— d| j                   it        ‰| �	  |¬«      ¥| j                  ¥|¥S )z,Get the parameters used to invoke the model.r‘   )ræ   )r”   ÚsuperÚ_get_invocation_paramsrÊ   )r|   ræ   rL   râ   s      €r3   r  z!ChatOpenAI._get_invocation_paramsY  sG   ø€ ð
 �T—_‘_ð
ä‰gÑ,°$Ð,Ó7ð
ð ×"Ñ"ð
ð ð	
ð 	
rD   c                 ó   — y)zReturn type of chat model.zopenai-chatrI   r{   s    r3   Ú	_llm_typezChatOpenAI._llm_typed  s   € ð rD   c                ó  — t        «       }| j                  �| j                  }n| j                  }|dk(  rd}n|dk(  rd}	 |j                  |«      }||fS # t        $ r. t
        j                  d«       d}|j                  |«      }Y ||fS w xY w)Nr�   úgpt-3.5-turbo-0301úgpt-4z
gpt-4-0314z5Warning: model not found. Using cl100k_base encoding.Úcl100k_base)r4   r¥   r”   Úencoding_for_modelÚKeyErrorr®   r¯   Úget_encoding)r|   Ú	tiktoken_r‘   Úencodings       r3   Ú_get_encoding_modelzChatOpenAI._get_encoding_modeli  s¦   € Ü$Ó&ˆ	Ø×#Ñ#Ð/Ø×,Ñ,‰Eà—O‘OˆEØ˜Ò'ð -‘Ø˜'Ò!ð %�ð	5Ø ×3Ñ3°EÓ:ˆHð
 �hˆÐøô	 ò 	5Ü�N‰NÐRÔSØ!ˆEØ ×-Ñ-¨eÓ4‰HØ�hˆÐð		5ús   Á A Á1BÂBc                ó–   •— t         j                  d   dk  rt        ‰| �  |«      S | j	                  «       \  }}|j                  |«      S )z9Get the tokens present in the text with tiktoken package.r¢   é   )ÚsysÚversion_infor  Úget_token_idsr  Úencode)r|   rä   Ú_Úencoding_modelrâ   s       €r3   r   zChatOpenAI.get_token_ids€  sL   ø€ ô ×Ñ˜AÑ !Ò#Ü‘7Ñ(¨Ó.Ð.Ø ×4Ñ4Ó6Ñˆˆ>Ø×$Ñ$ TÓ*Ð*rD   c           
     ó0  •— |�t        j                  d«       t        j                  d   dk  rt        ‰| �  |«      S | j                  «       \  }}|j                  d«      rd}d}n6|j                  d«      s|j                  d«      rd	}d}nt        d
|› d�«      ‚d}|D �cg c]  }t        |«      ‘Œ }	}|	D ]P  }
||z  }|
j                  «       D ]6  \  }}|t        |j                  t        |«      «      «      z  }|dk(  sŒ2||z  }Œ8 ŒR |d	z  }|S c c}w )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.ipynbzECounting tokens in tool schemas is not yet supported. Ignoring tools.r¢   r  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   rY   )rn   ro   r  r  r  Úget_num_tokens_from_messagesr  Ú
startswithÚNotImplementedErrorr.   rl   rá   r!  r“   )r|   r×   Útoolsr‘   r  Útokens_per_messageÚtokens_per_nameÚ
num_tokensrö   Úmessages_dictrÝ   ÚkeyÚvaluerâ   s                €r3   r(  z'ChatOpenAI.get_num_tokens_from_messagesˆ  sD  ø€ ð ÐÜ�M‰MØWôô ×Ñ˜AÑ !Ò#Ü‘7Ñ7¸ÓAÐAØ×2Ñ2Ó4‰ˆˆxØ×ÑÐ0Ô1à!"Ðà ‰OØ×Ñ˜oÔ.°%×2BÑ2BÀ7Ô2KØ!"ÐØ‰Oä%ðØ"˜Gð $GðGóð ð ˆ
Ù=EÓF¹X¸Ô0°Õ3¸XˆÐFÛ$ˆGØÐ,Ñ,ˆJØ%Ÿm™mžo‘
��Uð œc (§/¡/´#°e³*Ó"=Ó>Ñ>�
Ø˜&“=Ø /Ñ1‘Jñ .ð %ð 	�a‰ˆ
ØÐùò Gs   Â#Dc                óú   •— ddl m} |D �cg c]
  } ||«      ‘Œ }}|�Ht        |«      dk7  rt        d«      ‚|d   d   |k7  rt        d|› d|d   d   › d�«      ‚d|i}i |¥d	|i¥}t	        ‰| �  dd
|i|¤ŽS c c}w )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_functionr¢   zGWhen specifying `function_call`, you must provide exactly one function.rY   zFunction call z3 was specified, but the only provided function was Ú.rX   Ú	functionsrI   )Ú&langchain.chains.openai_functions.baser3  rá   rj   r  Úbind)	r|   r5  rX   rL   r3  ÚfnÚformatted_functionsÚfunction_call_râ   s	           €r3   Úbind_functionszChatOpenAI.bind_functions·  sÓ   ø€ õ( 	VáHQÓRÉ	À"Ñ9¸"Õ=È	ÐÐRØÐ$ÜÐ&Ó'¨1Ò,Ü ð óð ð # 1Ñ% fÑ-°Ò>Ü Ø$ ] Oð 4-Ø-@ÀÑ-CÀFÑ-KÐ,LÈAðOóð ð % mÐ4ˆNØ@˜Ð@ °Ñ@ˆFÜ‰w‰|ñ 
Ø)ð
àñ
ð 	
ùò Ss   ŒA8)rO   zDict[str, str])rO   z	List[str])rO   r„   )rO   r‹   )r³   r„   rO   r   )r³   r   rO   r   ©N)r9   ú"Optional[CallbackManagerForLLMRun]rL   r   rO   r   )rÑ   zList[Optional[dict]]rO   rc   )NN)
r×   úList[BaseMessage]ræ   úOptional[List[str]]r9   r=  rL   r   rO   zIterator[ChatGenerationChunk])NNN)r×   r>  ræ   r?  r9   r=  rÈ   úOptional[bool]rL   r   rO   r#   )r×   r>  ræ   r?  rO   z+Tuple[List[Dict[str, Any]], Dict[str, Any]])rò   zUnion[dict, BaseModel]rO   r#   )
r×   r>  ræ   r?  r9   ú'Optional[AsyncCallbackManagerForLLMRun]rL   r   rO   z"AsyncIterator[ChatGenerationChunk])r×   r>  ræ   r?  r9   rA  rÈ   r@  rL   r   rO   r#   )ræ   r?  rL   r   rO   r„   )rO   r“   )rO   zTuple[str, tiktoken.Encoding])rä   r“   rO   z	List[int])r×   r>  r+  zCOptional[Sequence[Union[Dict[str, Any], Type, Callable, BaseTool]]]rO   ri   )r5  z:Sequence[Union[Dict[str, Any], Type[BaseModel], Callable]]rX   rš   rL   r   rO   z)Runnable[LanguageModelInput, BaseMessage])7Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr}   Úclassmethodrƒ   rŠ   r�   r+   rJ   Ú__annotations__rP   r”   r–   rc   r˜   ry   r‡   r†   rˆ   rž   r8   r¡   r£   r¤   r¥   r¦   r§   r¨   r*   Úmodel_configr,   r¸   r(   rÆ   rÊ   rÍ   rÔ   rë   ró   rà   rî   r  r  r  rõ   r  r  r  r   r(  r;  Ú__classcell__)râ   s   @r3   r5   r5   ²   s  ø… ñð ò4ó ð4ð ò6ó ð6ð òó ðð òó ðñ  ¨dÔ3€FˆCÓ3Ù d°DÔ9€L�#Ó9Ù O¸7ÔC€J�ÓCØØ€K�ÓØ+Ù#(¸Ô#>€L�.Ó>ØVñ %*°$¸iÔ$H€N�MÓHØOÙ%*°4¸zÔ%J€O�]ÓJðá).°tÀ>Ô)RÐ˜ÓRØNà"&€L�-Ó&ÙDIØ˜IôE€OÐAó ðá QÔ'€K�Ó'Ø<Ø€IˆtÓØ/Ø€A€sƒJØAØ $€J�Ó$Ø/Ø)-Ð˜Ó-ðJð 7;€OÐ3Ó:Ø7;€MÐ4Ó;ð %)€KÐ!Ó(Ø áØô€Lñ ˜(Ô#Øòó ó $ðð2 ò8ó ð8ðt òó ðð  AEð0Ø=ð0ØPSð0à	ó0óð4 %)Ø:>ð	"à#ð"ð "ð"ð 8ð	"ð
 ð"ð 
'ó"ðN %)Ø:>Ø!%ð2à#ð2ð "ð2ð 8ð	2ð
 ð2ð ð2ð 
ó2ð2	%Ø)ð	%Ø1Dð	%à	4ó	%óJð2 %)Ø?Cð	"à#ð"ð "ð"ð =ð	"ð
 ð"ð 
,ó"ðN %)Ø?CØ!%ð2à#ð2ð "ð2ð =ð	2ð
 ð2ð ð2ð 
ó2ð4 òKó ðKð ò8ó ð8ð( +/ð	
Ø'ð	
Ø:=ð	
à	õ	
ð òó ðóõ.+ð ð-à#ð-ð
ð-ð 
õ-ðd (,ð'
àMð'
ð %ð'
ð ð	'
ð
 
3÷'
ñ '
rD   )rO   r   r<  )rA   r5   r9   zHOptional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]]rO   zCallable[[Any], Any])rA   r5   r9   rA  rL   r   rO   r   )rd   zMapping[str, Any]re   zType[BaseMessageChunk]rO   r   )rp   úUnion[int, dict]rq   rK  rO   rK  )KrE  Ú
__future__r   Úloggingr¾   r  rn   Ú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.runnablesr$   Úlangchain_core.toolsr%   Úlangchain_core.utilsr&   r'   r(   Úpydanticr)   r*   r+   r,   Ú#langchain_community.adapters.openair-   r.   Ú langchain_community.utils.openair/   r1   Ú	getLoggerrB  r®   r4   rC   rS   rf   rm   r5   rI   rD   r3   Ú<module>r]     s^  ðÙ å "ã Û 	Û 
Û ÷÷ ÷ õ õ  7÷õ >÷ñ õ
 L÷	÷ 	ó 	÷ SÑ RÝ -Ý )÷ñ ÷
 CÓ B÷õ :áÛð 
ˆ×	Ñ	˜8Ó	$€ó	ð  	ð	Ø	ðððð
 óð, <@ð2Ø	ð2à8ð2ð ð2ð 	ó	2ð&.Øð.Ø-Cð.àó.ð<Ø)ðØ6Fðàóñ6 Ø
˜EÐ6Sôôi
�ó i
óñi
rD   