Ë
    tPêj·T  ã                   óä
  — U d 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
  G d„ dee«      Z G d	„ d
ee«      Z G d„ dee«      Z G d„ dee«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Z G d„ dee«      Z G d„ dee«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Z G d„ d «      Z G d!„ d"«      Z G d#„ d$«      Z G d%„ d&«      Z G d'„ d(«      Z G d)„ d*«      Z G d+„ d,«      Z G d-„ d.«      Zi d/ej@                  “d0ej@                  “d1ejB                  “d2ejD                  “d3ejF                  “d4ejH                  “d5ejH                  “d6ejJ                  “d7ejJ                  “d8ejL                  “d9ejN                  “d:ejN                  “d;ejP                  “d<ejR                  “d=ejT                  “d>ejV                  “d?ejX                  “d@ejZ                  i¥Z.ee/eef      e0dA<   i dBejb                  “dCejb                  “dDejb                  “dEejd                  “dFejd                  “dGejf                  “dHejf                  “dIejb                  “dJejb                  “dKejh                  “dLejh                  “dMejh                  “dNejh                  “dOejh                  “dPejh                  “dQejh                  “dRejh                  “i dSejj                  “dTejj                  “dUejl                  “dVejl                  “dWejj                  “dXejj                  “dYejj                  “dZejj                  “d[ejj                  “d\ejj                  “d]ejn                  “d^ejp                  “d_ejp                  “d`ejp                  “daejp                  “dbejr                  “dcejr                  “¥i ddejr                  “deejt                  “dfejt                  “dgejt                  “dhejt                  “diejt                  “djejt                  “dkejt                  “dlejt                  “dmejt                  “dnejt                  “doejv                  “dpejv                  “dqejv                  “drejv                  “dsejv                  “dtejv                  “¥ejv                  ejv                  ejv                  ejv                  ejv                  ejv                  duœ¥Z<ee/eef      e0dv<    eejz                  ejz                  ej|                  ej|                  ej~                  ej~                  ej~                  ej~                  dwœ«      Z@eeeef      e0dx<   dyedzz  d{efd|„ZAd}edzz  d{efd~„ZBd}edzz  d{edzz  fd„ZCyz)€z 
Keys follow the OpenTelemetry GenAI semantic conventions (experimental). Anything
without a semconv equivalent lives under the ``litellm.*`` vendor namespace.
é    )ÚMapping)ÚEnum)ÚMappingProxyType)ÚFinal)Úverbose_loggerc                   ó@   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZy)ÚGenAIOperationaù  Values for ``gen_ai.operation.name``.

    The first block is the convention's own vocabulary. The ``LITELLM_`` members
    are vendor values for operations the convention names nothing for; its note
    on this attribute directs instrumentation to use a system-specific name in
    exactly that case, the same allowance :func:`resolve_provider` relies on for
    unmapped providers. They stay under the ``litellm.`` prefix so a value the
    convention adds later can never collide with one of ours.
    ÚchatÚtext_completionÚ
embeddingsÚgenerate_contentÚ	retrievalÚcreate_agentÚinvoke_agentÚexecute_toolzlitellm.vector_store_managementz$litellm.vector_store_file_managementzlitellm.responses_managementzlitellm.moderationN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚCHATÚTEXT_COMPLETIONÚ
EMBEDDINGSÚGENERATE_CONTENTÚ	RETRIEVALÚCREATE_AGENTÚINVOKE_AGENTÚEXECUTE_TOOLÚLITELLM_VECTOR_STORE_MANAGEMENTÚ$LITELLM_VECTOR_STORE_FILE_MANAGEMENTÚLITELLM_RESPONSES_MANAGEMENTÚLITELLM_MODERATION© ó    úl/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/otel/model/semconv.pyr	   r	      sJ   „ ñð €DØ'€OØ€JØ)ÐØ€IØ!€LØ!€LØ!€LØ&GÐ#Ø+QÐ(Ø#AÐ Ø-Ñr#   r	   c                   ó    — e Zd ZdZdZdZdZdZy)ÚGenAIOutputTypea  Values for ``gen_ai.output.type``, the modality the client asked for.

    It is what separates the inference routes that share ``generate_content``:
    image generation requests ``image``, speech requests ``speech``, and
    transcription and OCR both request ``text``.
    ÚtextÚjsonÚimageÚspeechN)r   r   r   r   ÚTEXTÚJSONÚIMAGEÚSPEECHr"   r#   r$   r&   r&   '   s   „ ñð €DØ€DØ€EØ�Fr#   r&   c                   óH   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZy)ÚGenAIProviderz9Common values for the ``gen_ai.provider.name`` attribute.ÚopenaiÚ	anthropiczaws.bedrockzazure.ai.openaizazure.ai.inferencez
gcp.geminizgcp.vertex_aiÚcohereÚ
mistral_aiÚdeepseekÚgroqÚ
perplexityÚx_aizibm.watsonx.aiN)r   r   r   r   ÚOPENAIÚ	ANTHROPICÚAWS_BEDROCKÚAZURE_AI_OPENAIÚAZURE_AI_INFERENCEÚ
GCP_GEMINIÚGCP_VERTEX_AIÚCOHEREÚ
MISTRAL_AIÚDEEPSEEKÚGROQÚ
PERPLEXITYÚX_AIÚIBM_WATSONX_AIr"   r#   r$   r0   r0   5   sL   „ ÙCà€FØ€IØ€KØ'€OØ-ÐØ€JØ#€MØ€FØ€JØ€HØ€DØ€JØ€DØ%�Nr#   r0   c                   ó    — e Zd ZdZdZdZdZdZy)Ú	MCPMethodz”Well-known values for ``mcp.method.name`` that litellm's MCP gateway
    serves. The value is the JSON-RPC method exactly as it travels on the wire.z
tools/callz
tools/listzprompts/getzprompts/listN)r   r   r   r   Ú
TOOLS_CALLÚ
TOOLS_LISTÚPROMPTS_GETÚPROMPTS_LISTr"   r#   r$   rH   rH   H   s   „ ñSð €JØ€JØ€KØ!�Lr#   rH   c                   óÒ  — e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	eed	<   d
Z
eed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   d Zeed!<   d"Zeed#<   d$Zeed%<   d&Zeed'<   d(Zeed)<   d*Zeed+<   d,Zeed-<   d.Zeed/<   d0Zeed1<   d2Zeed3<   d4Zeed5<   d6Z eed7<   d8Z!eed9<   d:Z"eed;<   d<Z#eed=<   d>Z$eed?<   d@Z%eedA<   yB)CÚGenAIa  Canonical OTel GenAI attribute keys.

    ``SYSTEM`` is the one exception: the convention deprecated it in favor of
    ``PROVIDER_NAME``, and it survives here only so already-shipped series keep
    resolving for consumers that query it. Nothing new should use it.
    zgen_ai.operation.nameÚOPERATION_NAMEzgen_ai.provider.nameÚPROVIDER_NAMEzgen_ai.systemÚSYSTEMzgen_ai.request.modelÚREQUEST_MODELzgen_ai.request.temperatureÚREQUEST_TEMPERATUREzgen_ai.request.top_pÚREQUEST_TOP_Pzgen_ai.request.top_kÚREQUEST_TOP_Kzgen_ai.request.max_tokensÚREQUEST_MAX_TOKENSz gen_ai.request.frequency_penaltyÚREQUEST_FREQUENCY_PENALTYzgen_ai.request.presence_penaltyÚREQUEST_PRESENCE_PENALTYzgen_ai.request.stop_sequencesÚREQUEST_STOP_SEQUENCESzgen_ai.request.seedÚREQUEST_SEEDzgen_ai.request.choice.countÚREQUEST_CHOICE_COUNTzgen_ai.request.encoding_formatsÚREQUEST_ENCODING_FORMATSzgen_ai.response.idÚRESPONSE_IDzgen_ai.response.modelÚRESPONSE_MODELzgen_ai.response.finish_reasonsÚRESPONSE_FINISH_REASONSz#gen_ai.response.time_to_first_chunkÚRESPONSE_TIME_TO_FIRST_CHUNKzgen_ai.usage.input_tokensÚUSAGE_INPUT_TOKENSzgen_ai.usage.output_tokensÚUSAGE_OUTPUT_TOKENSzgen_ai.input.messagesÚINPUT_MESSAGESzgen_ai.output.messagesÚOUTPUT_MESSAGESzgen_ai.system_instructionsÚSYSTEM_INSTRUCTIONSzgen_ai.output.typeÚOUTPUT_TYPEzgen_ai.conversation.idÚCONVERSATION_IDzgen_ai.agent.idÚAGENT_IDzgen_ai.agent.nameÚ
