Spaces:
Paused
Paused
| 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 | |