Ë
    tPêj  ã                  óˆ   — d Z ddlmZ ddlmZmZ ddlZddlm	Z	 ddl
mZ ddlmZmZ dd	lmZmZmZ dd
lmZ  G d„ d«      Zy)z?Core export engine for Focus integrations (heavy dependencies).é    )Úannotations)ÚAnyÚFinalN)Úverbose_loggeré   )ÚFocusLiteLLMDatabase)ÚFocusDestinationFactoryÚFocusTimeWindow)ÚFocusCsvSerializerÚFocusParquetSerializerÚFocusSerializer)ÚFocusTransformerc                  ó˜   — e Zd ZdZddœ	 	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Z	 	 	 	 dd„Z	 	 	 	 	 	 dd„Zdd	„Z	dd
„Z
edd„«       Zedd„«       Zy)ÚFocusExportEnginez;Engine that fetches, normalizes, and uploads Focus exports.N)Údestination_configc               óö   — || _         || _        || _        t        j                  | j                   | j                  |¬«      | _        | j                  «       | _        t        «       | _	        t        «       | _        y )N)ÚproviderÚprefixÚconfig)r   Úexport_formatr   r	   ÚcreateÚ_destinationÚ_init_serializerÚ_serializerr   Ú_transformerr   Ú	_database)Úselfr   r   r   r   s        úm/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/focus/export_engine.pyÚ__init__zFocusExportEngine.__init__   sf   € ð !ˆŒØ*ˆÔØˆŒÜ3×:Ñ:Ø—]‘]Ø—;‘;Ø%ô
ˆÔð
  ×0Ñ0Ó2ˆÔÜ,Ó.ˆÔÜ-Ó/ˆ�ó    c                ó˜   — | j                   dk(  r
t        «       S | j                   dk(  r
t        «       S t        d| j                   › d�«      ‚)NÚcsvÚparquetzExport format 'z(' not supported. Use 'parquet' or 'csv'.)r   r   r   ÚNotImplementedError)r   s    r   r   z"FocusExportEngine._init_serializer(   sL   € Ø×Ñ Ò&Ü%Ó'Ð'Ø×Ñ Ò*Ü)Ó+Ð+Ü! O°D×4FÑ4FÐ3GÐGoÐ"pÓqÐqr    c              ƒ  ó  K  — | j                   j                  |¬«      ƒ d {  –—† }| j                  j                  |«      }|j	                  t        dt        |«      «      «      j                  «       }|j	                  t        dt        |«      «      «      j                  «       }t        |«      | j                  |d«      | j                  |d«      | j                  |d«      | j                  |d«      dœ}|||dœS 7 ŒÚ­w)	N©Úlimité2   ÚspendÚtotal_tokensÚteam_idÚmodel)Útotal_recordsÚtotal_spendr*   Úunique_teamsÚunique_models)Ú
usage_dataÚnormalized_dataÚsummary)
r   Úget_usage_datar   Ú	transformÚheadÚminÚlenÚto_dictsÚ_sum_columnÚ_count_unique)r   r'   ÚdataÚ
normalizedÚusage_sampleÚnormalized_sampler3   s          r   Údry_run_export_usage_dataz+FocusExportEngine.dry_run_export_usage_data/   sæ   è ø€ Ø ŸN™N×9Ñ9ÀÐ9ÓF×FˆØ ×-Ñ-×7Ñ7¸Ó=ˆ
à"Ÿi™i¬¨B´°D³	Ó(:Ó;×DÑDÓFˆØ#-§?¡?´3°r¼3¸z»?Ó3KÓ#L×#UÑ#UÓ#WÐô ! ›_Ø×+Ñ+¨D°'Ó:Ø ×,Ñ,¨T°>ÓBØ ×.Ñ.¨t°YÓ?Ø!×/Ñ/°°gÓ>ñ
ˆð 'Ø0Øñ
ð 	
ð Gús   ‚ C?¢C=£CC?c             ƒ  óæ  K  — | j                   j                  |¬«      ƒ d{  –—† }|j                  «       rt        j                  d«       y| j
                  j                  |«      }|j                  «       rt        j                  d«       yddlm}m} |j                  |j                  «      }t        |j                  dddd¬«      |d¬	«      }| j                  ||«      ƒ d{  –—†  y7 ŒÊ7 Œ­w)
z8Export all available data without time-window filtering.r&   Nz%Focus export: no usage data availablez#Focus export: normalized data emptyr   )ÚdatetimeÚtimezone)ÚhourÚminuteÚsecondÚmicrosecondÚall)Ú
start_timeÚend_timeÚ	frequency)r   r4   Úis_emptyr   Údebugr   r5   rB   rC   ÚnowÚutcr
   ÚreplaceÚ_serialize_and_upload)r   r'   r<   r=   rB   rC   rN   Úwindows           r   Ú
