
    qiQ                     D   S r SSKrSSKrSSKrSSKJr  SSKJrJr  SSK	J	r	J
r
  SSKJr  SSKJrJrJrJrJr  SSKJr   " S	 S
\5      r\ " S S5      5       r\ " S S5      5       r\ " S S5      5       r\ " S S5      5       r " S S5      rS r\S:X  a  \" 5         gg)a  
GENESIS GEMINI RATE MAXIMIZER
==============================
Intelligent rate limit tracking and request scheduling to maximize
utilization of Gemini API credits while staying just under limits.

Features:
- Multi-model load balancing based on current utilization
- Sliding window tracking for RPM/TPM/RPD
- Predictive scheduling to hit 90-95% of limits
- Automatic failover when models hit limits
- Burst detection and proactive throttling

Usage:
    maximizer = GeminiRateMaximizer()

    # Get best available model
    model = maximizer.get_best_model(token_estimate=1000)

    # Record usage after request
    maximizer.record_usage(model, input_tokens=500, output_tokens=1000)

    # Get utilization report
    report = maximizer.get_utilization_report()
    Ndeque)	dataclassfield)datetime	timedelta)Path)DictListOptionalAnyTuple)Enumc                   8    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrg)TaskType'   z#Task types for intelligent routing.researchcode_generationcode_reviewarchitecturesimple_extractionclassificationsummarizationgeneral N)__name__
__module____qualname____firstlineno____doc__RESEARCHCODE_GENERATIONCODE_REVIEWARCHITECTURESIMPLE_EXTRACTIONCLASSIFICATIONSUMMARIZATIONGENERAL__static_attributes__r       /E:\genesis-system\core\gemini_rate_maximizer.pyr   r   '   s.    -H'OK!L+%N#MGr*   r   c                   r    \ rS rSr% Sr\\S'   \\S'   \\S'   \\S'   \\S'   \\S'   \" \	S	9r
\\   \S
'   Srg)ModelLimits3   zRate limits for a single model.rpmtpmrpdprioritycost_per_million_inputcost_per_million_outputdefault_factory	use_casesr   N)r   r   r   r   r    int__annotations__floatr   listr7   r   strr)   r   r*   r+   r-   r-   3   s8    )	H	H	HM!!"" 6ItCy6r*   r-   c                       \ rS rSr% Sr\" S S9r\\S'   \" S S9r	\\S'   Sr
\\S	'   Sr\\S
'   \" \R                  S9r\\S'   S rS rS\4S jrS\4S jrS\4S jrSrg)UsageWindow?   z"Sliding window for tracking usage.c                      [        SS9$ N'  )maxlenr   r   r*   r+   <lambda>UsageWindow.<lambda>B   s	    E4Gr*   r5   requestsc                      [        SS9$ rA   r   r   r*   r+   rD   rE   C   s	    %u2Er*   tokensr   daily_requestsdaily_tokenslast_daily_resetc                    [         R                   " 5       S-
  nU R                  (       aY  U R                  S   S   U:  aC  U R                  R                  5         U R                  (       a  U R                  S   S   U:  a  MC  U R                  (       a\  U R                  S   S   U:  aE  U R                  R                  5         U R                  (       a  U R                  S   S   U:  a  MC  gggg)z#Remove entries older than 1 minute.<   r   N)timerF   popleftrH   )selfcutoffs     r+   cleanup_minute_window!UsageWindow.cleanup_minute_windowH   s    r!mma 0 3f <MM!!# mma 0 3f <kkdkk!nQ/&8KK! kkdkk!nQ/&8k8kr*   c                 |    [         R                   " 5       nXR                  -
  S:  a  SU l        SU l        Xl        gg)z)Reset daily counters at midnight Pacific.iQ r   N)rN   rK   rI   rJ   )rP   nows     r+   check_daily_resetUsageWindow.check_daily_resetP   s9    iik&&&."#D !D$'! /r*   returnc                 L    U R                  5         [        U R                  5      $ )z Get current requests per minute.)rR   lenrF   rP   s    r+   get_rpmUsageWindow.get_rpmY   s    ""$4==!!r*   c                 Z    U R                  5         [        S U R                   5       5      $ )zGet current tokens per minute.c              3   *   #    U  H	  oS    v   M     g7f)   Nr   ).0ts     r+   	<genexpr>&UsageWindow.get_tpm.<locals>.<genexpr>a   s     -AQ4s   )rR   sumrH   r[   s    r+   get_tpmUsageWindow.get_tpm^   s#    ""$----r*   c                    [         R                   " 5       nU R                  R                  U45        U R                  R                  X!45        U =R                  S-  sl        U =R
                  U-  sl        U R                  5         g)z"Record a request with token count.r`   N)rN   rF   appendrH   rI   rJ   rV   )rP   rH   rU   s      r+   recordUsageWindow.recordc   sc    iikcV$C=)q V# r*   )rI   rJ   rK   N)r   r   r   r   r    r   rF   r   r9   rH   rI   r8   rJ   rN   rK   r:   rR   rV   r\   rf   rj   r)   r   r*   r+   r>   r>   ?   s{    ,,GHHeH*EFFEFNCL##DII>e>"(" "
. .
!S !r*   r>   c                   B    \ rS rSr% Sr\\S'   \\S'   \\S'   \\S'   Srg)	ScheduledRequestm   z"A request scheduled for execution.modeldelay_secondsreasonutilizationr   N)	r   r   r   r   r    r<   r9   r:   r)   r   r*   r+   rm   rm   m   s    ,JKr*   rm   c                   f    \ rS rSr% Sr\\S'   \\\\\4   4   \S'   \\S'   \	\S'   \
\   \S'   Srg	)
UtilizationReportv   z"Utilization report for all models.	timestampmodels
best_modeltotal_capacity_usedrecommendationsr   N)r   r   r   r   r    r<   r9   r
   r   r:   r   r)   r   r*   r+   rt   rt   v   s7    ,Nd38n$%%O#Yr*   rt   c            	          \ rS rSrSr\" S5      r\" S5      rSS\4S jjrS\	4S	 jr
