Team Ai
Apppublic

Yash030/claude-code-proxy

sourceHugging Faceupdated 5mo agoView on Hugging Face
2likes
session_tracker.cpython-314.pyc136 linesDownload Raw Back to __pycache__
1+
2T�j�!����Rt^RIHt^RIt^RIt^RIHt^RIHt^RI	H3t4^RIHt]!RR7!R	R544t
]!RRR7!RR
44t]!RRR7!RR44t!RR4tR#)zVSession-aware request tracking for fair resource sharing across Claude Code instances.)�annotationsN)�defaultdict)�	dataclass)�ClassVar)�loggerT)�slotsc�F�]tRt^t$Rt^tR]R&RtR]R&^tR]R&Rt	R	#)6�SessionStatez0State for a single session across all providers.�int�requests_in_windowg�float�last_request_time�total_requests�N)7�__name__�8__module__�__qualname__�__firstlineno__�__doc__r�__annotations__r
r�__static_attributes__r��?C:\Users\yashw\.claude\claude-code-free\core\session_tracker.pyr	r	s%��:�����"��u�"��N�C�rr	)�frozenrc�N�]tRt^t$RtR]R&R]R&R]R&R]R&R	]R9&RtR#)
�ProviderLoadz'Load information for a single provider.�str�provider_idr10�active_requests�
session_countr�requests_per_minute�bool�11is_healthyrN�rrrrrrrrrrrrs#��1����������rrc�:�]tRt^"t$RtR]R&R]R&R]R&RtR	#)12�SessionLoadz4Load information for a session across all providers.r�13session_idr14rzdict[str, int]�	providersrNr#rrrr%r%"s��>��O����rr%c��]tRt^+t$RtRtR]R&R^2RRR^/R	R15llt]RRl4t	]R
Rl4t16RRltRRltRRlt
RRltRRltRRltR*RRlltR+RRlltRR ltR!R"ltR#R$ltR+R%R&lltR'R(ltR)tR#),�SessionTrackerz�17Track request rates per session and per provider for fair resource sharing.18 19This enables multiple Claude Code instances to share the proxy efficiently20without one session starving others.21NzClassVar[SessionTracker | None]�	_instance�max_sessions�window_secondsgN@�per_session_rate_limitc�$�V^8�dQhRRRRRR/#)�r+r22r,rr-r)�formats"r�__annotate__�SessionTracker.__annotate__5s*��23�24��25��	26�27!$�28rc	��\VR4'dR#/Vn\R4Vn\\4VnWnW nW0n\P!4VnRVn\P!RVVV4R#)�_initializedNc� �\\4#�N)rr29rrr�<lambda>�)SessionTracker.__init__.<locals>.<lambda>As	��K��$rTzRSessionTracker initialized (max_sessions={}, window={}s, per_session_limit={}/min))�hasattr�	_sessionsr�_session_requestsr30�_provider_active�
_max_sessions�_window_seconds�_per_session_rate_limit�asyncio�Lock�_lockr4r�info)�selfr+r,r-s&$$$r�__init__�SessionTracker.__init__5sy���4��(�(��24���<G�$�=31���1<�C�0@���)��-��'=�$��\�\�^��32� ������`���"�		33rc��V^8�dQhRR/#)r/�returnr)r)r0s"rr1r2Rs����~�rc
�P�VPfV!R/VBVnVP#)z%Get or create the singleton instance.r�r*)�cls�kwargss&,r�get_instance�SessionTracker.get_instanceQs%���=�=� ��M�&�M�C�M��}�}�rc��V^8�dQhRR/#�r/rH�Noner)r0s"rr1r2Ys����t�rc
��RVnR#)zReset singleton (for testing).NrJ)rKs&r�reset_instance�SessionTracker.reset_instanceXs����
rc��V^8�dQhRR/#rPr)r0s"rr1r2]s��0�0�t�0rc
�X�\P!4pWP^,,34pVPP	4UUu.uFwr4VP35V8gKVNK	pppVF/pVPVW0P9gK"VPVK1	R#uuppi)z(Remove sessions with no recent activity.N)�time�	monotonicr>r:�itemsr
r;)rD�now�cutoff�sid�state�	to_removes&     r�_cleanup_old_sessions�$SessionTracker._cleanup_old_sessions]s����n�n����,�,�q�0�1��#�n�n�2�2�4�36�4�37���&�&��/�
�C�4�	�38�39�C����s�#��,�,�,��*�*�3�/���40s�B&�&B&c��V^8�dQhRR/#rPr)r0s"rr1r2ks��L�L�D�Lrc
�41�VP'gR#\VPP4RR7^,pVPVWP9dVPV\P42!RV4R#)z3Evict least recently used session when at capacity.Nc�(�V^,P#)�)r
)�xs&rr7�3SessionTracker._evict_lru_session.<locals>.<lambda>os��A�a�D�<R�<Rr��keyz(SessionTracker: Evicted LRU session '{}')r:�minrYr;r�warning)rD�lru_sids& r�_evict_lru_session�!SessionTracker._evict_lru_sessionksc���~�~�~���d�n�n�*�*�,�2R�S�TU�V���N�N�7�#��,�,�,��&�&�w�/����A�7�Krc�$�V^8�dQhRRRRRR/#�r/r&rrrHrQr)r0s"rr1r2us!��:�:�c�:��:��:rc�
�0"�VPW4R#5i)z:Record a request for a session to a provider (async-safe).N)�_track_request_sync�rDr&rs&&&r�
track_request�SessionTracker.track_requestus���� � ��9�s�c�$�V^8�dQhRRRRRR/#ror)r0s"rr1r2ys!��0�0�S�0�s�0�t�0rc
��WP9dL\VP4VP8�dVP4\	4VPV&VPV,pV;P43^,
un\P!4VnV;P^,
un	VPV,V;;,^,
uu&VPV;;,^,
uu&R#)zIRecord a request for a session to a provider (sync version for hot path).N)r:�lenr=rlr	rrWrXr
rr;r<)rDr&rr]s&&& r�track_request_sync�!SessionTracker.track_request_syncys����^�^�+��4�>�>�"�d�&8�&8�8��'�'�)�)5��D�N�N�:�&����z�*��
� � �A�%� �"&�.�.�"2���
����!�����z�*�;�7�1�<�7����k�*�a�/�*rc�$�V^8�dQhRRRRRR/#ror)r0s"rr1r2�s!��>�>�C�>�c�>�d�>rc�
��"�VP;_uu_4GRjx�L44VPW4RRR4GRjx�L45R#L'L +GRjx�L46'giR#;i5i)zQAsync version with lock for when called from async contexts that need guarantees.N)rBrqrrs&&&r�track_request_async�"SessionTracker.track_request_async�s-����:�:�:�:��$�$�Z�=��:�:�:�:�:�sG�A$�A�A$�A�A$�A�A$�A$�A!	�
A�47A!	�A!	�	A$c�$�V^8�dQhRRRRRR/#ror)r0s"rr1r2�s!������#��$�rc�
�"�VP;_uu_4GRjx�L48\^VPV,^,494VPV&RRR4GRjx�L50R#LGL +GRjx�L51'giR#;i5i)z0Release a request slot when streaming completes.N)rB�maxr<rrs&&&r�release_request�SessionTracker.release_request�sI����:�:�:�:�14��4�(�(��5��9�2�D�!�!�+�.��:�:�:�:�:�sJ�B�A#�B�2A'�B�A%�B�%B�'B	�-A0�.52B	�9B	�;	Bc�$�V^8�dQhRRRRRR/#)r/rr�blockedr!rHrr)r0s"rr1r2�s$��53�54��55�)-�56�	�57rc
��aa�\VV3RlSP44p\VV3RlSP44p\SSPP	S^4VVV'*R7#)z,Get current load information for a provider.c3�|<"�TF1pSPV,PS^4^8�gK-^x�K3	R#5i��N�r;�get��.0r\rrDs& ��r�	<genexpr>�3SessionTracker.get_provider_load.<locals>.<genexpr>�s:����58�%���%�%�c�*�.�.�{�A�>��B�
�A�%�s�*<�59<c3�j<"�TF(pSPV,PS^4x�K*	R#5ir�r�r�s& ��rr�r��s/����60�GU��D�"�"�3�'�+�+�K��;�;�~�s�03)rrrr r")�sumr:rr<r�)rDrr�rrsff&  r�get_provider_load� SessionTracker.get_provider_load�sp����61��~�~�62�63�
�64�65�GK�~�~�66�67���#� �1�1�5�5�k�1�E�'� .�"�{�68�	69rc� �V^8�dQhRRRR/#)r/�blocked_providers�set[str] | NonerHzdict[str, ProviderLoad]r)r0s"rr1r2�s��70�71�!0�72�	 �73rc	
�>�T;'g\4p\VPP44pVPF.pVPV,FpVP	V4K	K0	VUu/uFqfVPWfV94bK	up#uupi)z'Get load information for all providers.)�setr<�keysr;�addr�)rDr�r��
all_providersr\r�pids&&     r�get_all_provider_loads�%SessionTracker.get_all_provider_loads�s���$�,�,�s�u���D�1�1�6�6�8�9�
��)�)�C�#�5�5�c�:�:���!�!�+�.� ;�*�74IV�75�HU���'�'��G�^�<�<�
�76�	77��78s�:Bc� �V^8�dQhRRRR/#)r/r&rrHzSessionLoad | Noner)r0s"rr1r2�s��79�80�3�81�3E�82rc
��WP9dR#VPV,p\VPV,4p\VVPVR7#)z,Get load information for a specific session.N)r&rr')r:�dictr;r%r)rDr&r]�provider_countss&&  r�get_session_load�SessionTracker.get_session_load�sN���^�^�+�����z�*���t�5�5�j�A�B���!� �/�/�%�83�	84rc��V^8�dQhRR/#)r/rHzdict[str, SessionLoad]r)r0s"rr1r2�s��85�86�'=�87rc
��VPUu/uF)pVPV4fKWPV4bK+	up#uupi)z-Get load information for all active sessions.)r:r�)rDr\s& r�get_all_session_loads�$SessionTracker.get_all_session_loads�sK���~�~�88�%���$�$�S�)�
,�C�&�&�s�+�+�%�89�	90��91s92�A�Ac� �V^8�dQhRRRR/#)r/r&rrHztuple[bool, str]r)r0s"rr1r2�s����c��>N�rc�
�"�VP;_uu_4GRjx�L93WP9dRuuRRR4GRjx�L94#VPV,pVPVP8�d2RRVPRVPR23uuRRR4GRjx�L95#RuuRRR4GRjx�L96#L�LzLL +GRjx�L97'giR#;i5i)zP98Check if a session is within its rate limit.99 100Returns (allowed, reason) tuple.101NFzrate limit exceeded (�/z/min))Tznew session)T�ok)rBr:rr?)rDr&r]s&& r�check_session_allowed�$SessionTracker.check_session_allowed�s�����:�:�:�:����/�*��:�:��N�N�:�.�E��'�'�$�*F�*F�F��+�E�,D�,D�+E�Q�t�Gc�Gc�Fd�di�j��
�:�:���:�:�:�:�:�:�s��C�B7�C�B?�
C�B9�C�AB?�
C�B;�C�#B?�$
C�1B=�2C�9C�;C�=C�?C	�C�102C	�C	�	Cc�$�V^8�dQhRRRRRR/#)r/�103candidatesz	list[str]r�r�rHr)r0s"rr1r2�s(��104�105��106�+�107�108�	109rc
�Raa�T;'g\4o\VVV3RlR7#)zb110Return candidates sorted by health/load priority.111 112Healthy providers with lower load come first.113c�F<�VS9SPPV^43#)r�)r<r�)r�r�rDs&��rr7�>SessionTracker.get_healthy_provider_priority.<locals>.<lambda>�s%����w���%�%�)�)�#�q�1�rrg)r��sorted)rDr�r�r�sf&&@r�get_healthy_provider_priority�,SessionTracker.get_healthy_provider_priority�s)���$�,�,�s�u�����114�	115rc��V^8�dQhRR/#)r/rHr�r)r0s"rr1r2�s��116�117�t�118rc
��R\VP4R\VP4R\VP4/#)zReturn current statistics.�active_sessions�total_providers�provider_active)rwr:r<r�)rDs&r�stats�SessionTracker.stats�s<��
�s�4�>�>�2��s�4�#8�#8�9��t�D�$9�$9�:�119�	120r)r4rBr=r?r<r;r:r>)Fr6)rrrrrr*rrE�classmethodrMrSr_rlrsrxr|r�r�r�r�r�r�r�r�rrrrr)r)+s����26�I�.�5�121��122�!%�	123�124')�125�8��������0�L�:�0�">�126�127�*128� 129�130��&131�&132�133rr))r�134__future__rr@rW�collectionsr�dataclassesr�typingr�logururr	rr%r)rrr�<module>r�s���\�"���#�!�����������$�d�#���$���$�d�#���$��R135�R136r