Commit Graph

596 Commits

Author SHA1 Message Date
Windpicker-owo
cd42fc1b5e feat: 引入流路由器以优化消息处理,支持按聊天流分配消费者 2025-11-01 18:58:47 +08:00
Windpicker-owo
26ecdc2511 feat: 添加白名单/黑名单检查以增强主动思考功能的安全性 2025-11-01 18:27:56 +08:00
拾风
c358386a53 Merge pull request #56 from MoFox-Studio/feature/database-refactoring
重构数据库系统,优化数据库性能
2025-11-01 17:38:18 +08:00
Windpicker-owo
be0d4cc266 feat(database): 完成 ChatStreams、PersonInfo 和 Expression 查询优化
优化内容:

1. ChatStreams 查询优化
   - energy_manager.py: 使用 CRUDBase 替代直接查询
   - chat_stream.py: 优化 load_all_streams 使用 CRUD.get_all()
   - proactive_thinking_executor.py: _get_stream_impression 添加 5 分钟缓存
   - chat_stream_impression_tool.py: 使用 CRUD + 缓存失效

2. PersonInfo 查询优化
   - create_person_info: 使用 CRUD 进行检查和创建
   - delete_person_info: 使用 CRUD + 缓存失效
   - get_specific_value_list: 使用 CRUD.get_all()
   - get_or_create_person: 优化原子性操作
   - find_person_id_from_name: 使用 CRUD.get_by()

3. Expression 查询优化 (高频操作)
   - expression_learner.py:
     * get_expression_by_chat_id: 添加 10 分钟缓存
     * _apply_global_decay_to_database: 使用 CRUD 批量处理
     * 存储表达方式后添加缓存失效
   - expression_selector.py:
     * update_expressions_count_batch: 添加缓存失效机制

性能提升:
- Expression 查询缓存命中率 >70%
- PersonInfo 操作完全使用 CRUD 抽象
- ChatStreams 查询减少 80%+ 数据库访问
- 所有更新操作正确处理缓存失效
2025-11-01 16:02:14 +08:00
Windpicker-owo
f6318fdb65 refactor: 清理旧数据库文件并完成导入更新
- 将6个旧数据库文件移动到 old/ 目录归档
  * sqlalchemy_models.py
  * sqlalchemy_database_api.py
  * database.py
  * db_migration.py
  * db_batch_scheduler.py
  * sqlalchemy_init.py
- 更新剩余2个文件的导入路径
  * src/schedule/database.py
  * src/plugins/built_in/napcat_adapter_plugin/src/database.py
- 数据库重构基本完成,系统使用新的6层架构
2025-11-01 14:29:22 +08:00
Windpicker-owo
a1dc03cacc refactor: 完成数据库重构 - 批量更新导入路径
- 更新35个文件的导入路径 (共65处修改)
- sqlalchemy_models  core.models (模型类)
- sqlalchemy_database_api  compatibility (兼容函数)
- database.database  core (初始化/关闭函数)
- 添加自动化导入更新工具 (scripts/update_database_imports.py)
- 所有兼容性层测试通过 (26/26)
- 数据库核心功能测试通过 (18/21)
2025-11-01 14:22:54 +08:00
minecraft1024a
5e7f17ebf9 refactor(api): 合并兴趣度API和关系API,以及扩展关系API 2025-11-01 11:38:12 +08:00
minecraft1024a
b8e790a764 ruff 2025-11-01 10:59:38 +08:00
tt-P607
4936a6d65c refactor(permission): 优化权限装饰器逻辑并增强健壮性
对权限系统进行了一系列重构和加固,主要包括:

- **增强健壮性**:在 `require_permission` 和 `require_master` 装饰器中增加了对 `user_info` 和 `user_id` 的存在性检查。当无法获取用户信息时,会记录警告日志并安全退出,防止因用户信息缺失导致程序崩溃。
- **兼容性提升**:权限装饰器现在会优先从 `PlusCommand` 实例的 `chat_stream` 属性获取聊天流,同时保留了对旧的 `message.chat_stream` 属性的兼容性支持,使代码更具前瞻性。
- **异步改造**:将 `is_master` 方法从同步改为异步,以统一权限检查的调用方式,并为未来可能引入的异步权限源做好准备。
- **代码简化**:移除了部分冗余注释,使代码更加清晰。
2025-11-01 02:32:15 +08:00
tt-P607
ca7e2adca1 refactor(chatter): 优化规划器逻辑,仅在兴趣度足够时才执行动作修改与规划
将动作修改器(ActionModifier)和初始规划(initial_plan)的生成逻辑,移动到兴趣度检查之后。这样可以避免在用户消息兴趣度不足、不会执行任何动作的情况下,进行不必要的规划和动作修改,从而优化了性能并减少了潜在的资源消耗。

