Commit Graph

157 Commits

Author SHA1 Message Date
Windpicker-owo
bc7228cb3c feat(planner): 使用标准化的JSON格式重构动作规划系统
- 将聊天流和消息管理器中的默认聊天模式从“normal”更改为“focus”
- 从ActionPlannerInfo数据模型中移除已弃用的should_quote_reply字段
- 通过移除回复可用性检查和基于兴趣的过滤,简化计划过滤逻辑
- 采用新的标准化JSON操作格式,并强制使用操作列表结构
- 更新规划器提示,以强制执行一致的动作输出格式
- 移除遗留操作参数过滤,简化消息目标解析
- 清理计划过滤器中未使用的导入和已弃用的代码路径
2025-11-13 15:10:08 +08:00
Windpicker-owo
c2dca8cb2a refactor(person_info): 移除内存缓存逻辑,统一使用数据库缓存系统
refactor(plugin): 使用数据库查询替代内存缓存进行用户信息匹配
refactor(message_sender): 优化消息添加到流上下文的逻辑
2025-11-12 17:58:26 +08:00
Windpicker-owo
09db6c0c88 refactor: 移除对机器人自身用户ID的特殊处理,统一使用QQ号进行比较 2025-11-12 17:33:51 +08:00
Windpicker-owo
1fc8d5091c feat: 添加路径评分扩展算法和内存去重工具
- 基于图路径传播,实现了一种路径评分扩展算法,以优化内存检索。
引入了内存去重工具,以识别和合并相似的内存,从而提高结果质量。
- 更新了路径扩展的配置选项,包括最大跳数、阻尼因子和剪枝阈值。
- 在路径扩展中增加了对首选节点类型的支持,以提高内存检索的相关性。
- 增强的日志记录功能,以便更好地跟踪路径扩展和去重过程。
2025-11-12 00:33:05 +08:00
Windpicker-owo
9b68d7d995 feat(heart_fc_sender): 修复Send API消息不入流上下文的问题,确保消息可引用并添加转换为数据库消息的功能 2025-11-11 21:42:17 +08:00
明天好像没什么
6a5648ba07 创建了新的反注入 2025-11-09 12:31:38 +08:00
Windpicker-owo
d4824e35ad feat(message-manager): 用流循环管理器替换调度器/分派器
- 移除 scheduler_dispatcher 模块,并用 distribution_manager 替换
- 实现StreamLoopManager,以改进消息分发和中断处理
- 将消息缓存系统直接添加到StreamContext中,并配置缓存设置
- 使用具有缓存感知的消息处理来增强SingleStreamContextManager
- 更新`message_manager`,使用`stream_loop_manager`替代`scheduler_dispatcher`
- 在StreamContext数据模型中添加缓存统计和刷新方法
- 通过适当的任务取消和重新处理来改进中断处理
- 为ChatManager添加get_all_stream方法,以实现更优的流管理
- 更新亲和聊天规划器,以更可靠地处理专注/正常模式切换
2025-11-08 10:46:44 +08:00
明天好像没什么
c8d7c09625 ruff 2025-11-07 21:01:45 +08:00
拾风
1ab042813d Merge branch 'dev' into dev 2025-11-07 13:14:27 +08:00
Windpicker-owo
023fab73a5 feat(memory): 更新记忆管理和配置,优化整合逻辑,添加语义相似度阈值 2025-11-06 23:56:18 +08:00
Windpicker-owo
25c50f759f fix(chat): 增强对自我身份的识别,支持将机器人用户标记为"SELF" 2025-11-05 14:45:36 +08:00
SolenmeChiara
6d37514c34 fix(bot): 修复adapter_response被echo检查拦截的严重bug
问题:
- Napcat发送adapter_response时同时设置了echo=True
- 原逻辑先检查echo,导致adapter_response消息被提前return
- Maizone获取Cookie等功能完全失效(超时40秒)

修复:
- 将adapter_response检查移到echo检查之前
- 确保adapter_response消息优先处理
- 移除重复的adapter_response检查逻辑

影响:
- Maizone插件现在可以正确获取QQ空间Cookie
- 所有adapter命令响应都能正常工作

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 22:08:58 -05:00
SolenmeChiara
06ed1cbae6 chore: 恢复PR改动并适配官方最新版本
在官方更新到4936a6d后,选择性恢复PR中的功能改动:

