§
    xÅj5  ã            
       ó®  — d dl Z d dlmZ d dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZmZ d dlmZ d dlmZmZ d dlmZ d d	lmZmZ d d
lmZmZ erd dlmZ d dlmZmZmZ 	 d dlZd dlmZm Z m!Z! n# e"$ r  ed¦  «        ‚w xY wdZ#d'd„Z$d(d„Z%d(d„Z&d)d„Z'd*d„Z(d*d„Z)	 	 	 	 	 	 	 	 	 	 d+d!„Z*	 	 	 	 	 	 	 	 	 	 d+d"„Z+ddd#e,ddd dddf
d$„Z- G d%„ d&e¦  «        Z.dS ),é    N)ÚTYPE_CHECKING)Úconsts)Úrecord_token_usage)Úget_start_span_functionÚset_data_normalizedÚtransform_openai_content_partÚ&truncate_and_annotate_embedding_inputsÚtruncate_and_annotate_messages)ÚSPANDATA)ÚDidNotEnableÚIntegration)Úshould_send_default_pii)Úhas_span_streaming_enabledÚshould_truncate_gen_ai_input)Úevent_from_exceptionÚhas_data_collection_enabled)Údatetime)ÚAnyÚDictÚList)Úfailure_callbackÚinput_callbackÚsuccess_callbackzLiteLLM not installedÚ_sentry_spanÚkwargsúDict[str, Any]Úspanr   Úreturnc                 ó   — || t           <   d S ©N)Ú	_SPAN_KEY)r   r   s     úPC:\Projects\Historical\venv\Lib\site-packages\sentry_sdk/integrations/litellm.pyÚ_store_spanr#   '   s   € Ø€F�9ÑÐÐó    c                 ó6   — |                       t          ¦  «        S r    )Úgetr!   ©r   s    r"   Ú
_peek_spanr(   +   s   € Ø�:Š:•iÑ Ô Ð r$   c                 ó8   — |                       t          d ¦  «        S r    )Úpopr!   r'   s    r"   Ú	_pop_spanr+   /   s   € Ø�:Š:•i Ñ&Ô&Ð&r$   ÚmessagesúList[Dict[str, Any]]c                 ó„  — t          j        | ¦  «        } | D ]¨}t          |t          ¦  «        sŒ|                     d¦  «        }t          |t
          t          f¦  «        r_g }|D ]U}t          |t          ¦  «        r)t          |¦  «        }|                     |�|n|¦  «         Œ@|                     |¦  «         ŒV||d<   Œ©| S )zí
    Convert the message parts from OpenAI format to the `gen_ai.request.messages` format
    using the OpenAI-specific transformer (LiteLLM uses OpenAI's message format).

    Deep copies messages to avoid mutating original kwargs.
    Úcontent)	ÚcopyÚdeepcopyÚ
isinstanceÚdictr&   ÚlistÚtupler   Úappend)r,   Úmessager/   ÚtransformedÚitemÚresults         r"   Ú_convert_message_partsr;   3   sØ   € õ Œ}˜XÑ&Ô&€Hàð -ð -ˆÝ˜'¥4Ñ(Ô(ð 	ØØ—+’+˜iÑ(Ô(ˆÝ�g¥¥e˜}Ñ-Ô-ð 		-ØˆKØð -ð -�Ý˜d¥DÑ)Ô)ð -Ý:¸4Ñ@Ô@�Fà×&Ò&°Ð1C v vÈÑNÔNÐNÐNà×&Ò& tÑ,Ô,Ð,Ð,Ø!,ˆG�IÑøØ€Or$   c                 óH  — t          j        ¦   «         }|                     t          ¦  «        }|€dS |                      dd¦  «        }	 t          j        |¦  «        \  }}}}n# t          $ r |}d}Y nw xY w|                      dd¦  «        }|dk    s|dk    rd}nd	}t          |j	        ¦  «        rZt           j
                             |› d
