Ë
    tPêj´D  ã                   ó  — d Z ddlZddlZddlZddlZddlZddlmZmZ ddl	Z	ddl
Z
ddlmZ ddlmZ ddlmZ ddlmZ ddlmZmZ dd	lmZ ed
   Zed   Zdefd„Zdedefd„Zdededz  fd„Zdedefd„Z  G d„ de«      Z!y)zš
Callback to log events to a Generic API Endpoint

- Creates a StandardLoggingPayload
- Adds to batch queue
- Flushes based on CustomBatchLogger settings
é    N)ÚFinalÚLiteral)Úverbose_logger)Úuuid)ÚCustomBatchLogger©Ú
safe_dumps)Úget_async_httpx_clientÚhttpxSpecialProvider)ÚStandardLoggingPayload)Úllm_api_successÚllm_api_failure©Ú
json_arrayÚndjsonÚsingleÚreturnc                  óP  — 	 t         j                  j                  t         j                  j                  t        «      d«      } t        | d«      5 }t        j                  |«      cddd«       S # 1 sw Y   yxY w# t        $ r"}t        j                  d|«       i cY d}~S d}~ww xY w)zŠ
    Load the generic_api_compatible_callbacks.json file

    Returns:
        Dict: Dictionary of compatible callbacks configuration
    z%generic_api_compatible_callbacks.jsonÚrNz7Error loading generic_api_compatible_callbacks.json: %s)ÚosÚpathÚjoinÚdirnameÚ__file__ÚopenÚjsonÚloadÚ	Exceptionr   Úwarning)Ú	json_pathÚfÚes      úz/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/generic_api/generic_api_callback.pyÚload_compatible_callbacksr$   !   s{   € ðÜŸ7™7Ÿ<™<¬¯©¯©¼Ó(AÐCjÓkˆ	Ü�)˜SÓ!ð 	  QÜ—9‘9˜Q“<÷	 ÷ 	 ò 	 ûäò Ü×ÑÐXÐZ[Ô\Ø�	ûðús<   ‚AA: ÁA.Á$	A: Á.A7Á3A: Á7A: Á:	B%ÂB ÂB%Â B%Úcallback_namec                 ó   — t        «       }| |v S )zð
    Check if a callback_name exists in the compatible callbacks list

    Args:
        callback_name: Name of the callback to check

    Returns:
        bool: True if callback_name exists in the compatible callbacks, False otherwise
    )r$   ©r%   Úcompatible_callbackss     r#   Úis_callback_compatibler)   1   s   € ô #<Ó"=ÐØÐ0Ð0Ð0ó    c                 ó8   — t        «       }|j                  | «      S )zà
    Get the configuration for a specific callback

    Args:
        callback_name: Name of the callback to get config for

    Returns:
        Optional[Dict]: Configuration dict for the callback, or None if not found
    )r$   Úgetr'   s     r#   Úget_callback_configr-   ?   s   € ô #<Ó"=ÐØ×#Ñ# MÓ2Ð2r*   Úvaluec                 ó:   — d}d„ }t        j                  ||| «      S )a  
    Replace {{environment_variables.VAR_NAME}} patterns with actual environment variable values

    Args:
        value: String that may contain {{environment_variables.VAR_NAME}} patterns

    Returns:
        str: String with environment variables substituted
    z(\{\{environment_variables\.([A-Z_]+)\}\}c                 óP   — | j                  d«      }t        j                  |d«      S )Né   Ú )Úgroupr   Úgetenv)ÚmatchÚenv_var_names     r#   Úreplace_env_varz1substitute_env_variables.<locals>.replace_env_varY   s    € Ø#Ÿk™k¨!›nˆÜ�y‰y˜ rÓ*Ð*r*   )ÚreÚsub)r.   Úpatternr7   s      r#   Úsubstitute_env_variablesr;   M   s$   € ð A€Gò+ô �6‰6�'˜?¨EÓ2Ð2r*   c                   ó  ‡ — e Zd Z	 	 	 	 	 	 	 	 ddedz  dedz  dee   dz  dedz  dedz  dede	d	e	e