S\	4S
 jrS rS\S\	\\4   4S jrS\S\	\\4   4S jrS\R&                  4S\S\S\4S jjr S S\S\S\S\4S jjrS\S\S\S\4S jrS\R&                  S4S\S\S\S\4S jjrS\4S jrS\\\4   4S jrS\	\\4   4S jrSrg)!GeminiRateMaximizer   z
Intelligent Gemini API rate limit maximizer.

Tracks usage across all models and routes requests to maximize
throughput while staying within limits.
z0E:/genesis-system/config/gemini_rate_limits.jsonz1E:/genesis-system/data/rate_maximizer_usage.jsonlNconfig_pathc                     U=(       d    U R                   U l        U R                  5       U l        0 U l        0 U l        [        R                  " 5       U l        U R                  5         g N)
CONFIG_PATHr~   _load_configconfigrw   usage_windows	threadingRLock_lock_initialize_models)rP   r~   s     r+   __init__GeminiRateMaximizer.__init__   sN    &:$*:*:'').057__&
!r*   rX   c                 
   U R                   R                  5       (       a5  [        U R                   5       n[        R                  " U5      sSSS5        $ U R                  5       $ ! , (       d  f       U R                  5       $ = f)z"Load configuration from JSON file.N)r~   existsopenjsonload_default_config)rP   fs     r+   r    GeminiRateMaximizer._load_config   sa    ""$$d&&'1yy| ('##%% ('##%%s   A%%
Bc                 (    SSSSSSS.SSS	S
S.S.S.$ )z(Default configuration if file not found.?g?   i@B i  r`   )r/   r0   r1   r2           )gemini-2.5-flashzgemini-2.5-pro)target_utilizationsafety_marginrw   r   r[   s    r+   r   #GeminiRateMaximizer._default_config   s3     #'!,/Z[$\*-gdXY"Z
 	
r*   c                    U R                   R                  S0 5      R                  5        H  u  p[        UR                  SS5      UR                  SS5      UR                  SS5      UR                  SS	5      UR                  S
S5      UR                  SS5      UR                  SS/5      S9U R                  U'   [        5       U R                  U'   M     g)z$Initialize model limits from config.rw   r/   d   r0   i r1   r2   
   r3   g?r4   g?r7   r   )r/   r0   r1   r2   r3   r4   r7   N)r   getitemsr-   rw   r>   r   )rP   
model_namemodel_configs      r+   r   &GeminiRateMaximizer._initialize_models   s    (,"(E(K(K(M$J&1 $$UC0 $$UF3 $$UB/%))*b9'3'7'78PRV'W(4(8(89RTX(Y&**;D'DKK
# .9]Dz* )Nr*   ro   c           	      R   U R                      XR                  ;  a  SSSSS.sSSS5        $ U R                  U   nU R                  U   nUR                  S:  a  UR	                  5       UR                  -  OSnUR
                  S:  a  UR                  5       UR
                  -  OSnUR                  S:  a  UR                  UR                  -  nOSnUUU[        XEU5      UR	                  5       UR                  5       UR                  S.sSSS5        $ ! , (       d  f       g= f)zs
Get current utilization percentages for a model.

Returns:
    Dict with rpm_util, tpm_util, rpd_util percentages
r   )rpm_utiltpm_utilrpd_utilmax_utilN)r   r   r   r   current_rpmcurrent_tpmrI   )
r   rw   r   r/   r\   r0   rf   r1   rI   max)rP   ro   limitswindowr   r   r   s          r+   get_model_utilization)GeminiRateMaximizer.get_model_utilization   s     ZZKK'$%1!QRS Z [['F''.F8>

Qv~~'&**4AH8>

Qv~~'&**4AHzzA~!006::= %$$H=%~~/%~~/"("7"7 ZZs   DC!D
D&c           	         U R                      XR                  ;  a  SSSS.sSSS5        $ U R                  U   nU R                  U   nU R                  R	                  SS5      n[        UR                  U-  5      UR                  5       -
  n[        UR                  U-  5      UR                  5       -
  nUR                  S:  a&  [        UR                  U-  5      UR                  -
  nO[        S5      n[        SU5      [        SU5      U[        S5      :w  a  [        S[        U5      5      OSS.sSSS5        $ ! , (       d  f       g= f)za
Get available capacity for a model.

Returns remaining RPM, TPM, and RPD before hitting limits.
r   )rpm_availabletpm_availablerpd_availableNr   r   infr   )r   rw   r   r   r   r8   r/   r\   r0   rf   r1   rI   r:   r   )rP   ro   r   r   targetr   r   r   s           r+   get_available_capacity*GeminiRateMaximizer.get_available_capacity   s    ZZKK')*QQRS Z [['F''.F[[__%94@F

V 34v~~7GGM

V 34v~~7GGMzzA~ #FJJ$7 86;P;P P %e "%Q!6!$Q!6?LPUV[P\?\QM(:!;bd! ZZs   E D
E  
Er   token_estimate	task_typec                    U R                      U R                  R                  S0 5      R                  S0 5      nUR                  U;   a<  X2R                     nU R	                  U5      nUS   S:  a  US   U:  a  UsSSS5        $ SnSn[        U R                  R                  5       S S	9nU H  u  pU R	                  U	5      nUS   S::  a  M!  US   U:  a  M,  US
   S:X  a  M7  SU
R                  -
  S-  nUS   S-  US   S-  S-  -   US
   S:  a  US
   OSS-  -   nX-   nX:  d  M|  UnU	nM     Uc,  U R                  R                  S0 5      R                  SS5      nUsSSS5        $ ! , (       d  f       g= f)z
Select the best available model based on current utilization.

Args:
    token_estimate: Estimated tokens for the request
    task_type: Type of task for intelligent routing

Returns:
    Model name with most available capacity
routing_rulestask_routingr   r   r   Nr   c                      U S   R                   $ )Nr`   )r2   )xs    r+   rD   4GeminiRateMaximizer.get_best_model.<locals>.<lambda>  s    admmr*   )keyr   r   r         ?r   333333?rB   皙?default_modelr   )	r   r   r   valuer   sortedrw   r   r2   )rP   r   r   r   	preferredcapacityrx   
best_scoresorted_modelsr   r   priority_bonuscapacity_scorescores                 r+   get_best_model"GeminiRateMaximizer.get_best_model   s    ZZ;;???B?CCNTVWL,.(9	66yAO,q0Xo5NR`5`$ Z JJ #!!#+M
 '4"