|› �|d	k    rt          j        j        nt          j        j        t          j        dœ¬¦  «        }	nc t#          ¦   «         |d	k    rt          j        j        nt          j        j        |› d
|› �t          j        ¬¦  «        }	|	                     ¦   «          t'          | |	¦  «         t)          |	t*          j        |¦  «         t)          |	t*          j        |¦  «         d}
t1          |j	        ¦  «        r|j	        d         d         d         }
nt3          ¦   «         r	|j        rd}
|
�r|dk    r‹|                      d¦  «        }|rst          j        ¦   «         }t9          |t:          ¦  «        r|n|g}t=          |j	        ¦  «        rt?          ||	|¦  «        n|}|�t)          |	t*          j         |d¬¦  «         n€|                      dg ¦  «        }|rht          j        ¦   «         }tC          |¦  «        }t=          |j	        ¦  «        rtE          ||	|¦  «        n|}|�t)          |	t*          j#        |d¬¦  «         t*          j$        t*          j%        t*          j&        t*          j'        t*          j(        t*          j)        t*          j*        dœ}| +                    ¦   «         D ]-\  }}|                      |¦  «        }|�t)          |	||¦  «         Œ.dS )zHandle the start of a request.NÚmodelÚ ÚunknownÚ	call_typeÚ	embeddingÚ
aembeddingÚ
embeddingsÚchatú )z	sentry.opzsentry.origin)ÚnameÚ
attributes)ÚoprF   ÚoriginFÚdata_collectionÚgen_aiÚinputsTÚinput)Úunpackr,   )r=   ÚstreamÚ
max_tokensÚpresence_penaltyÚfrequency_penaltyÚtemperatureÚtop_p),Ú
sentry_sdkÚ
get_clientÚget_integrationÚLiteLLMIntegrationr&   ÚlitellmÚget_llm_providerÚ	Exceptionr   ÚoptionsÚtracesÚ
start_spanr   ÚOPÚGEN_AI_CHATÚGEN_AI_EMBEDDINGSrI   r   Ú	__enter__r#   r   r   ÚGEN_AI_SYSTEMÚGEN_AI_OPERATION_NAMEr   r   Úinclude_promptsÚget_current_scoper2   r4   r   r	   ÚGEN_AI_EMBEDDINGS_INPUTr;   r
   ÚGEN_AI_REQUEST_MESSAGESÚGEN_AI_REQUEST_MODELÚGEN_AI_RESPONSE_STREAMINGÚGEN_AI_REQUEST_MAX_TOKENSÚGEN_AI_REQUEST_PRESENCE_PENALTYÚ GEN_AI_REQUEST_FREQUENCY_PENALTYÚGEN_AI_REQUEST_TEMPERATUREÚGEN_AI_REQUEST_TOP_PÚitems)r   ÚclientÚintegrationÚ