Maizone插件修复(6个文件):
- 优化成功/失败反馈机制(直接反馈,不使用AI生成)
- 实现QQ空间Cookie失效自动重试机制
- 修复评论回复被分割导致标点符号丢失的问题
- 修复QQ空间转发内容提取错误
- 改进maizone图片识别模型配置,支持自动fallback
- 优化maizone说说生成规则

适配器响应处理(bot.py):
- 添加adapter_response消息处理逻辑
- 适配新的DatabaseMessages架构
- 在message_process早期阶段优先处理adapter_response

Web搜索引擎扩展:
- 添加Serper搜索引擎支持

LLM成本计算修复:
- 修复LLM使用统计中成本计算错误的bug
- 调整LLM相关日志级别为DEBUG

其他优化:
- 优化NapCat adapter响应处理
- 优化person_info关系推理逻辑

注:本次恢复已跳过与官方冲突的部分,保留官方的新架构改进

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 22:08:58 -05: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
明天好像没什么
cb97b2d8d3 rufffffff 2025-11-01 21:10:01 +08:00
Windpicker-owo
e0063fb281 feat: 在获取聊天流时添加创建时间和最后活跃时间字段 2025-11-01 19:34:51 +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
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
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
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
明天好像没什么
0e129d385e refactor: 统一类型注解风格并优化代码结构
- 将裸 except 改为显式 Exception 捕获
- 用列表推导式替换冗余 for 循环
- 为类属性添加 ClassVar 注解
- 统一 Union/Optional 写法为 |
- 移除未使用的导入
- 修复 SQLAlchemy 空值比较语法
- 优化字符串拼接与字典更新逻辑
- 补充缺失的 noqa 注释与异常链

BREAKING CHANGE: 所有插件基类的类级字段现要求显式 ClassVar 注解,自定义插件需同步更新
2025-10-31 22:42:39 +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
Windpicker-owo
655b4f20c6 refactor(message-manager): 删除自适应流管理器并优化上下文加载
-从distribution_manager和message_manager中删除adaptive_stream_manager.py及其集成
-删除过时的message_recv_backup.py,因为MessageRecv已被DatabaseMessages完全替换
-在context_manager中添加异步历史初始化,以便在启动时从数据库加载消息
-优化default_generator以使用内存中的消息,而不是重复的数据库查询
-修复message.py中的回复消息段处理,以处理DatabaseMessages格式
-从chat_stream.py中删除deepcopy并改进context_manager初始化
-清理bot.py和适配器响应方法中未使用的通知处理

突破性变化:自适应流管理系统已被完全删除。所有消息处理现在都依赖于DatabaseMessages格式。上下文管理器现在在创建时从数据库异步初始化历史记录。
2025-10-31 20:45:25 +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
50260818a8 refactor(bot): 使用统一方法转换消息为数据库对象,简化代码逻辑 2025-10-31 16:02:14 +08:00
Windpicker-owo
155b6e9d04 移除mai4u:s4u_watching_manager.py, screen_manager.py, super_chat_manager.py, yes_or_no.py, openai_client.py, and s4u_config.py. These changes streamline the codebase by eliminating unused components and improving maintainability. 2025-10-31 15:52:42 +08:00
Windpicker-owo
373ca48a4d refactor(event): 优化AFTER_SEND事件的异步触发逻辑并增强日志记录 2025-10-31 14:25:40 +08:00
Windpicker-owo
e969efa27f fix(event): 修复AFTER_SEND事件触发时的参数传递逻辑 2025-10-31 12:31:30 +08:00
Windpicker-owo
246a15daae refactor(proactive):将主动性消息整合到统一调度框架中
- 将主动思考能力直接整合进亲和力交流流程中
- 以可配置的动态调度系统替换传统间隔系统
- 通过白名单/黑名单过滤实现细粒度控制
- 增加基于时间的频率调制和冷却周期管理功能
- 移除独立的proactive_thinker插件,采用集成化方案替代
- 更新配置架构,增加增强型主动消息参数
2025-10-31 12:27:01 +08:00
tt-P607
21b5e378ea feat(chat): 增强回复功能,支持通过字符串指定并显示用户ID
为了让插件能更灵活地构造回复消息,而无需依赖完整的原始消息对象,本次提交引入了新的回复机制。

