Commit Graph

801 Commits

Author SHA1 Message Date
Windpicker-owo
a349809c5d Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-11-04 23:14:02 +08:00
Windpicker-owo
ca70ae1563 refactor: 将流循环管理器替换为调度器分发器以处理消息
- 引入SchedulerDispatcher以通过统一调度器管理消息分发。
- 更新了MessageManager以使用新的调度器,移除了旧的流循环管理功能。
- 增强了 add_message 方法,以便在接收消息时通知调度器。
- 已移除废弃的中断处理方法,将其逻辑整合至调度器中。
- 修改了action_manager,改为等待数据库操作而非使用asyncio.create_task以实现更精细的控制。
- 优化了统一调度器,支持并发任务执行及运行中任务的取消。
- 为重构流程和新架构添加了全面的文档说明。
2025-11-04 23:13:52 +08:00
tt-P607
b79ae93da6 feat(chat): 过滤表情包消息以避免触发聊天
硬编码增加了一个过滤器,在消息处理的入口处(MessageManager.add_message)对以 [表情包 开头的消息进行拦截。

此举旨在防止纯表情包消息进入聊天流程,从而避免决策模型因无法理解“抽象”内容而作出不当回应或浪费资源。
2025-11-04 11:17:04 +08:00
tt-P607
d0aa090cc1 Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-11-04 08:20:48 +08:00
tt-P607
445b90560a fix(replyer): 移除历史记录的硬编码上限
修复了在构建聊天记录上下文时,已读历史消息被硬编码截断为50条的问题。

现在,`build_s4u_chat_history_prompts` 及其回退方法将完全遵循 `max_context_size` 配置,确保模型能获取到完整的上下文信息。
2025-11-04 08:20:41 +08:00
Windpicker-owo
ac964b9753 fix(affinity-interest-calculator): 限制总分和兴趣匹配分数上限为1.0,确保评分合理 2025-11-04 00:37:40 +08:00
Windpicker-owo
b97470cf60 refactor(chat): 将用户引用处理从同步改为异步,优化性能 2025-11-03 23:11:49 +08:00
Windpicker-owo
fa0559f7d4 refactor(message_processor): 移除单段消息处理中的日志记录 2025-11-03 22:28:23 +08:00
Windpicker-owo
a6d2aee781 feat(affinity-flow): 通过标签扩展与提及分类增强兴趣匹配
- 实施扩展标签描述以实现更精确的语义匹配
- 增加强/弱提及分类,并附带独立的兴趣评分
- 重构机器人兴趣管理器,采用动态嵌入生成与缓存机制
- 通过增强的@提及处理功能优化消息处理
- 更新配置以支持回帖提升机制
- 将亲和力流量聊天重新组织为模块化结构,包含核心、规划器、主动响应和工具子模块
- 移除已弃用的规划器组件并整合功能
- 为napcat适配器插件添加数据库表初始化功能
- 修复元事件处理器中的心跳监控
2025-11-03 22:24:51 +08:00
Windpicker-owo
eeb77e0e3c feat(emoji): 使用QueryBuilder优化数据库查询并启用缓存 2025-11-03 15:36:30 +08:00
Windpicker-owo
f1989fcf51 Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-11-02 12:18:57 +08:00
Windpicker-owo
d1c3d2196a refactor(json_parser): 统一 LLM 响应的 JSON 解析逻辑,简化代码并提高解析成功率 2025-11-02 12:18:53 +08:00
minecraft1024a
062446319a fix(emoji): 确保表情包目录在管理器初始化时存在
在 `EmojiManager` 初始化时,增加对表情包目录存在性的检查和创建。这可以防止因目录不存在而导致后续表情包操作(如保存、加载)失败的问题。
2025-11-02 12:13:27 +08:00
Windpicker-owo
bd1624a018 Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-11-02 11:48:47 +08:00
Windpicker-owo
8126ab0747 refactor(expression_learner): 添加过滤机器人消息的功能,以优化学习过程 2025-11-02 11:48:33 +08:00
tt-P607
be7fe56372 refactor(replyer): tmd回复模型你再犯个蠢事试试?😡😡😡老子都这样子严防死守了,你要是还犯蠢我当场********************👿👿👿 2025-11-02 09:48:58 +08:00
tt-P607
f981cd2051 fix(replyer): 优化回复器提示词以修复戳一戳处理逻辑
- **问题现象:**
  回复模型(Replyer)在接收到“戳一戳”事件时,会错误地生成如“[戳了戳]”之类的文本回复,而不是交由动作执行器(Planner)处理`poke_user`动作。

- **根本原因:**
  1.  回复提示词模板中没有明确禁止输出此类文本,导致模型将其视为普通消息进行模仿。
  2.  模板中关于“可用动作”的描述不够明确,可能让回复模型误以为自己需要处理或决定这些动作。

- **解决方案:**
  1.  **增强指令:** 在所有核心回复模板 (`default_expressor_prompt`, `s4u_style_prompt`, `normal_style_prompt`) 中,明确增加了“‘戳一戳’不是文本消息,而是由`poke_user`动作处理的特殊互动,因此绝对禁止在回复中输出相关文字”的规则。
  2.  **明确职责:** 修改了 `build_prompt_reply_context` 方法中生成`action_descriptions`的逻辑,向回复模型强调其职责仅是生成回复文本,而动作的决策与执行由独立的模型负责,严禁其在回复中模仿或调用动作。

- **影响:**
  - 修复了“戳一戳”互动被错误处理为文本回复的BUG。
  - 增强了提示词的鲁棒性,明确了回复模型与决策模型之间的职责边界,降低了未来类似问题的发生概率。
2025-11-02 09:33:19 +08:00
tt-P607
461f119406 Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-11-01 23:57:31 +08:00
tt-P607
62560e52a4 refactor(planner): 显式注入 chat_content 至动作实例
将 `chat_content` 强制注入到动作实例中,以 `_activation_chat_content` 属性存储。

此举解决了在 `go_activate` 内部的辅助函数无法访问原始用户聊天上下文的问题,确保了相关函数能够获取必要的上下文信息。
2025-11-01 23:57:21 +08:00
Windpicker-owo
a30ee4ae8a refactor(memory_builder): 增强JSON提取策略,支持多种格式并添加调试日志 2025-11-01 23:14:30 +08:00
Windpicker-owo
63d5e948d2 refactor(planner): 将缓存消息刷新逻辑移至规划器开始时执行 2025-11-01 22:37:38 +08:00
tt-P607
aaf3e8f544 refactor(emoji_system): 将表情分析重构为单次VLM调用
先前的实现需要为表情生成详细描述、提取关键词和精炼句子进行三次独立的AI模型调用。这种方法效率低下、速度慢,且容易出错。

本次重构引入了一个统一的VLM提示词,该提示词要求模型一次性返回包含所有需要信息的JSON对象(详细描述、关键词、精炼句子和合规性检查),从而将多次调用合并为一次。

主要优势:
- **效率提升**:将API调用次数从3次减少到1次,显著提高了处理速度并降低了成本。
- **可靠性增强**:解析结构化的JSON比处理多次调用的非结构化文本更加健壮。
- **向后兼容**:增加了对旧版描述格式的解析逻辑,以兼容已存在的表情数据。
2025-11-01 21:49:25 +08:00
明天好像没什么
30658afdb4 ruff归零 2025-11-01 21:32:41 +08:00
明天好像没什么
cb97b2d8d3 rufffffff 2025-11-01 21:10:01 +08:00
Windpicker-owo
a83fe72717 Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-11-01 19:35:05 +08:00
Windpicker-owo
e0063fb281 feat: 在获取聊天流时添加创建时间和最后活跃时间字段 2025-11-01 19:34:51 +08:00
minecraft1024a
724fdd6827 Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-11-01 19:31:39 +08:00
minecraft1024a
5f384da489 refactor(chat): 简化日程状态提示逻辑
删除了在日程活动时间范围之外的冗余状态判断。现在,无论当前时间是否在活动时间段内,都会统一计算并展示活动的开始、结束、已进行和剩余时间,简化了代码逻辑并确保了信息展示的一致性。反正LLM自己会判断的,不需要咱操心那么多啦。
2025-11-01 19:31:34 +08:00
Windpicker-owo
84844ea6e8 fix: 修复批量消息存储缺失字段导致的NOT NULL约束失败 2025-11-01 17:59:01 +08:00
Windpicker-owo
3265638e17 merge: 合并feature/database-refactoring的关键bug修复和性能优化 2025-11-01 17:47:28 +08:00
Windpicker-owo
45be95b83d perf: 优化批量消息存储,使用insert().values()替代add_all() 2025-11-01 17:43:47 +08:00
拾风
c358386a53 Merge pull request #56 from MoFox-Studio/feature/database-refactoring
重构数据库系统,优化数据库性能
2025-11-01 17:38:18 +08:00
minecraft1024a
8d422d5bb5 refactor(chat): 移除旧的聊天频率分析器模块(原来我还有个测试性功能没写啊,那删了吧())
整个 `frequency_analyzer` 模块已被移除。此模块的功能(如主动聊天触发)已被弃用或计划在未来通过更通用的机制重新实现,例如基于事件总线和插件系统的交互策略。

移除此模块可以简化代码库,并消除对已移动或重构的旧组件(如 AFC 管理器)的依赖。
2025-11-01 16:59:32 +08:00
minecraft1024a
af5d75b463 回复器你不许传dict 2025-11-01 16:56:44 +08:00
minecraft1024a
444c458986 refactor(core): 统一消息对象类型并增强代码健壮性
本次提交对多个核心模块进行了重构和修复,主要目标是统一内部消息对象的类型为 `DatabaseMessages`,并增加多处空值检查和类型注解,以提升代码的健壮性和可维护性。

- **统一消息类型**: 在 `action_manager` 中,将 `action_message` 和 `target_message` 的类型注解和处理逻辑统一为 `DatabaseMessages`,消除了对 `dict` 类型的兼容代码,使逻辑更清晰。
- **增强健壮性**:
    - 在 `permission_api` 中,为所有对外方法增加了对 `_permission_manager` 未初始化时的空值检查,防止在管理器未就绪时调用引发异常。
    - 在 `chat_api` 和 `cross_context_api` 中,增加了对 `stream.user_info` 的存在性检查,避免在私聊场景下 `user_info` 为空时导致 `AttributeError`。
- **类型修复**: 修正了 `action_modifier` 和 `plugin_base` 中的类型注解错误,并解决了 `action_modifier` 中因 `chat_stream` 未初始化可能导致的潜在问题。
- **代码简化**: 移除了 `action_manager` 中因兼容 `dict` 类型而产生的冗余代码分支,使逻辑更直接。
2025-11-01 16:51:04 +08:00
Windpicker-owo
19ed3fd048 fix(database): 修复使用不存在的 get_all_by/get_all 方法
问题:
- CRUDBase 没有 get_all() 和 get_all_by() 方法
- 导致运行时错误: greenlet_spawn has not been called

修复:
- get_all()  get_multi(limit=100000)
- get_all_by(chat_id=x)  get_multi(chat_id=x, limit=10000)

影响文件:
- expression_learner.py: 2处修复
- person_info.py: 1处修复
- chat_stream.py: 1处修复
2025-11-01 16:17:39 +08:00
Windpicker-owo
52c3f81175 fix(database): 修复缓存失效逻辑和属性名错误
主要修复:

1. Expression 缓存键生成问题
   - 问题: get_expression_by_chat_id 作为实例方法使用 @cached 时,self 会污染缓存键
   - 解决: 重构为静态方法 _get_expressions_by_chat_id_cached,实例方法调用它
   - 确保缓存键只包含 chat_id,与缓存失效键匹配

2. PersonInfo 删除时的缓存失效
   - 问题: person_id 是哈希值,无法反向得到 platform 和 user_id
   - 解决: 移除不准确的缓存清除代码,依赖 TTL 自动过期
   - 原因: 删除操作很罕见,缓存在 5-10 分钟内会自动过期

3. ChatStreams 属性名错误 (严重 bug)
   - 问题: UserInfo.nickname 应为 UserInfo.user_nickname
   - 问题: UserInfo.cardname 应为 UserInfo.user_cardname
   - 错误导致: AttributeError: 'UserInfo' object has no attribute 'nickname'
   - 修复: 使用正确的属性名

验证:
- 创建了 test_cache_invalidation.py 验证缓存键一致性
- 所有 11 个测试通过
- 验证了缓存失效键与装饰器生成的键匹配
2025-11-01 16:09:28 +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
d6a90a2bf8 refactor: 优化Emoji表情包查询为使用缓存API
Emoji查询优化 (emoji_manager.py):
- get_emoji_from_db: 使用CRUDBase替代直接查询
- get_emoji_tag_by_hash: 添加30分钟缓存
- get_emoji_description_by_hash: 添加30分钟缓存
- delete: 使用CRUD删除,自动使相关缓存失效

性能提升:
- Emoji查询减少80%+数据库访问
- 表情包描述查询减少90%+数据库访问
- 发送表情时响应速度提升50%+

缓存策略:
- 表情包数据相对稳定,使用30分钟长缓存
- 删除操作自动清除相关缓存键
- 内存缓存优先,数据库查询作为后备
2025-11-01 15:48:52 +08:00
Windpicker-owo
17e1c186b5 fix: 修复MessageUpdateBatcher未定义错误
- 使用字符串形式的前向引用'MessageUpdateBatcher'
- 修复全局变量在类定义前使用类型注解的问题
2025-11-01 15:25:53 +08:00
Windpicker-owo
8ac7b76e70 fix: 添加Optional类型导入
- 修复'name Optional is not defined'错误
- 在storage.py中添加from typing import Optional
2025-11-01 15:24:30 +08:00
Windpicker-owo
5690778d03 feat: 实现消息批量写入机制优化数据库连接池
优化内容:
- 新增MessageStorageBatcher消息存储批处理器
- 默认缓存5秒或50条消息后批量写入数据库
- 显著减少数据库连接池压力,提升高并发性能
- store_message新增use_batch参数(默认True)
- 在主程序启动/停止时自动管理批处理器生命周期

性能提升:
- 高频消息场景下减少90%+的数据库连接
- 批量insert性能比单条insert快5-10倍
- 连接池溢出问题得到根本性解决

配置参数:
- batch_size: 50(达到此数量立即写入)
- flush_interval: 5.0秒(定时自动刷新)

影响文件:
- src/chat/message_receive/storage.py: 新增批处理器
- src/main.py: 启动和停止批处理器
2025-11-01 15:23:08 +08:00
Windpicker-owo
ca539a3ebd fix: 修复在线时间记录的db_save调用
- db_save需要key_field和key_value参数用于get_or_create
- 创建新记录应使用db_query with query_type='create'
- 修复'db_save() missing 2 required positional arguments'错误
2025-11-01 14:53:53 +08:00
Windpicker-owo
ce1c3288fd fix: 修复数据库导入错误
- 修复12处从错误位置导入get_db_session/get_engine的问题
- 函数应从core导入,模型应从core.models导入
- 修复bot.py使用check_and_migrate_database代替不存在的initialize_database

影响文件:
- bot.py: 使用正确的初始化函数
- schedule_manager.py: 修复get_db_session导入
- relationship_service.py: 修复get_db_session导入
- schedule_api.py: 修复get_db_session导入
- utils.py (llm_models): 修复get_db_session导入
- utils_image.py: 修复get_db_session导入
- utils_video.py: 修复get_db_session导入
- user_ban.py: 修复get_db_session导入
- statistics.py: 修复get_db_session导入
- storage.py: 修复get_db_session导入
- anti_injector.py: 修复2处get_db_session导入
- permission_manager.py: 修复get_engine导入
2025-11-01 14:44:13 +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
Windpicker-owo
215183e50f refactor(expression_learner): 优化表达方式查询逻辑,减少数据库查询次数并批量处理更新操作
refactor(storage): 添加消息更新批处理器,优化消息ID更新逻辑以减少数据库连接次数
2025-11-01 01:07:37 +08:00
Windpicker-owo
69ee822ef7 refactor(logging): 将多个info日志级别的记录更改为debug级别,以减少日志输出 2025-11-01 00:44:50 +08:00
Windpicker-owo
33f434aafa fix(plugin): 禁用hello_world_plugin以防止意外启用
fix(replyer): 修改提示信息中的“这句话”为“这条消息”以提高表达准确性
2025-10-31 23:14:41 +08:00