refactor(reaction): 重构关键词反应系统为通用反应规则系统

将原有的 `keyword_reaction` 系统重构为一个更通用、更强大的 `reaction` 系统。新系统统一了关键词和正则表达式规则,并增加了按聊天流ID(`chat_stream_id`)进行规则作用域限定的功能。

主要变更包括:
- **统一配置模型**:将 `KeywordReactionConfig` 和 `KeywordRuleConfig` 合并重构为 `ReactionConfig` 和 `ReactionRuleConfig`,提供了更清晰、统一的规则定义方式。
- **增加作用域控制**:新的 `ReactionRuleConfig` 增加了 `chat_stream_id` 字段,允许规则被限定在全局范围或特定的聊天会话中。
- **简化逻辑实现**:`DefaultReplyer` 中的实现被重构,以适应新的配置模型,能够筛选并应用适用范围内的规则。
- **更新配置文件模板**:`bot_config_template.toml` 已更新,以反映新的 `[[reaction.rules]]` 配置结构,并提供了详细的注释说明。
- **新增辅助方法**:在 `ChatStream` 中添加了 `get_raw_id()` 方法,用于获取未哈希的原始聊天流ID,以支持新系统的作用域匹配。

BREAKING CHANGE: 关键词反应功能的配置结构已完全改变。旧的 `[keyword_reaction]` 配置不再兼容。用户需要将原有的 `keyword_rules` 和 `regex_rules` 迁移到新的 `[[reaction.rules]]` 格式。
This commit is contained in:
minecraft1024a
2025-10-26 12:16:37 +08:00
parent 0ed35ff33b
commit ccbac891b6
5 changed files with 105 additions and 72 deletions

View File

@@ -401,32 +401,31 @@ class MoodConfig(ValidatedConfigBase):
mood_update_threshold: float = Field(default=1.0, description="情绪更新阈值")
class KeywordRuleConfig(ValidatedConfigBase):
"""关键词规则配置类"""
class ReactionRuleConfig(ValidatedConfigBase):
"""反应规则配置类"""
keywords: list[str] = Field(default_factory=lambda: [], description="关键词列表")
regex: list[str] = Field(default_factory=lambda: [], description="正则表达式列表")
reaction: str = Field(default="", description="反应内容")
chat_stream_id: str = Field(default="", description='聊天流ID格式为 "platform:id:type",空字符串表示全局')
rule_type: Literal["keyword", "regex"] = Field(..., description='规则类型,必须是 "keyword""regex"')
patterns: list[str] = Field(..., description="关键词或正则表达式列表")
reaction: str = Field(..., description="触发后的回复内容")
def __post_init__(self):
import re
if not self.keywords and not self.regex:
raise ValueError("关键词规则必须至少包含keywords或regex中的一个")
if not self.reaction:
raise ValueError("关键词规则必须包含reaction")
for pattern in self.regex:
try:
re.compile(pattern)
except re.error as e:
raise ValueError(f"无效的正则表达式 '{pattern}': {e!s}") from e
if not self.patterns:
raise ValueError("patterns 列表不能为空")
if self.rule_type == "regex":
for pattern in self.patterns:
try:
re.compile(pattern)
except re.error as e:
raise ValueError(f"无效的正则表达式 '{pattern}': {e!s}") from e
class KeywordReactionConfig(ValidatedConfigBase):
"""关键词配置"""
class ReactionConfig(ValidatedConfigBase):
"""反应规则系统配置"""
keyword_rules: list[KeywordRuleConfig] = Field(default_factory=lambda: [], description="关键词规则列表")
regex_rules: list[KeywordRuleConfig] = Field(default_factory=lambda: [], description="正则表达式规则列表")
rules: list[ReactionRuleConfig] = Field(default_factory=list, description="反应规则列表")
class CustomPromptConfig(ValidatedConfigBase):