mirror of
https://github.com/BerriAI/litellm.git
synced 2026-10-06 02:48:13 +00:00
Merge remote-tracking branch 'origin/litellm_internal_staging' into litellm_add_gpt_6_astra
This commit is contained in:
commit
b22bf99cc7
10 changed files with 140 additions and 26 deletions
|
|
@ -1,6 +1,6 @@
|
|||
[project]
|
||||
name = "litellm-enterprise"
|
||||
version = "0.1.63"
|
||||
version = "0.1.64"
|
||||
description = "Package for LiteLLM Enterprise features"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.9"
|
||||
|
|
@ -26,7 +26,7 @@ required-version = ">=0.10.9"
|
|||
module-root = ""
|
||||
|
||||
[tool.commitizen]
|
||||
version = "0.1.63"
|
||||
version = "0.1.64"
|
||||
version_files = [
|
||||
"pyproject.toml:^version",
|
||||
"../pyproject.toml:litellm-enterprise==",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
[project]
|
||||
name = "litellm-proxy-extras"
|
||||
version = "0.4.92"
|
||||
version = "0.4.93"
|
||||
description = "Additional files for the LiteLLM Proxy. Reduces the size of the main litellm package."
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.9"
|
||||
|
|
@ -26,7 +26,7 @@ required-version = ">=0.10.9"
|
|||
module-root = ""
|
||||
|
||||
[tool.commitizen]
|
||||
version = "0.4.92"
|
||||
version = "0.4.93"
|
||||
version_files = [
|
||||
"pyproject.toml:^version",
|
||||
"../pyproject.toml:litellm-proxy-extras==",
|
||||
|
|
|
|||
|
|
@ -48,7 +48,9 @@ _BASE_SUFFIXES_TO_STRIP: Final = (
|
|||
)
|
||||
|
||||
# Per Bedrock Mantle Responses API validation errors.
|
||||
_BEDROCK_MANTLE_SUPPORTED_RESPONSE_TOOL_TYPES = frozenset({"function", "mcp", "custom", "namespace", "tool_search"})
|
||||
_BEDROCK_MANTLE_SUPPORTED_RESPONSE_TOOL_TYPES: Final = frozenset(
|
||||
{"function", "mcp", "custom", "namespace", "tool_search", "web_search"}
|
||||
)
|
||||
|
||||
_BEDROCK_MANTLE_SUPPORTED_SERVICE_TIERS: Final = frozenset({"auto", "default"})
|
||||
|
||||
|
|
|
|||
|
|
@ -53001,7 +53001,8 @@
|
|||
"supports_reasoning": true,
|
||||
"supports_response_schema": true,
|
||||
"supports_tool_choice": true,
|
||||
"supports_vision": true
|
||||
"supports_vision": true,
|
||||
"supports_web_search": true
|
||||
},
|
||||
"bedrock_mantle/openai.gpt-5.6-terra": {
|
||||
"input_cost_per_token": 2.2e-06,
|
||||
|
|
@ -53034,7 +53035,8 @@
|
|||
"supports_reasoning": true,
|
||||
"supports_response_schema": true,
|
||||
"supports_tool_choice": true,
|
||||
"supports_vision": true
|
||||
"supports_vision": true,
|
||||
"supports_web_search": true
|
||||
},
|
||||
"bedrock_mantle/openai.gpt-5.6-cyber": {
|
||||
"input_cost_per_token": 1.375e-05,
|
||||
|
|
@ -53095,7 +53097,8 @@
|
|||
"supports_reasoning": true,
|
||||
"supports_response_schema": true,
|
||||
"supports_tool_choice": true,
|
||||
"supports_vision": true
|
||||
"supports_vision": true,
|
||||
"supports_web_search": true
|
||||
},
|
||||
"us.openai.gpt-5.6-sol": {
|
||||
"input_cost_per_token": 4.4e-06,
|
||||
|
|
@ -53281,7 +53284,8 @@
|
|||
"supports_reasoning": true,
|
||||
"supports_response_schema": true,
|
||||
"supports_tool_choice": true,
|
||||
"supports_vision": true
|
||||
"supports_vision": true,
|
||||
"supports_web_search": true
|
||||
},
|
||||
"bedrock_mantle/openai.gpt-5.4": {
|
||||
"input_cost_per_token": 2.75e-06,
|
||||
|
|
@ -53311,7 +53315,8 @@
|
|||
"supports_reasoning": true,
|
||||
"supports_response_schema": true,
|
||||
"supports_tool_choice": true,
|
||||
"supports_vision": true
|
||||
"supports_vision": true,
|
||||
"supports_web_search": true
|
||||
},
|
||||
"bedrock_mantle/google.gemma-4-31b": {
|
||||
"input_cost_per_token": 1.4e-07,
|
||||
|
|
|
|||
|
|
@ -1930,6 +1930,13 @@ class NewTeamRequest(TeamBase):
|
|||
|
||||
model_config = ConfigDict(protected_namespaces=())
|
||||
|
||||
@field_validator("team_id", mode="before")
|
||||
@classmethod
|
||||
def treat_blank_team_id_as_unset(cls, v: object) -> object:
|
||||
if isinstance(v, str) and not v.strip():
|
||||
return None
|
||||
return v
|
||||
|
||||
|
||||
class GlobalEndUsersSpend(LiteLLMPydanticObjectBase):
|
||||
api_key: str | None = None
|
||||
|
|
|
|||
|
|
@ -53001,7 +53001,8 @@
|
|||
"supports_reasoning": true,
|
||||
"supports_response_schema": true,
|
||||
"supports_tool_choice": true,
|
||||
"supports_vision": true
|
||||
"supports_vision": true,
|
||||
"supports_web_search": true
|
||||
},
|
||||
"bedrock_mantle/openai.gpt-5.6-terra": {
|
||||
"input_cost_per_token": 2.2e-06,
|
||||
|
|
@ -53034,7 +53035,8 @@
|
|||
"supports_reasoning": true,
|
||||
"supports_response_schema": true,
|
||||
"supports_tool_choice": true,
|
||||
"supports_vision": true
|
||||
"supports_vision": true,
|
||||
"supports_web_search": true
|
||||
},
|
||||
"bedrock_mantle/openai.gpt-5.6-cyber": {
|
||||
"input_cost_per_token": 1.375e-05,
|
||||
|
|
@ -53095,7 +53097,8 @@
|
|||
"supports_reasoning": true,
|
||||
"supports_response_schema": true,
|
||||
"supports_tool_choice": true,
|
||||
"supports_vision": true
|
||||
"supports_vision": true,
|
||||
"supports_web_search": true
|
||||
},
|
||||
"us.openai.gpt-5.6-sol": {
|
||||
"input_cost_per_token": 4.4e-06,
|
||||
|
|
@ -53281,7 +53284,8 @@
|
|||
"supports_reasoning": true,
|
||||
"supports_response_schema": true,
|
||||
"supports_tool_choice": true,
|
||||
"supports_vision": true
|
||||
"supports_vision": true,
|
||||
"supports_web_search": true
|
||||
},
|
||||
"bedrock_mantle/openai.gpt-5.4": {
|
||||
"input_cost_per_token": 2.75e-06,
|
||||
|
|
@ -53311,7 +53315,8 @@
|
|||
"supports_reasoning": true,
|
||||
"supports_response_schema": true,
|
||||
"supports_tool_choice": true,
|
||||
"supports_vision": true
|
||||
"supports_vision": true,
|
||||
"supports_web_search": true
|
||||
},
|
||||
"bedrock_mantle/google.gemma-4-31b": {
|
||||
"input_cost_per_token": 1.4e-07,
|
||||
|
|
|
|||
|
|
@ -67,8 +67,8 @@ proxy = [
|
|||
"azure-identity>=1.25.2,<2.0",
|
||||
"azure-storage-blob>=12.28.0,<13.0",
|
||||
"mcp>=1.28.1,<2.0",
|
||||
"litellm-proxy-extras==0.4.92",
|
||||
"litellm-enterprise==0.1.63",
|
||||
"litellm-proxy-extras==0.4.93",
|
||||
"litellm-enterprise==0.1.64",
|
||||
"RestrictedPython>=8.5,<9.0",
|
||||
"rich>=13.9.4,<14.0",
|
||||
"InquirerPy>=0.3.4,<1.0",
|
||||
|
|
|
|||
|
|
@ -332,7 +332,7 @@ class TestBedrockMantleResponsesTools:
|
|||
params = cfg.map_openai_params(
|
||||
response_api_optional_params={
|
||||
"tools": [
|
||||
{"type": "web_search"},
|
||||
{"type": "file_search", "vector_store_ids": ["vs_123"]},
|
||||
{"type": "function", "name": "exec_command"},
|
||||
]
|
||||
},
|
||||
|
|
@ -344,7 +344,7 @@ class TestBedrockMantleResponsesTools:
|
|||
def test_map_openai_params_removes_tools_when_all_unsupported(self):
|
||||
cfg = BedrockMantleResponsesAPIConfig()
|
||||
params = cfg.map_openai_params(
|
||||
response_api_optional_params={"tools": [{"type": "web_search"}]},
|
||||
response_api_optional_params={"tools": [{"type": "file_search", "vector_store_ids": ["vs_123"]}]},
|
||||
model="openai.gpt-5.5",
|
||||
drop_params=False,
|
||||
)
|
||||
|
|
@ -358,12 +358,95 @@ class TestBedrockMantleResponsesTools:
|
|||
"litellm.llms.bedrock_mantle.responses.transformation.verbose_logger.warning"
|
||||
) as mock_warning:
|
||||
cfg.map_openai_params(
|
||||
response_api_optional_params={"tools": [{"type": "web_search"}]},
|
||||
response_api_optional_params={"tools": [{"type": "file_search", "vector_store_ids": ["vs_123"]}]},
|
||||
model="openai.gpt-5.5",
|
||||
drop_params=False,
|
||||
)
|
||||
assert mock_warning.call_count == 1
|
||||
assert "web_search" in str(mock_warning.call_args)
|
||||
assert "file_search" in str(mock_warning.call_args)
|
||||
|
||||
|
||||
class TestBedrockMantleResponsesWebSearch:
|
||||
"""Web Search on Amazon Bedrock is a server-side built-in tool that Mantle runs
|
||||
itself when the caller passes {"type": "web_search"} on the Responses path, so
|
||||
the config must forward the tool and its options untouched instead of filtering
|
||||
it out and returning an ungrounded answer."""
|
||||
|
||||
_WEB_SEARCH_TOOL = {"type": "web_search", "external_web_access": False}
|
||||
|
||||
def test_web_search_survives_map_openai_params_with_its_options(self):
|
||||
cfg = BedrockMantleResponsesAPIConfig()
|
||||
params = cfg.map_openai_params(
|
||||
response_api_optional_params={"tools": [self._WEB_SEARCH_TOOL]},
|
||||
model="openai.gpt-5.6-sol",
|
||||
drop_params=False,
|
||||
)
|
||||
assert params["tools"] == [self._WEB_SEARCH_TOOL]
|
||||
|
||||
def test_web_search_reaches_outbound_body_alongside_function_tools(self):
|
||||
cfg = BedrockMantleResponsesAPIConfig()
|
||||
function_tool = {"type": "function", "name": "exec_command"}
|
||||
params = cfg.map_openai_params(
|
||||
response_api_optional_params={"tools": [self._WEB_SEARCH_TOOL, function_tool]},
|
||||
model="openai.gpt-5.6-sol",
|
||||
drop_params=False,
|
||||
)
|
||||
body = cfg.transform_responses_api_request(
|
||||
model="openai.gpt-5.6-sol",
|
||||
input="What did AWS announce today?",
|
||||
response_api_optional_request_params=params,
|
||||
litellm_params=GenericLiteLLMParams(),
|
||||
headers={},
|
||||
)
|
||||
assert body["tools"] == [self._WEB_SEARCH_TOOL, function_tool]
|
||||
|
||||
def test_web_search_is_not_logged_as_dropped(self, caplog):
|
||||
cfg = BedrockMantleResponsesAPIConfig()
|
||||
|
||||
def drop_warnings() -> list[str]:
|
||||
return [r.getMessage() for r in caplog.records if "dropping unsupported tool type" in r.getMessage()]
|
||||
|
||||
with caplog.at_level(logging.WARNING, logger="LiteLLM"):
|
||||
cfg.map_openai_params(
|
||||
response_api_optional_params={"tools": [{"type": "file_search"}]},
|
||||
model="openai.gpt-5.6-sol",
|
||||
drop_params=False,
|
||||
)
|
||||
assert len(drop_warnings()) == 1
|
||||
caplog.clear()
|
||||
cfg.map_openai_params(
|
||||
response_api_optional_params={"tools": [self._WEB_SEARCH_TOOL]},
|
||||
model="openai.gpt-5.6-sol",
|
||||
drop_params=False,
|
||||
)
|
||||
assert drop_warnings() == []
|
||||
|
||||
def test_hoisted_web_search_tool_survives(self):
|
||||
cfg = BedrockMantleResponsesAPIConfig()
|
||||
body = cfg.transform_responses_api_request(
|
||||
model="openai.gpt-5.6-sol",
|
||||
input=[
|
||||
{"type": "additional_tools", "role": "developer", "tools": [self._WEB_SEARCH_TOOL]},
|
||||
{"type": "message", "role": "user", "content": [{"type": "input_text", "text": "hi"}]},
|
||||
],
|
||||
response_api_optional_request_params={},
|
||||
litellm_params=GenericLiteLLMParams(),
|
||||
headers={},
|
||||
)
|
||||
assert body["tools"] == [self._WEB_SEARCH_TOOL]
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"model",
|
||||
[
|
||||
"bedrock_mantle/openai.gpt-5.6-sol",
|
||||
"bedrock_mantle/openai.gpt-5.6-terra",
|
||||
"bedrock_mantle/openai.gpt-5.6-luna",
|
||||
"bedrock_mantle/openai.gpt-5.5",
|
||||
"bedrock_mantle/openai.gpt-5.4",
|
||||
],
|
||||
)
|
||||
def test_cost_map_advertises_web_search_support(self, model):
|
||||
assert litellm.supports_web_search(model=model) is True
|
||||
|
||||
|
||||
def _codex_exec_tool():
|
||||
|
|
@ -551,7 +634,7 @@ class TestBedrockMantleCodexAdditionalTools:
|
|||
"type": "additional_tools",
|
||||
"role": "developer",
|
||||
"tools": [
|
||||
{"type": "web_search"},
|
||||
{"type": "file_search", "vector_store_ids": ["vs_123"]},
|
||||
{"type": "function", "name": "wait"},
|
||||
],
|
||||
},
|
||||
|
|
@ -563,7 +646,11 @@ class TestBedrockMantleCodexAdditionalTools:
|
|||
def test_item_stripped_even_when_no_hoisted_tool_survives(self):
|
||||
body = self._transform(
|
||||
input=[
|
||||
{"type": "additional_tools", "role": "developer", "tools": [{"type": "web_search"}]},
|
||||
{
|
||||
"type": "additional_tools",
|
||||
"role": "developer",
|
||||
"tools": [{"type": "file_search", "vector_store_ids": ["vs_123"]}],
|
||||
},
|
||||
self._USER_MESSAGE,
|
||||
]
|
||||
)
|
||||
|
|
|
|||
|
|
@ -11083,6 +11083,14 @@ async def test_new_team_rejects_reserved_ui_session_team_id():
|
|||
mock_prisma.get_data.assert_not_called()
|
||||
|
||||
|
||||
@pytest.mark.parametrize("team_id", ["", " "])
|
||||
def test_new_team_request_blank_team_id_is_unset(team_id: str) -> None:
|
||||
from litellm.proxy._types import NewTeamRequest
|
||||
|
||||
assert NewTeamRequest(team_alias="t", team_id=team_id).team_id is None
|
||||
assert NewTeamRequest(team_id="custom").team_id == "custom"
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# PATCH /team/{team_id} — RFC 7386 JSON Merge Patch
|
||||
#
|
||||
|
|
|
|||
6
uv.lock
generated
6
uv.lock
generated
|
|
@ -10,7 +10,7 @@ resolution-markers = [
|
|||
]
|
||||
|
||||
[options]
|
||||
exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values.
|
||||
exclude-newer = "2026-08-31T17:52:45.782441Z"
|
||||
exclude-newer-span = "P3D"
|
||||
|
||||
[manifest]
|
||||
|
|
@ -4765,12 +4765,12 @@ proxy-dev = [
|
|||
|
||||
[[package]]
|
||||
name = "litellm-enterprise"
|
||||
version = "0.1.63"
|
||||
version = "0.1.64"
|
||||
source = { editable = "enterprise" }
|
||||
|
||||
[[package]]
|
||||
name = "litellm-proxy-extras"
|
||||
version = "0.4.92"
|
||||
version = "0.4.93"
|
||||
source = { editable = "litellm-proxy-extras" }
|
||||
|
||||
[[package]]
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue