|
import logging |
|
import random |
|
|
|
from core.app.entities.app_invoke_entities import ModelConfigWithCredentialsEntity |
|
from core.model_runtime.errors.invoke import InvokeBadRequestError |
|
from core.model_runtime.model_providers.openai.moderation.moderation import OpenAIModerationModel |
|
from extensions.ext_hosting_provider import hosting_configuration |
|
from models.provider import ProviderType |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
def check_moderation(model_config: ModelConfigWithCredentialsEntity, text: str) -> bool: |
|
moderation_config = hosting_configuration.moderation_config |
|
if ( |
|
moderation_config |
|
and moderation_config.enabled is True |
|
and "openai" in hosting_configuration.provider_map |
|
and hosting_configuration.provider_map["openai"].enabled is True |
|
): |
|
using_provider_type = model_config.provider_model_bundle.configuration.using_provider_type |
|
provider_name = model_config.provider |
|
if using_provider_type == ProviderType.SYSTEM and provider_name in moderation_config.providers: |
|
hosting_openai_config = hosting_configuration.provider_map["openai"] |
|
|
|
|
|
length = 2000 |
|
text_chunks = [text[i : i + length] for i in range(0, len(text), length)] |
|
|
|
if len(text_chunks) == 0: |
|
return True |
|
|
|
text_chunk = random.choice(text_chunks) |
|
|
|
try: |
|
model_type_instance = OpenAIModerationModel() |
|
moderation_result = model_type_instance.invoke( |
|
model="text-moderation-stable", credentials=hosting_openai_config.credentials, text=text_chunk |
|
) |
|
|
|
if moderation_result is True: |
|
return True |
|
except Exception as ex: |
|
logger.exception(ex) |
|
raise InvokeBadRequestError("Rate limit exceeded, please try again later.") |
|
|
|
return False |
|
|