j                  z  dz  fˆ fd
„Zddedz  fd„Zdedefd„Zdeddfd„Zdede
j$                  fd„Zd„ Zd„ Zd„ Zdefd„Zˆ xZS )ÚGenericAPILoggerNÚendpointÚheadersÚevent_typesr%   Ú
log_formatÚmax_retriesÚretry_delayÚtimeoutc	                 óZ  •— |r§t        |«      r†t        j                  d|«       t        |«      }
|
ry|€d|
v rt	        |
d   «      }d|
v r4|xs i }|
d   j                  «       D ]  \  }}||vsŒt	        |«      ||<   Œ |€	d|
v r|
d   }|€ d|
v r|
d   }nt        j                  d|«       t        t        j                  ¬«      | _
        |xs t        j                  d	«      }|€t        d
«      ‚| j                  |«      | _        || _        || _        || _        t'        dt)        |xs d«      «      | _        |€dn|}t'        dt-        |«      «      | _        || _        |�|dvrt        d|› d�«      ‚|xs d| _        t        j                  d| j$                  | j                   | j                  | j"                  | j2                  «       t5        j6                  «       | _        t;        ‰| �x  di |	¤d| j8                  i¤Ž t5        j>                  | jA                  «       «       g | _!        y)aÝ  
        Initialize the GenericAPILogger

        Args:
            endpoint: Optional[str] = None,
            headers: Optional[dict] = None,
            event_types: Optional[List[API_EVENT_TYPES]] = None,
            callback_name: Optional[str] = None - If provided, loads config from generic_api_compatible_callbacks.json
            log_format: Optional[LOG_FORMAT_TYPES] = None - Format for log output: "json_array" (default), "ndjson", or "single"
            max_retries: Number of retry attempts after the initial request fails. Defaults to 0.
            retry_delay: Initial retry delay in seconds. Retries use exponential backoff.
            timeout: Optional timeout to use for Generic API callback requests.
        z&Loading configuration for callback: %sNr>   r?   r@   rA   zEcallback_name '%s' not found in generic_api_compatible_callbacks.json)Úllm_providerÚGENERIC_LOGGER_ENDPOINTzaendpoint not set for GenericAPILogger, GENERIC_LOGGER_ENDPOINT not found in environment variablesr   ç        r   zInvalid log_format: z2. Must be one of: 'json_array', 'ndjson', 'single'r   zein init GenericAPILogger, callback_name: %s, endpoint %s, headers %s, event_types: %s, log_format: %sÚ
flush_lock© )"r)   r   Údebugr-   r;   Úitemsr   r
   r   ÚLoggingCallbackÚasync_httpx_clientr   r4   Ú
ValueErrorÚ_get_headersr?   r>   r@   r%   ÚmaxÚintrB   ÚfloatrC   rD   rA   ÚasyncioÚLockrI   ÚsuperÚ__init__Úcreate_taskÚperiodic_flushÚ	log_queue)Úselfr>   r?   r@   r%   rA   rB   rC   rD   ÚkwargsÚcallback_configÚkeyr.   Úretry_delay_valueÚ	__class__s                 €r#   rW   zGenericAPILogger.__init__a   s=  ø€ ñ8 Ü% mÔ4Ü×$Ñ$Ð%MÈ}Ô]Ü)<¸]Ó)K�ñ #ØÐ'¨J¸/Ñ,IÜ#;¸OÈJÑ<WÓ#X˜à  OÑ3Ø")¢-¨R˜Ø*9¸)Ñ*D×*JÑ*JÓ*Lò O™J˜C Ø"¨'Ò1Ü/GÈÓ/N ¨¢ðOð #Ð*¨}ÀÑ/OØ&5°mÑ&D˜à!Ð)¨l¸oÑ.MØ%4°\Ñ%B™
ä×&Ñ&Ø[Ð]jôô #9ÔFZ×FjÑFjÔ"kˆÔØÒCœrŸy™yÐ)BÓCˆØÐÜØsóð ð (,×'8Ñ'8¸Ó'AˆŒØ%ˆŒØ9DˆÔØ)6ˆÔÜ˜q¤# kÒ&6°QÓ"7Ó8ˆÔØ*5Ð*=¡3À;ÐÜ˜s¤EÐ*;Ó$<Ó=ˆÔØˆŒð Ð! jð 9
ñ '
ô
 Ð3°J°<Ð?qÐrÓsÐsØ,6Ò,F¸,ˆŒä×ÑØsØ×ÑØ�M‰MØ�L‰LØ×ÑØ�O‰Oô	
