mirror of https://github.com/Mai-with-u/MaiBot.git
group_generator适配
parent
7bdd394bf0
commit
4855cbc265
|
|
@ -18,3 +18,19 @@ version 0.3.0 - 2026-01-11
|
||||||
|
|
||||||
### BotConfig 设计
|
### BotConfig 设计
|
||||||
- [ ] 精简了配置项,现在只有Nickname和Alias Name了(预期将判断提及移到Adapter端)
|
- [ ] 精简了配置项,现在只有Nickname和Alias Name了(预期将判断提及移到Adapter端)
|
||||||
|
|
||||||
|
### ChatConfig
|
||||||
|
- [x] 迁移了原来在`ChatConfig`中的方法到一个单独的临时类`TempMethodsHFC`中
|
||||||
|
- [x] _parse_range
|
||||||
|
- [x] get_talk_value
|
||||||
|
- [x] 其他上面两个依赖的函数已经合并到这两个函数中
|
||||||
|
|
||||||
|
### ExpressionConfig
|
||||||
|
- [x] 迁移了原来在`ExpressionConfig`中的方法到一个单独的临时类`TempMethodsGroupGenerator`中
|
||||||
|
- [x] get_expression_config_for_chat
|
||||||
|
- [x] 其他上面依赖的函数已经合并到这个函数中
|
||||||
|
|
||||||
|
### ModelConfig
|
||||||
|
- [x] 迁移了原来在`ModelConfig`中的方法到一个单独的临时类`TempMethodsModelConfig`中
|
||||||
|
- [ ] get_model_info
|
||||||
|
- [ ] get_provider
|
||||||
|
|
@ -177,7 +177,11 @@ class DefaultReplyer:
|
||||||
# 统一输出所有日志信息,使用try-except确保即使某个步骤出错也能输出
|
# 统一输出所有日志信息,使用try-except确保即使某个步骤出错也能输出
|
||||||
try:
|
try:
|
||||||
# 1. 输出回复准备日志
|
# 1. 输出回复准备日志
|
||||||
timing_log_str = f"回复准备: {'; '.join(timing_logs)}; {almost_zero_str} <0.1s" if timing_logs or almost_zero_str else "回复准备: 无计时信息"
|
timing_log_str = (
|
||||||
|
f"回复准备: {'; '.join(timing_logs)}; {almost_zero_str} <0.1s"
|
||||||
|
if timing_logs or almost_zero_str
|
||||||
|
else "回复准备: 无计时信息"
|
||||||
|
)
|
||||||
logger.info(timing_log_str)
|
logger.info(timing_log_str)
|
||||||
# 2. 输出Prompt日志
|
# 2. 输出Prompt日志
|
||||||
if global_config.debug.show_replyer_prompt:
|
if global_config.debug.show_replyer_prompt:
|
||||||
|
|
@ -236,7 +240,11 @@ class DefaultReplyer:
|
||||||
# 即使LLM生成失败,也尝试输出已收集的日志信息
|
# 即使LLM生成失败,也尝试输出已收集的日志信息
|
||||||
try:
|
try:
|
||||||
# 1. 输出回复准备日志
|
# 1. 输出回复准备日志
|
||||||
timing_log_str = f"回复准备: {'; '.join(timing_logs)}; {almost_zero_str} <0.1s" if timing_logs or almost_zero_str else "回复准备: 无计时信息"
|
timing_log_str = (
|
||||||
|
f"回复准备: {'; '.join(timing_logs)}; {almost_zero_str} <0.1s"
|
||||||
|
if timing_logs or almost_zero_str
|
||||||
|
else "回复准备: 无计时信息"
|
||||||
|
)
|
||||||
logger.info(timing_log_str)
|
logger.info(timing_log_str)
|
||||||
# 2. 输出Prompt日志
|
# 2. 输出Prompt日志
|
||||||
if global_config.debug.show_replyer_prompt:
|
if global_config.debug.show_replyer_prompt:
|
||||||
|
|
@ -859,7 +867,12 @@ class DefaultReplyer:
|
||||||
self._time_and_run_task(self.build_personality_prompt(), "personality_prompt"),
|
self._time_and_run_task(self.build_personality_prompt(), "personality_prompt"),
|
||||||
self._time_and_run_task(
|
self._time_and_run_task(
|
||||||
build_memory_retrieval_prompt(
|
build_memory_retrieval_prompt(
|
||||||
chat_talking_prompt_short, sender, target, self.chat_stream, think_level=think_level, unknown_words=unknown_words
|
chat_talking_prompt_short,
|
||||||
|
sender,
|
||||||
|
target,
|
||||||
|
self.chat_stream,
|
||||||
|
think_level=think_level,
|
||||||
|
unknown_words=unknown_words,
|
||||||
),
|
),
|
||||||
"memory_retrieval",
|
"memory_retrieval",
|
||||||
),
|
),
|
||||||
|
|
@ -933,7 +946,6 @@ class DefaultReplyer:
|
||||||
else:
|
else:
|
||||||
reply_target_block = ""
|
reply_target_block = ""
|
||||||
|
|
||||||
|
|
||||||
if message_list_before_now_long:
|
if message_list_before_now_long:
|
||||||
latest_msgs = message_list_before_now_long[-int(global_config.chat.max_context_size) :]
|
latest_msgs = message_list_before_now_long[-int(global_config.chat.max_context_size) :]
|
||||||
dialogue_prompt = build_readable_messages(
|
dialogue_prompt = build_readable_messages(
|
||||||
|
|
@ -967,28 +979,33 @@ class DefaultReplyer:
|
||||||
# 兜底:即使 multiple_reply_style 配置异常也不影响正常回复
|
# 兜底:即使 multiple_reply_style 配置异常也不影响正常回复
|
||||||
reply_style = global_config.personality.reply_style
|
reply_style = global_config.personality.reply_style
|
||||||
|
|
||||||
return await global_prompt_manager.format_prompt(
|
return (
|
||||||
prompt_name,
|
await global_prompt_manager.format_prompt(
|
||||||
expression_habits_block=expression_habits_block,
|
prompt_name,
|
||||||
tool_info_block=tool_info,
|
expression_habits_block=expression_habits_block,
|
||||||
bot_name=global_config.bot.nickname,
|
tool_info_block=tool_info,
|
||||||
knowledge_prompt=prompt_info,
|
bot_name=global_config.bot.nickname,
|
||||||
# relation_info_block=relation_info,
|
knowledge_prompt=prompt_info,
|
||||||
extra_info_block=extra_info_block,
|
# relation_info_block=relation_info,
|
||||||
jargon_explanation=jargon_explanation,
|
extra_info_block=extra_info_block,
|
||||||
identity=personality_prompt,
|
jargon_explanation=jargon_explanation,
|
||||||
action_descriptions=actions_info,
|
identity=personality_prompt,
|
||||||
sender_name=sender,
|
action_descriptions=actions_info,
|
||||||
dialogue_prompt=dialogue_prompt,
|
sender_name=sender,
|
||||||
time_block=time_block,
|
dialogue_prompt=dialogue_prompt,
|
||||||
reply_target_block=reply_target_block,
|
time_block=time_block,
|
||||||
reply_style=reply_style,
|
reply_target_block=reply_target_block,
|
||||||
keywords_reaction_prompt=keywords_reaction_prompt,
|
reply_style=reply_style,
|
||||||
moderation_prompt=moderation_prompt_block,
|
keywords_reaction_prompt=keywords_reaction_prompt,
|
||||||
memory_retrieval=memory_retrieval,
|
moderation_prompt=moderation_prompt_block,
|
||||||
chat_prompt=chat_prompt_block,
|
memory_retrieval=memory_retrieval,
|
||||||
planner_reasoning=planner_reasoning,
|
chat_prompt=chat_prompt_block,
|
||||||
), selected_expressions, timing_logs, almost_zero_str
|
planner_reasoning=planner_reasoning,
|
||||||
|
),
|
||||||
|
selected_expressions,
|
||||||
|
timing_logs,
|
||||||
|
almost_zero_str,
|
||||||
|
)
|
||||||
|
|
||||||
async def build_prompt_rewrite_context(
|
async def build_prompt_rewrite_context(
|
||||||
self,
|
self,
|
||||||
|
|
@ -1237,3 +1254,66 @@ def weighted_sample_no_replacement(items, weights, k) -> list:
|
||||||
pool.pop(idx)
|
pool.pop(idx)
|
||||||
break
|
break
|
||||||
return selected
|
return selected
|
||||||
|
|
||||||
|
|
||||||
|
class TempMethodsGroupGenerator:
|
||||||
|
"""用于临时存放一些方法的类"""
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_expression_config_for_chat(chat_stream_id: Optional[str] = None) -> tuple[bool, bool, bool]:
|
||||||
|
"""
|
||||||
|
根据聊天流ID获取表达配置
|
||||||
|
|
||||||
|
Args:
|
||||||
|
chat_stream_id: 聊天流ID,格式为哈希值
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
tuple: (是否使用表达, 是否学习表达, 是否启用jargon学习)
|
||||||
|
"""
|
||||||
|
if not global_config.expression.learning_list:
|
||||||
|
return True, True, True
|
||||||
|
|
||||||
|
if chat_stream_id:
|
||||||
|
for config_item in global_config.expression.learning_list:
|
||||||
|
if not config_item.platform and not config_item.item_id:
|
||||||
|
continue # 这是全局的
|
||||||
|
stream_id = TempMethodsGroupGenerator._get_stream_id(
|
||||||
|
config_item.platform,
|
||||||
|
str(config_item.item_id),
|
||||||
|
(config_item.rule_type == "group"),
|
||||||
|
)
|
||||||
|
if stream_id is None:
|
||||||
|
continue
|
||||||
|
if stream_id == chat_stream_id:
|
||||||
|
continue
|
||||||
|
return config_item.use_expression, config_item.enable_learning, config_item.enable_jargon_learning
|
||||||
|
for config_item in global_config.expression.learning_list:
|
||||||
|
if not config_item.platform and not config_item.item_id:
|
||||||
|
return config_item.use_expression, config_item.enable_learning, config_item.enable_jargon_learning
|
||||||
|
|
||||||
|
return True, True, True
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _get_stream_id(
|
||||||
|
platform: str,
|
||||||
|
id_str: str,
|
||||||
|
is_group: bool = False,
|
||||||
|
) -> Optional[str]:
|
||||||
|
"""
|
||||||
|
根据平台、ID字符串和是否为群聊生成聊天流ID
|
||||||
|
|
||||||
|
Args:
|
||||||
|
platform: 平台名称
|
||||||
|
id_str: 用户或群组的原始ID字符串
|
||||||
|
is_group: 是否为群聊
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: 生成的聊天流ID(哈希值)
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
from src.chat.message_receive.chat_stream import get_chat_manager
|
||||||
|
|
||||||
|
return get_chat_manager().get_stream_id(platform, str(id_str), is_group=is_group)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"生成聊天流ID失败: {e}")
|
||||||
|
return None
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue