
    .h(                       d dl m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 d dl	m
Z
 d dlZddlmZ ddlmZmZ dd	lmZ dd
lmZ  G d de          Z G d de          Z G d de          Z e            Z ee          ZddZddZdS )    )annotationsN)cached_property)Any   )logger   )TracingExporterTracingProcessor)Span)Tracec                      e Zd ZdZddZdS )	ConsoleSpanExporterz+Prints the traces and spans to the console.itemslist[Trace | Span[Any]]returnNonec                    |D ]\}t          |t                    r!t          d|j         d|j         d           8t          d|                                            ]d S )Nz[Exporter] Export trace_id=z, name=z, z[Exporter] Export span: )
isinstancer   printtrace_idnameexport)selfr   items      V/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/agents/tracing/processors.pyr   zConsoleSpanExporter.export   s}     	B 	BD$&& BWDMWW$)WWWXXXX@@@AAAA		B 	B    Nr   r   r   r   )__name__
__module____qualname____doc__r    r   r   r   r      s4        55B B B B B Br   r   c                  ~    e Zd Z	 	 	 	 	 	 	 dddZddZed             Zed             Zed             ZddZ	d Z
dS ) BackendSpanExporterN'https://api.openai.com/v1/traces/ingest         ?      >@api_key
str | Noneorganizationprojectendpointstrmax_retriesint
base_delayfloat	max_delayc                    || _         || _        || _        || _        || _        || _        || _        t          j        t          j	        dd                    | _
        dS )a  
        Args:
            api_key: The API key for the "Authorization" header. Defaults to
                `os.environ["OPENAI_API_KEY"]` if not provided.
            organization: The OpenAI organization to use. Defaults to
                `os.environ["OPENAI_ORG_ID"]` if not provided.
            project: The OpenAI project to use. Defaults to
                `os.environ["OPENAI_PROJECT_ID"]` if not provided.
            endpoint: The HTTP endpoint to which traces/spans are posted.
            max_retries: Maximum number of retries upon failures.
            base_delay: Base delay (in seconds) for the first backoff.
            max_delay: Maximum delay (in seconds) for backoff growth.
        <         @)timeoutconnectr7   N)_api_key_organization_projectr-   r/   r1   r3   httpxClientTimeout_client)r   r)   r+   r,   r-   r/   r1   r3   s           r   __init__zBackendSpanExporter.__init__   s`    .  ) &$" |EM"c,R,R,RSSSr   c                "    || _         || _        dS )zSet the OpenAI API key for the exporter.

        Args:
            api_key: The OpenAI API key to use. This is the same key used by the OpenAI Python
                client.
        N)r:   r)   )r   r)   s     r   set_api_keyzBackendSpanExporter.set_api_keyA   s      r   c                N    | j         pt          j                            d          S )NOPENAI_API_KEY)r:   osenvirongetr   s    r   r)   zBackendSpanExporter.api_keyL   s    }@
/? @ @@r   c                N    | j         pt          j                            d          S )NOPENAI_ORG_ID)r;   rF   rG   rH   rI   s    r   r+   z BackendSpanExporter.organizationP   s    !DRZ^^O%D%DDr   c                N    | j         pt          j                            d          S )NOPENAI_PROJECT_ID)r<   rF   rG   rH   rI   s    r   r,   zBackendSpanExporter.projectT   s    }C
/B C CCr   r   r   r   r   c                x   |sd S | j         st          j        d           d S d |D             }d|i}d| j          ddd}| j        r
| j        |d<   | j        r
| j        |d	<   d
}| j        }	 |dz  }	 | j                            | j        ||          }|j	        dk     r't          j
        dt          |           d           d S d|j	        cxk    rdk     r)n n&t          j        d|j	         d|j                    d S t          j        d|j	         d           n3# t          j        $ r!}t          j        d|            Y d }~nd }~ww xY w|| j        k    rt          j        d           d S |t#          j        d
d|z            z   }	t'          j        |	           t+          |dz  | j                  }P)Nz0OPENAI_API_KEY is not set, skipping trace exportc                ^    g | ]*}|                                 |                                 +S r"   )r   ).0r   s     r   
<listcomp>z.BackendSpanExporter.export.<locals>.<listcomp>`   s-    AAA$4;;==AAAAr   datazBearer zapplication/jsonz	traces=v1)AuthorizationzContent-TypezOpenAI-BetazOpenAI-OrganizationzOpenAI-Projectr   Tr   )urlheadersjsoni,  z	Exported z itemsi  i  z![non-fatal] Tracing client error z: z"[non-fatal] Tracing: server error z, retrying.z%[non-fatal] Tracing: request failed: zB[non-fatal] Tracing: max retries reached, giving up on this batch.g?r   )r)   r   warningr+   r,   r1   r@   postr-   status_codedebuglenerrortextr=   RequestErrorr/   randomuniformtimesleepminr3   )
r   r   rR   payloadrU   attemptdelayresponseexc
sleep_times
             r   r   zBackendSpanExporter.exportX   s[    	F| 	NMNNNFAA%AAA4. 6t|55.&
 
  	?-1->G)*< 	5(,G$% !	3qLGN<,,V],^^ '#--L!?SZZ!?!?!?@@@F (.444444444LcH<PccT\Tacc   F Z9MZZZ    % N N NLsLLMMMMMMMMN
 $***abbb 3;!?!??JJz"""	4>22EC!	3s%   2AD 9D D E.E

Ec                8    | j                                          dS )z!Close the underlying HTTP client.N)r@   closerI   s    r   rk   zBackendSpanExporter.close   s    r   )NNNr%   r&   r'   r(   )r)   r*   r+   r*   r,   r*   r-   r.   r/   r0   r1   r2   r3   r2   )r)   r.   r   )r   r   r    rA   rC   r   r)   r+   r,   r   rk   r"   r   r   r$   r$      s         ##'"A T  T  T  T  TD	 	 	 	 A A _A E E _E D D _D;3 ;3 ;3 ;3z    r   r$   c                  d    e Zd ZdZ	 	 	 	 d#d$dZd%dZd%dZd&dZd&dZd'd(dZ	d Z
d Zd)d*d"ZdS )+BatchTraceProcessorzSome implementation notes:
    1. Using Queue, which is thread-safe.
    2. Using a background thread to export spans, to minimize any performance issues.
    3. Spans are stored in memory until they are exported.
           r6   ffffff?exporterr	   max_queue_sizer0   max_batch_sizeschedule_delayr2   export_trigger_ratioc                   || _         t          j        |          | _        || _        || _        || _        t          j                    | _	        t          ||z            | _        t          j                    | j        z   | _        t          j        | j        d          | _        | j                                         dS )a  
        Args:
            exporter: The exporter to use.
            max_queue_size: The maximum number of spans to store in the queue. After this, we will
                start dropping spans.
            max_batch_size: The maximum number of spans to export in a single batch.
            schedule_delay: The delay between checks for new spans to export.
            export_trigger_ratio: The ratio of the queue size at which we will trigger an export.
        )maxsizeT)targetdaemonN)	_exporterqueueQueue_queue_max_queue_size_max_batch_size_schedule_delay	threadingEvent_shutdown_eventr0   _export_trigger_sizera   _next_export_timeThread_run_worker_threadstart)r   rq   rr   rs   rt   ru   s         r   rA   zBatchTraceProcessor.__init__   s    " "6;k.6Y6Y6Y---(00 %(9M(M$N$N! "&t/C!C'.diMMM!!#####r   tracer   r   r   c                    	 | j                             |           d S # t          j        $ r t	          j        d           Y d S w xY w)NzQueue is full, dropping trace.r}   
put_nowaitr{   Fullr   rW   r   r   s     r   on_trace_startz"BatchTraceProcessor.on_trace_start   sZ    	=K""5)))))z 	= 	= 	=N;<<<<<<	=    #AAc                    d S Nr"   r   s     r   on_trace_endz BatchTraceProcessor.on_trace_end       r   span	Span[Any]c                    d S r   r"   r   r   s     r   on_span_startz!BatchTraceProcessor.on_span_start   r   r   c                    	 | j                             |           d S # t          j        $ r t	          j        d           Y d S w xY w)NzQueue is full, dropping span.r   r   s     r   on_span_endzBatchTraceProcessor.on_span_end   sZ    	<K""4(((((z 	< 	< 	<N:;;;;;;	<r   Nr7   float | Nonec                n    | j                                          | j                            |           dS )z`
        Called when the application stops. We signal our thread to stop, then join it.
        r9   N)r   setr   join)r   r7   s     r   shutdownzBatchTraceProcessor.shutdown   s9     	  """   11111r   c                2    |                      d           dS )z@
        Forces an immediate flush of all queued spans.
        TforceN)_export_batchesrI   s    r   force_flushzBatchTraceProcessor.force_flush   s!     	4(((((r   c                   | j                                         st          j                    }| j                                        }|| j        k    s|| j        k    r7|                     d           t          j                    | j        z   | _        nt          j	        d           | j                                         |                     d           d S )NFr   g?T)
r   is_setra   r}   qsizer   r   r   r   rb   )r   current_time
queue_sizes      r   r   zBatchTraceProcessor._run   s    &--// 	 9;;L**,,J t555tG`9`9`$$5$111)-t7K)K&& 
3 &--// 	  	4(((((r   Fr   boolc                   	 g }| j                                         s|st          |          | j        k     rv	 |                    | j                                                    n# t          j        $ r Y n7w xY w| j                                         s|^t          |          | j        k     v|sdS | j        	                    |           )zDrains the queue and exports in batches. If force=True, export everything.
        Otherwise, export up to `max_batch_size` repeatedly until the queue is empty or below a
        certain threshold.
        TN)
