refa: resolve tenant model refs consistently (#16744)

This commit is contained in:
buua436
2026-07-09 14:02:08 +08:00
committed by GitHub
parent 794fcc2517
commit 6a77523bf0
51 changed files with 300 additions and 225 deletions

View File

@@ -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,

View File

@@ -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(

View File

@@ -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(

View File

@@ -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,

View File

@@ -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,

View File

@@ -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(

View File

@@ -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)