mirror of
https://github.com/tiennm99/litellm.git
synced 2026-06-28 05:08:21 +00:00
e67e9e7054
* fix get_complete_url * fix url resolution containers API * TestContainerRegionalApiBase
164 lines
5.7 KiB
Python
164 lines
5.7 KiB
Python
"""
|
|
Tests for OpenAI Containers API regional api_base support.
|
|
|
|
Validates that litellm.create_container and litellm.upload_container_file
|
|
correctly use regional endpoints like https://us.api.openai.com/v1 for
|
|
US Data Residency instead of defaulting to https://api.openai.com/v1.
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
import httpx
|
|
import pytest
|
|
|
|
sys.path.insert(0, os.path.abspath("../../.."))
|
|
|
|
import litellm
|
|
|
|
|
|
class TestContainerRegionalApiBase:
|
|
"""Test suite for container API regional api_base support."""
|
|
|
|
def setup_method(self):
|
|
"""Set up test fixtures."""
|
|
os.environ["OPENAI_API_KEY"] = "sk-test123"
|
|
|
|
def teardown_method(self):
|
|
"""Clean up after tests."""
|
|
if "OPENAI_API_KEY" in os.environ:
|
|
del os.environ["OPENAI_API_KEY"]
|
|
if "OPENAI_BASE_URL" in os.environ:
|
|
del os.environ["OPENAI_BASE_URL"]
|
|
if "OPENAI_API_BASE" in os.environ:
|
|
del os.environ["OPENAI_API_BASE"]
|
|
litellm.api_base = None
|
|
|
|
@patch("litellm.llms.custom_httpx.http_handler.HTTPHandler.post")
|
|
def test_create_container_uses_regional_api_base(self, mock_post):
|
|
"""
|
|
Test that litellm.create_container uses the regional api_base when provided.
|
|
|
|
This validates the fix for US Data Residency support where requests should
|
|
go to https://us.api.openai.com/v1 instead of https://api.openai.com/v1.
|
|
"""
|
|
mock_response = MagicMock(spec=httpx.Response)
|
|
mock_response.status_code = 200
|
|
mock_response.json.return_value = {
|
|
"id": "cntr_123456",
|
|
"object": "container",
|
|
"created_at": 1747857508,
|
|
"status": "running",
|
|
"expires_after": {"anchor": "last_active_at", "minutes": 20},
|
|
"last_active_at": 1747857508,
|
|
"name": "Test Container"
|
|
}
|
|
mock_post.return_value = mock_response
|
|
|
|
litellm.create_container(
|
|
name="Test Container",
|
|
custom_llm_provider="openai",
|
|
api_base="https://us.api.openai.com/v1",
|
|
)
|
|
|
|
mock_post.assert_called_once()
|
|
call_args = mock_post.call_args
|
|
called_url = call_args[1]["url"]
|
|
|
|
assert "us.api.openai.com" in called_url, f"Expected US regional URL, got: {called_url}"
|
|
assert called_url == "https://us.api.openai.com/v1/containers"
|
|
|
|
@patch("litellm.llms.custom_httpx.http_handler.HTTPHandler.post")
|
|
def test_create_container_uses_env_var_openai_base_url(self, mock_post):
|
|
"""
|
|
Test that litellm.create_container uses OPENAI_BASE_URL env var.
|
|
"""
|
|
os.environ["OPENAI_BASE_URL"] = "https://us.api.openai.com/v1"
|
|
|
|
mock_response = MagicMock(spec=httpx.Response)
|
|
mock_response.status_code = 200
|
|
mock_response.json.return_value = {
|
|
"id": "cntr_123456",
|
|
"object": "container",
|
|
"created_at": 1747857508,
|
|
"status": "running",
|
|
"expires_after": {"anchor": "last_active_at", "minutes": 20},
|
|
"last_active_at": 1747857508,
|
|
"name": "Test Container"
|
|
}
|
|
mock_post.return_value = mock_response
|
|
|
|
litellm.create_container(
|
|
name="Test Container",
|
|
custom_llm_provider="openai",
|
|
)
|
|
|
|
mock_post.assert_called_once()
|
|
call_args = mock_post.call_args
|
|
called_url = call_args[1]["url"]
|
|
|
|
assert "us.api.openai.com" in called_url, f"Expected US regional URL, got: {called_url}"
|
|
|
|
@patch("litellm.llms.custom_httpx.http_handler.HTTPHandler.post")
|
|
def test_create_container_defaults_to_standard_openai(self, mock_post):
|
|
"""
|
|
Test that litellm.create_container defaults to standard OpenAI URL
|
|
when no regional api_base is configured.
|
|
"""
|
|
mock_response = MagicMock(spec=httpx.Response)
|
|
mock_response.status_code = 200
|
|
mock_response.json.return_value = {
|
|
"id": "cntr_123456",
|
|
"object": "container",
|
|
"created_at": 1747857508,
|
|
"status": "running",
|
|
"expires_after": {"anchor": "last_active_at", "minutes": 20},
|
|
"last_active_at": 1747857508,
|
|
"name": "Test Container"
|
|
}
|
|
mock_post.return_value = mock_response
|
|
|
|
litellm.create_container(
|
|
name="Test Container",
|
|
custom_llm_provider="openai",
|
|
)
|
|
|
|
mock_post.assert_called_once()
|
|
call_args = mock_post.call_args
|
|
called_url = call_args[1]["url"]
|
|
|
|
assert called_url == "https://api.openai.com/v1/containers"
|
|
|
|
@patch("litellm.llms.custom_httpx.http_handler.HTTPHandler.post")
|
|
def test_upload_container_file_uses_regional_api_base(self, mock_post):
|
|
"""
|
|
Test that litellm.upload_container_file uses the regional api_base when provided.
|
|
"""
|
|
mock_response = MagicMock(spec=httpx.Response)
|
|
mock_response.status_code = 200
|
|
mock_response.json.return_value = {
|
|
"id": "file_123456",
|
|
"object": "container.file",
|
|
"created_at": 1747857508,
|
|
"container_id": "cntr_123456",
|
|
"path": "/mnt/user/data.csv",
|
|
"source": "user",
|
|
}
|
|
mock_post.return_value = mock_response
|
|
|
|
litellm.upload_container_file(
|
|
container_id="cntr_123456",
|
|
file=("data.csv", b"col1,col2\n1,2", "text/csv"),
|
|
custom_llm_provider="openai",
|
|
api_base="https://us.api.openai.com/v1",
|
|
)
|
|
|
|
mock_post.assert_called_once()
|
|
call_args = mock_post.call_args
|
|
called_url = call_args[1]["url"]
|
|
|
|
assert "us.api.openai.com" in called_url, f"Expected US regional URL, got: {called_url}"
|
|
assert "cntr_123456/files" in called_url
|
|
|