ó
    ýÞ jñV ã                  ó	  • % S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKJrJrJrJrJrJr  SSKJr  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJrJrJrJrJ r J!r!  SSK"J#r#  SSK$r$SSK%r%SSK&r&SSK'J(r(J)r)  SSK*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3  SSK4J5r5J6r6  SSK7J8r8J9r9  SSK:J;r;J<r<J=r=J>r>J?r?J@r@JArAJBrBJCrCJDrDJErEJFrFJGrGJHrHJIrIJJrJJKrK  SSK:JLrM  SSKNJOrOJPrPJQrQ  SSKRJSrSJTrT  SSKUJVrV  SSKWJXrXJYrY  SSKZJ[r[J\r\J]r]J^r^  SSK_J`r`JaraJbrb  SSKcJdrdJereJfrfJgrg  SSKhJiri  SSKjJkrk  SSKlJmrm  SSKnJoro  SSKpJqrqJrrrJsrs  SSKtJuruJvrv  SSKwJxrxJyryJzrz  SS K{J|r|J}r}J~r~  SS!KJ€r€J�r�J‚r‚JƒrƒJ„r„J…r…J†r†  SS"K‡J€rˆ  SS#K‰JŠrŠ  SS$K‹JŒrŒ  SS%K�JŽrŽJ�r�J�r�J‘r‘J’r’J“r“J”r”J•r•J–r–J—r—J˜r˜  SS&K™JšršJ›r›Jœrœ  SS'K�Jžrž  \(       a  SSKŸrŸSS(K4J r   SS)K¡J¢r¢  \GRF                  " \¤5      r¥\GRL                  " \$GRN                  " 5       S*9r¨Sq©S+\ªS,'   SzS- jr«\!" \6\ž5      r¬S{S. jr­S/r®S0r¯S|S1 jr°      S}S2 jr±S~S3 jr²  S       S€S4 jjr³ S�     S‚S5 jjr´      SƒS6 jrµ      S„S7 jr¶ " S8 S9\%GRn                  \+5      r¸ " S: S;\%GRr                  \+5      rº " S< S=\%GRv                  \-5      r¼ " S> S?\%GRz                  \15      r¾ " S@ SA\%GRn                  \/5      r¿ " SB SC\%GR€                  \05      rÁ " SD SE\%GR„                  \25      rÃ " SF SG\%GRˆ                  \,5      rÅ " SH SI\%GRŒ                  \.5      rÇ " SJ SK\%GR�                  \35      rÉS…SL jrÊS†SM jrËS‡SN jrÌSOrÍSˆSP jrÎ\ " SQ\€SR9rÏ\Ð\Ñ\4   \Ò\Ï   -  \Ò-  rÓSS\ªST'   \Ð\Ï-  rÔSS\ªSU'    " SV SW\85      rÕ " SX SY\Õ5      rÖS‰SZ jr×SŠS[ jrØ    S‹S\ jrÙSŒS] jrÚS�S^ jrÛSŽS_ jrÜSŽS` jrÝS�Sa jrÞSSb.     S�Sc jjrß      S‘Sd jrà " Se Sf\á5      râ S’     S“Sg jjrã S’     S“Sh jjräS”Si jråS•Sj jræ    S–Sk jrç      S—Sl jrèS˜Sm jréS˜Sn jrê    S™So jrëSšSp jrì    S›Sq jríSœSr jrîS�Ss jrïSSt.     SžSu jjrðSŸSv jrñ   S          S¡Sw jjròS¢Sx jró    S£                 S¤Sy jjrôg)¥a"  OpenAI chat wrapper.

!!! warning "API scope"

        `ChatOpenAI` targets
        [official OpenAI API specifications](https://github.com/openai/openai-openapi)
        only. Non-standard response fields added by third-party providers (e.g.,
        `reasoning_content`, `reasoning_details`) are **not** extracted or
        preserved. If you are pointing `base_url` at a provider such as
        OpenRouter, vLLM, or DeepSeek, use the corresponding provider-specific
        LangChain package instead (e.g., `ChatDeepSeek`, `ChatOpenRouter`).
é    )ÚannotationsN)ÚAsyncIteratorÚ	AwaitableÚCallableÚIteratorÚMappingÚSequence)Úpartial)ÚBytesIO)ÚJSONDecodeError)Úceil)Ú
itemgetter)ÚTYPE_CHECKINGÚAnyÚLiteralÚ	TypeAliasÚTypeVarÚcast)Úurlparse)ÚAsyncCallbackManagerForLLMRunÚCallbackManagerForLLMRun)	ÚContextOverflowErrorÚModelAPIErrorÚModelAuthenticationErrorÚModelConnectionErrorÚModelInvalidRequestErrorÚModelNotFoundErrorÚModelPermissionDeniedErrorÚModelRateLimitErrorÚModelTimeoutError)ÚLanguageModelInputÚModelProfileRegistry)ÚBaseChatModelÚLangSmithParams)Ú	AIMessageÚAIMessageChunkÚBaseMessageÚBaseMessageChunkÚChatMessageÚChatMessageChunkÚFunctionMessageÚFunctionMessageChunkÚHumanMessageÚHumanMessageChunkÚInvalidToolCallÚSystemMessageÚSystemMessageChunkÚToolCallÚToolMessageÚToolMessageChunkÚis_data_content_block)Úcontent)ÚInputTokenDetailsÚOutputTokenDetailsÚUsageMetadata)Ú_convert_from_v03_ai_messageÚconvert_to_openai_data_block)Útool_call_chunk)ÚJsonOutputParserÚPydanticOutputParser)ÚJsonOutputKeyToolsParserÚPydanticToolsParserÚmake_invalid_tool_callÚparse_tool_call)ÚChatGenerationÚChatGenerationChunkÚ
ChatResult)ÚRunnableÚRunnableLambdaÚRunnableMapÚRunnablePassthrough)Úrun_in_executor)ÚBaseTool)Ú
_stringify)Úget_pydantic_field_names)ÚGATEWAY_METADATA_RESPONSE_KEYÚ_parse_gateway_metadataÚ_resolve_gateway_config)Úconvert_to_openai_functionÚconvert_to_openai_tool)ÚPydanticBaseModelÚTypeBaseModelÚis_basemodel_subclass)ÚLC_AUTO_PREFIXÚ_build_model_kwargsÚfrom_env)Ú	BaseModelÚ
ConfigDictÚFieldÚ	SecretStrÚValidationErrorÚfield_validatorÚmodel_validator)rY   )ÚSelf)Ú__version__)Ú_astream_with_chunk_timeoutÚ!_build_proxied_async_httpx_clientÚ _build_proxied_sync_httpx_clientÚ
_float_envÚ_get_default_async_httpx_clientÚ_get_default_httpx_clientÚ_log_proxy_env_bypass_onceÚ_resolve_socket_optionsÚ _resolve_sync_and_async_api_keysÚ+_should_bypass_socket_options_for_proxy_envÚ_warn_if_proxy_env_shadowed)Ú$_convert_from_v1_to_chat_completionsÚ_convert_from_v1_to_responsesÚ_convert_to_v03_ai_message)Ú	_PROFILES)ÚModelProfile©ÚResponse)Úcafilezhttpx.Client | NoneÚ_ssrf_clientc                 ó>   • [         c  SSKJn   U " [        SS9q [         $ )Nr   ©Ússrf_safe_clientF)ÚverifyÚfollow_redirects)ru   Ú#langchain_core._security._transportrx   Úglobal_ssl_contextrw   s    Ú[/var/www/html/gaurav/venv/lib/python3.13/site-packages/langchain_openai/chat_models/base.pyÚ_get_ssrf_safe_clientr~   ·   s"   € äÑÝHá'Ü%¸ñ
ˆô Ðó    c                ó^   • [         R                  U 5      =(       d    0 nUR                  5       $ ©N)Ú_MODEL_PROFILESÚgetÚcopy)Ú
model_nameÚdefaults     r}   Ú_get_default_model_profiler‡   Å   s#   € Ü×!Ñ! *Ó-×3°€GØ�<‰<‹>Ðr   )	Úfile_searchÚweb_search_previewÚ
web_searchÚcomputer_use_previewÚcode_interpreterÚmcpÚimage_generationÚtool_searchÚapply_patch)Údefer_loadingÚasyncc           
     ó2  • U R                  S5      nU R                  S5      nU R                  S5      nUS:X  a  [        U R                  SS5      X2S9$ US:X  a¬  U R                  SS5      =(       d    Sn0 nU R                  S	5      =n(       a  [        U5      US	'   / n/ nU R                  S
5      =n	(       a#  U	 H  n
 UR                  [	        U
SS95        M     U R                  S5      =n(       a  XÅS'   [        UUUUUUS9$ US;   a(  US:X  a  SU0O0 n[        U R                  SS5      UUUS9$ US:X  a8  [        U R                  SS5      [        [        U R                  S5      5      US9$ US:X  aJ  0 nSU ;   a  U S   US'   [        U R                  SS5      [        [        U R                  S5      5      UUUS9$ [        U R                  SS5      XS9$ ! [
         a0  nUR                  [        U
[        U5      5      5         SnAGMV  SnAff = f)ztConvert a dictionary to a LangChain message.

Args:
    _dict: The dictionary.

Returns:
    The LangChain message.
ÚroleÚnameÚidÚuserr6   Ú )r6   r–   r•   Ú	assistantÚfunction_callÚ
tool_callsT)Ú	return_idNÚaudio)r6   Úadditional_kwargsr•   r–   r›   Úinvalid_tool_calls©ÚsystemÚ	developerr¢   Ú__openai_role__)r6   r•   r–   rž   Úfunction©r6   r•   r–   ÚtoolÚtool_call_id)r6   r§   rž   r•   r–   ©r6   r”   r–   )rƒ   r-   ÚdictÚappendrB   Ú	ExceptionrA   Ústrr%   r0   r+   r   r3   r)   )Ú_dictr”   r•   Úid_r6   rž   rš   r›   rŸ   Úraw_tool_callsÚraw_tool_callÚer�   s                r}   Ú_convert_dict_to_messager²   Ù   s>  € ð �9‰9�VÓ€DØ�9‰9�VÓ€DØ
�)‰)�D‹/€CØˆvƒ~Ü E§I¡I¨i¸Ó$<ÀÑPÐPØˆ{Óð —)‘)˜I rÓ*×0¨bˆØ"$ÐØ!ŸI™I oÓ6Ð6ˆ=Õ6Ü15°mÓ1DÐ˜oÑ.Øˆ
ØÐØ"ŸY™Y |Ó4Ð4ˆ>Õ4Û!/�ðØ×%Ñ%¤o°mÈtÑ&TÖUñ "0ð —I‘I˜gÓ&Ð&ˆ5Õ&Ø).˜gÑ&ÜØØ/ØØØ!Ø1ñ
ð 	
ð Ð&Ó&Ø9=ÀÓ9LÐ.°Ñ5ÐRTÐÜØ—I‘I˜i¨Ó,ØØØ/ñ	
ð 	
ð ˆzÓÜØ—I‘I˜i¨Ó,´4¼¸U¿Y¹YÀvÓ=NÓ3OÐTWñ
ð 	
ð ˆvƒ~ØÐØ�U‹?Ø(-¨f©Ð˜fÑ%ÜØ—I‘I˜i¨Ó,Üœc 5§9¡9¨^Ó#<Ó=Ø/ØØñ
ð 	
ô ˜uŸy™y¨°BÓ7¸dÑKÐKøôK !ó Ø&×-Ñ-Ü.¨}¼cÀ!»fÓE÷ó ûðús   Â?GÇ
HÇ&$HÈHc                óŽ   • SU ;   a
  U S   US'   U$ [        U R                  S5      =n[        5      (       a  SU;   a  US   US'   U$ )a  Apply an OpenAI prompt cache breakpoint to a formatted content block.

