import json import os import traceback from dotenv import load_dotenv load_dotenv() import io from datetime import datetime from unittest.mock import AsyncMock, MagicMock, patch import httpx import pytest from openai import OpenAI from openai.types.chat import ChatCompletionMessage from openai.types.chat.chat_completion import ChatCompletion, Choice from respx import MockRouter import litellm from litellm import RateLimitError, Timeout, completion, completion_cost, embedding from litellm.llms.custom_httpx.http_handler import AsyncHTTPHandler, HTTPHandler from litellm.litellm_core_utils.prompt_templates.factory import anthropic_messages_pt from litellm.router import Router @pytest.mark.asyncio() @pytest.mark.respx() async def test_aaaaazure_tenant_id_auth(respx_mock: MockRouter): """ Tests when we set tenant_id, client_id, client_secret they don't get sent with the request PROD Test """ litellm.disable_aiohttp_transport = ( True # since this uses respx, we need to set use_aiohttp_transport to False ) # Clear the HTTP client cache to ensure respx mocking works # This is critical because respx only intercepts clients created AFTER mocking is active if hasattr(litellm, "in_memory_llm_clients_cache"): litellm.in_memory_llm_clients_cache.flush_cache() router = Router( model_list=[ { "model_name": "gpt-3.5-turbo", "litellm_params": { # params for litellm completion/embedding call "model": "azure/gpt-4.1-mini", "api_base": os.getenv("AZURE_AI_API_BASE"), "tenant_id": os.getenv("AZURE_TENANT_ID"), "client_id": os.getenv("AZURE_CLIENT_ID"), "client_secret": os.getenv("AZURE_CLIENT_SECRET"), }, }, ], ) mock_response = AsyncMock() obj = ChatCompletion( id="foo", model="gpt-4", object="chat.completion", choices=[ Choice( finish_reason="stop", index=0, message=ChatCompletionMessage( content="Hello world!", role="assistant", ), ) ], created=int(datetime.now().timestamp()), ) litellm.set_verbose = True mock_request = respx_mock.post(url__regex=r".*/chat/completions.*").mock( return_value=httpx.Response(200, json=obj.model_dump(mode="json")) ) await router.acompletion( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "Hello world!"}] ) # Ensure all mocks were called respx_mock.assert_all_called() for call in mock_request.calls: print(call) print(call.request.content) json_body = json.loads(call.request.content) print(json_body) assert json_body == { "messages": [{"role": "user", "content": "Hello world!"}], "model": "gpt-4.1-mini", "stream": False, }