Ë
    tPêj9$  ã                   ó\   — 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
mZ  G d	„ d
«      Zy)z7Transform LiteLLM data to CloudZero AnyCost CBF format.é    )Údatetime)ÚAnyÚFinalNé   )Ú	CBFRecordé   )ÚCZEntityTypeÚCZRNGeneratorc                   óz   — e Zd ZdZd„ Zdej                  dej                  fd„Zdee	e
f   defd„Zdedz  fd	„Zy)
ÚCBFTransformerz?Transform LiteLLM usage data to CloudZero Billing Format (CBF).c                 ó"   — t        «       | _        y)z+Initialize transformer with CZRN generator.N)r
   Úczrn_generator)Úselfs    úm/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/cloudzero/transform.pyÚ__init__zCBFTransformer.__init__!   s   € ä+›oˆÕó    ÚdataÚreturnc                 óÄ  — |j                  «       rt        j                  «       S t        |«      }d|j                  v r6|j                  t        j                  d«      dkD  «      }|t        |«      z
  }n|}d}g }d}t        |«      }|j                  d¬«      D ]%  }	 | j                  |«      }	|j                  |	«       Œ' ddlm}
  |
«       }|dkD  r|j                  d|d›d	|d›d
�«       |dkD  r|j                  d|d›d	|d›d�«       t        |«      dkD  r|j                  dt        |«      d›d�«       t        j                  |«      S # t        $ r |dz  }Y ŒÅw xY w)zfTransform LiteLLM data to CBF format, dropping records with zero successful_requests or invalid CZRNs.Úsuccessful_requestsr   T)Únamedr   )ÚConsoleu   [yellow]âš ï¸�  Dropped ú,z of z/ records with zero successful_requests[/yellow]z/ filtered records due to invalid CZRNs[/yellow]u$   [green]âœ“ Successfully transformed z records[/green])Úis_emptyÚplÚ	DataFrameÚlenÚcolumnsÚfilterÚcolÚ	iter_rowsÚ_create_cbf_recordÚappendÚ	ExceptionÚrich.consoler   Úprint)r   r   Úoriginal_countÚfiltered_dataÚzero_requests_droppedÚcbf_dataÚczrn_dropped_countÚfiltered_countÚrowÚ
cbf_recordr   Úconsoles               r   Ú	transformzCBFTransformer.transform%   s�  € à�=‰=Œ?Ü—<‘<“>Ð!ô !$ D£	ˆØ  D§L¡LÑ0Ø ŸK™K¬¯©Ð/DÓ(EÈÑ(IÓJˆMØ$2´S¸Ó5GÑ$GÑ!à ˆMØ$%Ð!àˆØÐÜ # MÓ 2ˆà ×*Ñ*°Ð*Ó6ò 	ˆCðØ!×4Ñ4°SÓ9�
à—‘ 
Õ+ð		õ 	)á ›ˆà  1Ò$Ø�M‰MØ*Ð+@ÀÐ*CÀ4ÈÐWXÐGYð  ZIð  Jôð  Ò!Ø�M‰MØ*Ð+=¸aÐ*@ÀÀ^ÐTUÐDVð  WFð  Gôô ˆx‹=˜1ÒØ�M‰MÐ@ÄÀXÃÈqÐ@QÐQaÐbÔcä�|‰|˜HÓ%Ð%øô/ ò à" aÑ'Ð"Ùðús   Â"EÅEÅEr-   c                 óf  — | j                  |j                  d«      «      }t        |j                  dd«      «      }t        |j                  dd«      «      }||z   }| j                  j	                  |«      }t        |j                  dd«      «      }t        |j                  dd«      «      dd	 }|j                  d
«      }	|j                  d«      }
|j                  d«      }|
rt        |
«      n|	rt        |	«      nd}|j                  d«      }|j                  d«      }|j                  d«      }|j                  d«      }i dt        j                  j                  “d|“d|
rt        |
«      nd“d|“dt        |j                  dd«      «      “dt        |j                  dd«      «      “d|“dt        |j                  dd«      «      “d|rt        |«      nd“dt        |j                  dd«      «      “dt        |j                  dd«      «      “dt        |j                  dd«      «      “dt        |j                  dd«      «      “dt        |j                  dd«      «      “d|rt        |«      nd“d|rt        |«      nd“d|rt        |«      nd“}| j                  j                  |«      }|\  }}}}}}|r|› d|› �n|}|r|j                  «       ndt        |j                  d d!«      «      ||d"t        |j                  dd«      «      ||t        |j                  dd«      «      |	rt        |	«      ndd#d$œ}||d%<   ||d&<   |j                  «       D ]%  \  }}|sŒ	|d'k7  sŒ|dk7  sŒt        |«      |d(|› �<   Œ' |dkD  rt        |«      |d)<   |dkD  rt        |«      |d*<   t        |«      S )+z8Create a single CBF record from LiteLLM daily spend row.ÚdateÚprompt_tokensr   Úcompletion_tokensÚmodelÚ Úapi_keyNé   Úteam_idÚ
team_aliasÚ
user_emailÚunknownÚapi_key_aliasÚorganization_aliasÚproject_aliasÚ
user_aliasÚentity_typeÚ	entity_idÚmodel_groupÚproviderÚcustom_llm_providerÚapi_key_prefixÚapi_requestsr   Úfailed_requestsÚcache_creation_tokensÚcache_creation_input_tokensÚcache_read_tokensÚcache_read_input_tokensú|Úspendg        ÚtokensÚUsage)ztime/usage_startz	cost/costzresource/idzusage/amountzusage/unitszresource/servicezresource/accountzresource/regionzresource/usage_familyzaction/operationzlineitem/typezresource/tag:providerzresource/tag:modelzN/Azresource/tag:zresource/tag:prompt_tokenszresource/tag:completion_tokens)Ú_parse_dateÚgetÚintr   Úcreate_from_litellm_dataÚstrr	   ÚTEAMÚvalueÚextract_componentsÚ	isoformatÚfloatÚitemsr   )r   r-   Ú
usage_dater3   r4   Útotal_tokensÚresource_idr5   Úapi_key_hashr9   r:   r;   rB   r=   r>   r?   r@   Ú
dimensionsÚczrn_componentsÚservice_typerD   ÚregionÚowner_account_idÚresource_typeÚcloud_local_idÚresource_accountr.   ÚkeyrW   s                                r   r"   z!CBFTransformer._create_cbf_recordU   s  € ð !×,Ñ,¨S¯W©W°V«_Ó=ˆ
ô  # 3§7¡7¨?¸AÓ#>Ó?ˆÜ#& s§w¡wÐ/BÀAÓ'FÓ#GÐØ+Ð.?Ñ?ˆð "×0Ñ0×IÑIÈ#ÓNˆô ˜3Ÿ7™7 7¨BÓ/Ó0ˆÜ! #§'¡'¨)°RÓ"8Ó9¸"¸1Ð=ˆð Ÿ™ Ó+ˆØŸG™G LÓ1ˆ
ØŸG™G LÓ1ˆ
ñ /9œ3˜zœ?Éw¼sÀ7¼|Ð\eˆ	ð  #Ÿw™w Ó7ˆØ$'§G¡GÐ,@Ó$AÐØ"Ÿw™w Ó7ˆØŸG™G LÓ1ˆ
ð
Øœ<×,Ñ,×2Ñ2ð
à˜ð
ð ©Zœ#˜jœ/¸Yð
ð �Uð	
ð
 œ3˜sŸw™w }°bÓ9Ó:ð