full_modelr=   ÚproviderÚ_r@   Ú	operationr   Úrecord_inputsÚembedding_inputÚscopeÚ
input_listÚmessages_datar,   ÚparamsÚkeyÚ	attributeÚvalues                       r"   Ú_input_callbackr€   N   s  € åÔ"Ñ$Ô$€FØ×(Ò(Õ);Ñ<Ô<€KàÐØˆð —’˜G RÑ(Ô(€JðÝ 'Ô 8¸Ñ DÔ DÑˆˆx˜˜A˜AøÝð ð ð ØˆØˆˆˆðøøøð —
’
˜;¨Ñ-Ô-€IØ�KÒÐ 9°Ò#<Ð#<Ø ˆ	ˆ	àˆ	õ " &¤.Ñ1Ô1ð ÝÔ ×+Ò+ØÐ'Ð' Ð'Ð'ð ! FÒ*Ð*õ ”IÔ)Ð)åœÔ4å!3Ô!:ðð ð ,ñ 

ô 

ˆˆð )Õ&Ñ(Ô(ð  Ò&Ð&õ ”	Ô%Ð%å”YÔ0àÐ'Ð' Ð'Ð'Ý%Ô,ð
ñ 
ô 
ˆð 	�ŠÑÔÐå�˜ÑÔÐõ ˜�hÔ4°hÑ?Ô?Ð?Ý˜�hÔ<¸iÑHÔHÐHð €MÝ" 6¤>Ñ2Ô2ð ØœÐ'8Ô9¸(ÔCÀHÔMˆˆÝ	 Ñ	"Ô	"ð  {Ô'Bð Øˆàñ )Ø˜Ò$Ð$à$Ÿjšj¨Ñ1Ô1ˆOØð Ý"Ô4Ñ6Ô6�õ " /µ4Ñ8Ô8ð+�O�Oà)Ð*ð õ 4°F´NÑCÔCð$Õ:¸:ÀtÈUÑSÔSÐSà#ð ð
 !Ð,Ý'ØÝ Ô8Ø%Ø$ð	ñ ô ð øð —z’z *¨bÑ1Ô1ˆHØð Ý"Ô4Ñ6Ô6�Ý1°(Ñ;Ô;�õ 4°F´NÑCÔCð"Õ2°8¸TÀ5ÑIÔIÐIà!ð ð
 !Ð,Ý'ØÝ Ô8Ø%Ø$ð	ñ ô ð õ Ô.ÝÔ4ÝÔ8Ý$ÔDÝ%ÔFÝÔ:ÝÔ.ðð €Fð !Ÿ,š,™.œ.ð 8ð 8‰ˆˆYØ—
’
˜3‘”ˆØÐÝ  i°Ñ7Ô7Ð7øð8ð 8s   Á	A# Á#A4Á3A4c              ƒ   ó$   K  — t          | ¦  «        S r    )r€   r'   s    r"   Ú_async_input_callbackr‚   Å   s   è è € Ý˜6Ñ"Ô"Ð"r$   Úcompletion_responseÚ
start_timer   Úend_timec           
      ó  — t          | ¦  «        }|€dS t          j        ¦   «         }|                     t          ¦  «        }|€dS 	 t          |d¦  «        r t          |t          j        |j	        ¦  «         d}t          |j        ¦  «        r|j        d         d         d         }nt          ¦   «         r	|j        rd}|�rTt          |d¦  «        �rCg }|j        D �]}	t          |	d	¦  «        �rt          |	j        d