66zB O,1O,~=O,1 #%v"6#!=_-3_-4s:;2:?2Ka2OXo.UZ^aab  '7%!&J!+J1 '46 !![[___bAEE#%7
 g ZZs   A/E-B!E-+8E--
E;input_tokensoutput_tokenssuccessc                    U R                      XR                  ;  a  [        5       U R                  U'   X#-   nU R                  U   R                  U5        U R	                  XX45        SSS5        g! , (       d  f       g= f)z
Record API usage for a model.

Args:
    model: Model name
    input_tokens: Number of input tokens
    output_tokens: Number of output tokens
    success: Whether the request succeeded
N)r   r   r>   rj   
_log_usage)rP   ro   r   r   r   total_tokenss         r+   record_usage GeminiRateMaximizer.record_usage4  sd      ZZ...,7M""5)'7Lu%,,\: OOEH ZZs   AA11
A?c           	      t   U R                   R                  R                  SSS9  [        R                  " 5       R                  5       UUUX#-   UU R                  U5      S.n[        U R                   S5       nUR                  [        R                  " U5      S-   5        SSS5        g! , (       d  f       g= f)zLog usage to JSONL file.T)parentsexist_ok)rv   ro   r   r   r   r   rr   a
N)USAGE_LOG_PATHparentmkdirr   rU   	isoformatr   r   writer   dumps)rP   ro   r   r   r   entryr   s          r+   r   GeminiRateMaximizer._log_usageN  s     	""(((E "113(*(855e<
 $%%s+qGGDJJu%,- ,++s   7)B))
