
    iME                        d dl Z d dlmZmZmZmZmZ d dlmZ d dl	m
Z
 d dlmZmZ d dlmZ d dlmZ erd dlmZ d d	lmZmZmZmZmZmZ  G d
 de      Zd(dZd(dZd(dZd(dZd(dZ d(dZ!d(dZ"dee#   de#fdZ$dddee%   dee%   fdZ&dddee   fdZ'dee(   de(fdZ)dddee   ddfd Z*dee   dee%   fd!Z+de(dee%   fd"Z,ddd#ede(d$e(fd%Z-ddd&ee(   ddfd'Z.y))    N)TYPE_CHECKINGAnyDictOptionalType)override)verbose_logger)BaseLLMObsOTELAttributessafe_set_attribute)
safe_dumps)StandardLoggingPayload)Span)MessageAttributesImageAttributesSpanAttributesAudioAttributesEmbeddingAttributesOpenInferenceSpanKindValuesc                   V    e Zd Zeedddeeef   fd              Zeedd              Z	y)ArizeOTELAttributesspanr   kwargsc           	         |j                  d      }|r|d   }t        | t        j                  |j                  dd             t	        |      D ]y  \  }}t        j
                   d| }t        | | dt        j                   |j                  d             t        | | dt        j                   |j                  dd             { y y )Nmessagescontent .role)	getr   r   INPUT_VALUE	enumerateLLM_INPUT_MESSAGESr   MESSAGE_ROLEMESSAGE_CONTENT)r   r   r   last_messageidxmsgprefixs          r/Users/manta/Documents/Projects/TheRoad-I1/.venv/lib/python3.12/site-packages/litellm/integrations/arize/_utils.pyset_messagesz ArizeOTELAttributes.set_messages   s     ::j) #B<L**  B/ &h/S*==>auE"VHA&7&D&D%EFPV #ha 1 A ABCGGIr* 0     c           	         ddl m}m} t        |j	                  dg             D ]  \  }}|j	                  di       }t        | |j                  |j	                  dd             |j                   d| }t        | | d|j                   |j	                  d             t        | | d|j                   |j	                  dd              y	)
z
        Sets output message attributes on the span from the LLM response.
        Args:
            span: The OpenTelemetry span to set attributes on
            response_obj: The response object containing choices with messages
        r   )r   r   choicesmessager   r   r   r   N)
*litellm.integrations._types.open_inferencer   r   r"   r    r   OUTPUT_VALUELLM_OUTPUT_MESSAGESr$   r%   )r   response_objr   r   r'   choiceresponse_messager)   s           r*   set_response_output_messagesz0ArizeOTELAttributes.set_response_output_messages8   s    	

 %\%5%5i%DEKC%zz)R8++ $$Y3 '::;1SEBF(!-::;< $$V,
 (!-==>? $$Y3 Fr,   Nr   r   )
__name__
__module____qualname__staticmethodr   r   strr   r+   r6    r,   r*   r   r      sN    6 4S>   6   r,   r   r   r   c                    t        |d      syt        | |t        t               t	        | |t
        t               t        | |t        t               t        | |t        t               t        | |t        t               t        | |t               y)zAHelper to set response output and token usage attributes on span.r    N)hasattr_set_choice_outputsr   r   _set_image_outputsr   _set_audio_outputsr   _set_embedding_outputsr   _set_structured_outputs_set_usage_outputsr   r3   s     r*   _set_response_attributesrG   \   sf     <'l,=~Nt\?NKt\?NK4/BNSD,0A>Rt\>:r,   c           	         t        |j                  dg             D ]  \  }}|j                  di       }t        | |j                  |j                  dd             |j                   d| }t        | | d|j
                   |j                  d             t        | | d|j                   |j                  dd              y )Nr.   r/   r   r   r   r   )r"   r    r   r1   r2   r$   r%   )r   r3   	msg_attrs
