§
    šŠtjoo  ã                  óö  — 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jB        eC¦  «        ZDd-d„ZE	 d.d/d„ZF	 d.d0d„ZGd1d#„ZHd2d'„ZI ed(d)d*¬+¦  «         G d,„ de¦  «        ¦   «         ZJdS )3zJDO NOT USE; KEPT FOR BACKWARDS COMPAT.

THIS MAY BE DELETED AT ANY POINT.
é    )Ú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_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)r2   s    úd/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/chat_models/openai.pyÚ_import_tiktokenr5   I   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_retriesr8   )	ÚopenaiÚerrorÚTimeoutÚAPIErrorÚAPIConnectionErrorÚRateLimitErrorÚServiceUnavailableErrorr   r=   )r6   r8   r>   Úerrorss       r4   Ú_create_retry_decoratorrF   U   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©r8   rI   r   r0   c               ›  ó8   •K  —  ‰j         j        di | ¤Žƒ d {V —†S ©N© )ÚclientÚacreate)rI   r6   s    €r4   Ú_completion_with_retryz6acompletion_with_retry.<locals>._completion_with_retryt   s6   øè è € ð (�S”ZÔ'Ð1Ð1¨&Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1rG   rN   ©rI   r   r0   r   )r/   Úasync_clientÚcreaterF   )r6   r8   rI   Úretry_decoratorrQ   s   `    r4   Úacompletion_with_retryrV   i   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Ð1rG   Ú_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]   rh   )r]   r\   )ÚgetÚdictr   r   r   r   r    r   )rW   rY   r\   r]   rd   r_   s         r4   Ú_convert_delta_to_message_chunkrk   |   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Ð-Ñ-Ô-Ð-rG   Úoverall_token_usageúUnion[int, dict]Ú	new_usagec                óþ  ‡ — t          |t          ¦  «        rIt          ‰ t          ¦  «        s/t          dt          |¦  «        › dt          ‰ ¦  «        › �¦  «        ‚|‰ z   S t          |t          ¦  «        rdt          ‰ t          ¦  «        s/t          dt          |¦  «        › dt          ‰ ¦  «        › �¦  «        ‚ˆ fd„|                     ¦   «         D ¦   «         S t          j        dt          |¦  «        › �¦  «         |S )Nz%Got different types for token usage: z and c           	     ó`   •— i | ]*\  }}|t          ‰                     |d ¦  «        |¦  «        “Œ+S )r   )Ú_update_token_usageri   )Ú.0ÚkÚvrl   s      €r4   ú
<dictcomp>z'_update_token_usage.<locals>.<dictcomp>¬   sK   ø€ ð 
ð 
ð 
á��1ð Õ"Ð#6×#:Ò#:¸1¸aÑ#@Ô#@À!ÑDÔDð
ð 
ð 
rG   z!Unexpected type for token usage: )Ú
isinstanceÚintÚ
ValueErrorÚtyperj   ÚitemsÚwarningsÚwarn)rl   rn   s   ` r4   rq   rq   š   sC  ø€ õ
 �)�SÑ!Ô!ð ÝÐ-­sÑ3Ô3ð 	ÝðEÝ˜	‘?”?ðEð EÝ)-Ð.AÑ)BÔ)BðEð Eñô ð ð Ð.Ñ.Ð.Ý	�I�tÑ	$Ô	$ð ÝÐ-­tÑ4Ô4ð 	ÝðEÝ˜	‘?”?ðEð EÝ)-Ð.AÑ)BÔ)BðEð Eñô ð ð
ð 
ð 
ð 
à!ŸšÑ)Ô)ð
ñ 
ô 
ð 	
õ
 	ŒÐK½$¸y¹/¼/ÐKÐKÑLÔLÐLØÐrG   z0.0.10z1.0zlangchain_openai.ChatOpenAI)ÚsinceÚremovalÚalternative_importc                  óÂ  ‡ — e Zd ZU dZedkd„¦   «         Zedld„¦   «         Zedmd„¦   «         Zednd
„¦   «         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d0<   	 dZd1ed2<   dZd3ed4<   dZd5ed6<   	  ed¬7¦  «        Z  e!d8¬9¦  «        edod;„¦   «         ¦   «         Z"e#dpd=„¦   «         Z$edmd>„¦   «         Z%	 dqdrdB„Z&dsdF„Z'	 	 dtdudL„Z(	 	 	 dvdwdP„Z)dxdR„Z*dydU„Z+	 	 dtdzdX„Z,	 	 	 dvd{dY„Z-edmdZ„¦   «         Z.edmd[„¦   «         Z/	 dqd|ˆ fd\„Z0ed}d]„¦   «         Z1d~d_„Z2dˆ fdb„Z3	 dqd€ˆ fde„Z4	 dqd�ˆ fdj„Z5ˆ xZ6S )‚r7   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")
    r0   úDict[str, str]c                ó
   — ddiS )NÚopenai_api_keyÚOPENAI_API_KEYrN   ©Úselfs    r4   Ú
lc_secretszChatOpenAI.lc_secretsÈ   s   € à Ð"2Ð3Ð3rG   ú	List[str]c                ó
   — g d¢S )z*Get the namespace of the langchain object.)Ú	langchainÚchat_modelsr>   rN   ©Úclss    r4   Úget_lc_namespacezChatOpenAI.get_lc_namespaceÌ   s   € ð 6Ð5Ð5Ð5rG   ú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“   )r†   Ú
attributess     r4   Úlc_attributeszChatOpenAI.lc_attributesÑ   sY   € à%'ˆ
àÔ#ð 	IØ04Ô0HˆJÐ,Ñ-àÔð 	AØ,0Ô,@ˆJÐ(Ñ)àÔð 	;Ø)-Ô):ˆJ�~Ñ&àÐrG   Úboolc                ó   — dS )z9Return whether this model can be serialized by Langchain.TrN   rŒ   s    r4   Úis_lc_serializablezChatOpenAI.is_lc_serializableà   s	   € ð ˆtrG   NT)ÚdefaultÚexcluder   rO   rS   úgpt-3.5-turboÚmodel)r™   ÚaliasÚstrÚ
model_namegffffffæ?ÚfloatÚtemperature)Údefault_factoryÚmodel_kwargsÚapi_keyúOptional[str]rƒ   Úbase_urlr’   Úorganizationr‘   r“   Útimeoutz,Union[float, Tuple[float, float], Any, None]Úrequest_timeouté   ©r™   rw   r=   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)ÚmodeÚ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'   ri   Úlistrx   ÚloggerÚwarningÚpopÚintersectionÚkeys)r�   r·   Úall_required_field_namesÚextraÚ
field_nameÚinvalid_model_kwargss         r4   Ú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ñô ð ð
 "'ˆˆ~ÑØˆrG   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.rƒ   r„   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³   rO   rS   rN   )rx   r&   ÚosÚgetenvr>   r3   r/   ri   ÚOpenAIÚchatÚcompletionsÚAsyncOpenAIÚChatCompletion)r�   r·   r>   Úclient_paramss       r4   Úvalidate_environmentzChatOpenAI.validate_environment6  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/   )r†   Úparamss     r4   Ú_default_paramszChatOpenAI._default_paramsq  sm   € ð ”_Ø”nØ”ØÔ+ð	
ð 
ð
 Ôð
ˆð Œ?Ð&Ø#'¤?ˆF�<Ñ ØÔÐ+µL±N´NÐ+Ø(,Ô(<ˆFÐ$Ñ%ØˆrG   r8   ú"Optional[CallbackManagerForLLMRun]rI   c                ó’   ‡ — t          ¦   «         r ‰ j        j        di |¤ŽS t          ‰ |¬¦  «        }|dˆ fd„¦   «         } |di |¤ŽS )z*Use tenacity to retry the completion call.rK   rI   r   r0   c                 ó(   •—  ‰j         j        di | ¤ŽS rM   )rO   rT   )rI   r†   s    €r4   rQ   z@ChatOpenAI.completion_with_retry.<locals>._completion_with_retryŠ  s   ø€ à%�4”;Ô%Ð/Ð/¨Ð/Ð/Ð/rG   rN   rR   )r/   rO   rT   rF   )r†   r8   rI   rU   rQ   s   `    r4   Úcompletion_with_retryz ChatOpenAI.completion_with_retry�  s   ø€ õ ‰>Œ>ð 	0Ø%�4”;Ô%Ð/Ð/¨Ð/Ð/Ð/å1°$ÀKÐPÑPÔPˆà	ð	0ð 	0ð 	0ð 	0ð 	0ñ 
Œð	0ð &Ð%Ð/Ð/¨Ð/Ð/Ð/rG   Úllm_outputsúList[Optional[dict]]rj   c                óü   — i }d }|D ]c}|€Œ|d         }|�=|                      ¦   «         D ](\  }}||v rt          ||         |¦  «        ||<   Œ#|||<   Œ)|€|                     d¦  «        }Œd|| j        dœ}|r||d<   |S )NÚtoken_usageÚsystem_fingerprint)rÝ   rŸ   )rz   rq   ri   rŸ   )	r†   rÚ   rl   rÞ   ÚoutputrÝ   rs   rt   Úcombineds	            r4   Ú_combine_llm_outputszChatOpenAI._combine_llm_outputs�  sÖ   € Ø$&ÐØ!ÐØ!ð 	Fð 	FˆFØˆ~àØ  Ô/ˆKØÐ&Ø'×-Ò-Ñ/Ô/ð 3ð 3‘D�A�qØÐ/Ð/Ð/Ý1DØ/°Ô2°Añ2ô 2Ð+¨AÑ.Ð.ð 23Ð+¨AÑ.Ð.Ø!Ð)Ø%+§Z¢ZÐ0DÑ%EÔ%EÐ"øØ#6ÀdÄoÐVÐVˆØð 	@Ø-?ˆHÐ)Ñ*ØˆrG   Ú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         }	|	d         €Œ\t          |	d         |¦  «        }|	                     d¦  «        }
|
�t	          |
¬¦  «        nd }|j        }t          ||¬	¦  «        }|r| 
                    |j        |¬
