Skip to content

Commit 17259d3

Browse files
committed
Make embedders deseralize to correct type
1 parent 28b16ce commit 17259d3

File tree

4 files changed

+84
-25
lines changed

4 files changed

+84
-25
lines changed

meilisearch/index.py

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,16 @@
1010
from meilisearch.config import Config
1111
from meilisearch.errors import version_error_hint_message
1212
from meilisearch.models.document import Document, DocumentsResults
13-
from meilisearch.models.index import Embedders, Faceting, IndexStats, Pagination, TypoTolerance
13+
from meilisearch.models.index import (
14+
Embedders,
15+
Faceting,
16+
HuggingFaceEmbedder,
17+
IndexStats,
18+
OpenAiEmbedder,
19+
Pagination,
20+
TypoTolerance,
21+
UserProvidedEmbedder,
22+
)
1423
from meilisearch.models.task import Task, TaskInfo, TaskResults
1524
from meilisearch.task import TaskHandler
1625

@@ -865,7 +874,21 @@ def get_settings(self) -> Dict[str, Any]:
865874
MeilisearchApiError
866875
An error containing details about why Meilisearch can't process your request. Meilisearch error codes are described here: https://www.meilisearch.com/docs/reference/errors/error_codes#meilisearch-errors
867876
"""
868-
return self.http.get(f"{self.config.paths.index}/{self.uid}/{self.config.paths.setting}")
877+
settings = self.http.get(f"{self.config.paths.index}/{self.uid}/{self.config.paths.setting}")
878+
879+
if settings.get("embedders"):
880+
embedders: dict[str, OpenAiEmbedder | HuggingFaceEmbedder | UserProvidedEmbedder] = {}
881+
for k, v in settings["embedders"].items():
882+
if v.get("source") == "openAi":
883+
embedders[k] = OpenAiEmbedder(**v)
884+
elif v.get("source") == "huggingFace":
885+
embedders[k] = HuggingFaceEmbedder(**v)
886+
else:
887+
embedders[k] = UserProvidedEmbedder(**v)
888+
889+
settings["embedders"] = embedders
890+
891+
return settings
869892

870893
def update_settings(self, body: Mapping[str, Any]) -> TaskInfo:
871894
"""Update settings of the index.
@@ -1777,7 +1800,17 @@ def get_embedders(self) -> Embedders | None:
17771800
if not response:
17781801
return None
17791802

1780-
return Embedders(embedders=response)
1803+
embedders: dict[str, OpenAiEmbedder | HuggingFaceEmbedder | UserProvidedEmbedder] = {}
1804+
for k, v in response.items():
1805+
print(v.get("source"))
1806+
if v.get("source") == "openAi":
1807+
embedders[k] = OpenAiEmbedder(**v)
1808+
elif v.get("source") == "huggingFace":
1809+
embedders[k] = HuggingFaceEmbedder(**v)
1810+
else:
1811+
embedders[k] = UserProvidedEmbedder(**v)
1812+
1813+
return Embedders(embedders=embedders)
17811814