span_attrsr'   r4   r5   r)   s           r*   r@   r@   j   s     !1!1)R!@AV!::i4##  B/	

 2231SE:ha	../0  (	

 	ha	1123  B/	
 Br,   c                 4   |j                  dg       }t        |      D ]x  \  }}|j                  d      }|%|j                  d      rd|j                  d       }|sA|dk(  rt        | |j                  |       t        | |j                   d| |       z y )Ndataurlb64_jsonzdata:image/png;base64,r   r   )r    r"   r   r1   	IMAGE_URL)r   r3   image_attrsrJ   imagesiimageimg_urls           r*   rA   rA      s    fb)Ff%5))E"?uyy4.uyy/D.EFG6tZ%<%<gF4K$9$9#:!A3!?I &r,   c                    |j                  dg       }t        |      D ]  \  }}|j                  d      }|%|j                  d      rd|j                  d       }|r8|dk(  rt        | |j                  |       t        | |j                   d| |       |j                  d      }|rt        | |j
                   d| |       |j                  d      }	|	st        | |j                   d| |	        y )	NaudiorM   rN   zdata:audio/wav;base64,r   r   	mime_type
transcript)r    r"   r   r1   	AUDIO_URLAUDIO_MIME_TYPEAUDIO_TRANSCRIPT)
r   r3   audio_attrsrJ   rV   rR   
audio_item	audio_url
audio_mimeaudio_transcripts
             r*   rB   rB      s    Wb)E"5):NN5)	
!;0
1K0LMIAv"4)@)@)Lt(=(='>as%CYO^^K0
t(C(C'DAaS%I:V%>>,7556as;=M! *r,   c                 z   |j                  dg       }t        |      D ]  \  }}|j                  d      }|rJ|dk(  r t        | |j                  t	        |             t        | |j
                   d| t	        |             |j                  d      }|swt        | |j                   d| t	        |              y )NrL   	embeddingr   r   text)r    r"   r   r1   r<   EMBEDDING_VECTOREMBEDDING_TEXT)	r   r3   embedding_attrsrJ   
embeddingsrR   embedding_itemembedding_vectorembedding_texts	            r*   rC   rC      s    !!&"-J&z2>)--k:Av"++() "334AaS9$% (++F3"112!A37N#% 3r,   c                    |j                  dg       }t        |      D ]%  \  }}|j                   d| }t        |d      s%|j                  }|dk(  rQt        |d      rE|j
                  D ]5  }	t        |	d      st        | | d|j                   |	j                         7 |dk(  st        |d      sd	}
|j                  }|r t        |      d
kD  r|d
   }t        |dd	      }
t        |dd      }t        | |j                  |
       t        | | d|j                   |
       t        | | d|j                   |       ( y )Noutputr   type	reasoningsummaryrc   r/   r   r   r   r   	assistant)r    r"   r2   r?   rm   ro   r   MESSAGE_REASONING_SUMMARYrc   r   lengetattrr1   r%   r$   )r   r3   rI   rJ   output_itemsrR   itemr)   	item_typero   message_contentcontent_listfirst_contentmessage_roles                 r*   rD   rD      sL   ##Hb1L\*42231QC8tV$II	#i(@<<7F+&!(!I$G$G#HI ( )#i(@ O<<LL 1A 5 ,Q")-"D"4=LtZ%<%<oN)";";!<= txq1G1G0H%I<X3 +r,   c                    |xr |j                  d      }|sy t        | |j                  |j                  d             |j                  d      xs |j                  d      }|rt        | |j                  |       |j                  d      xs |j                  d      }|rt        | |j                  |       |j                  di       j                  d      }|rt        | |j
                  |       y y )	Nusagetotal_tokenscompletion_tokensoutput_tokensprompt_tokensinput_tokensoutput_tokens_detailsreasoning_tokens)r    r   LLM_TOKEN_COUNT_TOTALLLM_TOKEN_COUNT_COMPLETIONLLM_TOKEN_COUNT_PROMPT,LLM_TOKEN_COUNT_COMPLETION_DETAILS_REASONING)r   r3   rJ   r|   r~   r   r   s          r*   rE   rE      s    6\--g6Ej..		.0I 		"56T%))O:T*779J	
 IIo.K%))N2KM4!B!BMRyy!8"=AABTUCC	
 r,   	call_typereturnc                    | st         j                  j                  S t        |       j	                         dv rt         j
                  j                  S dv rt         j                  j                  S dv rt         j                  j                  S dv sdv rt         j                  j                  S dk(  sdk(  sj                  d      rt         j                  j                  S d	v sd
v sdv rt         j                  j                  S t        fddD              rt         j                  j                  S t        fddD              rt         j                  j                  S t         j                  j                  S )z=
    Map LiteLLM call types to OpenInference span kinds.
    embedreranksearch
moderation	guardrailcall_mcp_toolmcptoolasend_messagea2arp   c              3   &   K   | ]  }|v  
 y wNr=   .0keywordlowereds     r*   	<genexpr>z2_infer_open_inference_span_kind.<locals>.<genexpr>  s"      