¦  «         |V — ŒÖd S )NrÓ   T©râ   r8   Úchoicesr   ÚdeltaÚfinish_reason©rë   ©ÚmessageÚgeneration_info)ÚchunkrN   )Ú_create_message_dictsr   rÙ   rv   rj   Úlenrk   ri   Ú	__class__r"   Úon_llm_new_tokenÚtext©r†   râ   rä   r8   rI   Úmessage_dictsrÔ   Údefault_chunk_classrð   Úchoicerë   rï   Úcg_chunks                r4   Ú_streamzChatOpenAI._stream§  sv  è è € ð !%× :Ò :¸8ÀTÑ JÔ JÑˆ�vØ5�FÐ5˜fÐ5 h°Ð5Ð5ˆå6DÐØ/�TÔ/ð 
Ø"°ð
ð 
Ø?Eð
ð 
ð 	ð 	ˆEõ ˜e¥TÑ*Ô*ð %ØŸ
š
™œ�Ý�5˜Ô#Ñ$Ô$¨Ò)Ð)ØØ˜9Ô% aÔ(ˆFØ�gŒÐ&ØÝ3Ø�w”Ð!4ñô ˆEð #ŸJšJ Ñ7Ô7ˆMà5BÐ5N• =Ð1Ñ1Ô1Ð1ÐTXð ð #(¤/ÐÝ*Ø¨ðñ ô ˆHð ð LØ×,Ò,¨X¬]À(Ð,ÑKÔKÐKØˆNˆNˆNˆNð/	ð 	rG   rÓ   úOptional[bool]r#   c                óô   — |�|n| j         }|r  | j        |f||dœ|¤Ž}t          |¦  «        S |                      ||¦  «        \  }}	i |	¥|�d|ini ¥|¥}	 | j        d||dœ|	¤Ž}
|                      |
¦  «        S )N©rä   r8   rÓ   rè   rN   )r¬   rû   r   rñ   rÙ   Ú_create_chat_result©r†   râ   rä   r8   rÓ   rI   Úshould_streamÚstream_iterr÷   rÔ   Úresponses              r4   Ú	_generatezChatOpenAI._generateË  sæ   € ð #)Ð"4˜˜¸$¼.ˆØð 	5Ø&˜$œ,ØðØ#°ðð Ø@Fðð ˆKõ (¨Ñ4Ô4Ð4Ø $× :Ò :¸8ÀTÑ JÔ JÑˆ�vð
Øð
à%+Ð%7�˜&Ð!Ð!¸Rð
ð ð
ˆð
 .�4Ô-ð 
