fix:表达和聊天配置项为0时bug

pull/1414/head
SengokuCola 2025-12-05 21:23:00 +08:00
parent bc045a0c85
commit 34825abaa7
3 changed files with 47 additions and 12 deletions

View File

@ -173,7 +173,11 @@ class ChatConfig(ConfigBase):
def get_talk_value(self, chat_id: Optional[str]) -> float:
"""根据规则返回当前 chat 的动态 talk_value未匹配则回退到基础值。"""
if not self.enable_talk_value_rules or not self.talk_value_rules:
return self.talk_value
result = self.talk_value
# 防止返回0值自动转换为0.0001
if result == 0:
return 0.0000001
return result
now_min = self._now_minutes()
@ -199,7 +203,11 @@ class ChatConfig(ConfigBase):
start_min, end_min = parsed
if self._in_range(now_min, start_min, end_min):
try:
return float(value)
result = float(value)
# 防止返回0值自动转换为0.0001
if result == 0:
return 0.0000001
return result
except Exception:
continue
@ -218,12 +226,20 @@ class ChatConfig(ConfigBase):
start_min, end_min = parsed
if self._in_range(now_min, start_min, end_min):
try:
return float(value)
result = float(value)
# 防止返回0值自动转换为0.0001
if result == 0:
return 0.0000001
return result
except Exception:
continue
# 3) 未命中规则返回基础值
return self.talk_value
result = self.talk_value
# 防止返回0值自动转换为0.0001
if result == 0:
return 0.0000001
return result
@dataclass
@ -345,22 +361,30 @@ class ExpressionConfig(ConfigBase):
tuple: (是否使用表达, 是否学习表达, 学习间隔)
"""
if not self.learning_list:
# 如果没有配置,使用默认值:启用表达,启用学习,300秒间隔
return True, True, 300
# 如果没有配置,使用默认值:启用表达,启用学习,学习强度1.0(对应300秒间隔
return True, True, 1.0
# 优先检查聊天流特定的配置
if chat_stream_id:
specific_expression_config = self._get_stream_specific_config(chat_stream_id)
if specific_expression_config is not None:
return specific_expression_config
use_expression, enable_learning, learning_intensity = specific_expression_config
# 防止学习强度为0自动转换为0.0001
if learning_intensity == 0:
learning_intensity = 0.0000001
return use_expression, enable_learning, learning_intensity
# 检查全局配置(第一个元素为空字符串的配置)
global_expression_config = self._get_global_config()
if global_expression_config is not None:
return global_expression_config
use_expression, enable_learning, learning_intensity = global_expression_config
# 防止学习强度为0自动转换为0.0001
if learning_intensity == 0:
learning_intensity = 0.0000001
return use_expression, enable_learning, learning_intensity
# 如果都没有匹配,返回默认值
return True, True, 300
# 如果都没有匹配,返回默认值启用表达启用学习学习强度1.0对应300秒间隔
return True, True, 1.0
def _get_stream_specific_config(self, chat_stream_id: str) -> Optional[tuple[bool, bool, int]]:
"""
@ -396,6 +420,9 @@ class ExpressionConfig(ConfigBase):
use_expression: bool = config_item[1].lower() == "enable"
enable_learning: bool = config_item[2].lower() == "enable"
learning_intensity: float = float(config_item[3])
# 防止学习强度为0自动转换为0.0001
if learning_intensity == 0:
learning_intensity = 0.0000001
return use_expression, enable_learning, learning_intensity # type: ignore
except (ValueError, IndexError):
continue
@ -419,6 +446,9 @@ class ExpressionConfig(ConfigBase):
use_expression: bool = config_item[1].lower() == "enable"
enable_learning: bool = config_item[2].lower() == "enable"
learning_intensity = float(config_item[3])
# 防止学习强度为0自动转换为0.0001
if learning_intensity == 0:
learning_intensity = 0.0000001
return use_expression, enable_learning, learning_intensity # type: ignore
except (ValueError, IndexError):
continue

View File

@ -86,6 +86,10 @@ class ExpressionLearner:
_, self.enable_learning, self.learning_intensity = global_config.expression.get_expression_config_for_chat(
self.chat_id
)
# 防止除以零如果学习强度为0或负数使用最小值0.0001
if self.learning_intensity <= 0:
logger.warning(f"学习强度为 {self.learning_intensity},已自动调整为 0.0001 以避免除以零错误")
self.learning_intensity = 0.0000001
self.min_messages_for_learning = 15 / self.learning_intensity # 触发学习所需的最少消息数
self.min_learning_interval = 120 / self.learning_intensity

View File

@ -69,6 +69,7 @@ learning_list = [ # 表达学习配置列表,支持按聊天流配置
# 第三位: 是否学习表达 ("enable"/"disable")
# 第四位: 学习强度(浮点数),影响学习频率,最短学习时间间隔 = 300/学习强度(秒)
# 学习强度越高,学习越频繁;学习强度越低,学习越少
# 如果学习强度设置为0会自动转换为0.0001以避免除以零错误
]
expression_groups = [
@ -86,7 +87,7 @@ allow_reflect = [] # 允许进行表达反思的聊天流ID列表格式["q
[chat] # 麦麦的聊天设置
talk_value = 1 # 聊天频率越小越沉默范围0-1
talk_value = 1 # 聊天频率越小越沉默范围0-1如果设置为0会自动转换为0.0001以避免除以零错误
mentioned_bot_reply = true # 是否启用提及必回复
max_context_size = 30 # 上下文长度
planner_smooth = 2 # 规划器平滑增大数值会减小planner负荷略微降低反应速度推荐1-50为关闭必须大于等于0
@ -97,7 +98,7 @@ enable_talk_value_rules = true # 是否启用动态发言频率规则
# 推荐格式(对象数组):{ target="platform:id:type" 或 "", time="HH:MM-HH:MM", value=0.5 }
# 说明:
# - target 为空字符串表示全局type 为 group/private例如"qq:1919810:group" 或 "qq:114514:private"
# - 支持跨夜区间,例如 "23:00-02:00";数值范围建议 0-1
# - 支持跨夜区间,例如 "23:00-02:00";数值范围建议 0-1,如果 value 设置为0会自动转换为0.0001以避免除以零错误
talk_value_rules = [
{ target = "", time = "00:00-08:59", value = 0.8 },
{ target = "", time = "09:00-22:59", value = 1.0 },