Ë
    tPêjy  ã                   ó²  — U d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
 d dlmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ  e«       Ze
ed
<   d„ Z e«        ej;                  d ee«      g¬«      d„ «       Zej>                  j;                  dd«      jA                  «       dk(  r›	 d dl!Z! e"d«        e!jF                  «         e"d«        e!jH                  «         e!jJ                  «       Z&e
ed<    e"d«        e!jH                  e&¬«        ejP                  d«       ej;                  d ee«      gd¬«      d„ «       Z)ej;                  dd¬«       ee«      fdefd „«       Z*ej;                  d!d¬«       ee«      fdefd"„«       Z+ej;                  d#d¬«       ee«      fded$e,e-e	f   fd%„«       Z.d$e,e-e	f   fd&„Z/d'e0d$e1e0e2e,e-e	f      f   fd(„Z3d$e,e-e	f   fd)„Z4d$e,e-e	f   fd*„Z5d$e,e-e	f   fd+„Z6d,e0d-e7d$e,e-e	f   dz  fd.„Z8ej;                  d/d¬«       ee«       ed0d1¬2«       ed3d4¬2«      fded'e0d-e7d$e,e-e	f   fd5„«       Z9eju                  d6d¬«       ee«       ed7d8¬2«       edd9¬2«       edd:¬2«      fded;e0d<e0d=e0d$e,e-e	f   f
d>„«       Z;ej;                  d? ee«      gd¬«      d@„ «       Z<dA„ Z=y# e'$ r	  e'd«      ‚w xY w)Bé    N)ÚCounter)ÚAnyÚFinal)Ú	APIRouterÚDependsÚHTTPExceptionÚQuery)Úget_secret_str)Úverbose_proxy_logger)ÚPYTHON_GC_THRESHOLD)ÚUserAPIKeyAuth)Úuser_api_key_authÚrouterc                  óè  — t         } | rƒ	 | j                  d«      D �cg c]  }t        |j                  «       «      ‘Œ }}t	        |«      dk(  r)t        j                  |Ž  t        j                  d|«       nt        j                  d| «       t        j                  «       }t        j                  d|d   |d	   |d
   «       yc c}w # t        $ r!}t        j                  d| |«       Y d}~Œ`d}~ww xY w)zJConfigure Python garbage collection thresholds from environment variables.ú,é   zGC thresholds set to: %sz;GC threshold not set: %s. Expected format: 'gen0,gen1,gen2'z+Failed to parse GC threshold: %s. Error: %sNz0Current GC thresholds: gen0=%s, gen1=%s, gen2=%sr   é   é   )r   ÚsplitÚintÚstripÚlenÚgcÚset_thresholdr   ÚinfoÚwarningÚ
ValueErrorÚget_threshold)Úgc_threshold_envÚxÚ
thresholdsÚeÚcurrent_thresholdss        úk/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/common_utils/debug_utils.pyÚconfigure_gc_thresholdsr%      så   € ä1ÐÙð	mà9I×9OÑ9OÐPSÓ9TÖ U°A¤ Q§W¡W£Y¥Ð UˆJÐ UÜ�:‹ !Ò#Ü× Ñ  *Ñ-Ü$×)Ñ)Ð*DÀjÕQä$×,Ñ,ØQÐScôô !#× 0Ñ 0Ó 2ÐÜ×ÑØ:Ø˜1ÑØ˜1ÑØ˜1Ñõ	ùò !Vøô ò 	mÜ ×(Ñ(Ð)VÐXhÐjk×lÑlûð	mús(   ŠC � C½AC ÃC Ã	C1ÃC,Ã,C1z/debug/asyncio-tasks)Údependenciesc               ƒ   ó‚  K  — d} t        j                  «       }|D �cg c]  }|j                  «       rŒ|‘Œ }}t        «       }t	        |«      D ]R  \  }}|| k\  r nH|j                  «       }t        |dd«      xs t        |dd«      xs t        |«      }||xx   dz  cc<   ŒT t        |«      t        |«      dœS c c}w ­w)zY
    Returns:
      total_active_tasks: int
      by_name: { coroutine_name: count }
    iˆ  Ú__qualname__NÚ__name__r   )Útotal_active_tasksÚby_name)
ÚasyncioÚ	all_tasksÚdoner   Ú	enumerateÚget_coroÚgetattrÚreprr   Údict)	ÚMAX_TASKS_TO_CHECKr-   ÚtÚactive_tasksÚcounterÚidxÚtaskÚcoroÚnames	            r$   Úget_active_tasks_statsr<   6   sÉ   è ø€ ð !%Ðä×(Ñ(Ó*€Ið '0Ö@ °q·v±vµxš1Ð@€LÐ@ô “Y€GÜ˜|Ó,ò ‰	ˆˆTàÐ$Ò$ÙØ�}‰}‹ˆä�t˜^¨TÓ2Òc´g¸dÀJÐPTÓ6UÒcÔY]Ð^bÓYcˆØ�‹˜ÑŒðô " ,Ó/Ü˜“=ñð ùò Aùs   ‚B?�B:³B:·BB?ÚLITELLM_PROFILEÚfalseÚtruezgrowth of objectsz

Most common typesÚrootsz

Leaking objects)Úobjectsz@objgraph not found. Please install objgraph to use this feature.é
   z/memory-usageF)r&   Úinclude_in_schemac               ƒ   ó   K  — t        j                  «       } | j                  d«      }t        j                  d|«       |d d }g }|D ]@  }|j                  |j                  j                  d¬«      › d|j                  dz  › d�«       ŒB d	|iS ­w)
