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