|
@@ -1,6 +1,7 @@
|
|
|
import math
|
|
|
from typing import Optional
|
|
|
|
|
|
+from flask import current_app
|
|
|
from langchain import WikipediaAPIWrapper
|
|
|
from langchain.callbacks.manager import Callbacks
|
|
|
from langchain.memory.chat_memory import BaseChatMemory
|
|
@@ -12,7 +13,7 @@ from core.callback_handler.agent_loop_gather_callback_handler import AgentLoopGa
|
|
|
from core.callback_handler.dataset_tool_callback_handler import DatasetToolCallbackHandler
|
|
|
from core.callback_handler.main_chain_gather_callback_handler import MainChainGatherCallbackHandler
|
|
|
from core.callback_handler.std_out_callback_handler import DifyStdOutCallbackHandler
|
|
|
-from core.chain.sensitive_word_avoidance_chain import SensitiveWordAvoidanceChain
|
|
|
+from core.chain.sensitive_word_avoidance_chain import SensitiveWordAvoidanceChain, SensitiveWordAvoidanceRule
|
|
|
from core.conversation_message_task import ConversationMessageTask
|
|
|
from core.model_providers.error import ProviderTokenNotInitError
|
|
|
from core.model_providers.model_factory import ModelFactory
|
|
@@ -26,6 +27,7 @@ from core.tool.web_reader_tool import WebReaderTool
|
|
|
from extensions.ext_database import db
|
|
|
from models.dataset import Dataset, DatasetProcessRule
|
|
|
from models.model import AppModelConfig
|
|
|
+from models.provider import ProviderType
|
|
|
|
|
|
|
|
|
class OrchestratorRuleParser:
|
|
@@ -63,7 +65,7 @@ class OrchestratorRuleParser:
|
|
|
|
|
|
# add agent callback to record agent thoughts
|
|
|
agent_callback = AgentLoopGatherCallbackHandler(
|
|
|
- model_instant=agent_model_instance,
|
|
|
+ model_instance=agent_model_instance,
|
|
|
conversation_message_task=conversation_message_task
|
|
|
)
|
|
|
|
|
@@ -123,23 +125,45 @@ class OrchestratorRuleParser:
|
|
|
|
|
|
return chain
|
|
|
|
|
|
- def to_sensitive_word_avoidance_chain(self, callbacks: Callbacks = None, **kwargs) \
|
|
|
+ def to_sensitive_word_avoidance_chain(self, model_instance: BaseLLM, callbacks: Callbacks = None, **kwargs) \
|
|
|
-> Optional[SensitiveWordAvoidanceChain]:
|
|
|
"""
|
|
|
Convert app sensitive word avoidance config to chain
|
|
|
|
|
|
+ :param model_instance: model instance
|
|
|
+ :param callbacks: callbacks for the chain
|
|
|
:param kwargs:
|
|
|
:return:
|
|
|
"""
|
|
|
- if not self.app_model_config.sensitive_word_avoidance_dict:
|
|
|
- return None
|
|
|
-
|
|
|
- sensitive_word_avoidance_config = self.app_model_config.sensitive_word_avoidance_dict
|
|
|
- sensitive_words = sensitive_word_avoidance_config.get("words", "")
|
|
|
- if sensitive_word_avoidance_config.get("enabled", False) and sensitive_words:
|
|
|
+ sensitive_word_avoidance_rule = None
|
|
|
+
|
|
|
+ if self.app_model_config.sensitive_word_avoidance_dict:
|
|
|
+ sensitive_word_avoidance_config = self.app_model_config.sensitive_word_avoidance_dict
|
|
|
+ if sensitive_word_avoidance_config.get("enabled", False):
|
|
|
+ if sensitive_word_avoidance_config.get('type') == 'moderation':
|
|
|
+ sensitive_word_avoidance_rule = SensitiveWordAvoidanceRule(
|
|
|
+ type=SensitiveWordAvoidanceRule.Type.MODERATION,
|
|
|
+ canned_response=sensitive_word_avoidance_config.get("canned_response")
|
|
|
+ if sensitive_word_avoidance_config.get("canned_response")
|
|
|
+ else 'Your content violates our usage policy. Please revise and try again.',
|
|
|
+ )
|
|
|
+ else:
|
|
|
+ sensitive_words = sensitive_word_avoidance_config.get("words", "")
|
|
|
+ if sensitive_words:
|
|
|
+ sensitive_word_avoidance_rule = SensitiveWordAvoidanceRule(
|
|
|
+ type=SensitiveWordAvoidanceRule.Type.KEYWORDS,
|
|
|
+ canned_response=sensitive_word_avoidance_config.get("canned_response")
|
|
|
+ if sensitive_word_avoidance_config.get("canned_response")
|
|
|
+ else 'Your content violates our usage policy. Please revise and try again.',
|
|
|
+ extra_params={
|
|
|
+ 'sensitive_words': sensitive_words.split(','),
|
|
|
+ }
|
|
|
+ )
|
|
|
+
|
|
|
+ if sensitive_word_avoidance_rule:
|
|
|
return SensitiveWordAvoidanceChain(
|
|
|
- sensitive_words=sensitive_words.split(","),
|
|
|
- canned_response=sensitive_word_avoidance_config.get("canned_response", ''),
|
|
|
+ model_instance=model_instance,
|
|
|
+ sensitive_word_avoidance_rule=sensitive_word_avoidance_rule,
|
|
|
output_key="sensitive_word_avoidance_output",
|
|
|
callbacks=callbacks,
|
|
|
**kwargs
|