+
    Bq.j%T                     d   R t ^ RIt^ RIt^ RIt^ RIt^ RIHtHt ^ RIHt ^ RI	t	]P                  ! 4       R,          R,          R,          t]P                  ! 4       R,          R,          R,          tR	tR
 tR tR tR tR tR tR tR tR tRR ltRR ltRR ltR t]R8X  d
   ]! 4        R# R# )z]
OpenRouter Credit Monitor for Kuki
Monitora crediti, crea report, genera alert e previsioni
N)datetime	timedelta)Path.hermesdatazopenrouter_credits.dbconfigzopenrouter_monitor.json      @c                     \         P                  P                  RRR7       \        P                  ! \         4      p V P                  4       pVP                  R4       VP                  R4       V P                  4        V P                  4        R# )z/Inizializza database SQLite per storico creditiT)parentsexist_oka,  
        CREATE TABLE IF NOT EXISTS credit_history (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            timestamp TEXT NOT NULL,
            total_credits REAL NOT NULL,
            usage REAL NOT NULL,
            remaining REAL NOT NULL,
            cost_usd REAL NOT NULL
        )
    a  
        CREATE TABLE IF NOT EXISTS alerts (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            timestamp TEXT NOT NULL,
            alert_type TEXT NOT NULL,
            message TEXT NOT NULL,
            credits_remaining REAL NOT NULL
        )
    N)	DB_PATHparentmkdirsqlite3connectcursorexecutecommitclose)connr   s     //home/oem/.hermes/scripts/openrouter_monitor.pyinit_databaser      sj    NN5??7#D[[]F
NN 	 		 NN  	 	KKMJJL    c                 <    Rp V '       d   V # \         P                  ! R4      pV'       d   V# \        P                  ! 4       R,          R,          pVP	                  4       '       dj   ^ RIp\        VR4      ;_uu_ 4       pVP                  V4      pVP                  R/ 4      pVP                  R/ 4      pVP                  R	4      uuRRR4       #  R#   + '       g   i     R# ; i  \         d*   p\        R
T 2\        P                  R7        Rp?R# Rp?ii ; i)z/Recupera API key OpenRouter dalla config HermeszIsk-or-v1-9215593d3b05b2cda47850ea744282ce418ee936987b861aeb550d315a01b2a1OPENROUTER_API_KEYr   zconfig.yamlNr	providers
openrouterapi_keyu   ❌ ERRORE get API key: file)osgetenvr   homeexistsyamlopen	safe_loadget	Exceptionprintsysstderr)	r   keyconfig_filer%   fr   r   r   es	            r   get_openrouter_keyr1   3   s    ?]N ii,-J iikI-=k3''1*"JJ{B7	&]]<<
!~~i0	 ('    ('   ?(,3::>>?sP   	C' C' C' C' 8C' 'C' ?AC
C' C$	C' $C' 'D2DDc                    \        4       p V '       g   \        R4      hRRV  2RR/p \        P                  ! RV^R7      pVP                  ^8X  d   VP                  4       p\        RV 24       R	V9   du   VR	,          p\        VP                  R
^ 4      4      p\        VP                  R^ 4      4      pWV,
          pRVRVRVRVR\        P                  ! 4       P                  4       /# \        P                  ! RV^R7      pVP                  ^8w  d&   \        RVP                   RVP                   24      hVP                  4       pR	V9   d   VR	,          pMTp\        VP                  R^ 4      4      p	Rp
W,           p\        RV	R RVR RV
R 24       RVRV	RV
RV	R\        P                  ! 4       P                  4       /#   \         d   p\        RT 24      hRp?ii ; i)z)Controlla crediti rimanenti su OpenRouteru"   ❌ API key OpenRouter non trovataAuthorizationBearer Content-Typeapplication/jsonz-https://openrouter.ai/api/v1/auth/key/credits)headerstimeoutu   🔍 CREDITS ENDPOINT: r   total_granted
total_usedtotal_creditsusage	remainingcost_usd	timestampz%https://openrouter.ai/api/v1/auth/keyz
API error z: g      (@u   🔍 EURISTICA: usage=$.2fz, estimated_total=$z, remaining=$u   ❌ ERRORE API call: N)r1   r)   requestsr(   status_codejsonr*   floatr   now	isoformattext)r   r7   responser   credits_infototalusedr=   credits_datar<   site_balanceestimated_totalr0   s                r   check_openrouter_creditsrO   O   s    "G<== 	77),*G
A5<<;
 3&==?D+D623 ~#F|l..BC\--lA>?!L	 $UT!9!9!;  <<3
 3&j)=)=(>bPQQ}}T><LL l&&w23
 .'c{2EoVYEZZghtuxgyz{ _U113
 	
  5/s3445s   CG +CG G$GG$c           	        \         P                  ! \        4      pVP                  4       pVP	                  RV R,          V R,          V R,          V R,          V R,          34       VP                  4        VP                  4        R# )zSalva dati crediti nel databasez~
        INSERT INTO credit_history (timestamp, total_credits, usage, remaining, cost_usd)
        VALUES (?, ?, ?, ?, ?)
    r?   r;   r<   r=   r>   N)r   r   r   r   r   r   r   )credit_infor   r   s   &  r   save_credit_datarR      so    ??7#D[[]F