Ø"°ð
ð 
Ø?Eð
ð 
ˆð ×'Ò'¨Ñ1Ô1Ð1rG   ú+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 rN   ©r.   ©rr   Úms     r4   ú
<listcomp>z4ChatOpenAI._create_message_dicts.<locals>.<listcomp>ì  ó!   € ÐFÐFÐF¸Õ0°Ñ3Ô3ÐFÐFÐFrG   )Ú_client_paramsrx   )r†   râ   rä   rÔ   r÷   s        r4   rñ   z ChatOpenAI._create_message_dictsä  sS   € ð Ô$ˆØÐØ˜ÐÐÝ Ð!UÑVÔVÐVØ!ˆF�6‰NØFÐF¸XÐFÑFÔFˆØ˜fÐ$Ð$rG   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)rv   rj   r-   ri   r!   ÚappendrŸ   r#   )	r†   r  r  Úresrî   rï   ÚgenrÝ   r  s	            r4   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ÐIrG   rH   ú"AsyncIterator[ChatGenerationChunk]c               óP  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         }	|	d         €Œat          |	d         |¦  «        }|	                     d¦  «        }
|
�t	          |
¬¦  «        nd }|j        }t          ||¬	¦  «        }|r"| 
                    |j        |¬
¦  «        ƒ d {V —† |W V — Œâ6 d S )NrÓ   Trè   ré   r   rê   rë   rì   rí   )Útokenrð   )rñ   r   rV   rv   rj   rò   rk   ri   ró   r"   rô   rõ   rö   s                r4   Ú_astreamzChatOpenAI._astream  sÄ  è è € ð !%× :Ò :¸8ÀTÑ JÔ JÑˆ�vØ5�FÐ5˜fÐ5 h°Ð5Ð5ˆå6DÐÝ!7Øð"
Ø(°kð"
ð "
ØEKð"
ð "
ð 
ð 
ð 
ð 
ð 
ð 
ð 	ð 	ð 	ð 	ð 	ð 	ð 	�%õ ˜e¥TÑ*Ô*ð %ØŸ
š
™œ�Ý�5˜Ô#Ñ$Ô$¨Ò)Ð)ØØ˜9Ô% aÔ(ˆFØ�gŒÐ&ØÝ3Ø�w”Ð!4ñô ˆEð #ŸJšJ Ñ7Ô7ˆMà5BÐ5N• =Ð1Ñ1Ô1Ð1ÐTXð ð #(¤/ÐÝ*Ø¨ðñ ô ˆHð ð XØ!×2Ò2¸¼ÈhÐ2ÑWÔWÐWÐWÐWÐWÐWÐWÐWØˆNˆNˆNˆNˆNð/
ð 
ð 
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ñ   rV   rÿ   r   s              r4   Ú
_ageneratezChatOpenAI._agenerate)  s  è è € ð #)Ð"4˜˜¸$¼.ˆØð 	<Ø'˜$œ-ØðØ#°ðð Ø@Fðð ˆKõ /¨{Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;à $× :Ò :¸8ÀTÑ JÔ JÑˆ�vð
Øð
à%+Ð%7�˜&Ð!Ð!¸Rð
ð ð
ˆõ
 0Øð