AGENT_NAMEzgen_ai.tool.nameÚ	TOOL_NAMEzgen_ai.tool.call.idÚTOOL_CALL_IDzgen_ai.tool.call.argumentsÚTOOL_CALL_ARGUMENTSzgen_ai.tool.call.resultÚTOOL_CALL_RESULTzgen_ai.prompt.nameÚPROMPT_NAMEN)&r   r   r   r   rO   r   Ú__annotations__rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   r"   r#   r$   rN   rN   R   sY  … ñð 4€N�EÓ3Ø1€M�5Ó1Ø#€FˆEÓ#Ø1€M�5Ó1Ø!=Ð˜Ó=Ø1€M�5Ó1Ø1€M�5Ó1Ø ;Ð˜Ó;Ø'IÐ˜uÓIØ&GÐ˜eÓGØ$CÐ˜EÓCØ/€L�%Ó/Ø"?Ð˜%Ó?Ø&GÐ˜eÓGà-€K�Ó-Ø3€N�EÓ3Ø%EÐ˜UÓEØ*OÐ  %ÓOà ;Ð˜Ó;Ø!=Ð˜Ó=à3€N�EÓ3Ø5€O�UÓ5Ø!=Ð˜Ó=Ø-€K�Ó-Ø5€O�UÓ5à'€HˆeÓ'Ø+€J�Ó+ð *€IˆuÓ)Ø/€L�%Ó/Ø!=Ð˜Ó=Ø7Ð�eÓ7à-€K�Ô-r#   rN   c                   óJ   — e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	eed	<   y
)ÚMCPa0  OTel GenAI MCP (Model Context Protocol) span-attribute keys.

    ``METHOD_NAME`` is the only key litellm populates from a closed request today;
    the rest are part of the convention's vocabulary and are stamped when the
    corresponding signal (session, protocol version, resource) is available.
    zmcp.method.nameÚMETHOD_NAMEzmcp.session.idÚ
SESSION_IDzmcp.protocol.versionÚPROTOCOL_VERSIONzmcp.resource.uriÚRESOURCE_URIN)
r   r   r   r   rr   r   ro   rs   rt   ru   r"   r#   r$   rq   rq   …   s2   … ñð +€K�Ó*Ø(€J�Ó(Ø4Ð�eÓ4Ø,€L�%Ô,r#   rq   c                   óJ   — e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	eed	<   y
)ÚJsonRpcz~JSON-RPC keys carried on MCP spans. The error/status code lives in the
    ``rpc.*`` namespace per semconv, not ``jsonrpc.*``.z
rpc.systemrQ   zjsonrpc.request.idÚ
REQUEST_IDzjsonrpc.protocol.versionrt   zrpc.response.status_codeÚRESPONSE_STATUS_CODEN)
r   r   r   r   rQ   r   ro   rx   rt   ry   r"   r#   r$   rw   rw   “   s3   … ñ;ð !€FˆEÓ Ø,€J�Ó,Ø8Ð�eÓ8Ø"<Ð˜%Ô<r#   rw   c                   ó   — e Zd ZdZdZy)Ú	RpcSystemañ  Well-known values for ``rpc.system``. MCP frames every message as JSON-RPC 2.0.

    Naming the system also classifies the span: a CLIENT span carrying none of the
    ``rpc.*``/``http.*``/``db.*``/``messaging.*`` families records no span type or
    subtype in backends that derive those from the attribute family. It is emitted
    only alongside ``server.address``/``server.port``, since a backend that reads it
    as a downstream dependency names that dependency from the server address.
    ÚjsonrpcN)r   r   r   r   ÚJSONRPCr"   r#   r$   r{   r{   �   s   „ ñð �Gr#   r{   c                   ó$   — e Zd ZdZdZdZdZdZdZy)ÚNetworkTransportz,Well-known values for ``network.transport``.ÚtcpÚudpÚquicÚunixÚpipeN)	r   r   r   r   ÚTCPÚUDPÚQUICÚUNIXÚPIPEr"   r#   r$   r   r   ª   s   „ Ù6à