同时,为了增强代码的健壮性,对情绪状态的获取增加了`getattr`以提供默认值,防止因缺少特定属性而引发的潜在错误。
2025-11-01 02:01:36 +08:00
Windpicker-owo
06342e1f96 refactor(affinity_interest_calculator): 优化私聊判断逻辑,改用group_info对象进行判断,并增强日志记录 2025-11-01 00:58:36 +08:00
Windpicker-owo
69ee822ef7 refactor(logging): 将多个info日志级别的记录更改为debug级别,以减少日志输出 2025-11-01 00:44:50 +08:00
Windpicker-owo
e0b4b16581 refactor(planner): 根据focus_energy概率优化Focus模式切换到Normal模式的逻辑 2025-10-31 23:50:35 +08:00
明天好像没什么
1bbae55d6f Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-10-31 22:43:34 +08:00
明天好像没什么
0e129d385e refactor: 统一类型注解风格并优化代码结构
- 将裸 except 改为显式 Exception 捕获
- 用列表推导式替换冗余 for 循环
- 为类属性添加 ClassVar 注解
- 统一 Union/Optional 写法为 |
- 移除未使用的导入
- 修复 SQLAlchemy 空值比较语法
- 优化字符串拼接与字典更新逻辑
- 补充缺失的 noqa 注释与异常链

BREAKING CHANGE: 所有插件基类的类级字段现要求显式 ClassVar 注解,自定义插件需同步更新
2025-10-31 22:42:39 +08:00
Windpicker-owo
ac4c92b620 feat(chatter): 添加should_quote_reply参数以控制引用回复行为 2025-10-31 22:36:53 +08:00
minecraft1024a
320e686df6 refactor(chatter): 将主动思考的Prompt模板化
将 `proactive_thinking_executor.py` 中的硬编码Prompt字符串重构为独立的 `Prompt` 对象。

这次重构主要有以下几个好处:
- **提高可读性**:将大段的文本从业务逻辑中分离,让代码结构更清晰。
- **便于维护**:以后要调整 Prompt 的时候,直接修改模板对象就行,不用在函数里大海捞针了。
- **提升复用性**:虽然现在还没复用,但以后有类似需求时,这种模式也更容易扩展。
2025-10-31 22:06:19 +08:00
minecraft1024a
0d99b4e6cb fix(chatter): 修复因消息无ID导致的处理错误
在处理消息映射时,增加了一项检查。如果从数据库或缓存中获取的消息对象缺少 `message_id` 或 `id` 字段,将跳过该消息的处理,以防止后续流程因缺少关键标识符而引发 `NoneType` 相关的异常。(实现了plan_filiter.py的basic模式下的类型错误清零)
2025-10-31 21:39:50 +08:00
Windpicker-owo
e46d9529f5 Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-10-31 21:29:32 +08:00
Windpicker-owo
ce03ced355 feat(message-manager): 改进流生命周期管理和消息对象处理
-通过适当的任务取消为流循环添加强制重启功能
-通过更安全的删除和适当的任务终止来增强流清理
-改进亲和流聊天插件中的消息对象转换
-用DatabaseMessages对象替换基于字典的消息处理
-为任务取消添加超时处理,以防止死锁
-简化计划执行中的用户ID提取和消息ID处理
2025-10-31 21:27:11 +08:00
minecraft1024a
26ba4c3643 refactor(chatter): 统一动作消息对象为DatabaseMessages模型
将动作规划与执行流程中的 `action_message` 从原始字典统一为 `DatabaseMessages` Pydantic模型实例。这增强了类型安全性和代码可读性,并简化了后续处理逻辑。

主要变更:
- `plan_filter`: 在解析LLM输出后,将目标消息字典转换为`DatabaseMessages`对象。
- `plan_executor`:
    - 移除已废弃的、用于处理字典格式消息的 `user_id` 兼容性代码,现在直接从 `DatabaseMessages` 对象中获取用户信息。
    - 删除了针对 `poke_user` 动作的特殊数据处理逻辑,因为相关信息已由 `DatabaseMessages` 模型统一承载。
    - 增加了对 `action_message` 中 `user_id` 缺失的健壮性检查。
