o
    is                     @   s|   d Z ddlmZmZmZ ddlmZ ddlmZ ddl	m
Z
mZmZmZmZmZmZmZ ddlmZmZ G dd deZd	S )
zMetrics logging observer for Pipecat.

This module provides an observer that logs metrics frames to the console,
allowing developers to monitor performance metrics, token usage, and other
statistics in real-time.
    )OptionalSetType)logger)MetricsFrame)LLMTokenUsageLLMUsageMetricsDataMetricsDataProcessingMetricsDataSmartTurnMetricsDataTTFBMetricsDataTTSUsageMetricsDataTurnMetricsData)BaseObserverFramePushedc                       s   e Zd ZdZ	ddeeee   f fddZde	fddZ
d	ed
efddZd	edefddZd	edededefddZd	edededefddZ  ZS )MetricsLogObservera{  Observer to log metrics activity to the console.

    Monitors and logs all MetricsFrame instances, including:

    - TTFBMetricsData (Time To First Byte)
    - ProcessingMetricsData (General processing time)
    - LLMUsageMetricsData (Token usage statistics)
    - TTSUsageMetricsData (Text-to-Speech character counts)
    - TurnMetricsData (Turn prediction metrics)

    This allows developers to track performance metrics, token usage,
    and other statistics throughout the pipeline.

    Examples:
        Log all metrics types::

            observers = [MetricsLogObserver()]

        Log only LLM and TTS metrics::

            from pipecat.metrics.metrics import LLMUsageMetricsData, TTSUsageMetricsData
            observers = [
                MetricsLogObserver(
                    include_metrics={LLMUsageMetricsData, TTSUsageMetricsData}
                )
            ]
    Ninclude_metricsc                    sX   t  jdi | |r#t|v r#ddl}|jdtdd |th thB }|| _t | _	dS )a%  Initialize the metrics log observer.

        Args:
            include_metrics: Set of metrics types to include. If specified, only these
                metrics types will be logged. If None, all metrics are logged.
            **kwargs: Additional arguments passed to parent class.
        r   NzSSmartTurnMetricsData is deprecated in include_metrics, use TurnMetricsData instead.   )
stacklevel )
super__init__r   warningswarnDeprecationWarningr   _include_metricsset_frames_seen)selfr   kwargsr   	__class__r   b/home/ubuntu/.local/lib/python3.10/site-packages/pipecat/observers/loggers/metrics_log_observer.pyr   =   s   zMetricsLogObserver.__init__datac                    sj   |j }|j}t|tsdS |j| jv rdS | j|j |d }|jD ]}| |s,q$| 	|| q$dS )a'  Handle frame push events and log metrics frames.

        Logs MetricsFrame instances with detailed information about the
        metrics data, formatted appropriately for each metrics type.

        Args:
            data: Frame push event data containing source, frame, and timestamp.
        Ni ʚ;)
frame	timestamp
isinstancer   idr   addr#   _should_log_metrics_log_metrics_data)r   r#   r$   r%   time_secmetrics_datar   r   r"   on_push_frameX   s   	


z MetricsLogObserver.on_push_framer,   returnc                 C   s   | j durt|| j v S dS )zDetermine if a metrics data item should be logged based on filters.

        Args:
            metrics_data: The metrics data to check.

        Returns:
            True if the metrics should be logged, False otherwise.
        NT)r   type)r   r,   r   r   r"   r)   w   s   

z&MetricsLogObserver._should_log_metricsr+   c                 C   s.  d|j  d}|jrd|j dnd}t|tr.td| d| d|j d	|d
d	 dS t|trItd| d| d|j d	|d
d	 dS t|trX| 	|||| dS t|t
rstd| d| d|j d|d
d	 dS t|tr| |||| dS td| d| d| d|d
d	 dS )zLog a single metrics data item.

        Args:
            metrics_data: The metrics data to log.
            time_sec: Timestamp in seconds.
        []z ()    📊 z TTFB: zs at z.3fsz PROCESSING TIMEz
 TTS USAGEz characters at z METRICS at N)	processormodelr&   r   r   debugvaluer
   r   _log_llm_usager   r   	_log_turn)r   r,   r+   processor_info
model_infor   r   r"   r*      s*   
 
 

 
z$MetricsLogObserver._log_metrics_datar>   r?   c                 C   s   |j }d|j d|j d|j g}|jdur"|d|j  |jdur0|d|j  |jdur>|d|j  d|}t	
d	| d
| d| d|dd	 dS )a  Log LLM token usage metrics.

        Args:
            metrics_data: The LLM usage metrics data.
            processor_info: Formatted processor name string.
            model_info: Formatted model name string.
            time_sec: Timestamp in seconds.
        zprompt: zcompletion: ztotal: Nzcache_read: zcache_creation: zreasoning: z, r4   z LLM TOKEN USAGEr5   r7   .2fr6   )r;   prompt_tokenscompletion_tokenstotal_tokenscache_read_input_tokensappendcache_creation_input_tokensreasoning_tokensjoinr   r:   )r   r,   r>   r?   r+   usagedetails	usage_strr   r   r"   r<      s   






z!MetricsLogObserver._log_llm_usagec                 C   sV   |j rdnd}|jdd}td| d| d| d|jd	d
| d|dd dS )a  Log turn prediction metrics.

        Args:
            metrics_data: The turn metrics data.
            processor_info: Formatted processor name string.
            model_info: Formatted model name string.
            time_sec: Timestamp in seconds.
        COMPLETE
INCOMPLETEz.1fmsr4   z TURNr5   z (probability: z.2%z, e2e: z) at r@   r6   N)is_completee2e_processing_time_msr   r:   probability)r   r,   r>   r?   r+   complete_stre2e_strr   r   r"   r=      s   zMetricsLogObserver._log_turn)N)__name__
__module____qualname____doc__r   r   r   r	   r   r   r-   boolr)   floatr*   r   strr<   r   r=   __classcell__r   r   r    r"   r       s6     
'r   N)rW   typingr   r   r   logurur   pipecat.frames.framesr   pipecat.metrics.metricsr   r   r	   r
   r   r   r   r   pipecat.observers.base_observerr   r   r   r   r   r   r"   <module>   s   (