NÚlinenozTOP STATS: %sé2   rB   )Úlimitz: i   z KiBÚtop_50_memory_usage)	ÚtracemallocÚtake_snapshotÚ
statisticsr   ÚdebugÚappendÚ	tracebackÚformatÚsize)ÚsnapshotÚ	top_statsÚtop_50ÚresultÚstats        r$   Úmemory_usagerV   h   s�   è ø€ ô &×3Ñ3Ó5ˆØ#×.Ñ.¨xÓ8ˆ	Ü×"Ñ" ?°IÔ>ð " # 2˜ˆØˆØò 	XˆDØ�M‰M˜TŸ^™^×2Ñ2¸Ð2Ó<Ð=¸RÀÇ	Á	ÈDÑ@PÐ?QÐQUÐVÕWð	Xð & vÐ.Ð.ùs   ‚BBz/memory-usage-in-mem-cache)rC   Ú_c              ƒ   ó&  K  — ddl m}m}m} |€d}nSt	        |j
                  j                  j                  «      t	        |j
                  j                  j                  «      z   }t	        |j                  j                  «      t	        |j                  j                  «      z   }t	        |j                  j                  j                  j                  «      t	        |j                  j                  j                  j                  «      z   }|||dœS ­w)új
    1. user_api_key_cache
    2. router_cache
    3. proxy_logging_cache
    4. internal_usage_cache
    r   ©Ú
