feat(emoji): 增强消息上下文下的表情选择并修复存储用户信息的问题

该提交对表情操作及相关消息发送 API 进行了重大改进。

现在,表情选择逻辑更加具备上下文感知能力。LLM 提示现在包括机器人的待发送回复内容,使其能够根据对话历史和自身回复选择更合适的表情。用于上下文的近期聊天记录也有所增加。

此外,修复了插件发送 API (`send_api`) 中的一个错误。之前,当机器人发送消息时,消息在数据库中存储的是接收者的用户信息,而非机器人的信息。本次提交通过显式传递并使用机器人的用户信息进行存储,确保消息历史准确反映发送者。

其他更改包括:
- 重构表情操作的激活逻辑以提高清晰度。
- 改进 LLM 选择的表情描述匹配算法。- 为配置访问添加必要的类型安全检查。
This commit is contained in:
tt-P607
2025-11-28 15:24:08 +08:00
parent 876f20e847
commit 103a6edaf3
3 changed files with 72 additions and 59 deletions

View File

@@ -13,7 +13,7 @@ from mofox_wire import MessageEnvelope
from src.chat.message_receive.message_processor import process_message_from_dict
from src.chat.message_receive.storage import MessageStorage
from src.chat.utils.utils import calculate_typing_time, truncate_message
from src.common.data_models.database_data_model import DatabaseMessages
from src.common.data_models.database_data_model import DatabaseMessages, DatabaseUserInfo
from src.common.logger import get_logger
from src.config.config import global_config
@@ -27,13 +27,13 @@ logger = get_logger("sender")
async def send_envelope(
envelope: MessageEnvelope,
chat_stream: "ChatStream" | None = None,
chat_stream: ChatStream | None = None,
db_message: DatabaseMessages | None = None,
show_log: bool = True,
) -> bool:
"""发送消息"""
message_preview = truncate_message(
(db_message.processed_plain_text if db_message else str(envelope.get("message_segment", ""))),
(db_message.processed_plain_text or "" if db_message else str(envelope.get("message_segment", ""))),
max_length=120,
)
@@ -81,6 +81,7 @@ class HeartFCSender:
show_log: bool = True,
thinking_start_time: float = 0.0,
display_message: str | None = None,
storage_user_info: "DatabaseUserInfo | None" = None,
) -> bool:
if not chat_stream:
logger.error("消息缺少 chat_stream无法发送")
@@ -93,6 +94,13 @@ class HeartFCSender:
platform=chat_stream.platform,
)
# 如果提供了用于存储的用户信息,则覆盖
if storage_message and storage_user_info:
db_message.user_info.user_id = storage_user_info.user_id
db_message.user_info.user_nickname = storage_user_info.user_nickname
db_message.user_info.user_cardname = storage_user_info.user_cardname
db_message.user_info.platform = storage_user_info.platform
# 使用调用方指定的展示文本
if display_message:
db_message.display_message = display_message
@@ -125,9 +133,13 @@ class HeartFCSender:
# 将发送的消息写入上下文历史
try:
if chat_stream.context:
if chat_stream and chat_stream.context and global_config.chat:
context = chat_stream.context
max_context_size = getattr(global_config.chat, "max_context_size", 40)
chat_config = global_config.chat
if chat_config:
max_context_size = getattr(chat_config, "max_context_size", 40)
else:
max_context_size = 40
if len(context.history_messages) >= max_context_size:
context.history_messages = context.history_messages[1:]