€CØ
€CØ€DØ€DØ�Dr#   r   c                   ó<   — e Zd ZU dZdZeed<   dZeed<   dZeed<   y)	ÚNetworkuŒ   OTel network keys, recommended on MCP spans to describe the transport
    carrying the JSON-RPC messages (stdio pipe, HTTP, websocket, â€¦).znetwork.protocol.nameÚPROTOCOL_NAMEznetwork.protocol.versionrt   znetwork.transportÚ	TRANSPORTN)	r   r   r   r   rŒ   r   ro   rt   r�   r"   r#   r$   r‹   r‹   ´   s)   … ñJð 3€M�5Ó2Ø8Ð�eÓ8Ø*€IˆuÔ*r#   r‹   c                   ó.   — e Zd ZU dZdZeed<   dZeed<   y)ÚClientzsPeer (client) network keys, stamped on MCP *server* spans the same way
    ``server.*`` is stamped on client spans.zclient.addressÚADDRESSzclient.portÚPORTN)r   r   r   r   r�   r   ro   r‘   r"   r#   r$   r�   r�   ½   s   … ñ0ð &€GˆUÓ%Ø€Dˆ%Ôr#   r�   c                   ó.   — e Zd ZU dZdZeed<   dZeed<   y)ÚErrora   OTel-defined error attribute keys, from the semconv ``error.*`` registry.
    ``MESSAGE`` is marked *Deprecated* upstream in favor of domain-specific
    error message keys plus ``exception.message`` on the exception event, but
    litellm still stamps it.z
error.typeÚTYPEzerror.messageÚMESSAGEN)r   r   r   r   r”   r   ro   r•   r"   r#   r$   r“   r“   Å   s   … ñ ð
 €Dˆ%ÓØ$€GˆUÔ$r#   r“   c                   ó<   — e Zd ZU dZdZeed<   dZeed<   dZeed<   y)	ÚLiteLLMErrorzëDetail keys for the mapped provider exception of a failed LLM call.
    OTel semconv does not define these, so they live under the ``litellm.*``
    vendor namespace rather than squatting on the semconv-owned ``error.*``
    namespace.zlitellm.provider.error.codeÚCODEz"litellm.provider.error.stack_traceÚSTACK_TRACEz#litellm.provider.error.llm_providerÚLLM_PROVIDERN)	r   r   r   r   r˜   r   ro   r™   rš   r"   r#   r$   r—   r—   Ï   s'   … ñð
 0€Dˆ%Ó/Ø=€K�Ó=Ø?€L�%Ô?r#   r—   c                   óJ   — e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	eed	<   y
)ÚExceptionEventa£  OTel exception-event name and attribute keys (semconv ``exception.*``).

    The full error message rides ``exception.message`` on a span event rather than
    a custom string attribute. Backends recognise these semantic-convention names
    and map them as full text; an unrecognised key (e.g. ``error_message``) falls
    into the default dynamic template, which truncates strings to a 1024-char
    ``keyword``.
    Ú	exceptionÚNAMEzexception.typer”   zexception.messager•   zexception.stacktraceÚ