17821815
def update_embedders(self, body: Union[Mapping[str, Any], None]) -> TaskInfo:
17831816
"""Update embedders of the index.

tests/conftest.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import meilisearch
99
from meilisearch.errors import MeilisearchApiError
10+
from meilisearch.models.index import HuggingFaceEmbedder, OpenAiEmbedder, UserProvidedEmbedder
1011
from tests import common
1112

1213

@@ -230,8 +231,7 @@ def enable_vector_search():
230231
@fixture
231232
def new_embedders():
232233
return {
233-
"default": {
234-
"source": "userProvided",
235-
"dimensions": 1,
236-
}
234+
"default": UserProvidedEmbedder(dimensions=1).model_dump(by_alias=True),
235+
"open_ai": OpenAiEmbedder().model_dump(by_alias=True),
236+
"hugging_face": HuggingFaceEmbedder().model_dump(by_alias=True),
237237
}

tests/settings/test_settings.py

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
1-
NEW_SETTINGS = {
2-
"rankingRules": ["typo", "words"],
3-
"searchableAttributes": ["title", "overview"],
4-
}
1+
import pytest
2+
3+
from meilisearch.models.index import HuggingFaceEmbedder, OpenAiEmbedder, UserProvidedEmbedder
4+
5+
6+
@pytest.fixture
7+
def new_settings(new_embedders):
8+
return {
9+
"rankingRules": ["typo", "words"],
10+
"searchableAttributes": ["title", "overview"],
11+
"embedders": new_embedders,
12+
}
13+
514

615
DEFAULT_RANKING_RULES = ["words", "typo", "proximity", "attribute", "sort", "exactness"]
716

@@ -31,36 +40,41 @@ def test_get_settings_default(empty_index):
3140
assert response["synonyms"] == {}
3241

3342

34-
def test_update_settings(empty_index):
43+
@pytest.mark.usefixtures("enable_vector_search")
44+
def test_update_settings(new_settings, empty_index):
3545
"""Tests updating some settings."""
3646
index = empty_index()
37-
response = index.update_settings(NEW_SETTINGS)
47+
response = index.update_settings(new_settings)
3848
update = index.wait_for_task(response.task_uid)
3949
assert update.status == "succeeded"
4050
response = index.get_settings()
41-
for rule in NEW_SETTINGS["rankingRules"]:
51+
for rule in new_settings["rankingRules"]:
4252
assert rule in response["rankingRules"]
4353
assert response["distinctAttribute"] is None
44-
for attribute in NEW_SETTINGS["searchableAttributes"]:
54+
for attribute in new_settings["searchableAttributes"]:
4555
assert attribute in response["searchableAttributes"]
4656
assert response["displayedAttributes"] == ["*"]
4757
assert response["stopWords"] == []
4858
assert response["synonyms"] == {}
59+
assert isinstance(response["embedders"]["default"], UserProvidedEmbedder)
60+
assert isinstance(response["embedders"]["open_ai"], OpenAiEmbedder)
61+
assert isinstance(response["embedders"]["hugging_face"], HuggingFaceEmbedder)
4962

5063

51-
def test_reset_settings(empty_index):
64+
@pytest.mark.usefixtures("enable_vector_search")
65+
def test_reset_settings(new_settings, empty_index):
5266
"""Tests resetting all the settings to their default value."""
5367
index = empty_index()
5468
# Update settings first
55-
response = index.update_settings(NEW_SETTINGS)
69+
response = index.update_settings(new_settings)
5670
update = index.wait_for_task(response.task_uid)
5771
assert update.status == "succeeded"
5872
# Check the settings have been correctly updated
5973
response = index.get_settings()
60-
for rule in NEW_SETTINGS["rankingRules"]:
74+
for rule in new_settings["rankingRules"]:
6175
assert rule in response["rankingRules"]
6276
assert response["distinctAttribute"] is None
63-
for attribute in NEW_SETTINGS["searchableAttributes"]:
77+
for attribute in new_settings["searchableAttributes"]:
6478
assert attribute in response["searchableAttributes"]
6579
assert response["displayedAttributes"] == ["*"]
6680
assert response["stopWords"] == []
@@ -80,3 +94,4 @@ def test_reset_settings(empty_index):
8094
assert response["searchableAttributes"] == ["*"]
8195
assert response["stopWords"] == []
8296
assert response["synonyms"] == {}
97+
assert response.get("embedders") is None

tests/settings/test_settings_embedders.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import pytest
22

3-
from meilisearch.models.index import Embedders
3+
from meilisearch.models.index import (
4+
Embedders,
5+
HuggingFaceEmbedder,
6+
OpenAiEmbedder,
7+
UserProvidedEmbedder,
8+
)
49

510

611
@pytest.mark.usefixtures("enable_vector_search")
@@ -19,7 +24,9 @@ def test_update_embedders_with_user_provided_source(new_embedders, empty_index):
1924
update = index.wait_for_task(response_update.task_uid)
2025
response_get = index.get_embedders()
2126
assert update.status == "succeeded"
22-
assert response_get == Embedders(embedders=new_embedders)
27+
assert isinstance(response_get.embedders["default"], UserProvidedEmbedder)
28+
assert isinstance(response_get.embedders["open_ai"], OpenAiEmbedder)
29+
assert isinstance(response_get.embedders["hugging_face"], HuggingFaceEmbedder)
2330

2431

2532
@pytest.mark.usefixtures("enable_vector_search")
@@ -30,15 +37,19 @@ def test_reset_embedders(new_embedders, empty_index):
3037
# Update the settings
3138
response_update = index.update_embedders(new_embedders)
3239
update1 = index.wait_for_task(response_update.task_uid)
40+
assert update1.status == "succeeded"
3341
# Get the setting after update
3442
response_get = index.get_embedders()
43+
assert isinstance(response_get.embedders["default"], UserProvidedEmbedder)
44+
assert isinstance(response_get.embedders["open_ai"], OpenAiEmbedder)
45+
assert isinstance(response_get.embedders["hugging_face"], HuggingFaceEmbedder)
3546
# Reset the setting
3647
response_reset = index.reset_embedders()
3748
update2 = index.wait_for_task(response_reset.task_uid)
3849
# Get the setting after reset
39-
response_last = index.get_embedders()
40-
41-
assert update1.status == "succeeded"
42-
assert response_get == Embedders(embedders=new_embedders)
4350
assert update2.status == "succeeded"
51+
assert isinstance(response_get.embedders["default"], UserProvidedEmbedder)
52+
assert isinstance(response_get.embedders["open_ai"], OpenAiEmbedder)
53+
assert isinstance(response_get.embedders["hugging_face"], HuggingFaceEmbedder)
54+
response_last = index.get_embedders()
4455
assert response_last is None

0 commit comments

Comments
 (0)