test_rerank.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import os
  2. import pytest
  3. from core.model_runtime.entities.rerank_entities import RerankResult
  4. from core.model_runtime.errors.validate import CredentialsValidateFailedError
  5. from core.model_runtime.model_providers.huggingface_tei.rerank.rerank import (
  6. HuggingfaceTeiRerankModel,
  7. )
  8. from core.model_runtime.model_providers.huggingface_tei.text_embedding.text_embedding import TeiHelper
  9. from tests.integration_tests.model_runtime.__mock.huggingface_tei import MockTEIClass
  10. MOCK = os.getenv("MOCK_SWITCH", "false").lower() == "true"
  11. @pytest.fixture
  12. def setup_tei_mock(request, monkeypatch: pytest.MonkeyPatch):
  13. if MOCK:
  14. monkeypatch.setattr(TeiHelper, "get_tei_extra_parameter", MockTEIClass.get_tei_extra_parameter)
  15. monkeypatch.setattr(TeiHelper, "invoke_tokenize", MockTEIClass.invoke_tokenize)
  16. monkeypatch.setattr(TeiHelper, "invoke_embeddings", MockTEIClass.invoke_embeddings)
  17. monkeypatch.setattr(TeiHelper, "invoke_rerank", MockTEIClass.invoke_rerank)
  18. yield
  19. if MOCK:
  20. monkeypatch.undo()
  21. @pytest.mark.parametrize("setup_tei_mock", [["none"]], indirect=True)
  22. def test_validate_credentials(setup_tei_mock):
  23. model = HuggingfaceTeiRerankModel()
  24. # model name is only used in mock
  25. model_name = "reranker"
  26. if MOCK:
  27. # TEI Provider will check model type by API endpoint, at real server, the model type is correct.
  28. # So we dont need to check model type here. Only check in mock
  29. with pytest.raises(CredentialsValidateFailedError):
  30. model.validate_credentials(
  31. model="embedding",
  32. credentials={
  33. "server_url": os.environ.get("TEI_RERANK_SERVER_URL"),
  34. "api_key": os.environ.get("TEI_API_KEY", ""),
  35. },
  36. )
  37. model.validate_credentials(
  38. model=model_name,
  39. credentials={
  40. "server_url": os.environ.get("TEI_RERANK_SERVER_URL"),
  41. "api_key": os.environ.get("TEI_API_KEY", ""),
  42. },
  43. )
  44. @pytest.mark.parametrize("setup_tei_mock", [["none"]], indirect=True)
  45. def test_invoke_model(setup_tei_mock):
  46. model = HuggingfaceTeiRerankModel()
  47. # model name is only used in mock
  48. model_name = "reranker"
  49. result = model.invoke(
  50. model=model_name,
  51. credentials={
  52. "server_url": os.environ.get("TEI_RERANK_SERVER_URL"),
  53. "api_key": os.environ.get("TEI_API_KEY", ""),
  54. },
  55. query="Who is Kasumi?",
  56. docs=[
  57. 'Kasumi is a girl\'s name of Japanese origin meaning "mist".',
  58. "Her music is a kawaii bass, a mix of future bass, pop, and kawaii music ",
  59. "and she leads a team named PopiParty.",
  60. ],
  61. score_threshold=0.8,
  62. )
  63. assert isinstance(result, RerankResult)
  64. assert len(result.docs) == 1
  65. assert result.docs[0].index == 0
  66. assert result.docs[0].score >= 0.8