
    i=                        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m	Z	m
Z
m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
e   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)DictListLiteralOptionalUnion)verbose_logger)uuid)CustomBatchLogger
safe_dumps)get_async_httpx_clienthttpxSpecialProvider)StandardLoggingPayload)llm_api_successllm_api_failure
json_arrayndjsonsinglereturnc                  f   	 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t        |              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rNz5Error loading generic_api_compatible_callbacks.json: )ospathjoindirname__file__openjsonload	Exceptionr   warningstr)	json_pathfes      /Users/manta/Documents/Projects/TheRoad-I1/.venv/lib/python3.12/site-packages/litellm/integrations/generic_api/generic_api_callback.pyload_compatible_callbacksr(      s    
GGLLGGOOH%'N
	 )S!Q99Q< "!! CCF8L	
 		s<   AA: A.$	A: .A73A: 7A: :	B0"B+%B0+B0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-   3   s     56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_configr1   A   s     56##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_var[   s     {{1~yyr**r.   )resub)r2   patternr;   s      r'   substitute_env_variablesr?   O   s#     :G+ 66'?E22r.   c                        e Zd Z	 	 	 	 	 ddee   dee   deee      dee   dee   f
 fdZ	ddee   fdZ
d Zd	 Zd
 ZdefdZ xZS )GenericAPILoggerendpointheadersevent_typesr)   
log_formatc                    |rt        |      rt        j                  d|        t        |      }|r||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| d       t        t        j                  	      | _
        |xs t        j                  d
      }|t        d      | j                  |      | _        || _        || _        || _        ||dvrt        d| d      |xs d| _        t        j                  d| j$                   d| j                    d| j                   d| j"                   d| j&                   
       t)        j*                         | _        t/        
