diff --git a/server/routers/chat_router.py b/server/routers/chat_router.py index 7c66ba81..17b9a72b 100644 --- a/server/routers/chat_router.py +++ b/server/routers/chat_router.py @@ -169,7 +169,6 @@ async def chat_agent( async for msg, metadata in agent.stream_messages(messages, input_context=input_context): # logger.debug(f"msg: {msg.model_dump()}, metadata: {metadata}") if isinstance(msg, AIMessageChunk): - accumulated_content += msg.content if conf.enable_content_guard and content_guard.check(accumulated_content): logger.warning(f"Sensitive content detected in stream: {accumulated_content}") diff --git a/src/config/app.py b/src/config/app.py index 72a05079..f20c6b28 100644 --- a/src/config/app.py +++ b/src/config/app.py @@ -52,9 +52,7 @@ class Config(SimpleConfig): self.add_item("enable_content_guard", default=False, des="是否启用内容审查") self.add_item("enable_content_guard_llm", default=False, des="是否启用LLM内容审查") self.add_item( - "content_guard_llm_model", - default="siliconflow/Qwen/Qwen3-235B-A22B-Instruct-2507", - des="内容审查LLM模型" + "content_guard_llm_model", default="siliconflow/Qwen/Qwen3-235B-A22B-Instruct-2507", des="内容审查LLM模型" ) self.add_item( "enable_web_search", diff --git a/src/models/chat_model.py b/src/models/chat_model.py index b2392788..22db391d 100644 --- a/src/models/chat_model.py +++ b/src/models/chat_model.py @@ -2,7 +2,7 @@ import os import traceback from openai import OpenAI -from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type, before_sleep_log, after_log +from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type, before_sleep_log from src import config from src.utils import get_docker_safe_url, logger @@ -21,7 +21,7 @@ class OpenAIBase: wait=wait_exponential(multiplier=1, min=1, max=10), retry=retry_if_exception_type((Exception,)), before_sleep=before_sleep_log(logger, log_level="WARNING"), - reraise=True + reraise=True, ) def call(self, message, stream=False): if isinstance(message, str): @@ -33,7 +33,7 @@ class OpenAIBase: if stream: response = self._stream_response(messages) else: - response = self._get_response(messages) + response = self._get_response(messages) except Exception as e: err = ( @@ -55,7 +55,6 @@ class OpenAIBase: if len(chunk.choices) > 0: yield chunk.choices[0].delta - def _get_response(self, messages): response = self.client.chat.completions.create( model=self.model_name, diff --git a/src/plugins/guard.py b/src/plugins/guard.py index b57dc0dd..071ecf57 100644 --- a/src/plugins/guard.py +++ b/src/plugins/guard.py @@ -27,6 +27,7 @@ PROMPT_TEMPLATE = """ 输入内容:{content} 输出内容:""" + def load_keywords(file_path: str) -> list[str]: """Loads keywords from a file, one per line.""" if not os.path.exists(file_path): @@ -51,7 +52,6 @@ class ContentGuard: else: self.llm_model = None - def check(self, text: str) -> bool: """ Checks if the text contains any sensitive keywords. @@ -88,5 +88,6 @@ class ContentGuard: logger.debug(f"LLM response: {response.content}") return True if "不合规" in response.content else False + # Global instance content_guard = ContentGuard()