ô "Ÿ,™,›.ˆŒÜ‰ÑÑ>˜6Ñ>¨d¯o©oÓ>Ü×Ñ˜D×/Ñ/Ó1Ô2Ø>@ˆ�r*   c                 óÂ  — ddi}t        j                  d«      }|rU	 |j                  d«      }|D ]=  }d|v sŒ|j                  dd«      \  }}|j                  «       ||j                  «       <   Œ? 	 t        j                  r|j                  t        j                  «       |r|j                  |«       |S # t        $ r }t        j                  d|«       Y d}~Œhd}~ww xY w)	z¹
        Get headers for the Generic API Logger

        Returns:
            Dict: Headers for the Generic API Logger

        Args:
            headers: Optional[dict] = None
        zContent-Typezapplication/jsonÚGENERIC_LOGGER_HEADERSú,ú=r1   z4Error parsing headers from environment variables: %sN)
r   r4   ÚsplitÚstripr   r   r   ÚlitellmÚgeneric_logger_headersÚupdate)	r[   r?   Úheaders_dictÚenv_headersÚheader_itemsÚitemr^   r.   r"   s	            r#   rP   zGenericAPILogger._get_headersÄ   sÞ   € ð Ð.ð
ˆô
  ŸY™YÐ'?Ó@ˆÙðbà&1×&7Ñ&7¸Ó&<�Ø(ò B�DØ˜d’{Ø%)§Z¡Z°°QÓ%7™
˜˜UØ49·K±K³M˜ S§Y¡Y£[Ò1ñBô ×)Ò)Ø×Ñ¤× >Ñ >Ô?ñ Ø×Ñ Ô(àÐøô ò bÜ×&Ñ&Ð']Ð_`×aÑaûðbús   �B5 ¸8B5 Â5	CÂ>CÃCÚ	exceptionr   c                 óÀ   — t        |t        j                  t        j                  f«      ryt        |t        j
                  «      r|j                  j                  dk\  S y)NTiô  F)Ú