llm_routerÚproxy_logging_objÚuser_api_key_cache)Únum_items_in_user_api_key_cacheÚnum_items_in_llm_router_cacheÚ$num_items_in_proxy_logging_obj_cache)Úlitellm.proxy.proxy_serverr[   r\   r]   r   ÚcacheÚin_memory_cacheÚ
cache_dictÚttl_dictÚinternal_usage_cacheÚ
dual_cache)rW   r[   r\   r]   r_   r^   r`   s          r$   Úmemory_usage_in_mem_cacherh   |   sú   è ø€ ÷ñ ð ÐØ()Ñ%ä(+¨J×,<Ñ,<×,LÑ,L×,WÑ,WÓ(XÔ[^Ø×Ñ×,Ñ,×5Ñ5ó\
ñ )
Ð%ô .1Ð1C×1SÑ1S×1^Ñ1^Ó-_ÔbeØ×*Ñ*×3Ñ3ócñ .Ð#ô 36Ø×.Ñ.×9Ñ9×IÑI×TÑTó3äÐ×2Ñ2×=Ñ=×MÑM×VÑVÓWñ3XÐ(ð
 ,KØ)FØ0Tñð ùs   ‚DDz /memory-usage-in-mem-cache-itemsc              ƒ   ó®  K  — ddl m}m}m} |€i }i }n@|j                  j
                  j                  }|j                  j
                  j                  }|j
                  j                  |j
                  j                  |||j                  j                  j
                  j                  |j                  j                  j
                  j                  dœS ­w)rY   r   rZ   )r]   Úuser_api_key_ttlÚllm_router_cacheÚllm_router_ttlÚproxy_logging_obj_cacheÚproxy_logging_obj_ttl)
ra   r[   r\   r]   rb   rc   rd   re   rf   rg   )rW   r[   r\   r]   Úllm_router_in_memory_cache_dictÚllm_router_in_memory_ttl_dicts         r$   Úmemory_usage_in_mem_cache_itemsrq   £   sº   è ø€ ÷ñ ð ÐØ*,Ð'Ø(*Ñ%à*4×*:Ñ*:×*JÑ*J×*UÑ*UÐ'Ø(2×(8Ñ(8×(HÑ(H×(QÑ(QÐ%ð 1×@Ñ@×KÑKØ.×>Ñ>×GÑGØ;Ø7Ø#4×#IÑ#I×#TÑ#T×#dÑ#d×#oÑ#oØ!2×!GÑ!G×!RÑ!R×!bÑ!b×!kÑ!kñð ùs   ‚CCz/debug/memory/summaryÚreturnc              ƒ   ó  K  — ddl m}m}m} i }d}	 ddl}|j                  «       }|j                  «       }|j                  dz  }	|j                  «       }
|	d›d|
d›d�t        |	d	«      t        |
d	«      d
œ}|
dkD  rd}n
|
dkD  rd}nd}i }d}	 t        |j                  j                  «      }||z  }||d›ddœ|d<   |�9t        |j                   j                  j                  «      }||z  }||d›ddœ|d<   t        |j"                  j$                  j                  j                  «      }||z  }||d›ddœ|d<   t'        j(                  «       }t'        j*                  «       d   }t        t&        j,                  «      }|rdnd|dœ}|dkD  r|› d�|d<   t/        j0                  «       ||||dœ|dœS # t        $ r	 d|d<   Y �Œ:t        $ r}t        |«      |d<   Y d}~�ŒVd}~ww xY w# t        $ r}t        |«      |d<   Y d}~ŒÈd}~ww xY w­w)a  
    Get simplified memory usage summary for the proxy.

    Returns:
    - worker_pid: Process ID
    - status: Overall health based on memory usage
    - memory: Process memory usage and RAM info
    - caches: Cache item counts and descriptions
    - garbage_collector: GC status and pending object counts

    Example usage:
    curl http://localhost:4000/debug/memory/summary -H "Authorization: Bearer sk-1234"

    For detailed analysis, call GET /debug/memory/details
    For cache management, use the cache management endpoints
    r   rZ   ÚhealthyNé   ú.1fz MB (ú% of system memory)r   )ÚsummaryÚram_usage_mbÚsystem_memory_percentéP   Úcriticalé<   r   z8Install psutil for memory monitoring: pip install psutilÚerrorr   z,Validated API keys for faster authentication)ÚcountÚcount_readableÚwhat_it_storesÚuser_api_keysz$LLM responses for identical requestsÚllm_responsesz#Usage metrics before database writeÚusage_trackingÚenabledÚdisabled)ÚstatusÚobjects_awaiting_collectionz- uncollectable objects (possible memory leak))Útotal_itemsÚ	breakdown)Ú
worker_pidr‡   ÚmemoryÚcachesÚgarbage_collector)ra   r[   r\   r]   ÚpsutilÚProcessÚmemory_infoÚrssÚmemory_percentÚroundÚImportErrorÚ	ExceptionÚstrr   rc   rd   rb   rf   rg   r   Ú	isenabledÚ	get_countÚgarbageÚosÚgetpid)rW   r[   r\   r]   Úprocess_memoryÚhealth_statusr�   Úprocessr‘   Ú	memory_mbr“   r"   r�   Útotal_cache_itemsÚuser_cache_itemsÚrouter_cache_itemsÚlogging_cache_itemsÚ
gc_enabledÚobjects_pendingÚuncollectableÚgc_infos                        r$   Úget_memory_summaryr©   Å   sl  è ø€ ÷(ñ ð €NØ€Mð)ÛàŸ™Ó)ˆØ$×0Ñ0Ó2ˆØ&Ÿ?™?¨kÑ:ˆ	Ø '× 6Ñ 6Ó 8ˆð $ C˜¨¨n¸SÐ-AÐATÐUÜ! )¨QÓ/Ü%*¨>¸1Ó%=ñ
ˆð ˜BÒØ&‰MØ˜bÒ Ø%‰Mà%ˆMð %'€FØÐð!ä"%Ð&8×&HÑ&H×&SÑ&SÓ"TÐØÐ-Ñ-Ðà%Ø!1°!Ð 4ØLñ#
ˆˆÑð Ð!Ü(+¨J×,<Ñ,<×,LÑ,L×,WÑ,WÓ(XÐØÐ!3Ñ3Ðà+Ø%7¸Ð$:Ø"Hñ'ˆF�?Ñ#ô &)Ð):×)OÑ)O×)ZÑ)Z×)jÑ)j×)uÑ)uÓ%vÐØÐ0Ñ0Ðà(Ø!4°QÐ 7ØCñ$
ˆÐÑ ô Ÿ™›€JÜŸ\™\›^¨AÑ.€OÜœrŸz™z›?€Mñ  *‘)¨zØ'6ñ€Gð �qÒØ -˜Ð.[Ð\ˆ�	Ñô —i‘i“kØØ à,Øñ
ð %ñ	ð 	øôo ò ]Ø"\ˆ�wÔÜò )Ü"% a£&ˆ�w×ûð)ûôH ò !Ü˜a›&ˆˆwŽûð!üsg   ‚H’A7F2 Â	HÂB-G' Ä;A7HÆ2G$Ç HÇG$ÇGÇHÇG$Ç$HÇ'	HÇ0HÇ>HÈHÈHc                  óÈ  — t        j                  «       t        j                  «       d   t        j                  «       d   t        j                  «       d   ddœt        j                  «       d   t        j                  «       d   t        j                  «       d   ddœt	        t        j
                  «       «      D � �cg c]  \  } }| |d   |d   |d	   d
œ‘Œ c}} dœS c c}} w )z!Get garbage collector statistics.r   r   r   zENumber of allocations before automatic collection for each generation)Úgeneration_0Úgeneration_1Úgeneration_2Úexplanationz6Current number of allocated objects in each generationÚcollectionsÚ	collectedr§   )Ú
generationÚtotal_collectionsÚtotal_collectedr§   )r…   r!   Úcurrent_countsÚcollection_history)r   r˜   r   r™   r/   Ú	get_stats)ÚirU   s     r$   Ú_get_gc_statisticsr¸   <  sÑ   € ô —<‘<“>ä×,Ñ,Ó.¨qÑ1Ü×,Ñ,Ó.¨qÑ1Ü×,Ñ,Ó.¨qÑ1Øbñ	
ô ŸL™L›N¨1Ñ-ÜŸL™L›N¨1Ñ-ÜŸL™L›N¨1Ñ-ØSñ	
ô %¤R§\¡\£^Ó4÷
ñ ��4ð  Ø%)¨-Ñ%8Ø#'¨Ñ#4Ø!% oÑ!6ó	ó
ñð ùó
s   Â>CÚtop_nc                 ó   — t        «       }d}t        j                  «       D ])  }|dz  }t        |«      j                  }||xx   dz  cc<   Œ+ |j                  | «      D ��cg c]  \  }}|||d›dœ‘Œ }}}||fS c c}}w )z=Count objects by type and return total count and top N types.r   r   r   )Útyper   r€   )r   r   Úget_objectsr»   r)   Úmost_common)r¹   Útype_countsÚtotal_objectsÚobjÚobj_typer   Útop_object_typess          r$   Ú_get_object_type_countsrÃ   X  sš   € ä")£)€KØ€Mä�~‰~Óò #ˆØ˜ÑˆÜ˜“9×%Ñ%ˆØ�HÓ Ñ"Ôð#ð  +×6Ñ6°uÓ=÷áˆH�eð  EÀÀa¸yÓJðÐñ ð
 Ð*Ð*Ð*ùós   Á!A:c                  ó¶   — t         j                  } t        | «      | dd D �cg c]  }t        |«      j                  ‘Œ c}t        | «      dkD  rddœS ddœS c c}w )zEGet information about uncollectable objects (potential memory leaks).NrB   r   zIIf count > 0, you may have reference cycles preventing garbage collection)r   Úsample_typesr   )r   rš   r   r»   r)   )r§   rÀ   s     r$   Ú_get_uncollectable_objects_inforÆ   j  sc   € äŸ:™:€Mä�]Ó#Ø7DÀSÀbÐ7IÖJ°œ˜c›×+Ó+ÒJô �=Ó! AÒ%ð Xñ	ð ð ñð ùâJs   ¢Ac                 ó,  — i }	 t        j                  | j                  j                  «      }t        j                  | j                  j                  «      }t        | j                  j                  «      ||t        ||z   dz  d«      dœ|d<   |�§t        j                  |j                  j                  j                  «      }t        j                  |j                  j                  j                  «      }t        |j                  j                  j                  «      ||t        ||z   dz  d«      dœ|d<   t        j                  |j                  j                  j                  j                  «      }	t        j                  |j                  j                  j                  j                  «      }
t        |j                  j                  j                  j                  «      |	|
t        |	|
z   dz  d«      dœ|d<   |�§dt        |«      j                  d	œ|d
<   	 t        |d«      r}|j                  rqt        |j                  d«      r[|j                  j                  }t        |d«      r|j                  ndt        |d«      r|j                   j                  nddœ|d
   d<   |S ddi|d
<   	 |S # t"        $ r!}t%        j&                  d|«       Y d}~|S d}~ww xY w# t"        $ r/}t%        j&                  d|«       t)        |«      |d<   Y d}~|S d}~ww xY w)z&Calculate memory usage for all caches.ru   r   )Ú	num_itemsÚcache_dict_size_bytesÚttl_dict_size_bytesÚtotal_size_mbr]   Nrk   Úproxy_logging_cacheT)r…   Ú
cache_typeÚredis_usage_cacheÚredis_clientÚconnection_poolÚmax_connectionsÚconnection_class)rÑ   rÒ   z!Error getting Redis pool info: %sr…   Fz!Error calculating cache stats: %sr~   )ÚsysÚ	getsizeofrc   rd   re   r   r”   rb   rf   rg   r»   r)   ÚhasattrrÏ   rÐ   rÑ   rÒ   r–   r   rL   r—   )r]   r[   r\   rÎ   Úcache_statsÚuser_cache_sizeÚuser_ttl_sizeÚrouter_cache_sizeÚrouter_ttl_sizeÚlogging_cache_sizeÚlogging_ttl_sizeÚ	pool_infor"   s                r$   Ú_get_cache_memory_statsrÞ   x  sã  € à)+€Kð:&ä!$§¡Ð/A×/QÑ/Q×/\Ñ/\Ó!]ˆÜ"Ÿ}™}Ð-?×-OÑ-O×-XÑ-XÓYˆäÐ/×?Ñ?×JÑJÓKØ%4Ø#0Ü" O°mÑ$CÈÑ#TÐVWÓXñ	-
ˆÐ(Ñ)ð Ð!Ü'*§}¡}°Z×5EÑ5E×5UÑ5U×5`Ñ5`Ó'aÐÜ%(§]¡]°:×3CÑ3C×3SÑ3S×3\Ñ3\Ó%]ˆOä  ×!1Ñ!1×!AÑ!A×!LÑ!LÓMØ):Ø'6Ü!&Ð(9¸OÑ(KÐP[Ñ'\Ð^_Ó!`ñ	/ˆKÐ*Ñ+ô !Ÿ]™]Ð+<×+QÑ+Q×+\Ñ+\×+lÑ+l×+wÑ+wÓxÐÜŸ=™=Ð):×)OÑ)O×)ZÑ)Z×)jÑ)j×)sÑ)sÓtÐäÐ.×CÑC×NÑN×^Ñ^×iÑiÓjØ%7Ø#3Ü"Ð$6Ð9IÑ$IÈkÑ#ZÐ\]Ó^ñ	.
ˆÐ)Ñ*ð Ð(àÜ"Ð#4Ó5×>Ñ>ñ0ˆKÐ+Ñ,ð
SÜÐ,¨nÔ=ÐBS×B`ÒB`ÜÐ0×=Ñ=Ð?PÔQØ+<×+IÑ+I×+YÑ+Y˜	ô >EÀYÐPaÔ=b 	× 9Ò 9Ðhlô HOÈyÐZlÔGm 	× :Ñ :× CÒ CÐswñO˜Ð$7Ñ8Ð9JÑKð" Ðð 1:¸5Ð/AˆKÐ+Ò,ð Ðøô ò SÜ$×*Ñ*Ð+NÐPQ×RÐRð ÐûðSûô
 ò &Ü×"Ñ"Ð#FÈÔJÜ" 1›vˆ�GÕàÐûð	&úsC   „HK ÈB	J. Ê$K Ê.	KÊ7KËK ËKËK Ë	LË$$LÌLc                 ó¨  — i }	 | ��t        | d«      rT| j                  rHt        j                  | j                  «      }t	        | j                  «      |t        |dz  d«      dœ|d<   t        | d«      rT| j                  rHt        j                  | j                  «      }t	        | j                  «      |t        |dz  d«      dœ|d<   t        | d	«      rT| j                  rHt        j                  | j                  «      }t	        | j                  «      |t        |dz  d«      d
œ|d	<   t        | d«      rT| j                  rHt        j                  | j                  «      }t	        | j                  «      |t        |dz  d«      dœ|d<   t        | d«      rT| j                  rHt        j                  | j                  «      }t	        | j                  «      |t        |dz  d«      dœ|d<   t        j                  | «      }|t        |dz  d«      dœ|d<   |S ddi}	 |S # t        $ r.}t        j                  d|«       dt        |«      i}Y d}~|S d}~ww xY w)z/Get memory usage statistics for LiteLLM router.NÚ
model_listru   é   )Ú
num_modelsÚ
size_bytesÚsize_mbÚmodel_names)Únum_model_groupsrã   rä   Úmodel_names_setÚdeployment_names)Únum_deploymentsrã   rä   Údeployment_latency_map)Únum_tracked_deploymentsrã   rä   Ú	fallbacks)Únum_fallback_configsrã   rä   )rã   rä   Úrouter_objectÚnotezRouter not initializedz$Error getting router memory info: %sr~   )rÕ   rà   rÓ   rÔ   r   r”   rå   rè   rê   rì   r–   r   rL   r—   )	r[   Úlitellm_router_memoryÚmodel_list_sizeÚmodel_names_sizeÚdeployment_names_sizeÚlatency_map_sizeÚfallbacks_sizeÚrouter_obj_sizer"   s	            r$   Ú_get_router_memory_statsr÷   º  sK  € à,.Ðð:2ØÑ!ä�z <Ô0°Z×5JÒ5JÜ),¯©°z×7LÑ7LÓ)M�ä"% j×&;Ñ&;Ó"<Ø"1Ü$ _¸Ñ%DÀaÓHñ7Ð% lÑ3ô �z =Ô1°j×6LÒ6LÜ*-¯-©-¸
×8NÑ8NÓ*OÐ ä(+¨J×,BÑ,BÓ(CØ"2Ü$Ð%5¸Ñ%EÀqÓIñ<Ð%Ð&7Ñ8ô �zÐ#5Ô6¸:×;VÒ;VÜ/2¯}©}¸Z×=XÑ=XÓ/YÐ%ä'*¨:×+FÑ+FÓ'GØ"7Ü$Ð%:¸kÑ%JÈAÓNñ=Ð%Ð&8Ñ9ô �zÐ#;Ô<À×AbÒAbÜ*-¯-©-¸
×8YÑ8YÓ*ZÐ ä/2°:×3TÑ3TÓ/UØ"2Ü$Ð%5¸Ñ%EÀqÓIñCÐ%Ð&>Ñ?ô �z ;Ô/°J×4HÒ4HÜ(+¯©°j×6JÑ6JÓ(K�ä,/°
×0DÑ0DÓ,EØ"0Ü$ ^°{Ñ%CÀQÓGñ6Ð% kÑ2ô &)§]¡]°:Ó%>ˆOà-Ü  °KÑ!@À!ÓDñ6Ð! /Ñ2ð !Ð ð &,Ð-EÐ$FÑ!ð
 !Ð øô	 ò 2Ü×"Ñ"Ð#IÈ1ÔMØ!(¬#¨a«&Ð 1Ôà Ð ûð	2ús   „HH ÈH È	IÈ##IÉIr‹   Úinclude_process_infoc           	      ó  — |sy	 ddl }|j                  «       }|j                  «       }t        |j                  dz  d«      }t        |j
                  dz  d«      }t        |j                  «       d«      }| d| › d|d›d|d›d	�|d
dœ|ddœ|ddœt        |d«      r|j                  «       ndddœ|j                  «       ddœdœS # t        $ r | ddœcY S t        $ r.}t        j                  d|«       | t        |«      dœcY d}~S d}~ww xY w)z2Get process-level memory information using psutil.Nr   ru   r   zWorker PID z using rv   z MB of RAM (rw   z(Actual physical RAM used by this process)Ú	megabytesÚdescriptionz8Total virtual memory allocated (includes swapped memory)z)Percentage of total system RAM being used)Úpercentrû   Únum_fdszN/A (Windows)z'Number of open file descriptors/handles)r   rû   z(Number of active threads in this process)Úpidrx   Ú	ram_usageÚvirtual_memoryrz   Úopen_file_handlesÚthreadsz6psutil not installed. Install with: pip install psutil)rþ   r~   zError getting process info: %s)r�   r�   r‘   r”   r’   Úvmsr“   rÕ   rý   Únum_threadsr•   r–   r   rL   r—   )	r‹   rø   r�   rŸ   r‘   ry   Úvirtual_memory_mbr“   r"   s	            r$   Ú_get_process_memory_infor  ü  sA  € áØð(4ÛàŸ™Ó)ˆØ$×0Ñ0Ó2ˆÜ# K§O¡O°{Ñ$CÀQÓGˆÜ#(¨¯©¸KÑ)HÈ!Ó#LÐÜ % g×&<Ñ&<Ó&>ÀÓ Bˆð Ø$ Z L°¸ÀSÐ7IÈÐVdÐehÐUiÐi|Ð}à)ØIñð
 /ØYñð
 *ØJñ&ô
 07°wÀ	Ô/J˜'Ÿ/™/Ô+ÐP_ØHñ"ð
 !×,Ñ,Ó.ØIññ'
ð 	
øô0 ò 
àØMñ
ò 	
ô ò 4Ü×"Ñ"Ð#CÀQÔGØ!¬C°«FÑ3Õ3ûð4ús$   …B>C ÃD
ÃD
Ã#DÃ?D
ÄD
z/debug/memory/detailsé   z$Number of top object types to return)rû   TzInclude process memory infoc              ƒ   óø   K  — ddl m}m}m}m} t        j                  «       }t        «       }t        |«      \  }	}
t        «       }t        ||||«      }t        |«      }t        ||«      }||||	|	d›|
dœ|||dœS ­w)a…  
    Get detailed memory diagnostics for deep debugging.

    Returns:
    - worker_pid: Process ID
    - process_memory: RAM usage, virtual memory, file handles, threads
    - garbage_collector: GC thresholds, counts, collection history
    - objects: Total tracked objects and top object types
    - uncollectable: Objects that can't be garbage collected (potential leaks)
    - cache_memory: Memory usage of user_api_key, router, and logging caches
    - router_memory: Memory usage of router components (model_list, deployment_names, etc.)

    Query Parameters:
    - top_n: Number of top object types to return (default: 20)
    - include_process_info: Include process-level memory info using psutil (default: true)

    Example usage:
    curl "http://localhost:4000/debug/memory/details?top_n=30" -H "Authorization: Bearer sk-1234"

    All memory sizes are reported in both bytes and MB.
    r   )r[   r\   rÎ   r]   r   )Útotal_trackedÚtotal_tracked_readableÚ	top_types)r‹   r�   rŽ   rA   r§   Úcache_memoryÚrouter_memory)ra   r[   r\   rÎ   r]   r›   rœ   r¸   rÃ   rÆ   rÞ   r÷   r  )rW   r¹   rø   r[   r\   rÎ   r]   r‹   Úgc_statsr¿   rÂ   Úuncollectable_inforÖ   rð   Úprocess_infos                  r$   Úget_memory_detailsr  ,  sž   è ø€ ÷6ó ô Ÿ	™	›€Jô )Ó*€HÜ&=¸eÓ&DÑ#€MÐ#Ü ?Ó AÐÜ0Ð1CÀZÐQbÐduÓv€KÜ#;¸JÓ#GÐÜ2°:Ð?SÓT€Lð !Ø&Ø%à*Ø)6°qÐ(9Ø)ñ