NN  	K O$GK J
	 	KKMJJLr   c            	         \         P                  ! \        P                  P	                  R4      4      p V P                  4       pVP                  R4       VP                  4       p. p\        V4      ^8  d   V^ ,          pV^,          pV^,          '       d   V^,          '       d   V^,          V^,          ,
          p \        P                  ! V^,          4      p\        P                  ! V^,          4      pWx,
          P                  4       R,          p	VR8  d#   V	^8  d   VP                  RVR RV	R R	24       M(VR
8  d"   V	^8  d   VP                  RVR RV	R R	24       \        P                  ! 4       \        ^R7      ,
          P!                  4       pVP                  RV34       VP#                  4       ^ ,          pV^
8  d   VP                  RV R24       VP                  RV34       VP                  4        Uu. uF  q^ ,          f   K  V^ ,          NK  	  pp\        V4      ^8  d   . p\%        \        V4      ^,
          4       Fc  pVV,          '       g   K  VV^,           ,          '       g   K,  VP                  \'        VV,          VV^,           ,          ,
          ^4      4       Ke  	  ^ RIHp V! V4      pVP-                  4        F0  w  ppV^8  g   K  VR8  g   K  VP                  RV RV R24       K2  	  V P/                  4        V#   \         d   p
 Rp
?
ELRp
?
ii ; iu upi   \         d   p
RT
 2.u Rp
?
# Rp
?
ii ; i)z@GUARDIAN: Rileva anomalie di consumo e auto-controlla Emma Tokenz$~/.hermes/data/openrouter_credits.dbzy
            SELECT remaining, usage, timestamp FROM credit_history 
            ORDER BY timestamp DESC LIMIT 4
        i  g       @u   🚨 CONSUMO ANOMALO: +$r@   z in .1fhr   u   ⚠️ INCREMENTO SOSPETTO: +$N)hourszZ
            SELECT COUNT(*) FROM credit_history 
            WHERE timestamp > ?
        u%   🔄 SELF-ALERT: Emma Token ha fatto z  controlli in 24h (normale: 3-5)z|
            SELECT usage FROM credit_history 
            WHERE timestamp > ? 
            ORDER BY timestamp DESC
        )Counterg      ?u   🔁 PATTERN LOOP: zx incrementi di $z (possibile script in loop)u   ❌ Errore controllo anomalie: )r   r   r!   path
expanduserr   r   fetchalllenr   fromisoformattotal_secondsappendr)   rE   r   rF   fetchonerangeroundcollectionsrW   itemsr   )r   r   records	anomaliesrecentprevious
usage_jumprecent_time	prev_timetime_diff_hoursr0   twenty_four_hours_ago	calls_24hr   usage_values
incrementsirW   increment_counts	incrementcounts                        r    check_anomalies_and_self_monitorrt      s   M7rww112XYZ 	  	 //#	w<1QZFqzHayyXa[[#AY!4
"*"8"8"CK ( 6 6x{ CI'2'>&M&M&ORV&VO "C'Oa,?!((+CJsCSSWXghkWllm)no $c)o.B!((+I*UXIYY]^mnq]rrs)tu "*)"2E!E P P R  $%	' OO%a(	 r>DYKOopq 	  $%		'
 '-oo&7L&7Q4!&7L |!J3|,Q./??|AaC'8'8%%eLOl1Q3>O,OQR&ST 0
 ,&z2$4$:$:$< 	5A:)c/$$':5'ARS\R]]x%yz %= 	