isinstancerg   ÚTimeoutÚhttpxÚTransportErrorÚHTTPStatusErrorÚresponseÚstatus_code)r[   rn   s     r#   Ú_should_retry_exceptionz(GenericAPILogger._should_retry_exceptionê   sH   € Ü�i¤'§/¡/´5×3GÑ3GÐ!HÔIØä�i¤×!6Ñ!6Ô7Ø×%Ñ%×1Ñ1°SÑ8Ð8àr*   Úattemptc              ƒ   óŽ   K  — | j                   dk  ry | j                   d|z  z  }t        j                  |«      ƒ d {  –—†  y 7 Œ­w)Nr   é   )rC   rT   Úsleep)r[   rx   Údelays      r#   Ú_sleep_before_retryz$GenericAPILogger._sleep_before_retryó   s=   è ø€ Ø×Ñ˜qÒ Øà×'Ñ'¨1¨g©:Ñ6ˆÜ�m‰m˜EÓ"×"Ò"ús   ‚;A½A¾AÚdatac           	   ƒ   óø  K  — | j                   dz   }t        |«      D ]I  }	 | j                  j                  | j                  | j
                  || j                  ¬«      ƒ d {  –—† c S  t        d«      ‚7 Œ# t        $ rx}|| j                   k(  }| j                  |«      }|s|s‚ t        j                  d| j                  t        |«      |dz   |«       | j                  |«      ƒ d {  –—†7   Y d }~ŒÕd }~ww xY w­w)Nr1   )Úurlr?   r~   rD   zKGeneric API Logger - retrying request to %s after error: %s (attempt %s/%s)z1Generic API Logger retry loop exited unexpectedly)rB   ÚrangerN   Úpostr>   r?   rD   r   rw   r   r   Ústrr}   ÚRuntimeError)r[   r~   Útotal_attemptsrx   r"   Úis_last_attemptÚshould_retrys          r#   Ú_post_with_retriesz#GenericAPILogger._post_with_retriesú   sõ   è ø€ Ø $× 0Ñ 0°1Ñ 4ˆÜ˜^Ó,ò 	8ˆGð8Ø!×4Ñ4×9Ñ9ØŸ™Ø ŸL™LØØ ŸL™Lð	 :ó ÷ ò ð	8ô. ÐNÓOÐOð+ùô ò 8Ø")¨T×-=Ñ-=Ñ"=�Ø#×;Ñ;¸AÓ>�Ù"©,Øä×&Ñ&ØaØ—M‘MÜ˜“FØ˜a‘KØ"ôð ×.Ñ.¨wÓ7×7Ö7ûð8üsN   ‚C:¡A A6Á!A4Á"A6Á%C:Á4A6Á6	C7Á?A(C2Ã'C*Ã(C2Ã-C:Ã2C7Ã7C:c              ƒ   óH  K  — | j                   �d| j                   vry	 t        j                  d|«       |j                  dd«      }t        j
                  du r1| j                  ||||¬«      }| j                  j                  |«       n| j                  j                  |«       t        | j                  «      | j                  k\  r| j                  «       ƒ d{  –—†  yy7 Œ# t        $ r3}t        j                  d|t        j                  «       «       Y d}~yd}~ww xY w­w)a!  
        Async Log success events to Generic API Endpoint

        - Creates a StandardLoggingPayload
        - Adds to batch queue
        - Flushes based on CustomBatchLogger settings

        Raises:
            Raises a NON Blocking verbose_logger.exception if an error occurs
        Nr   ú9Generic API Logger - Enters logging function for model %sÚstandard_logging_objectT©r\   Úresponse_objÚ
start_timeÚend_timeú Generic API Logger Error - %s
%s©r@   r   rK   r,   rg   Úgeneric_api_use_v1Ú_get_v1_logging_payloadrZ   ÚappendÚlenÚ
batch_sizeÚasync_send_batchr   rn   Ú	tracebackÚ
format_exc©r[   r\   r�   rŽ   r�   Ústandard_logging_payloadÚpayloadr"   s           r#   Úasync_log_success_eventz(GenericAPILogger.async_log_success_event  s	  è ø€ ð ×ÑÐ'Ð,=ÀT×EUÑEUÑ,UØð	eÜ× Ñ Ð!\Ð^dÔeØ.4¯j©jÐ9RÐTXÓ.YÐ$ô ×)Ñ)¨TÑ1Ø!%×!=Ñ!=Ø!Ø!-Ø)Ø%ð	 ">ó "�ð —‘×%Ñ% gÕ.ð —‘×%Ñ%Ð&>Ô?ä�4—>‘>Ó" d§o¡oÒ5Ø×+Ñ+Ó-×-Ñ-ð 6Ø-ùäò 	eÜ×$Ñ$Ð%HÈ!ÌY×MaÑMaÓMc×dÑdûð	eüóA   ‚D"ŸB;C# ÃC!ÃC# ÃD"Ã!C# Ã#	DÃ,)DÄD"ÄDÄD"c              ƒ   óH  K  — | j                   �d| j                   vry	 t        j                  d|«       |j                  dd«      }t        j
                  du r1| j                  ||||¬«      }| j                  j                  |«       n| j                  j                  |«       t        | j                  «      | j                  k\  r| j                  «       ƒ d{  –—†  yy7 Œ# t        $ r3}t        j                  d|t        j                  «       «       Y d}~yd}~ww xY w­w)zŒ
        Async Log failure events to Generic API Endpoint

        - Creates a StandardLoggingPayload
        - Adds to batch queue
        Nr   rŠ   r‹   TrŒ   r�   r‘   rš   s           r#   Úasync_log_failure_eventz(GenericAPILogger.async_log_failure_event;  s  è ø€ ð ×ÑÐ'Ð,=ÀT×EUÑEUÑ,UØð	eÜ× Ñ Ð!\Ð^dÔeØ.4¯j©jÐ9RÐTXÓ.YÐ$ä×)Ñ)¨TÑ1Ø!%×!=Ñ!=Ø!Ø!-Ø)Ø%ð	 ">ó "�ð —‘×%Ñ% gÕ.à—‘×%Ñ%Ð&>Ô?ä�4—>‘>Ó" d§o¡oÒ5Ø×+Ñ+Ó-×-Ñ-ð 6Ø-ùäò 	eÜ×$Ñ$Ð%HÈ!ÌY×MaÑMaÓMc×dÑdûð	eürž   c              ƒ   óÎ  K  — 	 | j                   s	 | j                   j                  «        yt        j                  dt	        | j                   «      | j
                  «       | j
                  dk(  r¹g }| j                   D ].  }| j                  t        |«      ¬«      }|j                  |«       Œ0 t        j                  |ddiŽƒ d{  –—† }t        |«      D ]N  \  }}t        |t        «      rt        j                  d||«       Œ.t        j                  d||j                  «       ŒP n¿| j
                  d	k(  rt        | j                   «      }nJ| j
                  d