export_allzFocusExportEngine.export_allD   sÐ   è ø€ ð !ŸN™N×9Ñ9ÀÐ9ÓF×FˆØ�=‰=Œ?Ü× Ñ Ð!HÔIØà ×-Ñ-×7Ñ7¸Ó=ˆ
Ø×ÑÔ Ü× Ñ Ð!FÔGØ÷ 	0à—\‘\ (§,¡,Ó/ˆÜ'Ø—{‘{¨°!¸AÈ1�{ÓMØØô
ˆð
 ×(Ñ(¨°VÓ<×<Ñ<ð' Gøð& 	=ús"   ‚ C1¢C-£CC1Ã'C/Ã(C1Ã/C1c             ƒ  óŽ  K  — | j                   j                  ||j                  |j                  ¬«      ƒ d {  –—† }|j	                  «       rt        j                  d|«       y | j                  j                  |«      }|j	                  «       rt        j                  d|«       y | j                  ||«      ƒ d {  –—†  y 7 Œˆ7 Œ­w)N)r'   Ústart_time_utcÚend_time_utcz)Focus export: no usage data for window %sz1Focus export: normalized data empty for window %s)
r   r4   rI   rJ   rL   r   rM   r   r5   rQ   )r   rR   r'   r<   r=   s        r   Úexport_windowzFocusExportEngine.export_window_   s°   è ø€ ð !ŸN™N×9Ñ9ØØ!×,Ñ,ØŸ™ð :ó 
÷ 
ˆð
 �=‰=Œ?Ü× Ñ Ð!LÈfÔUØà ×-Ñ-×7Ñ7¸Ó=ˆ
Ø×ÑÔ Ü× Ñ Ð!TÐV\Ô]Øà×(Ñ(¨°VÓ<×<Ñ<ð
øð 	=ús"   ‚6C¸C¹BCÂ;CÂ<CÃCc              ƒ  óà   K  — | j                   j                  |«      }|st        j                  d«       y | j                  j                  ||| j                  |«      ¬«      ƒ d {  –—†  y 7 Œ­w)Nz/Focus export: serializer returned empty payload)ÚcontentÚtime_windowÚfilename)r   Ú	serializer   rM   r   ÚdeliverÚ_build_filename)r   ÚframerR   Úpayloads       r   rQ   z'FocusExportEngine._serialize_and_uploadu   sh   è ø€ Ø×)Ñ)×3Ñ3°EÓ:ˆÙÜ× Ñ Ð!RÔSØØ×Ñ×'Ñ'ØØØ×)Ñ)¨&Ó1ð (ó 
÷ 	
ò 	
ús   ‚A$A.Á&A,Á'A.c                óî   — | j                   j                  st        d«      ‚|j                  j	                  d«      }|j
                  j	                  d«      }d|› d|› d| j                   j                  › �S )Nz(Serializer must declare a file extensionz%Y%m%dT%H%M%SZÚusage_Ú_ú.)r   Ú	extensionÚ
ValueErrorrI   ÚstrftimerJ   )r   rR   Ú	start_strÚend_strs       r   r^   z!FocusExportEngine._build_filename€   sq   € Ø×Ñ×)Ò)ÜÐGÓHÐHð "×,Ñ,×5Ñ5Ð6FÓGˆ	ØŸ™×1Ñ1Ð2BÓCˆØ˜	�{ ! G 9¨A¨d×.>Ñ.>×.HÑ.HÐ-IÐJÐJr    c                ó  — | j                  «       s|| j                  vry| j                  t        j                  |«      j                  «       j                  d«      «      j                  d«      d   }|€yt        |«      S )Ng        Úsumr   )	rL   ÚcolumnsÚselectÚplÚcolrk   ÚaliasÚrowÚfloat©r_   ÚcolumnÚvalues      r   r:   zFocusExportEngine._sum_column‰   sf   € à�>‰>Ô˜v¨U¯]©]Ñ:ØØ—|‘|¤B§F¡F¨6£N×$6Ñ$6Ó$8×$>Ñ$>¸uÓ$EÓF×JÑJÈ1ÓMÈaÑPˆØˆ=ØÜ�U‹|Ðr    c                ó  — | j                  «       s|| j                  vry| j                  t        j                  |«      j                  «       j                  d«      «      j                  d«      d   }|€yt        |«      S )Nr   Úunique)	rL   rl   rm   rn   ro   Ún_uniquerp   rq   Úintrs   s      r   r;   zFocusExportEngine._count_unique’   sh   € à�>‰>Ô˜v¨U¯]©]Ñ:ØØ—|‘|¤B§F¡F¨6£N×$;Ñ$;Ó$=×$CÑ$CÀHÓ$MÓN×RÑRÐSTÓUÐVWÑXˆØˆ=ØÜ�5‹zÐr    )
r   Ústrr   rz   r   rz   r   zdict[str, Any] | NoneÚreturnÚNone)r{   r   )r'   ú
int | Noner{   zdict[str, Any])r'   r}   r{   r|   )rR   r
   r'   r}   r{   r|   )r_   úpl.DataFramerR   r
   r{   r|   )rR   r
   r{   rz   )r_   r~   rt   rz   r{   rr   )r_   r~   rt   rz   r{   ry   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r@   rS   rW   rQ   r^   Ústaticmethodr:   r;   © r    r   r   r      s»   „ ÙEð 59ñ0ð ð0ð ð	0ð
 ð0ð 2ð0ð 
ó0ó(ró
ð*=ð ð=ð 
ó	=ð6=ð  ð=ð ð	=ð
 
ó=ó,	
óKð òó ðð òó ñr    r   )r‚   Ú
__future__r   Útypingr   r   Úpolarsrn   Úlitellm._loggingr   Údatabaser   Údestinationsr	   r
   Úserializersr   r   r   Útransformerr   r   r„   r    r   ú<module>r�      s/   ðÙ Eå "ç ã å +å *ß Bß TÑ TÝ )÷Hò Hr    