STACKTRACEN)
r   r   r   r   rž   r   ro   r”   r•   rŸ   r"   r#   r$   rœ   rœ   Ú   s1   … ñð €Dˆ%ÓØ"€Dˆ%Ó"Ø(€GˆUÓ(Ø.€J�Ô.r#   rœ   c                   ó    — e Zd ZU dZdZeed<   y)Ú
GenAIEventu|  GenAI semconv event names, from the GenAI registry's *events* section.

    ``gen_ai.client.operation.exception`` is defined as a log-based event
    (severity WARN) carrying the ``exception.*`` trio, correlated to the failed
    span via the trace/span ids â€” the semconv-compliant home for GenAI failure
    details, unlike the deprecated ``error.message`` span attribute.
    z!gen_ai.client.operation.exceptionÚOPERATION_EXCEPTIONN)r   r   r   r   r¢   r   ro   r"   r#   r$   r¡   r¡   ê   s   … ñð "EÐ˜ÔDr#   r¡   c                   ó*   — e Zd ZU dZeed<   dZeed<   y)ÚServerzserver.addressr�   zserver.portr‘   N)r   r   r   r�   r   ro   r‘   r"   r#   r$   r¤   r¤   ö   s   … Ø%€GˆUÓ%Ø€Dˆ%Ôr#   r¤   c                   óJ   — e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	eed	<   y
)ÚDBuØ   Database / cache client-span keys (OTel ``db.*`` semconv).

    Stamped on ``DB_CALL`` spans (redis / postgres), which are CLIENT spans for
    outbound datastore calls â€” not on the INTERNAL ``SERVICE`` spans.
    zdb.system.nameÚSYSTEM_NAMEz	db.systemÚSYSTEM_LEGACYzdb.operation.namerO   zdb.namespaceÚ	NAMESPACEN)
r   r   r   r   r§   r   ro   r¨   rO   r©   r"   r#   r$   r¦   r¦   û   s3   … ñð *€K�Ó)ð '€M�5Ó&Ø/€N�EÓ/Ø%€IˆuÔ%r#   r¦   c                   óJ   — e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	eed	<   y
)ÚHTTPzGHTTP server-span keys. Belong on the SERVER span only (never promoted).zhttp.request.methodÚREQUEST_METHODz
http.routeÚROUTEzhttp.response.status_codery   zurl.pathÚURL_PATHN)
r   r   r   r   r¬   r   ro   r­   ry   r®   r"   r#   r$   r«   r«   
  s.   … ÙQà1€N�EÓ1Ø€Eˆ5ÓØ"=Ð˜%Ó=Ø €HˆeÔ r#   r«   c                   óà  — e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	eed	<   d
