Ë
    tPêj~(  ã                   ó`   — d Z ddlZddlmZmZ ddlmZmZ ddlZddlZ	ddl
mZ  G d„ d«      Zy)z<Output modules for writing CBF data to various destinations.é    N)ÚdatetimeÚtimezone)ÚAnyÚFinal)ÚConsolec            
       óD  — e Zd ZdZddedededz  fd„Zddej                  ded	dfd
„Zdej                  d	e	eej                  f   fd„Z
ded	efd„Zdedej                  ded	dfd„Zdedej                  ded	e	eef   fd„Zde	eef   d	e	eef   dz  fd„Zded	efd„Zy)ÚCloudZeroStreamerzTStream CBF data to CloudZero AnyCost API with proper batching and timezone handling.NÚapi_keyÚconnection_idÚuser_timezonec                 óP  — || _         || _        d| _        t        «       | _        |  |r	 t        j                  |«      | _        yt        j                  | _        y# t
        j                  $ r7 | j                  j                  d|› d�«       t        j                  | _        Y yw xY w)z/Initialize CloudZero streamer with credentials.zhttps://api.cloudzero.comz#[yellow]Warning: Unknown timezone 'z', using UTC[/yellow]N)r
   r   Úbase_urlr   ÚconsoleÚzoneinfoÚZoneInfor   ÚZoneInfoNotFoundErrorÚprintr   Úutc)Úselfr
   r   r   s       úq/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/cloudzero/cz_stream_api.pyÚ__init__zCloudZeroStreamer.__init__!   s�   € àˆŒØ*ˆÔØ3ˆŒÜ“yˆŒñ 	Ùð2Ü%-×%6Ñ%6°}Ó%E�Õ"ô
 "*§¡ˆDÕøô	 ×1Ñ1ò 2Ø—‘×"Ñ"Ð%HÈÈÐWlÐ#mÔnÜ%-§\¡\�Ö"ð2ús   ªA ÁAB%Â$B%ÚdataÚ	operationÚreturnc                 óf  — |j                  «       r| j                  j                  d«       y| j                  |«      }|s| j                  j                  d«       y| j                  j                  dt	        |«      › d|› d�«       |j                  «       D ]  \  }}| j                  |||«       Œ y)z8Send CBF data in daily batches to CloudZero AnyCost API.z-[yellow]No data to send to CloudZero[/yellow]Nz/[yellow]No valid daily batches to send[/yellow]z[blue]Sending z! daily batch(es) with operation 'z'[/blue])Úis_emptyr   r   Ú_group_by_dateÚlenÚitemsÚ_send_daily_batch)r   r   r   Údaily_batchesÚ
batch_dateÚ
batch_datas         r   Úsend_batchedzCloudZeroStreamer.send_batched3   s¨   € à�=‰=Œ?Ø�L‰L×ÑÐNÔOØð  $×2Ñ2°4Ó8ˆáØ�L‰L×ÑÐPÔQØà�‰×Ñ˜^¬C°Ó,>Ð+?Ð?`ÐajÐ`kÐksÐtÔuà&3×&9Ñ&9Ó&;ò 	FÑ"ˆJ˜
Ø×"Ñ" :¨z¸9ÕEñ	Fó    c           	      ó&  — i }d|j                   vr| j                  j                  d«       i S d}|j                  d¬«      D ]V  }	 |j	                  d«      }|sŒ| j                  |«      }|j                  d«      }||vrg ||<   ||   j                  |«       ŒX |j                  «       D ��	ci c]  \  }}	|	sŒ	|t        j                  |	«      “Œ  c}	}S # t        $ r,}| j                  j                  d|› d|› d	�«       Y d}~ŒÃd}~ww xY wc c}	}w )
z;Group data by date, converting to UTC and validating dates.útime/usage_startzE[red]Error: Missing 'time/usage_start' column for date grouping[/red]NT©Únamedú%Y-%m-%dz.[yellow]Warning: Could not process timestamp 'ú': ú	[/yellow])Úcolumnsr   r   Ú	iter_rowsÚgetÚ_parse_and_convert_timestampÚstrftimeÚappendÚ	Exceptionr   ÚplÚ	DataFrame)
r   r   r!   Útimestamp_strÚrowÚdtr"   ÚeÚdate_keyÚrecordss
             r   r   z CloudZeroStreamer._group_by_dateE   s!  € à@Bˆð  T§\¡\Ñ1Ø�L‰L×ÑÐfÔgØˆIà$(ˆØ—>‘>¨�>Ó-ò 	ˆCðà #§¡Ð(:Ó ;�Ù$Øð ×6Ñ6°}ÓE�ØŸ[™[¨Ó4�
à ]Ñ2Ø02�M *Ñ-à˜jÑ)×0Ñ0°Õ5ð	ð* JW×I\ÑI\ÓI^×jÑ4E°H¸gÒbi�œ"Ÿ,™, wÓ/Ñ/ÓjÐjøô ò Ø—‘×"Ñ"Ð%SÐTaÐSbÐbeÐfgÐehÐhqÐ#rÔsÜûðüó
 ks*   ÁCÁ?CÂ.
DÂ9DÃ	D
Ã"DÄD
r6   c                 óÄ  — 	 |j                  d«      r&t        j                  |j                  dd«      «      }nhd|v s|j                  d«      rt        j                  |«      }n=t        j                  |«      }|j                  €|j                  | j
                  ¬«      }|j                  t        j                  «      S # t        $ r}t        d|› d|› �«      ‚d}~ww xY w)	z*Parse timestamp string and convert to UTC.ÚZú+00:00ú+)z-00:00z-01:00z-02:00z-03:00z-04:00z-05:00z-06:00z-07:00z-08:00z-09:00z-10:00z-11:00z-12:00z+01:00z+02:00z+03:00z+04:00z+05:00z+06:00z+07:00z+08:00z+09:00z+10:00z+11:00z+12:00N)ÚtzinfozCould not parse timestamp 'r+   )
Úendswithr   ÚfromisoformatÚreplacer@   r   Ú
astimezoner   r   Ú
ValueError)r   r6   r8   r9   s       r   r0   z.CloudZeroStreamer._parse_and_convert_timestampf   sÑ   € ð,	Rà×%Ñ% cÔ*Ü×+Ñ+¨M×,AÑ,AÀ#ÀxÓ,PÓQ‘Ø˜Ñ%¨×)?Ñ)?ðô*ô: ×+Ñ+¨MÓ:‘ô ×+Ñ+¨MÓ:�Ø—9‘9Ð$ØŸ™¨4×+=Ñ+=˜Ó>�Bð —=‘=¤§¡Ó.Ð.øäò 	RÜÐ:¸=¸/ÈÈQÈCÐPÓQÐQûð	Rús   ‚B=C  Ã 	CÃ	CÃCr"   r#   c           
      ó8  — |j                  «       ryd| j                  › �ddœ}| j                  › d| j                  › d�}| j	                  |||«      }	 t        j                  d¬«      5 }| j                  j                  d	|› d
t        |«      › d�«       |j                  |||¬«      }|j                  «        | j                  j                  d|› d
t        |«      › d�«       ddd«       y# 1 sw Y   yxY w# t
        j                  $ r(}	| j                  j                  d|› d|	› d�«       ‚ d}	~	wt
        j                  $ rS}	| j                  j                  d|› d|	j                  j                  › d|	j                  j                   › d�«       ‚ d}	~	ww xY w)z+Send a single daily batch to CloudZero API.NzBearer zapplication/json)ÚAuthorizationzContent-Typez /v2/connections/billing/anycost/z/billing_dropsg      >@)Útimeoutz[blue]Sending batch for z (z records)[/blue])ÚheadersÚjsonu'   [green]âœ“ Successfully sent batch for z records)[/green]u)   [red]âœ— Network error sending batch for z: z[/red]u&   [red]âœ— HTTP error sending batch for ú )r   r
   r   r   Ú_prepare_batch_payloadÚhttpxÚClientr   r   r   ÚpostÚraise_for_statusÚRequestErrorÚHTTPStatusErrorÚresponseÚstatus_codeÚtext)
r   r"   r#   r   rI   ÚurlÚpayloadÚclientrS   r9   s
             r   r    z#CloudZeroStreamer._send_daily_batch—   s—  € à×ÑÔ Øð  ' t§|¡| nÐ5Ø.ñ
ˆð Ÿ™�Ð&FÀt×GYÑGYÐFZÐZhÐiˆð ×4Ñ4°ZÀÈYÓWˆð	Ü—‘ dÔ+ð ¨vØ—‘×"Ñ"Ð%=¸j¸\ÈÌCÐPZËOÐK\Ð\lÐ#mÔnà"(§+¡+¨c¸7È +Ó"Q�Ø×)Ñ)Ô+à—‘×"Ñ"Ø=¸j¸\ÈÌCÐPZËOÐK\Ð\mÐnô÷÷ ñ ûô ×!Ñ!ò 	Ø�L‰L×ÑÐ!JÈ:È,ÐVXÐYZÐX[Ð[aÐbÔcØûÜ×$Ñ$ò 	Ø�L‰L×ÑØ8¸¸ÀBÀqÇzÁz×G]ÑG]ÐF^Ð^_Ð`a×`jÑ`j×`oÑ`oÐ_pÐpvÐwôð ûð		úsD   ÁC: Á*A;C.Ã%C: Ã.C7Ã3C: Ã7C: Ã:FÄ#D0Ä0FÅAFÆFc                 óB  — 	 t        j                  |d«      }|j                  d«      }g }|j                  d¬«      D ]'  }| j                  |«      }|sŒ|j                  |«       Œ) |||dœ}	|	S # t        $ r& t        j                  «       j                  d«      }Y Œtw xY w)z@Prepare batch payload according to CloudZero AnyCost API format.r*   z%Y-%mTr(   )Úmonthr   r   )r   Ústrptimer1   rE   Únowr.   Ú_convert_cbf_to_api_formatr2   )
r   r"   r#   r   Údate_objÚ	month_strÚdata_recordsr7   ÚrecordrW   s
             r   rL   z(CloudZeroStreamer._prepare_batch_payload»   s¨   € ð	9Ü&×/Ñ/°
¸JÓGˆHØ ×)Ñ)¨'Ó2ˆIð !ˆØ×'Ñ'¨dÐ'Ó3ò 	,ˆCØ×4Ñ4°SÓ9ˆFÚØ×#Ñ# FÕ+ð	,ð
 $-¸9ÈlÑ[ˆàˆøô ò 	9ä Ÿ™›×/Ñ/°Ó8ŠIð	9ús   ‚'A/ Á/,BÂBr7   c                 ó¢  — 	 i }|j                  «       D ]h  \  }}|€Œ	t        |t        t        f«      rEt        |t        «      r&|d›j	                  d«      j	                  d«      ||<   ŒUt        |«      ||<   Œd|||<   Œj d|v r| j                  |d   «      |d<   |S # t        $ r)}| j                  j                  d|› d�«       Y d}~yd}~ww xY w)z\Convert CBF row to CloudZero API format - keeping CBF field names as CloudZero expects them.Nz.10fÚ0ú.r'   z9[yellow]Warning: Could not convert record to API format: r,   )