¦  «        r-|                     |	j                             ¦   «         ¦  «         ŒVt          |	j        d¦  «        r-|                     |	j                             ¦   «         ¦  «         Œ˜i }
t          |	j        d¦  «        r|	j        j        |
d<   t          |	j        d¦  «        r|	j        j        |
d<   t          |	j        d¦  «        r|	j        j        |
d<   |                     |
¦  «         �Œ|rt          |t          j        |¦  «         t          |d¦  «        rG|j        }t1          |t3          |dd¦  «        t3          |dd¦  «        t3          |dd¦  «        ¬¦  «         |                      d¦  «        }|dusd| v sd| v r,t7          | ¦  «        }|�|                     ddd¦  «         dS dS dS # |                      d¦  «        }|dusd| v sd| v r*t7          | ¦  «        }|�|                     ddd¦  «         w w w xY w)zHandle successful completion.Nr=   FrJ   rK   ÚoutputsTÚchoicesr7   Ú
model_dumpr3   Úroler/   Ú
tool_callsÚusageÚprompt_tokensÚcompletion_tokensÚtotal_tokens)Úinput_tokensÚoutput_tokensr�   rO   Úcomplete_streaming_responseÚ!async_complete_streaming_response)r(   rU   rV   rW   rX   Úhasattrr   r   ÚGEN_AI_RESPONSE_MODELr=   r   r\   r   re   rˆ   r7   r6   r‰   r3   rŠ   r/   r‹   ÚGEN_AI_RESPONSE_TEXTrŒ   r   Úgetattrr&   r+   Ú__exit__)r   rƒ   r„   r…   r   rq   rr   Úrecord_outputsÚresponse_messagesÚchoiceÚmsgrŒ   Úis_streamings                r"   Ú_success_callbackrž   É   s{  € õ �fÑÔ€DØ€|ØˆåÔ"Ñ$Ô$€FØ×(Ò(Õ);Ñ<Ô<€KØÐØˆð<0åÐ&¨Ñ0Ô0ð 	ÝØ•hÔ4Ð6IÔ6Oñô ð ð
 ˆÝ& v¤~Ñ6Ô6ð 	"Ø#œ^Ð,=Ô>¸xÔHÈÔSˆNˆNÝ$Ñ&Ô&ð 	"¨;Ô+Fð 	"Ø!ˆNàñ 	ÝÐ*¨IÑ6Ô6ñ Ø$&Ð!Ø1Ô9ð :ñ :�FÝ˜v yÑ1Ô1ñ :Ý" 6¤>°<Ñ@Ô@ð :Ø-×4Ò4°V´^×5NÒ5NÑ5PÔ5PÑQÔQÐQÐQÝ$ V¤^°VÑ<Ô<ð :Ø-×4Ò4°V´^×5HÒ5HÑ5JÔ5JÑKÔKÐKÐKð #%˜CÝ& v¤~°vÑ>Ô>ð BØ.4¬nÔ.A  F¡Ý& v¤~°yÑAÔAð HØ17´Ô1G  I¡Ý& v¤~°|ÑDÔDð NØ4:´NÔ4M  LÑ 1Ø-×4Ò4°SÑ9Ô9Ð9ùà$ð Ý'Ø�hÔ;Ð=Nñô ð õ
 Ð&¨Ñ0Ô0ð 	Ø'Ô-ˆEÝØÝ$ U¨O¸TÑBÔBÝ% eÐ-@À$ÑGÔGÝ$ U¨N¸DÑAÔAð	ñ ô ð ð —z’z (Ñ+Ô+ˆð  Ð$Ð$Ø,°Ð6Ð6Ø2°fÐ<Ð<å˜VÑ$Ô$ˆDØÐØ—’˜d D¨$Ñ/Ô/Ð/Ð/Ð/ð  Ðð =Ð<øð —z’z (Ñ+Ô+ˆð  Ð$Ð$Ø,°Ð6Ð6Ø2°fÐ<Ð<å˜VÑ$Ô$ˆDØÐØ—’˜d D¨$Ñ/Ô/Ð/Ð/ð  ð =øøøs   ÁH%J: Ê:ALc              ƒ   ó*   K  — t          | |||¦  «        S r    )rž   )r   rƒ   r„   r…   s       r"   Ú_async_success_callbackr      s&   è è € õ ØØØØñ	ô ð r$   Ú	exceptionc                 óP  — t          | ¦  «        }|€dS 	 t          |t          j        ¦   «         j        dddœ¬¦  «        \  }}t          j        ||¬¦  «         |                     t          |¦  «        |d¦  «         dS # |                     t          |¦  «        |d¦  «         w xY w)zHandle request failure.NrY   F)ÚtypeÚhandled)Úclient_optionsÚ	mechanism)Úhint)r+   r   rU   rV   r\   Úcapture_eventr˜   r£   )r   r¡   r„   r…   r   Úeventr§   s          r"   Ú_failure_callbackrª   '  s³   € õ �VÑÔ€DØ€|Øˆð
8å*ØÝ%Ô0Ñ2Ô2Ô:Ø(°UÐ;Ð;ð
ñ 
ô 
‰ˆˆtõ
 	Ô  ¨TÐ2Ñ2Ô2Ð2ð 	�Š•d˜9‘o”o y°$Ñ7Ô7Ð7Ð7Ð7øˆ�Š•d˜9‘o”o y°$Ñ7Ô7Ð7Ð7øøøs   •AA? Á?&B%c                   óN   — e Zd ZdZdZde› �Zddd deddfd	„Zedd
„¦   «         Z	dS )rX   a"  
    LiteLLM integration for Sentry.

    This integration automatically captures LiteLLM API calls and sends them to Sentry
    for monitoring and error tracking. It supports all 100+ LLM providers that LiteLLM
    supports, including OpenAI, Anthropic, Google, Cohere, and many others.

    Features:
    - Automatic exception capture for all LiteLLM calls
    - Token usage tracking across all providers
    - Provider detection and attribution
    - Input/output message capture (configurable)
    - Streaming response support
    - Cost tracking integration

    Usage:

    ```python
    import litellm
    import sentry_sdk

    # Initialize Sentry with the LiteLLM integration
    sentry_sdk.init(
        dsn="your-dsn",
        send_default_pii=True
        integrations=[
            sentry_sdk.integrations.LiteLLMIntegration(
                include_prompts=True  # Set to False to exclude message content
            )
        ]
    )

    # All LiteLLM calls will now be monitored
    response = litellm.completion(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": "Hello!"}]
    )
    ```

    Configuration:
    - include_prompts (bool): Whether to include prompts and responses in spans.
      Defaults to True. Set to False to exclude potentially sensitive data.
    rY   zauto.ai.TÚselfre   r   Nc                 ó   — || _         d S r    )re   )r¬   re   s     r"   Ú__init__zLiteLLMIntegration.__init__o  s   € Ø.ˆÔÐÐr$   c                  ó¢  — t           pg t          _         t          t          j         vr$t          j                              t          ¦  «         t          t          j         vr$t          j                              t          ¦  «         t
          pg t          _        t          t          j        vr$t          j                             t          ¦  «         t          t          j        vr$t          j                             t          ¦  «         t          pg t          _        t          t          j        vr&t          j                             t          ¦  «         dS dS )z(Set up LiteLLM callbacks for monitoring.N)