B7   r2   c                    U R                      U R                  X5      nU R                  U5      nU R                  U5      nSnSnUS   S::  a  SU R                  U   R
                  -  nSnOWUS   U:  a'  SXS   -
  -  U R                  U   R                  -  nSnO'US	   U R                  R                  S
S5      :  a  SnSn[        UUUUS	   S9sSSS5        $ ! , (       d  f       g= f)a  
Schedule a request with optimal timing and model selection.

Args:
    token_estimate: Estimated tokens for the request
    task_type: Type of task
    priority: Request priority (1-10, lower = higher priority)

Returns:
    ScheduledRequest with model, delay, and reason
g        	immediater   r   g      N@rpm_throttler   tpm_throttler   burst_detection_thresholdg333333?r   burst_prevention)ro   rp   rq   rr   N)
r   r   r   r   rw   r/   r0   r   r   rm   )	rP   r   r   r2   rx   r   rr   delayrq   s	            r+   schedule_request$GeminiRateMaximizer.schedule_requeste  s    " ZZ,,^GJ22:>H44Z@K E F(A-t{{:6:::'/*^;/1J JKdkkZdNeNiNii'Z(4;;??;VX\+]]+# #'
3	- ZZs   CC
C*c           	      \   U R                      0 nSnSnU R                   H~  nU R                  U5      nU R                  U5      nU R                  U   nUUUR                  UR
                  UR                  S.UR                  S.X'   X'R                  -  nX5S   -  nM     / nUR                  5        H2  u  pIU	S   S   S:  d  M  UR                  SU S	U	S   S   S
 S35        M4     UR                  5        H2  u  pIU	S   S   S:  d  M  UR                  SU SU	S   S   S
 S35        M4     US:  a  X2-  OSn
U
S:  a  UR                  SU
S
 S35        [        [        R                  " 5       R                  5       UU R                  5       U
US9sSSS5        $ ! , (       d  f       g= f)zu
Generate comprehensive utilization report.

Returns:
    UtilizationReport with all model stats and recommendations
r   )r/   r0   r1   )rr   r   r   r2   r   rr   r   r   zModel z is underutilized (.1%z'). Consider routing more requests here.gffffff?z is near capacity (z+). Consider load balancing to other models.zOverall utilization is low (z/). Enable research tasks to fill idle capacity.)rv   rw   rx   ry   rz   N)r   rw   r   r   r/   r0   r1   r2   r   ri   rt   r   rU   r   r   )rP   models_reporttotal_capacity
total_usedr   utilr   r   rz   reportoverall_utils              r+   get_utilization_report*GeminiRateMaximizer.get_utilization_report  s    ZZMNJ"kk
11*=66zBZ0 $( (%zz%zz%zz
 !'	-) **,=11
% ** !O '4&9&9&;"
-(4s:#** ,?}@UV`@abe?f g? @ '< '4&9&9&;"
-(4t;#** ,?}@UV`@abe?f gC D '< ;I1:L:6RSLc!&&2<2D EC D
 %",,.224$..0$0 /i ZZs   B6FAFBF
F+c                 
   U R                   R                  S0 5      nUR                  SS5      (       d  gUR                  SS5      nU R                  5       nU R                  U5      nSUS   -
  nXR:  a  SS	US
 34$ SSUS
 34$ )zS
Check if there's capacity for research tasks.

Returns:
    (can_execute, reason)
research_configenabledT)Fresearch_disabledmin_capacity_for_researchr   g      ?r   capacity_available_r   Finsufficient_capacity_)r   r   r   r   )rP   r   min_capacityrx   r   	availables         r+   can_execute_research(GeminiRateMaximizer.can_execute_research  s     ++//*;R@""9d33-&**+FM ((*
))*5$z**	$.yo>>>29S/BBBr*   c                    U R                   R                  S0 5      nUR                  SS5      nU R                  [        R                  S9nU R                  U5      nU[        US   U-  5      [        US   U-  5      S.$ )zs
Calculate how many research requests can be made.

Returns:
    Dict with requests_available and tokens_available
r   max_research_percentager   )r   r   r   )ro   requests_availabletokens_available)r   r   r   r   r!   r   r8   )rP   r   max_percentagerx   r   s        r+   get_research_budget'GeminiRateMaximizer.get_research_budget  s     ++//*;R@(,,-FM((83D3D(E
..z:  "%h&?.&P"Q #H_$=$N O
 	