ð œ˜CŸG™GÐ$9¸2Ó>Ó?ð
ð ˜lð
ð œS §¡¨¸"Ó!=Ó>ð
ð ©Zœ#˜jœ/¸Rð
ð œC §¡¨¸Ó :Ó;ð
ð "¤3 s§w¡wÐ/DÀaÓ'HÓ#Ið
ð œs 3§7¡7Ð+<¸aÓ#@ÓAð
ð $¤S¨¯©Ð1NÐPQÓ)RÓ%Sð
ð  ¤ S§W¡WÐ-FÈÓ%JÓ!Kð
ð !Ñ=O¤#Ð&8Ô"9ÐUWð
ð  ±=œS Ô/Àbð!
ð" ©Zœ#˜jœ/¸Rð#
ˆ
ð* "&×!4Ñ!4×!GÑ!GÈÓ!Tˆð ñ	
ØØØØØØñ HU ] O°1°\°NÑ"CÐZfÐñ +5�
×$Ñ$Ô&¸$ä˜sŸw™w w°Ó4Ó5Ø&à(Ø#ä # C§G¡G¨M¸2Ó$>Ó ?Ø 0Ø%Ü%(¨¯©Ð1FÈÓ)KÓ%Lá07¤ G¤¸Rà$ñ%
ˆ
ð, /7ˆ
Ð*Ñ+Ø+9ˆ
Ð'Ñ(ð %×*Ñ*Ó,ò 	?‰JˆC�Ú˜ %›¨E°YÓ,>Ü47¸³J�
˜]¨3¨%Ð0Ò1ð	?ð
 ˜1ÒÜ7:¸=Ó7IˆJÐ3Ñ4Ø˜qÒ Ü;>Ð?PÓ;QˆJÐ7Ñ8ä˜Ó$Ð$r   Nc                 ó‚  — |€yt        |t        «      r|S t        |t        «      r>	 t        j                  |g«      j                  j                  d«      j                  «       S y# t        $ rP 	 t        j                  |g«      j                  j                  «       j                  «       cY S # t        $ r Y Y yw xY ww xY w)z?Parse date string from daily spend tables (e.g., '2025-04-19').Nz%Y-%m-%d)Ú
isinstancer   rU   r   ÚSeriesÚto_datetimeÚitemr$   )r   Údate_strs     r   rQ   zCBFTransformer._parse_date¾   sª   € àÐØä�h¤Ô)ØˆOä�h¤Ô$ð ä—y‘y ( Ó,×0Ñ0×<Ñ<¸ZÓH×MÑMÓOÐOð øô ò  ð äŸ9™9 h ZÓ0×4Ñ4×@Ñ@ÓB×GÑGÓIÒIøÜ ò  Úð úð	 ús/   §<A% Á%	B>Á/;B-Â*B>Â-	B:Â6B>Â9B:Â:B>)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r0   ÚdictrU   r   r   r"   r   rQ   © r   r   r   r      sU   „ ÙIò.ð.&˜bŸl™lð .&¨r¯|©|ó .&ð`g% d¨3°¨8¡nð g%¸ó g%ðR x°$¡ô r   r   )rr   r   Útypingr   r   Úpolarsr   Útypes.integrations.cloudzeror   Úcz_resource_namesr	   r
   r   rt   r   r   ú<module>ry      s%   ðñ& >å ß ã å 5ß :÷sò sr   