mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-07-18 21:57:27 +08:00
refa: resolve tenant model refs consistently (#16744)
This commit is contained in:
@@ -90,7 +90,13 @@ def _load_bot_api(monkeypatch, *, accessible, calls):
|
||||
TenantService=SimpleNamespace(),
|
||||
UserTenantService=SimpleNamespace(),
|
||||
)
|
||||
_stub(monkeypatch, "api.db.joint_services.tenant_model_service", get_tenant_default_model_by_type=lambda *_a, **_k: None, get_model_config_from_provider_instance=lambda *_a, **_k: None)
|
||||
_stub(
|
||||
monkeypatch,
|
||||
"api.db.joint_services.tenant_model_service",
|
||||
get_tenant_default_model_by_type=lambda *_a, **_k: None,
|
||||
get_model_config_from_provider_instance=lambda *_a, **_k: None,
|
||||
resolve_model_config=lambda *_a, **_k: None,
|
||||
)
|
||||
_stub(monkeypatch, "common.misc_utils", get_uuid=lambda: "uuid", thread_pool_exec=_passthrough_thread_pool_exec)
|
||||
_stub(
|
||||
monkeypatch,
|
||||
|
||||
@@ -73,6 +73,7 @@ def _load_openai_api(monkeypatch):
|
||||
monkeypatch,
|
||||
"api.db.joint_services.tenant_model_service",
|
||||
get_model_config_from_provider_instance=lambda *_a, **_k: {},
|
||||
resolve_model_config=lambda *_a, **_k: {},
|
||||
get_api_key=lambda *_a, **_k: "key",
|
||||
)
|
||||
_stub(
|
||||
|
||||
@@ -135,6 +135,7 @@ def _load_dify_retrieval(monkeypatch, *, kb, accessible, request_body, tenant_id
|
||||
"api.db.joint_services.tenant_model_service",
|
||||
get_tenant_default_model_by_type=lambda *_a, **_k: {},
|
||||
get_model_config_from_provider_instance=lambda *_a, **_k: {},
|
||||
resolve_model_config=lambda *_a, **_k: {},
|
||||
)
|
||||
|
||||
_stub(
|
||||
|
||||
@@ -103,6 +103,8 @@ def _load_delete_datasets_module(monkeypatch, *, f2d_rows, file_filter_delete):
|
||||
monkeypatch,
|
||||
"api.db.joint_services.tenant_model_service",
|
||||
get_model_config_from_provider_instance=MagicMock(),
|
||||
resolve_model_config=MagicMock(),
|
||||
resolve_model_id=MagicMock(),
|
||||
)
|
||||
_stub(
|
||||
monkeypatch,
|
||||
|
||||
@@ -21,12 +21,10 @@ the quantization tag, such as `text-embedding-nomic-embed-text-v1.5@q8_0`).
|
||||
"""
|
||||
|
||||
import importlib.util
|
||||
import logging
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from enum import IntEnum
|
||||
from types import ModuleType, SimpleNamespace
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -35,6 +33,7 @@ pytestmark = pytest.mark.p2
|
||||
|
||||
class _StubModelTypeBinary(IntEnum):
|
||||
"""Mimics common.constants.ModelTypeBinary for the stubbed environment."""
|
||||
|
||||
CHAT = 1
|
||||
EMBEDDING = 2
|
||||
SPEECH2TEXT = 4
|
||||
@@ -86,10 +85,11 @@ def _load_module(monkeypatch, *, tenant_model_records, factory_llm_infos=None):
|
||||
additional behaviour at runtime.
|
||||
"""
|
||||
|
||||
tenant = SimpleNamespace(id="tenant-1")
|
||||
tenant = SimpleNamespace(id="tenant-1", name="tenant-1")
|
||||
provider = SimpleNamespace(
|
||||
id="provider-1",
|
||||
provider_name="LM-Studio",
|
||||
tenant_id="tenant-1",
|
||||
)
|
||||
instance = SimpleNamespace(
|
||||
id="instance-1",
|
||||
@@ -110,9 +110,7 @@ def _load_module(monkeypatch, *, tenant_model_records, factory_llm_infos=None):
|
||||
# Default no-op; tests that need to observe the resolved provider
|
||||
# name passed by `_get_model_info` override this with
|
||||
# monkeypatch.setattr on the loaded stub.
|
||||
get_by_tenant_id_and_provider_name=lambda tenant_id, provider_name: SimpleNamespace(
|
||||
id="provider-1", provider_name=provider_name
|
||||
),
|
||||
get_by_tenant_id_and_provider_name=lambda tenant_id, provider_name: SimpleNamespace(id="provider-1", provider_name=provider_name),
|
||||
),
|
||||
)
|
||||
_stub(
|
||||
@@ -120,9 +118,7 @@ def _load_module(monkeypatch, *, tenant_model_records, factory_llm_infos=None):
|
||||
"api.db.services.tenant_model_instance_service",
|
||||
TenantModelInstanceService=SimpleNamespace(
|
||||
get_by_provider_ids=lambda provider_ids: [instance],
|
||||
get_by_provider_id_and_instance_name=lambda provider_id, instance_name: SimpleNamespace(
|
||||
id="instance-1", provider_id=provider_id, instance_name=instance_name
|
||||
),
|
||||
get_by_provider_id_and_instance_name=lambda provider_id, instance_name: SimpleNamespace(id="instance-1", provider_id=provider_id, instance_name=instance_name),
|
||||
),
|
||||
)
|
||||
_stub(
|
||||
@@ -132,12 +128,8 @@ def _load_module(monkeypatch, *, tenant_model_records, factory_llm_infos=None):
|
||||
get_models_by_provider_ids_and_instance_ids=lambda p_ids, i_ids: list(tenant_model_records),
|
||||
# Default returns an "active" model so `_get_model_info` treats
|
||||
# the row as enabled when exercising the bare-model branch.
|
||||
get_by_provider_id_and_instance_id_and_model_type_and_model_name=lambda *args: SimpleNamespace(
|
||||
status=1
|
||||
),
|
||||
get_by_provider_id_and_instance_id_and_model_name=lambda *args: SimpleNamespace(
|
||||
status=1
|
||||
),
|
||||
get_by_provider_id_and_instance_id_and_model_type_and_model_name=lambda *args: SimpleNamespace(status=1),
|
||||
get_by_provider_id_and_instance_id_and_model_name=lambda *args: SimpleNamespace(status=1),
|
||||
),
|
||||
)
|
||||
|
||||
@@ -169,13 +161,7 @@ def _load_module(monkeypatch, *, tenant_model_records, factory_llm_infos=None):
|
||||
FACTORY_LLM_INFOS=factory_llm_infos if factory_llm_infos is not None else [],
|
||||
)
|
||||
|
||||
module_path = (
|
||||
Path(__file__).resolve().parents[5]
|
||||
/ "api"
|
||||
/ "apps"
|
||||
/ "services"
|
||||
/ "models_api_service.py"
|
||||
)
|
||||
module_path = Path(__file__).resolve().parents[5] / "api" / "apps" / "services" / "models_api_service.py"
|
||||
spec = importlib.util.spec_from_file_location(
|
||||
"test_models_api_service_list_tenant_added_models",
|
||||
module_path,
|
||||
@@ -213,6 +199,7 @@ def _make_model_record(model_name, model_type="embedding", status=1):
|
||||
"""
|
||||
model_type_bin = _MODEL_TYPE_TO_BIN.get(model_type, model_type) if isinstance(model_type, str) else model_type
|
||||
return SimpleNamespace(
|
||||
id=f"{model_name}-id",
|
||||
provider_id="provider-1",
|
||||
instance_id="instance-1",
|
||||
model_name=model_name,
|
||||
|
||||
@@ -224,7 +224,7 @@ def test_async_ask_final_event_carries_decorated_answer(monkeypatch):
|
||||
monkeypatch.setattr(dialog_service.KnowledgebaseService, "get_by_ids", lambda _ids: [_KB])
|
||||
monkeypatch.setattr(
|
||||
dialog_service,
|
||||
"get_model_config_from_provider_instance",
|
||||
"resolve_model_config",
|
||||
lambda _tid, _type, _name: _LLM_CONFIG,
|
||||
)
|
||||
monkeypatch.setattr(dialog_service, "LLMBundle", lambda _tid, _cfg: chat_mdl)
|
||||
@@ -269,7 +269,7 @@ def test_async_ask_delta_events_carry_incremental_text_only(monkeypatch):
|
||||
monkeypatch.setattr(dialog_service.KnowledgebaseService, "get_by_ids", lambda _ids: [_KB])
|
||||
monkeypatch.setattr(
|
||||
dialog_service,
|
||||
"get_model_config_from_provider_instance",
|
||||
"resolve_model_config",
|
||||
lambda _tid, _type, _name: _LLM_CONFIG,
|
||||
)
|
||||
monkeypatch.setattr(dialog_service, "LLMBundle", lambda _tid, _cfg: chat_mdl)
|
||||
@@ -381,7 +381,7 @@ def _make_dialog(chat_mdl_stub):
|
||||
top_n=6,
|
||||
top_k=1024,
|
||||
rerank_id="",
|
||||
tenant_rerank_id=None
|
||||
tenant_rerank_id=None,
|
||||
)
|
||||
|
||||
|
||||
@@ -400,10 +400,10 @@ def test_async_chat_final_event_carries_decorated_answer(monkeypatch):
|
||||
retriever = _StubRetriever()
|
||||
|
||||
# Stub out the heavy service/model calls
|
||||
monkeypatch.setattr(dialog_service, "get_model_type_by_name", lambda _tid, _llm_id: ["chat"])
|
||||
monkeypatch.setattr(dialog_service, "resolve_model_type", lambda _tid, _llm_id: ["chat"])
|
||||
monkeypatch.setattr(
|
||||
dialog_service,
|
||||
"get_model_config_from_provider_instance",
|
||||
"resolve_model_config",
|
||||
lambda _tid, _type, _llm_id: _LLM_CONFIG,
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
@@ -452,10 +452,10 @@ def test_async_chat_langfuse_uses_start_observation(monkeypatch):
|
||||
chat_mdl = _StreamingChatModel(llm_answer)
|
||||
retriever = _StubRetriever()
|
||||
|
||||
monkeypatch.setattr(dialog_service, "get_model_type_by_name", lambda _tid, _llm_id: ["chat"])
|
||||
monkeypatch.setattr(dialog_service, "resolve_model_type", lambda _tid, _llm_id: ["chat"])
|
||||
monkeypatch.setattr(
|
||||
dialog_service,
|
||||
"get_model_config_from_provider_instance",
|
||||
"resolve_model_config",
|
||||
lambda _tid, _type, _llm_id: _LLM_CONFIG,
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
@@ -515,10 +515,10 @@ def test_async_chat_langfuse_observation_includes_session_id(monkeypatch):
|
||||
chat_mdl = _StreamingChatModel("Session traces should be grouped.")
|
||||
retriever = _StubRetriever()
|
||||
|
||||
monkeypatch.setattr(dialog_service, "get_model_type_by_name", lambda _tid, _llm_id: ["chat"])
|
||||
monkeypatch.setattr(dialog_service, "resolve_model_type", lambda _tid, _llm_id: ["chat"])
|
||||
monkeypatch.setattr(
|
||||
dialog_service,
|
||||
"get_model_config_from_provider_instance",
|
||||
"resolve_model_config",
|
||||
lambda _tid, _type, _llm_id: _LLM_CONFIG,
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
@@ -573,7 +573,7 @@ def test_get_models_passes_langfuse_trace_context_to_llm_bundles(monkeypatch):
|
||||
monkeypatch.setattr(dialog_service.KnowledgebaseService, "get_by_ids", lambda _ids: [_KB])
|
||||
monkeypatch.setattr(
|
||||
dialog_service,
|
||||
"get_model_config_from_provider_instance",
|
||||
"resolve_model_config",
|
||||
lambda _tenant_id, model_type, _model_id: {**_LLM_CONFIG, "model_type": model_type},
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
@@ -614,10 +614,10 @@ def test_async_chat_continues_when_langfuse_observation_start_fails(monkeypatch)
|
||||
chat_mdl = _StreamingChatModel(llm_answer)
|
||||
retriever = _StubRetriever()
|
||||
|
||||
monkeypatch.setattr(dialog_service, "get_model_type_by_name", lambda _tid, _llm_id: ["chat"])
|
||||
monkeypatch.setattr(dialog_service, "resolve_model_type", lambda _tid, _llm_id: ["chat"])
|
||||
monkeypatch.setattr(
|
||||
dialog_service,
|
||||
"get_model_config_from_provider_instance",
|
||||
"resolve_model_config",
|
||||
lambda _tid, _type, _llm_id: _LLM_CONFIG,
|
||||
)
|
||||
monkeypatch.setattr(
|
||||
|
||||
@@ -317,10 +317,10 @@ def test_async_chat_uses_all_docs_when_no_doc_ids_selected(monkeypatch):
|
||||
)
|
||||
|
||||
monkeypatch.setattr(dialog_service.settings, "retriever", retriever, raising=False)
|
||||
monkeypatch.setattr(dialog_service, "get_model_type_by_name", lambda _tid, _llm_id: ["chat"])
|
||||
monkeypatch.setattr(dialog_service, "resolve_model_type", lambda _tid, _llm_id: ["chat"])
|
||||
monkeypatch.setattr(
|
||||
dialog_service,
|
||||
"get_model_config_from_provider_instance",
|
||||
"resolve_model_config",
|
||||
lambda *_args, **_kwargs: {"llm_factory": "unit", "max_tokens": 4096, "model_type": "chat"},
|
||||
)
|
||||
monkeypatch.setattr(dialog_service.TenantLangfuseService, "filter_by_tenant", lambda **_kwargs: None)
|
||||
|
||||
Reference in New Issue
Block a user