Ë
    tPêj<"  ã                  óÐ   — U d Z ddlmZ ddlZddlmZmZmZ ddlmZm	Z	m
Z
mZ ddlZddlmZ ddlmZ dd	lmZ erdd
lmZ ddlmZ ne	ZdZded<   dZded<    G d„ de«      ZdgZy)z;Focus export logger orchestrating DB pull/transform/upload.é    )ÚannotationsN)ÚdatetimeÚ	timedeltaÚtimezone)ÚTYPE_CHECKINGÚAnyÚFinalÚcast)Úverbose_logger)ÚCustomLoggeré   )ÚFocusTimeWindow)ÚAsyncIOScheduler©ÚFocusExportEngineÚfocus_export_usage_datar	   ÚFOCUS_USAGE_DATA_JOB_NAMEiô  ÚDEFAULT_DRY_RUN_LIMITc                  óê   ‡ — e Zd ZdZddddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zddddœ	 	 	 	 	 	 	 dd„Zefdd„Zdd	„Z	e
	 	 	 	 dd
„«       Zdd„Zdd„Z	 	 	 	 dd„Z	 	 	 	 	 	 dd„Zdd„Zˆ xZS )ÚFocusLoggerzOCoordinates Focus export jobs across transformer/serializer/destination layers.N)ÚproviderÚexport_formatÚ	frequencyÚcron_offset_minuteÚinterval_secondsÚprefixÚdestination_configc               ó´  •— t        ‰| �  di |¤Ž |xs t        j                  d«      xs dj	                  «       | _        |xs t        j                  d«      xs dj	                  «       | _        |xs t        j                  d«      xs dj	                  «       | _        |�|nt        t        j                  dd«      «      | _	        |�|nt        j                  d	«      }	d | _
        |	�	 t        |	«      | _
        t        j                  d«      }
|�|n|
r|
nd| _        || _        d | _        y # t        t        f$ r t        j                  d
|	«       Y ŒZw xY w)NÚFOCUS_PROVIDERÚs3ÚFOCUS_FORMATÚparquetÚFOCUS_FREQUENCYÚhourlyÚFOCUS_CRON_OFFSETÚ5ÚFOCUS_INTERVAL_SECONDSz2Invalid FOCUS_INTERVAL_SECONDS value: %s, ignoringÚFOCUS_PREFIXÚfocus_exports© )ÚsuperÚ__init__ÚosÚgetenvÚlowerr   r   r   Úintr   r   Ú
ValueErrorÚ	TypeErrorr   Úwarningr   Ú_destination_configÚ_engine)Úselfr   r   r   r   r   r   r   ÚkwargsÚraw_intervalÚ
env_prefixÚ	__class__s              €úl/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/focus/focus_logger.pyr,   zFocusLogger.__init__   s?  ø€ ô 	‰ÑÑ"˜6Ò"Ø!ÒH¤R§Y¡YÐ/?Ó%@ÒHÀD×OÑOÓQˆŒØ+ÒU¬r¯y©y¸Ó/HÒUÈI×\Ñ\Ó^ˆÔØ#ÒO¤r§y¡yÐ1BÓ'CÒOÀx×VÑVÓXˆŒà"4Ð"@ÑÄcÌ"Ï)É)ÐTgÐilÓJmÓFnð 	Ôð 3CÐ2NÑ.ÔTV×T]ÑT]Ð^vÓTwˆØ,0ˆÔØÐ#ðÜ(+¨LÓ(9�Ô%ô ŸI™I nÓ5ˆ
Ø%+Ð%7™6ÉJ¹jÐ\kˆŒà#5ˆÔ Ø15ˆ�øô ¤	Ð*ò Ü×&Ñ&ØHØ öðús   Ã,D/ Ä/%EÅEc                ó°   — | j                   €?ddlm}  || j                  | j                  | j
                  | j                  ¬«      | _         | j                   S )z+Instantiate the heavy export engine lazily.r   r   )r   r   r   r   )r5   Úexport_enginer   r   r   r   r4   )r6   r   s     r;   Ú_ensure_enginezFocusLogger._ensure_engine@   sG   € à�<‰<ÐÝ8á,ØŸ™Ø"×0Ñ0Ø—{‘{Ø#'×#;Ñ#;ô	ˆDŒLð �|‰|Ðó    )ÚlimitÚstart_time_utcÚend_time_utcc             ƒ  óü   K  — t        |«      t        |«      z  rt        d«      ‚|r6|r4t        ||| j                  ¬«      }| j	                  ||¬«      ƒ d{  –—†  y| j                  |¬«      ƒ d{  –—†  y7 Œ 7 Œ­w)a(  Public hook to trigger export immediately.

        When called without time bounds (manual /vantage/export with no
        start/end), exports **all** available data instead of the last
        scheduled window.  The hourly/daily window only applies to
        automatic scheduler runs.
        z9start_time_utc and end_time_utc must be provided together©Ú
