fix(openai): honor zero retries for embeddings

This commit is contained in:
Ramzi Alashmali 2026-10-06 09:13:48 +03:00
parent c13746c951
commit 500e267b3f
2 changed files with 63 additions and 4 deletions

View file

@ -1332,8 +1332,8 @@ class OpenAIChatCompletion(BaseLLM, BaseOpenAILLM):
super().embedding()
try:
data: Final = {"model": model, "input": input, **optional_params}
max_retries = max_retries or litellm.DEFAULT_MAX_RETRIES
if not isinstance(max_retries, int):
effective_max_retries: Final = litellm.DEFAULT_MAX_RETRIES if max_retries is None else max_retries
if not isinstance(effective_max_retries, int):
raise OpenAIError(status_code=422, message="max retries must be an int")
## LOGGING
logging_obj.pre_call(
@ -1352,7 +1352,7 @@ class OpenAIChatCompletion(BaseLLM, BaseOpenAILLM):
api_key=api_key,
timeout=timeout,
client=client,
max_retries=max_retries,
max_retries=effective_max_retries,
shared_session=shared_session,
litellm_params=litellm_params,
)
@ -1362,7 +1362,7 @@ class OpenAIChatCompletion(BaseLLM, BaseOpenAILLM):
api_key=api_key,
api_base=api_base,
timeout=timeout,
max_retries=max_retries,
max_retries=effective_max_retries,
client=client,
litellm_params=litellm_params,
)

View file

@ -350,3 +350,62 @@ async def test_async_audio_speech_records_provider_response_headers():
)
_assert_provider_headers_recorded(response)
def _embedding_transport() -> httpx.MockTransport:
return httpx.MockTransport(
lambda request: httpx.Response(
200,
json={
"object": "list",
"model": "embedding-test",
"data": [{"object": "embedding", "index": 0, "embedding": [0.1, 0.2]}],
"usage": {"prompt_tokens": 1, "total_tokens": 1},
},
)
)
@pytest.mark.parametrize("max_retries,expected_retries", [(0, 0), (3, 3), (None, litellm.DEFAULT_MAX_RETRIES)])
def test_embedding_honors_explicit_retry_limit(max_retries: int | None, expected_retries: int) -> None:
with OpenAI(
api_key="transport-only",
base_url="https://embedding.example/v1",
max_retries=7,
http_client=httpx.Client(transport=_embedding_transport()),
) as client:
response: Final = litellm.embedding(
model="openai/embedding-test",
input=["retry control"],
encoding_format="float",
client=client,
max_retries=max_retries,
api_key="transport-only",
api_base=str(client.base_url),
)
assert client.max_retries == expected_retries
assert response.data == [{"object": "embedding", "index": 0, "embedding": [0.1, 0.2]}]
@pytest.mark.asyncio
@pytest.mark.parametrize("max_retries,expected_retries", [(0, 0), (3, 3), (None, litellm.DEFAULT_MAX_RETRIES)])
async def test_aembedding_honors_explicit_retry_limit(max_retries: int | None, expected_retries: int) -> None:
async with AsyncOpenAI(
api_key="transport-only",
base_url="https://embedding.example/v1",
max_retries=7,
http_client=httpx.AsyncClient(transport=_embedding_transport()),
) as client:
response: Final = await litellm.aembedding(
model="openai/embedding-test",
input=["retry control"],
encoding_format="float",
client=client,
max_retries=max_retries,
api_key="transport-only",
api_base=str(client.base_url),
)
assert client.max_retries == expected_retries
assert response.data == [{"object": "embedding", "index": 0, "embedding": [0.1, 0.2]}]