feat(cross_context): 支持为跨上下文聊天指定消息数量
允许用户在配置文件中为每个聊天流(群聊或私聊)单独设置要检索的历史消息数量(limit)。如果未指定,则默认为5条。 - 更新了 `build_cross_context_normal` 和 `build_cross_context_s4u` 方法以解析和使用这个新的 `limit` 参数。 - 在S4U(Search for User)模式下,获取的消息数量调整为 `limit` 的4倍,以确保有足够的消息可供筛选。 - 更新了配置文件模板 `bot_config_template.toml` 以反映此项新功能,并提供了示例。
This commit is contained in:
committed by
Windpicker-owo
parent
d826c1a8ee
commit
f262b8b224
@@ -50,7 +50,8 @@ async def build_cross_context_normal(chat_stream: ChatStream, other_chat_infos:
|
|||||||
构建跨群聊/私聊上下文 (Normal模式)
|
构建跨群聊/私聊上下文 (Normal模式)
|
||||||
"""
|
"""
|
||||||
cross_context_messages = []
|
cross_context_messages = []
|
||||||
for chat_type, chat_raw_id in other_chat_infos:
|
for chat_info in other_chat_infos:
|
||||||
|
chat_type, chat_raw_id, limit = chat_info[0], chat_info[1], int(chat_info[2]) if len(chat_info) > 2 else 5
|
||||||
is_group = chat_type == "group"
|
is_group = chat_type == "group"
|
||||||
stream_id = get_chat_manager().get_stream_id(chat_stream.platform, chat_raw_id, is_group=is_group)
|
stream_id = get_chat_manager().get_stream_id(chat_stream.platform, chat_raw_id, is_group=is_group)
|
||||||
if not stream_id:
|
if not stream_id:
|
||||||
@@ -60,7 +61,7 @@ async def build_cross_context_normal(chat_stream: ChatStream, other_chat_infos:
|
|||||||
messages = await get_raw_msg_before_timestamp_with_chat(
|
messages = await get_raw_msg_before_timestamp_with_chat(
|
||||||
chat_id=stream_id,
|
chat_id=stream_id,
|
||||||
timestamp=time.time(),
|
timestamp=time.time(),
|
||||||
limit=5, # 可配置
|
limit=limit,
|
||||||
)
|
)
|
||||||
if messages:
|
if messages:
|
||||||
chat_name = await get_chat_manager().get_stream_name(stream_id) or chat_raw_id
|
chat_name = await get_chat_manager().get_stream_name(stream_id) or chat_raw_id
|
||||||
@@ -89,19 +90,25 @@ async def build_cross_context_s4u(
|
|||||||
user_id = target_user_info.get("user_id")
|
user_id = target_user_info.get("user_id")
|
||||||
|
|
||||||
if user_id:
|
if user_id:
|
||||||
for chat_type, chat_raw_id in other_chat_infos:
|
for chat_info in other_chat_infos:
|
||||||
|
chat_type, chat_raw_id, limit = (
|
||||||
|
chat_info[0],
|
||||||
|
chat_info[1],
|
||||||
|
int(chat_info[2]) if len(chat_info) > 2 else 5,
|
||||||
|
)
|
||||||
is_group = chat_type == "group"
|
is_group = chat_type == "group"
|
||||||
stream_id = get_chat_manager().get_stream_id(chat_stream.platform, chat_raw_id, is_group=is_group)
|
stream_id = get_chat_manager().get_stream_id(chat_stream.platform, chat_raw_id, is_group=is_group)
|
||||||
if not stream_id:
|
if not stream_id:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
# S4U模式下,我们获取更多消息以供筛选
|
||||||
messages = await get_raw_msg_before_timestamp_with_chat(
|
messages = await get_raw_msg_before_timestamp_with_chat(
|
||||||
chat_id=stream_id,
|
chat_id=stream_id,
|
||||||
timestamp=time.time(),
|
timestamp=time.time(),
|
||||||
limit=20, # 获取更多消息以供筛选
|
limit=limit * 4, # 获取4倍limit的消息以供筛选
|
||||||
)
|
)
|
||||||
user_messages = [msg for msg in messages if msg.get("user_id") == user_id][-5:]
|
user_messages = [msg for msg in messages if msg.get("user_id") == user_id][-limit:]
|
||||||
|
|
||||||
if user_messages:
|
if user_messages:
|
||||||
chat_name = await get_chat_manager().get_stream_name(stream_id) or chat_raw_id
|
chat_name = await get_chat_manager().get_stream_name(stream_id) or chat_raw_id
|
||||||
@@ -144,7 +151,8 @@ async def get_chat_history_by_group_name(group_name: str) -> str:
|
|||||||
chat_manager = get_chat_manager()
|
chat_manager = get_chat_manager()
|
||||||
|
|
||||||
cross_context_messages = []
|
cross_context_messages = []
|
||||||
for chat_type, chat_raw_id in chat_infos:
|
for chat_info in chat_infos:
|
||||||
|
chat_type, chat_raw_id, limit = chat_info[0], chat_info[1], int(chat_info[2]) if len(chat_info) > 2 else 5
|
||||||
is_group = chat_type == "group"
|
is_group = chat_type == "group"
|
||||||
|
|
||||||
found_stream = None
|
found_stream = None
|
||||||
@@ -168,7 +176,7 @@ async def get_chat_history_by_group_name(group_name: str) -> str:
|
|||||||
messages = await get_raw_msg_before_timestamp_with_chat(
|
messages = await get_raw_msg_before_timestamp_with_chat(
|
||||||
chat_id=stream_id,
|
chat_id=stream_id,
|
||||||
timestamp=time.time(),
|
timestamp=time.time(),
|
||||||
limit=5, # 可配置
|
limit=limit,
|
||||||
)
|
)
|
||||||
if messages:
|
if messages:
|
||||||
chat_name = await get_chat_manager().get_stream_name(stream_id) or chat_raw_id
|
chat_name = await get_chat_manager().get_stream_name(stream_id) or chat_raw_id
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[inner]
|
[inner]
|
||||||
version = "7.2.6"
|
version = "7.2.7"
|
||||||
|
|
||||||
#----以下是给开发人员阅读的,如果你只是部署了MoFox-Bot,不需要阅读----
|
#----以下是给开发人员阅读的,如果你只是部署了MoFox-Bot,不需要阅读----
|
||||||
#如果你想要修改配置文件,请递增version的值
|
#如果你想要修改配置文件,请递增version的值
|
||||||
@@ -547,14 +547,15 @@ insomnia_trigger_delay_minutes = [15, 45]
|
|||||||
enable = true
|
enable = true
|
||||||
# 在这里定义您的“共享组”
|
# 在这里定义您的“共享组”
|
||||||
# 只有在同一个组内的聊天才会共享上下文
|
# 只有在同一个组内的聊天才会共享上下文
|
||||||
# 格式:chat_ids = [["type", "id"], ["type", "id"], ...]
|
# 格式:chat_ids = [["type", "id", limit (可选)], ["type", "id", limit (可选)], ...]
|
||||||
# type 可选 "group" 或 "private"
|
# type 可选 "group" 或 "private"
|
||||||
|
# limit 是一个可选的整数,用于指定从该聊天流中获取的消息数量,如果未指定,默认为5
|
||||||
[[cross_context.groups]]
|
[[cross_context.groups]]
|
||||||
name = "项目A技术讨论组"
|
name = "项目A技术讨论组"
|
||||||
chat_ids = [
|
chat_ids = [
|
||||||
["group", "169850076"], # 假设这是“开发群”的ID
|
["group", "169850076", 10], # 假设这是“开发群”的ID, 从这个群里拿10条消息
|
||||||
["group", "1025509724"], # 假设这是“产品群”的ID
|
["group", "1025509724", 5], # 假设这是“产品群”的ID,拿5条
|
||||||
["private", "123456789"] # 假设这是某个用户的私聊
|
["private", "123456789"] # 假设这是某个用户的私聊,使用默认值5
|
||||||
]
|
]
|
||||||
# 定义QQ空间互通组
|
# 定义QQ空间互通组
|
||||||
# 同一个组的chat_id会共享上下文,用于生成更相关的说说
|
# 同一个组的chat_id会共享上下文,用于生成更相关的说说
|
||||||
|
|||||||
Reference in New Issue
Block a user