fix(openai): forward request metadata without preview features

This commit is contained in:
与世无争剑宇子 2026-10-19 12:37:09 +08:00
parent bcd80b6aa1
commit 24e98c4642
2 changed files with 22 additions and 24 deletions

View file

@ -2678,7 +2678,9 @@ def _complete_custom_openai(
if extra_headers is not None and not use_base_llm_http_handler:
optional_params["extra_headers"] = extra_headers
if litellm.enable_preview_features and metadata is not None: # [PREVIEW] allow metadata to be passed to OPENAI
# OpenAI accepts request metadata independently of preview features. Keep this
# limited to the OpenAI provider; compatible providers may reject the field.
if custom_llm_provider == "openai" and metadata is not None:
openai_metadata: Final = get_requester_metadata(metadata)
if openai_metadata is not None:
optional_params["metadata"] = openai_metadata

View file

@ -7633,34 +7633,30 @@ def test_completion_novita_ai_dynamic_params(api_key):
"enable_preview_features",
[True, False],
)
def test_completion_openai_metadata(monkeypatch, enable_preview_features):
def test_completion_openai_metadata(
monkeypatch, enable_preview_features, respx_mock: respx.MockRouter
):
from openai import OpenAI
client = OpenAI()
litellm.set_verbose = True
monkeypatch.setattr(litellm, "enable_preview_features", enable_preview_features)
with patch.object(
client, "post", return_value=MagicMock()
) as mock_completion:
try:
resp = litellm.completion(
model="openai/gpt-3.5-turbo",
messages=[{"role": "user", "content": "Hello world"}],
metadata={"my-test-key": "my-test-value"},
client=client,
)
except Exception as e:
print(f"Error: {e}")
respx_mock.post("https://api.openai.com/v1/chat/completions").mock(
return_value=_mocked_openai_chat_response("gpt-3.5-turbo")
)
mock_completion.assert_called_once()
if enable_preview_features:
assert mock_completion.call_args.kwargs["body"]["metadata"] == {
"my-test-key": "my-test-value"
}
else:
assert "metadata" not in mock_completion.call_args.kwargs["body"]
litellm.completion(
model="openai/gpt-3.5-turbo",
messages=[{"role": "user", "content": "Hello world"}],
metadata={
"session_id": "abc-123",
"hidden_params": {"api_key": "should-not-leak"},
"non_string": 123,
},
client=client,
)
request_body = json.loads(respx_mock.calls[0].request.content)
assert request_body["metadata"] == {"session_id": "abc-123"}
AZURE_TTS_BASE: Final = "https://tts.example.azure.com"