From 10c3f907209c5c0ff6d7faf18d2434f16f6064d5 Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Sun, 2 Mar 2025 15:04:23 +0800 Subject: [PATCH 01/18] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1310d4879..00afd83e8 100644 --- a/README.md +++ b/README.md @@ -75,8 +75,9 @@ NAPCAT_UID=$(id -u) NAPCAT_GID=$(id -g) docker compose restart - 在Napcat的网络设置中添加ws反向代理:ws://localhost:8080/onebot/v11/ws 4. **配置文件设置** - - 将.env文件打开,填上你的apikey(硅基流动或deepseekapi) - - 将bot_config.toml文件打开,并填写相关内容,不然无法正常运行 + - 修改.env的 变量值为 prod + - 将.env.prod文件打开,填上你的apikey(硅基流动或deepseekapi) + - 将bot_config_toml改名为bot_config.toml,打开并填写相关内容,不然无法正常运行 #### .env 文件配置说明 ```ini From b98314da4fca0181a53049c406fb409a72a3d893 Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Sun, 2 Mar 2025 18:36:36 +0800 Subject: [PATCH 02/18] =?UTF-8?q?v0.3.3=20=E5=BC=82=E6=AD=A5=E5=A4=84?= =?UTF-8?q?=E7=90=86=E8=AE=B0=E5=BF=86=EF=BC=8C=E4=BF=AE=E5=A4=8D=E4=BA=86?= =?UTF-8?q?GUI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gui/reasoning_gui.py | 34 ++++++++++++-- src/plugins/chat/__init__.py | 2 +- src/plugins/chat/config.py | 1 + src/plugins/chat/prompt_builder.py | 11 +++-- src/plugins/memory_system/llm_module.py | 42 +++++++++--------- .../memory_system/llm_module_memory_make.py | 40 +++++++++-------- src/plugins/memory_system/memory.py | 44 +++++++++---------- src/plugins/schedule/schedule_llm_module.py | 26 ++++++----- 8 files changed, 116 insertions(+), 84 deletions(-) diff --git a/src/gui/reasoning_gui.py b/src/gui/reasoning_gui.py index f12b59798..61fb34560 100644 --- a/src/gui/reasoning_gui.py +++ b/src/gui/reasoning_gui.py @@ -7,6 +7,23 @@ import threading import queue import sys import os +from dotenv import load_dotenv + +# 获取当前文件的目录 +current_dir = os.path.dirname(os.path.abspath(__file__)) +# 获取项目根目录 +root_dir = os.path.abspath(os.path.join(current_dir, '..', '..')) + +# 加载环境变量 +if os.path.exists(os.path.join(root_dir, '.env.dev')): + load_dotenv(os.path.join(root_dir, '.env.dev')) + print("成功加载开发环境配置") +elif os.path.exists(os.path.join(root_dir, '.env.prod')): + load_dotenv(os.path.join(root_dir, '.env.prod')) + print("成功加载生产环境配置") +else: + print("未找到环境配置文件") + sys.exit(1) from pymongo import MongoClient from typing import Optional @@ -14,14 +31,23 @@ from typing import Optional class Database: _instance: Optional["Database"] = None - def __init__(self, host: str, port: int, db_name: str): - self.client = MongoClient(host, port) + def __init__(self, host: str, port: int, db_name: str, username: str = None, password: str = None, auth_source: str = None): + if username and password: + self.client = MongoClient( + host=host, + port=port, + username=username, + password=password, + authSource=auth_source or 'admin' + ) + else: + self.client = MongoClient(host, port) self.db = self.client[db_name] @classmethod - def initialize(cls, host: str, port: int, db_name: str) -> "Database": + def initialize(cls, host: str, port: int, db_name: str, username: str = None, password: str = None, auth_source: str = None) -> "Database": if cls._instance is None: - cls._instance = cls(host, port, db_name) + cls._instance = cls(host, port, db_name, username, password, auth_source) return cls._instance @classmethod diff --git a/src/plugins/chat/__init__.py b/src/plugins/chat/__init__.py index 0f81d30d6..3fdcec922 100644 --- a/src/plugins/chat/__init__.py +++ b/src/plugins/chat/__init__.py @@ -90,7 +90,7 @@ async def monitor_relationships(): async def build_memory_task(): """每30秒执行一次记忆构建""" print("\033[1;32m[记忆构建]\033[0m 开始构建记忆...") - hippocampus.build_memory(chat_size=12) + await hippocampus.build_memory(chat_size=30) print("\033[1;32m[记忆构建]\033[0m 记忆构建完成") diff --git a/src/plugins/chat/config.py b/src/plugins/chat/config.py index 0232219f8..dc7c14203 100644 --- a/src/plugins/chat/config.py +++ b/src/plugins/chat/config.py @@ -136,3 +136,4 @@ llm_config.DEEP_SEEK_BASE_URL = config.deep_seek_base_url if not global_config.enable_advance_output: # logger.remove() pass + diff --git a/src/plugins/chat/prompt_builder.py b/src/plugins/chat/prompt_builder.py index ba0e9b4cc..01fe3e82d 100644 --- a/src/plugins/chat/prompt_builder.py +++ b/src/plugins/chat/prompt_builder.py @@ -72,12 +72,15 @@ class PromptBuilder: # print(f"\033[1;32m[前额叶]\033[0m 合并所有需要的记忆2: {list(overlapping_second_layer)}") # 使用集合去重 - all_memories = list(set(all_first_layer_items) | set(overlapping_second_layer)) + # 从每个来源随机选择2条记忆(如果有的话) + selected_first_layer = random.sample(all_first_layer_items, min(2, len(all_first_layer_items))) if all_first_layer_items else [] + selected_second_layer = random.sample(list(overlapping_second_layer), min(2, len(overlapping_second_layer))) if overlapping_second_layer else [] + + # 合并并去重 + all_memories = list(set(selected_first_layer + selected_second_layer)) if all_memories: print(f"\033[1;32m[前额叶]\033[0m 合并所有需要的记忆: {all_memories}") - - if all_memories: # 只在列表非空时选择随机项 - random_item = choice(all_memories) + random_item = " ".join(all_memories) memory_prompt = f"看到这些聊天,你想起来{random_item}\n" else: memory_prompt = "" # 如果没有记忆,则返回空字符串 diff --git a/src/plugins/memory_system/llm_module.py b/src/plugins/memory_system/llm_module.py index bd7f60dc3..34e4e4af1 100644 --- a/src/plugins/memory_system/llm_module.py +++ b/src/plugins/memory_system/llm_module.py @@ -3,6 +3,8 @@ import requests from typing import Tuple, Union import time from nonebot import get_driver +import aiohttp +import asyncio driver = get_driver() config = driver.config @@ -15,7 +17,7 @@ class LLMModel: self.api_key = config.siliconflow_key self.base_url = config.siliconflow_base_url - def generate_response(self, prompt: str) -> Tuple[str, str]: + async def generate_response(self, prompt: str) -> Tuple[str, str]: """根据输入的提示生成模型的响应""" headers = { "Authorization": f"Bearer {self.api_key}", @@ -34,32 +36,32 @@ class LLMModel: api_url = f"{self.base_url.rstrip('/')}/chat/completions" max_retries = 3 - base_wait_time = 15 # 基础等待时间(秒) + base_wait_time = 15 for retry in range(max_retries): try: - response = requests.post(api_url, headers=headers, json=data) + async with aiohttp.ClientSession() as session: + async with session.post(api_url, headers=headers, json=data) as response: + if response.status == 429: + wait_time = base_wait_time * (2 ** retry) # 指数退避 + print(f"遇到请求限制(429),等待{wait_time}秒后重试...") + await asyncio.sleep(wait_time) + continue + + response.raise_for_status() # 检查其他响应状态 + + result = await response.json() + if "choices" in result and len(result["choices"]) > 0: + content = result["choices"][0]["message"]["content"] + reasoning_content = result["choices"][0]["message"].get("reasoning_content", "") + return content, reasoning_content + return "没有返回结果", "" - if response.status_code == 429: - wait_time = base_wait_time * (2 ** retry) # 指数退避 - print(f"遇到请求限制(429),等待{wait_time}秒后重试...") - time.sleep(wait_time) - continue - - response.raise_for_status() # 检查其他响应状态 - - result = response.json() - if "choices" in result and len(result["choices"]) > 0: - content = result["choices"][0]["message"]["content"] - reasoning_content = result["choices"][0]["message"].get("reasoning_content", "") - return content, reasoning_content - return "没有返回结果", "" - - except requests.exceptions.RequestException as e: + except Exception as e: if retry < max_retries - 1: # 如果还有重试机会 wait_time = base_wait_time * (2 ** retry) print(f"请求失败,等待{wait_time}秒后重试... 错误: {str(e)}") - time.sleep(wait_time) + await asyncio.sleep(wait_time) else: return f"请求失败: {str(e)}", "" diff --git a/src/plugins/memory_system/llm_module_memory_make.py b/src/plugins/memory_system/llm_module_memory_make.py index 04ab6dbc6..5b01a2917 100644 --- a/src/plugins/memory_system/llm_module_memory_make.py +++ b/src/plugins/memory_system/llm_module_memory_make.py @@ -4,6 +4,8 @@ from typing import Tuple, Union import time from ..chat.config import BotConfig from nonebot import get_driver +import aiohttp +import asyncio driver = get_driver() config = driver.config @@ -21,7 +23,7 @@ class LLMModel: print(f"API URL: {self.base_url}") # 打印 base_url 用于调试 - def generate_response(self, prompt: str) -> Tuple[str, str]: + async def generate_response(self, prompt: str) -> Tuple[str, str]: """根据输入的提示生成模型的响应""" headers = { "Authorization": f"Bearer {self.api_key}", @@ -44,28 +46,28 @@ class LLMModel: for retry in range(max_retries): try: - response = requests.post(api_url, headers=headers, json=data) + async with aiohttp.ClientSession() as session: + async with session.post(api_url, headers=headers, json=data) as response: + if response.status == 429: + wait_time = base_wait_time * (2 ** retry) # 指数退避 + print(f"遇到请求限制(429),等待{wait_time}秒后重试...") + await asyncio.sleep(wait_time) + continue + + response.raise_for_status() # 检查其他响应状态 + + result = await response.json() + if "choices" in result and len(result["choices"]) > 0: + content = result["choices"][0]["message"]["content"] + reasoning_content = result["choices"][0]["message"].get("reasoning_content", "") + return content, reasoning_content + return "没有返回结果", "" - if response.status_code == 429: - wait_time = base_wait_time * (2 ** retry) # 指数退避 - print(f"遇到请求限制(429),等待{wait_time}秒后重试...") - time.sleep(wait_time) - continue - - response.raise_for_status() # 检查其他响应状态 - - result = response.json() - if "choices" in result and len(result["choices"]) > 0: - content = result["choices"][0]["message"]["content"] - reasoning_content = result["choices"][0]["message"].get("reasoning_content", "") - return content, reasoning_content - return "没有返回结果", "" - - except requests.exceptions.RequestException as e: + except Exception as e: if retry < max_retries - 1: # 如果还有重试机会 wait_time = base_wait_time * (2 ** retry) print(f"请求失败,等待{wait_time}秒后重试... 错误: {str(e)}") - time.sleep(wait_time) + await asyncio.sleep(wait_time) else: return f"请求失败: {str(e)}", "" diff --git a/src/plugins/memory_system/memory.py b/src/plugins/memory_system/memory.py index f2b162afb..cab41f903 100644 --- a/src/plugins/memory_system/memory.py +++ b/src/plugins/memory_system/memory.py @@ -193,7 +193,25 @@ class Hippocampus: chat_text.append(chat_) return chat_text - def build_memory(self,chat_size=12): + async def memory_compress(self, input_text, rate=1): + information_content = calculate_information_content(input_text) + print(f"文本的信息量(熵): {information_content:.4f} bits") + topic_num = max(1, min(5, int(information_content * rate / 4))) + topic_prompt = find_topic(input_text, topic_num) + topic_response = await self.llm_model.generate_response(topic_prompt) + # 检查 topic_response 是否为元组 + if isinstance(topic_response, tuple): + topics = topic_response[0].split(",") # 假设第一个元素是我们需要的字符串 + else: + topics = topic_response.split(",") + compressed_memory = set() + for topic in topics: + topic_what_prompt = topic_what(input_text,topic) + topic_what_response = await self.llm_model_small.generate_response(topic_what_prompt) + compressed_memory.add((topic.strip(), topic_what_response[0])) # 将话题和记忆作为元组存储 + return compressed_memory + + async def build_memory(self,chat_size=12): #最近消息获取频率 time_frequency = {'near':1,'mid':2,'far':2} memory_sample = self.get_memory_sample(chat_size,time_frequency) @@ -208,9 +226,7 @@ class Hippocampus: if input_text: # 生成压缩后记忆 first_memory = set() - first_memory = self.memory_compress(input_text, 2.5) - # 延时防止访问超频 - # time.sleep(5) + first_memory = await self.memory_compress(input_text, 2.5) #将记忆加入到图谱中 for topic, memory in first_memory: topics = segment_text(topic) @@ -224,26 +240,6 @@ class Hippocampus: else: print(f"空消息 跳过") self.memory_graph.save_graph_to_db() - - def memory_compress(self, input_text, rate=1): - information_content = calculate_information_content(input_text) - print(f"文本的信息量(熵): {information_content:.4f} bits") - topic_num = max(1, min(5, int(information_content * rate / 4))) - # print(topic_num) - topic_prompt = find_topic(input_text, topic_num) - topic_response = self.llm_model.generate_response(topic_prompt) - # 检查 topic_response 是否为元组 - if isinstance(topic_response, tuple): - topics = topic_response[0].split(",") # 假设第一个元素是我们需要的字符串 - else: - topics = topic_response.split(",") - # print(topics) - compressed_memory = set() - for topic in topics: - topic_what_prompt = topic_what(input_text,topic) - topic_what_response = self.llm_model_small.generate_response(topic_what_prompt) - compressed_memory.add((topic.strip(), topic_what_response[0])) # 将话题和记忆作为元组存储 - return compressed_memory def segment_text(text): diff --git a/src/plugins/schedule/schedule_llm_module.py b/src/plugins/schedule/schedule_llm_module.py index 408e7d546..cf88a8653 100644 --- a/src/plugins/schedule/schedule_llm_module.py +++ b/src/plugins/schedule/schedule_llm_module.py @@ -1,5 +1,6 @@ import os import requests +import aiohttp from typing import Tuple, Union from nonebot import get_driver @@ -22,7 +23,7 @@ class LLMModel: self.model_name = model_name self.params = kwargs - def generate_response(self, prompt: str) -> Tuple[str, str]: + async def generate_response(self, prompt: str) -> Tuple[str, str]: """根据输入的提示生成模型的响应""" headers = { "Authorization": f"Bearer {self.api_key}", @@ -41,17 +42,18 @@ class LLMModel: api_url = f"{self.base_url.rstrip('/')}/chat/completions" try: - response = requests.post(api_url, headers=headers, json=data) - response.raise_for_status() # 检查响应状态 - - result = response.json() - if "choices" in result and len(result["choices"]) > 0: - content = result["choices"][0]["message"]["content"] - reasoning_content = result["choices"][0]["message"].get("reasoning_content", "") - return content, reasoning_content # 返回内容和推理内容 - return "没有返回结果", "" # 返回两个值 - - except requests.exceptions.RequestException as e: + async with aiohttp.ClientSession() as session: + async with session.post(api_url, headers=headers, json=data) as response: + response.raise_for_status() # 检查响应状态 + + result = await response.json() + if "choices" in result and len(result["choices"]) > 0: + content = result["choices"][0]["message"]["content"] + reasoning_content = result["choices"][0]["message"].get("reasoning_content", "") + return content, reasoning_content # 返回内容和推理内容 + return "没有返回结果", "" # 返回两个值 + + except Exception as e: return f"请求失败: {str(e)}", "" # 返回错误信息和空字符串 # 示例用法 From a7e6bc14dc9a71ad7eaea0eaae9b950f5d2919cd Mon Sep 17 00:00:00 2001 From: NepPure Date: Sun, 2 Mar 2025 19:17:05 +0800 Subject: [PATCH 03/18] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E4=BD=8D=E7=BD=AE=E5=B9=B6=E6=8C=82=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 3 +-- docker-compose.yml | 7 ++++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 111466ff3..6a7aa09c0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,8 +2,7 @@ FROM nonebot/nb-cli:latest WORKDIR / COPY . /MaiMBot/ WORKDIR /MaiMBot -RUN mv config/env.example config/.env \ -&& mv config/bot_config_toml config/bot_config.toml +RUN mv config/bot_config_toml config/bot_config.toml RUN pip install --upgrade -r requirements.txt VOLUME [ "/MaiMBot/config" ] EXPOSE 8080 diff --git a/docker-compose.yml b/docker-compose.yml index 4c136b284..cfe787c04 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -27,7 +27,7 @@ services: - mongodb:/data/db - mongodbCONFIG:/data/configdb image: mongo:latest - + maimbot: container_name: maimbot environment: @@ -41,8 +41,8 @@ services: volumes: - maimbotCONFIG:/MaiMBot/config - maimbotDATA:/MaiMBot/data + - ./.env.prod:/MaiMBot/.env.prod image: sengokucola/maimbot:latest - volumes: maimbotCONFIG: @@ -51,4 +51,5 @@ volumes: napcatCONFIG: mongodb: mongodbCONFIG: - + + From 352a10d4ee53663b339cfdd607cb60b80f36e0d0 Mon Sep 17 00:00:00 2001 From: NepPure Date: Sun, 2 Mar 2025 19:27:53 +0800 Subject: [PATCH 04/18] add colorama --- requirements.txt | Bin 520 -> 540 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/requirements.txt b/requirements.txt index 3f0fe05ddd8064040ea79e51e0a7998bbc477374..11536d12ac13cd06045bcb620cb223d5e19ba7ec 100644 GIT binary patch delta 28 gcmeBRnZvSygGq#!fr}xTA)g@!h>I8!8FGOb08&^5U;qFB delta 7 OcmbQk(!sKUg9!i$Jptzc From c1f2b6a0eb942b0ae1f659dd4fb352e8fbae04f6 Mon Sep 17 00:00:00 2001 From: NepPure Date: Sun, 2 Mar 2025 19:36:04 +0800 Subject: [PATCH 05/18] =?UTF-8?q?#=20=E6=82=A8=E4=B8=8D=E5=BA=94=E8=AF=A5?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=BB=98=E8=AE=A4=E5=80=BC=EF=BC=8C=E8=BF=99?= =?UTF-8?q?=E4=B8=AA=E6=96=87=E4=BB=B6=E8=A2=AB=E4=BB=93=E5=BA=93=E7=B4=A2?= =?UTF-8?q?=E5=BC=95=EF=BC=8C=E8=AF=B7=E4=BF=AE=E6=94=B9.env.prod?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 25 +++++++++++++++++++++++++ .gitignore | 3 +-- 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 .env diff --git a/.env b/.env new file mode 100644 index 000000000..2c8e76c18 --- /dev/null +++ b/.env @@ -0,0 +1,25 @@ +# 您不应该修改默认值,这个文件被仓库索引,请修改.env.prod +HOST=127.0.0.1 +PORT=8080 + +COMMAND_START=["/"] + +# 插件配置 +PLUGINS=["src2.plugins.chat"] + +# 默认配置 +MONGODB_HOST=127.0.0.1 +MONGODB_PORT=27017 +DATABASE_NAME=MegBot + +MONGODB_USERNAME = "" # 默认空值 +MONGODB_PASSWORD = "" # 默认空值 +MONGODB_AUTH_SOURCE = "" # 默认空值 + +#key and url +CHAT_ANY_WHERE_KEY= +SILICONFLOW_KEY= +CHAT_ANY_WHERE_BASE_URL=https://api.chatanywhere.tech/v1 +SILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1/ +DEEP_SEEK_KEY= +DEEP_SEEK_BASE_URL=https://api.deepseek.com/v1 \ No newline at end of file diff --git a/.gitignore b/.gitignore index c19b9ce33..097126da9 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,7 @@ reasoning_content.bat reasoning_window.bat queue_update.txt memory_graph.gml -.env.dev +.env.* # Byte-compiled / optimized / DLL files @@ -147,7 +147,6 @@ celerybeat.pid *.sage.py # Environments -.env .venv env/ venv/ From 3db73fe03c6ea4874503defdcd7b7a4ed7e398ab Mon Sep 17 00:00:00 2001 From: NepPure Date: Sun, 2 Mar 2025 19:37:32 +0800 Subject: [PATCH 06/18] ENVIRONMENT=prod --- .env | 1 + 1 file changed, 1 insertion(+) diff --git a/.env b/.env index 2c8e76c18..6e242e1f5 100644 --- a/.env +++ b/.env @@ -1,4 +1,5 @@ # 您不应该修改默认值,这个文件被仓库索引,请修改.env.prod +ENVIRONMENT=prod HOST=127.0.0.1 PORT=8080 From 304562d93a7831bf1f63e4e6d096d011136db714 Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Sun, 2 Mar 2025 19:43:14 +0800 Subject: [PATCH 07/18] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E6=97=A5?= =?UTF-8?q?=E7=A8=8B=E5=BC=82=E6=AD=A5bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/schedule/schedule_llm_module.py | 23 ++++++++++----------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/plugins/schedule/schedule_llm_module.py b/src/plugins/schedule/schedule_llm_module.py index cf88a8653..1fcad52d2 100644 --- a/src/plugins/schedule/schedule_llm_module.py +++ b/src/plugins/schedule/schedule_llm_module.py @@ -23,7 +23,7 @@ class LLMModel: self.model_name = model_name self.params = kwargs - async def generate_response(self, prompt: str) -> Tuple[str, str]: + def generate_response(self, prompt: str) -> Tuple[str, str]: """根据输入的提示生成模型的响应""" headers = { "Authorization": f"Bearer {self.api_key}", @@ -42,17 +42,16 @@ class LLMModel: api_url = f"{self.base_url.rstrip('/')}/chat/completions" try: - async with aiohttp.ClientSession() as session: - async with session.post(api_url, headers=headers, json=data) as response: - response.raise_for_status() # 检查响应状态 - - result = await response.json() - if "choices" in result and len(result["choices"]) > 0: - content = result["choices"][0]["message"]["content"] - reasoning_content = result["choices"][0]["message"].get("reasoning_content", "") - return content, reasoning_content # 返回内容和推理内容 - return "没有返回结果", "" # 返回两个值 - + response = requests.post(api_url, headers=headers, json=data) + response.raise_for_status() # 检查响应状态 + + result = response.json() + if "choices" in result and len(result["choices"]) > 0: + content = result["choices"][0]["message"]["content"] + reasoning_content = result["choices"][0]["message"].get("reasoning_content", "") + return content, reasoning_content # 返回内容和推理内容 + return "没有返回结果", "" # 返回两个值 + except Exception as e: return f"请求失败: {str(e)}", "" # 返回错误信息和空字符串 From f48f33a999904c5fe2ce6ec0aec07ee5af4b6821 Mon Sep 17 00:00:00 2001 From: HYY1116 Date: Sun, 2 Mar 2025 19:48:25 +0800 Subject: [PATCH 08/18] =?UTF-8?q?fix:=20=E6=A8=A1=E5=9E=8B=E4=BC=98?= =?UTF-8?q?=E5=85=88=E4=BD=BF=E7=94=A8=E6=97=A0=E9=9C=80=E4=BB=98=E8=B4=B9?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=EF=BC=8C=E5=B9=B6=E6=A8=A1=E5=9E=8B=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E5=85=A8=E5=B1=80=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/bot_config_toml | 45 ------------------- src/plugins/chat/config.py | 8 ++++ src/plugins/chat/llm_generator.py | 14 +++--- src/plugins/chat/topic_identifier.py | 3 +- src/plugins/memory_system/llm_module.py | 4 +- .../memory_system/llm_module_memory_make.py | 4 +- src/plugins/schedule/schedule_generator.py | 6 +-- src/plugins/schedule/schedule_llm_module.py | 9 ++-- 8 files changed, 27 insertions(+), 66 deletions(-) delete mode 100644 config/bot_config_toml diff --git a/config/bot_config_toml b/config/bot_config_toml deleted file mode 100644 index 83a3c4971..000000000 --- a/config/bot_config_toml +++ /dev/null @@ -1,45 +0,0 @@ -[bot] -qq = 123456 #填入你的机器人QQ -nickname = "麦麦" #你希望bot被称呼的名字 - -[message] -min_text_length = 2 # 与麦麦聊天时麦麦只会回答文本大于等于此数的消息 -max_context_size = 15 # 麦麦获得的上下文数量,超出数量后自动丢弃 -emoji_chance = 0.2 # 麦麦使用表情包的概率 - -[emoji] -check_interval = 120 -register_interval = 10 - -[cq_code] -enable_pic_translate = false - - -[response] -api_using = "siliconflow" # 选择大模型API,可选值为siliconflow,deepseek,建议使用siliconflow,因为识图api目前只支持siliconflow的deepseek-vl2模型 -model_r1_probability = 0.8 # 麦麦回答时选择R1模型的概率 -model_v3_probability = 0.1 # 麦麦回答时选择V3模型的概率 -model_r1_distill_probability = 0.1 # 麦麦回答时选择R1蒸馏模型的概率 - -[memory] -build_memory_interval = 300 # 记忆构建间隔 - - - -[others] -enable_advance_output = true # 开启后输出更多日志,false关闭true开启 - - -[groups] - -talk_allowed = [ - 123456,12345678 -] #可以回复消息的群 - -talk_frequency_down = [ - 123456,12345678 -] #降低回复频率的群 - -ban_user_id = [ - 123456,12345678 -] #禁止回复消息的QQ号 diff --git a/src/plugins/chat/config.py b/src/plugins/chat/config.py index dc7c14203..68ec6784b 100644 --- a/src/plugins/chat/config.py +++ b/src/plugins/chat/config.py @@ -33,6 +33,11 @@ class BotConfig: EMOJI_REGISTER_INTERVAL: int = 10 # 表情包注册间隔(分钟) API_USING: str = "siliconflow" # 使用的API + DEEPSEEK_MODEL_R1: str = "deepseek-reasoner" # deepseek-R1模型 + DEEPSEEK_MODEL_V3: str = "deepseek-chat" # deepseek-V3模型 + SILICONFLOW_MODEL_R1: str = "deepseek-ai/DeepSeek-R1" # siliconflow-R1模型 + SILICONFLOW_MODEL_R1_DISTILL: str = "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B" # siliconflow-R1蒸馏模型 + SILICONFLOW_MODEL_V3: str = "deepseek-ai/DeepSeek-V3" # siliconflow-V3模型 MODEL_R1_PROBABILITY: float = 0.8 # R1模型概率 MODEL_V3_PROBABILITY: float = 0.1 # V3模型概率 MODEL_R1_DISTILL_PROBABILITY: float = 0.1 # R1蒸馏模型概率 @@ -82,6 +87,9 @@ class BotConfig: config.MODEL_V3_PROBABILITY = response_config.get("model_v3_probability", config.MODEL_V3_PROBABILITY) config.MODEL_R1_DISTILL_PROBABILITY = response_config.get("model_r1_distill_probability", config.MODEL_R1_DISTILL_PROBABILITY) config.API_USING = response_config.get("api_using", config.API_USING) + if response_config.get("api_using", config.API_PAID): + config.SILICONFLOW_MODEL_R1 = "Pro/deepseek-ai/DeepSeek-R1" + config.SILICONFLOW_MODEL_V3 = "Pro/deepseek-ai/DeepSeek-V3" # 消息配置 if "message" in toml_dict: diff --git a/src/plugins/chat/llm_generator.py b/src/plugins/chat/llm_generator.py index bfff1d474..682be8a87 100644 --- a/src/plugins/chat/llm_generator.py +++ b/src/plugins/chat/llm_generator.py @@ -206,13 +206,13 @@ class LLMResponseGenerator: if global_config.API_USING == "deepseek": return await self._generate_base_response( message, - "deepseek-reasoner", + global_config.DEEPSEEK_MODEL_R1, {"temperature": 0.7, "max_tokens": 1024} ) else: return await self._generate_base_response( message, - "Pro/deepseek-ai/DeepSeek-R1", + global_config.SILICONFLOW_MODEL_R1, {"temperature": 0.7, "max_tokens": 1024} ) @@ -221,13 +221,13 @@ class LLMResponseGenerator: if global_config.API_USING == "deepseek": return await self._generate_base_response( message, - "deepseek-chat", + global_config.DEEPSEEK_MODEL_V3, {"temperature": 0.8, "max_tokens": 1024} ) else: return await self._generate_base_response( message, - "Pro/deepseek-ai/DeepSeek-V3", + global_config.SILICONFLOW_MODEL_V3, {"temperature": 0.8, "max_tokens": 1024} ) @@ -235,7 +235,7 @@ class LLMResponseGenerator: """使用 DeepSeek-R1-Distill-Qwen-32B 模型生成回复""" return await self._generate_base_response( message, - "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + global_config.SILICONFLOW_MODEL_R1_DISTILL, {"temperature": 0.7, "max_tokens": 1024} ) @@ -270,9 +270,9 @@ class LLMResponseGenerator: loop = asyncio.get_event_loop() if global_config.API_USING == "deepseek": - model = "deepseek-chat" + model = global_config.DEEPSEEK_MODEL_V3 else: - model = "Pro/deepseek-ai/DeepSeek-V3" + model = global_config.SILICONFLOW_MODEL_V3 create_completion = partial( self.client.chat.completions.create, model=model, diff --git a/src/plugins/chat/topic_identifier.py b/src/plugins/chat/topic_identifier.py index 81956ddc1..34ac4e714 100644 --- a/src/plugins/chat/topic_identifier.py +++ b/src/plugins/chat/topic_identifier.py @@ -3,6 +3,7 @@ from openai import OpenAI from .message import Message import jieba from nonebot import get_driver +from .config import global_config driver = get_driver() config = driver.config @@ -24,7 +25,7 @@ class TopicIdentifier: 消息内容:{text}""" response = self.client.chat.completions.create( - model="Pro/deepseek-ai/DeepSeek-V3", + model=global_config.SILICONFLOW_MODEL_V3, messages=[{"role": "user", "content": prompt}], temperature=0.8, max_tokens=10 diff --git a/src/plugins/memory_system/llm_module.py b/src/plugins/memory_system/llm_module.py index 34e4e4af1..c2b6cf042 100644 --- a/src/plugins/memory_system/llm_module.py +++ b/src/plugins/memory_system/llm_module.py @@ -5,13 +5,13 @@ import time from nonebot import get_driver import aiohttp import asyncio - +from src.plugins.chat.config import global_config driver = get_driver() config = driver.config class LLMModel: # def __init__(self, model_name="deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", **kwargs): - def __init__(self, model_name="Pro/deepseek-ai/DeepSeek-V3", **kwargs): + def __init__(self, model_name=global_config.SILICONFLOW_MODEL_V3, **kwargs): self.model_name = model_name self.params = kwargs self.api_key = config.siliconflow_key diff --git a/src/plugins/memory_system/llm_module_memory_make.py b/src/plugins/memory_system/llm_module_memory_make.py index 5b01a2917..f59354570 100644 --- a/src/plugins/memory_system/llm_module_memory_make.py +++ b/src/plugins/memory_system/llm_module_memory_make.py @@ -2,17 +2,17 @@ import os import requests from typing import Tuple, Union import time -from ..chat.config import BotConfig from nonebot import get_driver import aiohttp import asyncio +from src.plugins.chat.config import BotConfig, global_config driver = get_driver() config = driver.config class LLMModel: # def __init__(self, model_name="deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", **kwargs): - def __init__(self, model_name="Pro/deepseek-ai/DeepSeek-V3", **kwargs): + def __init__(self, model_name=global_config.SILICONFLOW_MODEL_V3, **kwargs): self.model_name = model_name self.params = kwargs self.api_key = config.siliconflow_key diff --git a/src/plugins/schedule/schedule_generator.py b/src/plugins/schedule/schedule_generator.py index a33c4b279..63e3235a3 100644 --- a/src/plugins/schedule/schedule_generator.py +++ b/src/plugins/schedule/schedule_generator.py @@ -3,7 +3,7 @@ import os from typing import List, Dict from .schedule_llm_module import LLMModel from ...common.database import Database # 使用正确的导入语法 -from ..chat.config import global_config +from src.plugins.chat.config import global_config from nonebot import get_driver driver = get_driver() @@ -22,9 +22,9 @@ Database.initialize( class ScheduleGenerator: def __init__(self): if global_config.API_USING == "siliconflow": - self.llm_scheduler = LLMModel(model_name="Pro/deepseek-ai/DeepSeek-V3") + self.llm_scheduler = LLMModel(model_name=global_config.SILICONFLOW_MODEL_V3) elif global_config.API_USING == "deepseek": - self.llm_scheduler = LLMModel(model_name="deepseek-chat",api_using="deepseek") + self.llm_scheduler = LLMModel(model_name=global_config.DEEPSEEK_MODEL_V3) self.db = Database.get_instance() today = datetime.datetime.now() diff --git a/src/plugins/schedule/schedule_llm_module.py b/src/plugins/schedule/schedule_llm_module.py index cf88a8653..34dad6fec 100644 --- a/src/plugins/schedule/schedule_llm_module.py +++ b/src/plugins/schedule/schedule_llm_module.py @@ -3,20 +3,17 @@ import requests import aiohttp from typing import Tuple, Union from nonebot import get_driver - +from src.plugins.chat.config import global_config driver = get_driver() config = driver.config class LLMModel: # def __init__(self, model_name="deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", **kwargs): - def __init__(self, model_name="Pro/deepseek-ai/DeepSeek-R1",api_using=None, **kwargs): + def __init__(self, model_name=global_config.SILICONFLOW_MODEL_R1,api_using=None, **kwargs): if api_using == "deepseek": self.api_key = config.deep_seek_key self.base_url = config.deep_seek_base_url - if model_name != "Pro/deepseek-ai/DeepSeek-R1": - self.model_name = model_name - else: - self.model_name = "deepseek-reasoner" + self.model_name = global_config.DEEPSEEK_MODEL_R1 else: self.api_key = config.siliconflow_key self.base_url = config.siliconflow_base_url From 0bcd18c821e5fc351d73b39c17fbab92d2123774 Mon Sep 17 00:00:00 2001 From: HYY1116 Date: Sun, 2 Mar 2025 19:51:14 +0800 Subject: [PATCH 09/18] =?UTF-8?q?=E6=BC=8F=E6=94=B9=E4=B8=80=E5=B0=8F?= =?UTF-8?q?=E5=A4=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/chat/config.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/chat/config.py b/src/plugins/chat/config.py index 68ec6784b..54d125408 100644 --- a/src/plugins/chat/config.py +++ b/src/plugins/chat/config.py @@ -33,6 +33,7 @@ class BotConfig: EMOJI_REGISTER_INTERVAL: int = 10 # 表情包注册间隔(分钟) API_USING: str = "siliconflow" # 使用的API + API_PAID: bool = False # 是否使用付费API DEEPSEEK_MODEL_R1: str = "deepseek-reasoner" # deepseek-R1模型 DEEPSEEK_MODEL_V3: str = "deepseek-chat" # deepseek-V3模型 SILICONFLOW_MODEL_R1: str = "deepseek-ai/DeepSeek-R1" # siliconflow-R1模型 From 6e2d229cb74d98f21d3f3a91356173776c2353e8 Mon Sep 17 00:00:00 2001 From: HYY1116 Date: Sun, 2 Mar 2025 19:59:00 +0800 Subject: [PATCH 10/18] =?UTF-8?q?=E5=9B=9E=E6=9D=A5=E5=90=A7=EF=BC=8C?= =?UTF-8?q?=E6=88=91=E7=9A=84config?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - config/bot_config.toml | 46 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 config/bot_config.toml diff --git a/.gitignore b/.gitignore index 097126da9..94b4bb855 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ mongodb/ NapCat.Framework.Windows.Once/ log/ src/plugins/memory -config/bot_config.toml /test message_queue_content.txt message_queue_content.bat diff --git a/config/bot_config.toml b/config/bot_config.toml new file mode 100644 index 000000000..d668fcf59 --- /dev/null +++ b/config/bot_config.toml @@ -0,0 +1,46 @@ +[bot] +qq = 123456 #填入你的机器人QQ +nickname = "麦麦" #你希望bot被称呼的名字 + +[message] +min_text_length = 2 # 与麦麦聊天时麦麦只会回答文本大于等于此数的消息 +max_context_size = 15 # 麦麦获得的上下文数量,超出数量后自动丢弃 +emoji_chance = 0.2 # 麦麦使用表情包的概率 + +[emoji] +check_interval = 120 +register_interval = 10 + +[cq_code] +enable_pic_translate = false + + +[response] +api_using = "siliconflow" # 选择大模型API,可选值为siliconflow,deepseek,建议使用siliconflow,因为识图api目前只支持siliconflow的deepseek-vl2模型 +api_paid = false #是否使用付费api,目前此选项只影响siliconflow,其deepseek模型的api分为可用赠送余额和不可以用的,此选项为false时使用赠送余额 +model_r1_probability = 0.8 # 麦麦回答时选择R1模型的概率 +model_v3_probability = 0.1 # 麦麦回答时选择V3模型的概率 +model_r1_distill_probability = 0.1 # 麦麦回答时选择R1蒸馏模型的概率 + +[memory] +build_memory_interval = 300 # 记忆构建间隔 + + + +[others] +enable_advance_output = true # 开启后输出更多日志,false关闭true开启 + + +[groups] + +talk_allowed = [ + 123456,12345678 +] #可以回复消息的群 + +talk_frequency_down = [ + 123456,12345678 +] #降低回复频率的群 + +ban_user_id = [ + 123456,12345678 +] #禁止回复消息的QQ号 From 5e9401c27aa1a026fbe5041c1bb7d74d4d88e0b3 Mon Sep 17 00:00:00 2001 From: HYY <95246895+HYY1116@users.noreply.github.com> Date: Sun, 2 Mar 2025 20:00:21 +0800 Subject: [PATCH 11/18] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 94b4bb855..8df5d72a8 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ NapCat.Framework.Windows.Once/ log/ src/plugins/memory /test +config/bot_config.toml message_queue_content.txt message_queue_content.bat message_queue_window.bat From f04ae091e285d28e23e926fb5aaffecd79835e84 Mon Sep 17 00:00:00 2001 From: NepPure Date: Sun, 2 Mar 2025 20:34:40 +0800 Subject: [PATCH 12/18] =?UTF-8?q?=E4=B8=8D=E5=86=8D=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8Dconfig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6a7aa09c0..225a90a1b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,8 +2,7 @@ FROM nonebot/nb-cli:latest WORKDIR / COPY . /MaiMBot/ WORKDIR /MaiMBot -RUN mv config/bot_config_toml config/bot_config.toml RUN pip install --upgrade -r requirements.txt VOLUME [ "/MaiMBot/config" ] EXPOSE 8080 -ENTRYPOINT [ "nb","run" ] \ No newline at end of file +ENTRYPOINT [ "nb","run" ] From 12e759f3ad5a3c4d9b782aa01b55ec73aa88ad80 Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Sun, 2 Mar 2025 20:56:38 +0800 Subject: [PATCH 13/18] =?UTF-8?q?=E5=B1=8E=E5=B1=B1=E4=BF=AE=E8=A1=A5?= =?UTF-8?q?=E6=9C=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改了bot_toml加载逻辑 --- .gitignore | 2 +- config/bot_config.toml | 11 ++--- src/plugins/chat/config.py | 72 +++++++++++++++++++++++++----- src/plugins/chat/cq_code.py | 2 +- src/plugins/chat/prompt_builder.py | 4 +- 5 files changed, 72 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 8df5d72a8..a9cdc192f 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,7 @@ reasoning_window.bat queue_update.txt memory_graph.gml .env.* - +config/bot_config_dev.toml # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/config/bot_config.toml b/config/bot_config.toml index d668fcf59..4863da245 100644 --- a/config/bot_config.toml +++ b/config/bot_config.toml @@ -1,5 +1,5 @@ [bot] -qq = 123456 #填入你的机器人QQ +qq = 123 #填入你的机器人QQ nickname = "麦麦" #你希望bot被称呼的名字 [message] @@ -17,7 +17,7 @@ enable_pic_translate = false [response] api_using = "siliconflow" # 选择大模型API,可选值为siliconflow,deepseek,建议使用siliconflow,因为识图api目前只支持siliconflow的deepseek-vl2模型 -api_paid = false #是否使用付费api,目前此选项只影响siliconflow,其deepseek模型的api分为可用赠送余额和不可以用的,此选项为false时使用赠送余额 +api_paid = true #是否使用付费api,目前此选项只影响siliconflow,其deepseek模型的api分为可用赠送余额和不可以用的,此选项为false时使用赠送余额 model_r1_probability = 0.8 # 麦麦回答时选择R1模型的概率 model_v3_probability = 0.1 # 麦麦回答时选择V3模型的概率 model_r1_distill_probability = 0.1 # 麦麦回答时选择R1蒸馏模型的概率 @@ -34,13 +34,14 @@ enable_advance_output = true # 开启后输出更多日志,false关闭true开启 [groups] talk_allowed = [ - 123456,12345678 + 123, + 123, ] #可以回复消息的群 talk_frequency_down = [ - 123456,12345678 + ] #降低回复频率的群 ban_user_id = [ - 123456,12345678 + ] #禁止回复消息的QQ号 diff --git a/src/plugins/chat/config.py b/src/plugins/chat/config.py index 54d125408..b85cbc2e6 100644 --- a/src/plugins/chat/config.py +++ b/src/plugins/chat/config.py @@ -47,20 +47,59 @@ class BotConfig: enable_kuuki_read: bool = True # 是否启用读空气功能 @staticmethod - def get_default_config_path() -> str: - """获取默认配置文件路径""" + def get_config_dir() -> str: + """获取配置文件目录""" current_dir = os.path.dirname(os.path.abspath(__file__)) root_dir = os.path.abspath(os.path.join(current_dir, '..', '..', '..')) config_dir = os.path.join(root_dir, 'config') - return os.path.join(config_dir, 'bot_config.toml') + if not os.path.exists(config_dir): + os.makedirs(config_dir) + return config_dir + + @staticmethod + def create_default_config(config_path: str) -> None: + """创建默认配置文件""" + default_config = """[bot] +qq = 1 # 填入你的机器人QQ +nickname = "麦麦" # 你希望bot被称呼的名字 + +[message] +min_text_length = 2 # 与麦麦聊天时麦麦只会回答文本大于等于此数的消息 +max_context_size = 15 # 麦麦获得的上下文数量,超出数量后自动丢弃 +emoji_chance = 0.2 # 麦麦使用表情包的概率 + +[emoji] +check_interval = 120 +register_interval = 10 + +[cq_code] +enable_pic_translate = false + +[response] +api_using = "siliconflow" # 选择大模型API,可选值为siliconflow,deepseek +api_paid = false # 是否使用付费api +model_r1_probability = 0.8 # 麦麦回答时选择R1模型的概率 +model_v3_probability = 0.1 # 麦麦回答时选择V3模型的概率 +model_r1_distill_probability = 0.1 # 麦麦回答时选择R1蒸馏模型的概率 + +[memory] +build_memory_interval = 300 # 记忆构建间隔 + +[others] +enable_advance_output = false # 开启后输出更多日志 + +[groups] +talk_allowed = [] # 可以回复消息的群 +talk_frequency_down = [] # 降低回复频率的群 +ban_user_id = [] # 禁止回复消息的QQ号 +""" + with open(config_path, "w", encoding="utf-8") as f: + f.write(default_config) + logger.success(f"已创建默认配置文件: {config_path}") @classmethod def load_config(cls, config_path: str = None) -> "BotConfig": """从TOML配置文件加载配置""" - if config_path is None: - config_path = cls.get_default_config_path() - logger.info(f"使用默认配置文件路径: {config_path}") - config = cls() if os.path.exists(config_path): with open(config_path, "rb") as f: @@ -119,12 +158,25 @@ class BotConfig: return config # 获取配置文件路径 -bot_config_path = BotConfig.get_default_config_path() -config_dir = os.path.dirname(bot_config_path) -logger.info(f"尝试从 {bot_config_path} 加载机器人配置") +bot_config_floder_path = BotConfig.get_config_dir() +print(f"正在品鉴配置文件目录: {bot_config_floder_path}") +bot_config_path = os.path.join(bot_config_floder_path, "bot_config_dev.toml") +if not os.path.exists(bot_config_path): + # 如果开发环境配置文件不存在,则使用默认配置文件 + bot_config_path = os.path.join(bot_config_floder_path, "bot_config.toml") + logger.info("使用默认配置文件") +else: + logger.info("已找到开发环境配置文件") + global_config = BotConfig.load_config(config_path=bot_config_path) + +# config_dir = os.path.dirname(bot_config_path) + +# logger.info(f"尝试从 {bot_config_path} 加载机器人配置") +# global_config = BotConfig.load_config(config_path=bot_config_path) + @dataclass class LLMConfig: """机器人配置类""" diff --git a/src/plugins/chat/cq_code.py b/src/plugins/chat/cq_code.py index ae5d8a257..386124c92 100644 --- a/src/plugins/chat/cq_code.py +++ b/src/plugins/chat/cq_code.py @@ -349,7 +349,7 @@ class CQCode: # 创建Message对象 from .message import Message if self.reply_message == None: - print(f"\033[1;31m[错误]\033[0m 回复消息为空") + # print(f"\033[1;31m[错误]\033[0m 回复消息为空") return '[回复某人消息]' if self.reply_message.sender.user_id: diff --git a/src/plugins/chat/prompt_builder.py b/src/plugins/chat/prompt_builder.py index 01fe3e82d..272229416 100644 --- a/src/plugins/chat/prompt_builder.py +++ b/src/plugins/chat/prompt_builder.py @@ -150,9 +150,9 @@ class PromptBuilder: prompt_personality = '' personality_choice = random.random() if personality_choice < 4/6: # 第一种人格 - prompt_personality = f'''{activate_prompt}你的网名叫{global_config.BOT_NICKNAME},曾经是一个学习地质的女大学生,现在学习心理学和脑科学,你会刷贴吧,你正在浏览qq群,{promt_info_prompt}, + prompt_personality = f'''{activate_prompt}你的网名叫{global_config.BOT_NICKNAME},现在学习心理学和脑科学,你会刷贴吧,你正在浏览qq群,{promt_info_prompt}, 现在请你给出日常且口语化的回复,平淡一些,尽量简短一些。{is_bot_prompt} - 请注意把握群里的聊天内容,不要回复的太有条理,可以有个性。''' + 请注意把握群里的聊天内容,不要刻意突出自身学科背景,不要回复的太有条理,可以有个性。''' elif personality_choice < 1: # 第二种人格 prompt_personality = f'''{activate_prompt}你的网名叫{global_config.BOT_NICKNAME},是一个女大学生,你有黑色头发,你会刷小红书, 你正在浏览qq群,{promt_info_prompt}, From 927ae4484f86cdda55f23e2ef08c94df03cab463 Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Sun, 2 Mar 2025 20:59:50 +0800 Subject: [PATCH 14/18] Update .gitignore --- .gitignore | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.gitignore b/.gitignore index a9cdc192f..48c0c13c3 100644 --- a/.gitignore +++ b/.gitignore @@ -2,16 +2,11 @@ data/ mongodb/ NapCat.Framework.Windows.Once/ log/ -src/plugins/memory /test -config/bot_config.toml message_queue_content.txt message_queue_content.bat message_queue_window.bat message_queue_window.txt -reasoning_content.txt -reasoning_content.bat -reasoning_window.bat queue_update.txt memory_graph.gml .env.* From 65d983f37f9c1f6eec120ee7b1ca93edb2330b24 Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Sun, 2 Mar 2025 21:03:56 +0800 Subject: [PATCH 15/18] =?UTF-8?q?=E8=B0=A2=E8=B0=A2=E5=A4=A7=E5=AE=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1 --- .env | 2 +- bot.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.env b/.env index 6e242e1f5..709d22d34 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ # 您不应该修改默认值,这个文件被仓库索引,请修改.env.prod -ENVIRONMENT=prod +ENVIRONMENT=dev HOST=127.0.0.1 PORT=8080 diff --git a/bot.py b/bot.py index 8741eca7f..489ab1c36 100644 --- a/bot.py +++ b/bot.py @@ -29,7 +29,7 @@ env_file = f".env.{env}" if env_file == ".env.dev" and os.path.exists(env_file): logger.success("加载开发环境变量配置") load_dotenv(env_file, override=True) # override=True 允许覆盖已存在的环境变量 -elif env_file == ".env.prod" and os.path.exists(env_file): +elif os.path.exists(".env.prod"): logger.success("加载环境变量配置") load_dotenv(env_file, override=True) # override=True 允许覆盖已存在的环境变量 else: From 6462c3b3606d1bedc62fc7818a7d32c3d1e182a6 Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Sun, 2 Mar 2025 23:51:47 +0800 Subject: [PATCH 16/18] =?UTF-8?q?v0.4.0=20=E6=94=AF=E6=8C=81=E4=BB=BB?= =?UTF-8?q?=E6=84=8F=E6=9B=BF=E6=8D=A2=E7=9A=84=E6=A8=A1=E5=9E=8B=EF=BC=8C?= =?UTF-8?q?=E6=94=B9=E8=BF=9B=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 好好好好好好好好好 --- .env.prod | 8 +- bot.py | 35 +-- config/auto_format.py | 46 ++++ config/bot_config.toml | 62 +++-- docs/qq.png | Bin 195176 -> 0 bytes src/plugins/chat/__init__.py | 1 + src/plugins/chat/bot.py | 4 +- src/plugins/chat/config.py | 81 ++---- src/plugins/chat/cq_code.py | 106 ++------ src/plugins/chat/emoji_manager.py | 107 ++------ src/plugins/chat/llm_generator.py | 287 +++++--------------- src/plugins/memory_system/llm_module.py | 68 ----- src/plugins/memory_system/memory.py | 9 +- src/plugins/models/utils_model.py | 199 ++++++++++++++ src/plugins/schedule/schedule_generator.py | 29 +- src/plugins/schedule/schedule_llm_module.py | 61 ----- 16 files changed, 459 insertions(+), 644 deletions(-) create mode 100644 config/auto_format.py delete mode 100644 docs/qq.png delete mode 100644 src/plugins/memory_system/llm_module.py create mode 100644 src/plugins/models/utils_model.py delete mode 100644 src/plugins/schedule/schedule_llm_module.py diff --git a/.env.prod b/.env.prod index 3d795978c..f00cd5169 100644 --- a/.env.prod +++ b/.env.prod @@ -16,9 +16,11 @@ MONGODB_PASSWORD = "" # 默认空值 MONGODB_AUTH_SOURCE = "" # 默认空值 #key and url -CHAT_ANY_WHERE_KEY= -SILICONFLOW_KEY= + CHAT_ANY_WHERE_BASE_URL=https://api.chatanywhere.tech/v1 SILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1/ +DEEP_SEEK_BASE_URL=https://api.deepseek.com/v1 + DEEP_SEEK_KEY= -DEEP_SEEK_BASE_URL=https://api.deepseek.com/v1 \ No newline at end of file +CHAT_ANY_WHERE_KEY= +SILICONFLOW_KEY= \ No newline at end of file diff --git a/bot.py b/bot.py index 489ab1c36..cf1b82ff6 100644 --- a/bot.py +++ b/bot.py @@ -36,28 +36,18 @@ else: logger.error(f"{env}对应的环境配置文件{env_file}不存在,请修改.env文件中的ENVIRONMENT变量为 prod.") exit(1) -nonebot.init( - # 从环境变量中读取配置 - websocket_port=os.getenv("PORT", 8080), - host=os.getenv("HOST", "127.0.0.1"), - log_level="INFO", - # 添加自定义配置 - mongodb_host=os.getenv("MONGODB_HOST", "127.0.0.1"), - mongodb_port=os.getenv("MONGODB_PORT", 27017), - database_name=os.getenv("DATABASE_NAME", "MegBot"), - mongodb_username=os.getenv("MONGODB_USERNAME", ""), - mongodb_password=os.getenv("MONGODB_PASSWORD", ""), - mongodb_auth_source=os.getenv("MONGODB_AUTH_SOURCE", ""), - # API相关配置 - chat_any_where_key=os.getenv("CHAT_ANY_WHERE_KEY", ""), - siliconflow_key=os.getenv("SILICONFLOW_KEY", ""), - chat_any_where_base_url=os.getenv("CHAT_ANY_WHERE_BASE_URL", "https://api.chatanywhere.tech/v1"), - siliconflow_base_url=os.getenv("SILICONFLOW_BASE_URL", "https://api.siliconflow.cn/v1/"), - deep_seek_key=os.getenv("DEEP_SEEK_KEY", ""), - deep_seek_base_url=os.getenv("DEEP_SEEK_BASE_URL", "https://api.deepseek.com/v1"), - # 插件配置 - plugins=os.getenv("PLUGINS", ["src2.plugins.chat"]) -) +# 获取所有环境变量 +env_config = {key: os.getenv(key) for key in os.environ} + +# 设置基础配置 +base_config = { + "websocket_port": int(env_config.get("PORT", 8080)), + "host": env_config.get("HOST", "127.0.0.1"), + "log_level": "INFO", +} + +# 合并配置 +nonebot.init(**base_config, **env_config) # 注册适配器 driver = nonebot.get_driver() @@ -67,4 +57,5 @@ driver.register_adapter(Adapter) nonebot.load_plugins("src/plugins") if __name__ == "__main__": + nonebot.run() \ No newline at end of file diff --git a/config/auto_format.py b/config/auto_format.py new file mode 100644 index 000000000..9bc27da29 --- /dev/null +++ b/config/auto_format.py @@ -0,0 +1,46 @@ +import tomli +import tomli_w +import sys +from pathlib import Path +import os + +def sync_configs(): + # 读取两个配置文件 + try: + with open('bot_config_dev.toml', 'rb') as f: # tomli需要使用二进制模式读取 + dev_config = tomli.load(f) + + with open('bot_config.toml', 'rb') as f: + prod_config = tomli.load(f) + except FileNotFoundError as e: + print(f"错误:找不到配置文件 - {e}") + sys.exit(1) + except tomli.TOMLDecodeError as e: + print(f"错误:TOML格式解析失败 - {e}") + sys.exit(1) + + # 递归合并配置 + def merge_configs(source, target): + for key, value in source.items(): + if key not in target: + target[key] = value + elif isinstance(value, dict) and isinstance(target[key], dict): + merge_configs(value, target[key]) + + # 将dev配置的新属性合并到prod配置中 + merge_configs(dev_config, prod_config) + + # 保存更新后的配置 + try: + with open('bot_config.toml', 'wb') as f: # tomli_w需要使用二进制模式写入 + tomli_w.dump(prod_config, f) + print("配置文件同步完成!") + except Exception as e: + print(f"错误:保存配置文件失败 - {e}") + sys.exit(1) + +if __name__ == '__main__': + # 确保在正确的目录下运行 + script_dir = Path(__file__).parent + os.chdir(script_dir) + sync_configs() diff --git a/config/bot_config.toml b/config/bot_config.toml index 4863da245..83526945c 100644 --- a/config/bot_config.toml +++ b/config/bot_config.toml @@ -1,11 +1,11 @@ [bot] -qq = 123 #填入你的机器人QQ -nickname = "麦麦" #你希望bot被称呼的名字 +qq = 123 +nickname = "麦麦" [message] -min_text_length = 2 # 与麦麦聊天时麦麦只会回答文本大于等于此数的消息 -max_context_size = 15 # 麦麦获得的上下文数量,超出数量后自动丢弃 -emoji_chance = 0.2 # 麦麦使用表情包的概率 +min_text_length = 2 +max_context_size = 15 +emoji_chance = 0.2 [emoji] check_interval = 120 @@ -14,34 +14,48 @@ register_interval = 10 [cq_code] enable_pic_translate = false - [response] -api_using = "siliconflow" # 选择大模型API,可选值为siliconflow,deepseek,建议使用siliconflow,因为识图api目前只支持siliconflow的deepseek-vl2模型 -api_paid = true #是否使用付费api,目前此选项只影响siliconflow,其deepseek模型的api分为可用赠送余额和不可以用的,此选项为false时使用赠送余额 -model_r1_probability = 0.8 # 麦麦回答时选择R1模型的概率 -model_v3_probability = 0.1 # 麦麦回答时选择V3模型的概率 -model_r1_distill_probability = 0.1 # 麦麦回答时选择R1蒸馏模型的概率 +api_using = "siliconflow" +api_paid = true +model_r1_probability = 0.8 +model_v3_probability = 0.1 +model_r1_distill_probability = 0.1 [memory] -build_memory_interval = 300 # 记忆构建间隔 - - +build_memory_interval = 300 [others] -enable_advance_output = true # 开启后输出更多日志,false关闭true开启 - +enable_advance_output = true [groups] - talk_allowed = [ - 123, - 123, -] #可以回复消息的群 + 123, + 123, +] +talk_frequency_down = [] +ban_user_id = [] -talk_frequency_down = [ +[model.llm_reasoning] +name = "Pro/deepseek-ai/DeepSeek-R1" +base_url = "SILICONFLOW_BASE_URL" +key = "SILICONFLOW_KEY" -] #降低回复频率的群 +[model.llm_reasoning_minor] +name = "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B" +base_url = "SILICONFLOW_BASE_URL" +key = "SILICONFLOW_KEY" -ban_user_id = [ +[model.llm_normal] +name = "Pro/deepseek-ai/DeepSeek-V3" +base_url = "SILICONFLOW_BASE_URL" +key = "SILICONFLOW_KEY" -] #禁止回复消息的QQ号 +[model.llm_normal_minor] +name = "deepseek-ai/DeepSeek-V2.5" +base_url = "SILICONFLOW_BASE_URL" +key = "SILICONFLOW_KEY" + +[model.vlm] +name = "deepseek-ai/deepseek-vl2" +base_url = "SILICONFLOW_BASE_URL" +key = "SILICONFLOW_KEY" diff --git a/docs/qq.png b/docs/qq.png deleted file mode 100644 index 3c31347b658e6977f3cda32125b1b4d55f907c9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195176 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
}ceFVX5Q^=be9AO1|* zNaW$&Ayt~jq*1?pujPq;odRgeMu3TrG)Q?v?-CF??PkcCJ=V-cYVWjniGyjin7JJO zY8U|X`N?pgm(uGdFxqbzInnad-Czb&*YguBnN~Y6$_gDe_K!?M_`GIz!YtMcCCNtk z+9DTc$Bw%dSSna;R|3DIB&w1E>S85gUi}A|ezy38#FKLe8^lc-aMF^=0kJ)P2O&Dg4c!vw2>= z5PS<)<1S#W^yVeR_48f>>sEer^sDRdt80t+sUgcu6y{T{T#FOE??*iq1#kZ7p;I5V z)Dz)Y%{oI4-uJYbo!Z(bvuqF11ikLNB)-|gY=*X6#@k(nxkLpTbks<8rPJ$cr3SyK zPAKfH9sVRVfbc3L2<;SHiAm&7N7QzCSw9&xN1oHLLnQ}o{ek{0=lu>Z_m+|zPgQup z5hQ1lSn%cA9RxRi5@XERwz?&21AA4Rwgm9ZRyMCnq^i4Yqmxr6rhu^g;j0s?sKR&e zzTD1kXio*;m+b<_%*_*)6i{x%Z&a*<&@n-HS>qNL8$gKeo&+-NSIcBQslPX@Xg zMbHQ*)v8CQ_!C1Oc31%cMtqd9p^27aYP>Fh=yZZ4Q&NhJK&X zY@X*tRZCurFAxIk!11J?Mp~l<3Nt)D2g&>4?GU{eQVtSO-W0P3bcBk$!v#9{LsN~n zjDG^$^?zaw3w6A{i3YPxt8uzvq^e_I!R?oNlRX1 z{_|fJ9(gF|jp+R`&V$TFTrLL?1bnXWp$K%NZ=83W@)$O+ z&ip8mRo{b0u=1z3>4*;;CQ4SrkQ()`mt1GC+9@_j z0s5%TGhZMSkfllT9ZOFChHIlqUA%ZHIl5RM5rtV){dT*BWz|C>Rn=dzXQih`s1F4d z8+O=RXsitc_P{Jwpq|Rt<_J0DA+6NN6rke(EnyAp1iB9YGCAonqrU5^h?{Ze+-xeG z90Z81D(IZ2EaNrvM5mP@k!*rFrWKt$+@)rmp*Qm)b zx-gXcX(baE?JijqO!@^c$mm8|_3x}DY7T^-ue@v$N|!>fHMe^0zRo%Kg5iPy^UY5x zRw^g$GTw&r51*i{`2s76nXJ|yj#szXvJm|(maA&Mqo9~o5S1qcCF>v;cY(s(pyVHc ziXh;=18qwAcRTdwcbx3bQO5Pq=5?3W{46wo`y29fQ;HU0T6Wd|EPYoY^?q%SH2dr3 z_AA~m?}Gg1&${>cQ>J)BRm_u~kBJ@%`8#$R5viv!v~nnAWkl(r5{ZB#qBnhMkH4ns zdIP=iB}jb&BZNs9En0+r$?OIKKG}5of~w66ASQO`^7pfTw{nARbJT%l>3|M zVUSY-If#p+B@03d{F1Kn89b9L!X4g3a1`y*YTt`6dedHOts51@>a-Rqvpvuw*lv~t z0A!`RTEVQilhui(F(C&fW|`ITG7h5I&JKOnMypwtT?Uu9z^Fe`#+voA|08;+5R+Wm zem_v$bi^Dq0IGqK4XQ)0(_TKwKV)%iqWE6x=3u+Az|oge==o|rR84oi2uK!PG?%0| z-eelp)S1j)Q~m9!YQ5HF0-Z*yUHZNEvJ|z_C{proaemI{Udl^#tr%IkJQC6<-$z_b zt`f1z5rJCr{O86oUrlcRJ&~5lwtCfd_w!}};p7)G5M`!1_GH%u^iP1;` z0G89!gAPoO&G=PYJ=RoYn*XTc)ixL_!MKDOE6GZQ2ANgvm~u+TxP{r*eu!jkIPI^H z6RJS+a*%=uefLYeX?%U=P+h@Dt;K-o5oVpNuo=K3r2Ph23*Z4m5Ah_K?+|(F2DQM8=XF0y#i4kcrl3btCvnvzMn={kh!s&Z%5*1P}xb0>kWTe>Ls5f&QDUPIgR$(;$A_Tm%1sr6kufnm3fb~tkd)*XNlKki0hE0<)gdL371?!5`}3nd%yC znr8IF;$MNFCnc^?bnq5m{}Pspuo8k9D6SCI(vKqQ+s|)Dz)SNypCq07t`hqL9I6Sb z_4|Xdn4KEZUfp?pu$pL*XRTMzdn7EdIT%*5hILvhd%HL3o;thLFxwe+HL-k5G;NfTN#AGvKdkOP^s^G=7U|WjF=zgV3fPXipFog-ys2+|B z9U&Ab@{mUM1W1n%)|cs?E(!ua05^p#TLD|)TW|omn+)8zkm+}c$2B0N6NL&)Oc;xt zy`Hn}zP}3I(EncYu_RWq78Dl~BUi0buP%lNX|UO7&C}?UeQGae#ohl1Q<&qbgD z4r0+w)fP;i3Qd%r8K#*h5=Vh3nc>Dq0}=37vK&@xh#p&OI!8st@)`XHkKncQX*oe^ zj!0sDM2J%Kd*}8<7$9V_MxJ}CYls&k=lwQc?!|eBXHUn(uACteu($)_wd<5KG;Shw zduit@hB^*is3bv)IK;_3k<4g86*!f_c1k7AhnCCXe3H9ltI^ z%A&BP0tEq@&<)D|KT>9%^v<28V}(f|9RQkmtxtO|BA@; z&r^834y|O)a;A~wI^O`UhtBHq_UoP9>6yL}$XVB};3{LRUN-xq`SkTV#Uy-2dORhu zm09Skaq5UJ?y2T}!W0R!{xo8BIg`$Cq#VZd-YSNVzs?`se@U=%IoweL@6iQ4PKYgC zX2hyB;GFFhCl|V*B2p~{CB6Uk+D5Nh%Jf0%`cq)EZ$7LuMx2XGD%Io7|D30k`s6`iuw7cWqpUdhnyLIC%vxG@& z_p;?o1yKV+z?}jobReoYqQRs%`(M&z<W4$J;{ORNghLCpItTRL_t zPgb3A97cp^nw&Ka2O8umZQtKx{Z)pZg802xrpb6;t0n;jNoD+I*@#~)8FJG9<|4+m zHSYWXa5yDn5r*=k!yL_E!qG%M%h;E9vfv|Dg1(?5fyZ(|*3=KM+YW&pYGp4ERC2*}N&xC5Gy;rK0U>z$jOPAWTNy!ns z6dBpEs0IY3g#K}>ee5sgRO-E(JO$K}_u2V24Zm7~wrEsO^oIhsJ}MGNSTOE+GAwcR z1{^vSvj)tJIT&F@IWr*5Z;@pI=3HISk_eE4U_7QKp5NPM;G=9%16>llH6lC|ran$IhYs=YQ*le&@KFmx=yXs zODw!VQ;6zY&=nVP4;mkgDMy=MjMh(m_yf@icy>6y44-47tGq>$0&UjGkXE$aEs!E&9@G1?~oB6UzHGtZ4@XYizy3O0F%r%PII7aZeWR&-s>on!q^T5EFtGF1+E zB{xr|Za?X+y4@aRT&q5oPv;2;+r<;#rFnDYRXim*(@~*0xg2~^$0$FJnQ#w0gK6IPE$&w}A!rz*l!U|gTm`luOqvsamjr~z#PXw4|# zYc$@Eh^zv7|3m^kp5Xx&R^gId^h*+CvP3?UBSKlxZ$YN4jYNDQ?!jC$4sz~Nm~;Nu z$hqL=l%aKT(6L*0cy={+bB#twa26#A02*}Vi43-1WjrZsQ4qAWLL;jfzMcETVoBWq z+ZU!mi6@nM5=QH~?}29iW#mAbT;9Mty7GZ&6+EZz)}^LHcapca+~wv0S%cF)g&MiM3+!FCU{#_J&u+m%Nic1Lra_9I zi|hadwO~#t`LM&z3S%a_BWBD*+IFoaR&uqbf0EU*;n*H&|Ai8*lBOtlsYJef|KI{M z%uu~`!q6R>RIFK-om~+_b*JA4F7m2uBBqaOj%XJvQA3CZNv1|?S-4*t!gD=UOAj6~ z#?SPi_Kagve2BHQ%Q`}eIIGQ0X!9OdyQN&7ynsP9P!De?$CC7I>#Q84SIkcO;)?yq zDXP3&Y1G#3S$`&Z(3IRx5+0X4uM_qRiS`5h(_ZzT?ULJS=gwNG$ZGw<;q0#W1!y*B zQ!q2p;kmiR!1b$EP@d1M(Lyfyrv|7EaPdOV*g`y&mo{?AB1KwBF%hK11n~uS7TFMe zTeWxLgD%?M&H7Z2(4(q``~PMF-x4cYAWB2N8ENXO(_-#v>gTC!Tf_h8qeJEb7;>?| zRSbGeGI=?I+9U|GPDGGM7cxQO+bO^<=RrqZXaty6qhL;$sVpE&P81c#C-l<^V}Ip%gp2*acRoCQqoeDP{R0N%>X8)NlGvjaFl%C7TsLZC<-G`FRcE5&faA`I1nF zn;WD^S!s(WGdDYU@wZYia0N>31CFS|43?o*h6qm^+(mteGGmN?X}a!A0Q=UXBBl7} zMrcR4{?w=8o!r9)EOH&$g;qly6fzHR$%g+XOqc7lNf}}|`LZHFQFxvNIKe*CB`$8K z#(CfhX_Tez%3;-A%bezien%ORH^>x2&Mmg#ziz-7v~swF*QcW||I%qUCxXC$@84{P zmaw20n`NF6DO0pS1*wlirkQWI`1H)=VZ#1#;WrTMC~l(g9^c{Yv2NSd;R;36)H#3Kf38qOSP=)X=w?A_UY-wWP0HE~2Mdx$m> zSZ)`B&{JT=H;|oLKs?b%(WJ>0)N1t1b77UcrP-6LBLs+)qQVSD>iQb$r-|0Qv^B`B zkvIj)Fbxf%{qu!>e;TI9@g?y{}Dfu@R{AUoO~ zqiFiF`7J$iF>6q$)utKQ=kxiB~M|`Qtr94+FwJD75r7#EW zfxfYC%}F>O{3F99K?HB;*@t5632Qu zAhXkVny-L-9{f88jg0s+snO zynwMe1zb)?ag4gnc5j?F47&KIgHA8G-Bmf%IDMMV&hqFoN}bHI0tTM2hx{NQPhU(+ z3-m0gSnJg6{sVROlj6IdfnFuHkZo|fEpJ?&A4hJ(c6>y4hM%Iz_DfKzYWYH!lyXg- zQBe!;@0TmkO+)-ak&qNq(R)$eDD0fff%SeD?Is$|CRQK^l*YkH9q=gOt)A_47wNikkz_lc&LdAG8BWURKiJ+C}HN||K@$w+sd(WjeCpXoflD^e;rAXz>wOPmnxSi z)J*@*ac1c+xat@UXYvC&xDdt@tAKZ4LahQp^s`JG@JWlJ`=INgKFAZUjs%U2Z_Hx42F<(OS%LmNTxj>o!UoSvd5M}d{ zCF0VVjDEEjNYfdXab|w)K_$~gQ0@H|FQf(VTwNWU?iOAywGu`wc`AHf3tN>)6fO-S zQ}&{8LAsK_@RZ?s@+Bq*R|t8IJ2KzPS4<;c-~{^4)6b9$B;N}W4W@c20CLH|<0}~B zW-uXU|D~<~lh+$Y=SS0;1%2Lk(tAU0w%v~I3x?gj;qG6f#O5lCUgY2?0T~CmNdQNH zj1B`~=Lj|FYDi7v3beFAFEb`{{`v=Ued+_8?ow!TkbmBmqEr7MIXYx%*J$UIcUi6K z`*UhFo$7z}4pZfamEEF#<;!Qqj+zDOhK-$;XiaY#sIVoC(-NC#xeuK3)g_ENw0TF# z|Bt&q89A+}Bv!@9~j9kCTm&$1R_g+%QUrp@=gz^4< z$XwoAHOn2WtnH3a5~8ekIFY72U(Y~8EryzEOT zj$C}y3#$+FT8bZIkW2?r?v^+)Lm8ZFRf~mme=J6Uk9|{T90iOaLA@W3hqXkm59|W~pN}QS%vzIMr$}DL0bt)Hj)OgU(B+#j; zveGa6ZWy7=h6xr*hIgbFiVk63LoHm_2M2_SgNi8C5nLSE!r4ViBiNqb4{JI&2dGBV9+NjMZV3 zj$7aGE*p*>!xQ4bks3yqHU+=&=6m&M(;h-?o0QYesnm94wPL2W#s2tb`O^SWfG5n6 zF-Vao;NKYhW45IJ(GR2%IoCWzbYvQ))1n9twtzw*74EwMiv@2iT}#!oK4;Se@p3A$ zmZv$`r4~_mHF~`kLzom=4ba}hNYK#?X<3ldrt?2Gg=Cuu&vw=9DPC@~${1)43 zqa-PfRw`w%ES$`NoI7I?hz> zGq=KMaD`U*O(Gv%B23m;y5{8wV3|<*m@+$p@U8+dwj+xn&si zvFFsrXmF(U-$CngOu8Rts9wkv&(EMhUNv*Lh6WkJp@uM@kwkY#G0?CnI^j6bt_3k=<5HoZOyO5@4ZNx2ds2$Fzfui=m^3iZK z%Ks=2<>_JrMLN7ed}jgI382^Sn<-tlgC++};%R_Hr4%4V@OQ986QIl69#^iHGip$* zG@b^*;39+EzQF}P7Hm^J=yC$U6kaS&!6eFIUJ%bX2}oz)WQ0x)b&4}Kj=@`-1> zSKup!(>yeIe8me&-v|L?)>(Irk->WEB|__u!HxmqiFuKMxywUI+%1glL8Mlq^wwG^ z!K$ZFX;*X@H|Xfa}} z^vTS~m|@&w?)%IPsh*7Bi7IILu+*CfI2zw`th!*g*B0I9bOf3#f9`u`YKJwZr!BFl z+@xt=E!JeAk3W#A5lqnD5zmho&6Qz{^PBT5#o5@B`5%!(&93+A^l^vP4_G9<8=yCF zM~2Pa!zXMR(CE2>{=$NA407FhE_XP`%}KOL(RXh`o9>kt?dFC!YGHZr|8f726hB)0 z5DvdV2x32-rlY-fR2pJJh%A^R2vnLy1@z>aK_cU)w9AYJ#iyB2BsN%JnTen*Iyg2U z$z4_K%$ABeJcAppz3q$%QN_h18evGwN$Xbw-X5Db)ya^mQb(zot<&&8b*P$P4*l1* zEJ6)$(Q4}U68CZ@O`QV{E-wj{5Ac_&wZa^WX#nmHS3|KMpm==oOL+oNU{-6g85*=1{u7hPJ>PWNj)Z+Ew)UR%%c zA>E@W&=8oI0#y;3!7$h{9KRgRHN!Ym%;aIvHolxs(bsb}S~*I@8TxuoC2-HI-eCz% z^ee60iUI`gh>?#6(ku1hxS)BV$c26*yzy(s9`Yjim~N94LH$R^MPzXuT>80?5OB!OoJ=c*r$)w#QUu)MacF^qN#Az3H1BWl5t_+C z{r9a&yj6pBR{neH|uBW6U=sSb5jI>Xrrl>ID)fGv(T zmvjtpX6OpBokdyVcxRTi;AhP$69p=$jy{p@t>`&x!l8t^?sWW^9LKt&K8te>Z@`eH zKL|+D2`ZM0t2~_J&jseR>Xdq#3*xJTdgED71!<4|o1&l8d&(|C%#p9qf}^8 zhJE3`BfzN7W9uo=++l*Vvg25-L>mU3w5xaI*4xv=_XP~Ct#1w`DBf)ner<^V}OL5XRRwT;xt0z9+ENHQ-j82H-Bkm zvVR?7$A!#eF)}h1{|y|tC?CyO&M#LkA1x!U8ly@%ld7RgV`d62HXR4WPu4^LYVpiO z;Up@Ya7x^dP5O-=CSM0*T%FbyDrfaogoqRcaR|&XRWvi54qT%Z!*_v>LqM~SerRIa zUz}|I&hUTPG8$wDstzBn;xAQ!GJzRgqc%y&j=xDPY~Zvl(wu_sFc&x2a`CSI@{!I{ zc46R9N>zgq8hAv)&m9^)hN01v?}xJ03#yoprqsn98g07gQt-cmQ7`58uzx#Hmzw3O z1B^A9SyqNUqGMh%HLK#g#~7TYJ4>dugU}^*5T(_(2^!kefPn=KKqLJ-zy4|4bwdHN z`+ddfA?X7y7Io{{$QT z?&c@~e=EHM9%=>h{zvFhq z?l)~ASxm=a|YkGV2R>=jTclh5r z3|6ZDc~achF4o9~k!-Ibu968v&ild&oWARC{e6U~Fq?uuyQsJSM*`9B*k1G<3xmsP zyXx06?L@MogtID65csP<>Z5cld`Ft!lq)Ns&Mp*0i>tjI!$OVn&BUu|mhBF}O&}H% z5S_vJc)~%T_864k!p)n!cez8u@RjYG{Pm>eX7xFM-x}Lp8RN8kK#7uOP}!c1h~!A8-KcX%;r-mothc!^ zbT$T?Rb!#7!>nBfaPhcB$1#w5D5aC3O4QKsz3JB~ooM2Fnxa^{OrXU$ya52*|9#{(XGO%b- zp-DlX;0W5escH|+8*wsx`(_=eP)IS4#*>CE3P_mruY$Ca=FR_WHy$%|0l(u4q_mk~ zIjPcaFEAcswa9LQ5BP8td!x|5-7gKj{@uy%!&^knM8KZ4>RA^G&1q*GNkk zW;A)D-R_wDo^31abThPVf%=cDKbxZV+hA5O8L&u>AG4c--JAB>2qV{0`T+2s)NAD0 zOH46Y+1RyP=Y@DF_37s46x$2ngxVskWR19jUAmhS^tUC8vY;4TJ;@_Ns20GWx5vDRz5Mw?sA?hYd$__>C4EId=Roy`i8Jo0?Rm{;@>5QR@j<~i6V1Nf zSfOtjXJkX1DPD7{WJe<6E&3Z~bGOoD;lvHIfp3=s)$8^7a>QyKzplYI(7xQ33?h$W zPo&E?RdpDt5_|9(_f1BNn8ocS@u#S23VM_SaZEfVlAXVBjnOy>VtYS5$S-SI3VkJdVq}Ujr6@F=caq#+UR03!PN|z;J5R( zo27Mz%-~Ism~60#CZ7M#C8{_yp(@Ue*I8H5Ngt>D7yv&t8GDX*^7Ez*+;VMrtmveR1(0P4$do}heA`HEj6FG_ zir#U^l3rmuR#yl|7H-#JPF$RQv}-@Wgs{Y$9b_!(&Kfc9g)YOlvX%1cbm2!me|dwW z@5(zGa@ut}7h_5Po$I09QwBJ-NuR&yvwqrREhvv#{_O$EebrVn_3&#MdqOAz_O8!N zU8^f+D2w~|A~MZ8^3FMexND6|-wCwioMtVzJ$xRQ3dpG^20?frHv@>L7n6E3CsZ#J zK-xA5uQRj}&1{wy{_kW8BR7kG1VDi)aRe`{lHHjmdesoth>7c%mn�#svFZ1A26u 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 !?58p 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 abE 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缾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 }9-DoN&Qv2`T( z0&lD;d`R!p8a?d_c&OB-#qc-%kcGJE8ja%-j`+WEiVierV^)bU@5)eWJfXhE!huYA z!&c#&CA;#@0+7x$cbVpV0*h7nklnw(JWAL?4`?r(Q&MM+f%-T6G@hW#O0qL)7POaS z^go^T>Dz;t`az}T@zjag`lOJ@;TV4(4P7rI7KX9IXs_QB`gpm-_8VcDL!5f>>4*&7 zoUBtEDwImL-jJK{g;uxVm+)#p=v1?Ct{Q=b;qRV~L9oP)b@T*A6I%{P{~&k#A98f> z#|U3H1h23ZdU7?ZYhpDg$(Au&uz4*oJ?%{9%g zaEOZ+;d4pGQ6{vx3{7}S1hTQRChK^-&qD?6pGqfS-?MJ(gh3OuS`+uYnw8R<9k%7c%D!_LZQ1ld<<#_o-L^#~?Sfr+!mjUMNW;`j$Hqp<_`yV5(S6DhTKx%J zUr>~UqZGNDhUt1>B4z;NN+Nz=An)~5X*y^3+^klThQNCRX%c*8VV3Ux2iFbCykj4( zh+Sx{Q(Q$_`52{IO&BE}+2O9$mdq1rAxkZALh}I;3q^3$(sTlSK)bZ7?;H+keMbTf z{Lu1oc+r4v2D0~%IITsniePVsYC#9+a$ia*zpupJaJ5#rVQBGErTpVvPF@gbNptB^ z&J?iY5!N{J>q*Yr#S82D41|909D?wDK<9N51!1T}5|BAP?+dxOcdf63 zf(G6o2fKY5vDvAKZ+lD2`5(X$qtHlr<<-@a-m)|=tn#&N`d+kLLlQDFh4jz-pPvrs zzkD~Old(dXq%~IC=0krh-Tt@#k;M)aJKf_=dwP)2U%wyIUru5g##(5j57@L@LboP1 z)*2UH@?YOv<#ah^_X=?`kB{%T#-_8Wq~Fajq1{m^D1=Wr!bU9)#mEC6AJb$Ea{ubq zrnb&{$H5-3bl#n$H0tx5#(k-H1!{xP#*Ta?s1@E7z8vk3BE>gLHexIQ+l>zLVYqI*p!4&8 zvyz+yCwGEgmu=N4#-?L$M3|yOP|tCXt8CKPxg#-vB$wet>F3hdqm^ZV9kVix>CRA9@>sWX@|*K5v!*{l70t zItK!TqW0Yij&&qqjcWUtE!&~V=sR>^KZu2d>H$*S`=6H}RSL0y)Ot3pHR18Kk^_Jj z69sbMm&+*?dEmkZTDAgM){vFhcV`uy9Yx|TpexV{?=4sSYyv@0fN(5kKYkPy^yD}Y zDuI6NQ%a8N*O~B28{FX~G5Vf$lVyc|)`5qilFr|FP@*#|d}C&_e(jxg@b8!RRqpWw zVqq%G-YTI|OIh$h_|Uk3nBxjZK@56$=8L6txiT#QnF`Rfk1jtc9Ug{)n}!vgWlL#j zU|g6jl%37OE6(WTIF?G)DC!F1+rwADdTy1F&k=-KSuC_zs3sQ%Ahq1VeY0N*?LZ$r zWCQC$8tZVvx?0W&9%+J3;)T_9LHTMaAsYTBy*6930nc|Z$?4?rK)MGBIT`8NdLh@E zWY(WY&xHeJkx1;ka$I?JV;rF#uN!;RN2du*4q=%GQjMJF;7V8S6{%TffoRd~KF#Rh zB%=MpRIuShoA!cl>Rt(=4)-6MgqqAK7(r?V+`2*bf~0LfroFSC6xl^_#Lqb3=O?5S z&R}yr0^*AL`z&8hdMsZ;F&OJA7fJ{X=LE8z`0hGd3gTt&jL$VI3h6TteA*tM?-k}P z*0%lk#|d%~kg$KXfu|%w(b*$w8hSh98wbX-6~p>Xs@q&;q}5DtofRy|8yZhySKi+! z4>##Xf}rwYnl|4I7$dApcB|0u@q{hR9Tx6A-dKr6UrhcJ?Vs2x=&_<1vc)hASF|@M z>102U_GL3 zV1=ax7}P8^O`lHLoJO?`_1}7G1Z>8Fg|4t;b^r{%C47lB^6N7!%n=Bk6jCyHx{E7{ zYs}MPb#)wgY}+OR0FeM_Z|IH}YMgqG3Bm%`33y0?&gqNiWVx!@65Yw7im>aZ?-v|5 z9y{fS&iDM>Nq#@~V&cMKYFpc#1`mHF`UF0@=N*{i`A~{NdTWM#kj(buRlF#bXi8J& z-5eJB7NiAO-4yRHEoiTaZcLF8q4++f4r1%(%PS}A7kt%FKBHeT$$5U z6q|K+Dt!5BX0`hS@JTf{XVG>PF8=jIQ|3Z9PXM?oi%L*z5C%)tg21dE$u+W^M(1y8 zAO9=@MSgR&j^~8?&gJ&~TY6H)bnq6jNDq1dk?*qe99GVF(=)ht=0npaESG^vJWgWs z3Z1nP2NO0TLY%G_0>$eXkp~c%f+CJi_F`t@Q5B;_^r%Vy#%JTRY~(Th1jon zvY#>tTfLW7deEQZ;q%au37UpB@bF(L#o3PxH-7&|N(~~Cfn@%7W zemeB5D|)}`4}5C~Pr6YUn{5oG_}2&AKW`^*F@|V}6humc5NFNp6Vn?iY~;tNMxnnr zqAa4Db&6_}pPXIZdKYmS+di!fBAsJ;>C{H$*L}{pj<05UauBaP6agl$lt3umQ>hF} zdr*5b{p7fxxGB#99=lY4>w0AsVpVt&nQvu1!4Tb#w8Ck1=1B!Lw!R^9U5FlmuLCM5 ztzMdK?-Kh#Zpn`v6F`jx9A+HohpeWuwUDk)X}N#~Y#{?Lk4|MvS2^Qe^riMzGw>aTgQso^$6%6D$v9&7=H>D&RqB2Y7at?=m?Aw`KJSPp{|S$=Ap## zoaGOfsM~)lr01)h!T&nT%7z0_w;A=Z4BBq0z!Ad<#h#YMNv&0&stDCkLJw7xP}Hyn z{m^c}Q7}5jtm@V%8*}6Dwd|}>uiZAS$LVK(dt* z1W>!Rhjpm(87VLogUcbcBL#FKuZq=pz6c4oMdbvgej4?6ChMc#q)Kbx%Re{=}s zmL0TaliyAdg$@Nh0S&mD+8T3caSjc?B3v0gB!o5r_lat0?4ojTOa;$vXY()vJi>)spjaXtn}| zTM71fO|5K=)oR-;A39Tmg&fz^dX6pVH}XV{c;V*YC~?5gHJ3Bez_kyC4HA*~3xMPv z;_Kojjq8u4a_4jNkGb%ZL&~a-Qj$5;EM$Y2D>gPWk`Q+6zFl$zWo zj#Fj0$Nk?}FgMO$h^omkH8K{!F+sX195y|{Iyuo~FfC(5%2x*k9CHef7qH=tv z^@_pQYi_!`bL7Z8HKOOH6U*7Thj^ak3A2{c18EeBbr2Bd-fxif zpEXEcvHg2x7`Ye}t^^P$ScZWz23WFY%*f`!hOWj>h>eaN&Suu}WaK@q!y?&&Eyx>K zq)~ChYq|OsBz|>n9=JB4=)TPT=o^oD>Y0LK=eYZY;U(M~%Jm%j#i?}`mfPsJtw_|s zE5^V|^V(p9)DGGFncPx3QG_U*^4iDasJH zA`(`$sfw814v&3`1@axEnAQ17p+yI@maRkbRoj)X45%`jmiDQ|$L%iCHh@5-mVSeH zd|;V>RoJ1wx5VFuy#l-lvPljmTCCwyL3b@bI%`eZ4@-R)p_LgN-yhsK zRe;q$3F`3S;E|9s5f(+39pm>SpT||BZ-f}7Ss4#l)4hcINW%Gx{L zA&fov?)6t&TsCty^GEUf`C^vA z6beaw*hxe1%~TTq!g$WLNci*mdX~4 z$bK$avjPijB^t2G7YR;y2q^8i(LZ_pfmgPdwJ8Ta%m|c}!x7}jT5JR_e|3Q3-3Bwa znv)=f{CqkB^JgFU?CdzJ05U5t{D5Bi>gD=$mbMPb-~14fJBiJK=bc?A2_NBFbr@R8 znXwC{@Sb0dv>-IOpHTxjb2i0yYYF(!>>=ki+5Js;?R_?0N;YI3&|{*q)nLf`NaE6LPpA>sXcBz6YE z&6e-8_2?9BvVd^tSF-dD4iq85<2g_Mq)-Y$e}dbhEdEkdyHHs&0G_H6p1gh+J5%m3Om=8N$Y*H%kEKnaS3>vB3TXt|A{&OA zZO&x#rTv-h>NdnhaSI9+Fo?$b%2RaBPs~>JU@)fIvCPEF^Q}7IKrMIHi8)6w&3*8^ z(=*Z_?_@7+teS#>7u_9aMOe9n|0r@+ZJTG09GrXrUqnom3$I>M>@;=!71=okvu>Op z`2thHe>Dk|)b++654!$Q^Qk&)%$Ny*eg$q=PxjcfU?nC-6Hm+maW ziZ7qr#$;@{(2L5I2S^>kx0XR+u`lNDPM(*--*kV`5&F>Y1ayElu!@3D-1Fnl*orzfFSXX#%bj-w2+7Hy@0 zSPTV5+)WqL9=Nf5!ITUQ?YIi>8r}Ap(z##|eEVUwc7piMLD2qh^ceU;Jyw<@t{8omp+es&hDwg7JOzF&f9ohGgRa6m-OdH}hy#78~??ot*!iaia^| z@2R}XR71Hf0}aKe9)w;_tnC(p5_EJlG&CBs-usi~@L=E`qYWQCqVp5Xw`P~Dk-XAG zFp>VO4M$`m+Hj1s#c~57r9Ex_R#}Eh;|1Vj1+8e%?37GT;>NDm=FHn0^OJphm!Z!= zTlVZj<060^(Fk79+3&--k{-3JpqlJ;cax-8FL9}dHt(Uh4=EEB3IYP{nvkA!I^>P4_q zEMHw0)i3;O%uubDGU6Rojf`?h+QdOOpdhI(HM1wY4xV6!;i~EQf)HtxDHJ;bPq)EE z_wsj3hB3b#l0d4O2#Wf09R~gAZAn9?o2$QWmWm?vy2#*W{tmK-P|dvDNErSkUwIY+ zO&L{`*a`M?@p@@*db&#%0*Oev-uYk|KymY(JzFc?H#seLz&l~P`=TvLUc!OvwwzM7 z^fzCa@mrUhZ1IMm;KdxNoW_|3X=y2&aynbuqBqT2<-L=>f~jJU{Vd3I^+zJY-|HxY zFJB?LiRB;&0b+jK3 zoWns_aS;rvO_vM_>NlC0VX3lII-b>hDf4A6qW3kyd;>KGh@yJtuQG*$|By^~D^jWx z=_`kE)FXNvsw7mIH?4J>=A)4(*tG-W9|Bd-bvJ=savNSK$5LcstwviejbNl+O%8Wa zAv2UUy4A{5EZ1Q)p7Qe0R7FEw{;&wMbeeIa{N>Nagl#`#IwP{T%#GKv!1#6b zuGd!^E|*0U*YA6iHa5VWpi2zIF$BeiYxSKdP|ucF_TDU|gg?3Vfm5penLw`Sx-jHo zgE2A+Qk6KpUM^zOVG!ZgEj9X_l}hhpC`M7GFxEiiONUWU914!FE5*@;USs$YhmlYB z1!1#OCts?&U`7CoGsv4D-}BT4a&4*BH>zmGEvI`l8L4;n;BXXpHOlERIITx~6x zF!$rr)U>cF-+vPLxg0m%>SpD6^o@nn+7KYoClJmTk`ly-=hjmNbQamHM`#v0X_=mh zuoH5?!_wRV(J0*4D};R!a&j=NczD<;4&jbvMNXP*&?~l4V!Vq%2ndOE23YSYKXK$r z7NB*9ST)o@tKj8;fYmBt!;~9f-ZMf_?7d?JAJv5`l(f$1v#RzVx%EP4gCO<>4^S0hPB zxn0XIHXm(l^Tb<yzH5J7I@()!X9Mw@M&=>L(H5HoBAlZ{gI$yJE2#$S#sDZ*| z=aAG^r`=6=>RMm=A)d0koHN|97yARfeEtpH;0yRo2yeCvPIc4As=lQ^!xw;401!Jw z8GbB&<{#f&Rfj6Sgd2pvJY<9=@vR^1q_XQ+ERuez$+64l?&v*oYOSPNG}I7Dhu4if zSdyB0R6WW zDeIn#y?`Y)F|_ouBdE@VpB;U8;Wnu*AZ8v3*3NHOFkj>|S!}koP=c_G6WRB`%8O;l zh50x}Lxlp4p*m+;Lk&Ki`tF~O9q6dr!g9RVAC;z_MEi+Z-#{rkpKk_P=haz8$b=$y zL(&-jHT?|g)d^wRKpMYkk)`SnkCPzH|NiJnRP|~g5kY!M;UGw zoQ|{P9?c8!l4XRa4*Ep2zFzwF!VsiJP>YJq|3vxJo|Jg}v~9ZfZ~16j(Mo}loqc0A z?R_7|rb@p8D}ZCEujQN8&2lDvr!Ua8orq==bR(RF$%yY%4Tf@11KAGA}XijMSa24eClq#zi?-u!w3;6&SSt2D`M& zNyWPY*s)YiT?daY$v~T1a`>ZALG%<9o)RD)sQhIr1M%x>dmb2EDP-Z5-BeruLa#_7 zAbA&&gu84BzTDzg)?b)WcmEsinuZxs#=WU|!K+V+K*UY8E{KW%3skG~fi9h7v zc;Nh34qR6FX9G>#;Yrq4yne{sbN)s+^2pS-vL>fHe!ccVa*o*$9N%7*I8Zvp06wW$ z^zeuOji@4i+;dN9i&JmCVjzF zC@HH7?IVZ0p;N^>5oBLIuC&7{t!qgn_RqJpJ97`Ry zmV-2e4tV~E3N4s0Pj9wT!pNl_n=Lh^*`q6`&)=c99v((iyTHh10Qz3J&0f>D_o%SZ zq#Uw4OAkDGu7u4{hgA3X*TSjh%ZC~j{%HKpoQV>=!@^_tcgoLfyaY(U;t?)fS3&Cy=mR@M+=)=^flngkt%r3=Ge+J6?kdhk;I)VO^z)IXDahS0YH7ul+-~1Mz zw5RKW#fc)E2Q5iF*nRB>IuOHJjM3+R*0tp>0hdIj<|30oi!8{)lE|fmGZE1IWQaV1 zavw55lIsk%p0ED3>U_gO`1A8~y4<;C(LQE-NQFt5?yub5@Khr-x~vi!Zi&c<_)K9RnQbYoa1-s*Uvm7>uckRtFQ1EO#Oy=hYzOZUVq2P| zQ!k$?2kc@YzkdD{&n~)|kk6IrP%D%u3}F9tJ1S#@DqlbkYhcp^7yTKRm+bd7+tEdy zY=C#t?4|PPHDJ`0`H#o^Zl4|W`V&$LD(m6>9h#`$O5v-h#^C~6Z17ucr0*YVFF_w4 zOGyT~oHBxcGd*4yJ3++`%80Jc^M!a=N?X>CZAGo88t%bRD0`Ql&{^vM7Oed~UjYhP z*Sn(O;CZ>_w@#nQ;oeG>IBO^J46gpqvRrDK7Jyp`b&BqSx00VbJ2@$bjIXIU+Vqj3 z=5)wfS3X=pC#vV-Zm&@QYUtERqrTR^oX6l`t+g&QJ zxR5nw`S15|GXyB|)adw7sUdxN_@Zkzht(T#heRjA_8%S^kkbmqO!#*>m)iXhjT$PJ zrS0#vj9j|kl13tfLot@NiR%?31R9grd0}FuoKgZO0*NfMQfW#^A@T^en*F@#&p3Kw z8o8(&MEc=9`I^4IBp}Xz0tY%u^@5xujTbuoYdJB9>OrKa)I^llAQ3@vTAq_^{ldBE zeX?19+LExhyr1)Q7|)Z}Xe`XVw?Qu|0I2wSRV0<4Z zq@vtmI7ay0dybNl9&hXFR2tPnSzfDcj6aiIkzhU}>#mC2tB%(7bZBc1O;8_9QSXMC zPqIpQIfO=HqY}%d=S>K=iu*+<;ZC{>A$epenpAwm3~@Q_JjG zoiAlb)U*_hL`Q~STM%x>5J7oyQ&0Gnjdbjh6`6(!su=3dtj~uBhb{&b{odu8-(AhQ z!O5BbNsShz4GN0*Lk%yf@qR9-`{(_Binz073wHSi4=WT-CQn-YSO%5c=CmvJG=WQj zsD~zuO%^X#F2re3O?P8K0N`s&q7j`3c(YTGQ8 zc<6WI3{W32E?;R+OG6+=Z1&81f;6a9apO3VXAMC|ht6tqo*wV@>X?KN$D(d_R38J+ z098W}Pb9ibxnxuDn<86#SfC_6b%t9}3Ntyla;%n{B=9w7fn zlR#oBCYQgXH@{PuNyVdQQkbRe}m+pH@@WFd;J?} z2|XFt1Y2>%8cYtSx5qlf6#5f%4h1*J)aM3InV0(Rmdp>t-@NgxOenStVTZ_SeKz3F z%cXMNp~w|=9K1FTmuAzXUV=sXap4wCzh1sY%EJ}!E$7W=`KFkICkgYVPAc~IkG319 zi{~)Sv$zdGbN}}qb@ay`@wL<1y@BBKMR?Kfk%vt*FQ>1=iY0xzq&g3~Hzb`tETkOH zngQib_ZpV)C>Jc>i;`XSY+OR6Xwr9`x?6d>ecTW>qtu2lMH7SJPLNZ&`dI`-zZ`L> z0EKqZDMwVauld64?3ARMqQ+?_8(bnS=hNH*mRLr&<7?)WpMM+-3UP%~qG{}Vc>RMNp{u27 zMhFR@SUaj7MXL=`cy?}qhcG$4MpCXfmU4)Qegq4RNX{A>A?-c_3WpB@1<2KzeEJ3f@iblbs4lH_ZmN`7+X8*W#Yt>zMT}q?4#1N6O z*W`E@wbtlTSlqlQNq!ZZ`jKMhgXW@3>3;4ObJ@Y!W*)uy}O(Wpt(?ZY+T6ntt} zU7D1&)K^~m=Mrmf*8*IITKoPLC|1EiXl$ilpX-Amtpvh4rF3vF_1~xsYa4Usa=S4t zEwrzx(GQoell;96YMT)-ji|ON3*dgCw)d9Dyxpt?V%+0Z(sGK3P(oT2@k;=I+TCdRVtS_T0q6#~6jweB?b)%#3 zdp_m)u#Ox^b-$#{+@L(04qqPdyTUI_4kocJM@{Aw;VkA%>F9`M)NkxBs zXyuuLw|m!Xao!%jkFw^58Z*(IEsA%h3cZE1E8kCnt;Stm|7TzMxn?7?6RUpfSrMJu zkw;#jEH!BotQ`$CLXM{$82W`C`Qq%s4>u1JZAbeG>IV#+oyYu+cyDCFwaONc=VqC( z{LW70pd0^-q;g=(E)5ndyY>$rUY0nSP!5093OXLSgvBbV|y=>ThleeA<%`w6+K?O%!F-xZpQofsPn^!wV)1?s ztDJ^GDX2b1WoepuX1z)c)lKk;@Rhy5#M@tEyo__2J^K;JcVh3?$yP-zNzO(<-?{&+ ztMuq{E777HGrjn)ZDB<6PY1zHXu*6q?&7@dJ^DCQL$iZn-`IY=`Yq%KSAz4CDm*XB z=vdNIryO%OhXJ_FTentBT7W$*SP~k~b8O9-o>RdSw0J$*{fyP|? z2pzJ~fv6lb!ryx-vzad3rTx1jZ66v$ffCh`NOV+BuuclOap>^!Z_S!hiUp5rP-c)# zKRd{7@5y~5I>vD)q5U)aW~86CPK+s2%ddmiG3s-|j|TNF{Q2hfC@@Y2o8Io*YJ$V; zbX1c{<*w53kIo%@-K$}3-0!w{v$qY{V{q4T>e$?Am9rUDk39vaGkfS|A8&)O!xZ(A z-dVPy22@nn__op`&-7}4@k~}Pap*reyc}@bXNzAcoArFY#O+J7NS6mz{e&mK-fI75 zEM^#{(VGEdT@bl4fLrmBf%!_WaKn9fCUf*;@RCcxUglKg{=>Y!*wq^`q|@F1YUVqb zg-NG|=7(?pSr>R3D)eS8^WU8$LQ+WN;C9YLO5llk+O;r3l{j5uTFLS2ijY~k_^%@+ zTKUFhw9Bo5Pq>B8Bud2pwBf)y<~*5c4FNsfvH@bxR=TM66wQ!sI1A5!ZWho%VJJ5sQ(a1G}XvdK;G%&~_S^=P;`mKt*i3B(zS<@qeSmoTHl^bjw-jpMe5_#TT{W?CxTtZE+#;Rx*BQ=eFC=s_Kj!I;x8g zq4Vv!G(&L##&Ld52|hSs~lGUcPp}ENfbn zIlXJa!L|%#ZmyYKkREi|9hk1kcqZXfAY1B^=m?Qp-0T*qFd|aN27a#%EDTO%bCj-} zWVSw-_f>CS)!jS=G(|fK|HHgd(&0;r3Aso-Qwkd5ZPzTRnM^MaemWuEgRhvByB9&d zmTPf=QPWh7itw{2cDLUU5vJK-?P*g5=`6(oKJ?cMO%whu z$EYM5Iu$m7PUpP$vO1dXm%sBHZ=V2Ham8sMq1`oDe^6om zlY2gCOxTR>&tVV=i~{m=ZToJOo9&@KP4zump-Te7P>p%)?6UVkKOymvjs|GJ?Ry{L zdxx--U}K&1ZmJkm zA7=6(Ph6^y=sGJ#hms`fvn&uFgHMir zxP+Pj1c?0MrJx)+%rEz-PqxL|`gEvgEXt`2d1!b(4%x%I#Egv z)ffiJVtRxOn+t{*HP3+ss6*&GMVW}}hdyl{8x5~vWx4@uZwI?cc$u$`*SyghKH zw&ufd!7_1ennpIpHxC74bW^qbLHRB+ZU}oYvUsjPe}KUu3T)+F>8(PI`u96zZGFj7 zHV@rvCk;_8O}jAfP_DjPIB#?UK9#>CtT)Ffde4^@M8;~hTJ4o%x!QYQgNjsOHrSb$ z^)#zOuoyEiW?0i#dbsP!m>l1u$6b6Qu!wC$b!OZ1lU|Kx@+$hg9^u$R@!dd;` zS5b7QDj%sWFgC2kYWrC-EaLN)Meu$fG|R$PsHF!-s$25k$57uTN-@2|{=oFm*zbM= zkElm|u=H>oD$eyC1WxhygT`aQJP9;B$AL&|2ae^*KbVjwC{M`gSo2Vs(~FsrWgY3^ zg|wsBRE1#kp?OHOEy{zVG?%?|O`h_tTtt3tVdT!ONnIQjb_NpE<7?KdFA^!pIa_yx zZ`0q(*ruGs4Z^lnK6H0*uaO(FW|-|@DRP4NQAqG%g81=kRtt+#Wbnh=xyUbN1dMt= zBP6Qp)zD870Q$p|_!VG!(e5cgl=xS$M8E}t(P`J=UK~Bb>B-Nvy}j|~ zFjc&7`hVmzBC>`K*}4tZ>|nt}g|=~Vz8^V^5@4-cuRD^;l z<|*6(0t5U%8yS~*{^f}*rfX;I{i+tR7s5R0uQ5HtK6Aej1L0xeA+;qgJd3l-&#&qb ziz{w{B{vA|Y@Qh#7Xa7%F_`AJ@XJwD@opZnY|Aca_o2pX1JId0EF;(^V%j|IUurAd zB#%gIQ8tWsVpb0_AqzFZKB`*&5X7l~Zd(iK-(xBo{#8M@)E8Y;%6YNRt4WMn0)};v zNH4NdMwErl&c3q}s8dJ&!LWG^MXWa(%+7eKfeGLH?6xtzoGj*p5X&@;XM-)P4q2T~ z9oXH9L^#S~5FR)upPN)>6|hIQ5D67~OetiU)9aa z8x}^m>-?Dr+}CWi4pXq#NgSdbi*KQWuW&qWBX7)5e1kPI9KW1NqI0QTV_s4U6;)D} z`W-f3vfrY++i+&<==%n#yd^`Nq@59*446NbZd+}TxJFuRsq$#EVL0F})I*U)N!YgB za7?Ys!Z#5=@0|3XXyx)RUUwupFvB}&c3vC6cIX>VgN}!gS3wHr{Tq!y7z|D|Np;J` z)U$Nek#$>Vva*a2E3BAERwczMj9|)7)qrJYWykg)x&%!TUhP>s#-1whQY4y&e2e}` zb!YCJVNiHkml(o@z=f-uwqwAisCB# z+r>?{h4veH%|0LCEKLbj46XNJKYv^vmG;3&nx8eM03Ckl24JnQ+0rEgX5b^Hs;rx8 zmS}b@kc%6d7k63*aQ2sDw$H)foSxBqe5|4^HdmLmn(*{`qri5`SAL zX;@D8ZhLp^TP32us)Y%;LifZ^KEteW@HdKeFk{d}qHEET)VJ(`Hap38X!&bk_|AUU z{f92TI^h~UR+j|YX-DKqG6boYup>hOzKs5+Ypa5+OeWgOmxZ%~qU{So+b4NbwotL6 z9Y3}$e5T+b0lIisp1usB47H=dr>cb7O3uY5Gnr69WxU1=~ot(fHWfcaA)dwVmXf!g-G{LQ=6Eh^NNdl zunBy`R2!m57&6crivT1;sYE!jUp=>p!wash)Ah8Nv7GZs_Z)D}za%ZQFXCt@1e^jS zlc3y2Z#Zrv-l0wRB@gn1N-}-coQVhhaX^pv4oe81-H8!#Mk?~VjNF8CuR z9-Qb0*yEf3F&y;Egt!e?=z+YS0;0ZNP- z`kpR(IVEkun610@`=#lv2_KlTnsbU*+5)Z z6UlCeXos@?n&Kqm^gUYq?+s$ZxcJ_KC|KBT*xhzm+ z#^3Mf39c#ozy1Oa9RedzVnI|C=VR+Q=62UuoN6EzYL@E6YNpYuxp}SN^@kkE!I``0t(` tP=-L?9sc*R+ None: - """创建默认配置文件""" - default_config = """[bot] -qq = 1 # 填入你的机器人QQ -nickname = "麦麦" # 你希望bot被称呼的名字 - -[message] -min_text_length = 2 # 与麦麦聊天时麦麦只会回答文本大于等于此数的消息 -max_context_size = 15 # 麦麦获得的上下文数量,超出数量后自动丢弃 -emoji_chance = 0.2 # 麦麦使用表情包的概率 - -[emoji] -check_interval = 120 -register_interval = 10 - -[cq_code] -enable_pic_translate = false - -[response] -api_using = "siliconflow" # 选择大模型API,可选值为siliconflow,deepseek -api_paid = false # 是否使用付费api -model_r1_probability = 0.8 # 麦麦回答时选择R1模型的概率 -model_v3_probability = 0.1 # 麦麦回答时选择V3模型的概率 -model_r1_distill_probability = 0.1 # 麦麦回答时选择R1蒸馏模型的概率 - -[memory] -build_memory_interval = 300 # 记忆构建间隔 - -[others] -enable_advance_output = false # 开启后输出更多日志 - -[groups] -talk_allowed = [] # 可以回复消息的群 -talk_frequency_down = [] # 降低回复频率的群 -ban_user_id = [] # 禁止回复消息的QQ号 -""" - with open(config_path, "w", encoding="utf-8") as f: - f.write(default_config) - logger.success(f"已创建默认配置文件: {config_path}") @classmethod def load_config(cls, config_path: str = None) -> "BotConfig": @@ -127,9 +89,26 @@ ban_user_id = [] # 禁止回复消息的QQ号 config.MODEL_V3_PROBABILITY = response_config.get("model_v3_probability", config.MODEL_V3_PROBABILITY) config.MODEL_R1_DISTILL_PROBABILITY = response_config.get("model_r1_distill_probability", config.MODEL_R1_DISTILL_PROBABILITY) config.API_USING = response_config.get("api_using", config.API_USING) - if response_config.get("api_using", config.API_PAID): - config.SILICONFLOW_MODEL_R1 = "Pro/deepseek-ai/DeepSeek-R1" - config.SILICONFLOW_MODEL_V3 = "Pro/deepseek-ai/DeepSeek-V3" + config.API_PAID = response_config.get("api_paid", config.API_PAID) + + # 加载模型配置 + if "model" in toml_dict: + model_config = toml_dict["model"] + + if "llm_reasoning" in model_config: + config.llm_reasoning = model_config["llm_reasoning"] + + if "llm_reasoning_minor" in model_config: + config.llm_reasoning_minor = model_config["llm_reasoning_minor"] + + if "llm_normal" in model_config: + config.llm_normal = model_config["llm_normal"] + + if "llm_normal_minor" in model_config: + config.llm_normal_minor = model_config["llm_normal_minor"] + + if "vlm" in model_config: + config.vlm = model_config["vlm"] # 消息配置 if "message" in toml_dict: @@ -172,10 +151,6 @@ else: global_config = BotConfig.load_config(config_path=bot_config_path) -# config_dir = os.path.dirname(bot_config_path) - -# logger.info(f"尝试从 {bot_config_path} 加载机器人配置") -# global_config = BotConfig.load_config(config_path=bot_config_path) @dataclass class LLMConfig: diff --git a/src/plugins/chat/cq_code.py b/src/plugins/chat/cq_code.py index 386124c92..4d70736cd 100644 --- a/src/plugins/chat/cq_code.py +++ b/src/plugins/chat/cq_code.py @@ -12,6 +12,7 @@ import time import asyncio from .utils_image import storage_image,storage_emoji from .utils_user import get_user_nickname +from ..models.utils_model import LLM_request #解析各种CQ码 #包含CQ码类 import urllib3 @@ -57,6 +58,11 @@ class CQCode: translated_plain_text: Optional[str] = None reply_message: Dict = None # 存储回复消息 image_base64: Optional[str] = None + _llm: Optional[LLM_request] = None + + def __post_init__(self): + """初始化LLM实例""" + self._llm = LLM_request(model=global_config.vlm, temperature=0.4, max_tokens=300) def translate(self): """根据CQ码类型进行相应的翻译处理""" @@ -161,7 +167,7 @@ class CQCode: # 将 base64 字符串转换为字节类型 image_bytes = base64.b64decode(base64_str) storage_emoji(image_bytes) - return self.get_image_description(base64_str) + return self.get_emoji_description(base64_str) else: return '[表情包]' @@ -181,93 +187,23 @@ class CQCode: def get_emoji_description(self, image_base64: str) -> str: """调用AI接口获取表情包描述""" - headers = { - "Content-Type": "application/json", - "Authorization": f"Bearer {config.siliconflow_key}" - } - - payload = { - "model": "deepseek-ai/deepseek-vl2", - "messages": [ - { - "role": "user", - "content": [ - { - "type": "text", - "text": "这是一个表情包,请用简短的中文描述这个表情包传达的情感和含义。最多20个字。" - }, - { - "type": "image_url", - "image_url": { - "url": f"data:image/jpeg;base64,{image_base64}" - } - } - ] - } - ], - "max_tokens": 50, - "temperature": 0.4 - } - - response = requests.post( - f"{config.siliconflow_base_url}chat/completions", - headers=headers, - json=payload, - timeout=30 - ) - - if response.status_code == 200: - result_json = response.json() - if "choices" in result_json and len(result_json["choices"]) > 0: - description = result_json["choices"][0]["message"]["content"] - return f"[表情包:{description}]" - - raise ValueError(f"AI接口调用失败: {response.text}") + try: + prompt = "这是一个表情包,请用简短的中文描述这个表情包传达的情感和含义。最多20个字。" + description, _ = self._llm.generate_response_for_image_sync(prompt, image_base64) + return f"[表情包:{description}]" + except Exception as e: + print(f"\033[1;31m[错误]\033[0m AI接口调用失败: {str(e)}") + return "[表情包]" def get_image_description(self, image_base64: str) -> str: """调用AI接口获取普通图片描述""" - headers = { - "Content-Type": "application/json", - "Authorization": f"Bearer {config.siliconflow_key}" - } - - payload = { - "model": "deepseek-ai/deepseek-vl2", - "messages": [ - { - "role": "user", - "content": [ - { - "type": "text", - "text": "请用中文描述这张图片的内容。如果有文字,请把文字都描述出来。并尝试猜测这个图片的含义。最多200个字。" - }, - { - "type": "image_url", - "image_url": { - "url": f"data:image/jpeg;base64,{image_base64}" - } - } - ] - } - ], - "max_tokens": 300, - "temperature": 0.6 - } - - response = requests.post( - f"{config.siliconflow_base_url}chat/completions", - headers=headers, - json=payload, - timeout=30 - ) - - if response.status_code == 200: - result_json = response.json() - if "choices" in result_json and len(result_json["choices"]) > 0: - description = result_json["choices"][0]["message"]["content"] - return f"[图片:{description}]" - - raise ValueError(f"AI接口调用失败: {response.text}") + try: + prompt = "请用中文描述这张图片的内容。如果有文字,请把文字都描述出来。并尝试猜测这个图片的含义。最多200个字。" + description, _ = self._llm.generate_response_for_image_sync(prompt, image_base64) + return f"[图片:{description}]" + except Exception as e: + print(f"\033[1;31m[错误]\033[0m AI接口调用失败: {str(e)}") + return "[图片]" def translate_forward(self) -> str: """处理转发消息""" diff --git a/src/plugins/chat/emoji_manager.py b/src/plugins/chat/emoji_manager.py index c8c9dc814..58713e296 100644 --- a/src/plugins/chat/emoji_manager.py +++ b/src/plugins/chat/emoji_manager.py @@ -14,6 +14,8 @@ import asyncio import time from nonebot import get_driver +from ..chat.config import global_config +from ..models.utils_model import LLM_request driver = get_driver() config = driver.config @@ -43,6 +45,7 @@ class EmojiManager: def __init__(self): self.db = Database.get_instance() self._scan_task = None + self.llm = LLM_request(model=global_config.vlm, temperature=0.3, max_tokens=50) def _ensure_emoji_dir(self): """确保表情存储目录存在""" @@ -87,55 +90,23 @@ class EmojiManager: print(f"\033[1;31m[错误]\033[0m 记录表情使用失败: {str(e)}") async def _get_emotion_from_text(self, text: str) -> List[str]: - """从文本中识别情感关键词,使用DeepSeek API进行分析 + """从文本中识别情感关键词 Args: text: 输入文本 Returns: List[str]: 匹配到的情感标签列表 """ try: - # 准备请求数据 - headers = { - "Content-Type": "application/json", - "Authorization": f"Bearer {config.siliconflow_key}" - } + prompt = f'分析这段文本:"{text}",从"happy,angry,sad,surprised,disgusted,fearful,neutral"中选出最匹配的1个情感标签。只需要返回标签,不要输出其他任何内容。' - payload = { - "model": "deepseek-ai/DeepSeek-V3", - "messages": [ - { - "role": "user", - "content": [ - { - "type": "text", - "text": f'分析这段文本:"{text}",从"happy,angry,sad,surprised,disgusted,fearful,neutral"中选出最匹配的1个情感标签。只需要返回标签,不要输出其他任何内容。' - } - ] - } - ], - "max_tokens": 50, - "temperature": 0.3 - } + content, _ = await self.llm.generate_response(prompt) + emotion = content.strip().lower() - async with aiohttp.ClientSession() as session: - async with session.post( - f"{config.siliconflow_base_url}chat/completions", - headers=headers, - json=payload - ) as response: - if response.status != 200: - print(f"\033[1;31m[错误]\033[0m API请求失败: {await response.text()}") - return ['neutral'] - - result = json.loads(await response.text()) - if "choices" in result and len(result["choices"]) > 0: - emotion = result["choices"][0]["message"]["content"].strip().lower() - # 确保返回的标签是有效的 - if emotion in self.EMOTION_KEYWORDS: - print(f"\033[1;32m[成功]\033[0m 识别到的情感: {emotion}") - return [emotion] # 返回单个情感标签的列表 + if emotion in self.EMOTION_KEYWORDS: + print(f"\033[1;32m[成功]\033[0m 识别到的情感: {emotion}") + return [emotion] - return ['neutral'] # 如果无法识别情感,返回neutral + return ['neutral'] except Exception as e: print(f"\033[1;31m[错误]\033[0m 情感分析失败: {str(e)}") @@ -250,52 +221,20 @@ class EmojiManager: async def _get_emoji_tag(self, image_base64: str) -> str: """获取表情包的标签""" - async with aiohttp.ClientSession() as session: - headers = { - "Content-Type": "application/json", - "Authorization": f"Bearer {config.siliconflow_key}" - } + try: + prompt = '这是一个表情包,请从"happy", "angry", "sad", "surprised", "disgusted", "fearful", "neutral"中选出1个情感标签。只输出标签,不要输出其他任何内容,只输出情感标签就好' - payload = { - "model": "deepseek-ai/deepseek-vl2", - "messages": [ - { - "role": "user", - "content": [ - { - "type": "text", - "text": '这是一个表情包,请从"happy", "angry", "sad", "surprised", "disgusted", "fearful", "neutral"中选出1个情感标签。只输出标签,不要输出其他任何内容,只输出情感标签就好' - }, - { - "type": "image_url", - "image_url": { - "url": f"data:image/jpeg;base64,{image_base64}" - } - } - ] - } - ], - "max_tokens": 60, - "temperature": 0.3 - } + content, _ = await self.llm.generate_response_for_image(prompt, image_base64) + tag_result = content.strip().lower() - async with session.post( - f"{config.siliconflow_base_url}chat/completions", - headers=headers, - json=payload - ) as response: - if response.status == 200: - result = await response.json() - if "choices" in result and len(result["choices"]) > 0: - tag_result = result["choices"][0]["message"]["content"].strip().lower() - - valid_tags = ["happy", "angry", "sad", "surprised", "disgusted", "fearful", "neutral"] - for tag_match in valid_tags: - if tag_match in tag_result or tag_match == tag_result: - return tag_match - print(f"\033[1;33m[警告]\033[0m 无效的标签: {tag_match}, 跳过") - else: - print(f"\033[1;31m[错误]\033[0m 获取标签失败, 状态码: {response.status}") + valid_tags = ["happy", "angry", "sad", "surprised", "disgusted", "fearful", "neutral"] + for tag_match in valid_tags: + if tag_match in tag_result or tag_match == tag_result: + return tag_match + print(f"\033[1;33m[警告]\033[0m 无效的标签: {tag_result}, 跳过") + + except Exception as e: + print(f"\033[1;31m[错误]\033[0m 获取标签失败: {str(e)}") print(f"\033[1;32m[调试信息]\033[0m 使用默认标签: neutral") return "skip" # 默认标签 diff --git a/src/plugins/chat/llm_generator.py b/src/plugins/chat/llm_generator.py index 682be8a87..a9c028827 100644 --- a/src/plugins/chat/llm_generator.py +++ b/src/plugins/chat/llm_generator.py @@ -13,249 +13,113 @@ from .prompt_builder import prompt_builder from .config import global_config from .utils import process_llm_response from nonebot import get_driver +from ..models.utils_model import LLM_request driver = get_driver() config = driver.config -class LLMResponseGenerator: +class ResponseGenerator: def __init__(self): - if global_config.API_USING == "siliconflow": - self.client = OpenAI( - api_key=config.siliconflow_key, - base_url=config.siliconflow_base_url - ) - elif global_config.API_USING == "deepseek": - self.client = OpenAI( - api_key=config.deep_seek_key, - base_url=config.deep_seek_base_url - ) - + self.model_r1 = LLM_request(model=global_config.llm_reasoning, temperature=0.7) + self.model_v3 = LLM_request(model=global_config.llm_normal, temperature=0.7) + self.model_r1_distill = LLM_request(model=global_config.llm_reasoning_minor, temperature=0.7) self.db = Database.get_instance() - - # 当前使用的模型类型 self.current_model_type = 'r1' # 默认使用 R1 async def generate_response(self, message: Message) -> Optional[Union[str, List[str]]]: """根据当前模型类型选择对应的生成函数""" - # 从global_config中获取模型概率值 - model_r1_probability = global_config.MODEL_R1_PROBABILITY - model_v3_probability = global_config.MODEL_V3_PROBABILITY - model_r1_distill_probability = global_config.MODEL_R1_DISTILL_PROBABILITY - - # 生成随机数并根据概率选择模型 + # 从global_config中获取模型概率值并选择模型 rand = random.random() - if rand < model_r1_probability: + if rand < global_config.MODEL_R1_PROBABILITY: self.current_model_type = 'r1' - elif rand < model_r1_probability + model_v3_probability: + current_model = self.model_r1 + elif rand < global_config.MODEL_R1_PROBABILITY + global_config.MODEL_V3_PROBABILITY: self.current_model_type = 'v3' + current_model = self.model_v3 else: - self.current_model_type = 'r1_distill' # 默认使用 R1-Distill - + self.current_model_type = 'r1_distill' + current_model = self.model_r1_distill print(f"+++++++++++++++++{global_config.BOT_NICKNAME}{self.current_model_type}思考中+++++++++++++++++") - if self.current_model_type == 'r1': - model_response = await self._generate_r1_response(message) - elif self.current_model_type == 'v3': - model_response = await self._generate_v3_response(message) - else: - model_response = await self._generate_r1_distill_response(message) - # 打印情感标签 - print(f'{global_config.BOT_NICKNAME}的回复是:{model_response}') - model_response, emotion = await self._process_response(model_response) + model_response = await self._generate_response_with_model(message, current_model) if model_response: - print(f"为 '{model_response}' 获取到的情感标签为:{emotion}") - - return model_response, emotion + print(f'{global_config.BOT_NICKNAME}的回复是:{model_response}') + model_response, emotion = await self._process_response(model_response) + if model_response: + print(f"为 '{model_response}' 获取到的情感标签为:{emotion}") + return model_response, emotion + return None, [] - async def _generate_base_response( - self, - message: Message, - model_name: str, - model_params: Optional[Dict[str, Any]] = None - ) -> Optional[str]: + async def _generate_response_with_model(self, message: Message, model: LLM_request) -> Optional[str]: + """使用指定的模型生成回复""" sender_name = message.user_nickname or f"用户{message.user_id}" # 获取关系值 - if relationship_manager.get_relationship(message.user_id): - relationship_value = relationship_manager.get_relationship(message.user_id).relationship_value + relationship_value = relationship_manager.get_relationship(message.user_id).relationship_value if relationship_manager.get_relationship(message.user_id) else 0.0 + if relationship_value != 0.0: print(f"\033[1;32m[关系管理]\033[0m 回复中_当前关系值: {relationship_value}") - else: - relationship_value = 0.0 - - ''' 构建prompt ''' - prompt,prompt_check = prompt_builder._build_prompt( + # 构建prompt + prompt, prompt_check = prompt_builder._build_prompt( message_txt=message.processed_plain_text, sender_name=sender_name, relationship_value=relationship_value, group_id=message.group_id ) - - - # 设置默认参数 - default_params = { - "model": model_name, - "messages": [{"role": "user", "content": prompt}], - "stream": False, - "max_tokens": 1024, - "temperature": 0.7 - } - - default_params_check = { - "model": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", - "messages": [{"role": "user", "content": prompt_check}], - "stream": False, - "max_tokens": 1024, - "temperature": 0.7 - } - - # 更新参数 - if model_params: - default_params.update(model_params) - - - def create_completion(): - return self.client.chat.completions.create(**default_params) - - def create_completion_check(): - return self.client.chat.completions.create(**default_params_check) - - loop = asyncio.get_event_loop() # 读空气模块 - air = 0 - reasoning_content_check='' - content_check='' if global_config.enable_kuuki_read: - response_check = await loop.run_in_executor(None, create_completion_check) - if response_check: - reasoning_content_check = "" - if hasattr(response_check.choices[0].message, "reasoning"): - reasoning_content_check = response_check.choices[0].message.reasoning or reasoning_content_check - elif hasattr(response_check.choices[0].message, "reasoning_content"): - reasoning_content_check = response_check.choices[0].message.reasoning_content or reasoning_content_check - content_check = response_check.choices[0].message.content - print(f"\033[1;32m[读空气]\033[0m 读空气结果为{content_check}") - if 'yes' not in content_check.lower(): - air = 1 - #稀释读空气的判定 - if air == 1 and random.random() < 0.3: - self.db.db.reasoning_logs.insert_one({ - 'time': time.time(), - 'group_id': message.group_id, - 'user': sender_name, - 'message': message.processed_plain_text, - 'model': model_name, - 'reasoning_check': reasoning_content_check, - 'response_check': content_check, - 'reasoning': "", - 'response': "", - 'prompt': prompt, - 'prompt_check': prompt_check, - 'model_params': default_params - }) - return None - - - - + content_check, reasoning_content_check = await self.model_v3.generate_response(prompt_check) + print(f"\033[1;32m[读空气]\033[0m 读空气结果为{content_check}") + if 'yes' not in content_check.lower() and random.random() < 0.3: + self._save_to_db( + message=message, + sender_name=sender_name, + prompt=prompt, + prompt_check=prompt_check, + content="", + content_check=content_check, + reasoning_content="", + reasoning_content_check=reasoning_content_check + ) + return None - response = await loop.run_in_executor(None, create_completion) + # 生成回复 + content, reasoning_content = await model.generate_response(prompt) - # 检查响应内容 - if not response: - print("请求未返回任何内容") - return None - - if not response.choices or not response.choices[0].message.content: - print("请求返回的内容无效:", response) - return None - - content = response.choices[0].message.content - - # 获取推理内容 - reasoning_content = "" - if hasattr(response.choices[0].message, "reasoning"): - reasoning_content = response.choices[0].message.reasoning or reasoning_content - elif hasattr(response.choices[0].message, "reasoning_content"): - reasoning_content = response.choices[0].message.reasoning_content or reasoning_content - # 保存到数据库 + self._save_to_db( + message=message, + sender_name=sender_name, + prompt=prompt, + prompt_check=prompt_check, + content=content, + content_check=content_check if global_config.enable_kuuki_read else "", + reasoning_content=reasoning_content, + reasoning_content_check=reasoning_content_check if global_config.enable_kuuki_read else "" + ) + + return content + + def _save_to_db(self, message: Message, sender_name: str, prompt: str, prompt_check: str, + content: str, content_check: str, reasoning_content: str, reasoning_content_check: str): + """保存对话记录到数据库""" self.db.db.reasoning_logs.insert_one({ 'time': time.time(), 'group_id': message.group_id, 'user': sender_name, 'message': message.processed_plain_text, - 'model': model_name, + 'model': self.current_model_type, 'reasoning_check': reasoning_content_check, 'response_check': content_check, 'reasoning': reasoning_content, 'response': content, 'prompt': prompt, - 'prompt_check': prompt_check, - 'model_params': default_params + 'prompt_check': prompt_check }) - - return content - - async def _generate_r1_response(self, message: Message) -> Optional[str]: - """使用 DeepSeek-R1 模型生成回复""" - if global_config.API_USING == "deepseek": - return await self._generate_base_response( - message, - global_config.DEEPSEEK_MODEL_R1, - {"temperature": 0.7, "max_tokens": 1024} - ) - else: - return await self._generate_base_response( - message, - global_config.SILICONFLOW_MODEL_R1, - {"temperature": 0.7, "max_tokens": 1024} - ) - - async def _generate_v3_response(self, message: Message) -> Optional[str]: - """使用 DeepSeek-V3 模型生成回复""" - if global_config.API_USING == "deepseek": - return await self._generate_base_response( - message, - global_config.DEEPSEEK_MODEL_V3, - {"temperature": 0.8, "max_tokens": 1024} - ) - else: - return await self._generate_base_response( - message, - global_config.SILICONFLOW_MODEL_V3, - {"temperature": 0.8, "max_tokens": 1024} - ) - - async def _generate_r1_distill_response(self, message: Message) -> Optional[str]: - """使用 DeepSeek-R1-Distill-Qwen-32B 模型生成回复""" - return await self._generate_base_response( - message, - global_config.SILICONFLOW_MODEL_R1_DISTILL, - {"temperature": 0.7, "max_tokens": 1024} - ) - - async def _get_group_chat_context(self, message: Message) -> str: - """获取群聊上下文""" - recent_messages = self.db.db.messages.find( - {"group_id": message.group_id} - ).sort("time", -1).limit(15) - - messages_list = list(recent_messages)[::-1] - group_chat = "" - - for msg_dict in messages_list: - time_str = time.strftime("%m-%d %H:%M:%S", time.localtime(msg_dict['time'])) - display_name = msg_dict.get('user_nickname', f"用户{msg_dict['user_id']}") - content = msg_dict.get('processed_plain_text', msg_dict['plain_text']) - - group_chat += f"[{time_str}] {display_name}: {content}\n" - - return group_chat async def _get_emotion_tags(self, content: str) -> List[str]: """提取情感标签""" @@ -266,33 +130,12 @@ class LLMResponseGenerator: 输出: ''' - messages = [{"role": "user", "content": prompt}] - - loop = asyncio.get_event_loop() - if global_config.API_USING == "deepseek": - model = global_config.DEEPSEEK_MODEL_V3 - else: - model = global_config.SILICONFLOW_MODEL_V3 - create_completion = partial( - self.client.chat.completions.create, - model=model, - messages=messages, - stream=False, - max_tokens=30, - temperature=0.6 - ) - response = await loop.run_in_executor(None, create_completion) - - if response.choices[0].message.content: - # 确保返回的是列表格式 - emotion_tag = response.choices[0].message.content.strip() - return [emotion_tag] # 将单个标签包装成列表返回 - - return ["neutral"] # 如果无法获取情感标签,返回默认值 + content, _ = await self.model_v3.generate_response(prompt) + return [content.strip()] if content else ["neutral"] except Exception as e: print(f"获取情感标签时出错: {e}") - return ["neutral"] # 发生错误时返回默认值 + return ["neutral"] async def _process_response(self, content: str) -> Tuple[List[str], List[str]]: """处理响应内容,返回处理后的内容和情感标签""" @@ -300,10 +143,6 @@ class LLMResponseGenerator: return None, [] emotion_tags = await self._get_emotion_tags(content) - processed_response = process_llm_response(content) - return processed_response, emotion_tags - -# 创建全局实例 -llm_response = LLMResponseGenerator() \ No newline at end of file + return processed_response, emotion_tags \ No newline at end of file diff --git a/src/plugins/memory_system/llm_module.py b/src/plugins/memory_system/llm_module.py deleted file mode 100644 index c2b6cf042..000000000 --- a/src/plugins/memory_system/llm_module.py +++ /dev/null @@ -1,68 +0,0 @@ -import os -import requests -from typing import Tuple, Union -import time -from nonebot import get_driver -import aiohttp -import asyncio -from src.plugins.chat.config import global_config -driver = get_driver() -config = driver.config - -class LLMModel: - # def __init__(self, model_name="deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", **kwargs): - def __init__(self, model_name=global_config.SILICONFLOW_MODEL_V3, **kwargs): - self.model_name = model_name - self.params = kwargs - self.api_key = config.siliconflow_key - self.base_url = config.siliconflow_base_url - - async def generate_response(self, prompt: str) -> Tuple[str, str]: - """根据输入的提示生成模型的响应""" - headers = { - "Authorization": f"Bearer {self.api_key}", - "Content-Type": "application/json" - } - - # 构建请求体 - data = { - "model": self.model_name, - "messages": [{"role": "user", "content": prompt}], - "temperature": 0.5, - **self.params - } - - # 发送请求到完整的chat/completions端点 - api_url = f"{self.base_url.rstrip('/')}/chat/completions" - - max_retries = 3 - base_wait_time = 15 - - for retry in range(max_retries): - try: - async with aiohttp.ClientSession() as session: - async with session.post(api_url, headers=headers, json=data) as response: - if response.status == 429: - wait_time = base_wait_time * (2 ** retry) # 指数退避 - print(f"遇到请求限制(429),等待{wait_time}秒后重试...") - await asyncio.sleep(wait_time) - continue - - response.raise_for_status() # 检查其他响应状态 - - result = await response.json() - if "choices" in result and len(result["choices"]) > 0: - content = result["choices"][0]["message"]["content"] - reasoning_content = result["choices"][0]["message"].get("reasoning_content", "") - return content, reasoning_content - return "没有返回结果", "" - - except Exception as e: - if retry < max_retries - 1: # 如果还有重试机会 - wait_time = base_wait_time * (2 ** retry) - print(f"请求失败,等待{wait_time}秒后重试... 错误: {str(e)}") - await asyncio.sleep(wait_time) - else: - return f"请求失败: {str(e)}", "" - - return "达到最大重试次数,请求仍然失败", "" \ No newline at end of file diff --git a/src/plugins/memory_system/memory.py b/src/plugins/memory_system/memory.py index cab41f903..a051192a5 100644 --- a/src/plugins/memory_system/memory.py +++ b/src/plugins/memory_system/memory.py @@ -1,19 +1,16 @@ # -*- coding: utf-8 -*- import os import jieba -from .llm_module import LLMModel import networkx as nx import matplotlib.pyplot as plt -import math from collections import Counter import datetime import random import time from ..chat.config import global_config -import sys from ...common.database import Database # 使用正确的导入语法 from ..chat.utils import calculate_information_content, get_cloest_chat_from_db - +from ..models.utils_model import LLM_request class Memory_graph: def __init__(self): self.G = nx.Graph() # 使用 networkx 的图结构 @@ -169,8 +166,8 @@ class Memory_graph: class Hippocampus: def __init__(self,memory_graph:Memory_graph): self.memory_graph = memory_graph - self.llm_model = LLMModel() - self.llm_model_small = LLMModel(model_name="deepseek-ai/DeepSeek-V2.5") + self.llm_model = LLM_request(model = global_config.llm_normal,temperature=0.5) + self.llm_model_small = LLM_request(model = global_config.llm_normal_minor,temperature=0.5) def get_memory_sample(self,chat_size=20,time_frequency:dict={'near':2,'mid':4,'far':3}): current_timestamp = datetime.datetime.now().timestamp() diff --git a/src/plugins/models/utils_model.py b/src/plugins/models/utils_model.py new file mode 100644 index 000000000..5f4d02df5 --- /dev/null +++ b/src/plugins/models/utils_model.py @@ -0,0 +1,199 @@ +import aiohttp +import asyncio +import requests +import time +from typing import Tuple, Union +from nonebot import get_driver +from ..chat.config import global_config +driver = get_driver() +config = driver.config + +class LLM_request: + def __init__(self, model = global_config.llm_normal,**kwargs): + # 将大写的配置键转换为小写并从config中获取实际值 + try: + self.api_key = getattr(config, model["key"]) + self.base_url = getattr(config, model["base_url"]) + except AttributeError as e: + raise ValueError(f"配置错误:找不到对应的配置项 - {str(e)}") + self.model_name = model["name"] + self.params = kwargs + + async def generate_response(self, prompt: str) -> Tuple[str, str]: + """根据输入的提示生成模型的异步响应""" + headers = { + "Authorization": f"Bearer {self.api_key}", + "Content-Type": "application/json" + } + + # 构建请求体 + data = { + "model": self.model_name, + "messages": [{"role": "user", "content": prompt}], + **self.params + } + + # 发送请求到完整的chat/completions端点 + api_url = f"{self.base_url.rstrip('/')}/chat/completions" + + max_retries = 3 + base_wait_time = 15 + + for retry in range(max_retries): + try: + async with aiohttp.ClientSession() as session: + async with session.post(api_url, headers=headers, json=data) as response: + if response.status == 429: + wait_time = base_wait_time * (2 ** retry) # 指数退避 + print(f"遇到请求限制(429),等待{wait_time}秒后重试...") + await asyncio.sleep(wait_time) + continue + + response.raise_for_status() # 检查其他响应状态 + + result = await response.json() + if "choices" in result and len(result["choices"]) > 0: + content = result["choices"][0]["message"]["content"] + reasoning_content = result["choices"][0]["message"].get("reasoning_content", "") + return content, reasoning_content + return "没有返回结果", "" + + except Exception as e: + if retry < max_retries - 1: # 如果还有重试机会 + wait_time = base_wait_time * (2 ** retry) + print(f"请求失败,等待{wait_time}秒后重试... 错误: {str(e)}") + await asyncio.sleep(wait_time) + else: + return f"请求失败: {str(e)}", "" + + return "达到最大重试次数,请求仍然失败", "" + + async def generate_response_for_image(self, prompt: str, image_base64: str) -> Tuple[str, str]: + """根据输入的提示和图片生成模型的异步响应""" + headers = { + "Authorization": f"Bearer {self.api_key}", + "Content-Type": "application/json" + } + + # 构建请求体 + data = { + "model": self.model_name, + "messages": [ + { + "role": "user", + "content": [ + { + "type": "text", + "text": prompt + }, + { + "type": "image_url", + "image_url": { + "url": f"data:image/jpeg;base64,{image_base64}" + } + } + ] + } + ], + **self.params + } + + # 发送请求到完整的chat/completions端点 + api_url = f"{self.base_url.rstrip('/')}/chat/completions" + + max_retries = 3 + base_wait_time = 15 + + for retry in range(max_retries): + try: + async with aiohttp.ClientSession() as session: + async with session.post(api_url, headers=headers, json=data) as response: + if response.status == 429: + wait_time = base_wait_time * (2 ** retry) # 指数退避 + print(f"遇到请求限制(429),等待{wait_time}秒后重试...") + await asyncio.sleep(wait_time) + continue + + response.raise_for_status() # 检查其他响应状态 + + result = await response.json() + if "choices" in result and len(result["choices"]) > 0: + content = result["choices"][0]["message"]["content"] + reasoning_content = result["choices"][0]["message"].get("reasoning_content", "") + return content, reasoning_content + return "没有返回结果", "" + + except Exception as e: + if retry < max_retries - 1: # 如果还有重试机会 + wait_time = base_wait_time * (2 ** retry) + print(f"请求失败,等待{wait_time}秒后重试... 错误: {str(e)}") + await asyncio.sleep(wait_time) + else: + return f"请求失败: {str(e)}", "" + + return "达到最大重试次数,请求仍然失败", "" + + def generate_response_for_image_sync(self, prompt: str, image_base64: str) -> Tuple[str, str]: + """同步方法:根据输入的提示和图片生成模型的响应""" + headers = { + "Authorization": f"Bearer {self.api_key}", + "Content-Type": "application/json" + } + + # 构建请求体 + data = { + "model": self.model_name, + "messages": [ + { + "role": "user", + "content": [ + { + "type": "text", + "text": prompt + }, + { + "type": "image_url", + "image_url": { + "url": f"data:image/jpeg;base64,{image_base64}" + } + } + ] + } + ], + **self.params + } + + # 发送请求到完整的chat/completions端点 + api_url = f"{self.base_url.rstrip('/')}/chat/completions" + + max_retries = 3 + base_wait_time = 15 + + for retry in range(max_retries): + try: + response = requests.post(api_url, headers=headers, json=data, timeout=30) + + if response.status_code == 429: + wait_time = base_wait_time * (2 ** retry) # 指数退避 + print(f"遇到请求限制(429),等待{wait_time}秒后重试...") + time.sleep(wait_time) + continue + + response.raise_for_status() # 检查其他响应状态 + + result = response.json() + if "choices" in result and len(result["choices"]) > 0: + content = result["choices"][0]["message"]["content"] + reasoning_content = result["choices"][0]["message"].get("reasoning_content", "") + return content, reasoning_content + return "没有返回结果", "" + + except Exception as e: + if retry < max_retries - 1: # 如果还有重试机会 + wait_time = base_wait_time * (2 ** retry) + print(f"请求失败,等待{wait_time}秒后重试... 错误: {str(e)}") + time.sleep(wait_time) + else: + return f"请求失败: {str(e)}", "" + + return "达到最大重试次数,请求仍然失败", "" diff --git a/src/plugins/schedule/schedule_generator.py b/src/plugins/schedule/schedule_generator.py index 63e3235a3..24b2a32dd 100644 --- a/src/plugins/schedule/schedule_generator.py +++ b/src/plugins/schedule/schedule_generator.py @@ -1,10 +1,10 @@ import datetime import os from typing import List, Dict -from .schedule_llm_module import LLMModel from ...common.database import Database # 使用正确的导入语法 from src.plugins.chat.config import global_config from nonebot import get_driver +from ..models.utils_model import LLM_request driver = get_driver() config = driver.config @@ -21,22 +21,27 @@ Database.initialize( class ScheduleGenerator: def __init__(self): - if global_config.API_USING == "siliconflow": - self.llm_scheduler = LLMModel(model_name=global_config.SILICONFLOW_MODEL_V3) - elif global_config.API_USING == "deepseek": - self.llm_scheduler = LLMModel(model_name=global_config.DEEPSEEK_MODEL_V3) + #根据global_config.llm_normal这一字典配置指定模型 + # self.llm_scheduler = LLMModel(model = global_config.llm_normal,temperature=0.9) + self.llm_scheduler = LLM_request(model = global_config.llm_normal,temperature=0.9) self.db = Database.get_instance() - + self.today_schedule_text = "" + self.today_schedule = {} + self.tomorrow_schedule_text = "" + self.tomorrow_schedule = {} + self.yesterday_schedule_text = "" + self.yesterday_schedule = {} + + async def initialize(self): today = datetime.datetime.now() tomorrow = datetime.datetime.now() + datetime.timedelta(days=1) yesterday = datetime.datetime.now() - datetime.timedelta(days=1) - self.today_schedule_text, self.today_schedule = self.generate_daily_schedule(target_date=today) - - self.tomorrow_schedule_text, self.tomorrow_schedule = self.generate_daily_schedule(target_date=tomorrow,read_only=True) - self.yesterday_schedule_text, self.yesterday_schedule = self.generate_daily_schedule(target_date=yesterday,read_only=True) + self.today_schedule_text, self.today_schedule = await self.generate_daily_schedule(target_date=today) + self.tomorrow_schedule_text, self.tomorrow_schedule = await self.generate_daily_schedule(target_date=tomorrow,read_only=True) + self.yesterday_schedule_text, self.yesterday_schedule = await self.generate_daily_schedule(target_date=yesterday,read_only=True) - def generate_daily_schedule(self, target_date: datetime.datetime = None,read_only:bool = False) -> Dict[str, str]: + async def generate_daily_schedule(self, target_date: datetime.datetime = None,read_only:bool = False) -> Dict[str, str]: if target_date is None: target_date = datetime.datetime.now() @@ -60,7 +65,7 @@ class ScheduleGenerator: 3. 晚上的计划和休息时间 请按照时间顺序列出具体时间点和对应的活动,用一个时间点而不是时间段来表示时间,用逗号,隔开时间与活动,格式为"时间,活动",例如"08:00,起床"。""" - schedule_text, _ = self.llm_scheduler.generate_response(prompt) + schedule_text, _ = await self.llm_scheduler.generate_response(prompt) # print(self.schedule_text) self.db.db.schedule.insert_one({"date": date_str, "schedule": schedule_text}) else: diff --git a/src/plugins/schedule/schedule_llm_module.py b/src/plugins/schedule/schedule_llm_module.py deleted file mode 100644 index 21e3f7681..000000000 --- a/src/plugins/schedule/schedule_llm_module.py +++ /dev/null @@ -1,61 +0,0 @@ -import os -import requests -import aiohttp -from typing import Tuple, Union -from nonebot import get_driver -from src.plugins.chat.config import global_config -driver = get_driver() -config = driver.config - -class LLMModel: - # def __init__(self, model_name="deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", **kwargs): - def __init__(self, model_name=global_config.SILICONFLOW_MODEL_R1,api_using=None, **kwargs): - if api_using == "deepseek": - self.api_key = config.deep_seek_key - self.base_url = config.deep_seek_base_url - self.model_name = global_config.DEEPSEEK_MODEL_R1 - else: - self.api_key = config.siliconflow_key - self.base_url = config.siliconflow_base_url - self.model_name = model_name - self.params = kwargs - - def generate_response(self, prompt: str) -> Tuple[str, str]: - """根据输入的提示生成模型的响应""" - headers = { - "Authorization": f"Bearer {self.api_key}", - "Content-Type": "application/json" - } - - # 构建请求体 - data = { - "model": self.model_name, - "messages": [{"role": "user", "content": prompt}], - "temperature": 0.9, - **self.params - } - - # 发送请求到完整的chat/completions端点 - api_url = f"{self.base_url.rstrip('/')}/chat/completions" - - try: - response = requests.post(api_url, headers=headers, json=data) - response.raise_for_status() # 检查响应状态 - - result = response.json() - if "choices" in result and len(result["choices"]) > 0: - content = result["choices"][0]["message"]["content"] - reasoning_content = result["choices"][0]["message"].get("reasoning_content", "") - return content, reasoning_content # 返回内容和推理内容 - return "没有返回结果", "" # 返回两个值 - - except Exception as e: - return f"请求失败: {str(e)}", "" # 返回错误信息和空字符串 - -# 示例用法 -if __name__ == "__main__": - model = LLMModel() # 默认使用 DeepSeek-V3 模型 - prompt = "你好,你喜欢我吗?" - result, reasoning = model.generate_response(prompt) - print("回复内容:", result) - print("推理内容:", reasoning) \ No newline at end of file From 7ccd27520298be5f0d9983c1b01d312037fa059f Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Mon, 3 Mar 2025 01:19:22 +0800 Subject: [PATCH 17/18] Update .env --- .env | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/.env b/.env index 709d22d34..06c26cdf3 100644 --- a/.env +++ b/.env @@ -1,26 +1,26 @@ # 您不应该修改默认值,这个文件被仓库索引,请修改.env.prod -ENVIRONMENT=dev -HOST=127.0.0.1 -PORT=8080 +ENVIRONMENT=prod +# HOST=127.0.0.1 +# PORT=8080 -COMMAND_START=["/"] +# COMMAND_START=["/"] -# 插件配置 -PLUGINS=["src2.plugins.chat"] +# # 插件配置 +# PLUGINS=["src2.plugins.chat"] -# 默认配置 -MONGODB_HOST=127.0.0.1 -MONGODB_PORT=27017 -DATABASE_NAME=MegBot +# # 默认配置 +# MONGODB_HOST=127.0.0.1 +# MONGODB_PORT=27017 +# DATABASE_NAME=MegBot -MONGODB_USERNAME = "" # 默认空值 -MONGODB_PASSWORD = "" # 默认空值 -MONGODB_AUTH_SOURCE = "" # 默认空值 +# MONGODB_USERNAME = "" # 默认空值 +# MONGODB_PASSWORD = "" # 默认空值 +# MONGODB_AUTH_SOURCE = "" # 默认空值 -#key and url -CHAT_ANY_WHERE_KEY= -SILICONFLOW_KEY= -CHAT_ANY_WHERE_BASE_URL=https://api.chatanywhere.tech/v1 -SILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1/ -DEEP_SEEK_KEY= -DEEP_SEEK_BASE_URL=https://api.deepseek.com/v1 \ No newline at end of file +# #key and url +# CHAT_ANY_WHERE_KEY= +# SILICONFLOW_KEY= +# CHAT_ANY_WHERE_BASE_URL=https://api.chatanywhere.tech/v1 +# SILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1/ +# DEEP_SEEK_KEY= +# DEEP_SEEK_BASE_URL=https://api.deepseek.com/v1 \ No newline at end of file From d805e6ea2ccfdcc64f99b7e76a80597c9d45e47a Mon Sep 17 00:00:00 2001 From: KawaiiYusora Date: Mon, 3 Mar 2025 01:25:32 +0800 Subject: [PATCH 18/18] =?UTF-8?q?env.prod=E6=97=A0=E6=B3=95=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bot.py b/bot.py index cf1b82ff6..78bf34b32 100644 --- a/bot.py +++ b/bot.py @@ -31,7 +31,7 @@ if env_file == ".env.dev" and os.path.exists(env_file): load_dotenv(env_file, override=True) # override=True 允许覆盖已存在的环境变量 elif os.path.exists(".env.prod"): logger.success("加载环境变量配置") - load_dotenv(env_file, override=True) # override=True 允许覆盖已存在的环境变量 + load_dotenv(".env.prod", override=True) # override=True 允许覆盖已存在的环境变量 else: logger.error(f"{env}对应的环境配置文件{env_file}不存在,请修改.env文件中的ENVIRONMENT变量为 prod.") exit(1)