
    hX                     <    d Z ddlZddlmZmZ ddlZ G d d      Zy)zPCloudZero Resource Names (CZRN) generation and validation for LiteLLM resources.    N)Anycastc                       e Zd ZdZ ej
                  d      Zd Zdee	e
f   de	fdZde	de	d	e	d
e	de	de	de	fdZde	defdZde	dee	e	e	e	e	e	f   fdZde	de	fdZdde	dede	fdZy)CZRNGeneratorz@Generate CloudZero Resource Names (CZRNs) for LiteLLM resources.zO^czrn:([a-z0-9-]+):([a-zA-Z0-9-]+):([a-z0-9-]+):([a-z0-9-]+):([a-z0-9-]+):(.+)$c                      y)zInitialize CZRN generator.N )selfs    l/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/integrations/cloudzero/cz_resource_names.py__init__zCZRNGenerator.__init__   s        rowreturnc                     d}| j                  |j                  dd            }d}|j                  dd      }| j                  |      }d}|j                  dd      }|}	| j                  ||||||	      S )	aa  Create a CZRN from LiteLLM daily spend data.
        
        CZRN format: czrn:<service-type>:<provider>:<region>:<owner-account-id>:<resource-type>:<cloud-local-id>
        
        For LiteLLM resources, we map:
        - service-type: 'litellm' (the service managing the LLM calls)
        - provider: The custom_llm_provider (e.g., 'openai', 'anthropic', 'azure')
        - region: 'cross-region' (LiteLLM operates across regions)
        - owner-account-id: The team_id or user_id (entity_id)
        - resource-type: 'llm-usage' (represents LLM usage/inference)
        - cloud-local-id: model
        litellmcustom_llm_providerunknownzcross-region	entity_idz	llm-usagemodel)service_typeproviderregionowner_account_idresource_typecloud_local_id)_normalize_providerget_normalize_componentcreate_from_components)
r	   r   r   r   r   r   r   r   r   r   s
             r
   create_from_litellm_dataz&CZRNGenerator.create_from_litellm_data"   s     !++CGG4I9,UV GGK3	44Y?# +**%-') + 
 	
r   r   r   r   r   r   r   c                    | j                  |d      }| j                  |      }| j                  |      }| j                  |      }| j                  |      }d| d| d| d| d| d| }| j                  |      st        d|       |S )z)Create a CZRN from individual components.T)allow_uppercasezczrn::zGenerated CZRN is invalid: )r   is_valid
ValueError)r	   r   r   r   r   r   r   czrns           r
   r   z$CZRNGenerator.create_from_componentsG   s     00t0T,,X6**62445EF11-@ |nAhZq:J9K1]O[\]k\lm}}T":4&ABBr   r%   c                 J    t        | j                  j                  |            S )z3Validate a CZRN string against the standard format.)bool
CZRN_REGEXmatch)r	   r%   s     r
   r#   zCZRNGenerator.is_valid`   s    DOO))$/00r   c           	          | j                   j                  |      }|st        d|       t        t        t
        t
        t
        t
        t
        t
        f   |j                               S )zExtract all components from a CZRN.
        
        Returns: (service_type, provider, region, owner_account_id, resource_type, cloud_local_id)
        zInvalid CZRN format: )r(   r)   r$   r   tuplestrgroups)r	   r%   r)   s      r
   extract_componentsz CZRNGenerator.extract_componentsd   sS    
 %%d+4TF;<<E#sCc367HHr   c                 F   t         j                  j                  j                  dt         j                  j                  j                  dt         j                  j
                  j                  dt         j                  j                  j                  dt         j                  j                  j                  dt         j                  j                  j                  dt         j                  j                  j                  dt         j                  j                  j                  dt         j                  j                  j                  dt         j                  j                  j                  d	i
}|j                         j                  d
d      }||vr|S |j                  ||      S )z1Normalize provider names to standard CZRN format.azure	anthropicawsgcpgooglecoherehuggingface	replicateztogether-ai_-)r   LlmProvidersAZUREvalueAZURE_AI	ANTHROPICBEDROCK	VERTEX_AIGEMINICOHEREHUGGINGFACE	REPLICATETOGETHER_AIlowerreplacer   )r	   r   provider_map
normalizeds       r
   r   z!CZRNGenerator._normalize_providero   s/      &&,,g  ))//  **00+  ((..  **00%  ''--x  ''--x  ,,22M  **00+  ,,22M
 ^^%--c37
 \)
J77r   	componentr!   c                     |sy|s|j                         }t        j                  dd|      }t        j                  dd|      }|j                  d      }|xs dS )z7Normalize a CZRN component to meet format requirements.r   z[^a-zA-Z0-9-]r9   z-+)rF   resubstrip)r	   rJ   r!   s      r
   r   z"CZRNGenerator._normalize_component   s]     !)I FF+S)<	 FF5#y1	 OOC(	%I%r   N)F)__name__
__module____qualname____doc__rL   compiler(   r   dictr,   r   r   r   r'   r#   r+   r.   r   r   r   r   r
   r   r      s    JnoJ#
DcN #
s #
J  	
    
21S 1T 1	Is 	IuS#sCc5Q/R 	I8C 8C 8.&c &D &UX &r   r   )rR   rL   typingr   r   r   r   r   r   r
   <module>rV      s    " W 	  & &r   