Ë
    uPêj  ã                   ó(   — d Z ddlZddlmZ d„ Zd„ Zy)zQ
Utility functions for cleaning up async HTTP clients to prevent resource leaks.
é    N)ÚFinalc               ƒ   óè  K  — ddl } ddlm} t        | j                  di «      }|j                  «       D �]  \  }}t        ||«      r&t        |d«      r	 |j                  «       ƒ d{  –—†  Œ9t        |d«      st        |d«      r�t        |d«      r|j                  n|j                  }t        |d«      r9t        |j                  d	«      r#	 |j                  j                  «       ƒ d{  –—†  t        |d	«      sŒÇ|j                  rŒÔ	 |j                  «       ƒ d{  –—†  Œît        |d	«      sŒû	 |j                  «       ƒ d{  –—†  �Œ t        | d
«      rAt        | d
d«      }t        ||«      r't        |d«      r	 |j                  «       ƒ d{  –—†  yyyy7 �Œ2# t        $ r Y �Œtw xY w7 ŒÂ# t        $ r Y ŒËw xY w7 Œ # t        $ r Y �Œ—w xY w7 Œ‹# t        $ r Y �Œ©w xY w7 ŒP# t        $ r Y yw xY w­w)a)  
    Close all cached async HTTP clients to prevent resource leaks.

    This function iterates through all cached clients in litellm's in-memory cache
    and closes any aiohttp client sessions that are still open. Also closes the
    global base_llm_aiohttp_handler instance (issue #12443).
    r   N)ÚBaseLLMAIOHTTPHandlerÚ
cache_dictÚcloseÚ_clientÚclientÚ
_transportÚacloseÚbase_llm_aiohttp_handler)ÚlitellmÚ)litellm.llms.custom_httpx.aiohttp_handlerr   ÚgetattrÚin_memory_llm_clients_cacheÚitemsÚ
isinstanceÚhasattrr   Ú	Exceptionr   r	   r
   r   Ú	is_closed)r   r   r   ÚkeyÚhandlerr	   Úbase_handlers          ús/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/custom_httpx/async_client_cleanup.pyÚclose_litellm_async_clientsr   	   sÞ  è ø€ ó ÝOä × CÑ CÀ\ÐSUÓV€Jà"×(Ñ(Ó*ó !‰ˆˆWä�gÐ4Ô5¼'À'È7Ô:SðØ—m‘m“o×%Ñ%ô �W˜iÔ(¬G°G¸XÔ,FÜ(/°¸Ô(C�W—_’_ÈÏÉˆFä�v˜|Ô,´¸×9JÑ9JÈHÔ1UðØ ×+Ñ+×2Ñ2Ó4×4Ð4ô
 �v˜xÕ(°×1AÓ1AðØ Ÿ-™-›/×)Ñ)ô �W˜hÕ'ðØ—n‘nÓ&×&Ò&ð=!ôJ ˆwÐ2Ô3Ü% gÐ/IÈ4ÓPˆÜ�lÐ$9Ô:¼wÀ|ÐU\Ô?]ðØ"×(Ñ(Ó*×*Ñ*ð @^Ð:ð 4ðC &úÜò âðúð 5ùÜ ò áðúð *ùÜ ò âðúð 'ùÜò âðúð +ùÜò áðüs  ‚AG2ÁFÁ'FÁ(FÁ,AG2ÃF.Ã)F,Ã*F.Ã.G2Ã;G2Ä	F?ÄF=ÄF?Ä!G2Ä0GÅGÅGÅ4G2Å=G# ÆG!ÆG# ÆG2ÆFÆ	F)Æ%G2Æ(F)Æ)G2Æ,F.Æ.	F:Æ7G2Æ9F:Æ:G2Æ=F?Æ?	GÇG2ÇGÇG2ÇGÇ	GÇG2ÇGÇG2Ç!G# Ç#	G/Ç,G2Ç.G/Ç/G2c                  ó4   — ddl } d„ }| j                  |«       y)zž
    Register the async client cleanup function to run at exit.

    This ensures that all async HTTP clients are properly closed when the program exits.
    r   Nc                  óô   — 	 t        j                  «       } t        j                  | «       	 | j                  t	        «       «       | j                  «        y# | j                  «        w xY w# t        $ r Y yw xY w)zó
        Cleanup wrapper that creates a fresh event loop for atexit cleanup.

        At exit time, the main event loop is often already closed. Creating a new
        event loop ensures cleanup runs successfully (fixes issue #12443).
        N)ÚasyncioÚnew_event_loopÚset_event_loopÚrun_until_completer   r   r   )Úloops    r   Úcleanup_wrapperz6register_async_client_cleanup.<locals>.cleanup_wrapperN   sb   € ð	ô "×0Ñ0Ó2ˆDÜ×"Ñ" 4Ô(ðØ×'Ñ'Ô(CÓ(EÔFð —
‘
•ø�—
‘
•ûÜò 	áð	ús(   ‚)A+ ¬A ÁA+ ÁA(Á(A+ Á+	A7Á6A7)ÚatexitÚregister)r#   r"   s     r   Úregister_async_client_cleanupr%   F   s   € ó òð* ‡O�O�OÕ$ó    )Ú__doc__r   Útypingr   r   r%   © r&   r   ú<module>r*      s   ðñó Ý ò:óz%r&   