Z
eed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   d Zeed!<   d"Zeed#<   d$Zeed%<   d&Zeed'<   d(Zeed)<   d*Zeed+<   d,Zeed-<   d.Zeed/<   d0Zeed1<   d2Zeed3<   d4Zeed5<   d6Z eed7<   d8Z!eed9<   d:Z"eed;<   d<Z#eed=<   d>Z$eed?<   d@Z%eedA<   dBZ&eedC<   yD)EÚLiteLLMzDVendor-extension keys (no semconv equivalent). Always ``litellm.*``.zlitellm.call_idÚCALL_IDzlitellm.call_typeÚ	CALL_TYPEzlitellm.cost.ÚCOST_PREFIXzlitellm.metadata.ÚMETADATA_PREFIXzlitellm.team.idÚTEAM_IDzlitellm.team.aliasÚ
TEAM_ALIASzlitellm.team.metadataÚTEAM_METADATAzlitellm.api_key.hashÚKEY_HASHzlitellm.end_user.idÚEND_USERzlitellm.provider.modelÚPROVIDER_MODELzlitellm.request.streamingÚREQUEST_STREAMINGzlitellm.request.tools.declaredÚTOOLS_DECLAREDzlitellm.guardrail.nameÚGUARDRAIL_NAMEzlitellm.guardrail.modeÚGUARDRAIL_MODEzlitellm.guardrail.statusÚGUARDRAIL_STATUSzlitellm.guardrail.providerÚGUARDRAIL_PROVIDERzlitellm.guardrail.actionÚGUARDRAIL_ACTIONzlitellm.guardrail.responseÚGUARDRAIL_RESPONSEz&litellm.guardrail.violation_categoriesÚGUARDRAIL_VIOLATION_CATEGORIESz"litellm.guardrail.confidence_scoreÚGUARDRAIL_CONFIDENCE_SCOREzlitellm.guardrail.risk_scoreÚGUARDRAIL_RISK_SCOREz%litellm.guardrail.masked_entity_countÚGUARDRAIL_MASKED_ENTITY_COUNTzlitellm.guardrail.durationÚGUARDRAIL_DURATIONzlitellm.guardrail.idÚGUARDRAIL_IDz!litellm.guardrail.policy_templateÚGUARDRAIL_POLICY_TEMPLATEz"litellm.guardrail.detection_methodÚGUARDRAIL_DETECTION_METHODzlitellm.guardrail.usageÚGUARDRAIL_USAGEzlitellm.cost.guardrailÚGUARDRAIL_COSTzlitellm.guardrail.cost_in_spendÚGUARDRAIL_COST_IN_SPENDzlitellm.service.nameÚSERVICE_NAMEzlitellm.service.call_typeÚSERVICE_CALL_TYPEz!litellm.preprocessing.duration_msÚPREPROCESSING_MSzlitellm.mcp.server.nameÚMCP_SERVER_NAMEN)'r   r   r   r   r±   r   ro   r²   r³   r´   rµ   r¶   r·   r¸   r¹   rº   r»   r¼   r½   r¾   r¿   rÀ   rÁ   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   rÈ   rÉ   rÊ   rË   rÌ   rÍ   rÎ   rÏ   rÐ   rÑ   r"   r#   r$   r°   r°     si  … ÙNà&€GˆUÓ&ð
 +€IˆuÓ*Ø(€K�Ó(Ø0€O�UÓ0Ø&€GˆUÓ&Ø,€J�Ó,à2€M�5Ó2Ø,€HˆeÓ,Ø+€HˆeÓ+ð 5€N�EÓ4Ø:Ð�uÓ:Ø<€N�EÓ<Ø4€N�EÓ4Ø4€N�EÓ4Ø8Ð�eÓ8Ø <Ð˜Ó<Ø8Ð�eÓ8Ø <Ð˜Ó<Ø,TÐ" EÓTØ(LÐ ÓLØ"@Ð˜%Ó@Ø+RÐ! 5ÓRØ <Ð˜Ó<Ø0€L�%Ó0Ø'JÐ˜uÓJØ(LÐ ÓLà6€O�UÓ6ð 5€N�EÓ4ð &GÐ˜UÓFØ0€L�%Ó0Ø:Ð�uÓ:ØAÐ�eÓAð 7€O�UÔ6r#   r°   c                   óf   — e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	eed	<   d
Z
eed<   dZeed<   y)ÚMetricak  GenAI metric instrument names.

    Every name here that a convention or a backend defines uses that name, so a
    consumer charting GenAI telemetry finds litellm's series where it looks for
    them. ``TOKEN_USAGE``, ``OPERATION_DURATION``, ``TIME_TO_FIRST_TOKEN`` and
    ``TIME_PER_OUTPUT_TOKEN`` are semconv instruments, defined in the GenAI
    conventions; the ``gen_ai.client.response.*`` spellings litellm used for the
    latter two are not conventions at all, so nothing downstream could chart
    them. Cost has no semconv instrument, so it takes ``gen_ai.usage.cost``, the
    name backends already query for spend.

    ``RESPONSE_DURATION`` keeps its vendor spelling deliberately: the closest
    convention, ``gen_ai.server.request.duration``, would collide in meaning with
    ``OPERATION_DURATION``, which litellm already emits for the whole operation.
    zgen_ai.client.token.usageÚTOKEN_USAGEz gen_ai.client.operation.durationÚOPERATION_DURATIONzgen_ai.usage.costÚ
TOKEN_COSTz!gen_ai.server.time_to_first_tokenÚTIME_TO_FIRST_TOKENz#gen_ai.server.time_per_output_tokenÚTIME_PER_OUTPUT_TOKENzgen_ai.client.response.durationÚRESPONSE_DURATIONN)r   r   r   r   rÔ   r   ro   rÕ   rÖ   r×   rØ   rÙ   r"   r#   r$   rÓ   rÓ   I  sI   … ñð  5€K�Ó4Ø BÐ˜ÓBØ+€J�Ó+Ø!DÐ˜ÓDØ#HÐ˜5ÓHØ@Ð�uÔ@r#   rÓ   r1   ztext-completion-openaiÚazureÚazure_air2   ÚbedrockÚbedrock_converseÚ	vertex_aiÚvertex_ai_betaÚgeminir3   Úcohere_chatÚmistralr5   r6   r7   ÚxaiÚwatsonxÚ_PROVIDER_BY_LITELLMÚ
completionÚacompletionÚcompletion_with_retriesr   Úatext_completionÚ	embeddingÚ
aembeddingÚ	responsesÚ
aresponsesÚget_responsesÚaget_responsesÚdelete_responsesÚadelete_responsesÚcancel_responsesÚacancel_responsesÚlist_input_itemsÚalist_input_itemsÚimage_generationÚaimage_generationÚ
moderationÚamoderationÚocrÚaocrr*   ÚaspeechÚtranscriptionÚatranscriptionÚcall_mcp_toolÚvector_store_searchÚavector_store_searchÚqueryÚaqueryÚsend_messageÚasend_messageÚasend_message_streamingÚvector_store_createÚavector_store_createÚvector_store_retrieveÚavector_store_retrieveÚvector_store_listÚavector_store_listÚvector_store_updateÚavector_store_updateÚvector_store_deleteÚavector_store_deleteÚvector_store_file_createÚavector_store_file_createÚvector_store_file_listÚavector_store_file_listÚvector_store_file_retrieveÚavector_store_file_retrieve)Úvector_store_file_contentÚavector_store_file_contentÚvector_store_file_updateÚavector_store_file_updateÚvector_store_file_deleteÚavector_store_file_deleteÚ_OPERATION_BY_CALL_TYPE)rö   r÷   r*   rü   rý   rþ   rú   rû   Ú_OUTPUT_TYPE_BY_CALL_TYPEÚcustom_llm_providerNÚreturnc                 ón   — | syt         j                  | j                  «       «      }|�|j                  S | S )uÛ   Map a litellm provider string to a ``gen_ai.provider.name`` value.

    Unknown providers pass through verbatim â€” the convention explicitly allows
    provider-specific values, so an unmapped name is still valid.
    Ú )rå   ÚgetÚlowerÚvalue)r  Úmappeds     r$   Úresolve_providerr'  Ç  s9   € ñ ØÜ(×,Ñ,Ð-@×-FÑ-FÓ-HÓI€FØ!Ð-ˆ6�<‰<ÐFÐ3FÐFr#   Ú	call_typec                 óò   — | st         j                  S t        j                  | j	                  «       «      }|�|S t        j                  d| t         j                  j                  «       t         j                  S )aƒ  Map a litellm ``call_type`` to a ``gen_ai.operation.name`` value.

    An unmapped call type still falls back to ``chat`` so every series keeps an
    operation label, but it logs at debug rather than falling through silently:
    a new call type mislabelled as ``chat`` mixes its latency and cost into
    everyone's chat charts, which is invisible until someone reads the numbers.
    zlotel: call_type %r has no gen_ai.operation.name mapping; labelling it %r. Add it to _OPERATION_BY_CALL_TYPE.)r	   r   r  r#  r$  r   Údebugr%  )r(  r&  s     r$   Úresolve_operationr+  Ó  sf   € ñ Ü×"Ñ"Ð"Ü+×/Ñ/°	·±Ó0AÓB€FØÐØˆÜ×ÑØvØÜ×Ñ×!Ñ!ôô
 ×ÑÐr#   c                 óN   — | syt         j                  | j                  «       «      S )z€Map a litellm ``call_type`` to a ``gen_ai.output.type`` value, or ``None``
    for a route that doesn't pin the output modality.N)r  r#  r$  )r(  s    r$   Úresolve_output_typer-  è  s"   € ñ ØÜ$×(Ñ(¨¯©Ó):Ó;Ð;r#   )Dr   Úcollections.abcr   Úenumr   Útypesr   Útypingr   Úlitellm._loggingr   Ústrr	   r&   r0   rH   rN   rq   rw   r{   r   r‹   r�   r“   r—   rœ   r¡   r¤   r¦   r«   r°   rÓ   r9   r<   r=   r:   r;   r?   r>   r@   rA   rB   rC   rD   rE   rF   rå   Údictro   r   r   r   r    r   r!   r   r   r   r   r   r  r-   r.   r+   r  r'  r+  r-  r"   r#   r$   ú<module>r5     s9  ðòõ
 $Ý Ý "Ý å +ô.�S˜$ô .ô2�c˜4ô ô&�C˜ô &ô&"��Tô "÷0.ñ 0.÷f-ñ -÷=ñ =ô