| `  di |d| j,                  i t)        j2                  | j5                                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"
        z$Loading configuration for callback: NrB   rC   rD   rE   zcallback_name 'z4' 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   zInvalid log_format: z2. Must be one of: 'json_array', 'ndjson', 'single'r   z)in init GenericAPILogger, callback_name: z, endpoint z
, headers z, event_types: z, log_format: 
flush_lock )r-   r   debugr1   r?   itemsr"   r   r   LoggingCallbackasync_httpx_clientr   r8   
ValueError_get_headersrC   rB   rD   r)   rE   asyncioLockrI   super__init__create_taskperiodic_flush	log_queue)selfrB   rC   rD   r)   rE   kwargscallback_configkeyr2   	__class__s             r'   rT   zGenericAPILogger.__init__c   s\   , %m4$$:=/J #6m"D #'J/,I#;OJ<W#X O3")-R*9)*D*J*J*LJC"'1/G/N +M #*}/O&5m&D!)lo.M%4\%B
&&%m_4hi #9-==#
 Cryy)BCs  "..w7%<G,9 !j 9
 '

 &zl2de  -7,F,78J8J7K;W[WdWdVeeoptp|p|o}  ~M  NR  N^  N^  M_  _m  nr  n}  n}  m~  	
 ",,.>6>doo>D//12DF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t        |              Y d}~sd}~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,=r5   z2Error parsing headers from environment variables: N)r   r8   splitstripr!   r   r"   r#   litellmgeneric_logger_headersupdate)	rX   rC   headers_dictenv_headersheader_itemsitemr[   r2   r&   s	            r'   rP   zGenericAPILogger._get_headers   s     .

 ii 89
*005(Dd{%)ZZQ%7
U49KKMSYY[1 ) )) > >? (  &&HQQ s   B5 8B5 5	C)>!C$$C)c                 b  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        $ r@}t        j                  dt        |       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rY   response_obj
start_timeend_timeGeneric API Logger Error - 
rD   r   rK   r0   rc   generic_api_use_v1_get_v1_logging_payloadrW   appendlen
batch_sizeasync_send_batchr!   	exceptionr#   	traceback
format_excrX   rY   rn   ro   rp   standard_logging_payloadpayloadr&   s           r'   async_log_success_eventz(GenericAPILogger.async_log_success_event   s     ',=TEUEU,U	  KV (.zz2KT'R$ ))T166!!-)%	 7  %%g. %%&>?4>>"doo5++--- 6- 	$$-c!fXR	8L8L8N7OP 		A   D/B;C# C!C# D/!C# #	D,,6D'"D/'D,,D/c                 b  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        $ r@}t        j                  dt        |       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   rk   rl   Trm   rq   rr   rs   r}   s           r'   async_log_failure_eventz(GenericAPILogger.async_log_failure_event  s     ',=TEUEU,U	  KV (.zz2KT'R$))T166!!-)%	 7  %%g.%%&>?4>>"doo5++--- 6- 	$$-c!fXR	8L8L8N7OP 	r   c                   K   	 | j                   s	 | j                   j                          yt        j                  dt	        | j                          d| j
                   d       | j
                  dk(  rg }| j                   D ]N  }| j                  j                  | j                  | j                  t        |            }|j                  |       P t        j                  |ddi d{   }t        |      D ]V  \  }}t        |t               rt        j"                  d	| d
|        2t        j                  d| d|j$                          X n| j
                  dk(  rt        | j                         }nJ| j
                  dk(  r#dj'                  d | j                   D              }nt)        d| j
                         | j                  j                  | j                  | j                  |       d{   }t        j                  d| j                   d|j$                   d| j
                          | j                   j                          y7 j7 ^# t         $ r@}	t        j"                  dt+        |	       dt-        j.                                 Y d}	~	dd}	~	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 z events in 'z' formatr   )urlrC   datareturn_exceptionsTz'Generic API Logger - Error sending log z: zGeneric API Logger - sent log z
, status: r   r   rr   c              3   2   K   | ]  }t        |        y wNr   ).0logs     r'   	<genexpr>z4GenericAPILogger.async_send_batch.<locals>.<genexpr>b  s     $OZ_s   zUnknown log_format: z#Generic API Logger - sent batch to z
, format: z)Generic API Logger Error sending batch - )rW   clearr   rK   rw   rE   rN   postrB   rC   r   rv   rQ   gather	enumerate
isinstancer!   rz   status_coder   rO   r#   r{   r|   )
rX   tasks	log_entrytask	responsesidxresultr   responser&   s
             r'   ry   z!GenericAPILogger.async_send_batch3  sw    ;	#>>r NN  "o   6s4>>7J6K<X\XgXgWhhpq (*!%I2277 MM $'	2 8 D
 LL& "0 #*..%"P4"PP	 $-Y#7KC!&)4&00EcU"VHU
 ',,<SEFL^L^K_` $8 ??l2%dnn5D__099$O$OOD$';DOO;L%MNN "&!8!8!=!= LL "> "  $$9$-- I'334Jt>OQ NN  "O Q.  	$$;CF82iFZFZF\E]^ 	
 NN  "sk   KI KB?I +I,DI 9I:A I :KI I 	J##6JJ& J##J& &KKr   c                 h   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 litellm_paramsmetadatamessagesresponse_costg        optional_params	call_typezlitellm.completion	cache_hitFusageidmodelr6   user)r   r   r   	startTimeendTimer   r   modelParametersr   r   r   r   cost)r   rK   r0   r#   r	   uuid4rL   r!   )rX   rY   rn   ro   rp   r   r   r   r   r   r   r   r   r   r   r[   r2   s                    r'   ru   z(GenericAPILogger._get_v1_logging_payloady  sK    	KF8T	
  $4b9z2.4" 	 ::j)zz/3/ **%6;JJ{,@A	JJ{E2	W%dC

$56 ""#ZZ,JJvr*. $ 
" "--/JC"5z * 	  s   D%%	D10D1)NNNNNr   )__name__
__module____qualname__r   r#   dictr   API_EVENT_TYPESLOG_FORMAT_TYPESrT   rP   r   r   ry   ru   __classcell__)r\   s   @r'   rA   rA   b   s     #'"&7;'+15XG3-XG $XG d?34	XG
  }XG -.XGt&HTN &P)V!FD#L3	3r.   rA   )#__doc__rQ   r   r   r<   r{   typingr   r   r   r   r   rc   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#   boolr-   r1   r?   rA   rJ   r.   r'   <module>r      s      	 	  7 7  +  F A 7>?;< 4 (1# 1$ 13s 3x~ 33C 3C 3&J( Jr.   