[Fix] Containers API - Allow routing to regional endpoints (#19118)

* fix get_complete_url

* fix url resolution containers API

* TestContainerRegionalApiBase
This commit is contained in:
Ishaan Jaff
2026-01-14 17:28:18 -08:00
committed by GitHub
parent e3e6fc2806
commit e67e9e7054
3 changed files with 212 additions and 8 deletions
+42 -6
View File
@@ -199,7 +199,13 @@ def create_container(
return response
# get llm provider logic
litellm_params = GenericLiteLLMParams(**kwargs)
# Pass credential params explicitly since they're named args, not in kwargs
litellm_params = GenericLiteLLMParams(
api_key=api_key,
api_base=api_base,
api_version=api_version,
**kwargs,
)
# get provider config
container_provider_config: Optional[BaseContainerConfig] = (
ProviderConfigManager.get_provider_container_config(
@@ -406,7 +412,13 @@ def list_containers(
return response
# get llm provider logic
litellm_params = GenericLiteLLMParams(**kwargs)
# Pass credential params explicitly since they're named args, not in kwargs
litellm_params = GenericLiteLLMParams(
api_key=api_key,
api_base=api_base,
api_version=api_version,
**kwargs,
)
# get provider config
container_provider_config: Optional[BaseContainerConfig] = (
ProviderConfigManager.get_provider_container_config(
@@ -594,7 +606,13 @@ def retrieve_container(
return response
# get llm provider logic
litellm_params = GenericLiteLLMParams(**kwargs)
# Pass credential params explicitly since they're named args, not in kwargs
litellm_params = GenericLiteLLMParams(
api_key=api_key,
api_base=api_base,
api_version=api_version,
**kwargs,
)
# get provider config
container_provider_config: Optional[BaseContainerConfig] = (
ProviderConfigManager.get_provider_container_config(
@@ -774,7 +792,13 @@ def delete_container(
return response
# get llm provider logic
litellm_params = GenericLiteLLMParams(**kwargs)
# Pass credential params explicitly since they're named args, not in kwargs
litellm_params = GenericLiteLLMParams(
api_key=api_key,
api_base=api_base,
api_version=api_version,
**kwargs,
)
# get provider config
container_provider_config: Optional[BaseContainerConfig] = (
ProviderConfigManager.get_provider_container_config(
@@ -968,7 +992,13 @@ def list_container_files(
return response
# get llm provider logic
litellm_params = GenericLiteLLMParams(**kwargs)
# Pass credential params explicitly since they're named args, not in kwargs
litellm_params = GenericLiteLLMParams(
api_key=api_key,
api_base=api_base,
api_version=api_version,
**kwargs,
)
# get provider config
container_provider_config: Optional[BaseContainerConfig] = (
ProviderConfigManager.get_provider_container_config(
@@ -1203,7 +1233,13 @@ def upload_container_file(
return response
# get llm provider logic
litellm_params = GenericLiteLLMParams(**kwargs)
# Pass credential params explicitly since they're named args, not in kwargs
litellm_params = GenericLiteLLMParams(
api_key=api_key,
api_base=api_base,
api_version=api_version,
**kwargs,
)
# get provider config
container_provider_config: Optional[BaseContainerConfig] = (
ProviderConfigManager.get_provider_container_config(
@@ -83,8 +83,13 @@ class OpenAIContainerConfig(BaseContainerConfig):
) -> str:
"""Get the complete URL for OpenAI container API.
"""
if api_base is None:
api_base = "https://api.openai.com/v1"
api_base = (
api_base
or litellm.api_base
or get_secret_str("OPENAI_BASE_URL")
or get_secret_str("OPENAI_API_BASE")
or "https://api.openai.com/v1"
)
return f"{api_base.rstrip('/')}/containers"
@@ -0,0 +1,163 @@
"""
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