mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-06-29 15:31:05 +08:00
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:
@@ -41,7 +41,7 @@ except ImportError: # pragma: no cover - optional dependency
|
||||
|
||||
from peewee import OperationalError
|
||||
|
||||
from common.constants import ActiveEnum
|
||||
from common.constants import ActiveEnum, LLMType
|
||||
from api.db.db_models import APIToken
|
||||
from api.utils.json_encode import CustomJSONEncoder
|
||||
from common.mcp_tool_call_conn import MCPToolCallSession, close_multiple_mcp_toolcall_sessions
|
||||
@@ -576,8 +576,7 @@ def check_duplicate_ids(ids, id_type="item"):
|
||||
|
||||
|
||||
def verify_embedding_availability(embd_id: str, tenant_id: str) -> tuple[bool, str | None]:
|
||||
from api.db.services.llm_service import LLMService
|
||||
from api.db.services.tenant_llm_service import TenantLLMService
|
||||
from api.db.joint_services.tenant_model_service import get_model_config_from_provider_instance
|
||||
|
||||
"""
|
||||
Verifies availability of an embedding model for a specific tenant.
|
||||
@@ -613,18 +612,9 @@ def verify_embedding_availability(embd_id: str, tenant_id: str) -> tuple[bool, s
|
||||
(False, {'code': 101, 'message': "Unsupported model: <invalid_model>"})
|
||||
"""
|
||||
try:
|
||||
llm_name, llm_factory = TenantLLMService.split_model_name_and_factory(embd_id)
|
||||
in_llm_service = bool(LLMService.query(llm_name=llm_name, fid=llm_factory, model_type="embedding"))
|
||||
|
||||
tenant_llms = TenantLLMService.get_my_llms(tenant_id=tenant_id)
|
||||
is_tenant_model = any(llm["llm_name"] == llm_name and llm["llm_factory"] == llm_factory and llm["model_type"] == "embedding" for llm in tenant_llms)
|
||||
|
||||
is_builtin_model = llm_factory == "Builtin"
|
||||
if not (is_builtin_model or is_tenant_model or in_llm_service):
|
||||
return False, f"Unsupported model: <{embd_id}>"
|
||||
|
||||
if not (is_builtin_model or is_tenant_model):
|
||||
return False, f"Unauthorized model: <{embd_id}>"
|
||||
get_model_config_from_provider_instance(tenant_id, LLMType.EMBEDDING, embd_id)
|
||||
except LookupError as e:
|
||||
return False, str(e)
|
||||
except OperationalError as e:
|
||||
logging.exception(e)
|
||||
return False, "Database operation failed"
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
#
|
||||
# Copyright 2026 The InfiniFlow Authors. All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
from common.constants import LLMType
|
||||
from common.exceptions import ArgumentException
|
||||
from api.db.services.tenant_llm_service import TenantLLMService
|
||||
|
||||
_KEY_TO_MODEL_TYPE = {
|
||||
"llm_id": LLMType.CHAT,
|
||||
"embd_id": LLMType.EMBEDDING,
|
||||
"asr_id": LLMType.SPEECH2TEXT,
|
||||
"img2txt_id": LLMType.IMAGE2TEXT,
|
||||
"rerank_id": LLMType.RERANK,
|
||||
"tts_id": LLMType.TTS,
|
||||
}
|
||||
|
||||
def ensure_tenant_model_id_for_params(tenant_id: str, param_dict: dict, *, strict: bool = False) -> dict:
|
||||
for key in ["llm_id", "embd_id", "asr_id", "img2txt_id", "rerank_id", "tts_id"]:
|
||||
if param_dict.get(key) and not param_dict.get(f"tenant_{key}"):
|
||||
model_type = _KEY_TO_MODEL_TYPE.get(key)
|
||||
tenant_model = TenantLLMService.get_api_key(tenant_id, param_dict[key], model_type)
|
||||
if not tenant_model and model_type == LLMType.CHAT:
|
||||
tenant_model = TenantLLMService.get_api_key(tenant_id, param_dict[key])
|
||||
if tenant_model:
|
||||
param_dict.update({f"tenant_{key}": tenant_model.id})
|
||||
else:
|
||||
if strict:
|
||||
model_type_val = model_type.value if hasattr(model_type, "value") else model_type
|
||||
raise ArgumentException(
|
||||
f"Tenant Model with name {param_dict[key]} and type {model_type_val} not found"
|
||||
)
|
||||
param_dict.update({f"tenant_{key}": 0})
|
||||
return param_dict
|
||||
Reference in New Issue
Block a user