r   rY   r€   r6   r‚   r   rž   r    r   rª   © r$   r"   Ú
setup_oncezLiteLLMIntegration.setup_oncer  sö   € õ "0Ð!5°2�ÔÝ¥'Ô"8Ð8Ð8ÝÔ"×)Ò)­/Ñ:Ô:Ð:Ý ­Ô(>Ð>Ð>ÝÔ"×)Ò)Õ*?Ñ@Ô@Ð@å#3Ð#9°r�Ô Ý¥GÔ$<Ð<Ð<ÝÔ$×+Ò+Õ,=Ñ>Ô>Ð>Ý"­'Ô*BÐBÐBÝÔ$×+Ò+Õ,CÑDÔDÐDå#3Ð#9°r�Ô Ý¥GÔ$<Ð<Ð<ÝÔ$×+Ò+Õ,=Ñ>Ô>Ð>Ð>Ð>ð =Ð<r$   )T)r   N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú
identifierrI   Úboolr®   Ústaticmethodr±   r°   r$   r"   rX   rX   ?  s‚   € € € € € ð*ð *ðX €JØ$˜
Ð$Ð$€Fð/ð /Ð+ð /¸dð /Èdð /ð /ð /ð /ð ð?ð ?ð ?ñ „\ð?ð ?ð ?r$   rX   )r   r   r   r   r   N)r   r   r   r   )r,   r-   r   r-   )r   r   r   N)
r   r   rƒ   r   r„   r   r…   r   r   N)/r0   Útypingr   rU   r   Úsentry_sdk.ai.monitoringr   Úsentry_sdk.ai.utilsr   r   r   r	   r
   Úsentry_sdk.constsr   Úsentry_sdk.integrationsr   r   Úsentry_sdk.scoper   Úsentry_sdk.tracing_utilsr   r   Úsentry_sdk.utilsr   r   r   r   r   r   rY   r   r   r   ÚImportErrorr!   r#   r(   r+   r;   r€   r‚   rž   r    r[   rª   rX   r°   r$   r"   ú<module>rÂ      s<  ðØ €€€Ø  Ð  Ð  Ð  Ð  Ð  à Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7ðð ð ð ð ð ð ð ð ð ð ð ð ð ð 'Ð &Ð &Ð &Ð &Ð &Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4ðð ð ð ð ð ð ð ð OÐ NÐ NÐ NÐ NÐ NÐ NÐ Nàð 'Ø!Ð!Ð!Ð!Ð!Ð!Ø&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ð0Ø€N€N€NØJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJøØð 0ð 0ð 0Ø
ˆ,Ð.Ñ
/Ô
/Ð/ð0øøøð €	ðð ð ð ð!ð !ð !ð !ð'ð 'ð 'ð 'ðð ð ð ð6t8ð t8ð t8ð t8ðn#ð #ð #ð #ðM0ØðM0àðM0ð ðM0ð ð	M0ð
 
ðM0ð M0ð M0ð M0ð`Øðàðð ðð ð	ð
 
ðð ð ð ð8Øð8àð8ð ð8ð ð	8ð
 
ð8ð 8ð 8ð 8ð0D?ð D?ð D?ð D?ð D?˜ñ D?ô D?ð D?ð D?ð D?s   Á A/ Á/B 