r}   emptyr[   r   append
get_nowaitr{   Emptyrz   r   )r   r   items_to_exports      r   r   z#BatchTraceProcessor._export_batches   s    
	379O k'')) _--0DDD#**4;+A+A+C+CDDDD{   E k'')) _--0DDD #  N!!/222%	3s   ,A% %A76A7)rn   ro   r6   rp   )
rq   r	   rr   r0   rs   r0   rt   r2   ru   r2   )r   r   r   r   )r   r   r   r   r   )r7   r   )F)r   r   )r   r   r    r!   rA   r   r   r   r   r   r   r   r   r"   r   r   rm   rm      s          #! #&)$ $ $ $ $B= = = =      < < < <2 2 2 2 2) ) )) ) )"3 3 3 3 3 3 3r   rm   r   c                     t           S )zOThe default exporter, which exports traces and spans to the backend in batches.)_global_exporterr"   r   r   default_exporterr     s    r   c                     t           S )zPThe default processor, which exports traces and spans to the backend in batches.)_global_processorr"   r   r   default_processorr     s    r   )r   r$   )r   rm   )
__future__r   rF   r{   r_   r   ra   	functoolsr   typingr   r=   r   processor_interfacer	   r
   spansr   tracesr   r   r$   rm   r   r   r   r   r"   r   r   <module>r      s   " " " " " " 				        % % % % % %              B B B B B B B B            B B B B B/ B B By y y y y/ y y yxq3 q3 q3 q3 q3* q3 q3 q3j '&(( ''(899    
     r   