diff --git a/litellm/litellm_core_utils/mock_functions.py b/litellm/litellm_core_utils/mock_functions.py index ffbe5f72357..94d0ef8e423 100644 --- a/litellm/litellm_core_utils/mock_functions.py +++ b/litellm/litellm_core_utils/mock_functions.py @@ -1,3 +1,5 @@ +from collections.abc import Sequence + from ..types.utils import ( Embedding, EmbeddingResponse, @@ -7,14 +9,29 @@ from ..types.utils import ( ) -def mock_embedding(model: str, mock_response: list[float] | None): +def _embedding_input_count(embedding_input: str | Sequence[str] | Sequence[int] | Sequence[Sequence[int]]) -> int: + match embedding_input: + case str() | [int(), *_]: + return 1 + case _: + return len(embedding_input) + + +def mock_embedding( + model: str, + embedding_input: str | Sequence[str] | Sequence[int] | Sequence[Sequence[int]], + mock_response: list[float] | None, +): if mock_response is None: mock_response = [0.0] * 1536 elif mock_response == "error": raise Exception("Mock error") return EmbeddingResponse( model=model, - data=[Embedding(embedding=mock_response, index=0, object="embedding")], + data=[ + Embedding(embedding=mock_response, index=index, object="embedding") + for index in range(_embedding_input_count(embedding_input)) + ], usage=Usage(prompt_tokens=10, completion_tokens=0), ) diff --git a/litellm/main.py b/litellm/main.py index 122de9a02c0..05a6bd9ca02 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -6452,7 +6452,7 @@ def embedding( ) if mock_response is not None: - return mock_embedding(model=model, mock_response=mock_response) + return mock_embedding(model=model, embedding_input=input, mock_response=mock_response) try: response: EmbeddingResponse | Coroutine[object, object, EmbeddingResponse] | None = None diff --git a/tests/unit/litellm_core_utils/test_mock_functions.py b/tests/unit/litellm_core_utils/test_mock_functions.py new file mode 100644 index 00000000000..841336f9917 --- /dev/null +++ b/tests/unit/litellm_core_utils/test_mock_functions.py @@ -0,0 +1,23 @@ +from typing import Final + +import pytest + +import litellm + + +@pytest.mark.parametrize( + ("embedding_input", "expected_count"), + [ + ("hello", 1), + (["first", "second", "third"], 3), + ([101, 102, 103], 1), + ([[101, 102], [103, 104]], 2), + ], +) +def test_mock_embedding_returns_one_embedding_per_input(embedding_input: object, expected_count: int) -> None: + vector: Final = [0.1, 0.2] + + response: Final = litellm.embedding(model="openai/test-model", input=embedding_input, mock_response=vector) + + assert [row["index"] for row in response.data] == list(range(expected_count)) + assert [row["embedding"] for row in response.data] == [vector] * expected_count