start_timeÚend_timer   ©Úwindowr@   N©r@   )Úboolr1   r   r   Ú_export_windowÚ_export_all)r6   r@   rA   rB   rH   s        r;   Úexport_usage_datazFocusLogger.export_usage_dataM   s‚   è ø€ ô �Ó¤$ |Ó"4Ò4ÜÐXÓYÐYá™lÜ+Ø)Ø%ØŸ.™.ôˆFð
 ×%Ñ%¨V¸5Ð%ÓA×AÑAð ×"Ñ"¨Ð"Ó/×/Ñ/ð Bøð 0ús$   ‚AA<ÁA8ÁA<Á2A:Á3A<Á:A<c              ƒ  ób   K  — | j                  «       }|j                  |¬«      ƒ d{  –—† S 7 Œ­w)z*Return transformed data without uploading.rI   N)r>   Údry_run_export_usage_data©r6   r@   Úengines      r;   rO   z%FocusLogger.dry_run_export_usage_datai   s.   è ø€ à×+Ñ+Ó-ˆØ×5Ñ5¸EÐ5ÓB×BÐBÐBús   ‚&/¨-©/c              ƒ  óØ  K  — ddl m} d}|�t        |dd«      }|�t        |dd«      }|rz|j                  rn|j	                  t
        ¬«      ƒ d{  –—† }|st        j                  d«       y	 | j                  «       ƒ d{  –—†  |j                  t
        ¬«      ƒ d{  –—†  y| j                  «       ƒ d{  –—†  y7 Œm7 Œ>7 Œ"# |j                  t
        ¬«      ƒ d{  –—†7   w xY w7 Œ/­w)z@Entry point for scheduler jobs to run export cycle with locking.r   )Úproxy_logging_objNÚdb_spend_update_writerÚpod_lock_manager)Ú
cronjob_idz(Focus export: unable to acquire pod lock)
Úlitellm.proxy.proxy_serverrS   ÚgetattrÚredis_cacheÚacquire_lockr   r   ÚdebugÚ_run_scheduled_exportÚrelease_lock)r6   rS   rU   ÚwriterÚacquireds        r;   Úinitialize_focus_export_jobz'FocusLogger.initialize_focus_export_jobn   sã   è ø€ å@àÐØÐ(Ü#Ð$5Ð7OÐQUÓVˆFØÐ!Ü#*¨6Ð3EÀtÓ#LÐ áÐ 0× <Ò <Ø$4×$AÑ$AÔMfÐ$AÓ$g×gˆHÙÜ×$Ñ$Ð%OÔPØðZØ×0Ñ0Ó2×2Ð2à&×3Ñ3Ô?XÐ3ÓY×YÑYà×,Ñ,Ó.×.Ñ.ð høð
 3øàYùÐ&×3Ñ3Ô?XÐ3ÓY×YÒYúà.úsf   ‚AC*ÁB>ÁC*Á.C ÂC ÂC ÂC*ÂCÂ C*Â8C(Â9C*Ã C ÃC*ÃC%ÃC!ÃC%Ã%C*c              ƒ  óJ  K  — t         j                  j                  t        ¬«      D �cg c]  }t	        |«      t        u r|‘Œ }}|st        j                  d«       yt        t        |d   «      }|j                  «       } | j                  |j                  fi |¤Ž yc c}w ­w)zBRegister the export cron/interval job with the provided scheduler.)Úcallback_typez5No Focus export logger registered; skipping schedulerNr   )ÚlitellmÚlogging_callback_managerÚget_custom_loggers_for_typer   Útyper   r[   r
   Ú_build_scheduler_triggerÚadd_jobr`   )Ú	schedulerÚcbÚfocus_loggersÚfocus_loggerÚtrigger_kwargss        r;   Ú init_focus_export_background_jobz,FocusLogger.init_focus_export_background_job„   s¢   è ø€ ô ×6Ñ6×RÑRÔalÐRÓmö4
àÜ�B‹xœ;Ñ&ò ð4
ˆð 4
ñ
 Ü× Ñ Ð!XÔYØä"¤;°¸aÑ0@ÓAˆØ ,× EÑ EÓ GˆØˆ	×ÑØ×4Ñ4ñ	
àó	
ùò4
ùs   ‚'B#©BÁA B#c                óx  — | j                   dk(  r| j                  xs d}d|dœS | j                   dk(  r&t        dt        d| j                  «      «      }d|ddœS | j                   d	k(  r;t        d| j                  «      }t        d
|dz  «      }t        d|dz  «      }d||ddœS t        d| j                   › �«      ‚)z:Return scheduler configuration for the selected frequency.Úintervalé<   )ÚtriggerÚsecondsr$   r   é;   Úcron)rr   ÚminuteÚsecondÚdailyé   )rr   Úhourrv   rw   úUnsupported frequency: )r   r   ÚmaxÚminr   r1   )r6   rs   rv   Útotal_minutesrz   s        r;   rg   z$FocusLogger._build_scheduler_triggerœ   sÃ   € à�>‰>˜ZÒ'Ø!×2Ñ2Ò8°bˆGØ)°gÑ>Ð>à�>‰>˜XÒ%Ü˜œC  D×$;Ñ$;Ó<Ó=ˆFØ%°À1ÑEÐEà�>‰>˜WÒ$Ü#& q¨$×*AÑ*AÓ#BˆMÜ˜b -°2Ñ"5Ó6ˆDÜ˜˜]¨RÑ/Ó0ˆFØ%¨t¸vÐQRÑSÐSäÐ2°4·>±>Ð2BÐCÓDÐDr?   c              ƒ  óª   K  — | j                  t        j                  t        j                  «      «      }| j                  |d¬«      ƒ d{  –—†  y7 Œ­w)z7Execute the scheduled export for the configured window.NrG   )Ú_compute_time_windowr   Únowr   ÚutcrK   )r6   rH   s     r;   r\   z!FocusLogger._run_scheduled_export®   s<   è ø€ à×1Ñ1´(·,±,¼x¿|¹|Ó2LÓMˆØ×!Ñ!¨°tÐ!Ó<×<Ò<ús   ‚A	AÁAÁAc             ƒ  ód   K  — | j                  «       }|j                  |¬«      ƒ d{  –—†  y7 Œ­w)z7Export all available data without a time window filter.rI   N)r>   Ú
export_allrP   s      r;   rL   zFocusLogger._export_all³   s-   è ø€ ð ×+Ñ+Ó-ˆØ×Ñ eÐÓ,×,Ò,ús   ‚&0¨.©0c             ƒ  óf   K  — | j                  «       }|j                  ||¬«      ƒ d {  –—†  y 7 Œ­w)NrG   )r>   Úexport_window)r6   rH   r@   rQ   s       r;   rK   zFocusLogger._export_window¼   s/   è ø€ ð ×+Ñ+Ó-ˆØ×"Ñ"¨&¸Ð"Ó>×>Ò>ús   ‚'1©/ª1c                óÐ  — |j                  t        j                  «      }| j                  dk(  r$|j	                  ddd¬«      }|t        d¬«      z
  }n}| j                  dk(  r%|j	                  dddd¬«      }|t        d¬«      z
  }nI| j                  d	k(  r"t        | j                  xs d
¬«      }|}||z
  }nt        d| j                  › �«      ‚t        ||| j                  ¬«      S )z?Derive the time window to export based on configured frequency.r$   r   )rv   rw   Úmicrosecondr   )Úhoursrx   )rz   rv   rw   rˆ   )Údaysrp   rq   )rs   r{   rD   )	Ú
astimezoner   r‚   r   Úreplacer   r   r1   r   )r6   r�   Únow_utcrF   rE   rp   s         r;   r€   z FocusLogger._compute_time_windowÅ   sÖ   € àŸ™¬¯©Ó5ˆØ�>‰>˜XÒ%Ø—‘¨a¸Àq�ÓIˆHØ!¤I°AÔ$6Ñ6‰JØ�^‰^˜wÒ&Ø—‘¨A°aÀÈq�ÓQˆHØ!¤I°1Ô$5Ñ5‰JØ�^‰^˜zÒ)Ü'°×0EÑ0EÒ0KÈÔLˆHØˆHØ! HÑ,‰JäÐ6°t·~±~Ð6FÐGÓHÐHÜØ!ØØ—n‘nô
ð 	
r?   )r   ú
str | Noner   rŽ   r   rŽ   r   ú
int | Noner   r�   r   rŽ   r   zdict[str, Any] | Noner7   r   ÚreturnÚNone)r�   r   )r@   r�   rA   údatetime | NonerB   r’   r�   r‘   )r@   r�   r�   údict[str, Any])r�   r‘   )ri   r   r�   r‘   )r�   r“   )r@   r�   r�   r‘   )rH   r   r@   r�   r�   r‘   )r�   r   r�   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r,   r>   rM   r   rO   r`   Ústaticmethodrn   rg   r\   rL   rK   r€   Ú__classcell__)r:   s   @r;   r   r      s<  ø„ ÙYð
  $Ø$(Ø $Ø)-Ø'+Ø!Ø48ñ!6ð ð!6ð "ð	!6ð
 ð!6ð 'ð!6ð %ð!6ð ð!6ð 2ð!6ð ð!6ð 
õ!6óFð  !Ø*.Ø(,ñ0ð ð0ð (ð	0ð
 &ð0ð 
ó0ð8 CXô Có
/ð, ð
Ø#ð
à	ò
ó ð
ó.Eó$=ð
-ð ð-ð 
ó	-ð?ð  ð?ð ð	?ð
 
ó?÷
r?   r   )r—   Ú
__future__r   r-   r   r   r   Útypingr   r   r	   r
   rc   Úlitellm._loggingr   Ú"litellm.integrations.custom_loggerr   Údestinationsr   Úapscheduler.schedulers.asyncior   r=   r   r   Ú__annotations__r   r   Ú__all__r*   r?   r;   ú<module>r¢      sc   ðÚ Aå "ã 	ß 2Ñ 2ß 2Ó 2ã Ý +Ý ;å )áÝ?æ0àÐà#<Ð ˜5Ó <Ø"Ð �uÓ "ô~
�,ô ~
ðB ˆ/�r?   