🤖 自动格式化代码 [skip ci]
This commit is contained in:
@@ -11,7 +11,7 @@ from src.common.logger import get_logger
|
|||||||
import math
|
import math
|
||||||
import re
|
import re
|
||||||
import traceback
|
import traceback
|
||||||
from typing import Optional, Tuple, Dict, Any
|
from typing import Optional, Tuple
|
||||||
from maim_message import UserInfo
|
from maim_message import UserInfo
|
||||||
|
|
||||||
from src.person_info.relationship_manager import get_relationship_manager
|
from src.person_info.relationship_manager import get_relationship_manager
|
||||||
|
|||||||
@@ -378,7 +378,7 @@ class ActionManager:
|
|||||||
filtered_actions[action_name] = action_info
|
filtered_actions[action_name] = action_info
|
||||||
logger.debug(f"动作 {action_name} 在模式 {mode} 下可用 (mode_enable: {action_mode})")
|
logger.debug(f"动作 {action_name} 在模式 {mode} 下可用 (mode_enable: {action_mode})")
|
||||||
# else:
|
# else:
|
||||||
# logger.debug(f"动作 {action_name} 在模式 {mode} 下不可用 (mode_enable: {action_mode})")
|
# logger.debug(f"动作 {action_name} 在模式 {mode} 下不可用 (mode_enable: {action_mode})")
|
||||||
|
|
||||||
logger.debug(f"模式 {mode} 下可用动作: {list(filtered_actions.keys())}")
|
logger.debug(f"模式 {mode} 下可用动作: {list(filtered_actions.keys())}")
|
||||||
return filtered_actions
|
return filtered_actions
|
||||||
|
|||||||
@@ -51,7 +51,6 @@ class ChatBot:
|
|||||||
async def _process_commands_with_new_system(self, message: MessageRecv):
|
async def _process_commands_with_new_system(self, message: MessageRecv):
|
||||||
"""使用新插件系统处理命令"""
|
"""使用新插件系统处理命令"""
|
||||||
try:
|
try:
|
||||||
|
|
||||||
text = message.processed_plain_text
|
text = message.processed_plain_text
|
||||||
|
|
||||||
# 使用新的组件注册中心查找命令
|
# 使用新的组件注册中心查找命令
|
||||||
|
|||||||
@@ -182,7 +182,9 @@ class NormalChat:
|
|||||||
interested_rate=interest_value * self.willing_amplifier,
|
interested_rate=interest_value * self.willing_amplifier,
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"[{self.stream_name}] 处理兴趣消息{msg_id}时出错: {e}\n{traceback.format_exc()}")
|
logger.error(
|
||||||
|
f"[{self.stream_name}] 处理兴趣消息{msg_id}时出错: {e}\n{traceback.format_exc()}"
|
||||||
|
)
|
||||||
finally:
|
finally:
|
||||||
self.interest_dict.pop(msg_id, None)
|
self.interest_dict.pop(msg_id, None)
|
||||||
|
|
||||||
|
|||||||
@@ -323,14 +323,16 @@ class NormalChatActionModifier:
|
|||||||
|
|
||||||
# 统计1分钟内的回复数量
|
# 统计1分钟内的回复数量
|
||||||
recent_reply_count = sum(1 for reply in recent_replies if reply["time"] > one_minute_ago)
|
recent_reply_count = sum(1 for reply in recent_replies if reply["time"] > one_minute_ago)
|
||||||
|
|
||||||
print(f"recent_reply_count: {recent_reply_count}")
|
print(f"recent_reply_count: {recent_reply_count}")
|
||||||
print(f"reply_threshold: {reply_threshold}")
|
print(f"reply_threshold: {reply_threshold}")
|
||||||
|
|
||||||
should_switch = recent_reply_count > reply_threshold
|
should_switch = recent_reply_count > reply_threshold
|
||||||
if should_switch:
|
if should_switch:
|
||||||
logger.debug(f"{self.log_prefix} 检测到1分钟内回复数量({recent_reply_count})大于{reply_threshold},满足切换到focus模式条件")
|
logger.debug(
|
||||||
|
f"{self.log_prefix} 检测到1分钟内回复数量({recent_reply_count})大于{reply_threshold},满足切换到focus模式条件"
|
||||||
|
)
|
||||||
|
|
||||||
return should_switch
|
return should_switch
|
||||||
|
|
||||||
def get_available_actions_count(self) -> int:
|
def get_available_actions_count(self) -> int:
|
||||||
|
|||||||
@@ -180,7 +180,7 @@ def _build_readable_messages_internal(
|
|||||||
return "", [], pic_id_mapping or {}, pic_counter
|
return "", [], pic_id_mapping or {}, pic_counter
|
||||||
|
|
||||||
message_details_raw: List[Tuple[float, str, str]] = []
|
message_details_raw: List[Tuple[float, str, str]] = []
|
||||||
|
|
||||||
# 使用传入的映射字典,如果没有则创建新的
|
# 使用传入的映射字典,如果没有则创建新的
|
||||||
if pic_id_mapping is None:
|
if pic_id_mapping is None:
|
||||||
pic_id_mapping = {}
|
pic_id_mapping = {}
|
||||||
@@ -189,20 +189,20 @@ def _build_readable_messages_internal(
|
|||||||
def process_pic_ids(content: str) -> str:
|
def process_pic_ids(content: str) -> str:
|
||||||
"""处理内容中的图片ID,将其替换为[图片x]格式"""
|
"""处理内容中的图片ID,将其替换为[图片x]格式"""
|
||||||
nonlocal current_pic_counter
|
nonlocal current_pic_counter
|
||||||
|
|
||||||
# 匹配 [picid:xxxxx] 格式
|
# 匹配 [picid:xxxxx] 格式
|
||||||
pic_pattern = r'\[picid:([^\]]+)\]'
|
pic_pattern = r"\[picid:([^\]]+)\]"
|
||||||
|
|
||||||
def replace_pic_id(match):
|
def replace_pic_id(match):
|
||||||
nonlocal current_pic_counter
|
nonlocal current_pic_counter
|
||||||
pic_id = match.group(1)
|
pic_id = match.group(1)
|
||||||
|
|
||||||
if pic_id not in pic_id_mapping:
|
if pic_id not in pic_id_mapping:
|
||||||
pic_id_mapping[pic_id] = f"图片{current_pic_counter}"
|
pic_id_mapping[pic_id] = f"图片{current_pic_counter}"
|
||||||
current_pic_counter += 1
|
current_pic_counter += 1
|
||||||
|
|
||||||
return f"[{pic_id_mapping[pic_id]}]"
|
return f"[{pic_id_mapping[pic_id]}]"
|
||||||
|
|
||||||
return re.sub(pic_pattern, replace_pic_id, content)
|
return re.sub(pic_pattern, replace_pic_id, content)
|
||||||
|
|
||||||
# 1 & 2: 获取发送者信息并提取消息组件
|
# 1 & 2: 获取发送者信息并提取消息组件
|
||||||
@@ -415,7 +415,7 @@ def _build_readable_messages_internal(
|
|||||||
|
|
||||||
# 4 & 5: 格式化为字符串
|
# 4 & 5: 格式化为字符串
|
||||||
output_lines = []
|
output_lines = []
|
||||||
|
|
||||||
for _i, merged in enumerate(merged_messages):
|
for _i, merged in enumerate(merged_messages):
|
||||||
# 使用指定的 timestamp_mode 格式化时间
|
# 使用指定的 timestamp_mode 格式化时间
|
||||||
readable_time = translate_timestamp_to_human_readable(merged["start_time"], mode=timestamp_mode)
|
readable_time = translate_timestamp_to_human_readable(merged["start_time"], mode=timestamp_mode)
|
||||||
@@ -445,29 +445,32 @@ def _build_readable_messages_internal(
|
|||||||
formatted_string = "".join(output_lines).strip()
|
formatted_string = "".join(output_lines).strip()
|
||||||
|
|
||||||
# 返回格式化后的字符串、消息详情列表、图片映射字典和更新后的计数器
|
# 返回格式化后的字符串、消息详情列表、图片映射字典和更新后的计数器
|
||||||
return formatted_string, [(t, n, c) for t, n, c, is_action in message_details if not is_action], pic_id_mapping, current_pic_counter
|
return (
|
||||||
|
formatted_string,
|
||||||
|
[(t, n, c) for t, n, c, is_action in message_details if not is_action],
|
||||||
|
pic_id_mapping,
|
||||||
|
current_pic_counter,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def build_pic_mapping_info(pic_id_mapping: Dict[str, str]) -> str:
|
def build_pic_mapping_info(pic_id_mapping: Dict[str, str]) -> str:
|
||||||
"""
|
"""
|
||||||
构建图片映射信息字符串,显示图片的具体描述内容
|
构建图片映射信息字符串,显示图片的具体描述内容
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
pic_id_mapping: 图片ID到显示名称的映射字典
|
pic_id_mapping: 图片ID到显示名称的映射字典
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
格式化的映射信息字符串
|
格式化的映射信息字符串
|
||||||
"""
|
"""
|
||||||
if not pic_id_mapping:
|
if not pic_id_mapping:
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
mapping_lines = []
|
mapping_lines = []
|
||||||
|
|
||||||
# 按图片编号排序
|
# 按图片编号排序
|
||||||
sorted_items = sorted(pic_id_mapping.items(), key=lambda x: int(x[1].replace("图片", "")))
|
sorted_items = sorted(pic_id_mapping.items(), key=lambda x: int(x[1].replace("图片", "")))
|
||||||
|
|
||||||
for pic_id, display_name in sorted_items:
|
for pic_id, display_name in sorted_items:
|
||||||
# 从数据库中获取图片描述
|
# 从数据库中获取图片描述
|
||||||
description = "内容正在阅读"
|
description = "内容正在阅读"
|
||||||
@@ -475,12 +478,12 @@ def build_pic_mapping_info(pic_id_mapping: Dict[str, str]) -> str:
|
|||||||
image = Images.get_or_none(Images.image_id == pic_id)
|
image = Images.get_or_none(Images.image_id == pic_id)
|
||||||
if image and image.description:
|
if image and image.description:
|
||||||
description = image.description
|
description = image.description
|
||||||
except Exception as e:
|
except Exception:
|
||||||
# 如果查询失败,保持默认描述
|
# 如果查询失败,保持默认描述
|
||||||
pass
|
pass
|
||||||
|
|
||||||
mapping_lines.append(f"[{display_name}] 的内容:{description}")
|
mapping_lines.append(f"[{display_name}] 的内容:{description}")
|
||||||
|
|
||||||
return "\n".join(mapping_lines)
|
return "\n".join(mapping_lines)
|
||||||
|
|
||||||
|
|
||||||
@@ -498,12 +501,12 @@ async def build_readable_messages_with_list(
|
|||||||
formatted_string, details_list, pic_id_mapping, _ = _build_readable_messages_internal(
|
formatted_string, details_list, pic_id_mapping, _ = _build_readable_messages_internal(
|
||||||
messages, replace_bot_name, merge_messages, timestamp_mode, truncate
|
messages, replace_bot_name, merge_messages, timestamp_mode, truncate
|
||||||
)
|
)
|
||||||
|
|
||||||
# 生成图片映射信息并添加到最前面
|
# 生成图片映射信息并添加到最前面
|
||||||
pic_mapping_info = build_pic_mapping_info(pic_id_mapping)
|
pic_mapping_info = build_pic_mapping_info(pic_id_mapping)
|
||||||
if pic_mapping_info:
|
if pic_mapping_info:
|
||||||
formatted_string = f"{pic_mapping_info}\n\n{formatted_string}"
|
formatted_string = f"{pic_mapping_info}\n\n{formatted_string}"
|
||||||
|
|
||||||
return formatted_string, details_list
|
return formatted_string, details_list
|
||||||
|
|
||||||
|
|
||||||
@@ -575,7 +578,7 @@ def build_readable_messages(
|
|||||||
formatted_string, _, pic_id_mapping, _ = _build_readable_messages_internal(
|
formatted_string, _, pic_id_mapping, _ = _build_readable_messages_internal(
|
||||||
copy_messages, replace_bot_name, merge_messages, timestamp_mode, truncate
|
copy_messages, replace_bot_name, merge_messages, timestamp_mode, truncate
|
||||||
)
|
)
|
||||||
|
|
||||||
# 生成图片映射信息并添加到最前面
|
# 生成图片映射信息并添加到最前面
|
||||||
pic_mapping_info = build_pic_mapping_info(pic_id_mapping)
|
pic_mapping_info = build_pic_mapping_info(pic_id_mapping)
|
||||||
if pic_mapping_info:
|
if pic_mapping_info:
|
||||||
@@ -593,25 +596,29 @@ def build_readable_messages(
|
|||||||
|
|
||||||
# 分别格式化,但使用共享的图片映射
|
# 分别格式化,但使用共享的图片映射
|
||||||
formatted_before, _, pic_id_mapping, pic_counter = _build_readable_messages_internal(
|
formatted_before, _, pic_id_mapping, pic_counter = _build_readable_messages_internal(
|
||||||
messages_before_mark, replace_bot_name, merge_messages, timestamp_mode, truncate,
|
messages_before_mark,
|
||||||
pic_id_mapping, pic_counter
|
replace_bot_name,
|
||||||
|
merge_messages,
|
||||||
|
timestamp_mode,
|
||||||
|
truncate,
|
||||||
|
pic_id_mapping,
|
||||||
|
pic_counter,
|
||||||
)
|
)
|
||||||
formatted_after, _, pic_id_mapping, _ = _build_readable_messages_internal(
|
formatted_after, _, pic_id_mapping, _ = _build_readable_messages_internal(
|
||||||
messages_after_mark, replace_bot_name, merge_messages, timestamp_mode, False,
|
messages_after_mark, replace_bot_name, merge_messages, timestamp_mode, False, pic_id_mapping, pic_counter
|
||||||
pic_id_mapping, pic_counter
|
|
||||||
)
|
)
|
||||||
|
|
||||||
read_mark_line = "\n--- 以上消息是你已经看过---\n--- 请关注以下未读的新消息---\n"
|
read_mark_line = "\n--- 以上消息是你已经看过---\n--- 请关注以下未读的新消息---\n"
|
||||||
|
|
||||||
# 生成图片映射信息
|
# 生成图片映射信息
|
||||||
pic_mapping_info = f"图片信息:\n{build_pic_mapping_info(pic_id_mapping)}\n聊天记录信息:\n"
|
pic_mapping_info = f"图片信息:\n{build_pic_mapping_info(pic_id_mapping)}\n聊天记录信息:\n"
|
||||||
|
|
||||||
# 组合结果
|
# 组合结果
|
||||||
result_parts = []
|
result_parts = []
|
||||||
if pic_mapping_info:
|
if pic_mapping_info:
|
||||||
result_parts.append(pic_mapping_info)
|
result_parts.append(pic_mapping_info)
|
||||||
result_parts.append("\n")
|
result_parts.append("\n")
|
||||||
|
|
||||||
if formatted_before and formatted_after:
|
if formatted_before and formatted_after:
|
||||||
result_parts.extend([formatted_before, read_mark_line, formatted_after])
|
result_parts.extend([formatted_before, read_mark_line, formatted_after])
|
||||||
elif formatted_before:
|
elif formatted_before:
|
||||||
@@ -620,7 +627,7 @@ def build_readable_messages(
|
|||||||
result_parts.extend([read_mark_line, formatted_after])
|
result_parts.extend([read_mark_line, formatted_after])
|
||||||
else:
|
else:
|
||||||
result_parts.append(read_mark_line.strip())
|
result_parts.append(read_mark_line.strip())
|
||||||
|
|
||||||
return "".join(result_parts)
|
return "".join(result_parts)
|
||||||
|
|
||||||
|
|
||||||
@@ -636,7 +643,7 @@ async def build_anonymous_messages(messages: List[Dict[str, Any]]) -> str:
|
|||||||
person_map = {}
|
person_map = {}
|
||||||
current_char = ord("A")
|
current_char = ord("A")
|
||||||
output_lines = []
|
output_lines = []
|
||||||
|
|
||||||
# 图片ID映射字典
|
# 图片ID映射字典
|
||||||
pic_id_mapping = {}
|
pic_id_mapping = {}
|
||||||
pic_counter = 1
|
pic_counter = 1
|
||||||
@@ -644,20 +651,20 @@ async def build_anonymous_messages(messages: List[Dict[str, Any]]) -> str:
|
|||||||
def process_pic_ids(content: str) -> str:
|
def process_pic_ids(content: str) -> str:
|
||||||
"""处理内容中的图片ID,将其替换为[图片x]格式"""
|
"""处理内容中的图片ID,将其替换为[图片x]格式"""
|
||||||
nonlocal pic_counter
|
nonlocal pic_counter
|
||||||
|
|
||||||
# 匹配 [picid:xxxxx] 格式
|
# 匹配 [picid:xxxxx] 格式
|
||||||
pic_pattern = r'\[picid:([^\]]+)\]'
|
pic_pattern = r"\[picid:([^\]]+)\]"
|
||||||
|
|
||||||
def replace_pic_id(match):
|
def replace_pic_id(match):
|
||||||
nonlocal pic_counter
|
nonlocal pic_counter
|
||||||
pic_id = match.group(1)
|
pic_id = match.group(1)
|
||||||
|
|
||||||
if pic_id not in pic_id_mapping:
|
if pic_id not in pic_id_mapping:
|
||||||
pic_id_mapping[pic_id] = f"图片{pic_counter}"
|
pic_id_mapping[pic_id] = f"图片{pic_counter}"
|
||||||
pic_counter += 1
|
pic_counter += 1
|
||||||
|
|
||||||
return f"[{pic_id_mapping[pic_id]}]"
|
return f"[{pic_id_mapping[pic_id]}]"
|
||||||
|
|
||||||
return re.sub(pic_pattern, replace_pic_id, content)
|
return re.sub(pic_pattern, replace_pic_id, content)
|
||||||
|
|
||||||
def get_anon_name(platform, user_id):
|
def get_anon_name(platform, user_id):
|
||||||
@@ -754,7 +761,7 @@ async def build_anonymous_messages(messages: List[Dict[str, Any]]) -> str:
|
|||||||
if pic_mapping_info:
|
if pic_mapping_info:
|
||||||
final_output_lines.append(pic_mapping_info)
|
final_output_lines.append(pic_mapping_info)
|
||||||
final_output_lines.append("\n\n")
|
final_output_lines.append("\n\n")
|
||||||
|
|
||||||
final_output_lines.extend(output_lines)
|
final_output_lines.extend(output_lines)
|
||||||
formatted_string = "".join(final_output_lines).strip()
|
formatted_string = "".join(final_output_lines).strip()
|
||||||
return formatted_string
|
return formatted_string
|
||||||
|
|||||||
@@ -372,14 +372,14 @@ class ImageManager:
|
|||||||
Tuple[str, str]: (图片ID, 描述)
|
Tuple[str, str]: (图片ID, 描述)
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
# 生成图片ID
|
# 生成图片ID
|
||||||
# 计算图片哈希
|
# 计算图片哈希
|
||||||
image_bytes = base64.b64decode(image_base64)
|
image_bytes = base64.b64decode(image_base64)
|
||||||
image_hash = hashlib.md5(image_bytes).hexdigest()
|
image_hash = hashlib.md5(image_bytes).hexdigest()
|
||||||
|
|
||||||
# 检查图片是否已存在
|
# 检查图片是否已存在
|
||||||
existing_image = Images.get_or_none(Images.emoji_hash == image_hash)
|
existing_image = Images.get_or_none(Images.emoji_hash == image_hash)
|
||||||
|
|
||||||
if existing_image:
|
if existing_image:
|
||||||
# print(f"图片已存在: {existing_image.image_id}")
|
# print(f"图片已存在: {existing_image.image_id}")
|
||||||
# print(f"图片描述: {existing_image.description}")
|
# print(f"图片描述: {existing_image.description}")
|
||||||
@@ -391,18 +391,18 @@ class ImageManager:
|
|||||||
else:
|
else:
|
||||||
# print(f"图片不存在: {image_hash}")
|
# print(f"图片不存在: {image_hash}")
|
||||||
image_id = str(uuid.uuid4())
|
image_id = str(uuid.uuid4())
|
||||||
|
|
||||||
# 保存新图片
|
# 保存新图片
|
||||||
current_timestamp = time.time()
|
current_timestamp = time.time()
|
||||||
image_dir = os.path.join(self.IMAGE_DIR, "images")
|
image_dir = os.path.join(self.IMAGE_DIR, "images")
|
||||||
os.makedirs(image_dir, exist_ok=True)
|
os.makedirs(image_dir, exist_ok=True)
|
||||||
filename = f"{image_id}.png"
|
filename = f"{image_id}.png"
|
||||||
file_path = os.path.join(image_dir, filename)
|
file_path = os.path.join(image_dir, filename)
|
||||||
|
|
||||||
# 保存文件
|
# 保存文件
|
||||||
with open(file_path, "wb") as f:
|
with open(file_path, "wb") as f:
|
||||||
f.write(image_bytes)
|
f.write(image_bytes)
|
||||||
|
|
||||||
# 保存到数据库
|
# 保存到数据库
|
||||||
Images.create(
|
Images.create(
|
||||||
image_id=image_id,
|
image_id=image_id,
|
||||||
@@ -411,14 +411,14 @@ class ImageManager:
|
|||||||
base64=image_base64,
|
base64=image_base64,
|
||||||
type="image",
|
type="image",
|
||||||
timestamp=current_timestamp,
|
timestamp=current_timestamp,
|
||||||
vlm_processed=False
|
vlm_processed=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
# 启动异步VLM处理
|
# 启动异步VLM处理
|
||||||
asyncio.create_task(self._process_image_with_vlm(image_id, image_base64))
|
asyncio.create_task(self._process_image_with_vlm(image_id, image_base64))
|
||||||
|
|
||||||
return image_id, f"[picid:{image_id}]"
|
return image_id, f"[picid:{image_id}]"
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"处理图片失败: {str(e)}")
|
logger.error(f"处理图片失败: {str(e)}")
|
||||||
return "", "[图片]"
|
return "", "[图片]"
|
||||||
@@ -434,7 +434,7 @@ class ImageManager:
|
|||||||
# 计算图片哈希
|
# 计算图片哈希
|
||||||
image_bytes = base64.b64decode(image_base64)
|
image_bytes = base64.b64decode(image_base64)
|
||||||
image_hash = hashlib.md5(image_bytes).hexdigest()
|
image_hash = hashlib.md5(image_bytes).hexdigest()
|
||||||
|
|
||||||
# 先检查缓存的描述
|
# 先检查缓存的描述
|
||||||
cached_description = self._get_description_from_db(image_hash, "image")
|
cached_description = self._get_description_from_db(image_hash, "image")
|
||||||
if cached_description:
|
if cached_description:
|
||||||
@@ -445,39 +445,35 @@ class ImageManager:
|
|||||||
image.vlm_processed = True
|
image.vlm_processed = True
|
||||||
image.save()
|
image.save()
|
||||||
return
|
return
|
||||||
|
|
||||||
# 获取图片格式
|
# 获取图片格式
|
||||||
image_format = Image.open(io.BytesIO(image_bytes)).format.lower()
|
image_format = Image.open(io.BytesIO(image_bytes)).format.lower()
|
||||||
|
|
||||||
# 构建prompt
|
# 构建prompt
|
||||||
prompt = """请用中文描述这张图片的内容。如果有文字,请把文字描述概括出来,请留意其主题,直观感受,输出为一段平文本,最多50字"""
|
prompt = """请用中文描述这张图片的内容。如果有文字,请把文字描述概括出来,请留意其主题,直观感受,输出为一段平文本,最多50字"""
|
||||||
|
|
||||||
# 获取VLM描述
|
# 获取VLM描述
|
||||||
description, _ = await self._llm.generate_response_for_image(
|
description, _ = await self._llm.generate_response_for_image(prompt, image_base64, image_format)
|
||||||
prompt,
|
|
||||||
image_base64,
|
|
||||||
image_format
|
|
||||||
)
|
|
||||||
|
|
||||||
if description is None:
|
if description is None:
|
||||||
logger.warning("VLM未能生成图片描述")
|
logger.warning("VLM未能生成图片描述")
|
||||||
description = "无法生成描述"
|
description = "无法生成描述"
|
||||||
|
|
||||||
# 再次检查缓存,防止并发写入时重复生成
|
# 再次检查缓存,防止并发写入时重复生成
|
||||||
cached_description = self._get_description_from_db(image_hash, "image")
|
cached_description = self._get_description_from_db(image_hash, "image")
|
||||||
if cached_description:
|
if cached_description:
|
||||||
logger.warning(f"虽然生成了描述,但是找到缓存图片描述: {cached_description}")
|
logger.warning(f"虽然生成了描述,但是找到缓存图片描述: {cached_description}")
|
||||||
description = cached_description
|
description = cached_description
|
||||||
|
|
||||||
# 更新数据库
|
# 更新数据库
|
||||||
image = Images.get(Images.image_id == image_id)
|
image = Images.get(Images.image_id == image_id)
|
||||||
image.description = description
|
image.description = description
|
||||||
image.vlm_processed = True
|
image.vlm_processed = True
|
||||||
image.save()
|
image.save()
|
||||||
|
|
||||||
# 保存描述到ImageDescriptions表
|
# 保存描述到ImageDescriptions表
|
||||||
self._save_description_to_db(image_hash, description, "image")
|
self._save_description_to_db(image_hash, description, "image")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"VLM处理图片失败: {str(e)}")
|
logger.error(f"VLM处理图片失败: {str(e)}")
|
||||||
|
|
||||||
|
|||||||
@@ -32,12 +32,8 @@ class PluginManager:
|
|||||||
|
|
||||||
def _ensure_plugin_directories(self):
|
def _ensure_plugin_directories(self):
|
||||||
"""确保所有插件目录存在,如果不存在则创建"""
|
"""确保所有插件目录存在,如果不存在则创建"""
|
||||||
default_directories = [
|
default_directories = ["src/plugins/built_in", "src/plugins/examples", "plugins"]
|
||||||
"src/plugins/built_in",
|
|
||||||
"src/plugins/examples",
|
|
||||||
"plugins"
|
|
||||||
]
|
|
||||||
|
|
||||||
for directory in default_directories:
|
for directory in default_directories:
|
||||||
if not os.path.exists(directory):
|
if not os.path.exists(directory):
|
||||||
os.makedirs(directory, exist_ok=True)
|
os.makedirs(directory, exist_ok=True)
|
||||||
|
|||||||
@@ -267,7 +267,7 @@ class ChangeToFocusChatAction(BaseAction):
|
|||||||
"聊天上下文中自己的回复条数较多(超过3-4条)",
|
"聊天上下文中自己的回复条数较多(超过3-4条)",
|
||||||
"对话进行得非常热烈活跃",
|
"对话进行得非常热烈活跃",
|
||||||
"用户表现出深入交流的意图",
|
"用户表现出深入交流的意图",
|
||||||
"话题需要更专注和深入的讨论"
|
"话题需要更专注和深入的讨论",
|
||||||
]
|
]
|
||||||
|
|
||||||
async def execute(self) -> Tuple[bool, str]:
|
async def execute(self) -> Tuple[bool, str]:
|
||||||
|
|||||||
Reference in New Issue
Block a user