openai_moderation.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. from core.model_manager import ModelManager
  2. from core.model_runtime.entities.model_entities import ModelType
  3. from core.moderation.base import Moderation, ModerationAction, ModerationInputsResult, ModerationOutputsResult
  4. class OpenAIModeration(Moderation):
  5. name: str = "openai_moderation"
  6. @classmethod
  7. def validate_config(cls, tenant_id: str, config: dict) -> None:
  8. """
  9. Validate the incoming form config data.
  10. :param tenant_id: the id of workspace
  11. :param config: the form config data
  12. :return:
  13. """
  14. cls._validate_inputs_and_outputs_config(config, True)
  15. def moderation_for_inputs(self, inputs: dict, query: str = "") -> ModerationInputsResult:
  16. flagged = False
  17. preset_response = ""
  18. if self.config is None:
  19. raise ValueError("The config is not set.")
  20. if self.config["inputs_config"]["enabled"]:
  21. preset_response = self.config["inputs_config"]["preset_response"]
  22. if query:
  23. inputs["query__"] = query
  24. flagged = self._is_violated(inputs)
  25. return ModerationInputsResult(
  26. flagged=flagged, action=ModerationAction.DIRECT_OUTPUT, preset_response=preset_response
  27. )
  28. def moderation_for_outputs(self, text: str) -> ModerationOutputsResult:
  29. flagged = False
  30. preset_response = ""
  31. if self.config is None:
  32. raise ValueError("The config is not set.")
  33. if self.config["outputs_config"]["enabled"]:
  34. flagged = self._is_violated({"text": text})
  35. preset_response = self.config["outputs_config"]["preset_response"]
  36. return ModerationOutputsResult(
  37. flagged=flagged, action=ModerationAction.DIRECT_OUTPUT, preset_response=preset_response
  38. )
  39. def _is_violated(self, inputs: dict):
  40. text = "\n".join(str(inputs.values()))
  41. model_manager = ModelManager()
  42. model_instance = model_manager.get_model_instance(
  43. tenant_id=self.tenant_id, provider="openai", model_type=ModelType.MODERATION, model="text-moderation-stable"
  44. )
  45. openai_moderation = model_instance.invoke_moderation(text=text)
  46. return openai_moderation