- `send_api` 新增 `reply_to` 参数,允许使用 `昵称(ID)` 格式的字符串直接指定回复目标。
- 统一更新了回复消息的显示格式,在回复引文中一并展示用户昵称和ID,避免因昵称重复造成混淆。
2025-10-29 16:58:50 +08:00
tt-P607
d9c83c2cab Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-10-27 00:39:35 +08:00
tt-P607
c98fa30358 feat(file): 新增文件消息的接收与发送功能
本次更新为框架引入了完整的文件消息处理能力,涵盖了发送和接收两个方面,使机器人能够处理文件传输。

主要变更包括:

- **发送功能**:
  - 在 `plugin_system.apis.send_api` 中新增了 `file_to_stream` 公共 API,允许插件向指定聊天流(私聊或群聊)发送本地文件。
  - 为文件上传设置了更长的超时时间,并增加了临时的 WSL 路径转换逻辑。

- **接收功能**:
  - `chat.message_receive` 模块现在能够正确处理 `file` 类型的消息段,并生成可读的文本描述。
  - NapCat 适配器增加了对文件消息 (`file`) 和群文件上传通知 (`group_upload`) 的解析能力。
  - 通过智能识别和解析,能够将机器人自己发送文件后收到的 JSON 卡片回声消息,正确地转换回标准的文件消息段。

- **重构**:
  - 将接收消息的 `content_format` 属性改为根据消息段动态生成,提高了对复合消息类型的适应性。
  - 将未知消息段的日志级别从 `info` 调整为 `warning`,以便更好地监控未处理的消息类型。
2025-10-26 22:57:11 +08:00
明天好像没什么
99d55c0b49 Merge branch 'dev' of https://github.com/MoFox-Studio/MoFox_Bot into dev 2025-10-26 13:10:38 +08:00
明天好像没什么
7b80d7c0b3 feat(plugin): 集成 MCP 协议支持并优化代码风格
- 新增 fastmcp 依赖,支持通过 Streamable HTTP 连接外部工具服务器
- 在 component_registry 与 tool_api 中实现 MCP 工具加载、注册及调用链路
- 补充 README 中的 MCP 特性说明
- 统一修复多处 import 顺序、空行、引号及类型注解,提升代码整洁度
- 在 pyproject.toml 中忽略 PERF203 规则,允许循环内异常处理
- 优化语音缓存与本地 ASR 调用逻辑,减少冗余代码
2025-10-26 13:10:31 +08:00
minecraft1024a
ccbac891b6 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]]` 格式。
2025-10-26 12:16:37 +08:00
Windpicker-owo
0d3e46fc97 feat(message): 在消息处理中嵌入 format_info 到 additional_config
在 bot.py 和 chat_stream.py 中新增逻辑,将消息的 format_info 嵌入到 additional_config 字段中,确保 Action 能够正确检查适配器支持的消息类型。同时删除已废弃的 optimized_chat_stream.py 文件,并修复 notice_handler.py 中的类型注解问题。

- 在 bot.py 和 chat_stream.py 中添加 _prepare_additional_config 方法
- 将 format_info 序列化后嵌入 additional_config JSON 中
- 增强 StreamContext.check_types 方法的日志输出以便调试
- 删除不再使用的 optimized_chat_stream.py 文件
- 修复 notice_handler.py 中的类型注解问题
2025-10-26 10:46:04 +08:00
tt-P607
c61cc19eb6 feat(voice): 实现自身语音缓存以跳过ASR识别
当机器人通过TTS插件发送语音时,会自动将语音数据和对应的原始文本进行缓存。

当机器人接收到自己发送的语音消息时,会优先从缓存中直接读取文本,从而跳过调用ASR(自动语音识别)服务的步骤。

此项优化可以:
- 节省不必要的ASR资源开销和费用。
- 保证对机器人自身语音100%的识别准确性。
- 提升对自身消息的响应处理速度。
2025-10-26 01:14:23 +08:00