ð
 ,Ø#Ø.ñð ùs   ‚A8A:z/debug/memory/gc/configurei¼  z%Generation 0 threshold (default: 700)z$Generation 1 threshold (default: 10)z$Generation 2 threshold (default: 10)r«   r¬   r­   c              ƒ   ó€  K  — t        j                  «       }	 t        j                  |||«       t        j                  d||||«       t        j                  «       d   }d|d   › d	|d
   › d	|d   › �|› d	|› d	|› �|d||z
  › d�dœS # t
        $ r+}t        j                  d|«       t        dd|› �¬«      ‚d}~ww xY w­w)aŒ  
    Configure Python garbage collection thresholds.

    Lower thresholds mean more frequent GC cycles (less memory, more CPU overhead).
    Higher thresholds mean less frequent GC cycles (more memory, less CPU overhead).

    Returns:
    - message: Confirmation message
    - previous_thresholds: Old threshold values
    - new_thresholds: New threshold values
    - objects_awaiting_collection: Current object count in gen-0
    - tip: Hint about when next collection will occur

    Query Parameters:
    - generation_0: Number of allocations before gen-0 collection (default: 700)
    - generation_1: Number of gen-0 collections before gen-1 collection (default: 10)
    - generation_2: Number of gen-1 collections before gen-2 collection (default: 10)

    Example for more aggressive collection:
    curl -X POST "http://localhost:4000/debug/memory/gc/configure?generation_0=500" -H "Authorization: Bearer sk-1234"

    Example for less aggressive collection:
    curl -X POST "http://localhost:4000/debug/memory/gc/configure?generation_0=1000" -H "Authorization: Bearer sk-1234"

    Monitor memory usage with GET /debug/memory/summary after changes.
    z-GC thresholds updated from %s to (%s, %s, %s)zFailed to set GC thresholds: %siô  zFailed to set GC thresholds: )Ústatus_codeÚdetailNr   zGC thresholds updatedz, r   r   zNext collection will run after z more allocations)ÚmessageÚprevious_thresholdsÚnew_thresholdsrˆ   Útip)	r   r   r   r   r   r–   r~   r   r™   )rW   r«   r¬   r­   Úold_thresholdsr"   Úcurrent_counts          r$   Ú configure_gc_thresholds_endpointr  g  s÷   è ø€ ôD ×,Ñ,Ó.€NðYÜ