k(  r#dj!                  d„ | j                   D «       «      }nt#        d| j
                  › �«      ‚| j                  |¬«      ƒ d{  –—† }t        j                  d| j$                  |j                  | j
                  «       | j                   j                  «        y7 �Œ<7 ŒX# t        $ r3}	t        j                  d|	t'        j(                  «       «       Y d}	~	ŒWd}	~	ww xY w# | j                   j                  «        w xY w­w)a$  
        Sends the batch of messages to Generic API Endpoint

        Supports three formats:
        - json_array: Sends all logs as a JSON array (default)
        - ndjson: Sends logs as newline-delimited JSON
        - single: Sends each log as individual HTTP request in parallel
        Nz<Generic API Logger - about to flush %s events in '%s' formatr   )r~   Úreturn_exceptionsTz-Generic API Logger - Error sending log %s: %sz,Generic API Logger - sent log %s, status: %sr   r   ú
c              3   ó2   K  — | ]  }t        |«      –— Œ y ­w©Nr   )Ú.0Úlogs     r#   ú	<genexpr>z4GenericAPILogger.async_send_batch.<locals>.<genexpr>…  s   è ø€ Ò$O¸¤Z°§_Ñ$Oùs   ‚zUnknown log_format: z=Generic API Logger - sent batch to %s, status: %s, format: %sz.Generic API Logger Error sending batch - %s
%s)rZ   Úclearr   rK   r•   rA   rˆ   r	   r”   rT   ÚgatherÚ	enumeraterp   r   rn   rv   r   rO   r>   r˜   r™   )
r[   ÚtasksÚ	log_entryÚtaskÚ	responsesÚidxÚresultr~   ru   r"   s
             r#   r—   z!GenericAPILogger.async_send_batchZ  s  è ø€ ð3	#Ø—>’>Øðb �N‰N× Ñ Õ"ô_ × Ñ ØNÔPSÐTX×TbÑTbÓPcÐei×etÑetôð �‰ (Ò*à!�Ø!%§¡ò '�IØ×2Ñ2¼
À9Ó8MÐ2ÓN�DØ—L‘L Õ&ð'ô
 *1¯©¸Ð)WÐRVÑ)W×#W�	ô $-¨YÓ#7ò 	‘K�C˜Ü! &¬)Ô4Ü&×0Ñ0Ð1`ÐbeÐgmÕnô '×,Ñ,ØJØØ"×.Ñ.õñ	ð —?‘? lÒ2Ü% d§n¡nÓ5‘DØ—_‘_¨Ò0ØŸ9™9Ñ$OÀÇÁÔ$OÓO‘Dä$Ð';¸D¿O¹OÐ;LÐ%MÓNÐNð )-×(?Ñ(?ÀTÐ(?Ó(J×"J�ä×$Ñ$ØSØ—M‘MØ×(Ñ(Ø—O‘Oô	ð �N‰N× Ñ Õ"ðG $Xùð. #Kùô ò 	sÜ×$Ñ$Ð%VÐXYÔ[d×[oÑ[oÓ[q×rÑrûð	sûð �N‰N× Ñ Õ"üsj   ‚I%„H ‘I%¬BH ÃHÃC%H Æ,HÆ-:H Ç'I%ÈH ÈH È	IÈ)H>È9I È>IÉI ÉI"É"I%c                 ód  — t        j                  d|«       |j                  di «      }|j                  di «      xs i }|j                  d«      }|j                  dd«      }|j                  di «      }	|j                  dd	«      }