��Tô 
ô�s˜Dô ÷+ñ +÷ ñ  ÷%ñ %÷@ñ @÷/ñ /÷ 	Eñ 	E÷ ñ  ÷
&ñ &÷!ñ !÷37ñ 37÷lAñ Að49Øˆm×"Ñ"ð9à˜m×2Ñ2ð9ð ˆ]×*Ñ*ð9ð �×0Ñ0ð	9ð
 �×(Ñ(ð9ð ˆ}×(Ñ(ð9ð ˜×1Ñ1ð9ð �×,Ñ,ð9ð �m×1Ñ1ð9ð ˆm×&Ñ&ð9ð ˆm×"Ñ"ð9ð �=×'Ñ'ð9ð ˆ}×'Ñ'ð9ð �×&Ñ&ð9ð ˆM×Ñð9ð  �-×*Ñ*ð!9ð" 
ˆ=×Ñð#9ð$ ˆ}×+Ñ+ñ%9Ð �e˜D  mÐ!3Ñ4Ñ5ó ð,:=Ø�.×%Ñ%ð:=à�>×&Ñ&ð:=ð ˜~×2Ñ2ð:=ð �~×5Ñ5ð	:=ð
 ˜×6Ñ6ð:=ð �×*Ñ*ð:=ð �.×+Ñ+ð:=ð �×$Ñ$ð:=ð �.×%Ñ%ð:=ð �^×@Ñ@ð:=ð �n×AÑAð:=ð ˜×CÑCð:=ð ˜×DÑDð:=ð ˜×CÑCð:=ð ˜×DÑDð:=ð  ˜×CÑCð!:=ð" ˜×DÑDñ#:=ð$ ˜×7Ñ7ð%:=ð& ˜×8Ñ8ð':=ð( �.×3Ñ3ð):=ð* �>×4Ñ4ð+:=ð, 
ˆ>×*Ñ*ð-:=ð. ˆN×+Ñ+ð/:=ð0 ˆn×-Ñ-ð1:=ð2 ˆ~×.Ñ.ð3:=ð4 �^×4Ñ4ð5:=ð6 �n×5Ñ5ð7:=ð8 �^×0Ñ0ð9:=ð: ˜>×3Ñ3ð;:=ð< ˜N×4Ñ4ð=:=ð> ˆ^×%Ñ%ð?:=ð@ ˆn×&Ñ&ðA:=ðB �N×/Ñ/ðC:=ðD �^×0Ñ0òE:=ðF ˜~×:Ñ:ðG:=ðH ˜>×IÑIðI:=ðJ ˜N×JÑJðK:=ðL ˜^×KÑKðM:=ðN ˜n×LÑLðO:=ðP ˜×GÑGðQ:=ðR ˜.×HÑHðS:=ðT ˜>×IÑIðU:=ðV ˜N×JÑJðW:=ðX ˜>×IÑIðY:=ðZ ˜N×JÑJð[:=ð\  × SÑ Sð]:=ð^   ×!TÑ!Tð_:=ð` ˜n×QÑQða:=ðb ˜~×RÑRðc:=ðd ! .×"UÑ"Uðe:=ðf " >×#VÑ#Vñg:=ðh "0×!TÑ!TØ"0×"UÑ"UØ .× SÑ SØ!/×!TÑ!TØ .× SÑ SØ!/×!TÑ!Tòs:=Ð ˜˜t C¨Ð$7Ñ8Ñ9ó :ñ@ CSà+×1Ñ1Ø,×2Ñ2Ø!×(Ñ(Ø"×)Ñ)Ø(×-Ñ-Ø)×.Ñ.Ø×#Ñ#Ø×$Ñ$ñ	óCÐ ˜5 ¨¨oÐ)=Ñ!>Ñ?ó ð	G¨#°©*ð 	G¸ó 	Gð  t¡ð °ó ð*< 3¨¡:ð <°/ÀDÑ2Hô <r#   