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"] # 2000 text per chunk 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