|j                  d
d«      }|d   }|j                  dt        t	        j
                  «       «      «      }||
||||j                  dd«      |j                  dd«      |	|||||dœ}|j                  «       D ]  \  }}	 t        |«      ||<   Œ |S # t        $ r Y Œ$w xY w)zœ
        Maintained for backwards compatibility with old logging payload

        Returns a dict of the payload to send to the Generic API Endpoint
        z?GenericAPILogger Logging - Enters logging function for model %sÚlitellm_paramsÚmetadataÚmessagesÚresponse_costrH   Úoptional_paramsÚ	call_typezlitellm.completionÚ	cache_hitFÚusageÚidÚmodelr2   Úuser)r»   r¸   r¹   Ú	startTimeÚendTimer¼   r½   ÚmodelParametersrµ   ru   rº   r´   Úcost)r   rK   r,   rƒ   r   Úuuid4rL   r   )r[   r\   r�   rŽ   r�   r³   r´   rµ   rÁ   r·   r¸   r¹   rº   r»   rœ   r^   r.   s                    r#   r“   z(GenericAPILogger._get_v1_logging_payload˜  sE  € ô 	×ÑÐ^Ð`fÔgð !'§
¡
Ð+;¸RÓ @ˆØ(×,Ñ,¨Z¸Ó<ÒBÀˆØ Ÿ*™* ZÓ0ˆØ—j‘j °#Ó6ˆØ!'§¡Ð,=¸rÓ!BˆØ!Ÿ:™: kÐ3GÓHˆ	Ø!Ÿ:™: k°5Ó9ˆ	Ø# GÑ,ˆØ ×$Ñ$ T¬3¬t¯z©z«|Ó+<Ó=ˆð Ø"Ø"Ø#ØØ—Z‘Z ¨Ó,Ø—J‘J˜v rÓ*Ø.Ø Ø$ØØ Øñ
ˆð" "Ÿ-™-›/ò 	‰JˆC�ðÜ" 5›z�˜’ð	ð ˆøô	 ò áðús   ÄD#Ä#	D/Ä.D/)NNNNNr   g      ð?Nr¥   )Ú__name__Ú
__module__Ú__qualname__rƒ   ÚdictÚlistÚAPI_EVENT_TYPESÚLOG_FORMAT_TYPESrR   rS   rr   rq   rW   rP   r   Úboolrw   r}   ÚResponserˆ   r�   r    r—   r“   Ú__classcell__)r`   s   @r#   r=   r=   `   s  ø„ ð  $Ø#Ø48Ø$(Ø.2ØØ Ø04ñaAà˜‘*ðaAð ˜‘ðaAð ˜/Ñ*¨TÑ1ð	aAð
 ˜T‘zðaAð % tÑ+ðaAð ðaAð ðaAð ˜Ÿ™Ñ&¨Ñ-õaAñF$ D¨4¡Kó $ðL°ð ¸tó ð#°ð #¸ó #ðP¨Sð P°U·^±^ó Pò6$eòLeò><#ð|-ÐUY÷ -r*   r=   )"Ú__doc__rT   r   r   r8   r˜   Útypingr   r   rr   rg   Úlitellm._loggingr   Úlitellm._uuidr   Ú(litellm.integrations.custom_batch_loggerr   Ú*litellm.litellm_core_utils.safe_json_dumpsr	   Ú&litellm.llms.custom_httpx.http_handlerr
   r   Úlitellm.types.utilsr   rÈ   rÉ   rÆ   r$   rƒ   rÊ   r)   r-   r;   r=   rJ   r*   r#   ú<module>rÕ      s©   ðñó Û Û 	Û 	Û ß !ã ã Ý +Ý Ý FÝ A÷õ 7àÐ>Ñ?€ØÐ;Ñ<Ð ð 4ó ð 1¨#ð 1°$ó 1ð3 sð 3¨t°d©{ó 3ð3 Cð 3¨Có 3ô&eÐ(õ er*   