r   Ú
isinstanceÚintÚfloatÚrstripÚstrÚ_ensure_utc_timestampr3   r   r   )r   r7   Ú
api_recordÚkeyÚvaluer9   s         r   r]   z,CloudZeroStreamer._convert_cbf_to_api_formatÐ   sÝ   € ð	à "ˆJð "Ÿi™i›kò 0‘
��UØÑ$ä! %¬#¬u¨Ô6ä% e¬UÔ3à16°t°×.DÑ.DÀSÓ.I×.PÑ.PÐQTÓ.U˜J sšOä.1°%«j˜J sšOà*/˜
 3šð0ð " ZÑ/Ø15×1KÑ1KÈJÐWiÑLjÓ1k�
Ð-Ñ.àÐøäò 	Ø�L‰L×ÑÐ!ZÐ[\ÐZ]Ð]fÐgÔhÜûð	ús   ‚B �A>B Â	CÂ%C	Ã	Cc                 ól  — |s1t        j                  t        j                  «      j	                  «       S 	 | j                  |«      }|j	                  «       j                  dd«      S # t        $ rD t        j                  t        j                  «      j	                  «       j                  dd«      cY S w xY w)z*Ensure timestamp is in UTC format for API.r>   r=   )r   r\   r   r   Ú	isoformatr0   rC   r3   )r   r6   r8   s      r   rj   z'CloudZeroStreamer._ensure_utc_timestampî   sŠ   € áÜ—<‘<¤§¡Ó-×7Ñ7Ó9Ð9ð	QØ×9Ñ9¸-ÓHˆBØ—<‘<“>×)Ñ)¨(°CÓ8Ð8øÜò 	Qä—<‘<¤§¡Ó-×7Ñ7Ó9×AÑAÀ(ÈCÓPÒPð	Qús   µ0A& Á&A
B3Â2B3)N)Úreplace_hourly)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ri   r   r4   r5   r$   Údictr   r   r0   r    r   rL   r]   rj   © r%   r   r	   r	      s   „ Ù^ñ. ð .°Cð .ÈÈdÉ
ó .ñ$F §¡ð F¸#ð FÐUYó Fð$k 2§<¡<ð k°D¸¸b¿l¹lÐ9JÑ4Kó kðB/R¸#ð /RÀ(ó /Rðb"¨Cð "¸R¿\¹\ð "ÐVYð "Ð^bó "ðH°ð À"Ç,Á,ð Ð[^ð ÐcgÐhkÐmpÐhpÑcqó ð*¨d°3¸°8©nð ÀÀcÈ3ÀhÁÐRVÑAVó ð<
Q°3ð 
Q¸3ô 
Qr%   r	   )rt   r   r   r   Útypingr   r   rM   Úpolarsr4   Úrich.consoler   r	   rv   r%   r   ú<module>rz      s+   ðñ& Cã ß 'ß ã Û Ý  ÷ZQò ZQr%   