forked from phoenix/litellm-mirror
* fix(factory.py): ensure tool call converts image url Fixes https://github.com/BerriAI/litellm/issues/6953 * fix(transformation.py): support mp4 + pdf url's for vertex ai Fixes https://github.com/BerriAI/litellm/issues/6936 * fix(http_handler.py): mask gemini api key in error logs Fixes https://github.com/BerriAI/litellm/issues/6963 * docs(prometheus.md): update prometheus FAQs * feat(auth_checks.py): ensure specific model access > wildcard model access if wildcard model is in access group, but specific model is not - deny access * fix(auth_checks.py): handle auth checks for team based model access groups handles scenario where model access group used for wildcard models * fix(internal_user_endpoints.py): support adding guardrails on `/user/update` Fixes https://github.com/BerriAI/litellm/issues/6942 * fix(key_management_endpoints.py): fix prepare_metadata_fields helper * fix: fix tests * build(requirements.txt): bump openai dep version fixes proxies argument * test: fix tests * fix(http_handler.py): fix error message masking * fix(bedrock_guardrails.py): pass in prepped data * test: fix test * test: fix nvidia nim test * fix(http_handler.py): return original response headers * fix: revert maskedhttpstatuserror * test: update tests * test: cleanup test * fix(key_management_endpoints.py): fix metadata field update logic * fix(key_management_endpoints.py): maintain initial order of guardrails in key update * fix(key_management_endpoints.py): handle prepare metadata * fix: fix linting errors * fix: fix linting errors * fix: fix linting errors * fix: fix key management errors * fix(key_management_endpoints.py): update metadata * test: update test * refactor: add more debug statements * test: skip flaky test * test: fix test * fix: fix test * fix: fix update metadata logic * fix: fix test * ci(config.yml): change db url for e2e ui testing
99 lines
2.7 KiB
Python
99 lines
2.7 KiB
Python
import json
|
|
import os
|
|
import sys
|
|
import traceback
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
load_dotenv()
|
|
import io
|
|
import os
|
|
|
|
sys.path.insert(
|
|
0, os.path.abspath("../..")
|
|
) # Adds the parent directory to the system path
|
|
|
|
import os
|
|
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.llms.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
|
|
"""
|
|
|
|
router = Router(
|
|
model_list=[
|
|
{
|
|
"model_name": "gpt-3.5-turbo",
|
|
"litellm_params": { # params for litellm completion/embedding call
|
|
"model": "azure/chatgpt-v-2",
|
|
"api_base": os.getenv("AZURE_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": "chatgpt-v-2",
|
|
"stream": False,
|
|
}
|