G 	7
   )
completionchatrS   rV   speechtranscriptiongenerate_contentresponsevideosrealtimepass_throughanthropic_messagesocrc              3   &   K   | ]  }|v  
 y wr   r=   r   s     r*   r   z2_infer_open_inference_span_kind.<locals>.<genexpr>(  s      HG 	7Hr   )filebatch	containerfine_tuning_job)r   UNKNOWNvaluer<   lower	EMBEDDINGRERANKER	RETRIEVER	GUARDRAILendswithTOOLAGENTanyLLMCHAIN)r   r   s    @r*   _infer_open_inference_span_kindr      sW   
 *22888)n""$G'*44:::7*339997*44:::w+"8*44:::/!W%59I9I&9Q*//555'!Ug%59O*00666
 
 $ +..444
 H  +00666&..444r,   optional_toolsmetadata_toolsc                 ^   |r	t        |      D ]  \  }}t        |t              st        |j                  d      t              r|j                  d      nd}|sL|j                  d      }|r!t	        | t
        j                   d| d|       |j                  d      }|r!t	        | t
        j                   d| d|       |j                  d      }|t	        | t
        j                   d| d	t        j                  |              |rt        |t              rt        |      D ]  \  }}t        |t              s|j                  d      }|r!t	        | t
        j                   d
| d|       |j                  d      }|s_t	        | t
        j                   d
| d|        yyy)zFset tool attributes on span from optional_params or tool call metadatafunctionNnamer   z.namedescriptionz.description
parametersz.parametersz.tools.)r"   
isinstancedictr    r   r   	LLM_TOOLSjsondumpslistLLM_INVOCATION_PARAMETERS)	r   r   r   r'   r   r   	tool_nametool_descriptionparamss	            r*   _set_tool_attributesr   1  s    ">2ICdD)(2488J3G(N$TX   V,I"^556auEBI  (||M:"%//0#lC$
 \\,/F!"%//0#kBJJv&- 38 *^T:">2ICdD)(I"%??@uER  $xx6"%??@uLY$ 3 ;~r,   
attributesc           	      p   	 t        |j                  d            }|j                  di       xs i }|j                  d      }|t        d      |r|j                  d      nd}t        | |t               t        |      }t        |      }	|j                  d      }
t        | |||||t               t        |
	      }t        | |	|       |	s|r7|t        j                  j                  k7  rt        j                  j                  }t        | t        j                  |       |j                  | |       |r|j                  d
      nd}t!        | |t               t#        | |       y# t$        $ rD}t'        j(                  d|        t+        | d      r| j-                  |       Y d}~yY d}~yd}~ww xY w)zc
    Populates span with OpenInference-compliant LLM attributes for Arize and Phoenix tracing.
    optional_paramslitellm_paramsstandard_logging_objectNz+standard_logging_object not found in kwargsmetadatar   r   r   standard_logging_payloadr   r   r3   rJ   )r   model_parametersrF   z=[Arize/Phoenix] Failed to set OpenInference span attributes: record_exception)_sanitize_optional_paramsr    