Ø(°kð
ð 
ØEKð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð ×'Ò'¨Ñ1Ô1Ð1rG   c                ó&   — i d| j         i¥| j        ¥S )zGet the identifying parameters.rŸ   )rŸ   rÕ   r…   s    r4   Ú_identifying_paramszChatOpenAI._identifying_paramsC  s   € ð K�< ¤Ð1ÐJ°TÔ5IÐJÐJrG   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/   Úupdaterƒ   r’   r‘   r“   r>   ÚproxyrÕ   )r†   Úopenai_credsr>   s      r4   r  zChatOpenAI._client_paramsH  s“   € ð �T”_ð(
ˆõ ‰~Œ~ð 	Ø×Òà#Ô2Ø $Ô 4Ø$(Ô$<ðð ñô ð ð Ôð 	SØˆMˆMˆMà$(Ô$5ÀÔ@QÐRÐRˆFŒLØ7�$Ô&Ð7¨,Ð7Ð7rG   c                ól   •— d| j         it          ¦   «                              |¬¦  «        ¥| j        ¥|¥S )z,Get the parameters used to invoke the model.rœ   )rä   )rŸ   ÚsuperÚ_get_invocation_paramsrÕ   )r†   rä   rI   ró   s      €r4   r(  z!ChatOpenAI._get_invocation_params\  sJ   ø€ ð
 �T”_ð
å‰gŒg×,Ò,°$Ð,Ñ7Ô7ð
ð Ô"ð
ð ð	
ð 	
rG   c                ó   — dS )zReturn type of chat model.zopenai-chatrN   r…   s    r4   Ú	_llm_typezChatOpenAI._llm_typeg  s	   € ð ˆ}rG   ú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)r5   r°   rŸ   Úencoding_for_modelÚKeyErrorrº   r»   Úget_encoding)r†   Ú	tiktoken_rœ   Úencodings       r4   Ú_get_encoding_modelzChatOpenAI._get_encoding_modell  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_idsr5  Úencode)r†   rõ   Ú_Úencoding_modelró   s       €r4   r;  zChatOpenAI.get_token_idsƒ  sZ   ø€ õ Ô˜AÔ !Ò#Ð#Ý‘7”7×(Ò(¨Ñ.Ô.Ð.Ø ×4Ò4Ñ6Ô6Ñˆˆ>Ø×$Ò$ TÑ*Ô*Ð*rG   ÚtoolsúCOptional[Sequence[Union[Dict[str, Any], Type, Callable, BaseTool]]]c           
     óp  •— |�t          j        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.ipynbNzECounting tokens in tool schemas is not yet supported. Ignoring tools.r­   r8  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 rN   r  r	  s     r4   r  z;ChatOpenAI.get_num_tokens_from_messages.<locals>.<listcomp>­  r  rG   r`   )r{   r|   r9  r:  r'  Úget_num_tokens_from_messagesr5  Ú
startswithÚNotImplementedErrorrz   rò   r<  rž   )r†   râ   r?  rœ   r4  Útokens_per_messageÚtokens_per_nameÚ
num_tokensÚmessages_dictrî   ÚkeyÚvalueró   s               €r4   rF  z'ChatOpenAI.get_num_tokens_from_messages‹  sŒ  ø€ ð ÐÝŒMØWñô ð õ Ô˜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‰ˆ
ØÐrG   Ú	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 rN   rN   )rr   ÚfnrS  s     €r4   r  z-ChatOpenAI.bind_functions.<locals>.<listcomp>Ò  s%   ø€ ÐRÐRÐRÀ"Ð9Ð9¸"Ñ=Ô=ÐRÐRÐRrG   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_   rO  rN   )Ú.langchain_classic.chains.openai_functions.baserS  rò   rx   r'  Úbind)r†   rO  r_   rI   Úformatted_functionsÚfunction_call_rS  ró   s         @€r4   Úbind_functionszChatOpenAI.bind_functionsº  s  øø€ ð(	
ð 	
ð 	
ð 	
ð 	
ð 	
ð SÐ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Œ|ð 
ð 
Ø)ð
àð
ð 
ð 	
rG   )r0   r�   )r0   rˆ   )r0   r�   )r0   r–   )r·   r�   r0   r   )r·   r   r0   r   ©N)r8   rÖ   rI   r   r0   r   )rÚ   rÛ   r0   rj   )NN)
râ   rã   rä   rå   r8   rÖ   rI   r   r0   ræ   )NNN)râ   rã   rä   rå   r8   rÖ   rÓ   rü   rI   r   r0   r#   )râ   rã   rä   rå   r0   r  )r  r  r0   r#   )
râ   rã   rä   rå   r8   rH   rI   r   r0   r  )râ   rã   rä   rå   r8   rH   rÓ   rü   rI   r   r0   r#   )rä   rå   rI   r   r0   r�   )r0   rž   )r0   r+  )rõ   rž   r0   r6  )râ   rã   r?  r@  r0   rw   )rO  rP  r_   r¥   rI   r   r0   rQ  )7Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr‡   ÚclassmethodrŽ   r•   r˜   r+   rO   Ú__annotations__rS   rŸ   r¡   rj   r£   rƒ   r’   r‘   r“   r©   r=   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*  r5  r;  rF  r[  Ú__classcell__)ró   s   @r4   r7   r7   µ   s3  ø€ € € € € € ðð ð ð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ð ð ð ñ ðà�u QÐ'Ñ'Ô'€KÐ'Ð'Ð'Ñ'Ø<Ø€IÐÐÐÑØ/Ø€A€J€J€J�JØAØ $€JÐ$Ð$Ð$Ñ$Ø/Ø)-ÐÐ-Ð-Ð-Ñ-ðJð 7;€OÐ:Ð:Ð:Ñ:Ø7;€MÐ;Ð;Ð;Ñ;ð %)€KÐ(Ð(Ð(Ñ(Ø à�:Øðñ ô €Lð €_˜(Ð#Ñ#Ô#Øðð ð ñ „[ñ $Ô#ðð2 ð8ð 8ð 8ñ „Xð8ðt ðð ð ñ „Xðð  AEð0ð 0ð 0ð 0ð 0ðð ð ð ð4 %)Ø:>ð	"ð "ð "ð "ð "ðN %)Ø:>Ø!%ð2ð 2ð 2ð 2ð 2ð2	%ð 	%ð 	%ð 	%ðJð Jð Jð Jð2 %)Ø?Cð	"ð "ð "ð "ð "ðN %)Ø?CØ!%ð2ð 2ð 2ð 2ð 2ð4 ðKð Kð Kñ „XðKð ð8ð 8ð 8ñ „Xð8ð( +/ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ðð ð ñ „Xððð ð ð ð.+ð +ð +ð +ð +ð +ð ð-ð -ð -ð -ð -ð -ð -ðd (,ð)
ð )
ð )
ð )
ð )
ð )
ð )
ð )
ð )
ð )
ð )
rG   )r0   r   r\  )r6   r7   r8   r9   r0   r:   )r6   r7   r8   rH   rI   r   r0   r   )rW   rX   rY   rZ   r0   r   )rl   rm   rn   rm   r0   rm   )Kr`  Ú
__future__r   ÚloggingrÉ   r9  r{   Ú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/   r2   Ú	getLoggerr]  rº   r5   rF   rV   rk   rq   r7   rN   rG   r4   ú<module>rw     s¶  ððð ð
 #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø 
€
€
€
Ø €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð  7Ð 6Ð 6Ð 6Ð 6Ð 6ðð ð ð ð ð ð ð ð >Ð =Ð =Ð =Ð =Ð =ðð ð ð ð ð ð ð ð ð ð
 LÐ KÐ KÐ KÐ KÐ Kð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð SÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RØ -Ð -Ð -Ð -Ð -Ð -Ø )Ð )Ð )Ð )Ð )Ð )ðð ð ð ð ð ð ð ð ð ð
 CÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ Bðð ð ð ð ð ð ð ð :Ð 9Ð 9Ð 9Ð 9Ð 9àð Ø€O€O€Oð 
ˆÔ	˜8Ñ	$Ô	$€ð	ð 	ð 	ð 	ð  	ð	ð ð ð ð ð, <@ð2ð 2ð 2ð 2ð 2ð&.ð .ð .ð .ð<ð ð ð ð6 €Ø
˜EÐ6Sðñ ô ðk
ð k
ð k
ð k
ð k
�ñ k
ô k
ñô ðk
ð k
ð k
rG   