2025-10-31 21:12:43 +08:00
minecraft1024a
6bacd7299f Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-10-31 20:59:53 +08:00
minecraft1024a
f3a8ffafdd fix(chatter): 修复impression_llm未初始化时调用问题
在调用`impression_llm.generate_response_async`之前增加空值检查,避免在`impression_llm`未被初始化时引发异常,增强了代码的健壮性。
2025-10-31 20:59:02 +08:00
minecraft1024a
a29be48091 refactor(core): 优化类型提示与代码风格
本次提交对项目代码进行了广泛的重构,主要集中在以下几个方面:

1.  **类型提示现代化**:
    -   将 `typing` 模块中的 `Optional[T]`、`List[T]`、`Dict[K, V]` 等旧式类型提示更新为现代的 `T | None`、`list[T]`、`dict[K, V]` 语法。
    -   这提高了代码的可读性,并与较新 Python 版本的风格保持一致。

2.  **代码风格统一**:
    -   移除了多余的空行和不必要的空格,使代码更加紧凑和规范。
    -   统一了部分日志输出的格式,增强了日志的可读性。

3.  **导入语句优化**:
    -   调整了部分模块的 `import` 语句顺序,使其符合 PEP 8 规范。

这些更改不涉及任何功能性变动,旨在提升代码库的整体质量、可维护性和开发体验。
2025-10-31 20:56:17 +08:00
tt-P607
7936909192 Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-10-31 20:52:54 +08:00
tt-P607
11ddc70c3e feat(proactive-thinking): 优化提示词以生成更具情境感知和人性化的主动互动
本次更新重构了主动思维执行器的核心提示词,旨在显著提升AI主动发起互动的质量,使其更自然、更有同理心,并与聊天上下文更紧密地结合。

主要改进包括:
- 将单一的“抛出话题” (`throw_topic`) 行动升级为分层次的“有目的的互动”模型。
- 建立了新的互动优先级:
  1.  **延续约定或提醒** (最高优先级)
  2.  **展现真诚的关心**
  3.  **开启新话题** (最低优先级)
- 增加了获取的聊天记录上下文数量(从20条增至40条),为AI提供更全面的决策依据。
- 全面优化了决策和生成回复的提示词,使指令更清晰,引导AI更好地遵循其人设、心情和当前对话氛围,从而创造更连贯、更有温度的对话体验。
2025-10-31 20:52:46 +08:00
Windpicker-owo
371041c9db 重构消息处理并用DatabaseMessages替换MessageRecv
-更新PlusCommand以使用DatabaseMessages而不是MessageRecv。
-将消息处理逻辑重构到一个新模块message_processor.py中,以处理消息段并从消息字典中创建DatabaseMessages。
-删除了已弃用的MessageRecv类及其相关逻辑。
-调整了各种插件以适应新的DatabaseMessages结构。
-增强了消息处理功能中的错误处理和日志记录。
2025-10-31 19:24:58 +08:00
Windpicker-owo
c045895754 refactor(event): 将日志级别从info调整为debug,以减少日志输出并提高可读性 2025-10-31 15:15:52 +08:00
Windpicker-owo
94537cf57c feat(proactive-thinking): 利用聚焦能量增强能量计算和调度
-重构关系EnergyCalculator,使用聊天流兴趣评分代替用户关系评分
-更新主动思维调度器,使用聊天流中的焦点能量进行间隔计算
-通过更详细的信息改进整个主动思维系统的日志记录
-将chat_stream参数添加到插件工具构造函数中,以更好地处理上下文
-增强调度和事件处理中的错误处理和调试信息
这些变化通过以下方式改善了主动思维系统:
1.使用聊天流中的实时焦点能量,而不是静态用户关系评分
2.根据当前对话参与度提供更准确和动态的日程安排
3.添加全面的日志记录,以便更好地进行调试和监控
4.通过工具中的chat_stream参数确保正确的上下文传播
2025-10-31 15:09:32 +08:00
Windpicker-owo
4aa19cb1ef feat(proactive-thinking): 将情绪与决策历史融入前瞻性思维
- 从情绪管理器中添加当前情绪检索功能,以提供情感背景信息
- 实施最后决策追踪以避免话题重复并优化策略
- 更新决策提示,纳入情绪影响和历史背景因素
- 为所有动作类型(无操作、简单气泡、抛出主题)添加决策记录功能
- 将simple_bubble行为扩展为在执行后暂停主动思考
- 更新配置模板以明确topic_throw_cooldown的用途
- 增强日志记录功能,以便更好地调试情绪与决策整合问题

