import asyncio import logging import pytest from dotenv import load_dotenv import litellm from litellm._logging import verbose_logger, verbose_proxy_logger from litellm.integrations.arize.arize_phoenix import ArizePhoenixConfig, ArizePhoenixLogger load_dotenv() @pytest.mark.asyncio() async def test_async_otel_callback(): litellm.set_verbose = True verbose_proxy_logger.setLevel(logging.DEBUG) verbose_logger.setLevel(logging.DEBUG) litellm.success_callback = ["arize_phoenix"] await litellm.acompletion( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "this is arize phoenix"}], mock_response="hello", temperature=0.1, user="OTEL_USER", ) await asyncio.sleep(2) @pytest.mark.parametrize( "env_vars, expected_headers, expected_endpoint, expected_protocol", [ pytest.param( {"PHOENIX_API_KEY": "test_api_key"}, "api_key=test_api_key", "https://app.phoenix.arize.com/v1/traces", "otlp_http", id="default to http protocol and Arize hosted Phoenix endpoint", ), pytest.param( {"PHOENIX_COLLECTOR_HTTP_ENDPOINT": "", "PHOENIX_API_KEY": "test_api_key"}, "api_key=test_api_key", "https://app.phoenix.arize.com/v1/traces", "otlp_http", id="empty string/unset endpoint will default to http protocol and Arize hosted Phoenix endpoint", ), pytest.param( {"PHOENIX_COLLECTOR_HTTP_ENDPOINT": "http://localhost:4318", "PHOENIX_COLLECTOR_ENDPOINT": "http://localhost:4317", "PHOENIX_API_KEY": "test_api_key"}, "Authorization=Bearer test_api_key", "http://localhost:4318", "otlp_http", id="prioritize http if both endpoints are set", ), pytest.param( {"PHOENIX_COLLECTOR_ENDPOINT": "https://localhost:6006", "PHOENIX_API_KEY": "test_api_key"}, "Authorization=Bearer test_api_key", "https://localhost:6006", "otlp_grpc", id="custom grpc endpoint", ), pytest.param( {"PHOENIX_COLLECTOR_ENDPOINT": "https://localhost:6006"}, None, "https://localhost:6006", "otlp_grpc", id="custom grpc endpoint with no auth", ), pytest.param( {"PHOENIX_COLLECTOR_HTTP_ENDPOINT": "https://localhost:6006", "PHOENIX_API_KEY": "test_api_key"}, "Authorization=Bearer test_api_key", "https://localhost:6006", "otlp_http", id="custom http endpoint", ), ], ) def test_get_arize_phoenix_config(monkeypatch, env_vars, expected_headers, expected_endpoint, expected_protocol): for key, value in env_vars.items(): monkeypatch.setenv(key, value) config = ArizePhoenixLogger.get_arize_phoenix_config() assert isinstance(config, ArizePhoenixConfig) assert config.otlp_auth_headers == expected_headers assert config.endpoint == expected_endpoint assert config.protocol == expected_protocol @pytest.mark.parametrize( "env_vars", [ pytest.param( {"PHOENIX_COLLECTOR_ENDPOINT": "https://app.phoenix.arize.com/v1/traces"}, id="missing api_key with explicit Arize Phoenix endpoint" ), pytest.param( {}, id="missing api_key with no endpoint (defaults to Arize Phoenix)" ), ], ) def test_get_arize_phoenix_config_expection_on_missing_api_key(monkeypatch, env_vars): for key, value in env_vars.items(): monkeypatch.setenv(key, value) with pytest.raises(ValueError, match=f"PHOENIX_API_KEY must be set when the Arize hosted Phoenix endpoint is used."): ArizePhoenixLogger.get_arize_phoenix_config()