Feat: tenant llm provider (#14595)

### What problem does this PR solve?

Python implementation of the Go-based model_provider API suite.

### Type of change

- [x] New Feature (non-breaking change which adds functionality)

---------

Co-authored-by: bill <yibie_jingnian@163.com>
This commit is contained in:
Lynn
2026-05-29 17:39:41 +08:00
committed by GitHub
parent b79f79d9b9
commit dc4b82523b
148 changed files with 6059 additions and 3075 deletions

View File

@@ -366,7 +366,7 @@ def _load_chat_module(monkeypatch):
monkeypatch.setitem(sys.modules, "api.db.services.search_service", search_service_mod)
tenant_model_service_mod = ModuleType("api.db.joint_services.tenant_model_service")
tenant_model_service_mod.get_model_config_by_type_and_name = lambda *_args, **_kwargs: {}
tenant_model_service_mod.get_model_config_from_provider_instance = lambda *_args, **_kwargs: {}
tenant_model_service_mod.get_tenant_default_model_by_type = lambda *_args, **_kwargs: {}
monkeypatch.setitem(sys.modules, "api.db.joint_services.tenant_model_service", tenant_model_service_mod)
@@ -418,10 +418,6 @@ def _load_chat_module(monkeypatch):
api_utils_mod.validate_request = lambda *_args, **_kwargs: (lambda func: func)
monkeypatch.setitem(sys.modules, "api.utils.api_utils", api_utils_mod)
tenant_utils_mod = ModuleType("api.utils.tenant_utils")
tenant_utils_mod.ensure_tenant_model_id_for_params = lambda _tenant_id, req: req
monkeypatch.setitem(sys.modules, "api.utils.tenant_utils", tenant_utils_mod)
rag_pkg = ModuleType("rag")
rag_pkg.__path__ = [str(repo_root / "rag")]
monkeypatch.setitem(sys.modules, "rag", rag_pkg)

View File

@@ -238,7 +238,7 @@ def _load_dify_retrieval_module(monkeypatch):
raise LookupError(f"Tenant Model with id {tenant_model_id} not authorized")
return _MockModelConfig2(mock_tenant_id, "model-1").to_dict()
def _get_model_config_by_type_and_name(tenant_id: str, model_type: str, model_name: str):
def _get_model_config_from_provider_instance(tenant_id: str, model_type: str, model_name: str):
if not model_name:
raise Exception("Model Name is required")
return _MockModelConfig2(tenant_id, model_name).to_dict()
@@ -248,7 +248,7 @@ def _load_dify_retrieval_module(monkeypatch):
return _MockModelConfig2(tenant_id, "chat-model").to_dict()
tenant_model_service_mod.get_model_config_by_id = _get_model_config_by_id
tenant_model_service_mod.get_model_config_by_type_and_name = _get_model_config_by_type_and_name
tenant_model_service_mod.get_model_config_from_provider_instance = _get_model_config_from_provider_instance
tenant_model_service_mod.get_tenant_default_model_by_type = _get_tenant_default_model_by_type
monkeypatch.setitem(sys.modules, "api.db.joint_services.tenant_model_service", tenant_model_service_mod)

View File

@@ -478,7 +478,7 @@ def _load_doc_module(monkeypatch):
raise LookupError(f"Tenant Model with id {tenant_model_id} not authorized")
return _MockModelConfig2(mock_tenant_id, "model-1").to_dict()
def _get_model_config_by_type_and_name(tenant_id: str, model_type: str, model_name: str):
def _get_model_config_from_provider_instance(tenant_id: str, model_type: str, model_name: str):
if not model_name:
raise Exception("Model Name is required")
return _MockModelConfig2(tenant_id, model_name).to_dict()
@@ -488,7 +488,7 @@ def _load_doc_module(monkeypatch):
return _MockModelConfig2(tenant_id, "chat-model").to_dict()
tenant_model_service_mod.get_model_config_by_id = _get_model_config_by_id
tenant_model_service_mod.get_model_config_by_type_and_name = _get_model_config_by_type_and_name
tenant_model_service_mod.get_model_config_from_provider_instance = _get_model_config_from_provider_instance
tenant_model_service_mod.get_tenant_default_model_by_type = _get_tenant_default_model_by_type
monkeypatch.setitem(sys.modules, "api.db.joint_services.tenant_model_service", tenant_model_service_mod)

View File

@@ -481,7 +481,7 @@ def _load_session_module(monkeypatch):
raise LookupError(f"Tenant Model with id {tenant_model_id} not authorized")
return _MockModelConfig2(mock_tenant_id, "model-1").to_dict()
def _get_model_config_by_type_and_name(tenant_id: str, model_type: str, model_name: str):
def _get_model_config_from_provider_instance(tenant_id: str, model_type: str, model_name: str):
if not model_name:
raise Exception("Model Name is required")
return _MockModelConfig2(tenant_id, model_name, model_type).to_dict()
@@ -525,7 +525,7 @@ def _load_session_module(monkeypatch):
return _MockModelConfig2(tenant_id, model_name, model_type_val).to_dict()
tenant_model_service_mod.get_model_config_by_id = _get_model_config_by_id
tenant_model_service_mod.get_model_config_by_type_and_name = _get_model_config_by_type_and_name
tenant_model_service_mod.get_model_config_from_provider_instance = _get_model_config_from_provider_instance
tenant_model_service_mod.get_tenant_default_model_by_type = _get_tenant_default_model_by_type
monkeypatch.setitem(sys.modules, "api.db.joint_services.tenant_model_service", tenant_model_service_mod)
@@ -2095,7 +2095,6 @@ def _load_chat_api_module(monkeypatch):
monkeypatch.setitem(sys.modules, "api.db.joint_services", joint_pkg)
tenant_model_svc = ModuleType("api.db.joint_services.tenant_model_service")
tenant_model_svc.get_model_config_by_type_and_name = lambda *_a, **_k: {}
tenant_model_svc.get_tenant_default_model_by_type = lambda *_a, **_k: {}
monkeypatch.setitem(sys.modules, "api.db.joint_services.tenant_model_service", tenant_model_svc)
@@ -2185,10 +2184,6 @@ def _load_chat_api_module(monkeypatch):
api_utils_mod.validate_request = lambda *_a, **_k: (lambda func: func)
monkeypatch.setitem(sys.modules, "api.utils.api_utils", api_utils_mod)
tenant_utils_mod = ModuleType("api.utils.tenant_utils")
tenant_utils_mod.ensure_tenant_model_id_for_params = lambda _tenant_id, req: req
monkeypatch.setitem(sys.modules, "api.utils.tenant_utils", tenant_utils_mod)
rag_gen_mod = ModuleType("rag.prompts.generator")
rag_gen_mod.chunks_format = lambda chunks: chunks
monkeypatch.setitem(sys.modules, "rag.prompts.generator", rag_gen_mod)