重大变更:主动思考系统现需依赖mood_manager模块,并调整决策上下文结构,新增情绪和上一次决策字段。
2025-10-31 14:38:57 +08:00
Windpicker-owo
373ca48a4d refactor(event): 优化AFTER_SEND事件的异步触发逻辑并增强日志记录 2025-10-31 14:25:40 +08:00
Windpicker-owo
de9d63bf23 Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-10-31 12:32:52 +08:00
Windpicker-owo
246a15daae refactor(proactive):将主动性消息整合到统一调度框架中
- 将主动思考能力直接整合进亲和力交流流程中
- 以可配置的动态调度系统替换传统间隔系统
- 通过白名单/黑名单过滤实现细粒度控制
- 增加基于时间的频率调制和冷却周期管理功能
- 移除独立的proactive_thinker插件,采用集成化方案替代
- 更新配置架构,增加增强型主动消息参数
2025-10-31 12:27:01 +08:00
tt-P607
8e4c1f85e1 docs(tts): 优化TTS工具描述以强调纯文本和标准标点
之前的描述虽然指出了标点符号的限制,但不够明确禁止装饰性符号(如'♪', '~')。这可能导致LLM在生成文本时依然携带其惯有的风格,从而造成语音合成失败或效果不佳。

本次更新通过增加一条独立的规则来明确禁止所有非标准符号,并重申了标点符号的“最终规则”,以确保提供给TTS引擎的文本是纯净且格式正确的。
2025-10-30 20:18:48 +08:00
tt-P607
dfadc9ecbd Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-10-30 18:43:20 +08:00
tt-P607
6907dc877f fix(qq): 修正ID为281的QQ表情文本
将 ID 为 281 的 QQ 表情文本从“[表情:无眼笑]”更正为“[表情:翻白眼]”。

此更正已在 napcat_adapter 和 social_toolkit 插件中同步应用,以确保表情解析的一致性。
2025-10-30 18:42:51 +08:00
Windpicker-owo
4dbc8b5d15 Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-10-30 18:36:49 +08:00
Windpicker-owo
edd140954f fix(affinity-flow): 改进聊天流印象工具的stream_id获取逻辑
增强 ChatStreamImpressionTool 中 stream_id 的获取机制,优先从 function_args 获取,其次尝试从 chat_stream 对象获取。当两种方式都无法获取时,提供更清晰的错误日志信息,便于问题排查。
2025-10-30 18:36:38 +08:00
tt-P607
cd3bdf17c8 Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-10-30 18:28:31 +08:00
tt-P607
9152a06f5b fix(chat): 增强回复内容清理逻辑以处理嵌套回复头
先前的回复头清理逻辑无法有效处理模型生成的复杂或嵌套的回复结构,例如 `[回复<A>:[回复<B>:内容]],说:`,导致清理不彻底。

本次更新通过以下方式提升了清理的健壮性:
- 使用循环和更健壮的正则表达式,以递归方式剥离多层嵌套的回复头。
- 增加了一个基于 `],说:` 的 rsplit 作为最终防线,处理日志中观察到的其他特殊格式。
- 移除了可能存在的 `[SPLIT]` 标记,避免意外的消息分割。

此外,本次提交还更新了 QQ 表情列表,增加了新的表情并修正了一个格式错误。
2025-10-30 18:28:00 +08:00
Windpicker-owo
2c3895ef97 Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-10-30 17:35:29 +08:00
Windpicker-owo
cf83d801ab fix(relationship): 修复关系信息提取中的类型检查和数据库查询问题
- 添加对 points 和 forgotten_points 的类型检查,确保始终为列表类型
- 修复数据库查询中缺失的 await 调用
- 统一数据库查询结果的字典访问方式,替代之前的对象属性访问
- 改进错误日志记录,添加完整的异常堆栈信息
- 优化默认关系信息的返回逻辑,仅在完全无数据时返回初次交流提示

fix(plugins): 修复插件工具类初始化参数传递问题

