From 7e4ada5f4b9f71503166f7de165b423f200291b4 Mon Sep 17 00:00:00 2001 From: hrz <1710360675@qq.com> Date: Thu, 24 Apr 2025 15:22:28 +0800 Subject: [PATCH] =?UTF-8?q?update:=E6=A3=80=E9=AA=8CLLM=E5=AF=86=E9=92=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/providers/llm/AliBL/AliBL.py | 2 ++ .../core/providers/llm/coze/coze.py | 20 +++++++++++-------- .../core/providers/llm/dify/dify.py | 20 ++++++++++++------- .../core/providers/llm/fastgpt/fastgpt.py | 2 ++ main/xiaozhi-server/core/utils/util.py | 3 +-- 5 files changed, 30 insertions(+), 17 deletions(-) diff --git a/main/xiaozhi-server/core/providers/llm/AliBL/AliBL.py b/main/xiaozhi-server/core/providers/llm/AliBL/AliBL.py index 769f3117..16057d1d 100644 --- a/main/xiaozhi-server/core/providers/llm/AliBL/AliBL.py +++ b/main/xiaozhi-server/core/providers/llm/AliBL/AliBL.py @@ -2,6 +2,7 @@ from config.logger import setup_logging from http import HTTPStatus from dashscope import Application from core.providers.llm.base import LLMProviderBase +from core.utils.util import check_model_key TAG = __name__ logger = setup_logging() @@ -14,6 +15,7 @@ class LLMProvider(LLMProviderBase): self.base_url = config.get("base_url") self.is_No_prompt = config.get("is_no_prompt") self.memory_id = config.get("ali_memory_id") + check_model_key("AliBLLLM", self.api_key) def response(self, session_id, dialogue): try: diff --git a/main/xiaozhi-server/core/providers/llm/coze/coze.py b/main/xiaozhi-server/core/providers/llm/coze/coze.py index 416d4ce3..60a04667 100644 --- a/main/xiaozhi-server/core/providers/llm/coze/coze.py +++ b/main/xiaozhi-server/core/providers/llm/coze/coze.py @@ -1,14 +1,17 @@ from config.logger import setup_logging -import requests import json -import re from core.providers.llm.base import LLMProviderBase -import os # official coze sdk for Python [cozepy](https://github.com/coze-dev/coze-py) from cozepy import COZE_CN_BASE_URL -from cozepy import Coze, TokenAuth, Message, ChatStatus, MessageContentType, ChatEventType # noqa +from cozepy import ( + Coze, + TokenAuth, + Message, + ChatEventType, +) # noqa from core.providers.llm.system_prompt import get_system_prompt_for_function +from core.utils.util import check_model_key TAG = __name__ logger = setup_logging() @@ -20,6 +23,7 @@ class LLMProvider(LLMProviderBase): self.bot_id = str(config.get("bot_id")) self.user_id = str(config.get("user_id")) self.session_conversation_map = {} # 存储session_id和conversation_id的映射 + check_model_key("CozeLLM", self.personal_access_token) def response(self, session_id, dialogue): coze_api_token = self.personal_access_token @@ -48,22 +52,22 @@ class LLMProvider(LLMProviderBase): print(event.message.content, end="", flush=True) yield event.message.content - def response_with_functions(self, session_id, dialogue, functions=None): + def response_with_functions(self, session_id, dialogue, functions=None): if len(dialogue) == 2 and functions is not None and len(functions) > 0: # 第一次调用llm, 取最后一条用户消息,附加tool提示词 last_msg = dialogue[-1]["content"] function_str = json.dumps(functions, ensure_ascii=False) modify_msg = get_system_prompt_for_function(function_str) + last_msg - dialogue[-1]["content"] = modify_msg + dialogue[-1]["content"] = modify_msg # 如果最后一个是 role="tool",附加到user上 if len(dialogue) > 1 and dialogue[-1]["role"] == "tool": assistant_msg = "\ntool call result: " + dialogue[-1]["content"] + "\n\n" - while len(dialogue) > 1 : + while len(dialogue) > 1: if dialogue[-1]["role"] == "user": dialogue[-1]["content"] = assistant_msg + dialogue[-1]["content"] break dialogue.pop() - + for token in self.response(session_id, dialogue): yield token, None diff --git a/main/xiaozhi-server/core/providers/llm/dify/dify.py b/main/xiaozhi-server/core/providers/llm/dify/dify.py index 09f0739e..52ca9853 100644 --- a/main/xiaozhi-server/core/providers/llm/dify/dify.py +++ b/main/xiaozhi-server/core/providers/llm/dify/dify.py @@ -3,6 +3,7 @@ from config.logger import setup_logging import requests from core.providers.llm.base import LLMProviderBase from core.providers.llm.system_prompt import get_system_prompt_for_function +from core.utils.util import check_model_key TAG = __name__ logger = setup_logging() @@ -14,6 +15,7 @@ class LLMProvider(LLMProviderBase): self.mode = config.get("mode", "chat-messages") self.base_url = config.get("base_url", "https://api.dify.ai/v1").rstrip("/") self.session_conversation_map = {} # 存储session_id和conversation_id的映射 + check_model_key("DifyLLM", self.api_key) def response(self, session_id, dialogue): try: @@ -60,7 +62,9 @@ class LLMProvider(LLMProviderBase): conversation_id # 更新映射 ) # 过滤 message_replace 事件,此事件会全量推一次 - if event.get("event") != "message_replace" and event.get("answer"): + if event.get("event") != "message_replace" and event.get( + "answer" + ): yield event["answer"] elif self.mode == "workflows/run": for line in r.iter_lines(): @@ -76,29 +80,31 @@ class LLMProvider(LLMProviderBase): if line.startswith(b"data: "): event = json.loads(line[6:]) # 过滤 message_replace 事件,此事件会全量推一次 - if event.get("event") != "message_replace" and event.get("answer"): + if event.get("event") != "message_replace" and event.get( + "answer" + ): yield event["answer"] except Exception as e: logger.bind(tag=TAG).error(f"Error in response generation: {e}") yield "【服务响应异常】" - def response_with_functions(self, session_id, dialogue, functions=None): + def response_with_functions(self, session_id, dialogue, functions=None): if len(dialogue) == 2 and functions is not None and len(functions) > 0: # 第一次调用llm, 取最后一条用户消息,附加tool提示词 last_msg = dialogue[-1]["content"] function_str = json.dumps(functions, ensure_ascii=False) modify_msg = get_system_prompt_for_function(function_str) + last_msg - dialogue[-1]["content"] = modify_msg + dialogue[-1]["content"] = modify_msg # 如果最后一个是 role="tool",附加到user上 if len(dialogue) > 1 and dialogue[-1]["role"] == "tool": assistant_msg = "\ntool call result: " + dialogue[-1]["content"] + "\n\n" - while len(dialogue) > 1 : + while len(dialogue) > 1: if dialogue[-1]["role"] == "user": dialogue[-1]["content"] = assistant_msg + dialogue[-1]["content"] break dialogue.pop() - + for token in self.response(session_id, dialogue): - yield token, None \ No newline at end of file + yield token, None diff --git a/main/xiaozhi-server/core/providers/llm/fastgpt/fastgpt.py b/main/xiaozhi-server/core/providers/llm/fastgpt/fastgpt.py index e0e6ccc7..10daaa8a 100644 --- a/main/xiaozhi-server/core/providers/llm/fastgpt/fastgpt.py +++ b/main/xiaozhi-server/core/providers/llm/fastgpt/fastgpt.py @@ -2,6 +2,7 @@ import json from config.logger import setup_logging import requests from core.providers.llm.base import LLMProviderBase +from core.utils.util import check_model_key TAG = __name__ logger = setup_logging() @@ -13,6 +14,7 @@ class LLMProvider(LLMProviderBase): self.base_url = config.get("base_url") self.detail = config.get("detail", False) self.variables = config.get("variables", {}) + check_model_key("LLM", self.api_key) def response(self, session_id, dialogue): try: diff --git a/main/xiaozhi-server/core/utils/util.py b/main/xiaozhi-server/core/utils/util.py index e9e6795a..2fc37e85 100644 --- a/main/xiaozhi-server/core/utils/util.py +++ b/main/xiaozhi-server/core/utils/util.py @@ -159,7 +159,6 @@ def check_model_key(modelType, modelKey): raise ValueError( "你还没配置" + modelType + "的密钥,请检查一下所使用的LLM是否配置了密钥" ) - return False return True @@ -211,7 +210,7 @@ def check_ffmpeg_installed(): def extract_json_from_string(input_string): """提取字符串中的 JSON 部分""" pattern = r"(\{.*\})" - match = re.search(pattern, input_string, re.DOTALL) #添加 re.DOTALL + match = re.search(pattern, input_string, re.DOTALL) # 添加 re.DOTALL if match: return match.group(1) # 返回提取的 JSON 字符串 return None