r*   )r   r   r~   rw   r   r   )T) r   r   r   r   r    r	   r   r   r   r
   r   r   r   r<   r:   r   r8   r   r   r(   r   boolr   r   rm   r   rt   r   r   r  r  r)   r   r*   r+   r|   r|      s    IJKMNN"D "&d &	
 	
;3 4U
3C @C DcN < #&..BB B 
	BR II I 	I
 I4.. . 	.
 .2 #&..	,, , 	,
 
,\A(9 AFCeD#I&6 C0
T#s(^ 
r*   r|   c                      SSK n U R                  SS9nUR                  S/ SQS9  UR                  S[        S	S
S9  UR                  S[        SSS9  UR                  5       n[        5       nUR                  S:X  Gau  UR                  5       n[        SS 35        [        SUR                   35        [        S S35        [        SUR                   35        [        SUR                  S S35        [        S5        [        S5        UR                  R                  5        H  u  pVUS   n[        SU S35        [        SUS    SUS   S    S US!   S S"35        [        S#US$    SUS   S%    S US&   S S"35        [        S'US(    SUS   S)    35        [        5         M     UR                  (       a8  [        S*5        [        S5        UR                   H  n[        S+U 35        M     ggUR                  S,:X  a  UR                   S:w  a  [#        UR                   5      O["        R$                  n	UR'                  UR(                  U	5      nUR+                  U5      n
[        S-UR(                   S.UR                    S/35        [        S0U 35        [        S1U
S2    35        [        S3U
S4    35        gUR                  S5:X  as  UR-                  5       u  pUR/                  5       n[        S65        [        S7U S U S"35        [        S0US8    35        [        S9US:    35        [        S;US<    35        gUR                  S=:X  a  [        S>5        [        S?5        [1        S@5       Hg  nUR3                  SASB9n[        SCUSD-    SEUR4                   SFUR6                  SG SHUR8                   S"3	5        UR;                  UR4                  SISJSK9  Mi     [        SL5        UR                  5       n[        SMUR                  S 35        gg)NzCLI for rate maximizer.r   NzGemini Rate Maximizer)descriptioncommand)statusbestr   demo)choicesz--tokensr   zToken estimate)typedefaulthelpz--taskr   z	Task typer  r   z<============================================================zGEMINI RATE MAXIMIZER STATUS - zBest Model: zTotal Capacity Used: r   zModel Utilization:z(----------------------------------------rr   z  :z	    RPM: r   /r   r/   z (r   )z	    TPM: r   r0   r   z	    RPD: rI   r1   zRecommendations:z  - r  z
Best Model for z	 tokens (z):z	  Model: z  Available RPM: r   z  Available TPM: r   r   z
Research Capacity:z  Can Execute: ro   z  Requests Available: r  z  Tokens Available: r	  r  z
=== RATE MAXIMIZER DEMO ===
zSimulating 10 requests...r   i  )r   z
  Request r`   z: z	 (delay: z.2fzs, reason: r   i,  )r   r   z)
========================================zFinal utilization: )argparseArgumentParseradd_argumentr8   r<   
parse_argsr|   r  r   printrv   rx   ry   rw   r   rz   taskr   r(   r   rH   r   r  r  ranger   ro   rp   rq   r   )r  parserargs	maximizerr   ro   datar   recr   r   can_executerq   budgeti	scheduleds                   r+   mainr+    s   $$1H$IF
	+QR

dAQR
sIKPD#%I||x1136(m/0@0@/ABCmV../01%f&@&@%ERHI"#h!==..0KE&DBugQ- Id=12!DN54I3J"TR\M]^aLbbcdeId=12!DN54I3J"TR\M]^aLbbcdeId#345QtH~e7L6MNOG 1 !!$%(O--SEl# . " 
	+/99	+AHTYY'xGWGW	((i@33E:!$++i		{"EF	%!"!(?";!<=>!(?";!<=>		#'<<>..0$&}Bvha89	&/*+,&v.B'C&DEF$V,>%?$@AB		/0 	)*rA!22#2FIJqse2ioo%6i	@W@WX[?\\ghqhxhxgyyz{| ""9??TW"X  	m113#F$>$>s#CDE 
 r*   __main__)r    r   rN   r   collectionsr   dataclassesr   r   r   r   pathlibr	   typingr
   r   r   r   r   enumr   r   r-   r>   rm   rt   r|   r+  r   r   r*   r+   <module>r2     s   4     ( (  3 3 	t 	 7 7 7 *! *! *!Z      
 
DGFT zF r*   