A breakpoint set directly on the block takes precedence over one nested in
`extras`. Membership (not truthiness) decides whether to copy it, so a
present-but-falsy value (e.g. `None`) is still preserved.
Úprompt_cache_breakpointÚextras)Ú
isinstancerƒ   r©   )Úsource_blockÚformatted_blockrµ   s      r}   Ú_apply_prompt_cache_breakpointr¹     se   € ð ! LÓ0Ø5AØ%ñ6
ˆÐ1Ñ2ð Ðô	 
˜l×.Ñ.¨xÓ8Ð8�F¼$×	?Ñ	?Ø! VÓ+à5;Ð<UÑ5VˆÐ1Ñ2ØÐr   c                ó  • [        U [        5      (       aw  / nU  Hm  n[        U[        5      (       aD  UR                  S5      S:X  a/  SU;   a)  SUS   S.nSU;   a  US   US'   UR	                  U5        M\  UR	                  U5        Mo     U$ U $ )zoSanitize content for chat/completions API.

For list content, filters text blocks to only keep supported keys.
ÚtypeÚtext©r»   r¼   r´   )r¶   Úlistr©   rƒ   rª   )r6   Ú	sanitizedÚblockÚsanitized_blocks       r}   Ú"_sanitize_chat_completions_contentrÂ   0  sš   € ô
 �'œ4× Ñ Øˆ	ÛˆEä˜5¤$×'Ñ'Ø—I‘I˜fÓ%¨Ó/Ø˜e“Oà+1¸5À¹=Ñ"I�Ø,°Ó5ØAFØ1ñB�OÐ$=Ñ>ð × Ñ  Ö1à× Ñ  Ö'ñ ð ÐØ€Nr   c           	     óô  • U (       Gam  [        U [        5      (       GaW  / nU  GHL  n[        U[        5      (       a   SU;   a  US   S;   d  US   S;   a  US:X  a  M9  [        U[        5      (       ah  [        U5      (       aX  US:X  a-  [	        U5      R                  5       R                  S5      (       d%  [        XAS9nUR                  [        XE5      5        M¶  [        U[        5      (       al  UR                  S5      S:X  aW  SU;   aQ  [        UR                  S	5      =n[        5      (       a+  S
U;   a%  SUS   S.nUR                  [        XE5      5        GM7  [        U[        5      (       aï  UR                  S5      S:X  aÚ  UR                  S5      =n(       aÂ  [        U[        5      (       a­  UR                  S5      S:X  aO  UR                  S5      =n(       a7  UR                  S5      =n	(       a  UR                  SSSU SU	 30S.5        GMò  UR                  S5      S:X  a1  UR                  S5      =n
(       a  UR                  SSU
0S.5        GM8  GM;  UR                  U5        GMO     U$ U nU$ )zFormat message content.r»   )Útool_useÚthinkingÚreasoning_content)rš   Úcode_interpreter_callúchat/completionsÚ	responsesÚai©Úapir¼   rµ   r´   r½   ÚimageÚsourceÚbase64Ú
media_typeÚdataÚ	image_urlÚurlzdata:z;base64,©r»   rÒ   )r¶   r¾   r©   r5   r¬   ÚlowerÚ
startswithr;   rª   r¹   rƒ   )r6   rÌ   r”   Úformatted_contentrÀ   r¸   rµ   rÎ   rÐ   rÑ   rÓ   s              r}   Ú_format_message_contentrØ   I  s<  € ÷ ”:˜g¤t×,Ò,ØÐÜˆEô ˜5¤$×'Ñ'Ø˜e“Oà˜&‘MÐ%RÓRà˜f™Ð)SÓSØÐ#5Ó5ñ ä˜5¤$×'Ñ'Ü)¨%×0Ñ0ð  Ó+´°D³	·±Ó0A×0LÑ0LÈT×0RÑ0Rä">¸uÑ"N�Ø!×(Ñ(Ü2°5ÓJöô ˜5¤$×'Ñ'Ø—I‘I˜fÓ%¨Ó/Ø˜e“OÜ¨¯©°8Ó)<Ð<˜v¼d×CÑCØ-°Ó7à+1¸5À¹=Ñ"I�Ø!×(Ñ(Ü2°5ÓJ÷ô
 ˜5¤$×'Ñ'Ø—I‘I˜fÓ%¨Ó0Ø$Ÿy™y¨Ó2Ð2�VÕ2Ü˜v¤t×,Ñ,à—:‘:˜fÓ%¨Ó1Ø#)§:¡:¨lÓ#;Ð;�ZÕ;Ø!'§¡¨FÓ!3Ð3˜Õ3à%×,Ñ,à$/Ø*/°5¸¸ÀHÈTÈFÐ1SÐ)Tñ÷ð —Z‘Z Ó'¨5Ó0¸V¿Z¹ZÈÓ=NÐ6N°cÕ6NØ%×,Ñ,Ø!,¸EÀ3¸<ÑH÷ò à!×(Ñ(¨×/ñy ð@ Ðð $ÐàÐr   c                óä  • S[        U R                  XR                  S90nU R                  =(       d    U R                  R                  S5      =nb  X2S'   [        U [        5      (       a  U R                  US'   U$ [        U [        5      (       a  SUS'   U$ [        U [        5      (       GaÛ  SUS'   U R                  (       d  U R                  (       aO  U R                   Vs/ sH  n[        U5      PM     snU R                   Vs/ sH  n[        U5      PM     sn-   US'   O�SU R                  ;   a\  U R                  S   US'   1 S	knUS    VVVs/ sH.  nUR                  5        VVs0 sH  u  pxXu;   d  M  Xx_M     snnPM0     snnnUS'   O$S
U R                  ;   a  U R                  S
   US
'   O S
U;   d  SU;   a  US   =(       d    SUS'   Sn	U R                   HW  n
[        U
[         5      (       d  M  U
R                  S5      S:X  d  M1  U
R                  S5      =n(       d  MK  US:w  d  MS  SU0n	MY     U	(       d;  SU R                  ;   a+  U R                  S   nSU;   a  SU R                  S   S   0OUn	U	(       a  X’S'   U$ [        U ["        5      (       a!  U R                  R                  SS5      US'   U$ [        U [$        5      (       a  SUS'   U$ [        U [&        5      (       aU  SUS'   U R(                  US'   [+        US   5      US'   1 SknUR                  5        VVs0 sH  u  pxX};   d  M  Xx_M     nnnU$ SU  3n[-        U5      es  snf s  snf s  snnf s  snnnf s  snnf )zDConvert a LangChain message to dictionary format expected by OpenAI.r6   )rÌ   r”   r•   Nr”   r—   r™   r›   >   r–   r»   r¤   rš   r»   r�   r–   rÉ   r£   r¡   r¤   r¦   r§   >   r”   r6   r§   zGot unknown type )rØ   r6   r»   r•   rž   rƒ   r¶   r)   r”   r-   r%   r›   rŸ   Ú!_lc_tool_call_to_openai_tool_callÚ)_lc_invalid_tool_call_to_openai_tool_callÚitemsr©   r0   r+   r3   r§   rÂ   Ú	TypeError)ÚmessagerÌ   Úmessage_dictr•   ÚtcÚtool_call_supported_propsÚ	tool_callÚkÚvr�   rÀ   r®   Ú	raw_audioÚsupported_propsÚmsgs                  r}   Ú_convert_message_to_dictrè   ”  sŸ  € ð 	Ô*¨7¯?©?ÀÏ,É,ÑWð$€Lð —‘×E × 9Ñ 9× =Ñ =¸fÓ EÐEˆÑRØ#�VÑô �'œ;×'Ñ'Ø&Ÿ|™|ˆ�VÑðD ÐôC 
�Gœ\×	*Ñ	*Ø%ˆ�VÑð@ Ðô 
�GœY×	'Ò	'Ø*ˆ�VÑØ×× ×!;×!;à@G×@RÒ@Ró*Ù@R¸"Ô1°"Ö5Ñ@Rñ*ð "×4Ò4óá4�Bô :¸"Ö=Ù4ññ*ˆL˜Ò&ð ˜W×6Ñ6Ó6Ø)0×)BÑ)BÀ<Ñ)PˆL˜Ñ&Ú(BÐ%ð ".¨lÒ!;õ*á!;�Ið #,§/¡/Ô"3ÔVÑ"3™$˜!°qÑ7U“�’Ñ"3ÕVÙ!;ó*ˆL˜Ò&ð  × 9Ñ 9Ó9ð -4×,EÑ,EÀoÑ,VˆL˜Ò)àà˜lÓ*¨l¸lÓ.JØ&2°9Ñ&=×&EÀˆL˜Ñ#à'+ˆØ—_”_ˆEä˜5¤$×'Ó'Ø—I‘I˜fÓ%¨Õ0Ø!ŸI™I d›OÐ+�S×+Ø˜;Õ&ð ˜s˜’ñ %ö ˜ G×$=Ñ$=Ó=Ø×1Ñ1°'Ñ:ˆIð ˜9Ó$ð �w×0Ñ0°Ñ9¸$Ñ?Ñ@àð ö
 Ø$)˜Ñ!ð$ Ðô# 
�Gœ]×	+Ñ	+Ø&×8Ñ8×<Ñ<Ø˜xó 
ˆ�VÑð  Ðô 
�Gœ_×	-Ñ	-Ø)ˆ�VÑð Ðô 
�Gœ[×	)Ñ	)Ø%ˆ�VÑØ'.×';Ñ';ˆ�^Ñ$Ü"DØ˜Ñ#ó#
ˆ�YÑò >ˆØ)5×);Ñ);Ô)=ÔVÑ)=¡ ÀÑAU›˜šÑ)=ˆÑVð Ðð " ' Ð+ˆÜ˜‹nÐùòw*ùòùó Wùô*ùó^ Ws6   Ã#MÄMÅM%Å+
MÅ9MÅ?M%Ì,
M,Ì:M,ÍM%c           
     ó˜  • U R                  S5      n[        [        U R                  S5      5      n[        [        U R                  S5      =(       d    S5      n0 nU R                  S5      (       a#  [        U S   5      nSU;   a  US   c  SUS'   XeS'   / nU R                  S5      =n(       aR   U V	s/ sHE  n	[	        U	S   R                  S5      U	S   R                  S	5      U	R                  S5      U	S
   S9PMG     nn	US:X  d
  U[        :X  a	  [        XBS9$ US:X  d
  U[        :X  a  [        UUUUS9$ US;   d
  U[        :X  a  US:X  a  SS0nO0 n[        XBUS9$ US:X  d
  U[        :X  a  [        X@S   US9$ US:X  d
  U[        :X  a  [        X@S   US9$ U(       d
  U[        :X  a
  [        XCUS9$ U" XBS9$ s  sn	f ! [
         a     NÈf = f)z%Convert to a LangChain message chunk.r–   r”   r6   r˜   rš   r•   r›   r¤   Ú	argumentsÚindex)r•   Úargsr–   rë   r—   )r6   r–   r™   )r6   rž   r–   Útool_call_chunksr    r¢   r£   )r6   r–   rž   r¥   r¦   r§   )r6   r§   r–   r¨   )rƒ   r   r¬   r©   r<   ÚKeyErrorr.   r&   r1   r,   r4   r*   )
r­   Údefault_classr®   r”   r6   rž   rš   rí   r¯   Úrtcs
             r}   Ú_convert_delta_to_message_chunkrñ   æ  s  € ð �)‰)�D‹/€CÜ”�U—Y‘Y˜vÓ&Ó'€DÜ”3˜Ÿ	™	 )Ó,×2°Ó3€GØ ÐØ‡y�y�×!Ñ!Ü˜U ?Ñ3Ó4ˆØ�]Ó" }°VÑ'<Ñ'DØ$&ˆM˜&Ñ!Ø-:˜/Ñ*ØÐØŸ™ <Ó0Ð0€~Õ0ð	ñ *ó ñ *�Cô  Ø˜Z™×,Ñ,¨VÓ4Ø˜Z™×,Ñ,¨[Ó9Ø—w‘w˜t“}Ø˜g™,ô	ñ *ð ð  ð ˆvƒ~˜Ô*;Ó;Ü ¨Ñ9Ð9Øˆ{Ó˜m¬~Ó=ÜØØ/ØØ-ñ	
ð 	
ð Ð&Ó&¨-Ô;MÓ*MØ�;ÓØ!2°KÐ @Ñà "ÐÜ!ØÐ7Hñ
ð 	
ð ˆzÓ˜]Ô.BÓBÜ#¨GÀ¹-ÈCÑPÐPØˆvƒ~˜Ô*:Ó:ÜØ°Ñ*?ÀCñ
ð 	
ö ˆ}Ô 0Ó0Ü¨¸sÑCÐCÙ Ñ1Ð1ùòK øô ó 	Ùð	ús%   Â/F< Â3AF7Ã>F< Æ7F< Æ<
G	ÇG	c                ó  • [        U[        5      (       a>  [        U [        5      (       d%  S[        U5       S[        U 5       3n[        U5      eX-   $ [        U[        5      (       ay  [        U [        5      (       d%  S[        U5       S[        U 5       3n[        U5      eUR                  5        VVs0 sH"  u  p4U[        U R                  US5      U5      _M$     snn$ [        R                  " S[        U5       35        U$ s  snnf )Nz%Got different types for token usage: z and r   z!Unexpected type for token usage: )
r¶   Úintr»   Ú
ValueErrorr©   rÜ   Ú_update_token_usagerƒ   ÚwarningsÚwarn)Úoverall_token_usageÚ	new_usagerç   rã   rä   s        r}   rõ   rõ     s  € ô
 �)œS×!Ñ!ÜÐ-¬s×3Ñ3à7Ü˜	“?Ð# 5¬Ð.AÓ)BÐ(CðEð ô ˜S“/Ð!ØÑ.Ð.Ü�)œT×"Ñ"ÜÐ-¬t×4Ñ4à7Ü˜	“?Ð# 5¬Ð.AÓ)BÐ(CðEð ô ˜S“/Ð!ð "Ÿ™Ô)ô
á)‘�ð Ô"Ð#6×#:Ñ#:¸1¸aÓ#@À!ÓDÒDÙ)ò
ð 	
ô ‡M‚MÐ5´d¸9³oÐ5FÐGÔHØÐùó
s   Â6(Dc                  ó   • \ rS rSrSrSrg)ÚOpenAIContextOverflowErrori:  zABadRequestError raised when input exceeds OpenAI's context limit.© N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__rü   r   r}   rû   rû   :  s   † ÜKr   rû   c                  ó   • \ rS rSrSrSrg)ÚOpenAIAPIContextOverflowErrori>  z:APIError raised when input exceeds OpenAI's context limit.rü   Nrý   rü   r   r}   r  r  >  ó   † ÜDr   r  c                  ó   • \ rS rSrSrSrg)ÚOpenAIAuthenticationErroriB  zBOpenAI authentication error classified as a LangChain model error.rü   Nrý   rü   r   r}   r  r  B  s   † ÜLr   r  c                  ó   • \ rS rSrSrSrg)ÚOpenAIPermissionDeniedErroriF  z>OpenAI permission error classified as a LangChain model error.rü   Nrý   rü   r   r}   r
  r
  F  s   † ô Ir   r
  c                  ó   • \ rS rSrSrSrg)ÚOpenAIInvalidRequestErroriL  z?OpenAI bad-request error classified as a LangChain model error.rü   Nrý   rü   r   r}   r  r  L  s   † ÜIr   r  c                  ó   • \ rS rSrSrSrg)ÚOpenAIModelNotFoundErroriP  z=OpenAI not-found error classified as a LangChain model error.rü   Nrý   rü   r   r}   r  r  P  s   † ÜGr   r  c                  ó   • \ rS rSrSrSrg)ÚOpenAIRateLimitErroriT  z>OpenAI rate-limit error classified as a LangChain model error.rü   Nrý   rü   r   r}   r  r  T  ó   † ÜHr   r  c                  ó   • \ rS rSrSrSrg)ÚOpenAIAPIErroriX  z:OpenAI server error classified as a LangChain model error.rü   Nrý   rü   r   r}   r  r  X  r  r   r  c                  ó   • \ rS rSrSrSrg)ÚOpenAIConnectionErrori\  z>OpenAI connection error classified as a LangChain model error.rü   Nrý   rü   r   r}   r  r  \  r  r   r  c                  ó   • \ rS rSrSrSrg)ÚOpenAITimeoutErrori`  z;OpenAI timeout error classified as a LangChain model error.rü   Nrý   rü   r   r}   r  r  `  s   † ÜEr   r  c                ó  • S[        U 5      ;   d0  SU R                  ;   d   SU R                  ;   d  SU R                  ;   a*  [        U R                  U R                  U R                  S9U eSU R                  ;   aB  Sn[
        R                  " U5        [        U R                  U R                  U R                  S9U eSU R                  ;   a  S	n[
        R                  " U5        [        U R                  U R                  U R                  S9U e)
NÚcontext_length_exceededz(Input tokens exceed the configured limitzprompt is too longÚContextWindowExceededError©rÞ   ÚresponseÚbodyzH'response_format' of type 'json_schema' is not supported with this modelzëThis model does not support OpenAI's structured output feature, which is the default method for `with_structured_output` as of langchain-openai==0.3. To use `with_structured_output` with this model, specify `method="function_calling"`.z"Invalid schema for response_formata3  Invalid schema for OpenAI's structured output feature, which is the default method for `with_structured_output` as of langchain-openai==0.3. Specify `method="function_calling"` instead or update your schema. See supported schemas: https://platform.openai.com/docs/guides/structured-outputs#supported-schemas)r¬   rÞ   rû   r  r  rö   r÷   r  )r±   rÞ   s     r}   Ú_handle_openai_bad_requestr  d  sì   € à!¤S¨£VÓ+Ø5¸¿¹ÓBØ 1§9¡9Ó,Ø'¨1¯9©9Ó4ä(Ø—I‘I¨¯
©
¸¿¹ñ
àð	ð 	SØ	
�‰óð3ð 	ô 	�Š�gÔÜ'Ø—I‘I¨¯
©
¸¿¹ñ
àð	ð ,¨q¯y©yÓ8ð[ð 	ô 	�Š�gÔÜ
#Ø—	‘	 A§J¡J°Q·V±Vñàðr   c                ó:  • [        U 5      nSU;   a*  [        U R                  U R                  U R                  S9U e[        U [        R                  5      (       a*  [        U R                  U R                  U R                  S9U e[        U [        R                  5      (       a*  [        U R                  U R                  U R                  S9U e[        U [        R                  5      (       a*  [        U R                  U R                  U R                  S9U e[        U [        R                  5      (       a*  [        U R                  U R                  U R                  S9U e[        U [        R                   5      (       a*  [#        U R                  U R                  U R                  S9U e[        U [        R$                  5      (       a  ['        U R                  5      U e[        U [        R(                  5      (       a  [+        U R                  U R                  S9U ee )Nzexceeds the context window)rÞ   Úrequestr  r  )rÞ   r   )r¬   r  rÞ   r   r  r¶   ÚopenaiÚAuthenticationErrorr  r  ÚPermissionDeniedErrorr
  ÚNotFoundErrorr  ÚRateLimitErrorr  ÚInternalServerErrorr  ÚAPITimeoutErrorr  ÚAPIConnectionErrorr  )r±   Úerror_messages     r}   Ú_handle_openai_api_errorr*  ‰  sš  € Ü˜“F€MØ# }Ó4Ü+Ø—I‘I q§y¡y°q·v±vñ
àð	ô �!”V×/Ñ/×0Ñ0Ü'Ø—I‘I¨¯
©
¸¿¹ñ
àð	ô �!”V×1Ñ1×2Ñ2Ü)Ø—I‘I¨¯
©
¸¿¹ñ
àð	ô �!”V×)Ñ)×*Ñ*Ü&Ø—I‘I¨¯
©
¸¿¹ñ
àð	ô �!”V×*Ñ*×+Ñ+Ü"Ø—I‘I¨¯
©
¸¿¹ñ
àð	ô �!”V×/Ñ/×0Ñ0Ü Q§Y¡Y¸¿¹È!Ï&É&ÑQÐWXÐXÜ�!”V×+Ñ+×,Ñ,Ü  §¡Ó+°Ð2Ü�!”V×.Ñ.×/Ñ/Ü#¨A¯I©I¸q¿y¹yÑIÈqÐPØ	r   c                óT   • [        USS5      nUc  g[        U5      nUb	  X0[        '   gg)z¾Add parsed LangSmith gateway metadata to `generation_info`, if present.

Args:
    generation_info: Generation info to mutate in place.
    raw_response: The raw provider response, or None.
ÚheadersN)ÚgetattrrO   rN   )Úgeneration_infoÚraw_responser,  Úgateway_metadatas       r}   Ú_add_gateway_metadatar1  ¨  s9   € ô �l I¨tÓ4€GØ�ØÜ.¨wÓ7ÐØÑ#Ø9IÔ5Ò6ð $r   )z	gpt-5-prozgpt-5.2-prozgpt-5.4-prozgpt-5.5-prozgpt-5.6-solc                óT   • U (       d  gU R                  [        5      =(       d    SU ;   $ )NFÚcodex)rÖ   Ú_RESPONSES_API_ONLY_PREFIXES©r…   s    r}   Ú_model_prefers_responses_apir6  À  s$   € ÞØØ× Ñ Ô!=Ó>×WÀ'ÈZÑBWÐWr   Ú_BM)Úboundr   Ú_DictOrPydanticClassÚ_DictOrPydanticc                  ó|  ^ • \ rS rSr% Sr\" SSS9rS\S'   \" SSS9rS\S'   \" SSS9r	S\S	'   \" SSS9r
S\S
'   \" SSS9rS\S'    SrS\S'    \" \S9rS\S'    \" SSS9rS\S'    \" SSS9rS\S'    \" SSS9rS\S'    \" \" SSS9S9rS\S '   \" SS!S9rS"\S#'    SrS$\S%'    SrS&\S''    SrS\S('    SrS\S)'    SrS&\S*'    SrS$\S+'    SrS&\S,'    SrS-\S.'    S/rS0\S1'    SrS&\S2'    SrS\S3'    \" SS9r S&\S4'    Sr!S\S5'    Sr"S6\S7'    Sr#S\S8'    Sr$S\S9'    Sr%S:\S;'   Sr&S<\S='   \" SSS9r'S>\S?'    \" SSS9r(S>\S@'    \" SSS9r)SA\SB'    \" SC SSD9r*S\SE'    \" SSFS9r+SG\SH'    Sr,SI\SJ'    S/r-S0\SK'    \" SS9r.S6\SL'    Sr/SM\SN'    Sr0SO\SP'    Sr1S6\SQ'    Sr2S\SR'    Sr3S$\SS'    Sr4S\ST'    S/r5S0\SU'    Sr6S$\SV'    \" \" SWSS9S9r7S\SX'    \8" SSY9r9\:S…SZ j5       r;\:S†S[ j5       r<\=" S\S]9\>S‡S^ j5       5       r?\@" SES_S]9\>SˆS` j5       5       rA\=" S\S]9\>S‡Sa j5       5       rB\=" S_S]9S‰Sb j5       rC\=" S_S]9S‰Sc j5       rDSŠSd jrE\:S‹Se j5       rFSŒSf jrG        S�Sg jrHSŽSh jrI  S�         S�Si jjrJ  S�         S‘Sj jjrK S’     S“Sk jjrL  S�SSl.           S”Sm jjjrM  S�         S•Sn jjrNS–So jrOSSp.       S—Sq jjrP S’     S˜Sr jjrQ  S�SSl.           S™Ss jjjrR  S�         SšSt jjrS\:S‹Su j5       rT S’     S›U 4Sv jjjrU S’     SœSw jjrV\:S†Sx j5       rWS�Sy jrXSžU 4Sz jjrY S’SS{.       SŸU 4S| jjjjrZSSSSS}.             S U 4S~ jjjr[ S’SS/SSS€.             S¡S� jjjr\S¢S‚ jr]    S£Sƒ jr^S„r_U =r`$ )¤ÚBaseChatOpenAIiË  aP  Base wrapper around OpenAI large language models for chat.

This base class targets
[official OpenAI API specifications](https://github.com/openai/openai-openapi)
only. Non-standard response fields added by third-party providers (e.g.,
`reasoning_content`) are not extracted. Use a provider-specific subclass for
full provider support.
NT)r†   Úexcluder   ÚclientÚasync_clientÚroot_clientÚroot_async_clientúgpt-3.5-turboÚmodel©r†   Úaliasr¬   r…   úfloat | NoneÚtemperature)Údefault_factoryúdict[str, Any]Úmodel_kwargsÚapi_key)rE  r†   zCSecretStr | None | Callable[[], str] | Callable[[], Awaitable[str]]Úopenai_api_keyÚbase_urlú
str | NoneÚopenai_api_baseÚorganizationÚopenai_organizationÚOPENAI_PROXY)r†   Úopenai_proxyÚtimeoutz(float | tuple[float, float] | Any | NoneÚrequest_timeoutúbool | NoneÚstream_usageú
int | NoneÚmax_retriesÚpresence_penaltyÚfrequency_penaltyÚseedÚlogprobsÚtop_logprobszdict[int, int] | NoneÚ
logit_biasFÚboolÚ	streamingÚnÚtop_pÚ
max_tokensÚreasoning_effortúdict[str, Any] | NoneÚ	reasoningÚ	verbosityÚtiktoken_model_namezMapping[str, str] | NoneÚdefault_headerszMapping[str, object] | NoneÚdefault_queryz
Any | NoneÚhttp_clientÚhttp_async_clientz%Sequence[tuple[int, int, int]] | NoneÚhttp_socket_optionsc                 ó   • [        SS5      $ )NÚ'LANGCHAIN_OPENAI_STREAM_CHUNK_TIMEOUT_Sç      ^@)re   rü   r   r}   Ú<lambda>ÚBaseChatOpenAI.<lambda>
  s   € ¤
Ø5°uô!
r   )rH  r=  Ústream_chunk_timeoutÚstop_sequenceszlist[str] | str | NoneÚstopzMapping[str, Any] | NoneÚ
extra_bodyÚinclude_response_headersÚdisabled_paramszlist[dict[str, Any]] | NoneÚcontext_managementúlist[str] | NoneÚincludeÚprompt_cache_optionsÚservice_tierÚstoreÚ
truncationÚuse_previous_response_idÚuse_responses_apiÚLC_OUTPUT_VERSIONÚoutput_version)Úpopulate_by_namec                ó„   • U R                   n[        U[        5      (       a  UR                  5       R	                  S5      $ g)a  Whether requests are routed through the LangSmith gateway.

Detected from the resolved API key: LangSmith keys (used to authenticate
to the gateway) carry the `lsv2_` prefix. Callable keys cannot be
inspected without invoking them, so they are treated as non-gateway.
Úlsv2_F)rL  r¶   r\   Úget_secret_valuerÖ   )ÚselfrK  s     r}   Ú_uses_gatewayÚBaseChatOpenAI._uses_gatewayÔ  s9   € ð ×%Ñ%ˆÜ�gœy×)Ñ)Ø×+Ñ+Ó-×8Ñ8¸ÓAÐAØr   c                ó   • U R                   $ )zSame as model_name.r5  ©r‰  s    r}   rC  ÚBaseChatOpenAI.modelá  s   € ð �‰Ðr   Úbefore)Úmodec                ó.   • [        U 5      n[        X5      $ )z>Build extra kwargs from additional params that were passed in.)rM   rW   )ÚclsÚvaluesÚall_required_field_namess      r}   Úbuild_extraÚBaseChatOpenAI.build_extraæ  s   € ô $<¸CÓ#@Ð Ü" 6ÓDÐDr   Úafterc                ób   • Ub+  US:  a%  [        SS5      n[        R                  SUU5        U$ U$ )a[  Reject negative constructor values; fall back to the env-driven default.

Matches the env-var path in `_float_env`: a negative value is a typo,
not an opt-out (`None`/`0` are the documented off switches). Configs
hydrated from YAML/JSON would otherwise silently disable the wrapper
and reintroduce the indefinite-stream hang the feature prevents.
r   rp  rq  z`Invalid `stream_chunk_timeout=%r` (negative); falling back to %s. Pass `None` or `0` to disable.)re   ÚloggerÚwarning)r’  ÚvalueÚfallbacks      r}   Ú_validate_stream_chunk_timeoutÚ-BaseChatOpenAI._validate_stream_chunk_timeoutí  sA   € ð Ñ ¨£Ü!Ð"KÈUÓSˆHÜ�N‰NðEàØô	ð ˆOØˆr   c                óà  • UR                  S5      =(       d    UR                  S5      =(       d    SnUR                  5       nUR                  S5      (       a  SU;  a  SUS'   UR                  S5      (       at  SU;  an  UR                  S	5      S
:w  aY  UR                  S5      =(       d    0 R                  S5      S
:w  a,  UR                  S5      nUb  US:w  a  UR                  SS5        U$ )z”Validate temperature parameter for different models.

- gpt-5 models (excluding gpt-5-chat) only allow `temperature=1` or unset
    (Defaults to 1)
r…   rC  r˜   Úo1rG  é   úgpt-5Úchatre  Únonerg  ÚeffortN)rƒ   rÕ   rÖ   Úpop)r’  r“  rC  Úmodel_lowerrG  s        r}   Úvalidate_temperatureÚ#BaseChatOpenAI.validate_temperature  sÒ   € ð —
‘
˜<Ó(×E¨F¯J©J°wÓ,?×EÀ2ˆØ—k‘k“mˆð ×!Ñ! $×'Ñ'¨MÀÓ,GØ$%ˆF�=Ñ!ð ×"Ñ" 7×+Ñ+Ø˜{Ó*Ø—
‘
Ð-Ó.°&Ó8Ø—‘˜KÓ(×.¨B×3Ñ3°HÓ=ÀÓGà Ÿ*™* ]Ó3ˆKØÑ&¨;¸!Ó+;ð —
‘
˜=¨$Ô/àˆr   c                ó2   • U R                  S[        5        U $ )a–  Set package version in metadata.

Note: Subclasses that inherit from `BaseChatOpenAI` (e.g.
`ChatDeepSeek`, `ChatXAI`) must use a **unique** validator name
(e.g. `_set_deepseek_version`) instead of overriding this one. Pydantic
replaces same-named `model_validator` methods rather than chaining them,
so reusing `_set_openai_chat_version` would silently drop the parent's
`langchain-openai` version entry.
zlangchain-openai)Ú_add_versionra   r�  s    r}   Ú_set_openai_chat_versionÚ'BaseChatOpenAI._set_openai_chat_version"  s   € ð 	×ÑÐ,¬kÔ:Øˆr   c                óž  ^ • T R                   b  T R                   S:  a  Sn[        U5      eT R                   b.  T R                   S:”  a  T R                  (       a  Sn[        U5      eT R                  =(       d3    [        R
                  " S5      =(       d    [        R
                  " S5      T l        [        T R                  T R                  SSS	S
9nUR                  T l        UR                  T l        UR                  n[        U 4S jS 5       5      (       a/  U(       d!  T R                  c  S[        R                  ;  a  ST l        SnSnT R                  b  [        T R                  5      u  pET R                  T R                  T R                   T R"                  T R$                  S.nT R&                  b  T R&                  US'   T R(                  (       a_  T R*                  (       d  T R,                  (       a=  T R(                  nT R*                  nT R,                  n	SU< SU< SU	< 3n[        U5      e[/        T R0                  T R*                  T R,                  T R(                  S9(       a  Sn
[3        5         O)[5        T R0                  5      n
[7        U
T R(                  S9  T R8                  (       dË  Uc  ST l        ST l        O¹T R(                  (       a/  T R*                  (       d  [=        T R(                  [>        U
S9T l        T R*                  =(       d!    [A        T R                  T R                   U
5      US.n[B        RD                  " S0 UDUD6T l        T R:                  RF                  RH                  T l        T RJ                  (       d¹  T R(                  (       a/  T R,                  (       d  [M        T R(                  [>        U
S9T l        T R,                  =(       d!    [O        T R                  T R                   U
5      US.n[B        RP                  " S0 UDUD6T l)        T RR                  RF                  RH                  T l%        T $ )z?Validate that api key and python package exists in environment.Nr¡  zn must be at least 1.zn must be 1 when streaming.ÚOPENAI_ORG_IDÚOPENAI_ORGANIZATIONz	openai/v1ÚOPENAI_API_BASEÚOPENAI_API_KEY)rM  rK  Úprovider_pathÚbase_url_envÚapi_key_envc              3  ó@   >#   • U H  n[        TUS 5      S L v •  M     g 7fr�   )r-  )Ú.0Úkeyr‰  s     €r}   Ú	<genexpr>Ú6BaseChatOpenAI.validate_environment.<locals>.<genexpr>O  s*   øé € ð 
ñ	�ô �D˜#˜tÓ$¨Õ,ò	ùs   ƒ)rW  rS  r>  r@  r?  rA  rl  rm  ÚOPENAI_BASE_URLT)rP  rM  rT  rj  rk  rY  zwCannot specify 'openai_proxy' if one of 'http_client'/'http_async_client' is already specified. Received:
openai_proxy=z
http_client=z
http_async_client=)rn  rl  rm  rS  rü   )rS  )Úproxyry   Úsocket_options)rl  rK  )*rb  rô   ra  rQ  ÚosÚgetenvrP   rO  rL  rM  rK  Úbase_url_from_gatewayÚallÚenvironrW  rj   rU  rj  rk  rY  rS  rl  rm  rk   rn  rh   ri   rl   r>  r@  rd   r|   rg   r!  ÚOpenAIr£  Úcompletionsr?  rc   rf   ÚAsyncOpenAIrA  )r‰  rç   Ú_gateway_configÚ_base_url_from_gatewayÚsync_api_key_valueÚasync_api_key_valueÚclient_paramsrS  rl  rm  Úresolved_socket_optionsÚsync_specificÚasync_specifics   `            r}   Úvalidate_environmentÚ#BaseChatOpenAI.validate_environment0  sÞ  ø€ ð �6‰6Ñ $§&¡&¨1£*Ø)ˆCÜ˜S“/Ð!Ø�6‰6Ñ $§&¡&¨1£*°··Ø/ˆCÜ˜S“/Ð!ð ×$Ñ$÷ 0Ü�yŠy˜Ó)÷0ä�yŠyÐ.Ó/ð 	Ô ô 2Ø×)Ñ)Ø×'Ñ'Ø%Ø*Ø(ñ
ˆð  /×7Ñ7ˆÔØ-×5Ñ5ˆÔØ!0×!FÑ!FÐô
 ô 
ñ	ó
÷ 
ñ 
ö #Ø×$Ñ$Ñ,Ð1BÌ"Ï*É*Ó1Tà $ˆDÔð >BÐØIMÐà×ÑÑ*ô 7WØ×#Ñ#ó7Ñ3Ðð
 !×4Ñ4Ø×,Ñ,Ø×+Ñ+Ø#×3Ñ3Ø!×/Ñ/ñ
ˆð ×ÑÑ'Ø+/×+;Ñ+;ˆM˜-Ñ(à×× $×"2×"2°d×6L×6LØ×,Ñ,ˆLØ×*Ñ*ˆKØ $× 6Ñ 6Ðð!à‘/  K¡>Ð1FÐ4EÑ3GðIð ô
 ˜S“/Ð!Ü6Ø $× 8Ñ 8Ø×(Ñ(Ø"×4Ñ4Ø×*Ñ*÷	
ð IKÐ#Ü&Õ(ä&=¸d×>VÑ>VÓ&WÐ#Ü'Ø'°d×6GÑ6Gòð �{�{Ø!Ñ)ð #�”Ø#'�Õ à×$×$¨T×-=×-=Ü'GØ"×/Ñ/Ü1Ø'>ñ(�DÔ$ð $(×#3Ñ#3÷ $Ü0Ø×,Ñ,Ø×,Ñ,Ø/óð
  2ñ!�ô $*§=¢=Ñ#R°=Ð#RÀMÑ#R�Ô Ø"×.Ñ.×3Ñ3×?Ñ?�”Ø× × Ø× × ¨×)?×)?Ü)JØ×+Ñ+Ü-Ø#:ñ*�Ô&ð  $×5Ñ5÷  Ü2Ø×(Ñ(Ø×(Ñ(Ø+óð
 /ñˆNô &,×%7Ò%7ñ &Øð&à ñ&ˆDÔ"ð !%× 6Ñ 6× ;Ñ ;× GÑ GˆDÔØˆr   c                ó>   • [        U R                  5      =(       d    S $ r�   )r‡   r…   r�  s    r}   Ú_resolve_model_profileÚ%BaseChatOpenAI._resolve_model_profileÀ  s   € Ü)¨$¯/©/Ó:×B¸dÐBr   c                óØ  • 0 SU R                   _SU R                  _SU R                  _SU R                  _SU R                  _SU R
                  _SU R                  _SU R                  =(       d    S	_S
U R                  _SU R                  _SU R                  _SU R                  _SU R                  _SU R                  _SU R                  _SU R                  _SU R                   _U R"                  U R$                  U R&                  U R(                  S.EnU R*                  U R,                  S.UR/                  5        VVs0 sH  u  p#Uc  M
  X#_M     snnEU R0                  E$ s  snnf )ú2Get the default parameters for calling OpenAI API.rZ  r[  r\  rc  r]  r^  r_  rv  Nrd  rw  rb  rG  re  rg  rh  rz  r|  )r}  r~  r€  r  )rC  Ústream)rZ  r[  r\  rc  r]  r^  r_  rv  rd  rw  rb  rG  re  rg  rh  rz  r|  r}  r~  r€  r  r…   ra  rÜ   rJ  )r‰  Úexclude_if_nonerã   rä   s       r}   Ú_default_paramsÚBaseChatOpenAI._default_paramsÃ  s©  € ð
Ø × 5Ñ 5ð
à ×!7Ñ!7ð
ð �D—I‘Ið
ð �T—Z‘Zð	
ð
 ˜Ÿ™ð
ð ˜D×-Ñ-ð
ð ˜$Ÿ/™/ð
ð �D—I‘I×% ð
ð ˜$Ÿ/™/ð
ð ˜$Ÿ/™/ð
ð �—‘ð
ð ˜4×+Ñ+ð
ð  × 5Ñ 5ð
ð ˜Ÿ™ð
ð ˜Ÿ™ð
ð  ! $×"9Ñ"9ð!
ð" �t—|‘|ð#
ð$ %)×$=Ñ$=Ø ×-Ñ-ØŸ/™/Ø—Z‘Zò+
ˆð2 —_‘_Ø—n‘nñ
ð !0× 5Ñ 5Ô 7ÔIÑ 7™˜¸1‹tˆqŠtÑ 7ÒIð
ð ×Ñð	
ð 	
ùó Js   ÅE&ÅE&c                ó"  • 0 nS nU Hk  nUc  M  UR                  S5      nUb9  UR                  5        H%  u  pgUc  M
  Xb;   a  [        X&   U5      X&'   M!  XrU'   M'     Ub  MZ  UR                  S5      nMm     X R                  S.nU(       a  X8S'   U$ )NÚtoken_usageÚsystem_fingerprint)rÚ  r…   )rƒ   rÜ   rõ   r…   )	r‰  Úllm_outputsrø   rÛ  ÚoutputrÚ  rã   rä   Úcombineds	            r}   Ú_combine_llm_outputsÚ#BaseChatOpenAI._combine_llm_outputså  s®   € Ø$&ÐØ!ÐÛ!ˆFØ‰~áØ Ÿ*™* ]Ó3ˆKØÑ&Ø'×-Ñ-Ö/‘D�AØ‘yÙ ØÓ/Ü1DØ/Ñ2°Aó2Ð+Ó.ð 23¨AÓ.ñ 0ð "Ó)Ø%+§Z¡ZÐ0DÓ%EÒ"ñ! "ð" $7ÇoÁoÑVˆÞØ-?Ð)Ñ*Øˆr   c                óÊ  • UR                  S5      S:X  a  g UR                  S5      nUR                  S/ 5      =(       d"    UR                  S0 5      R                  S/ 5      nU(       a  [        XAR                  S5      5      OS n[        U5      S:X  a:  [        U" SUS	9US
9nU R                  S:X  a  SUR
                  R                  S'   U$ US   nUS   c  g [        US   U5      n	U(       a  0 UEO0 n
UR                  S5      =n(       aX  XºS'   UR                  S5      =n(       a  XÊS'   UR                  S5      =n(       a  XÚS'   UR                  S5      =n(       a  XêS'   UR                  S5      nU(       a  XúS'   U(       a  [        U	[        5      (       a  Xil
        SU	R                  S'   U R                  S:X  a  SU	R                  S'   [        Xš=(       d    S S
9$ )Nr»   zcontent.deltaÚusageÚchoicesÚchunkr~  r   r˜   )r6   Úusage_metadata©rÞ   r.  Úv1r„  ÚdeltaÚfinish_reasonrC  r…   rÛ  r]  r!  Úmodel_provider)rƒ   Ú_create_usage_metadataÚlenrD   r„  rÞ   Úresponse_metadatarñ   r¶   r&   rå  )r‰  rä  Údefault_chunk_classÚbase_generation_inforÚ  rã  rå  Úgeneration_chunkÚchoiceÚmessage_chunkr.  ré  r…   rÛ  r~  r]  s                   r}   Ú"_convert_chunk_to_generation_chunkÚ1BaseChatOpenAI._convert_chunk_to_generation_chunkþ  sñ  € ð �9‰9�VÓ Ó/ØØ—i‘i Ó(ˆà�I‰I�i Ó$÷ 9à�y‰y˜ "Ó%×)Ñ)¨)°RÓ8ð 	ö ô # ;·	±	¸.Ó0IÔJàð 	ô
 ˆw‹<˜1Óä2Ù+°BÀ~ÑVØ 4ñ Ðð ×"Ñ" dÓ*ØOSÐ ×(Ñ(×:Ñ:Ð;KÑLà#Ð#à˜‘ˆØ�'‰?Ñ"Øä7Ø�7‰OÐ0ó
ˆö 7KÐ2Ð1Ñ2ÐPRˆà"ŸJ™J Ó7Ð7ˆ=Õ7Ø/<˜OÑ,Ø"ŸY™Y wÓ/Ð/ˆzÕ/Ø0: Ñ-Ø%*§Y¡YÐ/CÓ%DÐDÐ!ÕDØ8JÐ 4Ñ5Ø$Ÿy™y¨Ó8Ð8ˆ|Õ8Ø2> Ñ/à—:‘:˜jÓ)ˆÞØ*2˜JÑ'æœj¨¼×GÑGØ+9Ô(à<Dˆ×'Ñ'Ð(8Ñ9à×Ñ $Ó&Ø@DˆM×+Ñ+Ð,<Ñ=Ü"Ø!×3JÀdñ
ð 	
r   c                ó8   • U R                   c  Sn[        U5      eg)z8Check that sync client is available, raise error if not.NzÃSync client is not available. This happens when an async callable was provided for the API key. Use async methods (ainvoke, astream) instead, or provide a string or sync callable for the API key.)r>  rô   )r‰  rç   s     r}   Ú_ensure_sync_client_availableÚ,BaseChatOpenAI._ensure_sync_client_availableE  s(   € à�;‰;ÑðQð ô
 ˜S“/Ð!ð r   c              +  óL  #   • U R                  5         SUS'   U R                  " U4SU0UD6n0 n0 n U R                  (       d  U R                  (       at  U R                  R
                  R                  R                  " S0 UD6nUR                  5       n	U R                  (       a  S[        UR                  5      0n[        Xx5        O&U R                  R                  R                  " S0 UD6n	UR                  S5      n
U	 nSnSnSnSnSnU H¥  nU(       a  UO0 n[        UUUUU
UUU R                  S9u  nnnnU(       d  M6  U(       a%  U(       a  0 UEUR                  =(       d    0 EUl        U(       a  UR!                  UR"                  US	9  SnS
UR$                  R&                  ;   a  SnUv •  M§     S S S 5        g ! , (       d  f       g = f! [(        R*                   a  n[-        U5         S nAg S nAf[(        R.                   a  n[1        U5         S nAg S nAff = f7f)NTrÕ  rv  r,  Úresponse_formatéÿÿÿÿF©ÚschemaÚmetadataÚhas_reasoningr„  ©rä  rg  rü   )rö  Ú_get_request_payloadrx  rŠ  r@  Úwith_raw_responserÉ   ÚcreateÚparser©   r,  r1  rƒ   Ú,_convert_responses_chunk_to_generation_chunkr„  r.  Úon_llm_new_tokenr¼   rÞ   rž   r!  ÚBadRequestErrorr  ÚAPIErrorr*  ©r‰  Úmessagesrv  Úrun_managerÚkwargsÚpayloadr,  rï  Úraw_context_managerÚcontext_managerÚoriginal_schema_objr  Úis_first_chunkÚcurrent_indexÚcurrent_output_indexÚcurrent_sub_indexrþ  rä  rý  rð  r±   s                        r}   Ú_stream_responsesÚ BaseChatOpenAI._stream_responsesO  s  é € ð 	×*Ñ*Ô,ØˆˆxÑØ×+Ò+¨HÑJ¸4ÐJÀ6ÑJˆØˆØ%'Ðð5	(Ø×,×,°×0B×0Bà×$Ñ$×6Ñ6×@Ñ@×GÒGÑRÈ'ÑRð $ð #6×";Ñ";Ó"=�Ø×0×0Ø(¬$Ð/B×/JÑ/JÓ*KÐL�GÜ%Ð&:ÕPà"&×"2Ñ"2×"<Ñ"<×"CÒ"CÑ"NÀgÑ"N�Ø"(§*¡*Ð->Ó"?Ðá  HØ!%�Ø "�Ø')Ð$Ø$&Ð!Ø %�Û%�EÞ*8™w¸b�Hô EØØ%Ø,Ø)Ø2Ø!)Ø&3Ø'+×':Ñ':ñ	ñØ%Ø,Ø)Ø(÷ (Ð'Þ)Ö.Bð@Ø"6ð@à#3×#CÑ#C×#IÀrð@Ð,Ô<ö 'Ø'×8Ñ8Ø 0× 5Ñ 5Ð=Mð 9ñ ð */˜Ø&Ð*:×*BÑ*B×*TÑ*TÓTØ,0˜MØ.Ô.ñ= &÷ !—–ûôJ ×%Ñ%ó 	*Ü& q×)Ñ)ûÜ�‰ó 	(Ü$ Q×'Ñ'ûð	(üsl   ‚/H$²CG Ä?G ÅA3G Æ7G Æ?H$Ç 
GÇ
G ÇH$ÇG ÇH!Ç%G5Ç0H$Ç5H!ÈHÈH$ÈH!È!H$c               óî  #   • SUS'   U R                   " U4SU0UD6n0 n0 n U R                  (       d  U R                  (       a|  U R                  R                  R
                  R                  " S0 UD6I S h  v•N nUR                  5       n	U R                  (       a  S[        UR                  5      0n[        Xx5        O.U R                  R
                  R                  " S0 UD6I S h  v•N n	UR                  S5      n
U	 IS h  v•N nSnSnSnSnSn[        UU R                  U R                  S9  S h  v•N nU(       a  UO0 n[        UUUUU
UUU R                   S	9u  nnnnU(       d  M<  U(       a%  U(       a  0 UEUR"                  =(       d    0 EUl        U(       a"  UR%                  UR&                  US
9I S h  v•N   SnSUR(                  R*                  ;   a  SnU7v •  M¶   GNr GN Né N¹ N3
 S S S 5      IS h  v•N    g ! , IS h  v•N  (       d  f       g = f! [,        R.                   a  n[1        U5         S nAg S nAf[,        R2                   a  n[5        U5         S nAg S nAff = f7f)NTrÕ  rv  r,  rù  rú  Fr5  rû  rÿ  rg  rü   )r   rx  rŠ  rA  r  rÉ   r  r  r©   r,  r1  rƒ   rb   rt  r…   r  r„  r.  r  r¼   rÞ   rž   r!  r  r  r  r*  r  s                        r}   Ú_astream_responsesÚ!BaseChatOpenAI._astream_responses’  so  é € ð  ˆˆxÑØ×+Ò+¨HÑJ¸4ÐJÀ6ÑJˆØˆØ%'Ðð=	(Ø×,×,°×0B×0Bà×0Ñ0×BÑB×LÑL×SÒSñ Ø!ñ÷ ð $ð
 #6×";Ñ";Ó"=�Ø×0×0Ø(¬$Ð/B×/JÑ/JÓ*KÐL�GÜ%Ð&:ÕPà(,×(>Ñ(>×(HÑ(H×(OÒ(Oñ )Øñ)÷ #�ð #)§*¡*Ð->Ó"?Ðç&‘¨(Ø!%�Ø "�Ø')Ð$Ø$&Ð!Ø %�Ü#>ØØ×-Ñ-Ø#Ÿ™ò$÷ "/˜%ö
 +9™w¸b�Hô EØØ%Ø,Ø)Ø2Ø!)Ø&3Ø'+×':Ñ':ñ	ñØ%Ø,Ø)Ø(÷ (Ð'Þ)Ö.Bð@Ø"6ð@à#3×#CÑ#C×#IÀrð@Ð,Ô<ö 'Ø"-×">Ñ">Ø 0× 5Ñ 5Ð=Mð #?ð #÷ ð ð */˜Ø&Ð*:×*BÑ*B×*TÑ*TÓTØ,0˜MØ.Õ.òmò#ñ
 'ñ"/ñ8ð9$÷ '————�ûôR ×%Ñ%ó 	*Ü& q×)Ñ)ûÜ�‰ó 	(Ü$ Q×'Ñ'ûð	(üsñ   ‚I5¢AH" Á7G)Á8A1H" Ã)G,Ã*H" ÄG/ÄH" Ä	*HÄ3G5Ä7G1Ä8G5Ä;0HÅ/AHÆ?G3Ç )HÇ)H" Ç,H" Ç/H" Ç1G5Ç3HÇ5HÇ6H" ÈHÈH" ÈI5ÈHÈHÈHÈH" ÈI5ÈH" È"I2È6IÉI5ÉI2ÉI-É(I5É-I2É2I5c                ó   • UUR                  S0 5      R                  S5      U R                  R                  S0 5      R                  S5      U R                  /nU H  n[        U[        5      (       d  M  Us  $    U R                  =(       d    S$ )zÔDetermine whether to include usage metadata in streaming output.

For backwards compatibility, we check for `stream_options` passed
explicitly to kwargs or in the `model_kwargs` and override `self.stream_usage`.
Ústream_optionsÚinclude_usageF)rƒ   rJ  rW  r¶   r`  )r‰  rW  r  Ústream_usage_sourcesrÎ   s        r}   Ú_should_stream_usageÚ#BaseChatOpenAI._should_stream_usageÜ  s…   € ð Ø�J‰JÐ'¨Ó,×0Ñ0°ÓAØ×Ñ×!Ñ!Ð"2°BÓ7×;Ñ;¸OÓLØ×Ñð	 
Ðó +ˆFÜ˜&¤$×'Ó'Ø’ñ +ð × Ñ ×) EÐ)r   )rW  c             +  ó   #   • U R                  5         SUS'   U R                  " U40 UD6nU(       a  SU0US'   U R                  " U4SU0UD6n[        n0 n SU;   au  U R                  (       a  [
        R                  " S5        UR                  S5        U R                  R                  R                  R                  R                  " S0 UD6n	U	n
OªU R                  (       d  U R                  (       aj  U R                  R                  R                   " S0 UD6nUR#                  5       nU R                  (       a  S[%        UR&                  5      0n[)        X‹5        OU R                  R                   " S0 UD6nUn
U
 nSnU H«  n[+        U[$        5      (       d  UR-                  5       nU R/                  UUU(       a  UO0 5      nUc  MI  UR0                  R2                  nUR4                  =(       d    0 R7                  S	5      nU(       a  UR9                  UR:                  UUS
9  SnUv •  M­     S S S 5        [G        WS5      (       aN  SU;   aG  URI                  5       nU RK                  U5      nU(       a  UR9                  UR:                  US9  Uv •  g g g ! , (       d  f       Nn= f! [<        R>                   a  n[A        U5         S nAN•S nAf[<        RB                   a  n[E        U5         S nAN¼S nAff = f7f)NTrÕ  r  r  rv  rù  úLCannot currently include response headers when response_format is specified.r,  r]  ©rä  r]  FÚget_final_completionrÿ  rü   )&rö  r  r   r&   rx  rö   r÷   r¦  r@  Úbetar£  rÄ  rÕ  rŠ  r>  r  r  r  r©   r,  r1  r¶   Ú
model_dumpró  rÞ   Ú	__class__r.  rƒ   r  r¼   r!  r  r  r  r*  Úhasattrr"  Ú%_get_generation_chunk_from_completion©r‰  r	  rv  r
  rW  r  r  rî  rï  Úresponse_streamr  r/  r  r  rä  rð  r]  r±   Úfinal_completions                      r}   Ú_streamÚBaseChatOpenAI._streamï  sÅ  é € ð 	×*Ñ*Ô,ØˆˆxÑØ×0Ò0°ÑHÀÑHˆÞØ(7¸Ð'FˆFÐ#Ñ$Ø×+Ò+¨HÑJ¸4ÐJÀ6ÑJˆÜ6DÐØ!Ðð/	(Ø  GÓ+Ø×0×0Ü—M’Mð8ôð —‘˜HÔ%Ø"&×"2Ñ"2×"7Ñ"7×"<Ñ"<×"HÑ"H×"OÒ"Oñ #Øñ#�ð #2‘à×0×0°D×4F×4FØ#'§;¡;×#@Ñ#@×#GÒ#GÑ#RÈ'Ñ#R�LØ+×1Ñ1Ó3�HØ×4×4Ø09¼4À×@TÑ@TÓ;UÐ/VÐ,Ü)Ð*>ÕMà#Ÿ{™{×1Ò1Ñ<°GÑ<�HØ"*�Ù  HØ!%�Û%�EÜ% e¬T×2Ñ2Ø %× 0Ñ 0Ó 2˜Ø'+×'NÑ'NØØ+Þ0>Ñ,ÀBó(Ð$ð
 (Ñ/Ù Ø*:×*BÑ*B×*LÑ*LÐ'Ø 0× @Ñ @× FÀB×KÑKÈJÓW�HÞ"Ø#×4Ñ4Ø,×1Ñ1Ø"2Ø%-ð 5ñ ð
 &+�NØ*Ô*ñ' &÷ !ô4 �8Ð3×4Ñ4Ð9JÈgÓ9UØ'×<Ñ<Ó>ÐØ#×IÑIØ ó Ðö Ø×,Ñ,Ø$×)Ñ)Ð1Að -ñ ð #Ó"ð :VÐ4÷5 !•ûô, ×%Ñ%ó 	*Ü& q×)Ñ)ûÜ�‰ó 	(Ü$ Q×'Ñ'ûð	(üsi   ‚AK>ÁD'J+ Å>B4JÈ2J+ È:A K>Ê
J(Ê$J+ Ê'K>Ê(J+ Ê+K;Ê?KË
K>ËK;Ë&K6Ë1K>Ë6K;Ë;K>c                ó  • U R                  5         U R                  " U4SU0UD6nS nS n SU;   a]  UR                  S5        U R                  R                  R
                  R                  R                  " S0 UD6nUR                  5       nGO–U R                  U5      (       GaH  UR                  S5      n	U	(       aA  [        U	5      (       a1  U R                  R                  R                  R                  " S0 UD6nO0U R                  R                  R                  R                  " S0 UD6nUR                  5       nU R                  (       a  S[        UR                  5      0nU=(       d    0 n[!        Xg5        UR                  ["        S 5      n
[%        UU	UU R&                  S9nU
b@  UR(                   H0  nUR*                  =(       d    0 Ul        U
UR*                  ["        '   M2     U$ U R,                  R                  R                  " S0 UD6nUR                  5       n U R                  (       a+  Ub(  [;        US5      (       a  S[        UR                  5      0nU=(       d    0 n[!        Xg5        U RA                  WU5      $ ! [.        R0                   a  n[3        U5         S nANˆS nAf[.        R4                   a  n[7        U5         S nAN¯S nAf[8         a,  nUb"  [;        US5      (       a  UR<                  Ul        UeS nAff = f©Nrv  rù  rÕ  r,  )rü  rý  r„  Úhttp_responserü   )!rö  r   r¦  r@  r£  rÄ  r  r  Ú_use_responses_apirƒ   Ú_is_pydantic_classrÉ   r  rx  r©   r,  r1  rN   Ú'_construct_lc_result_from_responses_apir„  Úgenerationsr.  r>  r!  r  r  r  r*  r«   r&  r/  r  Ú_create_chat_result©r‰  r	  rv  r
  r  r  r.  r/  r  r  r0  ÚresultÚ
generationr±   s                 r}   Ú	_generateÚBaseChatOpenAI._generate<  s»  € ð 	×*Ñ*Ô,Ø×+Ò+¨HÑJ¸4ÐJÀ6ÑJˆØˆØˆð2	Ø  GÓ+Ø—‘˜HÔ%à×$Ñ$×)Ñ)×5Ñ5×GÑG×MÒMÑXÐPWÑXð ð (×-Ñ-Ó/’Ø×(Ñ(¨×1Ò1Ø&,§j¡jÐ1BÓ&CÐ#Þ&Ô+=Ð>Q×+RÑ+RØ#'×#3Ñ#3×#=Ñ#=×#OÑ#O×#UÒ#Uñ $Ø!ñ$‘Lð $(×#3Ñ#3×#=Ñ#=×#OÑ#O×#VÒ#Vñ $Ø!ñ$�Lð (×-Ñ-Ó/�Ø×0×0Ø'0´$°|×7KÑ7KÓ2LÐ&M�OØ"1×"7°R�Ü% oÔDð $3×#6Ñ#6Ü1°4ó$Ð ô AØØ.Ø,Ø#'×#6Ñ#6ñ	�ð $Ñ/Ø&,×&8Ô&8˜
Ø5?×5OÑ5O×5UÐSU˜
Ô2à,ð #×2Ñ2Ô3PÓQñ '9ð
 �à#Ÿ{™{×<Ñ<×CÒCÑNÀgÑN�Ø'×-Ñ-Ó/‘ð ×)×)ØÑ(Ü˜ i×0Ñ0à(¬$¨|×/CÑ/CÓ*DÐEˆOØ)×/¨RˆÜ˜oÔ<Ø×'Ñ'¨°/ÓBÐBøô! ×%Ñ%ó 	*Ü& q×)Ñ)ûÜ�‰ó 	(Ü$ Q×'Ñ'ûÜó 	ØÑ'¬G°LÀ/×,RÑ,RØ)×7Ñ7�”
ØˆGûð	ús=   «A!J ÂEJ Ç-6J ÊLÊJ,Ê,LËKËLË 'LÌLc                óN  • [        U R                  [        5      (       a  U R                  $ U R                  S:X  d_  U R                  cR  U R
                  cE  U R                  c8  U R                  c+  U R                  (       d  [        U R                  5      (       a  g[        U5      $ )Núresponses/v1T)r¶   r‚  r`  r„  rz  r|  rg  r€  r�  r6  r…   r0  )r‰  r  s     r}   r0  Ú!BaseChatOpenAI._use_responses_api„  s   € Ü�d×,Ñ,¬d×3Ñ3Ø×)Ñ)Ð)à×Ñ >Ó1Ø×&Ñ&Ñ2Ø�|‰|Ñ'Ø�~‰~Ñ)Ø�‰Ñ*Ø×,×,Ü+¨D¯O©O×<Ñ<àÜ! 'Ó*Ð*r   ©rv  c               óÔ  • U R                  U5      R                  5       nUb  X#S'   0 U R                  EUEnU R                  U5      (       aO  U R                  (       a0  [        U5      u  pgU(       a  UOUnU(       a  XuS'   [        X…5      nU$ [        XE5      n U$ U V	s/ sH7  n	[        U	[        5      (       a  [        [        U	5      5      O
[        U	5      PM9     sn	US'   U$ s  sn	f )Nrv  Úprevious_response_idr	  )Ú_convert_inputÚto_messagesr×  r0  r�  Ú_get_last_messagesÚ _construct_responses_api_payloadr¶   r%   rè   rm   )
r‰  Úinput_rv  r  r	  r  Úlast_messagesr?  Úpayload_to_useÚms
             r}   r   Ú#BaseChatOpenAI._get_request_payload“  sú   € ð ×&Ñ& vÓ.×:Ñ:Ó<ˆØÑØ!�6‰Nà4�T×)Ñ)Ð4¨VÐ4ˆà×"Ñ" 7×+Ñ+Ø×,×,Ü6HÈÓ6RÑ3�Þ2F¡ÈH�Þ'Ø6JÐ2Ñ3Ü:¸>ÓS�ð ˆô ;¸8ÓM‘ð ˆñ "ó	#ñ "�Aô ˜a¤×+Ñ+ô )Ô)MÈaÓ)PÔQä-¨aÓ0ò1ñ "ñ	#ˆG�JÑð ˆùò#s   Â =C%c                ó  • / n[        U[        [        R                  -  5      (       dH  [	        U5      n[        U5      S:”  a  US S  S3nS[        U5      R                   SU 3n[        U5      e[        U[        5      (       a  UOUR                  SSSS1000S	S
9nUR                  S5      (       a  [        UR                  S5      5      e US   nUc'  S[        UR                  5       5       3n[        U5      eUR                  S5      n	UR                  S5      n
U H§  n[        US   5      nU	(       a%  [        U[         5      (       a  [#        Xš5      Ul        U=(       d    0 nUR                  S5      b  UR                  S5      OUR                  S5      US'   SU;   a  US   US'   ['        XÂS9nUR)                  U5        M©     U	SUR                  SU R*                  5      UR                  SS5      S.nSU;   a  US   US'   U
(       a  X®S'   [        U[        R                  5      (       a™  [-        USS 5      (       a‡  UR.                  S   R0                  n[3        US5      (       a&  UR4                  US   R0                  R6                  S'   [3        US5      (       a&  UR8                  US   R0                  R6                  S'   [;        X>S9$ ! [         a$  nSUR                  5        3n[        U5      UeS nAff = f)NéÈ   z...zcUnexpected response type from OpenAI-compatible endpoint. Expected a dict or openai.BaseModel, got z: rã  Ú__all__rÞ   ÚparsedF)r=  rö   Úerrorz Response missing 'choices' key: z´Received response with null value for 'choices'. This can happen when using OpenAI-compatible APIs (e.g., vLLM) that return a response in an unexpected format. Full response keys: râ  r~  ré  r]  ræ  r!  rC  rÛ  r˜   )rÚ  rê  r…   rÛ  r–   r   Úrefusal)r3  Ú
llm_output)r¶   r©   r!  rY   Úreprrì  r»   rþ   rô   r$  rƒ   rî   Úkeysr¾   rÝ   r²   r%   rë  rå  rC   rª   r…   r-  rã  rÞ   r&  rL  rž   rN  rE   )r‰  r  r.  r3  Úpreviewrç   Úresponse_dictrã  r±   rÚ  r~  ÚresrÞ   ÚgenrO  s                  r}   r4  Ú"BaseChatOpenAI._create_chat_result²  s'  € ð
 ˆä˜(¤D¬6×+;Ñ+;Ñ$;×<Ñ<ô ˜8“nˆGÜ�7‹|˜cÓ!Ø$ T c˜]˜O¨3Ð/�ð<ä˜“>×*Ñ*Ð+¨2¨g¨Yð8ð ô
 ˜S“/Ð!ô ˜(¤D×)Ñ)ñ ð ×$Ñ$Ø" Y°¸X¸JÐ0GÐ$HÐIØð %ð ð 	ð ×Ñ˜W×%Ñ%Ü˜]×.Ñ.¨wÓ7Ó8Ð8ð	'Ø# IÑ.ˆGð
 ‰?ð
'ô (,¨M×,>Ñ,>Ó,@Ó'AÐ&BðDð ô ˜C“.Ð à#×'Ñ'¨Ó0ˆØ$×(Ñ(¨Ó8ˆãˆCÜ.¨s°9©~Ó>ˆGÞœz¨'´9×=Ñ=Ü)?Øó*�Ô&ð .×3°ˆOð —7‘7˜?Ó+Ñ7ð —‘˜Ô(à$×(Ñ(¨Ó9ð ˜OÑ,ð
 ˜SÓ Ø.1°*©o� 
Ñ+Ü ¨ÑRˆCØ×Ñ˜sÖ#ñ ð" 'Ø&Ø'×+Ñ+¨G°T·_±_ÓEØ"/×"3Ñ"3Ð4HÈ"Ó"Mñ	
ˆ
ð �=Ó Ø,¨TÑ2ˆJ�tÑÞØ)5�~Ñ&ä�h¤× 0Ñ 0×1Ñ1´gØ�i ÷7
ñ 7
ð ×&Ñ& qÑ)×1Ñ1ˆGÜ�w ×)Ñ)ØELÇ^Á^�˜A‘×&Ñ&×8Ñ8¸ÑBÜ�w 	×*Ñ*ØFMÇoÁo�˜A‘×&Ñ&×8Ñ8¸ÑCä kÑIÐIøôo ó 	'Ø4°]×5GÑ5GÓ5IÐ4JÐKˆCÜ˜3“- QÐ&ûð	'ús   ÃK Ë
LË#LÌLc              óÈ  #   • SUS'   U R                   " U40 UD6nU(       a  SU0US'   U R                  " U4SU0UD6n[        n0 n SU;   au  U R                  (       a  [        R
                  " S5        UR                  S5        U R                  R                  R                  R                  R                  " S0 UD6n	U	n
OºU R                  (       d  U R                  (       ar  U R                  R                  R                  " S0 UD6I S h  v•N nUR!                  5       nU R                  (       a  S[#        UR$                  5      0n['        X‹5        O$U R                  R                  " S0 UD6I S h  v•N nUn
U
 IS h  v•N nSn[)        UU R*                  U R,                  S	9  S h  v•N n[/        U["        5      (       d  UR1                  5       nU R3                  UUU(       a  UO0 5      nUc  MO  UR4                  R6                  nUR8                  =(       d    0 R;                  S
5      nU(       a#  UR=                  UR>                  UUS9I S h  v•N   SnU7v •  M¼   GNW Nñ Næ N¾ N
 S S S 5      IS h  v•N    Om! , IS h  v•N  (       d  f       OV= f! [@        RB                   a  n[E        U5         S nAO/S nAf[@        RF                   a  n[I        U5         S nAOS nAff = f[K        WS5      (       aa  SU;   aZ  URM                  5       I S h  v•N  nU RO                  U5      nU(       a#  UR=                  UR>                  US9I S h  v•N    U7v •  g g g 7f)NTrÕ  r  r  rv  rù  r   r,  r5  r]  r!  Fr"  rÿ  rü   )(r  r   r&   rx  rö   r÷   r¦  rA  r#  r£  rÄ  rÕ  rŠ  r?  r  r  r  r©   r,  r1  rb   rt  r…   r¶   r$  ró  rÞ   r%  r.  rƒ   r  r¼   r!  r  r  r  r*  r&  r"  r'  r(  s                      r}   Ú_astreamÚBaseChatOpenAI._astream  s"  é € ð  ˆˆxÑØ×0Ò0°ÑHÀÑHˆÞØ(7¸Ð'FˆFÐ#Ñ$Ø×+Ò+¨HÑJ¸4ÐJÀ6ÑJˆÜ6DÐØ!Ðð5	(Ø  GÓ+Ø×0×0Ü—M’Mð8ôð —‘˜HÔ%Ø"&×"8Ñ"8×"=Ñ"=×"BÑ"B×"NÑ"N×"UÒ"Uñ #Øñ#�ð #2‘à×0×0°D×4F×4FØ)-×):Ñ):×)LÑ)L×)SÒ)Sñ *Ø!ñ*÷ $�Lð  ,×1Ñ1Ó3�HØ×4×4Ø09¼4À×@TÑ@TÓ;UÐ/VÐ,Ü)Ð*>ÕMà%)×%6Ñ%6×%=Ò%=Ñ%HÀÑ%H×H�HØ"*�ß&‘¨(Ø!%�Ü#>ØØ×-Ñ-Ø#Ÿ™ò$÷ +˜%ô
 & e¬T×2Ñ2Ø %× 0Ñ 0Ó 2˜Ø'+×'NÑ'NØØ+Þ0>Ñ,ÀBó(Ð$ð
 (Ñ/Ù Ø*:×*BÑ*B×*LÑ*LÐ'Ø 0× @Ñ @× FÀB×KÑKÈJÓW�HÞ"Ø)×:Ñ:Ø,×1Ñ1Ø"2Ø%-ð ;ð ÷ ð ð
 &+�NØ*Õ*òG$ñ  Iá&ñ+ñ"ð#$÷ '————�ûô4 ×%Ñ%ó 	*Ü& q×)Ñ)ûÜ�‰ó 	(Ü$ Q×'Ñ'ûð	(úä�8Ð3×4Ñ4Ð9JÈgÓ9UØ%-×%BÑ%BÓ%D×DÐDÐØ#×IÑIØ ó Ðö Ø!×2Ñ2Ø$×)Ñ)Ð1Að 3ð ÷ ñ ð #Ô"ð :VÐ4ùs  ‚AM"ÁCJ ÄI$ÄA'J Å5I'Å6J ÆI)ÆJ Æ"JÆ(I/Æ,I+Æ-I/Æ0B&JÉI-ÉJÉ$J É'J É)J É+I/É-JÉ/JÉ0J É;I>É<J ÊM"ÊJÊJÊ	JÊJ ÊM"ÊJ ÊK,Ê0K Ê;M"Ë K,ËK'Ë"M"Ë'K,Ë,-M"ÌLÌ:M"ÍMÍM"c              ‹  óP  #   • U R                   " U4SU0UD6n0 nS n SU;   ae  UR                  S5        U R                  R                  R                  R
                  R                  " S0 UD6I S h  v•N nUR                  5       nGO£U R                  U5      (       GaM  UR                  S5      n	U	(       aI  [        U	5      (       a9  U R                  R                  R
                  R                  " S0 UD6I S h  v•N nO8U R                  R                  R
                  R                  " S0 UD6I S h  v•N nUR                  5       nU R                  (       a  S[        UR                  5      0n[        Xg5        UR                  [         S 5      n
[#        UU	UU R$                  S9nU
b@  UR&                   H0  nUR(                  =(       d    0 Ul        U
UR(                  [         '   M2     U$ U R*                  R
                  R                  " S0 UD6I S h  v•N nUR                  5       n U R                  (       a+  Ub(  [9        US5      (       a  S[        UR                  5      0n[        Xg5        [?        S U R@                  WU5      I S h  v•N $  GN! GN› GNe N…! [,        R.                   a  n[1        U5         S nAN–S nAf[,        R2                   a  n[5        U5         S nAN½S nAf[6         a,  nUb"  [9        US5      (       a  UR:                  Ul        UeS nAff = f N–7fr.  )!r   r¦  rA  r£  rÄ  r  r  r0  rƒ   r1  rÉ   r  rx  r©   r,  r1  rN   r2  r„  r3  r.  r?  r!  r  r  r  r*  r«   r&  r/  r  rJ   r4  r5  s                 r}   Ú
_agenerateÚBaseChatOpenAI._ageneratee  sê  é € ð ×+Ò+¨HÑJ¸4ÐJÀ6ÑJˆØˆØˆð7	Ø  GÓ+Ø—‘˜HÔ%Ø%)×%;Ñ%;×%@Ñ%@×%LÑ%L×%^Ñ%^×%dÒ%dñ &Øñ&÷  �ð (×-Ñ-Ó/’Ø×(Ñ(¨×1Ò1Ø&,§j¡jÐ1BÓ&CÐ#Þ&Ô+=Ð>Q×+RÑ+Rà"×4Ñ4×>Ñ>×PÑP×VÒVñ Ø%ñ÷ ñ !ð #×4Ñ4×>Ñ>×PÑP×WÒWñ Ø%ñ÷ ð !ð
 (×-Ñ-Ó/�Ø×0×0Ø'0´$°|×7KÑ7KÓ2LÐ&M�OÜ% oÔDð $3×#6Ñ#6Ü1°4ó$Ð ô AØØ.Ø,Ø#'×#6Ñ#6ñ	�ð $Ñ/Ø&,×&8Ô&8˜
Ø5?×5OÑ5O×5UÐSU˜
Ô2à,ð #×2Ñ2Ô3PÓQñ '9ð
 �à%)×%6Ñ%6×%HÑ%H×%OÒ%Oñ &Øñ&÷  �ð (×-Ñ-Ó/‘ð ×)×)ØÑ(Ü˜ i×0Ñ0à(¬$¨|×/CÑ/CÓ*DÐEˆOÜ˜oÔ<Ü$Ø�$×*Ñ*¨H°oó
÷ 
ð 	
òy òòñ6 øô ×%Ñ%ó 	*Ü& q×)Ñ)ûÜ�‰ó 	(Ü$ Q×'Ñ'ûÜó 	ØÑ'¬G°LÀ/×,RÑ,RØ)×7Ñ7�”
ØˆGûð	úñ
ùs¼   ‚L&�AJ Á1JÁ2J ÂL&ÂA2J Ã:JÃ;8J Ä3JÄ4B7J Ç+L&Ç,)J ÈJÈJ È*A#L&ÊL$ÊL&ÊJ ÊJ ÊJ ÊJ ÊL!Ê1KÊ<L&ËL!ËK(Ë#L&Ë(L!Ë5'LÌL!Ì!L&c                ó6   • SU R                   0U R                  E$ )zGet the identifying parameters.r…   )r…   r×  r�  s    r}   Ú_identifying_paramsÚ"BaseChatOpenAI._identifying_params²  s   € ð ˜dŸo™oÐF°×1EÑ1EÐFÐFr   c           
     óŒ  >• SU R                   0[        TU ]	  US9EU R                  EUEnUR	                  S5      =n(       av  [        U[        5      (       aa  SnU VVs/ sHM  n[        U[        5      (       a3  UR	                  S5      S:X  a  0 UEU Vs0 sH  nXv;   d  M
  US_M     snEOUPMO     snnUS'   U$ s  snf s  snnf )z,Get the parameters used to invoke the model.rC  r=  Útools)r,  Úauthorizationr»   r�   z**REDACTED**)r…   ÚsuperÚ_get_invocation_paramsr×  rƒ   r¶   r¾   r©   )	r‰  rv  r  Úparamsra  Úsensitive_fieldsr¦   Úfieldr%  s	           €r}   rd  Ú%BaseChatOpenAI._get_invocation_params·  s  ø€ ð
 �T—_‘_ð
ä‰gÑ,°$Ð,Ð7ð
ð ×"Ñ"ð
ð ð	
ˆð —Z‘Z Ó(Ð(ˆEÕ(¬j¸Ä×.EÑ.EØ;Ðñ "ôñ "�Dô ˜d¤D×)Ñ)¨d¯h©h°vÓ.>À%Ó.GðØðñ &6óá%5˜EØ ™=ó .˜˜~Ò-Ù%5ññð ò	ñ "òˆF�7‰Oð ˆùòùós   Á6C ÂB;Â!B;Â(
C Â;C c           	     óŽ  • U R                   " SSU0UD6n[        SUR                  SU R                  5      SUR                  SU R                  5      S9nUR                  SU R
                  5      =(       d    UR                  SU R
                  5      =n(       a  XTS	'   U=(       d    UR                  SS
5      =n(       a  XdS'   U$ )z Get standard params for tracing.rv  r!  rC  r£  rG  )Úls_providerÚls_model_nameÚls_model_typeÚls_temperaturerd  Úmax_completion_tokensÚls_max_tokensNÚls_stoprü   )rd  r$   rƒ   r…   rG  rd  )r‰  rv  r  re  Ú	ls_paramsro  rp  s          r}   Ú_get_ls_paramsÚBaseChatOpenAI._get_ls_paramsÔ  s¿   € ð ×,Ò,ÑA°$ÐA¸&ÑAˆÜ#Ø Ø Ÿ*™* W¨d¯o©oÓ>Ø Ø!Ÿ:™: m°T×5EÑ5EÓFñ	
ˆ	ð #ŸJ™J |°T·_±_ÓE÷ 
ÈÏÉØ# T§_¡_óJ
ð 
ˆ=õ 
ð *7�oÑ&Ø×6˜fŸj™j¨°Ó6Ð6ˆ7Õ6Ø#*�iÑ ØÐr   c                ó   • g)zfReturn type of chat model.

Will always return `'openai-chat'` regardless of the specific model name.
zopenai-chatrü   r�  s    r}   Ú	_llm_typeÚBaseChatOpenAI._llm_typeç  s   € ð r   c                ó&  • U R                   b  U R                   nOU R                  n [        R                  " U5      nX4$ ! [         aE    UR                  5       nSnUR                  S5      (       a  Sn[        R                  " U5      n X4$ f = f)NÚcl100k_base)zgpt-4ozgpt-4.1r¢  Ú
o200k_base)ri  r…   ÚtiktokenÚencoding_for_modelrî   rÕ   rÖ   Úget_encoding)r‰  rC  Úencodingr§  Úencoders        r}   Ú_get_encoding_modelÚ"BaseChatOpenAI._get_encoding_modelï  s‘   € Ø×#Ñ#Ñ/Ø×,Ñ,‰Eà—O‘OˆEð	6Ü×2Ò2°5Ó9ˆHð ˆÐøô ó 	6ØŸ+™+›-ˆKØ#ˆGØ×%Ñ%Ð&D×EÑEØ&�Ü×,Ò,¨WÓ5‰HØˆÐð	6ús   ¨A ÁA
BÂBc                óÒ   >• U R                   b  U R                  U5      $ [        R                  S   S::  a  [        TU ]  U5      $ U R                  5       u  p#UR                  U5      $ )z9Get the tokens present in the text with tiktoken package.r¡  é   )Úcustom_get_token_idsÚsysÚversion_inforc  Úget_token_idsr  Úencode)r‰  r¼   Ú_Úencoding_modelr%  s       €r}   r†  ÚBaseChatOpenAI.get_token_idsÿ  se   ø€ à×$Ñ$Ñ0Ø×,Ñ,¨TÓ2Ð2ä×Ñ˜AÑ !Ó#Ü‘7Ñ(¨Ó.Ð.Ø ×4Ñ4Ó6ÑˆØ×$Ñ$ TÓ*Ð*r   )Úallow_fetching_imagesc          
     ó  >• Ub  [         R                  " S5        [        R                  S   S::  a  [        TU ]  U5      $ U R                  5       u  pEUR                  S5      (       a  SnSnO,UR                  S5      (       a  SnSnOS	U S
3n[        U5      eSn	U V
s/ sH  n
[        U
5      PM     nn
U GHÁ  nX–-  n	UR                  5        GH¤  u  pÞUS:X  a  U	S-  n	M  [        U[        5      (       Ga>  U GH6  n[        U[        5      (       d	  US   S:X  a;  [        U[        5      (       a  US   OUnU	[        UR!                  U5      5      -  n	M]  US   S:X  aO  US   R#                  S5      S:X  a  U	S-  n	M…  U(       a'  [%        US   S   5      nU(       d  M¦  U	['        U6 -  n	M³  Mµ  US   S:X  aI  U	[        UR!                  US   S   5      5      -  n	U	[        UR!                  US   S   5      5      -  n	GM  US   S:X  a  [         R                  " S5        GM)  SU 3n[)        U5      e   O0U(       d  GMq  U	[        UR!                  [        U5      5      5      -  n	US:X  d  GM   X—-  n	GM§     GMÄ     U	S-  n	U	$ s  sn
f )aø  Calculate num tokens for supported OpenAI chat models.

!!! warning
    You must have the `pillow` installed if you want to count image tokens if
    you are specifying the image as a base64 string, and you must have both
    `pillow` and `httpx` installed if you are specifying the image as a URL. If
    these aren't installed image inputs will be ignored in token counting.

[OpenAI reference](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_format_inputs_to_ChatGPT_models.ipynb).

Args:
    messages: The message inputs to tokenize.
    tools: If provided, sequence of `dict`, `BaseModel`, function, or `BaseTool`
        to be converted to tool schemas.
    allow_fetching_images: Whether to allow fetching images for token counting.
zECounting tokens in tool schemas is not yet supported. Ignoring tools.r¡  r‚  zgpt-3.5-turbo-0301é   rú  )rB  úgpt-4r¢  r   Úo3Úo4é   zFget_num_tokens_from_messages() is not presently implemented for model z†. See https://platform.openai.com/docs/guides/text-generation/managing-tokens for information on how messages are converted to tokens.r   r§   r»   r¼   rÒ   ÚdetailÚlowéU   rÓ   r¤   rê   r•   ÚfilezEToken counts for file inputs are not supported. Ignoring file inputs.z!Unrecognized content block type

)rö   r÷   r„  r…  rc  Úget_num_tokens_from_messagesr  rÖ   ÚNotImplementedErrorrè   rÜ   r¶   r¾   r¬   r©   rì  r‡  rƒ   Ú_url_to_sizeÚ_count_image_tokensrô   )r‰  r	  ra  r‹  rC  r}  Útokens_per_messageÚtokens_per_namerç   Ú
num_tokensrG  Úmessages_dictrÞ   r¸  r›  Úvalr¼   Ú
image_sizer%  s                     €r}   r–  Ú+BaseChatOpenAI.get_num_tokens_from_messages		  s¢  ø€ ð0 ÑÜ�MŠMØWôô ×Ñ˜AÑ !Ó#Ü‘7Ñ7¸ÓAÐAØ×2Ñ2Ó4‰ˆØ×ÑÐ0×1Ñ1à!"Ðà ‰OØ×ÑÐS×TÑTØ!"ÐØ‰OðØ"˜Gð $LðLð ô & cÓ*Ð*Øˆ
Ù>FÓG¹h¸Ô1°!Ö4¹hˆÐGÜ$ˆGØÑ,ˆJØ%Ÿm™mŸo‘
�ð ˜.Ó(Ø !‘O�JÙÜ˜e¤T×*Ò*ä$˜Ü% c¬3×/Ñ/°3°v±;À&Ó3HÜ2<¸SÄ$×2GÑ2G 3 v¢;ÈS˜DØ&¬#¨h¯o©o¸dÓ.CÓ*DÑDšJØ  ™[¨KÓ7Ø" ;Ñ/×3Ñ3°HÓ=ÀÓFØ *¨bÑ 0¢
Þ!6Ü-9¸#¸kÑ:JÈ5Ñ:QÓ-R 
Þ'1Ù$,Ø *Ô.AÀ:Ð.NÑ N¢
á $ð ! ™[¨JÓ6Ø&¬#Ø (§¡°°J±ÀÑ0LÓ Mó+ñ ˜Jð '¬#¨h¯o©o¸cÀ*¹oÈfÑ>UÓ.VÓ*WÑW›JØ  ™[¨FÓ2Ü$ŸMšMð!8÷ð
 %HÈÀuÐ"M˜CÜ",¨S£/Ð1ò9  %ö: Úð ¤# h§o¡o´c¸%³jÓ&AÓ"BÑB�JØ˜&–=ØÑ1“JôY .ñ %ð` 	�a‰ˆ
ØÐùòe Hs   Â J)Útool_choiceÚstrictÚparallel_tool_callsrù  c               óX  >• Ub  XFS'   U(       a  USLa  U R                   (       d  SnU Vs/ sH  n[        XsS9PM     nn[        XSS9 H  u  pš[        U	[        5      (       d  M  [        U	S5      (       d  M/  [        U	R                  [        5      (       d  MP  [         H%  nX¹R                  ;   d  M  U	R                  U   X«'   M'     M�     / nU H>  nSU;   a  UR                  US   S   5        M"  SU;   a  UR                  US   5        M>  M@     U(       a}  [        U[        5      (       a&  X,;   a  SSU0S	.nOWU[        ;   a  S
U0nOHUS:X  a  SnO?O>[        U[        5      (       a  SnO&[        U[        5      (       a  OSU 3n[        U5      eX&S'   U(       aw  [        U[        5      (       aV  UR                  S
5      S:X  aA  SUR                  S0 5      ;   a+  US   R                  SS5      n[        [        US   S   5      n[!        XSS9US'   ["        TU ]H  " SSU0UD6$ s  snf )a÷  Bind tool-like objects to this chat model.

Assumes model is compatible with OpenAI tool-calling API.

Args:
    tools: A list of tool definitions to bind to this chat model.

        Supports any tool definition handled by [`convert_to_openai_tool`][langchain_core.utils.function_calling.convert_to_openai_tool].
    tool_choice: Which tool to require the model to call. Options are:

        - `str` of the form `'<<tool_name>>'`: calls `<<tool_name>>` tool.
        - `'auto'`: automatically selects a tool (including no tool).
        - `'none'`: does not call a tool.
        - `'any'` or `'required'` or `True`: force at least one tool to be called.
        - `dict` of the form `{"type": "function", "function": {"name": <<tool_name>>}}`: calls `<<tool_name>>` tool.
        - `False` or `None`: no effect, default OpenAI behavior.
    strict: If `True`, model output is guaranteed to exactly match the JSON Schema
        provided in the tool definition. The input schema will also be validated according to the
        [supported schemas](https://platform.openai.com/docs/guides/structured-outputs/supported-schemas?api-mode=responses#supported-schemas).
        If `False`, input schema will not be validated and model output will not
        be validated. If `None`, `strict` argument will not be passed to the model.
    parallel_tool_calls: Set to `False` to disable parallel tool use.
        Defaults to `None` (no specification, which allows parallel tool use).
    response_format: Optional schema to format model response. If provided
        and the model does not call a tool, the model will generate a
        [structured response](https://platform.openai.com/docs/guides/structured-outputs).
    kwargs: Any additional parameters are passed directly to `bind`.
Nr£  FT©r¢  rµ   r¤   r•   ©r»   r¤   r»   ÚanyÚrequiredzEUnrecognized tool_choice type. Expected str, bool or dict. Received: r¡  Újson_schemarü  r¢  rù  ra  rü   )r‚  rR   Úzipr¶   rK   r&  rµ   r©   Ú_TOOL_EXTRAS_PASSTHROUGHrª   r¬   ÚWellKnownToolsr`  rô   rƒ   r   Ú"_convert_to_openai_response_formatrc  Úbind)r‰  ra  r¡  r¢  r£  rù  r  r¦   Úformatted_toolsÚoriginalÚ	formattedr¸  Ú
tool_namesrç   r%  s                 €r}   Ú
bind_toolsÚBaseChatOpenAI.bind_toolsm	  s6  ø€ ðL Ñ*Ø,?Ð(Ñ)ö
 ˜v¨UÒ2¸4×;Q×;QØˆFáDIó
ÙDI¸DÔ" 4Ô7ÁEð 	ð 
ô $' uÀeÔ#LÑˆHä˜8¤X×.Ó.Ü˜H h×/Ó/Ü˜xŸ™´×5Ó5ç3�CØŸo™oÕ-Ø)1¯©¸Ñ)=˜	›ó 4ñ $Mð ˆ
Û#ˆDØ˜TÓ!Ø×!Ñ! $ zÑ"2°6Ñ":Ö;Ø˜4“Ø×!Ñ! $ v¡,Ö/áñ $ö Ü˜+¤s×+Ñ+àÓ,à *Ø%+¨[Ð$9ñ#‘Kð !¤NÓ2Ø#)¨;Ð"7‘Kð ! EÓ)Ø",‘KàÜ˜K¬×.Ñ.Ø(‘Ü˜K¬×.Ñ.Øð!Ø!, ð/ð ô ! “oÐ%Ø$/�=Ñ!æä˜?¬D×1Ñ1Ø#×'Ñ'¨Ó/°=Ó@Ø × 3Ñ 3°MÀ2Ó FÓFð )¨Ñ7×;Ñ;¸HÀdÓK�Ü"&¤t¨_¸]Ñ-KÈHÑ-UÓ"V�Ü(JØñ)ˆFÐ$Ñ%ô ‰wŠ|Ñ< /Ð<°VÑ<Ð<ùò{
s   ¬H'Úfunction_calling©ÚmethodÚinclude_rawr¢  ra  c          
     óª  • Ub  US:X  a  Sn[        U5      e[        U5      nUS:X  a»  U(       a-  [        U[        5      (       a  [        R
                  " S5        SnU R                  (       av  U R                  R                  S5      (       d0  U R                  R                  S5      (       d  U R                  S:X  a&  [        R
                  " S	U R                   S
35        SnUS:X  as  Uc  Sn[        U5      e[        U5      S   S   n	U R                  " S(0 U	SUX$S.US.S.UED6n
U R                  " U/40 U
D6nU(       a  [        U/SS9nGO![        U	SS9nGOUS:X  a9  U R                  " S(0 SS0SU0US.S.UED6nU(       a	  [        US9O	[        5       nOÖUS:X  a¿  Uc  Sn[        U5      e[!        XS9n0 [#        S(UX$S.[        U5      S.S.UD6En
U(       a  U Vs/ sH  n[        XäS9PM     snU
S'   U R                  " S(0 U
D6nU(       aA  [%        ['        [(        [+        [,        U5      S95      R/                  [+        [,        U5      S9nO[        5       nOSU S3n[        U5      eU(       aT  [0        R2                  " [5        S 5      U-  S! S"9n[0        R2                  " S# S$9nUR7                  U/S%S&9n[9        US'9U-  $ X¼-  $ s  snf ))aÌ  Model wrapper that returns outputs formatted to match the given schema.

Args:
    schema: The output schema. Can be passed in as:

        - An OpenAI function/tool schema,
        - A JSON Schema,
        - A `TypedDict` class,
        - Or a Pydantic class.

        If `schema` is a Pydantic class then the model output will be a
        Pydantic instance of that class, and the model-generated fields will be
        validated by the Pydantic class. Otherwise the model output will be a
        dict and will not be validated.

        See `langchain_core.utils.function_calling.convert_to_openai_tool` for
        more on how to properly specify types and descriptions of schema fields
        when specifying a Pydantic or `TypedDict` class.

    method: The method for steering model generation, one of:

        - `'function_calling'`:
            Uses OpenAI's [tool-calling API](https://platform.openai.com/docs/guides/function-calling)
            (formerly called function calling)
        - `'json_schema'`:
            Uses OpenAI's [Structured Output API](https://platform.openai.com/docs/guides/structured-outputs)
        - `'json_mode'`:
            Uses OpenAI's [JSON mode](https://platform.openai.com/docs/guides/structured-outputs/json-mode).
            Note that if using JSON mode then you must include instructions for
            formatting the output into the desired schema into the model call

    include_raw:
        If `False` then only the parsed structured output is returned.

        If an error occurs during model output parsing it will be raised.

        If `True` then both the raw model response (a `BaseMessage`) and the
        parsed model response will be returned.

        If an error occurs during output parsing it will be caught and returned
        as well.

        The final output is always a `dict` with keys `'raw'`, `'parsed'`, and
        `'parsing_error'`.
    strict:

        - `True`:
            Model output is guaranteed to exactly match the schema.
            The input schema will also be validated according to the
            [supported schemas](https://platform.openai.com/docs/guides/structured-outputs/supported-schemas?api-mode=responses#supported-schemas).
        - `False`:
            Input schema will not be validated and model output will not be
            validated.
        - `None`:
            `strict` argument will not be passed to the model.

    tools:
        A list of tool-like objects to bind to the chat model. Requires that:

        - `method` is `'json_schema'` (default).
        - `strict=True`
        - `include_raw=True`

        If a model elects to call a tool, the resulting `AIMessage` in `'raw'`
        will include tool calls.

        ??? example

            ```python
            from langchain.chat_models import init_chat_model
            from pydantic import BaseModel


            class ResponseSchema(BaseModel):
                response: str


            def get_weather(location: str) -> str:
                """Get weather at a location."""
                pass

            model = init_chat_model("openai:gpt-5.5")

            structured_model = model.with_structured_output(
                ResponseSchema,
                tools=[get_weather],
                strict=True,
                include_raw=True,
            )

            structured_model.invoke("What's the weather in Boston?")
            ```

            ```python
            {
                "raw": AIMessage(content="", tool_calls=[...], ...),
                "parsing_error": None,
                "parsed": None,
            }
            ```

    kwargs: Additional keyword args are passed through to the model.

Returns:
    A `Runnable` that takes same inputs as a
        `langchain_core.language_models.chat.BaseChatModel`. If `include_raw` is
        `False` and `schema` is a Pydantic class, `Runnable` outputs an instance
        of `schema` (i.e., a Pydantic object). Otherwise, if `include_raw` is
        `False` then `Runnable` outputs a `dict`.

        If `include_raw` is `True`, then `Runnable` outputs a `dict` with keys:

        - `'raw'`: `BaseMessage`
        - `'parsed'`: `None` if there was a parsing error, otherwise the type
            depends on the `schema` as described above.
        - `'parsing_error'`: `BaseException | None`

!!! warning "Behavior changed in `langchain-openai` 0.3.12"

    Support for `tools` added.

!!! warning "Behavior changed in `langchain-openai` 0.3.21"

    Pass `kwargs` through to the model.
Ú	json_modez<Argument `strict` is not supported with `method`='json_mode'r©  záReceived a Pydantic BaseModel V1 schema. This is not supported by method="json_schema". Please use method="function_calling" or specify schema via JSON Schema or Pydantic V2 BaseModel. Overriding to method="function_calling".rµ  zgpt-3zgpt-4-rŽ  z+Cannot use method='json_schema' with model a   since it doesn't support OpenAI's Structured Output API. You can see supported models here: https://platform.openai.com/docs/guides/structured-outputs#supported-models. To fix this warning, set `method='function_calling'. Overriding to method='function_calling'.zGschema must be specified when method is not 'json_mode'. Received None.r¤   r•   F)r·  r¢  )r  rü  )r¡  r£  r¢  Úls_structured_output_formatT)ra  Úfirst_tool_only)Úkey_namer¼  r»   Újson_objectr·  )rù  r»  )Úpydantic_objectr¥  ra  )rü  )Úoutput_typez\Unrecognized method argument. Expected one of 'function_calling' or 'json_mode'. Received: 'Ú'Úrawc                ó   • g r�   rü   ©rˆ  s    r}   rr  Ú7BaseChatOpenAI.with_structured_output.<locals>.<lambda>Ù
  s   € ÐRVr   )rL  Úparsing_errorc                ó   • g r�   rü   rÄ  s    r}   rr  rÅ  Û
  s   € Àdr   )rL  rÆ  )Úexception_key)rÂ  rü   )rô   r1  Ú
issubclassÚBaseModelV1rö   r÷   r…   rÖ   rR   Ú_filter_disabled_paramsr³  r@   r?   r®  r>   r=   r­  r©   rG   r
   Ú_oai_structured_outputs_parserr   r»   Ú
with_typesrI   Úassignr   Úwith_fallbacksrH   )r‰  rü  r·  r¸  r¢  ra  r  rç   Úis_pydantic_schemaÚ	tool_nameÚbind_kwargsÚllmÚoutput_parserrù  ÚtÚparser_assignÚparser_noneÚparser_with_fallbacks                     r}   Úwith_structured_outputÚ%BaseChatOpenAI.with_structured_outputÚ	  sJ  € ðR Ñ &¨KÓ"7ØPˆCÜ˜S“/Ð!Ü/°Ó7Ðà�]Ó"ö #¤z°&¼+×'FÑ'Fä—’ð?ôð ,�à��Ø—‘×*Ñ*¨7×3Ñ3Ø—?‘?×-Ñ-¨h×7Ñ7Ø—?‘? gÓ-ä—’ØAÀ$Ç/Á/ÐARð S?ð ?ôð ,�àÐ'Ó'Ø‰~ð%ð ô ! “oÐ%Ü.¨vÓ6°zÑBÀ6ÑJˆIØ×6Ò6ñ à#,Ø+0Ø$à-3Ñ"FØ"(ñ4ñ		ð ð	ñˆKð —/’/ 6 (Ñ:¨kÑ:ˆCÞ!Ü*=Ø!˜(Ø$(ñ+’ô
 !9Ø&¸ñ!’ð �{Ó"Ø—)’)ñ 	à(.°Ð'>à#+¨VÐ"4Ø"(ñ4ñð ðñ	ˆCö &ô %°VÒ<ä%Ó'ñ ð
 �}Ó$Ø‰~ð%ð ô ! “oÐ%Ü@ÀÑWˆOð	Üð Ø$3à-3Ñ"FÜ"8¸Ó"@ñ1ñð ñð	ˆKö áFKó(ÙFKÀÔ*¨1Ô<Áeñ(�˜GÑ$ð —)’)Ñ*˜kÑ*ˆCÞ!Ü .ÜÔ:Ä4ÌÈfÓCUÑVó!ç‘*¬¬d°FÓ);�*Ð<ñ ô !1Ó 2‘ð+Ø+1¨(°!ð5ð ô ˜S“/Ð!æÜ/×6Ò6Ü! %Ó(¨=Ñ8ÉñˆMô .×4Ò4¹NÑKˆKØ#0×#?Ñ#?Ø�¨_ð $@ð $Ð ô  3Ñ'Ð*>Ñ>Ð>ØÑ"Ð"ùò5(s   Ç#Kc                óÐ   • U R                   (       d  U$ 0 nUR                  5        H<  u  p4X0R                   ;   a$  U R                   U   b  X@R                   U   ;   a  M8  XBU'   M>     U$ r�   )ry  rÜ   )r‰  r  Úfilteredrã   rä   s        r}   rË  Ú&BaseChatOpenAI._filter_disabled_paramsâ
  se   € Ø×#×#ØˆMØˆØ—L‘L–N‰DˆAà×(Ñ(Ó(Ø×$Ñ$ QÑ'Ñ/°1×8LÑ8LÈQÑ8OÓ3Oáà�Q‹Kñ #ð ˆr   c                óD  • U R                  U5      nUR                  S   R                  n[        U[        5      (       a8  UR
                  nSUR                  ;   a  UR                  R                  S5        OSn[        SUR                  US9n[        XRR                  S9$ )zDGet chunk from completion (e.g., from final completion of a stream).r   r›   Nr˜   )r6   rž   rå  ræ  )r4  r3  rÞ   r¶   r%   rå  rž   r¦  r&   rD   rO  )r‰  Ú
completionÚchat_resultÚchat_messagerå  rÞ   s         r}   r'  Ú4BaseChatOpenAI._get_generation_chunk_from_completionð
  s›   € ð ×.Ñ.¨zÓ:ˆØ"×.Ñ.¨qÑ1×9Ñ9ˆÜ�l¤I×.Ñ.Ø)×8Ñ8ˆNà˜|×=Ñ=Ó=Ø×.Ñ.×2Ñ2°<Ô@øà!ˆNÜ ØØ*×<Ñ<Ø)ñ
ˆô
 #Ø×-CÑ-Cñ
ð 	
r   )
r?  r>  rm  rl  rO  rL  rQ  rA  r@  rW  ©Úreturnr`  )rä  r¬   )r“  rI  rä  r   )r›  rF  rä  rF  )rä  r`   )rä  zModelProfile | None©rä  rI  )rÜ  zlist[dict | None]rä  r©   )rä  r©   rî  r»   rï  údict | Nonerä  zChatGenerationChunk | None)rä  ÚNone)NN)
r	  úlist[BaseMessage]rv  r{  r
  úCallbackManagerForLLMRun | Noner  r   rä  úIterator[ChatGenerationChunk])
r	  rè  rv  r{  r
  ú$AsyncCallbackManagerForLLMRun | Noner  r   rä  ú"AsyncIterator[ChatGenerationChunk]r�   )rW  rV  r  r   rä  r`  )r	  rè  rv  r{  r
  ré  rW  rV  r  r   rä  rê  )
r	  rè  rv  r{  r
  ré  r  r   rä  rE   ©r  r©   rä  r`  ©rD  r!   rv  r{  r  r   rä  r©   )r  zdict | openai.BaseModelr.  ræ  rä  rE   )r	  rè  rv  r{  r
  rë  rW  rV  r  r   rä  rì  )
r	  rè  rv  r{  r
  rë  r  r   rä  rE   )rv  r{  r  r   rä  rI  )rv  r{  r  r   rä  r$   )rä  ztuple[str, tiktoken.Encoding])r¼   r¬   rä  z	list[int])r	  úSequence[BaseMessage]ra  z<Sequence[dict[str, Any] | type | Callable | BaseTool] | Noner‹  r`  rä  ró   )ra  z5Sequence[dict[str, Any] | type | Callable | BaseTool]r¡  zdict | str | bool | Noner¢  rV  r£  rV  rù  ú_DictOrPydanticClass | Noner  r   rä  z'Runnable[LanguageModelInput, AIMessage]©rü  rð  r·  z7Literal['function_calling', 'json_mode', 'json_schema']r¸  r`  r¢  rV  ra  zlist | Noner  r   rä  z-Runnable[LanguageModelInput, _DictOrPydantic])r  r   rä  rI  )rß  zopenai.BaseModelrä  rD   )arþ   rÿ   r   r  r  r[   r>  Ú__annotations__r?  r@  rA  r…   rG  r©   rJ  rL  rO  rQ  rX   rS  rU  rW  rY  rZ  r[  r\  r]  r^  r_  ra  rb  rc  rd  re  rg  rh  ri  rj  rk  rl  rm  rn  rt  rv  rw  rx  ry  rz  r|  r}  r~  r  r€  r�  r‚  r„  rZ   Úmodel_configÚpropertyrŠ  rC  r_   Úclassmethodr•  r^   r�  r¨  r¬  rÎ  rÑ  r×  rß  ró  rö  r  r  r  r+  r8  r0  r   r4  rX  r[  r^  rd  rr  ru  r  r†  r–  r³  rÙ  rË  r'  r  Ú__classcell__©r%  s   @r}   r<  r<  Ë  sÁ  ø‡ ññ  ¨dÑ3€FˆCÓ3á d°DÑ9€L�#Ó9á T°4Ñ8€K�Ó8á"¨4¸Ñ>Ð�sÓ>á O¸7ÑC€J�ÓCØà $€K�Ó$Ø+á#(¸Ñ#>€L�.Ó>ØVñ 	�I tÑ,ð ØKó-ð/ñb #(°¸JÑ"G€O�ZÓGðñ ',°DÀÑ&OÐ˜ÓOØNñ  %Ù  ¸Ñ>ñ €L�*ó ñ AFØ˜IñA€OÐ=ó ðð
 !%€L�+Ó$ðð  #€K�Ó"Ø<à%)Ð�lÓ)Ø$à&*Ð�|Ó*Ø;à€Dˆ*ÓØà €HˆkÓ Ø%à#€L�*Ó#ðð )-€JÐ%Ó,ØPà€IˆtÓØ/à€A€zÓØAà€Eˆ<ÓØDá"¨4Ñ0€J�
Ó0Ø/à#'Ð�jÓ'ðð< (,€IÐ$Ó+ðð !€IˆzÓ ðð '+Ð˜Ó*ðð 15€OÐ-Ó4à15€MÐ.Ó5ñ $¨D¸$Ñ?€K�Ó?ðñ %*°$ÀÑ$EÐ�zÓEðñ BGØ˜dñBÐÐ>ó ð<ñ| */ñ
ð ñ	*Ð˜,ó ð"ñH $)°Ð=MÑ#N€DÐ
 ÓNØ!à+/€JÐ(Ó/ðð( &+Ð˜dÓ*ðñ .3¸4Ñ-@€OÐ*Ó@ðð  7;ÐÐ3Ó:ðð !%€GÐÓ$ðð 37ÐÐ/Ó6ðð
  $€L�*Ó#ðð €Eˆ;Óðð "€J�
Ó!ðð &+Ð˜dÓ*ðð< &*Ð�{Ó)ðñ "'Ù Ð!4¸dÑCñ"€N�Jó ðñ" ¨tÑ4€Làó
ó ð
ð óó ðñ ˜(Ñ#ØóEó ó $ðEñ
 Ð+°'Ñ:Øóó ó ;ðñ& ˜(Ñ#Øóó ó $ðñ< ˜'Ñ"óó #ðñ ˜'Ñ"óMó #ðMô^Cð ó
ó ð
ôBð2E
àðE
ð "ðE
ð *ð	E
ð
 
$ôE
ôN"ð "&Ø7;ð	A(à#ðA(ð ðA(ð 5ð	A(ð
 ðA(ð 
'õA(ðL "&Ø<@ð	H(à#ðH(ð ðH(ð :ð	H(ð
 ðH(ð 
,õH(ðV +/ð*Ø'ð*Ø:=ð*à	õ*ð, "&Ø7;ð	K#ð %)ñK#à#ðK#ð ðK#ð 5ð	K#ð "ðK#ð ðK#ð 
'öK#ð` "&Ø7;ð	FCà#ðFCð ðFCð 5ð	FCð
 ðFCð 
õFCôP+ð& "&ñ	à"ðð ð	ð
 ðð 
õðD (,ð_Jà)ð_Jð %ð_Jð 
õ	_JðH "&Ø<@ð	P#ð %)ñP#à#ðP#ð ðP#ð :ð	P#ð "ðP#ð ðP#ð 
,öP#ðj "&Ø<@ð	K
à#ðK
ð ðK
ð :ð	K
ð
 ðK
ð 
õK
ðZ óGó ðGð
 (,ðØ$ðØ7:ðà	÷ð ð< (,ðØ$ðØ7:ðà	õð& óó ðô÷ +ð OSðbð
 '+ñbà'ðbð Lðbð
  $ðbð 
÷bñ bðP 15Ø"Ø+/Ø7;ñk=àDðk=ð .ð	k=ð
 ðk=ð )ðk=ð 5ðk=ð ðk=ð 
1÷k=ð k=ð^ /3ðF#ð Ø!Ø"Ø!ñF#à+ðF#ð
ð	F#ð ðF#ð ðF#ð ðF#ð ðF#ð 
7öF#ôPð
Ø*ð
à	÷
ò 
r   r<  c                  ó6  ^ • \ rS rSr% Sr\" SSS9rS\S'    \SS j5       r	\
SS	 j5       r\SS
 j5       r\
SS j5       r\SU 4S jj5       rSS.       SU 4S jjjrSU 4S jjr      SU 4S jjr SSSSSS.             SU 4S jjjjrSrU =r$ )Ú
ChatOpenAIi  u§k  Interface to OpenAI chat model APIs.

!!! warning "API scope"

    `ChatOpenAI` targets
    [official OpenAI API specifications](https://github.com/openai/openai-openapi)
    only. Non-standard response fields added by third-party providers (e.g.,
    `reasoning_content`, `reasoning_details`) are **not** extracted or
    preserved. If you are pointing `base_url` at a provider such as
    OpenRouter, vLLM, or DeepSeek, use the corresponding provider-specific
    LangChain package instead (e.g., `ChatDeepSeek`, `ChatOpenRouter`).

???+ info "Setup"

    Install `langchain-openai` and set environment variable `OPENAI_API_KEY`.

    ```bash
    pip install -U langchain-openai

    # or using uv
    uv add langchain-openai
    ```

    ```bash
    export OPENAI_API_KEY="your-api-key"
    ```

??? info "Key init args â€” completion params"

    | Param               | Type          | Description                                                                                                 |
    | ------------------- | ------------- | ----------------------------------------------------------------------------------------------------------- |
    | `model`             | `str`         | Name of OpenAI model to use.                                                                                |
    | `temperature`       | `float`       | Sampling temperature.                                                                                       |
    | `max_tokens`        | `int | None`  | Max number of tokens to generate.                                                                           |
    | `logprobs`          | `bool | None` | Whether to return logprobs.                                                                                 |
    | `stream_options`    | `dict`        | Configure streaming outputs, like whether to return token usage when streaming (`{"include_usage": True}`). |
    | `use_responses_api` | `bool | None` | Whether to use the responses API.                                                                           |

    See full list of supported init args and their descriptions below.

??? info "Key init args â€” client params"

    | Param          | Type                                       | Description                                                                         |
    | -------------- | ------------------------------------------ | ----------------------------------------------------------------------------------- |
    | `timeout`      | `float | Tuple[float, float] | Any | None` | Timeout for requests.                                                               |
    | `max_retries`  | `int | None`                               | Max number of retries.                                                              |
    | `api_key`      | `str | None`                               | OpenAI API key. If not passed in will be read from env var `OPENAI_API_KEY`.        |
    | `base_url`     | `str | None`                               | Base URL for API requests. Only specify if using a proxy or service emulator. Falls back to env var `OPENAI_API_BASE`, then to `OPENAI_BASE_URL` (read by the underlying SDK client). |
    | `organization` | `str | None`                               | OpenAI organization ID. If not passed in will be read from env var `OPENAI_ORG_ID`. |

    See full list of supported init args and their descriptions below.

??? info "Instantiate"

    Create a model instance with desired params. For example:

    ```python
    from langchain_openai import ChatOpenAI

    model = ChatOpenAI(
        model="...",
        temperature=0,
        max_tokens=None,
        timeout=None,
        max_retries=2,
        # api_key="...",
        # base_url="...",
        # organization="...",
        # other params...
    )
    ```

    See all available params below.

    !!! tip "Preserved params"
        Any param which is not explicitly supported will be passed directly to
        [`openai.OpenAI.chat.completions.create(...)`](https://platform.openai.com/docs/api-reference/chat/create)
        every time to the model is invoked. For example:

        ```python
        from langchain_openai import ChatOpenAI
        import openai

        ChatOpenAI(..., frequency_penalty=0.2).invoke(...)

        # Results in underlying API call of:

        openai.OpenAI(..).chat.completions.create(..., frequency_penalty=0.2)

        # Which is also equivalent to:

        ChatOpenAI(...).invoke(..., frequency_penalty=0.2)
        ```

??? info "Invoke"

    Generate a response from the model:

    ```python
    messages = [
        (
            "system",
            "You are a helpful translator. Translate the user sentence to French.",
        ),
        ("human", "I love programming."),
    ]
    model.invoke(messages)
    ```

    Results in an `AIMessage` response:

    ```python
    AIMessage(
        content="J'adore la programmation.",
        response_metadata={
            "token_usage": {
                "completion_tokens": 5,
                "prompt_tokens": 31,
                "total_tokens": 36,
            },
            "model_name": "gpt-4.1-mini",
            "system_fingerprint": "fp_43dfabdef1",
            "finish_reason": "stop",
            "logprobs": None,
        },
        id="run-012cffe2-5d3d-424d-83b5-51c6d4a593d1-0",
        usage_metadata={"input_tokens": 31, "output_tokens": 5, "total_tokens": 36},
    )
    ```

??? info "Stream"

    Stream a response from the model:

    ```python
    for chunk in model.stream(messages):
        print(chunk.text, end="")
    ```

    Results in a sequence of `AIMessageChunk` objects with partial content:

    ```python
    AIMessageChunk(content="", id="run-9e1517e3-12bf-48f2-bb1b-2e824f7cd7b0")
    AIMessageChunk(content="J", id="run-9e1517e3-12bf-48f2-bb1b-2e824f7cd7b0")
    AIMessageChunk(content="'adore", id="run-9e1517e3-12bf-48f2-bb1b-2e824f7cd7b0")
    AIMessageChunk(content=" la", id="run-9e1517e3-12bf-48f2-bb1b-2e824f7cd7b0")
    AIMessageChunk(
        content=" programmation", id="run-9e1517e3-12bf-48f2-bb1b-2e824f7cd7b0"
    )
    AIMessageChunk(content=".", id="run-9e1517e3-12bf-48f2-bb1b-2e824f7cd7b0")
    AIMessageChunk(
        content="",
        response_metadata={"finish_reason": "stop"},
        id="run-9e1517e3-12bf-48f2-bb1b-2e824f7cd7b0",
    )
    ```

    To collect the full message, you can concatenate the chunks:

    ```python
    stream = model.stream(messages)
    full = next(stream)
    for chunk in stream:
        full += chunk
    ```

    ```python
    full = AIMessageChunk(
        content="J'adore la programmation.",
        response_metadata={"finish_reason": "stop"},
        id="run-bf917526-7f58-4683-84f7-36a6b671d140",
    )
    ```

??? info "Async"

    Asynchronous equivalents of `invoke`, `stream`, and `batch` are also available:

    ```python
    # Invoke
    await model.ainvoke(messages)

    # Stream
    async for chunk in (await model.astream(messages))

    # Batch
    await model.abatch([messages])
    ```

    Results in an `AIMessage` response:

    ```python
    AIMessage(
        content="J'adore la programmation.",
        response_metadata={
            "token_usage": {
                "completion_tokens": 5,
                "prompt_tokens": 31,
                "total_tokens": 36,
            },
            "model_name": "gpt-4.1-mini",
            "system_fingerprint": "fp_43dfabdef1",
            "finish_reason": "stop",
            "logprobs": None,
        },
        id="run-012cffe2-5d3d-424d-83b5-51c6d4a593d1-0",
        usage_metadata={
            "input_tokens": 31,
            "output_tokens": 5,
            "total_tokens": 36,
        },
    )
    ```

    For batched calls, results in a `list[AIMessage]`.

??? info "Tool calling"

    ```python
    from pydantic import BaseModel, Field


    class GetWeather(BaseModel):
        '''Get the current weather in a given location'''

        location: str = Field(
            ..., description="The city and state, e.g. San Francisco, CA"
        )


    class GetPopulation(BaseModel):
        '''Get the current population in a given location'''

        location: str = Field(
            ..., description="The city and state, e.g. San Francisco, CA"
        )


    model_with_tools = model.bind_tools(
        [GetWeather, GetPopulation]
        # strict = True  # Enforce tool args schema is respected
    )
    ai_msg = model_with_tools.invoke(
        "Which city is hotter today and which is bigger: LA or NY?"
    )
    ai_msg.tool_calls
    ```

    ```python
    [
        {
            "name": "GetWeather",
            "args": {"location": "Los Angeles, CA"},
            "id": "call_6XswGD5Pqk8Tt5atYr7tfenU",
        },
        {
            "name": "GetWeather",
            "args": {"location": "New York, NY"},
            "id": "call_ZVL15vA8Y7kXqOy3dtmQgeCi",
        },
        {
            "name": "GetPopulation",
            "args": {"location": "Los Angeles, CA"},
            "id": "call_49CFW8zqC9W7mh7hbMLSIrXw",
        },
        {
            "name": "GetPopulation",
            "args": {"location": "New York, NY"},
            "id": "call_6ghfKxV264jEfe1mRIkS3PE7",
        },
    ]
    ```

    !!! note "Parallel tool calls"
        [`openai >= 1.32`](https://pypi.org/project/openai/) supports a
        `parallel_tool_calls` parameter that defaults to `True`. This parameter can
        be set to `False` to disable parallel tool calls:

        ```python
        ai_msg = model_with_tools.invoke(
            "What is the weather in LA and NY?", parallel_tool_calls=False
        )
        ai_msg.tool_calls
        ```

        ```python
        [
            {
                "name": "GetWeather",
                "args": {"location": "Los Angeles, CA"},
                "id": "call_4OoY0ZR99iEvC7fevsH8Uhtz",
            }
        ]
        ```

    Like other runtime parameters, `parallel_tool_calls` can be bound to a model
    using `model.bind(parallel_tool_calls=False)` or during instantiation by
    setting `model_kwargs`.

    See `bind_tools` for more.

??? info "Built-in (server-side) tools"

    You can access [built-in tools](https://platform.openai.com/docs/guides/tools?api-mode=responses)
    supported by the OpenAI Responses API. See [LangChain docs](https://docs.langchain.com/oss/python/integrations/chat/openai#responses-api)
    for more detail.

    ```python
    from langchain_openai import ChatOpenAI

    model = ChatOpenAI(model="...", output_version="responses/v1")

    tool = {"type": "web_search"}
    model_with_tools = model.bind_tools([tool])

    response = model_with_tools.invoke("What was a positive news story from today?")
    response.content
    ```

    ```python
    [
        {
            "type": "text",
            "text": "Today, a heartwarming story emerged from ...",
            "annotations": [
                {
                    "end_index": 778,
                    "start_index": 682,
                    "title": "Title of story",
                    "type": "url_citation",
                    "url": "<url of story>",
                }
            ],
        }
    ]
    ```

    !!! version-added "Added in `langchain-openai` 0.3.9"

    !!! version-added "Added in `langchain-openai` 0.3.26: Updated `AIMessage` format"
        [`langchain-openai >= 0.3.26`](https://pypi.org/project/langchain-openai/#history)
        allows users to opt-in to an updated `AIMessage` format when using the
        Responses API. Setting `ChatOpenAI(..., output_version="responses/v1")` will
        format output from reasoning summaries, built-in tool invocations, and other
        response items into the message's `content` field, rather than
        `additional_kwargs`. We recommend this format for new applications.

??? info "Managing conversation state"

    OpenAI's Responses API supports management of [conversation state](https://platform.openai.com/docs/guides/conversation-state?api-mode=responses).
    Passing in response IDs from previous messages will continue a conversational
    thread.

    ```python
    from langchain_openai import ChatOpenAI

    model = ChatOpenAI(
        model="...",
        use_responses_api=True,
        output_version="responses/v1",
    )
    response = model.invoke("Hi, I'm Bob.")
    response.text
    ```

    ```txt
    "Hi Bob! How can I assist you today?"
    ```

    ```python
    second_response = model.invoke(
        "What is my name?",
        previous_response_id=response.response_metadata["id"],
    )
    second_response.text
    ```

    ```txt
    "Your name is Bob. How can I help you today, Bob?"
    ```

    !!! version-added "Added in `langchain-openai` 0.3.9"

    !!! version-added "Added in `langchain-openai` 0.3.26"

        You can also initialize `ChatOpenAI` with `use_previous_response_id`.
        Input messages up to the most recent response will then be dropped from request
        payloads, and `previous_response_id` will be set using the ID of the most
        recent response.

        ```python
        model = ChatOpenAI(model="...", use_previous_response_id=True)
        ```

    !!! note "OpenAI-compatible endpoints"

        Some OpenAI-compatible providers/proxies may not support forwarding
        reasoning blocks in request history. If you see request-format
        errors while using reasoning + Responses API, prefer
        `use_previous_response_id=True` (so the server keeps
        conversation state).

??? info "Reasoning output"

    OpenAI's Responses API supports [reasoning models](https://platform.openai.com/docs/guides/reasoning?api-mode=responses)
    that expose a summary of internal reasoning processes.

    ```python
    from langchain_openai import ChatOpenAI

    reasoning = {
        "effort": "medium",  # 'low', 'medium', or 'high'
        "summary": "auto",  # 'detailed', 'auto', or None
    }

    model = ChatOpenAI(
        model="...", reasoning=reasoning, output_version="responses/v1"
    )
    response = model.invoke("What is 3^3?")

    # Response text
    print(f"Output: {response.text}")

    # Reasoning summaries
    for block in response.content:
        if block["type"] == "reasoning":
            for summary in block["summary"]:
                print(summary["text"])
    ```

    ```txt
    Output: 3Â³ = 27
    Reasoning: The user wants to know...
    ```

    !!! version-added "Added in `langchain-openai` 0.3.26: Updated `AIMessage` format"
        [`langchain-openai >= 0.3.26`](https://pypi.org/project/langchain-openai/#history)
        allows users to opt-in to an updated `AIMessage` format when using the
        Responses API. Setting `ChatOpenAI(..., output_version="responses/v1")` will
        format output from reasoning summaries, built-in tool invocations, and other
        response items into the message's `content` field, rather than
        `additional_kwargs`. We recommend this format for new applications.

    !!! note "Troubleshooting with non-OpenAI backends"
        When using a non-OpenAI endpoint via `base_url`, request handling for
        reasoning history can differ. If agent loops fail after tool calls, use:
        `ChatOpenAI(..., use_responses_api=True, use_previous_response_id=True)`.

??? info "Structured output"

    ```python
    from pydantic import BaseModel, Field


    class Joke(BaseModel):
        '''Joke to tell user.'''

        setup: str = Field(description="The setup of the joke")
        punchline: str = Field(description="The punchline to the joke")
        rating: int | None = Field(
            description="How funny the joke is, from 1 to 10"
        )


    structured_model = model.with_structured_output(Joke)
    structured_model.invoke("Tell me a joke about cats")
    ```

    ```python
    Joke(
        setup="Why was the cat sitting on the computer?",
        punchline="To keep an eye on the mouse!",
        rating=None,
    )
    ```

    See `with_structured_output` for more info.

??? info "JSON mode"

    ```python
    json_model = model.bind(response_format={"type": "json_object"})
    ai_msg = json_model.invoke(
        "Return a JSON object with key 'random_ints' and a value of 10 random ints in [0-99]"
    )
    ai_msg.content
    ```

    ```txt
    '\\n{\\n  "random_ints": [23, 87, 45, 12, 78, 34, 56, 90, 11, 67]\\n}'
    ```

??? info "Image input"

    ```python
    import base64
    import httpx
    from langchain.messages import HumanMessage

    image_url = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"
    image_data = base64.b64encode(httpx.get(image_url).content).decode("utf-8")
    message = HumanMessage(
        content=[
            {"type": "text", "text": "describe the weather in this image"},
            {
                "type": "image_url",
                "image_url": {"url": f"data:image/jpeg;base64,{image_data}"},
            },
        ]
    )

    ai_msg = model.invoke([message])
    ai_msg.content
    ```

    ```txt
    "The weather in the image appears to be clear and pleasant. The sky is mostly blue with scattered, light clouds, suggesting a sunny day with minimal cloud cover. There is no indication of rain or strong winds, and the overall scene looks bright and calm. The lush green grass and clear visibility further indicate good weather conditions."
    ```

??? info "Token usage"

    ```python
    ai_msg = model.invoke(messages)
    ai_msg.usage_metadata

    ```txt
    {"input_tokens": 28, "output_tokens": 5, "total_tokens": 33}
    ```

    When streaming, set the `stream_usage` kwarg:

    ```python
    stream = model.stream(messages, stream_usage=True)
    full = next(stream)
    for chunk in stream:
        full += chunk
    full.usage_metadata
    ```

    ```txt
    {"input_tokens": 28, "output_tokens": 5, "total_tokens": 33}
    ```

??? info "Logprobs"

    ```python
    logprobs_model = model.bind(logprobs=True)
    ai_msg = logprobs_model.invoke(messages)
    ai_msg.response_metadata["logprobs"]
    ```

    ```txt
    {
        "content": [
            {
                "token": "J",
                "bytes": [74],
                "logprob": -4.9617593e-06,
                "top_logprobs": [],
            },
            {
                "token": "'adore",
                "bytes": [39, 97, 100, 111, 114, 101],
                "logprob": -0.25202933,
                "top_logprobs": [],
            },
            {
                "token": " la",
                "bytes": [32, 108, 97],
                "logprob": -0.20141791,
                "top_logprobs": [],
            },
            {
                "token": " programmation",
                "bytes": [
                    32,
                    112,
                    114,
                    111,
                    103,
                    114,
                    97,
                    109,
                    109,
                    97,
                    116,
                    105,
                    111,
                    110,
                ],
                "logprob": -1.9361265e-07,
                "top_logprobs": [],
            },
            {
                "token": ".",
                "bytes": [46],
                "logprob": -1.2233183e-05,
                "top_logprobs": [],
            },
        ]
    }
    ```

??? info "Response metadata"

    ```python
    ai_msg = model.invoke(messages)
    ai_msg.response_metadata
    ```

    ```txt
    {
        "token_usage": {
            "completion_tokens": 5,
            "prompt_tokens": 28,
            "total_tokens": 33,
        },
        "model_name": "gpt-4.1-mini",
        "system_fingerprint": "fp_319be4768e",
        "finish_reason": "stop",
        "logprobs": None,
    }
    ```

??? info "Flex processing"

    OpenAI offers a variety of [service tiers](https://platform.openai.com/docs/guides/flex-processing?api-mode=responses).
    The "flex" tier offers cheaper pricing for requests, with the trade-off that
    responses may take longer and resources might not always be available.
    This approach is best suited for non-critical tasks, including model testing,
    data enhancement, or jobs that can be run asynchronously.

    To use it, initialize the model with `service_tier="flex"`:

    ```python
    from langchain_openai import ChatOpenAI

    model = ChatOpenAI(model="...", service_tier="flex")
    ```

    Note that this is a beta feature that is only available for a subset of models.
    See OpenAI [flex processing docs](https://platform.openai.com/docs/guides/flex-processing?api-mode=responses)
    for more detail.

??? info "OpenAI-compatible APIs"

    `ChatOpenAI` can be used with OpenAI-compatible APIs like
    [LM Studio](https://lmstudio.ai/), [vLLM](https://github.com/vllm-project/vllm),
    [Ollama](https://ollama.com/), and others.

    To use custom parameters specific to these providers, use the `extra_body` parameter.

    !!! example "LM Studio example with TTL (auto-eviction)"

        ```python
        from langchain_openai import ChatOpenAI

        model = ChatOpenAI(
            base_url="http://localhost:1234/v1",
            api_key="lm-studio",  # Can be any string
            model="mlx-community/QwQ-32B-4bit",
            temperature=0,
            extra_body={
                "ttl": 300
            },  # Auto-evict model after 5 minutes of inactivity
        )
        ```

    !!! example "vLLM example with custom parameters"

        ```python
        model = ChatOpenAI(
            base_url="http://localhost:8000/v1",
            api_key="EMPTY",
            model="meta-llama/Llama-2-7b-chat-hf",
            extra_body={"use_beam_search": True, "best_of": 4},
        )
        ```

    !!! warning "Model name can trigger Responses API routing"

        The choice between the Chat Completions API (`/v1/chat/completions`)
        and the Responses API (`/v1/responses`) is inferred in part from the
        model name, independent of `base_url`.

        `use_responses_api` should generally be set explicitly to avoid ambiguity,
        especially when using OpenAI-compatible providers:

        ```python
        model = ChatOpenAI(
            base_url="http://localhost:8000/v1",
            api_key="EMPTY",
            model="codex-7b-instruct",
            use_responses_api=False,
        )
        ```

??? info "`model_kwargs` vs `extra_body`"

    Use the correct parameter for different types of API arguments:

    **Use `model_kwargs` for:**

    - Standard OpenAI API parameters not explicitly defined as class parameters
    - Parameters that should be flattened into the top-level request payload
    - Examples: `max_completion_tokens`, `stream_options`, `modalities`, `audio`

    ```python
    # Standard OpenAI parameters
    model = ChatOpenAI(
        model="...",
        model_kwargs={
            "stream_options": {"include_usage": True},
            "max_completion_tokens": 300,
            "modalities": ["text", "audio"],
            "audio": {"voice": "alloy", "format": "wav"},
        },
    )
    ```

    **Use `extra_body` for:**

    - Custom parameters specific to OpenAI-compatible providers (vLLM, LM Studio,
        OpenRouter, etc.)
    - Parameters that need to be nested under `extra_body` in the request
    - Any non-standard OpenAI API parameters

    ```python
    # Custom provider parameters
    model = ChatOpenAI(
        base_url="http://localhost:8000/v1",
        model="custom-model",
        extra_body={
            "use_beam_search": True,  # vLLM parameter
            "best_of": 4,  # vLLM parameter
            "ttl": 300,  # LM Studio parameter
        },
    )
    ```

    **Key Differences:**

    - `model_kwargs`: Parameters are **merged into top-level** request payload
    - `extra_body`: Parameters are **nested under `extra_body`** key in request

    !!! warning
        Always use `extra_body` for custom parameters, **not** `model_kwargs`.
        Using `model_kwargs` for non-OpenAI parameters will cause API errors.

??? info "Prompt caching optimization"

    OpenAI prompt caching is automatic for eligible prompts. For high-volume
    applications with repetitive prompts, use `prompt_cache_key`
    per invocation to improve cache hit rates and reduce costs:

    ```python
    model = ChatOpenAI(model="...")

    response = model.invoke(
        messages,
        prompt_cache_key="example-key-a",  # Routes to same machine for cache hits
    )

    customer_response = model.invoke(messages, prompt_cache_key="example-key-b")
    support_response = model.invoke(messages, prompt_cache_key="example-key-c")

    # Dynamic cache keys based on context
    cache_key = f"example-key-{dynamic_suffix}"
    response = model.invoke(messages, prompt_cache_key=cache_key)
    ```

    The default `"implicit"` mode keeps OpenAI's automatic breakpoint and
    also uses explicit breakpoints. The `"explicit"` mode uses only the
    breakpoints you provide.

    For models that support explicit cache breakpoints, pass
    request-level cache options and mark supported content blocks
    with `prompt_cache_breakpoint`:

    ```python
    model = ChatOpenAI(model="gpt-5.6-sol")
    response = model.invoke(
        [
            {
                "role": "system",
                "content": [
                    {
                        "type": "text",
                        "text": "Stable instructions and examples...",
                        "prompt_cache_breakpoint": {"mode": "explicit"},
                    }
                ],
            },
            {"role": "user", "content": "Current request"},
        ],
        prompt_cache_key="tenant:acme:support-v1",
        prompt_cache_options={"mode": "explicit", "ttl": "30m"},
    )
    ```

    Set `prompt_cache_options` per invocation, as above, or persist it on
    the model:

    ```python
    model = ChatOpenAI(
        model="gpt-5.6-sol",
        prompt_cache_options={"mode": "explicit", "ttl": "30m"},
    )
    ```

    `prompt_cache_options["mode"]` can be `"implicit"` or `"explicit"`.
    OpenAI limits how many breakpoints can write to the cache in a single
    request. In `"implicit"` mode, the implicit breakpoint on the latest
    message uses one write slot, so up to three explicit breakpoints can
    write. In `"explicit"` mode, up to four explicit breakpoints can write.
    For reads, OpenAI considers up to the latest 50 breakpoints.

    For models before the GPT-5.6 family that support legacy prompt cache
    retention, pass `prompt_cache_retention`. See OpenAI's
    [prompt caching docs](https://platform.openai.com/docs/guides/prompt-caching)
    for the current model support list and retention semantics.

    ```python
    response = model.invoke(messages, prompt_cache_retention="24h")
    ```

    Cache keys help ensure requests with the same prompt prefix are routed
    to machines with existing cache, providing cost reduction and
    latency improvement on cached tokens. Cache reads are available as
    `response.usage_metadata["input_token_details"]["cache_read"]`; cache
    writes are available as `"cache_creation"` when the OpenAI response
    includes `cache_write_tokens`. On the `"priority"` and `"flex"`
    service tiers these keys are prefixed with the tier name
    (e.g. `"priority_cache_read"`).
Nrn  rD  rX  rd  c                ó
   • SS0$ )z(Mapping of secret environment variables.rL  r²  rü   r�  s    r}   Ú
lc_secretsÚChatOpenAI.lc_secretsO  s   € ð !Ð"2Ð3Ð3r   c                ó
   • / SQ$ )zbGet the namespace of the LangChain object.

Returns:
    `["langchain", "chat_models", "openai"]`
)Ú	langchainÚchat_modelsr!  rü   ©r’  s    r}   Úget_lc_namespaceÚChatOpenAI.get_lc_namespaceT  s
   € ò 6Ð5r   c                óÊ   • 0 nU R                   (       a  U R                   US'   U R                  (       a  U R                  US'   U R                  (       a  U R                  US'   U$ )z+Get the attributes of the langchain object.rQ  rO  rS  )rQ  rO  rS  )r‰  Ú
attributess     r}   Úlc_attributesÚChatOpenAI.lc_attributes]  s\   € ð &(ˆ
à×#×#Ø04×0HÑ0HˆJÐ,Ñ-à××Ø,0×,@Ñ,@ˆJÐ(Ñ)à××Ø)-×):Ñ):ˆJ�~Ñ&àÐr   c                ó   • g)z9Return whether this model can be serialized by LangChain.Trü   r   s    r}   Úis_lc_serializableÚChatOpenAI.is_lc_serializablem  s   € ð r   c                óP   >• [         TU ]  nSU;   a  UR                  S5      US'   U$ )rÔ  rd  rn  )rc  r×  r¦  )r‰  re  r%  s     €r}   r×  ÚChatOpenAI._default_paramsr  s0   ø€ ô ‘Ñ(ˆØ˜6Ó!Ø.4¯j©j¸Ó.FˆFÐ*Ñ+àˆr   r=  c               ó"  >• [         TU ]  " U4SU0UD6nSU;   a  UR                  S5      US'   U R                  (       aO  [        R
                  " SU R                  5      (       a)  UR                  S/ 5       H  nUS   S:X  d  M  SUS'   M     U$ )	Nrv  rd  rn  z^o\dr	  r”   r¡   r¢   )rc  r   r¦  r…   ÚreÚmatchrƒ   )r‰  rD  rv  r  r  rÞ   r%  s         €r}   r   ÚChatOpenAI._get_request_payload{  sŠ   ø€ ô ‘'Ò.¨vÑK¸DÐKÀFÑKˆð ˜7Ó"Ø/6¯{©{¸<Ó/HˆGÐ+Ñ,ð �?�?œrŸxšx¨°·±×AÑAØ"Ÿ;™; z°2Ö6�Ø˜6‘? hÕ.Ø&1�G˜F“Oñ 7ð ˆr   c                óŒ   >• U R                  0 UEU R                  E5      (       a  [        TU ]  " U0 UD6$ [        TU ]  " U0 UD6$ )ú+Route to Chat Completions or Responses API.)r0  rJ  rc  r  r+  )r‰  rì   r  r%  s      €r}   r+  ÚChatOpenAI._stream�  sN   ø€ à×"Ñ"Ð#B fÐ#B°×0AÑ0AÐ#B×CÑCÜ‘7Ò,¨dÐ=°fÑ=Ð=Ü‰wŠ Ð/¨Ñ/Ð/r   c               óä   >#   • U R                  0 UEU R                  E5      (       a   [        TU ]  " U0 UD6  Sh  v•N nU7v •  M  [        TU ]  " U0 UD6  Sh  v•N nU7v •  M   N+
 g N
 g7f)r  N)r0  rJ  rc  r  rX  )r‰  rì   r  rä  r%  s       €r}   rX  ÚChatOpenAI._astream•  sv   øé € ð ×"Ñ"Ð#B fÐ#B°×0AÑ0AÐ#B×CÑCÜ$™wÒ9¸4ÐJÀ6ÒJ÷ �eØ•ä$™wÒ/°Ð@¸Ò@÷ �eØ•ñ	ÑJñÑ@ùsJ   ƒ5A0¸A*¼A(½A*Á A0ÁA.ÁA,ÁA.Á A0Á(A*Á*A0Á,A.Á.A0r©  Fr¶  c               ó0   >• [         TU ]  " U4UUUUS.UD6$ )a®5  Model wrapper that returns outputs formatted to match the given schema.

Args:
    schema: The output schema. Can be passed in as:

        - an OpenAI function/tool schema,
        - a JSON Schema,
        - a `TypedDict` class,
        - or a Pydantic class.

        If `schema` is a Pydantic class then the model output will be a
        Pydantic instance of that class, and the model-generated fields will be
        validated by the Pydantic class. Otherwise the model output will be a
        dict and will not be validated.

        See `langchain_core.utils.function_calling.convert_to_openai_tool` for
        more on how to properly specify types and descriptions of schema fields
        when specifying a Pydantic or `TypedDict` class.

    method: The method for steering model generation, one of:

        - `'json_schema'`:
            Uses OpenAI's [Structured Output API](https://platform.openai.com/docs/guides/structured-outputs).
            See the docs for [supported models](https://platform.openai.com/docs/guides/structured-outputs#supported-models).
        - `'function_calling'`:
            Uses OpenAI's [tool-calling API](https://platform.openai.com/docs/guides/function-calling)
            (formerly called function calling).
        - `'json_mode'`:
            Uses OpenAI's [JSON mode](https://platform.openai.com/docs/guides/structured-outputs#json-mode).
            Note that if using JSON mode then you must include instructions for
            formatting the output into the desired schema into the model call.

        Learn more about the [differences between methods](https://platform.openai.com/docs/guides/structured-outputs#function-calling-vs-response-format).

    include_raw:
        If `False` then only the parsed structured output is returned.

        If an error occurs during model output parsing it will be raised.

        If `True` then both the raw model response (a `BaseMessage`) and the
        parsed model response will be returned.

        If an error occurs during output parsing it will be caught and returned
        as well.

        The final output is always a `dict` with keys `'raw'`, `'parsed'`, and
        `'parsing_error'`.
    strict:

        - `True`:
            Model output is guaranteed to exactly match the schema.
            The input schema will also be validated according to the
            [supported schemas](https://platform.openai.com/docs/guides/structured-outputs#supported-schemas).
        - `False`:
            Input schema will not be validated and model output will not be
            validated.
        - `None`:
            `strict` argument will not be passed to the model.

        If schema is specified via `TypedDict` or JSON schema, `strict` is not
        enabled by default. Pass `strict=True` to enable it.

        !!! note
            `strict` can only be non-null if `method` is `'json_schema'` or `'function_calling'`.
    tools:
        A list of tool-like objects to bind to the chat model. Requires that:

        - `method` is `'json_schema'` (default).
        - `strict=True`
        - `include_raw=True`

        If a model elects to call a
        tool, the resulting `AIMessage` in `'raw'` will include tool calls.

        ??? example

            ```python
            from langchain.chat_models import init_chat_model
            from pydantic import BaseModel


            class ResponseSchema(BaseModel):
                response: str


            def get_weather(location: str) -> str:
                \"\"\"Get weather at a location.\"\"\"
                pass

            model = init_chat_model("openai:gpt-5.5")

            structured_model = model.with_structured_output(
                ResponseSchema,
                tools=[get_weather],
                strict=True,
                include_raw=True,
            )

            structured_model.invoke("What's the weather in Boston?")
            ```

            ```python
            {
                "raw": AIMessage(content="", tool_calls=[...], ...),
                "parsing_error": None,
                "parsed": None,
            }
            ```

    kwargs: Additional keyword args are passed through to the model.

Returns:
    A `Runnable` that takes same inputs as a
        `langchain_core.language_models.chat.BaseChatModel`. If `include_raw` is
        `False` and `schema` is a Pydantic class, `Runnable` outputs an instance
        of `schema` (i.e., a Pydantic object). Otherwise, if `include_raw` is
        `False` then `Runnable` outputs a `dict`.

        If `include_raw` is `True`, then `Runnable` outputs a `dict` with keys:

        - `'raw'`: `BaseMessage`
        - `'parsed'`: `None` if there was a parsing error, otherwise the type
            depends on the `schema` as described above.
        - `'parsing_error'`: `BaseException | None`

!!! warning "Behavior changed in `langchain-openai` 0.3.0"

    `method` default changed from `"function_calling"` to `"json_schema"`.

!!! warning "Behavior changed in `langchain-openai` 0.3.12"

    Support for `tools` added.

!!! warning "Behavior changed in `langchain-openai` 0.3.21"

    Pass `kwargs` through to the model.

??? note "Example: `schema=Pydantic` class, `method='json_schema'`, `include_raw=False`, `strict=True`"

    Note, OpenAI has a number of restrictions on what types of schemas can be
    provided if `strict = True`. When using Pydantic, our model cannot
    specify any Field metadata (like min/max constraints) and fields cannot
    have default values.

    See [all constraints](https://platform.openai.com/docs/guides/structured-outputs#supported-schemas).

    ```python
    from langchain_openai import ChatOpenAI
    from pydantic import BaseModel, Field


    class AnswerWithJustification(BaseModel):
        '''An answer to the user question along with justification for the answer.'''

        answer: str
        justification: str | None = Field(
            default=..., description="A justification for the answer."
        )


    model = ChatOpenAI(model="...", temperature=0)
    structured_model = model.with_structured_output(AnswerWithJustification)

    structured_model.invoke(
        "What weighs more a pound of bricks or a pound of feathers"
    )
    ```

    ```python
    AnswerWithJustification(
        answer="They weigh the same",
        justification="Both a pound of bricks and a pound of feathers weigh one pound. The weight is the same, but the volume or density of the objects may differ.",
    )
    ```

??? note "Example: `schema=Pydantic` class, `method='function_calling'`, `include_raw=False`, `strict=False`"

    ```python
    from langchain_openai import ChatOpenAI
    from pydantic import BaseModel, Field


    class AnswerWithJustification(BaseModel):
        '''An answer to the user question along with justification for the answer.'''

        answer: str
        justification: str | None = Field(
            default=..., description="A justification for the answer."
        )


    model = ChatOpenAI(model="...", temperature=0)
    structured_model = model.with_structured_output(
        AnswerWithJustification, method="function_calling"
    )

    structured_model.invoke(
        "What weighs more a pound of bricks or a pound of feathers"
    )
    ```

    ```python
    AnswerWithJustification(
        answer="They weigh the same",
        justification="Both a pound of bricks and a pound of feathers weigh one pound. The weight is the same, but the volume or density of the objects may differ.",
    )
    ```

??? note "Example: `schema=Pydantic` class, `method='json_schema'`, `include_raw=True`"

    ```python
    from langchain_openai import ChatOpenAI
    from pydantic import BaseModel


    class AnswerWithJustification(BaseModel):
        '''An answer to the user question along with justification for the answer.'''

        answer: str
        justification: str


    model = ChatOpenAI(model="...", temperature=0)
    structured_model = model.with_structured_output(
        AnswerWithJustification, include_raw=True
    )

    structured_model.invoke(
        "What weighs more a pound of bricks or a pound of feathers"
    )
    ```

    ```python
    {
        "raw": AIMessage(
            content="",
            additional_kwargs={
                "tool_calls": [
                    {
                        "id": "call_Ao02pnFYXD6GN1yzc0uXPsvF",
                        "function": {
                            "arguments": '{"answer":"They weigh the same.","justification":"Both a pound of bricks and a pound of feathers weigh one pound. The weight is the same, but the volume or density of the objects may differ."}',
                            "name": "AnswerWithJustification",
                        },
                        "type": "function",
                    }
                ]
            },
        ),
        "parsed": AnswerWithJustification(
            answer="They weigh the same.",
            justification="Both a pound of bricks and a pound of feathers weigh one pound. The weight is the same, but the volume or density of the objects may differ.",
        ),
        "parsing_error": None,
    }
    ```

??? note "Example: `schema=TypedDict` class, `method='json_schema'`, `include_raw=False`, `strict=False`"

    ```python
    from typing_extensions import Annotated, TypedDict

    from langchain_openai import ChatOpenAI


    class AnswerWithJustification(TypedDict):
        '''An answer to the user question along with justification for the answer.'''

        answer: str
        justification: Annotated[
            str | None, None, "A justification for the answer."
        ]


    model = ChatOpenAI(model="...", temperature=0)
    structured_model = model.with_structured_output(AnswerWithJustification)

    structured_model.invoke(
        "What weighs more a pound of bricks or a pound of feathers"
    )
    ```

    ```python
    {
        "answer": "They weigh the same",
        "justification": "Both a pound of bricks and a pound of feathers weigh one pound. The weight is the same, but the volume and density of the two substances differ.",
    }
    ```

??? note "Example: `schema=OpenAI` function schema, `method='json_schema'`, `include_raw=False`"

    ```python
    from langchain_openai import ChatOpenAI

    oai_schema = {
        "name": "AnswerWithJustification",
        "description": "An answer to the user question along with justification for the answer.",
        "parameters": {
            "type": "object",
            "properties": {
                "answer": {"type": "string"},
                "justification": {
                    "description": "A justification for the answer.",
                    "type": "string",
                },
            },
            "required": ["answer"],
        },
    }

    model = ChatOpenAI(model="...", temperature=0)
    structured_model = model.with_structured_output(oai_schema)

    structured_model.invoke(
        "What weighs more a pound of bricks or a pound of feathers"
    )
    ```

    ```python
    {
        "answer": "They weigh the same",
        "justification": "Both a pound of bricks and a pound of feathers weigh one pound. The weight is the same, but the volume and density of the two substances differ.",
    }
    ```

??? note "Example: `schema=Pydantic` class, `method='json_mode'`, `include_raw=True`"

    ```python
    from langchain_openai import ChatOpenAI
    from pydantic import BaseModel


    class AnswerWithJustification(BaseModel):
        answer: str
        justification: str


    model = ChatOpenAI(model="...", temperature=0)
    structured_model = model.with_structured_output(
        AnswerWithJustification, method="json_mode", include_raw=True
    )

    structured_model.invoke(
        "Answer the following question. "
        "Make sure to return a JSON blob with keys 'answer' and 'justification'.\\n\\n"
        "What's heavier a pound of bricks or a pound of feathers?"
    )
    ```

    ```python
    {
        "raw": AIMessage(
            content='{\\n    "answer": "They are both the same weight.",\\n    "justification": "Both a pound of bricks and a pound of feathers weigh one pound. The difference lies in the volume and density of the materials, not the weight." \\n}'
        ),
        "parsed": AnswerWithJustification(
            answer="They are both the same weight.",
            justification="Both a pound of bricks and a pound of feathers weigh one pound. The difference lies in the volume and density of the materials, not the weight.",
        ),
        "parsing_error": None,
    }
    ```

??? note "Example: `schema=None`, `method='json_mode'`, `include_raw=True`"

    ```python
    structured_model = model.with_structured_output(
        method="json_mode", include_raw=True
    )

    structured_model.invoke(
        "Answer the following question. "
        "Make sure to return a JSON blob with keys 'answer' and 'justification'.\\n\\n"
        "What's heavier a pound of bricks or a pound of feathers?"
    )
    ```

    ```python
    {
        "raw": AIMessage(
            content='{\\n    "answer": "They are both the same weight.",\\n    "justification": "Both a pound of bricks and a pound of feathers weigh one pound. The difference lies in the volume and density of the materials, not the weight." \\n}'
        ),
        "parsed": {
            "answer": "They are both the same weight.",
            "justification": "Both a pound of bricks and a pound of feathers weigh one pound. The difference lies in the volume and density of the materials, not the weight.",
        },
        "parsing_error": None,
    }
    ```

r¶  )rc  rÙ  )r‰  rü  r·  r¸  r¢  ra  r  r%  s          €r}   rÙ  Ú!ChatOpenAI.with_structured_output   s6   ø€ ô` ‰wÒ-Øð
àØ#ØØñ
ð ñ
ð 	
r   rü   )rä  zdict[str, str])rä  z	list[str]rå  rã  rî  )rì   r   r  r   rä  rê  )rì   r   r  r   rä  rì  r�   rñ  )rþ   rÿ   r   r  r  r[   rd  rò  rô  rû  rõ  r  r  r  r×  r   r+  rX  rÙ  r  rö  r÷  s   @r}   rù  rù    sM  ø‡ ñBñH #¨4Ð7NÑO€J�
ÓOØ/àó4ó ð4ð ó6ó ð6ð óó ðð óó ðð öó ðð "&ñ	à"ðð ð	ð
 ðð 
÷ð ÷(0ð	Øð	Ø$'ð	à	+÷	ð /3ðW
ð KXØ!Ø"Ø!ñW
à+ðW
ð Hð	W
ð
 ðW
ð ðW
ð ðW
ð ðW
ð 
7÷W
÷ W
r   rù  c                óF   • [        U [        5      =(       a    [        U 5      $ r�   )r¶   r»   rU   )Úobjs    r}   r1  r1  :  s   € Ü�cœ4Ó ×?Ô%:¸3Ó%?Ð?r   c                óL   • SU S   U S   [         R                  " U S   SS9S.S.$ )	Nr¤   r–   r•   rì   F)Úensure_ascii©r•   rê   ©r»   r–   r¤   )ÚjsonÚdumps)râ   s    r}   rÚ   rÚ   >  s6   € àØ˜‰oà˜fÑ%ÜŸš I¨fÑ$5ÀEÑJñ
ñð r   c                ó&   • SU S   U S   U S   S.S.$ )Nr¤   r–   r•   rì   r  r  rü   )Úinvalid_tool_calls    r}   rÛ   rÛ   I  s.   € ð Ø Ñ%à% fÑ-Ø*¨6Ñ2ñ
ñð r   c                ót  •  SSK Jn  [        U 5      (       aç  SS KnSnSn [        5       R                  XS9nUR                  5         UR                  R                  S5      nU(       a&  [        U5      U:”  a  [        R                  SU5        g [        UR                  5      U:”  a  [        R                  SU5        g UR                  [!        UR                  5      5       nUR"                  u  p‰S S S 5        WW	4$ [+        U 5      (       a^  U R-                  SS5      u  p¼[.        R0                  " U5      nUR                  [!        U5      5       nUR"                  u  p‰S S S 5        X‰4$ g ! [         a    [        R	                  S5         g f = f! , (       d  f       N¦= f! UR$                   a    [        R                  S	U5         g UR&                   a   n
[        R                  S
U
5         S n
A
g S n
A
f[(         a   n
[        R                  SU
5         S n
A
g S n
A
ff = f! , (       d  f       WW	4$ = f)Nr   )ÚImagezaUnable to count image tokens. To count image tokens please install `pip install -U pillow httpx`.g      @i   )rT  zcontent-lengthz0Image URL exceeds maximum size limit of %d bytesz,Image URL request timed out after %s secondsz!Image URL returned HTTP error: %sz-Failed to fetch or process image from URL: %sÚ,r¡  )ÚPILr"  ÚImportErrorr™  ÚinfoÚ_is_urlÚhttpxr~   rƒ   Úraise_for_statusr,  ró   rš  rì  r6   Úopenr   ÚsizeÚTimeoutExceptionÚHTTPStatusErrorr«   Ú_is_b64ÚsplitrÏ   Ú	b64decode)Úimage_sourcer"  r(  rT  Úmax_sizer  Úcontent_lengthÚimgÚwidthÚheightr±   rˆ  ÚencodedrÑ   s                 r}   r˜  r˜  V  sð  € ðÝô ˆ|×ÑÛð ˆà#ˆð	Ü,Ó.×2Ñ2°<Ð2ÐQˆHØ×%Ñ%Ô'ð &×-Ñ-×1Ñ1Ð2BÓCˆNÞ¤# nÓ"5¸Ó"@Ü—‘ØFÈôð ô �8×#Ñ#Ó$ xÓ/Ü—‘ØFÈôð à—‘œG H×$4Ñ$4Ó5Ô6¸#Ø #§¡‘�÷ 7à˜&�=Ð ô ˆ|×ÑØ!×'Ñ'¨¨QÓ/‰
ˆÜ×Ò Ó(ˆØ�Z‰Zœ ›Ô&¨#ØŸH™H‰MˆE÷ 'àˆ}ÐØøôk ó Ü�‰ð-ô	
ñ ðú÷D 7Õ6ûð ×%Ñ%ó 	Ü�N‰NÐIÈ7ÔSÙØ×$Ñ$ó 	Ü�N‰NÐ>ÀÔBÜûÜó 	Ü�N‰NÐJÈAÔNÜûð	ú÷ 'Ô&à�fˆ}Ðúsk   ‚E. ¡A.F$ Â/F$ Ã $F$ Ã$FÃ3F$ ÅH&Å.FÆFÆ
F!ÆF$ Æ$&H#ÇH#ÇG6Ç6H#ÈHÈH#È&
H7c                ój   • [        X5      u  p[        US-  5      n[        U S-  5      nSU-  U-  S-   $ )Ni   éª   r”  )Ú_resizer   )r5  r6  ÚhÚws       r}   r™  r™  ‘  s=   € ä˜EÓ*�M€EÜˆV�c‰\Ó€AÜˆU�S‰[Ó€AØ�!‰G�a‰K˜2ÑÐr   c                ó¶   •  [        U 5      n[        UR                  UR                  /5      $ ! [         a   n[
        R                  SU5         S nAgS nAff = f)NzUnable to parse URL: %sF)r   rÁ  ÚschemeÚnetlocr«   r™  Údebug)Úsr6  r±   s      r}   r'  r'  ™  sJ   € ðÜ˜!“ˆÜ�F—M‘M 6§=¡=Ð1Ó2Ð2øÜó Ü�‰Ð.°Ô2Üûðús   ‚+. ®
A¸AÁAc                ó$   • U R                  S5      $ )Nz
data:image)rÖ   )rA  s    r}   r.  r.  ¢  s   € Ø�<‰<˜Ó%Ð%r   c                ó¤   • U S:”  d  US:”  a  X:”  a  US-  U -  nSn O
U S-  U-  n SnU S:”  a"  US:”  a  X:”  a  U S-  U-  n SnX4$ US-  U -  nSn X4$ )Ni   i   rü   )r5  r6  s     r}   r:  r:  ¦  s†   € àˆtƒ|�v “}Ø‹>Ø˜t‘m¨Ñ-ˆFØ‰Eà˜T‘\ fÑ,ˆEØˆFàˆsƒ{�v “|Ø‹>Ø˜S‘[ VÑ+ˆEØˆFð ˆ=Ðð ˜s‘l uÑ,ˆFØˆEØˆ=Ðr   r¥  c               ó�  • [        U [        5      (       a  [        U 5      (       a  U $ [        U [        5      (       a  SU ;   a  U R	                  S5      S:X  a  U nO�[        U [        5      (       a  SU ;   a  SU ;   a  SU S.nOfUcA  [        U [        5      (       a*  [        U R	                  S5      [
        5      (       a  U S   nOSn[        XS9nUR                  S	5      US'   SUS.nUb[  XS   R	                  S5      LaE  [        U [        5      (       a0  SU R	                  S0 5      ;   a  S
U S   S    SU S3n[        U5      eU$ )Nr©  r»   r•   rü  )r»   r©  r¢  Fr¥  Ú
parametersz0Output schema already has 'strict' value set to z: but 'strict' also passed in to with_structured_output as z@. Please make sure that 'strict' is only specified in one place.)	r¶   r»   rU   r©   rƒ   r`  rQ   r¦  rô   )rü  r¢  rù  r¤   rç   s        r}   r­  r­  º  sN  € ô �&œ$×ÑÔ$9¸&×$AÑ$AØˆô 	�6œ4× Ñ Ø˜VÓ#Ø�J‰J�vÓ -Ó/à ‰Ü	�FœD×	!Ñ	! f°Ó&6¸8ÀvÓ;MØ#0ÀÑH‰à‰>Ü˜&¤$×'Ñ'¬J°v·z±zÀ(Ó7KÌT×,RÑ,RØ Ñ)‘à�Ü-¨fÑDˆØ%Ÿ\™\¨,Ó7ˆ�ÑØ#0ÀÑJˆð 	ÑØ¨-Ñ8×<Ñ<¸XÓFÒFÜ�vœt×$Ñ$Ø˜Ÿ
™
 =°"Ó5Ó5ð ?Ø�mÑ$ XÑ.Ð/ð 0)Ø)/¨ð 17ð8ð 	ô ˜‹oÐØÐr   c                óÀ  • U R                   R                  S5      =nb  [        U[        5      (       a  U" S0 UD6$ U$ U R                   R                  S5      (       a  [	        U R                   S   5      e[        S U R                   5       5      (       a'  [        S U R                   5       5      n[	        U5      eU R                  (       a  g SU  3n[        U5      e)NrL  rN  c              3  ó”   #   • U H?  n[        U[        5      =(       a#    UR                  S 5      S:H  =(       a    SUS   ;   v •  MA     g7f©r»   Únon_standardrN  r›  N©r¶   r©   rƒ   ©r·  rÀ   s     r}   r¹  Ú1_oai_structured_outputs_parser.<locals>.<genexpr>ë  sN   é € ð ñ +ˆEô 	�5œ$Ó÷ 	(Ø�I‰I�fÓ Ñ/÷	(à˜˜w™Ñ'ô	(ò +ùs   ‚AAc              3  óŠ   #   • U H:  n[        U[        5      (       d  M  US    S:X  d  M%  SUS   ;   d  M0  US   S   v •  M<     g7frH  ©r¶   r©   rK  s     r}   r¹  rL  ñ  sR   é € ð 
á.�Ü˜%¤×&ó &ð �f‘ Ñ/ó &ð ˜U 7™^Ñ+ó	 &ˆE�'‰N˜9Ö%Ú.ùs   ‚AžA©A´AzdStructured Output response does not have a 'parsed' field nor a 'refusal' field. Received message:

rü   )
rž   rƒ   r¶   r©   ÚOpenAIRefusalErrorr§  Úcontent_blocksÚnextr›   rô   )Úai_msgrü  rL  rN  rç   s        r}   rÌ  rÌ  â  sç   € ð ×*Ñ*×.Ñ.¨xÓ8Ð8ˆÑEÜ�fœd×#Ñ#ÙÑ#˜FÑ#Ð#ØˆØ×Ñ×#Ñ# I×.Ñ.Ü  ×!9Ñ!9¸)Ñ!DÓEÐEÜ
ñ ð ×*Ò*ó	÷ ñ ô ñ 
à×.Ò.ó
ó 
ˆô ! Ó)Ð)Ø××Øð	'Ø'- hð	0ð ô �S‹/Ðr   c                  ó   • \ rS rSrSrSrg)rO  i  a5  Error raised when OpenAI Structured Outputs API returns a refusal.

When using OpenAI's Structured Outputs API with user-generated input, the model
may occasionally refuse to fulfill the request for safety reasons.

See [more on refusals](https://platform.openai.com/docs/guides/structured-outputs/refusals).
rü   Nrý   rü   r   r}   rO  rO    s   † ôr   rO  c                óž  • U R                  S5      nUb  UOSnU R                  S5      nUb  UOSnU R                  S5      nUb  UOX5-   nUS;  a  S nU(       a  U S3OSnU R                  S5      =(       d    0 n	S	U	R                  S
5      U S3U	R                  S5      U S3U	R                  S5      0n
S	U R                  S5      =(       d    0 R                  S
5      U S3U R                  S5      =(       d    0 R                  S5      0nUbF  UU
R                  U S3S5      =(       d    S-
  X¡'   UUR                  U S3S5      =(       d    S-
  X±'   [        UUU[        S0 U
R                  5        VVs0 sH  u  pÍUc  M
  XÍ_M     snnD6[	        S0 UR                  5        VVs0 sH  u  pÍUc  M
  XÍ_M     snnD6S9$ s  snnf s  snnf )NÚprompt_tokensr   Úcompletion_tokensÚtotal_tokens>   ÚflexÚpriorityrˆ  r˜   Úprompt_tokens_detailsr�   Úaudio_tokensÚ
cache_readÚcached_tokensÚcache_creationÚcache_write_tokensÚcompletion_tokens_detailsrg  Úreasoning_tokens©Úinput_tokensÚoutput_tokensrW  Úinput_token_detailsÚoutput_token_detailsrü   ©rƒ   r9   r7   rÜ   r8   )Úoai_token_usager~  Ú_inputrc  Ú_outputrd  Ú_totalrW  Úservice_tier_prefixrZ  re  rf  rã   rä   s                 r}   rë  rë    s(  € ð × Ñ  Ó1€FØ#Ñ/‘6°Q€LØ×!Ñ!Ð"5Ó6€GØ&Ñ2‘G¸€MØ× Ñ  Ó0€FØ#Ñ/‘6°\Ñ5Q€LØÐ/Ó/ØˆÞ0<˜\˜N¨!Ñ,À"ÐØ+×/Ñ/Ð0GÓH×NÈBÐàÐ&×*Ñ*¨>Ó:ØÐ
˜zÐ*Ð,A×,EÑ,EÀoÓ,VØÐ
˜~Ð.Ð0E×0IÑ0IØ ó1
ð!Ðð 	�/×%Ñ%Ð&AÓB×HÀb×MÑMØó
ð Ð
˜yÐ)Ø×ÑÐ ;Ó<×BÀß
‰#Ð Ó
!ð"Ðð Ñð -9Ø×#Ñ#Ð':Ð&;¸:Ð$FÈÓJ×OÈañ-
ÐÑ)ð .;Ø ×$Ñ$Ð(;Ð'<¸IÐ%FÈÓJ×OÈañ.
ÐÑ*ô Ø!Ø#Ø!Ü-ñ 
Ø 3× 9Ñ 9Ô ;ÔMÑ ;™˜¸q‹tˆqŠtÑ ;ÒMñ
ô 0ñ 
Ø 4× :Ñ :Ô <ÔNÑ <™˜À‹tˆqŠtÑ <ÒNñ
ñ
ð 
ùó
 Nùó Os   Å8GÆGÆ)G	Æ5G	c                ó*  • U R                  S5      nUb  UOSnU R                  S5      nUb  UOSnU R                  S5      nUb  UOX5-   nUS;  a  S nU(       a  U S3OSnU S3U R                  S	5      =(       d    0 R                  S
5      0n	U R                  S5      =(       d    0 n
U S3U
R                  S5      U S3U
R                  S5      0nUbF  UU	R                  U S3S5      =(       d    S-
  X‘'   UUR                  U S3S5      =(       d    S-
  X±'   [        UUU[        S0 UR                  5        VVs0 sH  u  pÍUc  M
  XÍ_M     snnD6[	        S0 U	R                  5        VVs0 sH  u  pÍUc  M
  XÍ_M     snnD6S9$ s  snnf s  snnf )Nrc  r   rd  rW  >   rX  rY  rˆ  r˜   rg  Úoutput_tokens_detailsra  Úinput_tokens_detailsr\  r]  r^  r_  rb  rü   rg  )rh  r~  ri  rc  rj  rd  rk  rW  rl  rf  ro  re  rã   rä   s                 r}   Ú _create_usage_metadata_responsesrp  >  sð  € ð × Ñ  Ó0€FØ#Ñ/‘6°Q€LØ×!Ñ! /Ó2€GØ&Ñ2‘G¸€MØ× Ñ  Ó0€FØ#Ñ/‘6°\Ñ5Q€LØÐ/Ó/ØˆÞ0<˜\˜N¨!Ñ,À"ÐàÐ
˜yÐ)Ø×ÑÐ 7Ó8×>¸Bß
‰#Ð Ó
!ð"Ðð
 +×.Ñ.Ð/EÓF×LÈ"ÐàÐ
˜zÐ*Ð,@×,DÑ,DÀ_Ó,UØÐ
˜~Ð.Ð0D×0HÑ0HØ ó1
ð!Ðð Ñð .;Ø ×$Ñ$Ð(;Ð'<¸IÐ%FÈÓJ×OÈañ.
ÐÑ*ð -9Ø×#Ñ#Ð':Ð&;¸:Ð$FÈÓJ×OÈañ-
ÐÑ)ô Ø!Ø#Ø!Ü-ñ 
Ø 3× 9Ñ 9Ô ;ÔMÑ ;™˜¸q‹tˆqŠtÑ ;ÒMñ
ô 0ñ 
Ø 4× :Ñ :Ô <ÔNÑ <™˜À‹tˆqŠtÑ <ÒNñ
ñ
ð 
ùó
 Nùó Os   Ä>F	Å
F	Å/FÅ;Fc                ó*   • SU ;   =(       a    U S   S:g  $ )Nr»   r¤   rü   )r¦   s    r}   Ú_is_builtin_toolrr  l  s   € Ø�T‰>×8˜d 6™l¨jÑ8Ð8r   c                ó’   • SU ;   =(       a    [        S U S    5       5      n1 Skn[        U=(       d    UR                  U 5      5      $ )Nra  c              3  ó6   #   • U H  n[        U5      v •  M     g 7fr�   )rr  )r·  r¦   s     r}   r¹  Ú%_use_responses_api.<locals>.<genexpr>q  s   é € ð 4Ù+; 4Ô˜×ÐÒ+;ùs   ‚>   r¼   r|  rg  r€  rz  r?  )r§  r`  Úintersection)r  Úuses_builtin_toolsÚresponses_only_argss      r}   r0  r0  p  sR   € Ø  GÑ+÷ ´ñ 4Ø+2°7Ò+;ó4ó 1ÐòÐô Ð"×OÐ&9×&FÑ&FÀwÓ&OÓPÐPr   c                ó
  • [        [        U 5      S-
  SS5       Hc  nX   n[        U[        5      (       d  M  UR                  R                  S5      nU(       d  MB  UR                  S5      (       d  MZ  XS-   S U4s  $    U S4$ )a~  Get the last part of the conversation after the last `AIMessage` with an `id`.

Will return:

1. Every message after the most-recent `AIMessage` that has a non-empty
    `response_metadata["id"]` (may be an empty list),
2. That `id`.

If the most-recent `AIMessage` does not have an `id` (or there is no
`AIMessage` at all) the entire conversation is returned together with `None`.
r¡  rú  r–   Úresp_N)Úrangerì  r¶   r%   rí  rƒ   rÖ   )r	  Úirç   Úresponse_ids       r}   rB  rB    s   € ô ”3�x“= 1Ñ$ b¨"Ö-ˆØ‰kˆÜ�cœ9×%Ó%Ø×/Ñ/×3Ñ3°DÓ9ˆKßˆ{˜{×5Ñ5°g×>Ó>Ø A¡ Ð(¨+Ð5Ò5ñ .ð �Tˆ>Ðr   c                óX  • S H  nX!;   d  M
  UR                  U5      US'   M      SU;   a  SU;  a  SUR                  S5      0US'   UR                  SS 5        UR                  S5      =(       d    SnUR                  S	5      (       aE  S
U;  a?  UR                  S5      =(       d    0 R                  S5      S:w  a  UR                  SS 5        [        XR                  S5      S9US'   UR                  SS 5      =n(       a¸  / nU H¬  nUS   S:X  aM  SU;   aG  UR	                  5        VVs0 sH  u  pxUS;  d  M  Xx_M     n	nnUR                  SS0US   EU	E5        MY  US   S:X  a9  SU;   a  Sn
[        U
5      eUR                  S5      (       a  SU;  a	  0 UESS0EnO UR                  U5        M®     XQS'   UR                  SS 5      =n(       a5  [        U[        5      (       a  US   S:X  a  SU;   a  SS0US   EUS'   OX±S'   [        UR                  S5      [        5      (       a  US   R                  5       US'   UR                  SS 5      =n(       Ga  UR                  SS 5      nUR                  S5      (       d  [        U5      (       a  XÁS'   OÇ[        U5      (       a  UR                  5       nSnOUnUSS0:X  a3  SU;   a#  [        US   [        5      (       a  SS0US   S '   OqS SS00US'   Og[        XíS!9=n(       aV  [        U[        5      (       aA  US   S":X  a8  SS"0US"   EnSU;   a!  [        US   [        5      (       a	  UUS   S '   O	S U0US'   O UR                  S#S 5      nUb/  SU;   a"  [        US   [        5      (       a
  UUS   S#'   U$ S#U0US'   U$ s  snnf )$N)rd  rn  Úmax_output_tokensre  rg  r¥  rv  rC  r˜   r¢  r£  r¤  rG  r  ©r  Úinputra  r»   r¤   r¦  rŽ   Úpartial_imagesz—Partial image generation is not yet supported via the LangChain ChatOpenAI client. Please drop the 'partial_images' key from the image_generation tool.rÕ  r¡  r¡  r¼   rù  r¢  Útext_formatTr¾  Úformatr¥  r©  rh  )r¦  rƒ   rÖ   Ú_construct_responses_api_inputrÜ   rª   r—  r¶   r©   r„   r1  Úmodel_json_schemar­  )r	  r  Úlegacy_token_paramrC  ra  Ú	new_toolsr¦   rã   rä   Úextrarç   r¡  rü  r¢  Úschema_dictrù  Úformat_valuerh  s                     r}   rC  rC  ˜  sø  € ó FÐØÕ(Ø+2¯;©;Ð7IÓ+JˆGÐ'Ó(ñ Fð ˜WÓ$¨¸GÓ)CØ (¨'¯+©+Ð6HÓ*IÐJˆ�Ñð ‡K�K�˜Ôð
 �K‰K˜Ó ×& B€Eà×Ñ˜×!Ñ!Ø˜5Ó Ø�[‰[˜Ó%×+¨×0Ñ0°Ó:¸fÓDà�‰�M 4Ô(ä5ØŸ™ GÓ,ñ€GˆGÑð —‘˜G TÓ*Ð*€uÕ*Øˆ	ÛˆDð �F‰|˜zÓ)¨j¸DÓ.@Ø*.¯*©*¬,ÔX©,¡$ !¸!ÐCWÑ:W›˜š©,�ÑXØ× Ñ  &¨*Ð!R¸¸ZÑ8HÐ!RÈEÐ!RÖSà˜‘<Ð#5Ó5à'¨4Ó/ð$ð ô 2°#Ó6Ð6Ø—{‘{ 8×,Ñ,Ð1AÈÓ1Mð  = $Ð<Ð(8¸!Ñ<™àà× Ñ  Ö&ñ1 ð4 %�ÑØ—k‘k -°Ó6Ð6€{Õ6ô �{¤D×)Ñ)Ø˜FÑ# zÓ1Ø˜kÓ)à&,¨jÐ%T¸KÈ
Ñ<SÐ%TˆG�MÒ"à%0�MÑ"ä�'—+‘+˜fÓ%¤t×,Ñ,Ø! &™/×.Ñ.Ó0ˆ�‰ð —‘Ð.°Ó5Ð5€vÖ5ð —‘˜X tÓ,ˆØ�{‰{˜8×$Ñ$Ô);¸F×)CÑ)CØ%+�MÒ"ä! &×)Ñ)Ø$×6Ñ6Ó8�Ø‘à$�Ø˜v }Ð5Ó5Ø˜WÓ$¬°G¸F±OÄT×)JÑ)JØ17¸Ð0G�G˜F‘O HÒ-à'/°&¸-Ð1HÐ&I�G˜F’Oô (JØ#ñ(ð �Oõ ô   ´×6Ñ6Ø$ VÑ,°Ó=à &¨ÐX¸ÈÑ9WÐX�Ø˜WÓ$¬°G¸F±OÄT×)JÑ)JØ0<�G˜F‘O HÒ-à'/°Ð&>�G˜F’Oàà—‘˜K¨Ó.€IØÑØ�WÓ¤¨G°F©O¼T×!BÑ!BØ+4ˆG�F‰O˜KÑ(ð €Nð  +¨IÐ6ˆG�F‰Oà€Nùóa Ys   Ä+N&Ä:N&c                óˆ   • U R                  S5      S:X  a,  SU ;   a&  U R                  5       nUR                  S5      US'   U$ U $ )Nr»   Úfile_citationrë   Ú
file_index©rƒ   r„   r¦  ©Ú
annotationÚnew_annotations     r}   Ú_format_annotation_to_lcr“    sI   € ð ‡~�~�fÓ Ó0°WÀ
Ó5JØ#Ÿ™Ó*ˆØ'5×'9Ñ'9¸'Ó'Bˆ�|Ñ$ØÐØÐr   c                óˆ   • U R                  S5      S:X  a,  SU ;   a&  U R                  5       nUR                  S5      US'   U$ U $ )Nr»   r�  rŽ  rë   r�  r�  s     r}   Ú_format_annotation_from_lcr•    sG   € Ø‡~�~�fÓ Ó0°\ÀZÓ5OØ#Ÿ™Ó*ˆØ"0×"4Ñ"4°\Ó"Bˆ�wÑØÐØÐr   c                ó  • U S   S:X  a  SU S   S.nSU ;   a  U S   US'   U$ U S   S:X  a?  SU S   S   S	.nU S   R                  S
5      (       a  U S   S
   US
'   SU ;   a  U S   US'   U$ U S   S:X  a  SS0U S   EnSU ;   a  U S   US'   U$ U $ )z~Convert chat completions content blocks to Responses API format.

Only handles text, image, file blocks. Others pass through.
r»   r¼   Ú
input_textr½   r´   rÒ   Úinput_imagerÓ   rÔ   r’  r•  Ú
input_file)rƒ   )rÀ   Ú	new_blocks     r}   Ú-_convert_chat_completions_blocks_to_responsesr›    sò   € ð ˆV�}˜Óð *°5¸±=ÑAˆ	Ø$¨Ó-Ø38Ð9RÑ3SˆIÐ/Ñ0ØÐØˆV�}˜Ó#ð "Ø˜{Ñ+¨EÑ2ñ
ˆ	ð �Ñ×!Ñ! (×+Ñ+Ø"'¨Ñ"4°XÑ">ˆI�hÑØ$¨Ó-Ø38Ð9RÑ3SˆIÐ/Ñ0ØÐØˆV�}˜ÓØ˜\Ð;¨U°6©]Ð;ˆ	Ø$¨Ó-Ø38Ð9RÑ3SˆIÐ/Ñ0ØÐØ€Lr   c                óÞ   • [        U [        5      (       a  U $ [        U [        5      (       a2  [        S U  5       5      (       a  U  Vs/ sH  n[	        U5      PM     sn$ [        U 5      $ s  snf )Nc              3  óv   #   • U H0  n[        U[        5      =(       a    UR                  S 5      S;   v •  M2     g7f)r»   )r—  r˜  r™  r¼   rÒ   r•  NrJ  rK  s     r}   r¹  Ú5_ensure_valid_tool_message_content.<locals>.<genexpr>C  sB   é € ð -ñ !ˆEô 	�5œ$Ó÷ 		
Ø�I‰I�fÓð
ñ
ô		
ò !ùs   ‚79)r¶   r¬   r¾   rÁ  r›  rL   )Útool_outputrÀ   s     r}   Ú"_ensure_valid_tool_message_contentr   @  sv   € Ü�+œs×#Ñ#ØÐÜ�+œt×$Ñ$¬ñ -ñ !ó-÷ *ñ *ñ %ó
á$�ô :¸%Ö@Ù$ñ
ð 	
ô �kÓ"Ð"ùò	
s   ÁA*c                óœ  • S n[        U R                  [        5      (       aÉ  U R                   H¸  nU R                  R	                  S5      S:X  a<  [        U[
        5      (       a'  UR	                  S5      S:X  a  U R                  SUS.n  O›[        U[
        5      (       d  Mu  UR	                  S5      S:X  d  MŒ  UR	                  S0 5      R	                  S5      S:X  d  M³  US   n  O?   O<U R                  R	                  S5      S:X  a  U R                  SSU R                  S.S.nUb"  SU R                  ;   a  U R                  S   US'   U$ )	Nr»   Úcomputer_call_outputr˜  )Úcall_idr»   rÝ  rI  r›  rÔ   Úacknowledged_safety_checks)r¶   r6   r¾   rž   rƒ   r©   r§   )rÞ   r¢  rÀ   s      r}   Ú'_make_computer_call_output_from_messager¥  W  s?  € ð 37ÐÜ�'—/‘/¤4×(Ñ(Ø—_”_ˆEà×)Ñ)×-Ñ-¨fÓ5Ð9OÓOÜ˜u¤d×+Ñ+Ø—I‘I˜fÓ%¨Ó6ð  '×3Ñ3Ø2Ø#ñ(Ð$ñ
 ä˜5¤$×'Ó'Ø—I‘I˜fÓ%¨Õ7Ø—I‘I˜g rÓ*×.Ñ.¨vÓ6Ð:PÕPà',¨W¡~Ð$Ùò' %ð( 
×	"Ñ	"×	&Ñ	& vÓ	.Ð2HÓ	Hð ×+Ñ+Ø*Ø,¸7¿?¹?ÑKñ 
Ðð 	Ñ(Ø(¨G×,EÑ,EÓEà=D×=VÑ=VØ(ñ>
ÐÐ9Ñ:ð  Ðr   c                ó�  • S nU R                    H³  n[        U[        5      (       a@  UR                  S5      S:X  a+  SU R                  UR                  S5      =(       d    SS.n  U$ [        U[        5      (       d  Mo  UR                  S5      S:X  d  M†  UR                  S0 5      R                  S5      S:X  d  M­  US   n  U$    U$ )Nr»   Úcustom_tool_call_outputrÝ  r˜   )r»   r£  rÝ  rI  r›  )r6   r¶   r©   rƒ   r§   )rÞ   Úcustom_tool_outputrÀ   s      r}   Ú%_make_custom_tool_output_from_messager©  �  sÀ   € ØÐØ—”ˆÜ�eœT×"Ñ" u§y¡y°Ó'8Ð<UÓ'Uà1Ø"×/Ñ/ØŸ)™) HÓ-×3°ñ"Ðð
 ð Ðô �uœd×#Ó#Ø—	‘	˜&Ó! ^Õ3Ø—	‘	˜' 2Ó&×*Ñ*¨6Ó2Ð6OÕOà!& w¡ÐØàÐñ! !ð  Ðr   c                óL  • U R                  5        VVs0 sH  u  pUS:w  d  M  X_M     nnnSU;   af  [        US   [        5      (       aN  / nUS    H?  nUR                  5        VVs0 sH  u  pUS:w  d  M  X_M     nnnUR                  U5        MA     XCS'   U$ s  snnf s  snnf )zˆWhen streaming, `langchain-core` uses `index` to aggregate text blocks.

OpenAI API does not support this key, so we need to remove it.
rë   Úsummary)rÜ   r¶   r¾   rª   )rÀ   rã   rä   rš  Únew_summaryÚ	sub_blockÚnew_sub_blocks          r}   Ú_pop_index_and_sub_indexr¯  –  sª   € ð
 #(§+¡+¤-Ô@¡-™$˜!°1¸±<“�’¡-€IÑ@Ø�IÓ¤*¨Y°yÑ-AÄ4×"HÑ"HØˆØ" 9Ô-ˆIØ.7¯o©oÔ.?ÔPÑ.?¡d aÀ1ÈÁ<›T˜QšTÑ.?ˆMÑPØ×Ñ˜}Ö-ñ .ð  +�)ÑØÐùó Aùó Qs   ”B£BÁ'B Á6B r€  c          
     óê  • / nU  GHÚ  n[        U[        5      (       a›  [        U5      n[        USS9n[        UR	                  S5      [
        5      (       aa  [        S US    5       5      (       aG  UR                   Vs/ sH  nSUS   US   UR	                  S5      S	.PM!     nn[        US   U5      US'   Or[        USS9n[        US   [
        5      (       aP  [        US   5       H>  u  px[        U[        5      (       d  M  UR	                  S
5      S:X  d  M3  US   US   U'   M@     SU;   a  UR                  S5        US   S:X  a‡  US   n	[        [        [        U5      5      n
[        U5      nU
(       a  UR!                  U
5        GMŠ  U(       a  UR!                  U5        GM¥  [#        U	5      n	SU	US   S.nUR!                  U5        GMÍ  US   S:X  Ga   [        UR	                  S5      [
        5      (       Ga-  US    GH"  n[        U[        5      (       d  M  UR	                  S
5      =n(       d  M5  US;   Ga&  UR	                  S5      nUR	                  S5      nUS;   aN  UR	                  S5      nUc  Mz  SUUR	                  S5      =(       d    /  Vs/ sH  n[%        U5      PM     snS.nOUS:X  a  SUS   S.nU HN  nUR	                  S5      =n(       d  M  UU:X  d  M%  SU;  a  / US'   US   R!                  W5        Ub  UUS'     GM     SW/SS.nUSLa&  U(       a  UR'                  [(        5      (       d  UUS'   Ub  UUS'   UR!                  U5        GMb  US :X  a;  USLd  UR	                  S!5      (       a  UR!                  [+        U5      5        GM   GM£  US";   a  UR!                  [+        U5      5        GMÆ  US#:X  aV  USLa  UR!                  S#US   S$.5        GMë  [+        U5      n[-        U5      S
S1-
  (       a  UR!                  U5        GM  GM"  GM%     OA[        UR	                  S5      [.        5      (       a  UR!                  SSSUS   / S./S%.5        UR                  S&S5      =n(       aq  U Vs1 sH'  nUR	                  S
5      S';   d  M  S(U;   d  M"  US(   iM)     nnU H5  nUS   U;  d  M  S)US*   S   US*   S+   US   S,.nUR!                  U5        M7     GMô  GM÷  US   S-;   aÉ  [        US   [
        5      (       a˜  / nS.nUS    H`  nUS
   S/;   a  UR!                  [1        U5      5        M(  US
   S0;   a  UR!                  U5        MD  US
   U;   a  UR!                  U5        M`  Mb     UUS'   US   (       a  SUS
'   UR!                  U5        GM­  GM°  SUS
'   UR!                  U5        GMÉ  UR!                  U5        GMÝ     U$ s  snf s  snf s  snf )1a)  Construct the input for the OpenAI Responses API.

Args:
    messages: Conversation history to serialize into Responses API input items.
    store: Mirrors the request's `store` flag, controlling stateless-replay
        behavior.

        When `False`, the server does not persist response items, so
        previously returned item IDs cannot be resolved on the next turn.
        Assistant message IDs (`msg_*`) are therefore omitted and reasoning
        blocks are dropped unless they carry `encrypted_content` (which can be
        replayed without server-side storage).

        When `True` or `None` (the default, matching the server's
        stored-by-default behavior), item IDs and reasoning blocks
        are preserved.

Returns:
    A list of Responses API input items derived from `messages`.
rÉ   rË   r6   c              3  ó@   #   • U H  n[        U[        5      v •  M     g 7fr�   rN  rK  s     r}   r¹  Ú1_construct_responses_api_input.<locals>.<genexpr>Á  s   é € ð <Ù5C¨E”
˜5¤$×'Ð'²^ùs   ‚râ   r•   rì   r–   ©r»   r•   rì   r–   r»   rI  r›  r”   r¦   Úfunction_call_outputr§   )r»   rÝ  r£  r™   )r¼   Úoutput_textrN  Úphase)r¼   rµ  r¼   Nrµ  r   )r»   r¼   r   rN  ©r»   rN  rÞ   )r»   r6   r”   Frg  Úencrypted_content)Ú
compactionÚweb_search_callÚfile_search_callrš   Úcomputer_callÚcustom_tool_callrÇ   Úmcp_callÚmcp_list_toolsÚmcp_approval_requestÚtool_search_callÚtool_search_outputÚapply_patch_callÚapply_patch_call_outputÚimage_generation_call)r»   r–   )r»   r”   r6   r›   )rš   r½  r£  rš   r¤   rê   )r»   r•   rê   r£  )r—   r¡   r¢   )Úmcp_approval_responserÂ  rÄ  Úconfiguration_update)r¼   rÒ   r•  )r—  r˜  r™  )r¶   r%   r:   rè   rƒ   r¾   rÁ  r›   rn   Ú	enumerater©   r¦  r¥  r   r3   r©  rª   r   r•  rÖ   rV   r¯  Úsetr¬   r›  )r	  r  rD  Úlc_msgrç   râ   Útcsr|  rÀ   rŸ  r¢  r¨  r´  Ú
block_typeÚmsg_idr¶  r¼   r‘  rš  ÚitemÚitem_idÚnew_itemrÅ  r›   Úcontent_call_idsrš   Ú
new_blocksÚnon_message_item_typess                               r}   r…  r…  ¥  s0  € ð. €FÜˆÜ�fœi×(Ñ(Ü1°&Ó9ˆFÜ*¨6°{ÑCˆCÜ˜#Ÿ'™' )Ó,¬d×3Ñ3¼ñ <Ø58¸²^ó<÷ 9ñ 9ð &,×%6Ò%6ó-ñ &7˜	ð !,Ø )¨&Ñ 1Ø )¨&Ñ 1Ø'Ÿm™m¨DÓ1ô	ñ &7ð ð -ô "?¸sÀ9¹~ÈsÓ!S��I‘øä*¨6°{ÑCˆCä˜#˜i™.¬$×/Ñ/Ü )¨#¨i©.Ö 9‘H�AÜ! %¬×.Ó.°5·9±9¸VÓ3DÈÕ3VØ,1°'©N˜˜I™ qÓ)ñ !:ð �S‹=Ø�G‰G�FŒOØˆv‰;˜&Ó Ø˜i™.ˆKÜ#JÜ”[ &Ó)ó$Ð ô "GÀvÓ!NÐÞ#Ø—‘Ð2×3Þ#Ø—‘Ð0×1ä@ÀÓM�à2Ø)Ø" >Ñ2ñ(Ð$ð
 —‘Ð2×3Ø�‰[˜KÔ'Ü˜#Ÿ'™' )Ó,¬d×3Ò3Ø  �^�EÜ! %¬×.Ó.À%Ç)Á)ÈFÓBSÐ4S°J×4Sà%Ð)KÔKØ%*§Y¡Y¨t£_˜FØ$)§I¡I¨gÓ$6˜EØ)Ð-DÓDà',§y¡y°Ó'8 Ø#'¡<á$,à,9Ø,0ð ;@¿)¹)ÀMÓ:R×:XÐVXÐ:Xó4&á:X¨Jô )CÀ:Ö(NÙ:Xñ4&ñ-"¡	ð ",¨yÓ!8à,5Ø/4°YÑ/?ñ-" 	ó )/ Ø/3¯x©x¸«~Ð$= G×$=À7ÈfÕCTà'0¸Ó'<Ø:<¨¨Y©Ø$(¨¡O×$:Ñ$:¸9Ô$EØ',Ñ'8Ø8=¨¨W©Û$)ñ )/ð -6Ø09¨{Ø,7ñ2" ð %*°Ò$6Þ(.Ø,2×,=Ñ,=¼n×,MÑ,Mð
 6< H¨T¡NØ#(Ñ#4Ø8= H¨WÑ$5Ø &§¡¨h× 7Ø'¨;Ó6Ø$¨EÒ1°U·Y±YÐ?R×5SÑ5SØ &§¡Ô.FÀuÓ.M× Nò 6Tà'ð ,ó ð  #ŸM™MÔ*BÀ5Ó*I×JØ'Ð+BÓBà$¨EÒ1Ø &§¡Ø-DÈEÐRVÉKÑ$X÷!"ô 9QÐQVÓ8WÐ 5Ü#&Ð'<Ó#=ÀÈÀ×#NØ$*§M¡MÐ2G×$Hò $Oò !òo ,ôp ˜CŸG™G IÓ.´×4Ñ4Ø—‘à )Ø +ð )6Ø(+¨I©Ø/1ñð$ñ
ôð !ŸW™W \°4Ó8Ð8ˆzÕ8ñ "(ó$á!'˜Ø—y‘y Ó(Ð,QÑQó %ð " UÑ*ó %�E˜)Ô$Ù!'ð !ð $ó ",�IØ  ‘Ð.>Õ>à$3Ø$-¨jÑ$9¸&Ñ$AØ)2°:Ñ)>¸{Ñ)KØ'0°¡ñ	)˜ð Ÿ™ mÖ4ô ",ò 9ð" �‰[Ð;Ó;Ü˜#˜i™.¬$×/Ñ/Ø�
ð*Ð&ð ! œ^�EØ˜V‘}Ð(EÓEØ"×)Ñ)ÜIÈ%ÓPöð ˜v™Ð*UÓUØ"×)Ñ)¨%Ö0Ø˜v™Ð*@Ó@ØŸ™ eÖ,áñ ,ð ",��I‘Ø�y—>Ø"+�C˜‘KØ—M‘M #×&ò "ð (��F‘Ø—‘˜c×"à�M‰M˜#×ñI ðL €Mùò-ùòn4&ùòt$s   Á?%W&ÊW+ÒW0Ò(W0Ò0	W0c                ó&  • [        U S5      (       a  U R                  $ U R                   VVs/ sHF  nUR                  S:X  d  M  UR                   H!  nUR                  S:X  d  M  UR
                  PM#     MH     nnnSR                  U5      $ s  snnf )zjSafe output text extraction.

Context: OpenAI SDK deleted `response.output_text` momentarily in `1.99.2`.
rµ  rÞ   r˜   )r&  rµ  rÝ  r»   r6   r¼   Újoin)r  rÝ  r6   Útextss       r}   Ú_get_output_textr×  †  s�   € ô
 ˆx˜×'Ñ'Ø×#Ñ#Ð#ð —o’oôá%ˆFØ�;‰;˜)Ñ#ó 	ð —~”~ˆGØ�<‰<˜=Ñ(ó	 	ˆ�Œñ &ñ 	Ù%ð 
ñ ð �7‰7�5‹>Ðùós   ­BÁBÁ%Bc                ó²	  • U R                   (       a  [        U R                   5      eUc  SnU R                  SSSS9R                  5        VVs0 sH  u  pEUS;   d  M  XE_M     nnnU(       a  UR	                  U5        SUS	'   UR                  S
5      US'   U R                  (       a/  [        U R                  R                  5       U R                  5      nOSn/ n/ n	/ n
0 nU R                   GHŸ  nUR                  S:X  Ga  [        USS5      nUR                   Hÿ  nUR                  S:X  a¦  SUR                  [        UR                  [         5      (       a3  UR                   Vs/ sH  n[#        UR                  5       5      PM     snO/ UR$                  S.nUb  UUS'   UR'                  U5        [)        US5      (       a  UR*                  US'   UR                  S:X  d  MË  SUR,                  UR$                  S.nUb  UUS'   UR'                  U5        GM     GM4  UR                  S:X  a¿  UR                  SSS9nSU;   a  UR/                  S5      US'   UR'                  U5         [0        R2                  " UR4                  SS9nSnUc/  SUR:                  UUR<                  S.nU	R'                  U5        GMÓ  SUR:                  UUR<                  US.nU
R'                  U5        GM  UR                  S:X  aZ  UR'                  UR                  SSS95        SUR:                  SUR>                  0UR<                  S.nU	R'                  U5        GMm  UR                  S;   d  GM€  UR'                  UR                  SSS95        GM¢     [A        U 5      nUb«  SU;  a¥  U(       až  U R                  (       a�  U R                  R                  5       =n(       al  UR                  S 0 5      =n(       aS  UR                  S!5      S":X  a>   [0        R2                  " U5      nU(       a  [C        U5      (       a	  U" S'0 UD6nOUnUUS'   [E        UU R$                  UUUU	U
S#9nUS$:X  a  [G        U5      n[I        [K        US%9/S&9$ s  snnf s  snf ! [6         a"  nUR4                  n[9        U5      n SnAGN)SnAff = f! [0        R6                   a     N‹f = f)(z;Construct `ChatResponse` from OpenAI Response API response.Nr;  Tr  F)Úexclude_noner�  rö   )	Ú
created_atr–   Úincomplete_detailsrý  ÚobjectÚstatusr—   rC  r~  r!  rê  rC  r…   rÞ   r¶  rµ  r¼   )r»   r¼   r   r–   rL  rN  )r»   rN  r–   rš   ©rÙ  r�  Úasync_r’   r¥  râ   r³  r   )r»   r•   rì   r–   rM  r½  Ú__arg1)rg  r¹  rº  r»  r¼  rÇ   r¾  r¿  rÀ  rÅ  rÁ  rÂ  rÃ  rÄ  r„  r»   r©  )r6   r–   rå  rí  rž   r›   rŸ   Úv0©rÞ   )r3  rü   )&rM  rô   r$  rÜ   Úupdaterƒ   râ  rp  r~  rÝ  r»   r-  r6   r¼   r¶   r   r¾   r“  r–   rª   r&  rL  rN  r¦  r  Úloadsrê   r   r¬   r•   r£  r�  r×  r1  r%   ro   rE   rC   )r  rü  rý  r„  rã   rä   rí  rå  rP  r›   rŸ   rž   rÝ  r¶  r6   r‘  rÀ   Úrefusal_blockÚfunction_call_blockrì   rM  r±   râ   rµ  Útext_configÚformat_Úparsed_dictrL  rÞ   s                                r}   r2  r2  —  sÇ  € ð ‡~‡~Ü˜Ÿ™Ó(Ð(àÑð (ˆð
 ×'Ñ'Ø F°Uð (ð 
ç
‰%‹'ðôñ‰DˆAð ð
ñ
ó 	ˆŠñð ñ ö* Ø× Ñ  Ô*à*2ÐÐ&Ñ'Ø&7×&;Ñ&;¸GÓ&DÐ�lÑ#Ø‡~‡~Ü9Ø�N‰N×%Ñ%Ó'¨×)>Ñ)>ó
‰ð ˆà€NØ€JØÐØ ÐØ—/•/ˆØ�;‰;˜)Ô#Ü˜F G¨TÓ2ˆEØ!Ÿ>œ>�Ø—<‘< =Ó0à &Ø '§¡ô
 & g×&9Ñ&9¼4×@Ñ@ð /6×.AÒ.Aó(á.A 
ô 5°Z×5JÑ5JÓ5LÖMÙ.Aò(ð
  Ø$Ÿi™iñ
�Eð Ñ(Ø).˜˜g™Ø"×)Ñ)¨%Ô0Ü˜w¨×1Ñ1Ø6=·n±nÐ)¨(Ñ3Ø—<‘< 9Õ,à )Ø#*§?¡?Ø$Ÿi™iñ%�Mð
 Ñ(Ø16˜ gÑ.Ø"×)Ñ)¨-×8ô5 *ð6 �[‰[˜OÓ+Ø"(×"3Ñ"3ÀÈFÐ"3Ð"SÐð Ð.Ó.Ø/B×/FÑ/FÀxÓ/PÐ# GÑ,Ø×!Ñ!Ð"5Ô6ðÜ—z’z &×"2Ñ"2¸5ÑA�Ø�ð ‰}à'Ø"ŸK™KØ Ø Ÿ.™.ñ	�	ð ×!Ñ! )×,ð 0Ø"ŸK™KØ Ø Ÿ.™.Ø"ñ�	ð #×)Ñ)¨)×4Ø�[‰[Ð.Ó.Ø×!Ñ! &×"3Ñ"3ÀÈFÐ"3Ð"SÔTà#ØŸ™Ø! 6§<¡<Ð0Ø—n‘nñ	ˆIð ×Ñ˜i×(Ø�[‰[ð 
ö 
ð  ×!Ñ! &×"3Ñ"3ÀÈFÐ"3Ð"S×Tñk "ôL # 8Ó,€KàÑØÐ-Ó-ÞØ�M�MØ$ŸM™M×4Ñ4Ó6Ð6ˆ[Õ6Ø#Ÿ™¨°"Ó5Ð5ˆWÕ5Ø�[‰[˜Ó  MÓ1ð	ÜŸ*š* [Ó1ˆKÞÔ,¨V×4Ñ4ÙÑ. +Ñ.‘à$�Ø*0Ð˜hÑ'ô ØØ�;‰;Ø%Ø+Ø+ØØ-ñ€Gð ˜ÓÜ,¨WÓ5ˆä¤>¸'Ñ#BÐ"CÑDÐDùóWùòZ(øô@ #ó Ø×'Ñ'�Ü˜A›–ûðûô^ ×#Ñ#ó 	Ùð	ús<   ÁRÁRÅ'"RÉ-!RÐ=R? Ò
R<ÒR7Ò7R<Ò?SÓSc                ó   • [        U [        5      (       a  SSKJn   UR                  " U 5      $ U $ ! [
         aB  n[        R                  SU R                  S5      U5        UR                  " S0 U D6s S nA$ S nAff = f)Nr   rr   zÍOpenAI Responses payload failed SDK validation (response id=%s); falling back to non-validating construct. This usually means the OpenAI API has drifted ahead of the installed `openai` package. Details: %sr–   rü   )
r¶   r©   Úopenai.types.responsesrs   Úmodel_validater]   r™  rš  rƒ   Úmodel_construct)Úresprs   r±   s      r}   Ú_coerce_chunk_responserï  U  sz   € ä�$œ×ÑÝ3ð	4Ø×*Ò*¨4Ó0Ð0ð €Køô ó 	4ô �N‰Nð:ð —‘˜“Øôð ×+Ò+Ñ3¨dÑ3Õ3ûð	4ús   �1 ±
A=»7A8Á2A=Á8A=c           
     ó”  ^^^• S;S<UUU4S jjjnUc  Sn/ n	/ n
0 nU=(       d    0 nSUS'   S nS nS nU R                   S:X  a>  U" U R                  U R                  5        U	R                  SU R                  TS.5        GO‹U R                   S:X  a„  U" U R                  U R                  5        [        U R                  [        5      (       a  U R                  nOU R                  R                  S	S
S9nU	R                  S[        U5      /TS.5        GO÷U R                   S:X  a?  U" U R                  U R                  5        U	R                  SSU R                  TS.5        GO¨U R                   S:X  a2  [        U R                  5      nUR                  nUR                  US'   GOfU R                   S;   a²  [        U R                  5      n[        [        [!        UXGS9R"                  S   R$                  5      nUR&                  R)                  S5      =n(       a  UUS'   UR*                  nUR,                  R/                  5        VVs0 sH  u  nnUS:w  d  M  UU_M     nnnSnGO¤U R                   S:X  aƒ  U R0                  R                   S:X  ai  US:X  a  U R0                  R                  nGO\[3        U R0                  SS 5      =n(       a+  U" U R                  S5        U	R                  SSUTS.5        GOGOU R                   S:X  GaV  U R0                  R                   S:X  Ga;  U" U R                  5        U
R                  SU R0                  R4                  U R0                  R6                  U R0                  R8                  TS.5        SU R0                  R4                  U R0                  R6                  U R0                  R8                  U R0                  R                  TS.n[3        U R0                  S S 5      b  U R0                  R:                  US '   [3        U R0                  S!S 5      nUc  [3        U R0                  S"S 5      nUb  UUS"'   U	R                  U5        GOªU R                   S#:X  a^  U R0                  R                   S$;   aD  U" U R                  5        U R0                  R                  S	S
S9nTUS%'   U	R                  U5        GO<U R                   S#:X  aÇ  U R0                  R                   S&:X  a­  U" U R                  5        U R0                  R                  S	S
S9nTUS%'   U	R                  U5        U
R                  SU R0                  R4                  [<        R>                  " S'U R0                  R@                  05      U R0                  R8                  TS.5        GOeU R                   S(:X  aR  U" U R                  5        U
R                  SU R                  TS).5        U	R                  SU R                  TS*.5        GOU R                   S+:X  a   U	R                  S,U RB                  S-.5        GOÓU R                   S:X  ar  U R0                  R                   S.:X  aX  U" U R                  5        SmU R0                  R                  S	S
S9nURE                  S/S 5        TUS%'   U	R                  U5        GOQU R                   S#:X  a‡  U R0                  R                   S.:X  am  U R0                  RF                  (       aR  U" U R                  5        U	R                  S.U R0                  R                  / U R0                  RF                  TS0.5        OºU R                   S1:X  aB  U" U R                  5        U	R                  U RH                  S2SS3./TS.U R                  S4.5        OhU R                   S5:X  a  OWU R                   S6:X  aA  U" U R                  5        U	R                  U RH                  S2U R                  S3./TS.S7.5        OTTTS 4$ [K        U	U
UUUUUS89nUS:X  a  [        [J        [M        UUS995      nTTT[O        US:94$ s  snnf )=Nc                óR   >• Uc  TU :w  a  TS-  mU mgTU :w  d  TU:w  a  TS-  mUmU mg)a"  Advance indexes tracked during streaming.

Example: we stream a response item of the form:

```python
{
    "type": "message",  # output_index 0
    "role": "assistant",
    "id": "msg_123",
    "content": [
        {"type": "output_text", "text": "foo"},  # sub_index 0
        {"type": "output_text", "text": "bar"},  # sub_index 1
    ],
}
```

This is a single item with a shared `output_index` and two sub-indexes, one
for each content block.

This will be processed into an `AIMessage` with two text blocks:

```python
AIMessage(
    [
        {"type": "text", "text": "foo", "id": "msg_123"},  # index 0
        {"type": "text", "text": "bar", "id": "msg_123"},  # index 1
    ]
)
```

This function just identifies updates in output or sub-indexes and increments
the current index accordingly.
Nr¡  rü   )Ú
output_idxÚsub_idxr  r  r  s     €€€r}   Ú_advanceÚ>_convert_responses_chunk_to_generation_chunk.<locals>._advancev  sM   ø€ ðF ‰?Ø# zÓ1Ø Ñ"�ð
  *Ñð %¨
Ó2Ð8IÈWÓ8TØ Ñ"�Ø 'ÐØ)Ñr   r;  r!  rê  zresponse.output_text.deltar¼   )r»   r¼   rë   z%response.output_text.annotation.addedTr  rÞ  )r»   r   rë   zresponse.output_text.doner˜   )r»   r¼   r–   rë   zresponse.createdr–   )zresponse.completedzresponse.incomplete)rü  r„  r   rL  Úlastzresponse.output_item.addedrÞ   rá  r¶  )r»   r¼   r¶  rë   rš   r<   )r»   r•   rì   r–   rë   )r»   r•   rê   r£  r–   rë   Ú	namespacerß  r’   zresponse.output_item.done)r¹  rº  r»  r¼  rÇ   r¾  r¿  rÀ  rÅ  rÁ  rÂ  rÃ  rÄ  rë   r½  rà  z&response.function_call_arguments.delta)r»   rì   rë   )r»   rê   rë   zresponse.refusal.donerN  r·  rg  r¸  )r»   r–   r«  r¸  rë   z%response.reasoning_summary_part.addedÚsummary_text)rë   r»   r¼   )r«  rë   r»   r–   z,response.image_generation_call.partial_imagez%response.reasoning_summary_text.delta)r«  rë   r»   )r6   rí   rå  rí  rž   r–   Úchunk_position)rþ  râ  r�   )rò  ró   ró  rX  rä  rç  )(r»   Úoutput_indexÚcontent_indexrª   rè  r¶   r‘  r©   r$  r“  rÏ  rï  r  r–   r   r%   r2  r3  rÞ   rž   rƒ   rå  rí  rÜ   rÎ  r-  r•   rê   r£  r÷  r  r  r�  rN  r¦  r¸  Úsummary_indexr&   ro   rD   )rä  r  r  r  rü  rý  rþ  r„  rô  r6   rí   rž   rí  rå  rù  r–   r‘  r  rç   rL  rã   rä   r¶  Úfunction_call_contentÚ
async_flagrŸ  rg  rÞ   s    ```                        r}   r  r  l  sh  ú€ ÷**ó **ðX Ñð (ˆà€GØÐØ ÐØ Ÿ BÐØ*2ÐÐ&Ñ'Ø€NØ-1€NØ	€BØ‡z�zÐ1Ó1Ù�×#Ñ# U×%8Ñ%8Ô9Ø�‰ °·±ÀmÑTÖUØ	�‰Ð>Ó	>Ù�×#Ñ# U×%8Ñ%8Ô9Ü�e×&Ñ&¬×-Ñ-à×)Ñ)‰Jà×)Ñ)×4Ñ4À$ÈVÐ4ÐTˆJà�‰àÜ 8¸Ó DÐEØ&ñö	
ð 
�‰Ð2Ó	2Ù�×#Ñ# U×%8Ñ%8Ô9Ø�‰àØØ—m‘mØ&ñ	ö	
ð 
�‰Ð)Ó	)Ü)¨%¯.©.Ó9ˆØ�[‰[ˆØ"*§+¡+Ð˜$ÓØ	�‰ÐDÓ	DÜ)¨%¯.©.Ó9ˆÜÜä7Ø Vñ÷ ‘˜Qñ ÷ ‘ó	
ˆð ×*Ñ*×.Ñ.¨xÓ8Ð8ˆ6Õ8Ø*0Ð˜hÑ'Ø×+Ñ+ˆà ×2Ñ2×8Ñ8Ô:ô
Ù:‘T�Q˜¸aÀ4¹i‹DˆAˆqŠDÑ:ð 	ñ 
ð  ŠØ	�‰Ð3Ó	3¸¿
¹
¿¹È9Ó8TØ˜TÓ!Ø—‘—‘ŠBÜ˜eŸj™j¨'°4Ó8Ð8ˆUÕ8Ù�U×'Ñ'¨Ô+Ø�N‰Nà"ØØ"Ø*ñ	öñ à�
‰
Ð2Ô2Ø�J‰J�O‰O˜Ô.á�×#Ñ#Ô$Ø×Ñà)ØŸ
™
Ÿ™ØŸ
™
×,Ñ,Ø—j‘j×(Ñ(Ø&ñô	
ð $Ø—J‘J—O‘OØŸ™×-Ñ-Ø—z‘z×)Ñ)Ø—*‘*—-‘-Ø"ñ'
Ðô �5—:‘:˜{¨DÓ1Ñ=Ø16·±×1EÑ1EÐ! +Ñ.ä˜UŸZ™Z¨°4Ó8ˆ
ØÑÜ  §¡¨W°dÓ;ˆJØÑ!Ø-7Ð! 'Ñ*Ø�‰Ð,Ö-Ø	�‰Ð2Ó	2°u·z±z·±ð Kó 8ñ 	�×#Ñ#Ô$Ø—j‘j×+Ñ+¸ÀFÐ+ÐKˆØ,ˆ�GÑØ�‰�{Ö#à�
‰
Ð1Ó1Ø�J‰J�O‰OÐ1Ó1á�×#Ñ#Ô$Ø—j‘j×+Ñ+¸ÀFÐ+ÐKˆØ,ˆ�GÑØ�‰�{Ô#Ø×Ñà)ØŸ
™
Ÿ™ÜŸ
š
 H¨e¯j©j×.>Ñ.>Ð#?Ó@Ø—j‘j×(Ñ(Ø&ñö	
ð 
�‰Ð?Ó	?Ù�×#Ñ#Ô$Ø×ÑØ&°·±ÀmÑTô	
ð 	�‰Ø$°5·;±;ÈÑWö	
ð 
�‰Ð.Ó	.Ø�‰ 	°e·m±mÑDÖEØ	�‰Ð3Ó	3¸¿
¹
¿¹È;Ó8VÙ�×#Ñ#Ô$ØÐØ—J‘J×)Ñ)°tÀ&Ð)ÐIˆ	ð 	�‰Ð)¨4Ô0Ø*ˆ	�'ÑØ�‰�yÖ!à�
‰
Ð1Ó1Ø�J‰J�O‰O˜{Ó*Ø�J‰J×(×(á�×#Ñ#Ô$Ø�‰à#Ø—j‘j—m‘mØØ%*§Z¡Z×%AÑ%AØ&ñõ	
ð 
�‰Ð>Ó	>Ù�×#Ñ#Ô$Ø�‰ð $×1Ñ1¸>ÐSUÑVðð 'Ø#Ø—m‘mñõ
	
ð 
�‰ÐEÓ	EàØ	�‰Ð>Ó	>Ù�×#Ñ#Ô$Ø�‰ð "'×!4Ñ!4Ø .Ø %§¡ñðð 'Ø#ñ
õ	
ð Ð2Ð4EÀtÐKÐKäØØ)Ø%Ø+Ø+ØØ%ñ€Gð ˜ÓÜÜÜ& w¸mÑLó
ˆð 	ØØÜ GÑ,ð	ð ùóU
s   ÉaÉa)rä  zhttpx.Client)r…   r¬   rä  rq   )r­   úMapping[str, Any]rä  r'   )r·   rI  r¸   rI  rä  rI  )r6   ústr | list[dict]rä  r   )rÈ   N)r6   r   rÌ   ú(Literal['chat/completions', 'responses']r”   rN  rä  r   )rÈ   )rÞ   r'   rÌ   r  rä  r©   )r­   rÿ  rï   ztype[BaseMessageChunk]rä  r(   )rø   ú
int | dictrù   r  rä  r  )r±   zopenai.BadRequestErrorrä  rç  )r±   zopenai.APIErrorrä  rç  )r.  rI  r/  r   rä  rç  )r…   rN  rä  r`  )r  r   rä  r`  )râ   r2   rä  r©   )r   r/   rä  r©   )r1  r¬   rä  ztuple[int, int] | None)r5  ró   r6  ró   rä  ró   )rA  r¬   rä  r`  )r5  ró   r6  ró   rä  ztuple[int, int])rü  zdict[str, Any] | typer¢  rV  rä  zdict | TypeBaseModel)rR  r%   rü  z	type[_BM]rä  zPydanticBaseModel | Noner�   )rh  r©   r~  rN  rä  r9   )r¦   r©   rä  r`  rí  )r	  rï  rä  z(tuple[Sequence[BaseMessage], str | None])r	  rï  r  r©   rä  r©   )r‘  rI  rä  rI  )rÀ   rI  rä  rI  )rŸ  r   rä  r   )rÞ   r3   rä  rf  )rÞ   r3   rä  ræ  )rÀ   r©   rä  r©   )r	  rï  r  rV  rä  r¾   )r  rs   rä  r¬   )NNN)
r  rs   rü  útype[_BM] | Nonerý  ræ  r„  rN  rä  rE   )rî  r   rä  r   )NNFN)rä  r   r  ró   r  ró   r  ró   rü  r  rý  ræ  rþ  r`  r„  rN  rä  z0tuple[int, int, int, ChatGenerationChunk | None])õr  Ú
__future__r   rÏ   r  Úloggingr¾  r  Ússlr„  rö   Úcollections.abcr   r   r   r   r   r	   Ú	functoolsr
   Úior   r   Úmathr   Úoperatorr   Útypingr   r   r   r   r   r   Úurllib.parser   Úcertifir!  rz  Úlangchain_core.callbacksr   r   Úlangchain_core.exceptionsr   r   r   r   r   r   r   r   r    Úlangchain_core.language_modelsr!   r"   Ú*langchain_core.language_models.chat_modelsr#   r$   Úlangchain_core.messagesr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   ÚtypesÚlangchain_core.messages.air7   r8   r9   Ú0langchain_core.messages.block_translators.openair:   r;   Úlangchain_core.messages.toolr<   Úlangchain_core.output_parsersr=   r>   Ú*langchain_core.output_parsers.openai_toolsr?   r@   rA   rB   Úlangchain_core.outputsrC   rD   rE   Úlangchain_core.runnablesrF   rG   rH   rI   Úlangchain_core.runnables.configrJ   Úlangchain_core.toolsrK   Úlangchain_core.tools.baserL   Úlangchain_core.utilsrM   Úlangchain_core.utils._gatewayrN   rO   rP   Ú%langchain_core.utils.function_callingrQ   rR   Úlangchain_core.utils.pydanticrS   rT   rU   Úlangchain_core.utils.utilsrV   rW   rX   ÚpydanticrY   rZ   r[   r\   r]   r^   r_   Úpydantic.v1rÊ  Útyping_extensionsr`   Úlangchain_openai._versionra   Ú*langchain_openai.chat_models._client_utilsrb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   Ú$langchain_openai.chat_models._compatrm   rn   ro   Úlangchain_openai.data._profilesrp   r(  rq   rë  rs   Ú	getLoggerrþ   r™  Úcreate_default_contextÚwherer|   ru   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  r'  r  r  r*  r1  r4  r6  r7  r©   r¬   r»   r9  r:  r<  rù  r1  rÚ   rÛ   r˜  r™  r'  r.  r:  r­  rÌ  r«   rO  rë  rp  rr  r0  rB  rC  r“  r•  r›  r   r¥  r©  r¯  r…  r×  r2  rï  r  rü   r   r}   Ú<module>r.     s
  ðòõ #ã Û Û Û 	Û 	Û 
Û 
Û ÷÷ õ Ý Ý  Ý Ý ÷÷ õ "ã Û Û ÷÷
÷ 
õ 
÷÷÷÷ ÷ ÷ õ õ& 5÷ñ ÷
õ 9ß P÷ó ÷ SÑ R÷ó õ <Ý )Ý 0Ý 9÷ñ ÷
÷ñ ÷
 UÑ T÷÷ ñ õ 1Ý "å 1÷÷ ÷ ñ ÷ñ õ
 6æÛÝ;Ý/à	×	Ó	˜8Ó	$€ð ×/Ó/°w·}³}³ÑGÐ à$(€Ð!Ó (ôñ Ð+¨YÓ7€ôð

€ð 6Ð ô@LðFØ ðØ3Aðàôô(ð6 5GØðHØðHà	1ðHð ðHð 	õ	HðZ 5GðOØðOà	1ðOð 
õOðd52Øð52Ø-Cð52àô52ðpØ#ðØ0:ðàôô8L ×!7Ò!7Ð9Mô LôE F§O¢OÐ5Iô EôM × :Ò :Ð<Tô MôIØ
× Ò Ð"<ôIôJ × 6Ò 6Ð8Pô JôH˜v×3Ò3Ð5Gô HôI˜6×0Ò0Ð2Eô IôE�V×/Ò/°ô EôI˜F×5Ò5Ð7Kô IôF˜×/Ò/Ð1Bô Fô"ôJ
ô>Jð Ð ôXñ ˆe˜9Ñ%€Ø"& s¨C x¡.°4¸±9Ñ"<¸tÑ"CÐ �iÓ CØ! C™Z€�Ó 'ôy 
�]ô y 
ôxAp
�ô p
ôf)@ôð
Ø&ð
à	ô
ô8ôvôô&ôð* =Añ%Ø!ð%Ø.9ð%àõ%ðPØðØ(ðàôô@˜ô ð 7;ð/Øð/Ø)3ð/àõ/ðf 7;ð+Øð+Ø)3ð+àõ+ô\9ôQðØ#ðà-ôð2qØ#ðqØ.2ðqà	ôqôhôðØðàôôD#ð.' Øð' àô' ôTô*ð  >Bñ^Ø#ð^Ø/:ð^à	õ^ôBð&  $Ø Ø!%ð	{EØð{Eàð{Eð ð{Eð ð	{Eð
 õ{Eô|ð8  $Ø ØØ!%ðbØðbàðbð ðbð ð	bð
 ðbð ðbð ðbð ðbð 6öbr   