M ! * M&  71!5667s   BL= L= (L=  A?L ?L=  (L (BL= L8L8%>L= (L=  A#L= (L= 1-L= L5*L= 0L55L= =MMMMc            
        \         P                  ! \        4      p V P                  4       p\        P
                  ! 4       \        ^R7      ,
          P                  4       pVP                  RV34       VP                  4       pV P                  4        \        V4      ^8  d   R# V^ ,          pVR
,          pV^,          V^,          ,
          pV^,          pV^ 8  d
   V^,          M^ pV^ 8  d	   Wx,          M
\        R4      p	RVRVRVRV	R	V/# )zCalcola statistiche settimanalidaysz
        SELECT timestamp, usage, remaining FROM credit_history 
        WHERE timestamp >= ? 
        ORDER BY timestamp ASC
    Ninfweekly_usagedaily_averagecurrent_remainingdays_remainingweekly_cost)r   r   r   r   r   rE   r   rF   r   rZ   r   r[   rD   )
r   r   week_agorowsfirst_recordlast_recordry   r{   	daily_avgr|   s
             r   get_weekly_statsr     s    ??7#D[[]F !22==?H
NN  	 ??DJJL
4y1}7Lr(Kq>LO3L#A %11$4q !I6?!m&2uN 	..| r   c                   V R,          pRpV^ 8  d   RpMV\         8:  d   RpV'       Ed   \        P                  ! \        4      pVP	                  4       p\
        P                  ! 4       P                  4       P                  4       pVP                  RWR34       VP                  4       ^ ,          ^ 8  pV'       g}   VR8X  d   RVR 2pRVR R	2pMR
VR 2pRVR R\         R R2pVP                  R\
        P                  ! 4       P                  4       VVV34       VP                  4        \        V4       VP                  4        R# R# )z%Controlla e invia alert se necessarior=   Nnegative_creditslow_creditszk
            SELECT COUNT(*) FROM alerts 
            WHERE DATE(timestamp) = ? AND alert_type = ?
        u-   🔴 ALERT: Crediti OpenRouter in negativo: $r@   uI   🔴 **ALERT OPENROUTER - CREDITI NEGATIVI**

💸 **Crediti attuali**: $u+  
⚠️ **SITUAZIONE**: Account in debito

**AZIONE URGENTE RICHIESTA:**
1. Ricaricare immediatamente crediti su OpenRouter
2. Il servizio potrebbe essere sospeso
3. Rischio interruzione operatività Emma

🔗 **Link ricarica**: https://openrouter.ai/credits

_ALERT CRITICO by Emma Token 🦊💰_u)   ⚠️ ALERT: Crediti OpenRouter bassi: $uH   🔴 **ALERT OPENROUTER - CREDITI BASSI**

💰 **Crediti rimanenti**: $u   
⚠️ **Soglia alert**: $u   

**AZIONE RICHIESTA:**
Ricaricare crediti su OpenRouter per continuare l'operatività.

🔗 **Link**: https://openrouter.ai/credits

_Alert generato automaticamente da Emma Token 🦊💰_z
                INSERT INTO alerts (timestamp, alert_type, message, credits_remaining)
                VALUES (?, ?, ?, ?)
            TF)ALERT_THRESHOLDr   r   r   r   r   rE   daterF   r   r_   r   r*   r   )	rQ   r=   
alert_typer   r   todayalert_sent_today	alert_msgmessages	   &        r   check_and_send_alertr   '  sY   K(I J1}'
	o	%"
zw'##%//1   	"
 "??,Q/!3//KIVY?[	%c? 
+'* H	RUW	'_ -*3/ 08
; NN  ((*	 KKM'N

r   c                   V R,          pV R,          pV R,          p\        4       pV^ 8  d   W#,          ^d,          M^ pV^8:  d   RpMV^8:  d   RpMV^8:  d   RpMRp\        V RR	7      pR
pV'       d3   R\        ^
4      P                  V U	u. uF  p	RV	 2NK
  	  up	4       R2pMRpRVR RVR RVR RVR RV RV RV R\        P
                  ! 4       P                  R4       R2p
V
# u up	i )z2Genera report giornaliero con Guardian anti-sprecor=   r<   r;   u   🔴 CRITICOu   🟠 ATTENZIONEu   🟡 MODERATOu
   🟢 BUONOdailymode u   
🛡️ **GUARDIAN ALERTS**:
u   • 
u3   🛡️ **GUARDIAN**: Nessuna anomalia rilevata ✅uE   📊 **REPORT OPENROUTER GIORNALIERO**

💰 **Crediti rimanenti**: $r@   u   
📈 **Totale utilizzato**: $ (rT   u   %)
🏦 **Crediti totali**: $u   
🚦 **Status**: u!   

🧠 **ANALISI INTELLIGENTE**:
z

u   

⏰ **Aggiornato**: %d/%m/%Y %H:%Mu:   

_Report automatico by Emma Token 🦊💰 Guardian Mode_)rt   get_smart_analysischrjoinr   rE   strftime)rQ   r=   r<   rJ   re   usage_percentstatussmart_analysisguardian_sectionalertr   s   &          r   generate_daily_reportr   q  sL   K(I E(E 12I .3QYU]S(AM A~	b"	b  ('BN  R959%eW~956 7 8
 Q'_ -#C[=*= > + &      \\^,,-=>? @9<G  N+ 6s   C,
c                 F   \        4       p V '       g   R# V R,          pV R,          pV R,          pV R,          p^pW%,          p\        RV RR7      pR	VR
 RVR
 RVR
 RVR RVR
 R\        P                  ! 4       \	        VR7      ,           P                  R4       RV R2pV# )z2Genera report settimanale con analisi LLM avanzatau<   📊 **REPORT SETTIMANALE**: Dati insufficienti (< 7 giorni)ry   rz   r{   r|   Nweeklyr   uc   📈 **REPORT OPENROUTER SETTIMANALE**

**📅 CONSUMO ULTIMA SETTIMANA**
💸 Spesa settimanale: $r@   u   
📊 Media giornaliera: $u   
💰 Rimanenti ora: $u-   

**🔮 PREVISIONI**
📅 Giorni rimanenti: .0fu%    giorni
🗓️ Proiezione mensile: $u   
📆 Stima esaurimento: rv   z%d/%m/%Yu   

**🧠 ANALISI STRATEGICA**:
u@   

_Analisi AI by Emma Token 🦊💰 | Powered by DeepSeek Free_)r   r   r   rE   r   r   )	weekly_statsr<   r   r=   	days_leftdays_in_monthmonthly_projectionr   r   s	            r   generate_weekly_reportr     s    #%LM(E_-I01I-.I M"2 (lJN   %#C )_ % "# '05 6",,.9)+DDNNzZ[ \   ?BG" Nr   c                    \        WV4      # )z<Genera analisi intelligente - SOLO OFFLINE per evitare costi)get_offline_analysis)rQ   r   r   s   &&&r   r   r     s      4@@r   c           	         VR8X  dF   RV R,          R RV R,          R RV R,          V R,          ,          ^d,          R	 R
V R,          R R2	pM>VR8X  d8   V'       d0   RVR,          R RVR,          R RVR,          R RVR,          R R2	pRR\        4        2RR/pRRRRRR X/.R!^R"R#/p\        P                  ! R$VV^R%7      pVP                  ^8X  dB   VP	                  4       pVR&,          ^ ,          R',          R ,          P                  4       pR(V 2# \        WV4      #   \         d5   p	\        R)T	 2\        P                  R*7       \        YT4      u R+p	?	# R+p	?	ii ; i),z/Analisi LLM con modelli gratuiti per Emma Tokenr   zNAnalizza questi dati OpenRouter per report giornaliero CEO:

DATI: Rimanenti $r=   r@   z	, Usati $r<   r   r;   rT   z%), Totale $zh

Fornisci analisi concisa (max 2 frasi) con status e raccomandazione pratica per CEO azienda trasporti.r   z;Analisi settimanale OpenRouter per CEO:

SETTIMANA: Spesa $ry   z, Giornaliera $rz   z, Rimanenti $r{   z, Giorni rimasti r|   r   z^

Analisi strategica (max 3 frasi): trend consumo, previsioni, raccomandazioni ottimizzazione.r3   r4   r5   r6   modelzdeepseek/deepseek-chatmessagesroleusercontent
max_tokenstemperatureg333333?z-https://openrouter.ai/api/v1/chat/completions)r7   rC   r8   choicesr   u   🤖 u%   ⚠️ LLM gratuito non disponibile: r   N)r1   rA   postrB   rC   stripr   r)   r*   r+   r,   )
rQ   r   r   promptr7   payloadrH   r   analysisr0   s
   &&&       r   get_llm_analysis_freer     s(   .E7?k*3/yW9Mc8RRTVabiVjkv  xG  lH  WH  IL  WL  NQ  UR  R^  _j  kz  _{  |  ^@ @gjF X,/4OLQ`DabeCffs  uA  BU  uV  WZ  t[  [l  my  zJ  mK  LO  lP P]`F w'9';&<=.
 -&&)V<=#3	
 ==;	
 3&==?DIq))4Y?EEGH8*%% (4HH E5aS9

K#KtDDEs+   AD$ B:D$ D$ $E#/)EE#E#c                   VR8X  dr   V R,          pV R,          ^ 8  d   V R,          V R,          ,          ^d,          M^ pV^ 8  d   R# V^8:  d   RVR R2# V^8:  d   R	VR R
2# V^P8  d   RVR R2# RVR R2# VR8X  dY   V'       dQ   VR,          pVR,          pVR,          pV^8  d   RVR RVR R2# V^8  d   RVR R2# V^8  d   RVR R2# RVR R2# R# )z&Analisi offline intelligente senza LLMr   r=   r;   r<   u   🔴 SITUAZIONE CRITICA: Account in debito. Ricarica immediata necessaria per ripristinare servizi. Operatività Emma a rischio interruzione.u    ⚠️ CREDITI BASSI: Con soli $r@   zT rimanenti, pianificare ricarica entro 24-48h. Monitoraggio ravvicinato consigliato.u   🟡 ATTENZIONE MODERATA: $zL disponibili. Pianificare ricarica entro settimana per evitare interruzioni.u   📊 CONSUMO ELEVATO: rT   zH% utilizzato. Trend di utilizzo sopra media, monitorare giorni restanti.u   ✅ SITUAZIONE STABILE: $zG disponibili. Consumo nella norma, monitoraggio di routine sufficiente.r   rz   r|   ry   u   🚨 CONSUMO ELEVATO: Media $u#   /giorno porterà ad esaurimento in r   z: giorni. Ottimizzazione uso o ricarica urgente necessaria.u   🔄 TREND SOSTENIBILE: $u\   /settimana è gestibile ma richiede monitoraggio. Ricarica da pianificare entro 2 settimane.u   📈 USO INTENSIVO: $ue   /giorno indica utilizzo professionale intenso. Considerare budget mensile maggiore per tranquillità.u   ✅ PATTERN OTTIMALE: $uR   /settimana è sostenibile. Consumo efficiente, trend positivo per controllo costi.zAnalisi non disponibile. )rQ   r   r   r=   	usage_pctr   r   ry   s   &&&     r   r   r     s   w,	S^_nSorsSs[)K,HH3Nyz	q= c!^5i_  EY  Z  Z"_03  @L  M  M^+Ic?  ;C  D  D.yo  >E  F  F		l 1	 !12	#N3q=29S/Adenords  tn  o  o^.|C.@  A]  ^  ^]*9S/  :_  `  `,\#,>  ?Q  R  R%r   c                      \        4        \        4       p \        \        P                  4      ^8  d5   \        P                  ^,          R8X  d   \        V 4      p\        V4       R# \        V 4       \        \        P                  4      ^8  d   \        P                  ^,          MRpVR8X  d.   \        V 4      pV'       g   \        V 4      p\        V4       R# R# VR8X  d   \        4       p\        V4       R# VR8X  d   \        V 4       R# R#   \         dq   pR\        T4       R\        P                  ! 4       P                  R4       R2p\        T\        P                  R	7       \        P                   ! ^4        Rp?R# Rp?ii ; i)
zFunzione principaler   Nr   alert_checku4   ❌ **ERRORE OPENROUTER MONITOR**

🚨 **Errore**: u   
⏰ **Timestamp**: r   z0

_Verificare configurazione API key OpenRouter_r   )r   rO   r[   r+   argvr   r*   rR   r   r   r)   strr   rE   r   r,   exit)rQ   reportreport_type
alert_sentr0   	error_msgs         r   mainr   %  s4   , /0 sxx=1!!7*;7F&M 	% &)]Q%6chhqkG'!-k:J.{;f  H$+-F&MM) - *  a& LLN++,<=> ?/2	 	icjj)s,   A$D (A2D D <D FA%FF__main__)Nr   )__doc__r!   rC   rA   r   r   r   pathlibr   r+   r#   r   CONFIG_PATHr   r   r1   rO   rR   rt   r   r   r   r   r   r   r   r   __name__r   r   r   <module>r      s   
 
    (  
 ))+	
!F
*-D
DiikI%03LL>8L5\&O7b$LHT3j$LA0Ed&B.` zF r   