×Ñ˜ |°\ÔBÜ×!Ñ!Ø;¸^È\Ð[gÐiuô	
ô Ÿ<™<›>¨!Ñ,€Mð +Ø"0°Ñ"3Ð!4°B°~ÀaÑ7HÐ6IÈÈNÐ[\ÑL]ÐK^Ð_Ø)˜N¨"¨\¨N¸"¸\¸NÐKØ'4Ø0°ÀÑ1MÐ0NÐN_Ð`ñð øô ò YÜ×"Ñ"Ð#DÀaÔHÜ¨Ð6SÐTUÐSVÐ4WÔXÐXûðYüs(   ‚B>˜0B Á?B>Â	B;Â&B6Â6B;Â;B>z/otel-spansc               ƒ   óÆ  K  — ddl m}  | €g i d dœS | j                  }t        |d«      r|j	                  «       }ng }t        d|«       d }d}i }|D ]j  }|j                  €Œ|j                  j                  }||vrg ||<   ||   j                  |j                  «       |j                  |kD  sŒ]|}|j                  }Œl |D �cg c]  }|j                  ‘Œ }}|||dœS c c}w ­w)Nr   )Úopen_telemetry_logger)Ú
otel_spansÚspans_grouped_by_parentÚmost_recent_parentÚget_finished_spanszSpans: i@B )ra   r  ÚOTEL_EXPORTERrÕ   r!  ÚprintÚparentÚtrace_idrM   r;   Ú
start_time)	r  Úotel_exporterÚrecorded_spansr   Úmost_recent_start_timer  ÚspanÚparent_trace_idÚ
span_namess	            r$   Úget_otel_spansr-  ¡  s  è ø€ õ AàÐ$àØ')Ø"&ñ
ð 	
ð 1×>Ñ>€MÜˆ}Ð2Ô3Ø&×9Ñ9Ó;‰àˆä	ˆ)�^Ô$àÐØ$ÐØ%'ÐØò 
9ˆØ�;‰;Ñ"Ø"Ÿk™k×2Ñ2ˆOØÐ&=Ñ=Ø;=Ð'¨Ñ8Ø# OÑ4×;Ñ;¸D¿I¹IÔFð �‰Ð!7Ó7Ø%4Ð"Ø)-¯©Ñ&ð
9ð 0>Ö> t˜Ÿ›Ð>€JÐ>à Ø#:Ø0ñð ùò ?ùs   ‚AC!Á AC!Â-C!ÃCÃC!c                  óª  — 	 t        d«      } | €y t        j                  j                  | «      ry t	        j
                  | «      }t        |t        «      sy |j                  dd «      }|j                  dd «      }|du rcdd l	}ddl