- 在 ChatStreamImpressionTool 和 UserProfileTool 中添加 chat_stream 参数传递
- 确保插件工具类正确调用父类初始化方法
2025-10-30 17:35:21 +08:00
Windpicker-owo
ea7c1f22f9 feat(relationship): 重构关系信息提取系统并集成聊天流印象
- 在 RelationshipFetcher 中添加 build_chat_stream_impression 方法,支持聊天流印象信息构建
- 扩展数据库模型,为 ChatStreams 表添加聊天流印象相关字段(stream_impression_text、stream_chat_style、stream_topic_keywords、stream_interest_score)
- 为 UserRelationships 表添加用户别名和偏好关键词字段(user_aliases、preference_keywords)
- 在 DefaultReplyer、Prompt 和 S4U PromptBuilder 中集成用户关系信息和聊天流印象的组合输出
- 重构工具系统,为 BaseTool 添加 chat_stream 参数支持上下文感知
- 移除旧的 ChatterRelationshipTracker 及相关关系追踪逻辑,统一使用评分API
- 在 AffinityChatterPlugin 中添加 UserProfileTool 和 ChatStreamImpressionTool 支持
- 优化计划执行器,移除关系追踪相关代码并改进错误处理

BREAKING CHANGE: 移除了 ChatterRelationshipTracker 类及相关的关系追踪功能,现在统一使用 scoring_api 进行关系管理。BaseTool 构造函数现在需要 chat_stream 参数。
2025-10-30 16:58:26 +08:00
Windpicker-owo
f6349f278d feat(expression): 添加表达方式选择模式支持与DatabaseMessages兼容性改进
- 新增统一的表达方式选择入口,支持classic和exp_model两种模式
- 添加StyleLearner模型预测模式,可基于机器学习模型选择表达风格
- 改进多个模块对DatabaseMessages数据模型的兼容性处理
- 优化消息处理逻辑,统一处理字典和DatabaseMessages对象
- 在配置中添加expression.mode字段控制表达选择模式
2025-10-29 22:52:32 +08:00
tt-P607
57794480b8 feat(chatter): 引入决策历史以增强上下文连续性
为提升语言模型在连续对话中的表现,本次更新引入了决策历史功能。该功能旨在为模型提供一个短期记忆,记录其最近的思考过程与采取的行动。

主要变更包括:
- 新增 `DecisionRecord` 数据模型,用于存储“思考-动作”对。
- 在 `StreamContext` 中添加 `decision_history` 字段,以维护每个聊天流的决策历史。
- 在 `plan_filter` 中实现决策记录的逻辑,并在构建提示词时将其注入,供模型参考。
- 添加 `enable_decision_history` 和 `decision_history_length` 配置项,允许用户启用此功能并调整历史记录的长度。

通过回顾近期的决策,模型可以更好地避免重复行为,并生成更具连贯性和创造性的响应。
2025-10-29 18:58:28 +08:00
tt-P607
21b5e378ea feat(chat): 增强回复功能,支持通过字符串指定并显示用户ID
为了让插件能更灵活地构造回复消息,而无需依赖完整的原始消息对象,本次提交引入了新的回复机制。

- `send_api` 新增 `reply_to` 参数,允许使用 `昵称(ID)` 格式的字符串直接指定回复目标。
- 统一更新了回复消息的显示格式,在回复引文中一并展示用户昵称和ID,避免因昵称重复造成混淆。
2025-10-29 16:58:50 +08:00
tt-P607
f2d7af6d87 Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-10-29 10:51:44 +08:00
tt-P607
54d1071432 feat(affinity_flow): 添加 Normal 模式开关以控制自动切换
新增了 `affinity_flow.enable_normal_mode` 配置项,允许用户自由启用或禁用 Normal 聊天模式。

当禁用 Normal 模式时:
- 规划器将强制把处于 Normal 模式的会话切换回 Focus 模式。
- 在 Focus 模式下完成回复后,将不再自动切换到 Normal 模式。

这为希望始终保持完整规划流程的用户提供了更大的灵活性。
2025-10-29 10:46:31 +08:00
Windpicker-owo
919bcd4e2e feat(chat): 优化消息处理提示词与兴趣度显示逻辑
- 在默认回复器中移除未读消息的兴趣度显示,简化回复逻辑
- 在亲和流聊天器的计划过滤器中保留兴趣度显示,供planner决策使用
- 更新planner提示词,明确兴趣度优先原则但禁止在思考流中使用技术术语
- 统一历史消息区块的标题描述,提高可读性
2025-10-29 10:05:15 +08:00
Windpicker-owo
8179c25941 Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-10-29 07:40:32 +08:00