
    K(ajy#                        S r SSKJr  SSK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  SS
KJr  SS jrSS jr " S S5      rg)z=Authz + rate limits for agents chat (no public OpenAI proxy).    )annotations)datetime	timedelta)Any)func)Session)settings)RolModel)AgentsRateLimitHitModelAgentsTokenUsageModel)CustomerModelc                   [        [        U SS5      =(       d    S5      nUS:X  a  g[        U SS5      (       d  gUR                  [        5      R	                  [        R
                  U R                  :H  5      R                  5       nU(       a  UR                  (       d  g[        UR                  5      R                  5       nSU;   =(       d    SU;   $ )	z;Superadmin, coordinador o evaluador (alineado al frontend).rol_idr      TNFcoordinador	evaluador)intgetattrqueryr
   filteridr   firstrolstrlower)session_userdbridr   ns        ]C:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\classes\agents_rate_limit_class.pycan_use_agents_chatr!      s    
glHa05A
6C
ax<400
((8

#
#HKK<3F3F$F
G
M
M
OCcggCGGAA1!11    c                 P    [         R                  " 5       n U R                  SSSSS9$ )Nr   )hourminutesecondmicrosecond)r   utcnowreplace)nows    r    _day_start_utcr+   "   s%    
//
C;;Aaq;AAr"   c                      \ rS rSrSS jrSS jrSSSS.         SS jjrSSSS.       SS jjrSS jr        SS	 jr	S
r
g)AgentsRateLimitClass'   c                    Xl         g )Nr   )selfr   s     r    __init__AgentsRateLimitClass.__init__(   s    r"   c                    U R                   R                  [        5      R                  [        R                  U:  5      R                  SS9  g )NF)synchronize_session)r   r   r   r   
created_atdelete)r1   
older_thans     r    _purge_old_hits$AgentsRateLimitClass._purge_old_hits+   s5    GGMM12V+66CDVV.r"   N)user_idcustomer_id	school_idc                  U R                   R                  [        R                  " [        R
                  5      5      R                  [        R                  U:  5      nUb+  UR                  [        R                  [        U5      :H  5      nUb+  UR                  [        R                  [        U5      :H  5      nUb+  UR                  [        R                  [        U5      :H  5      n[        UR                  5       =(       d    S5      $ Nr   )r   r   r   countr   r   r   r6   r;   r   r<   r=   scalar)r1   sincer;   r<   r=   qs         r    _count_hits AgentsRateLimitClass._count_hits2   s     GGMM$**%<%?%?@AHH#..%7
 088CLHIA"0<<K@PPQA 0::c)nLMA188:?##r"   c               N   U R                   R                  [        R                  " [        R                  " [
        R                  5      S5      5      R                  [
        R                  [        5       :  5      nUb+  UR                  [
        R                  [        U5      :H  5      nUb+  UR                  [
        R                  [        U5      :H  5      nUb+  UR                  [
        R                  [        U5      :H  5      n[        UR                  5       =(       d    S5      $ r?   )r   r   r   coalescesumr   total_tokensr   r6   r+   r;   r   r<   r=   rA   )r1   r;   r<   r=   rC   s        r    _tokens_today"AgentsRateLimitClass._tokens_todayE   s     GGMMMM$((#8#E#EFJ

&&11^5EE
F 	
 .66#g,FGA".::c+>NNOA .88C	NJKA188:?##r"   c                j   U R                   R                  [        R                  " [        R                  " [
        R                  5      S5      5      R                  [
        R                  [        U5      :H  5      R                  5       n [        U=(       d    S5      $ ! [        [        4 a     gf = f)Nr   g        )r   r   r   rG   rH   r   estimated_cost_usdr   r<   r   rA   float	TypeError
ValueError)r1   r<   totals      r    
_spent_usdAgentsRateLimitClass._spent_usdW   s    GGMMdhh'<'O'OPRST V)55[9IIJVX 		!$$:& 		s   B B21B2c          	        [         R                  " 5       nU[        SS9-
  n[        S[	        [
        R                  =(       d    S5      5      n[        S[	        [
        R                  =(       d    S5      5      n[        S[	        [
        R                  =(       d    S5      5      n[        S[	        [
        R                  =(       d    S5      5      n	 U R                  U[        SS9-
  5        U(       a  U R                  R                  [        5      R                  [        R                  [	        U5      :H  5      R!                  5       n
U
(       a  [#        U
SS	5      OS	nUbC   [%        U5      nUb4  US
:  a.  U R+                  [	        U5      5      nX:  a  SSSUS SUS S3S.$ U(       aP  U R-                  U[	        U5      S9nX:  a
  SSSU S3S.$ U R/                  [	        U5      S9nX:  a  SSSUS S3S.$ U(       aR  U R-                  U[	        U5      S9nUU:  a
  SSSU S3S.$ U R/                  [	        U5      S9nUU	:  a  SSSU	S S3S.$ U(       aR  U(       aK  U R-                  U[	        U5      [	        U5      S 9n[        U[1        XvS!-  5      5      nUU:  a
  SSS"U S3S.$ U R                  R3                  [5        U(       a  [	        U5      OS	U(       a  [	        U5      OS	U(       a  [	        U5      OS	US#95        U R                  R7                  5         S$S	S	S.$ ! [&        [(        4 a    S	n GNf = f! [8         a-  nU R                  R;                  5         SS%S&U 3S.s S	nA$ S	nAff = f)'zf
Enforce requests/min, tokens/day and presupuesto USD del cliente.
Registers a hit only when allowed.
r   )minutes
      i  i@ i agents_budget_usd_maxNr   Fbudget_exceededu8   El cliente alcanzó el presupuesto máximo de Agentes ($z.2fz / $z5 USD). Contacta al superadministrador para ampliarlo.)okcodemessage)rB   r;   rate_limit_requestsu!   Demasiadas solicitudes. Límite: uA    por minuto por usuario. Espera un momento e inténtalo de nuevo.)r;   rate_limit_tokensu4   Alcanzaste el límite diario de tokens por usuario (,u/   ). Intenta mañana o contacta al administrador.)rB   r<   u1   Demasiadas solicitudes en este cliente. Límite: z por minuto. Espera un momento.)r<   u1   El cliente alcanzó el límite diario de tokens ()rB   r<   r=      u1   Demasiadas solicitudes en este colegio. Límite: )r;   r<   r=   r6   Trate_limit_errorz"No se pudo validar el rate limit: )r   r(   r   maxr   r	   !agents_rate_requests_per_min_user%agents_rate_requests_per_min_customeragents_rate_tokens_per_day_user#agents_rate_tokens_per_day_customerr9   r   r   r   r   r   r   r   rN   rO   rP   rR   rD   rJ   minaddr   commit	Exceptionrollback)r1   r;   r<   r=   r*   window_startreq_userreq_customertok_usertok_customercustomer
budget_rawbudgetspent	user_hitsuser_tokens	cust_hitscust_tokensschool_hits
school_capexcs                        r    check_and_register_chat,AgentsRateLimitClass.check_and_register_chatd   s    ooYq11q#hHHNBOP1c("P"P"VTVWXtS!I!I!SVTU4X%Q%Q%\U\!]^k	  y'<!<=GGMM-0VM,,K0@@AUW 
 RZWX/FM_c
)&!&z!2 )fk $K0@ A ?&+(9')).s4s| DU%U	$   ,,<W,V	(# 5?z JT T	  #00W0F*# 3  (|+Z\	   ,,&C4D - 	 ,# 5O+n,KM	  #00S=M0N,.# 3  ,Q//^`	  ["..& #K 0!)n / 
 !3|\+JK
*,# 5O)l*IK	  GGKK',3CL4?K 0T09c)nt"	 GGNN>>o &z2 &!%&p  	GG*?uE 	si   BM %L+ 06M '.M 'M >/M .(M AM 0A:M +M=M  MM 
M;"M60M;6M;r0   )r   r   )r8   r   returnNone)
rB   r   r;   
int | Noner<   r   r=   r   r~   r   )r;   r   r<   r   r=   r   r~   r   )r<   r   r~   rN   )r;   r   r<   r   r=   r   r~   zdict[str, Any])__name__
__module____qualname____firstlineno__r2   r9   rD   rJ   rR   r|   __static_attributes__ r"   r    r-   r-   '   s    
 #"& $$ $ 	$
  $ $ 
$, #"& $$ $  	$
 $ 
$$} }  	}
 } 
}r"   r-   N)r   r   r   r   r~   bool)r~   r   )__doc__
__future__r   r   r   typingr   
sqlalchemyr   sqlalchemy.ormr   app.backend.core.configr	   app.backend.db.modelsr
   "app.backend.db.models.agents_usager   r   app.backend.db.models.pie_corer   r!   r+   r-   r   r"   r    <module>r      s>    C " (   " , * 92B
z zr"   