m}m}m} |j                  |j                  ¬«       |j                  |j                  ¬«        |j                  |j                  ¬«       |du rddd l	}ddl
m}m}m} |j                  |j                   ¬«       |j                  |j                   ¬«        |j                  |j                   ¬«       y |du rÛ|du rÖt        j"                  j                  d	d
«      }|�³|j%                  «       dk(  rFdd l	}ddl
m}m} |j                  |j                  ¬«        |j                  |j                  ¬«       y |j%                  «       dk(  rFdd l	}ddl
m}m} |j                  |j                   ¬«        |j                  |j                   ¬«       y y y y y # t&        $ r }	dd l	}|j)                  d|	«       Y d }	~	y d }	~	ww xY w)NÚWORKER_CONFIGrL   Údetailed_debugTr   )Úverbose_loggerr   Úverbose_router_logger)ÚlevelFÚLITELLM_LOGÚ ÚINFO)r   r2  ÚDEBUGz"Failed to init verbose loggers: %s)r
   r›   ÚpathÚisfileÚjsonÚloadsÚ
isinstancer3   ÚgetÚloggingÚlitellm._loggingr1  r   r2  ÚsetLevelr6  r7  ÚenvironÚupperr–   r   )
Úworker_configÚ	_settingsrL   r0  r>  r1  r   r2  Úlitellm_log_settingr"   s
             r$   Úinit_verbose_loggersrF  Ñ  s  € ðCAÜ-¨oÓ>ˆàÐ ØÜ�7‰7�>‰>˜-Ô(ØÜŸ:™: mÓ4ˆ	Ü˜)¤TÔ*Øà —}‘} W¨dÓ3ˆØ )§¡Ð.>ÀÓ EˆØ�D‰=Û÷ñ ð ×#Ñ#¨'¯,©,Ð#Ô7Ø!×*Ñ*°·±Ð*Ô>Ø)Ð ×)Ñ)°·±Õ=Ø˜TÑ!Û÷ñ ð ×#Ñ#¨'¯-©-Ð#Ô8Ø!×*Ñ*°·±Ð*Ô?Ø)Ð ×)Ñ)°·±Ö>Ø�e‰^ °%Ñ 7ä)+¯©¯©¸ÀrÓ)JÐØ"Ð.Ø&×,Ñ,Ó.°&Ò8Û"÷ð *×2Ñ2¸¿¹Ð2ÔFØ1Ð(×1Ñ1¸¿¹ÖEØ(×.Ñ.Ó0°GÒ;Û"÷ð
 *×2Ñ2¸¿¹Ð2ÔGØ1Ð(×1Ñ1¸¿¹ÖFð <ð /ð !8ˆ^øô4 ò AÛà�‰Ð<¸a×@Ñ@ûðAús6   ‚H) �H) °%H) ÁC2H) Å	BH) ÇAH) È)	IÈ2IÉI)>r,   r   r:  r›   rÓ   rI   r¯   r   Útypingr   r   Úfastapir   r   r   r	   Úlitellmr
   r?  r   Úlitellm.constantsr   Úlitellm.proxy._typesr   Ú$litellm.proxy.auth.user_api_key_authr   r   Ú__annotations__r%   r=  r<   rA  ÚlowerÚobjgraphr#  Úshow_growthÚshow_most_common_typesÚget_leaking_objectsr@   r•   ÚstartrV   rh   rq   r3   r—   r©   r¸   r   ÚtupleÚlistrÃ   rÆ   rÞ   r÷   Úboolr  r  Úpostr  r-  rF  © ó    r$   ú<module>rZ     sõ  ðä Û 	Û Û 	Û 