ValueError_set_metadata_attributesr   _extract_metadata_tools_extract_optional_tools_set_request_attributesr   r   r   r   r   r   OPENINFERENCE_SPAN_KINDr+   _set_model_paramsrG   	Exceptionr	   errorr?   r   )r   r   r3   r   r   r   r   r   r   r   r   	span_kindmodel_paramses                 r*   set_attributesr   g  s   6%3FJJ?P4QR$4b9?REKZZ%F
  $+JKK ( %((4 	
 	!x@0:0A,00=	%=+)%%	
 4iH	T>>Bn6;;AAA388>>I4!G!GSf- ( %(();< 	
 	$n= dF %KA3O	
 4+,!!!$$ -	%s   E%E( (	F515F00F5r   c                 N    t        | t              si S | j                  dd        | S )Nsecret_fields)r   r   popr   s    r*   r   r     s'    ot,	.r,   r   c                 J    |!t        | |j                  t        |             y y r   )r   METADATAr   )r   r   rJ   s      r*   r   r     s$    4!4!4j6JK r,   c                     t        | t              sy | j                  d      }t        |t              r|j                  d      S y )Nllmtoolsr   r   r    )r   llm_objs     r*   r   r     s9    h%ll5!G'4 {{7##r,   c                 H    t        | t              r| j                  d      S d S )Nr   r   r   s    r*   r   r     s"    +5ot+L?w'VRVVr,   r   r   c           
      l   |j                  d      r&t        | |j                  |j                  d             t        | d|j                  d             t        | |j                  |j                  dd             |j                  d      rt        | d|j                  d             |j                  d      rt        | d	|j                  d             |j                  d
      rt        | d|j                  d
             t        | dt	        |j                  dd                   |j                  d      rt        | d|j                  d             |r-|j                  d      rt        | d|j                  d             |r/|j                  d      rt        | d|j                  d             y y y )Nmodelzllm.request.typer   custom_llm_providerUnknown
max_tokenszllm.request.max_tokenstemperaturezllm.request.temperaturetop_pzllm.request.top_pzllm.is_streamingstreamFuserzllm.useridzllm.response.idzllm.response.model)r    r   LLM_MODEL_NAMELLM_PROVIDERr<   r   s          r*   r   r     s    zz'4!:!:FJJw<OP ":">">{"K 0)< <(*O,?,?,M	
 =)+_-@-@-O	
 7#4!4o6I6I'6RS #o&9&9(E&J"K 6"4_-@-@-HI((.4!2L4D4DT4JK((14!5|7G7G7PQ 2|r,   r   c                     |sy t        | |j                  t        |             |j                  d      r,|j                  d      }|t        | |j                  |       y y y )Nr   )r   r   r   r    USER_ID)r   r   rJ   user_ids       r*   r   r     sd    j22J|4L ""6*tZ%7%7A   r,   r7   )/r   typingr   r   r   r   r   typing_extensionsr   litellm._loggingr	   Elitellm.integrations.opentelemetry_utils.base_otel_llm_obs_attributesr
   r   *litellm.litellm_core_utils.safe_json_dumpsr   litellm.types.utilsr   opentelemetry.tracer   r0   r   r   r   r   r   r   r   rG   r@   rA   rB   rC   rD   rE   r<   r   r   r   r   r   r   r   r   r   r   r   r=   r,   r*   <module>r     s    ; ; & + B 6( ?2 ?D;
*J .6Y<
265x} 65 65r3
3"*4.3BJ4.3l<%
<%489Q4R<%~x~ $ L6 LXc] LSW L
hsm  WT Whtn W*R
*R 5*R 	*R
 *RZ
BF 
B(4. 
BQU 
Br,   