o
    +i3                  	   @   s|   d Z ddlZddlmZmZ ddlmZ ddlm	Z	m
Z
 eeZg dZ			ddee d	ee d
ee defddZdS )z(OpenTelemetry integration for LangSmith.    N)Optionalcast)utils   )OtelExporterOtelSpanProcessor)	configurer   r   api_keyproject_nameSpanProcessorreturnc              
   C   s  zgddl m} ddlm} ddlm}m}m} t||	 }|
t}	t||r?t|	dr?tt||	j|r?| }
||
 ntd W dS | pMtd} | sSW dS |pXt }t| ||d	}|
| W d
S  ty } ztd| W Y d}~dS d}~ww )ag  Configure OpenTelemetry with LangSmith as the `TracerProvider`.

    Initializes OpenTelemetry with LangSmith as the primary and only `TracerProvider`.

    Usage:
        >>> from langsmith.integrations.otel import configure
        >>> configure(  # doctest: +SKIP
        ...     api_key="your-api-key", project_name="your-project"
        ... )

        Using environment variables:
        >>> # Set LANGSMITH_API_KEY and LANGSMITH_PROJECT
        >>> configure()  # Will use env vars  # doctest: +SKIP

    !!! warning

        This function is only for when LangSmith is your ONLY OpenTelemetry source.

        It sets the global TracerProvider, which can only be done once per application.

    This function will fail if OpenTelemetry is already initialized with another
    `TracerProvider` (you cannot override an existing `TracerProvider`).

    If you already have OpenTelemetry set up with other tools, use `OtelSpanProcessor`
    directly to add LangSmith to your existing setup:

    !!! example "Adding LangSmith to existing OTEL setup"
        ```python
        from opentelemetry import trace
        from langsmith.integrations.otel.processor import OtelSpanProcessor

        # Use your existing provider (already initialized)
        provider = trace.get_tracer_provider()

        # Add LangSmith processor to existing provider
        langsmith_processor = OtelSpanProcessor(
            api_key="your-api-key", project="your-project"
        )
        provider.add_span_processor(langsmith_processor)
        ```

    Args:
        api_key: LangSmith API key. Defaults to `LANGSMITH_API_KEY` env var.
        project_name: Project name. Defaults to `LANGSMITH_PROJECT` env var.
        SpanProcessor: Span processor class to use. Defaults to `BatchSpanProcessor`.

    Returns:
        `True` if configuration succeeded, `False` if `TracerProvider` already exists.
    r   )trace)TracerProvider)
NoOpTracerProxyTracerProxyTracerProvider_tracerzOpenTelemetry TracerProvider is already set. Cannot override existing TracerProvider. Use OtelSpanProcessor directly to add LangSmith to your existing provider instead.FN)r	   projectr   Tz(Failed to initialize Otel for LangSmith:)opentelemetryr   opentelemetry.sdk.tracer   opentelemetry.tracer   r   r   r   get_tracer_provider
get_tracer__name__
isinstancehasattrr   set_tracer_providerloggerwarningls_utilsget_api_keyget_tracer_projectr   add_span_processor	Exception)r	   r
   r   r   r   r   r   r   existing_providertracerprovider	processore r)   a/var/www/html/psymed-ai/venv/lib/python3.10/site-packages/langsmith/integrations/otel/__init__.pyr      sN   6

r   )NNN)__doc__loggingtypingr   r   	langsmithr   r   r'   r   r   	getLoggerr   r   __all__strtypeboolr   r)   r)   r)   r*   <module>   s&    