Û Ý ß ç <Ó <å "Ý 1Ý 1Ý /Ý Bá“€ˆÓ òñ8 Ô ð ‡�ØÙÐ+Ó,Ð-ð ó ñó	ðð< ‡:�:‡>�>Ð# WÓ-×3Ñ3Ó5¸Ò?ð^ÛáÐ!Ô"Øˆ×ÑÔÙÐ%Ô&Ø'ˆ×'Ñ'Ô)Ø3�x×3Ñ3Ó5ˆˆuÓ5ÙÐ#Ô$Ø'ˆ×'Ñ'°Õ6ð €K×Ñ�bÔà‡Z�ZØÙÐ/Ó0Ð1Øð ó ñ
/óð
/ð ‡�Ð(¸E€ÓBáÐ 1Ó2ñ#Øò#ó Cð#ðL ‡�Ð.À%€ÓHáÐ 1Ó2ñØòó IððB ‡�Ð#°u€Ó=áÐ 1Ó2ñsØðsà	ˆ#ˆsˆ(�^òsó >ðsðl˜D  c ™Nó ð8+ 3ð +¨5°°d¸4ÀÀSÀ¹>Ñ6JÐ1JÑ+Kó +ð$¨¨c°3¨h©ó ð?ÐeiÐjmÐorÐjrÑesó ?ðD?!¨D°°c°©Nó ?!ðD-4¨ð -4ÀDð -4ÈTÐRUÐWZÐRZÉ^Ð^bÑMbó -4ð` ‡�Ð#°u€Ó=áÐ 1Ó2Ù�rÐ'MÔNÙ!& tÐ9VÔ!Wñ7Øð7àð7ð ð7ð 
ˆ#ˆsˆ(�^ò	7ó >ð7ðt ‡�Ð)¸U€ÓCáÐ 1Ó2Ù˜cÐ/VÔWÙ˜bÐ.TÔUÙ˜bÐ.TÔUñ	6Øð6àð6ð ð6ð ð	6ð
 
ˆ#ˆsˆ(�^ò6ó Dð6ðr ‡�ØÙÐ+Ó,Ð-Øð ó ñ
'óð
'óVDAøð] ò ^ÙÐ\Ó]Ð]ð^ús   Â6A'K ËK