重构代码以使用 mofox_wire 替代 mofox_bus,更新相关文档和示例

This commit is contained in:
Windpicker-owo
2025-11-25 22:45:57 +08:00
parent b6de9b5a9c
commit 8a6b141017
20 changed files with 49 additions and 49 deletions

View File

@@ -1,6 +1,6 @@
# MoFox Bot 消息运行时架构 (MessageRuntime)
本文档描述了 MoFox Bot 使用 `mofox_bus.MessageRuntime` 简化消息处理链条的架构设计。
本文档描述了 MoFox Bot 使用 `mofox_wire.MessageRuntime` 简化消息处理链条的架构设计。
## 架构概述
@@ -54,7 +54,7 @@ await manager.send_outgoing(envelope)
### 2. MessageRuntime
`MessageRuntime` 是 mofox_bus 提供的消息路由核心,支持:
`MessageRuntime` 是 mofox_wire 提供的消息路由核心,支持:
- **消息路由**:通过 `add_route()``@on_message` 装饰器按消息类型路由
- **钩子机制**`before_hook`(前置处理)、`after_hook`(后置处理)、`error_hook`(错误处理)
@@ -148,7 +148,7 @@ class MessageHandler:
```python
from src.common.core_sink_manager import get_message_runtime
from mofox_bus import MessageEnvelope
from mofox_wire import MessageEnvelope
runtime = get_message_runtime()
@@ -216,7 +216,7 @@ async def initialize(self) -> None:
## 参考
- `packages/mofox-bus/src/mofox_bus/runtime.py` - MessageRuntime 实现
- `packages/mofox-wire/src/mofox_wire/runtime.py` - MessageRuntime 实现
- `src/common/core_sink_manager.py` - CoreSinkManager 实现
- `src/chat/message_receive/message_handler.py` - MessageHandler 实现
- `docs/mofox_bus.md` - MoFox Bus 消息库说明
- `docs/mofox_wire.md` - MoFox Bus 消息库说明

View File

@@ -2,7 +2,7 @@
MoFox Bus 是 MoFox Bot 自研的统一消息中台,替换第三方 `maim_message`,将核心与各平台适配器之间的通信抽象成可拓展、可热插拔的组件。该库完全异步、面向高吞吐,覆盖消息建模、序列化、传输层、运行时路由、适配器工具等多个层面。
> 现在已拆分为独立 pip 包:在项目根目录执行 `pip install -e ./packages/mofox-bus` 即可安装到当前 Python 环境。
> 现在已拆分为独立 pip 包:在项目根目录执行 `pip install -e ./packages/mofox-wire` 即可安装到当前 Python 环境。
---
@@ -16,7 +16,7 @@ MoFox Bus 是 MoFox Bot 自研的统一消息中台,替换第三方 `maim_mess
---
## 2. 包结构概览(`packages/mofox-bus/src/mofox_bus/`
## 2. 包结构概览(`packages/mofox-wire/src/mofox_wire/`
| 模块 | 主要职责 |
| --- | --- |
@@ -115,15 +115,15 @@ TypedDict 更适合网络传输和依赖注入dataclass 版 MessageBase 则
1. **配置文件**:在 `config.*.toml` 中新增 `[message_bus]` 段(参考 `template/bot_config_template.toml`),控制 host/port/token/wss 等。
2. **服务启动**`src/common/message/api.py` 中的 `get_global_api()` 已默认实例化 `MessageServer`,并将 token 写入服务器。
3. **适配器更新**:所有使用原 `maim_message` 的模块已改为 `from mofox_bus import ...`,无需额外适配即可继续利用 `MessageBase` / `Router` API。
3. **适配器更新**:所有使用原 `maim_message` 的模块已改为 `from mofox_wire import ...`,无需额外适配即可继续利用 `MessageBase` / `Router` API。
---
## 10. 快速上手示例
```python
from mofox_bus import MessageRuntime, types
from mofox_bus.transport import HttpMessageServer
from mofox_wire import MessageRuntime, types
from mofox_wire.transport import HttpMessageServer
runtime = MessageRuntime()
@@ -140,7 +140,7 @@ app = server.make_app() # 交给 aiohttp/uvicorn 运行
**适配器 Skeleton**
```python
from mofox_bus import (
from mofox_wire import (
BaseAdapter,
MessageEnvelope,
WebSocketAdapterOptions,
@@ -174,7 +174,7 @@ class MyAdapter(BaseAdapter):
- 如果传入 `WebSocketAdapterOptions`BaseAdapter 会自动建立连接、监听、默认封装 `{"type":"message","payload":...}` 的标准 JSON并允许通过 `outgoing_encoder` 自定义下行格式。
- 如果传入 `HttpAdapterOptions`BaseAdapter 会自动启动一个 aiohttp Webhook`POST /adapter/messages`)并将收到的 JSON 批量投递给核心。
> 完整的 WebSocket 适配器示例见 `examples/mofox_bus_demo_adapter.py`:演示了平台提供 WS 接口、适配器通过 `WebSocketAdapterOptions` 自动启动监听、接收/处理/回发的全过程,可直接运行观察日志。
> 完整的 WebSocket 适配器示例见 `examples/mofox_wire_demo_adapter.py`:演示了平台提供 WS 接口、适配器通过 `WebSocketAdapterOptions` 自动启动监听、接收/处理/回发的全过程,可直接运行观察日志。
---

View File

@@ -17,7 +17,7 @@ import orjson
import websockets
from mofox_bus import (
from mofox_wire import (
AdapterBase,
InProcessCoreSink,
MessageEnvelope,

View File

@@ -78,7 +78,7 @@ dependencies = [
"inkfox>=0.1.1",
"rjieba>=0.1.13",
"fastmcp>=2.13.0",
"mofox-bus",
"mofox-wire",
]
[[tool.uv.index]]

View File

@@ -342,7 +342,7 @@ class ChatManager:
def register_message(self, message: DatabaseMessages):
"""注册消息到聊天流"""
# 从 DatabaseMessages 提取平台和用户/群组信息
from mofox_bus import GroupInfo, UserInfo
from mofox_wire import GroupInfo, UserInfo
user_info = UserInfo(
platform=message.user_info.platform,

View File

@@ -1,7 +1,7 @@
"""
统一消息处理器 (Message Handler)
利用 mofox_bus.MessageRuntime 的路由功能,简化消息处理链条:
利用 mofox_wire.MessageRuntime 的路由功能,简化消息处理链条:
1. 使用 @runtime.on_message() 装饰器注册按消息类型路由的处理器
2. 使用 before_hook 进行消息预处理ID标准化、过滤等
@@ -35,7 +35,7 @@ import traceback
from functools import partial
from typing import TYPE_CHECKING, Any
from mofox_bus import MessageEnvelope, MessageRuntime
from mofox_wire import MessageEnvelope, MessageRuntime
from src.chat.message_manager import message_manager
from src.chat.message_receive.storage import MessageStorage

View File

@@ -1,14 +1,14 @@
"""消息处理工具模块
将原 MessageRecv 的消息处理逻辑提取为独立函数,
基于 mofox-bus 的 TypedDict 形式构建消息数据,然后转换为 DatabaseMessages
基于 mofox-wire 的 TypedDict 形式构建消息数据,然后转换为 DatabaseMessages
"""
import base64
import time
from typing import Any
import orjson
from mofox_bus import MessageEnvelope
from mofox_bus.types import MessageInfoPayload, SegPayload, UserInfoPayload, GroupInfoPayload
from mofox_wire import MessageEnvelope
from mofox_wire.types import MessageInfoPayload, SegPayload, UserInfoPayload, GroupInfoPayload
from src.chat.utils.self_voice_cache import consume_self_voice_text
from src.chat.utils.utils_image import get_image_manager

View File

@@ -8,7 +8,7 @@ from typing import TYPE_CHECKING
from rich.traceback import install
from mofox_bus import MessageEnvelope
from mofox_wire import MessageEnvelope
from src.chat.message_receive.message_processor import process_message_from_dict
from src.chat.message_receive.storage import MessageStorage

View File

@@ -13,7 +13,7 @@ from datetime import datetime, timedelta
from typing import Any, Literal, TYPE_CHECKING
from src.chat.express.expression_selector import expression_selector
from mofox_bus import MessageEnvelope
from mofox_wire import MessageEnvelope
from src.chat.message_receive.message import Seg, UserInfo
from src.chat.message_receive.uni_message_sender import HeartFCSender
from src.chat.utils.chat_message_builder import (

View File

@@ -11,7 +11,7 @@ CoreSink 统一管理器
4. 提供统一的消息发送接口
架构说明2025-11 重构):
- 集成 mofox_bus.MessageRuntime 作为消息路由中心
- 集成 mofox_wire.MessageRuntime 作为消息路由中心
- 使用 @runtime.on_message() 装饰器注册消息处理器
- 利用 before_hook/after_hook/error_hook 处理前置/后置/错误逻辑
- 简化消息处理链条,提高可扩展性
@@ -24,7 +24,7 @@ import contextlib
import multiprocessing as mp
from typing import TYPE_CHECKING, Any, Awaitable, Callable, Dict, Optional
from mofox_bus import (
from mofox_wire import (
InProcessCoreSink,
MessageEnvelope,
MessageRuntime,

View File

@@ -534,7 +534,7 @@ DEFAULT_MODULE_COLORS = {
# 数据库和消息
"database_model": "#875F00", # 橙褐色
"database": "#00FF00", # 橙褐色
"mofox_bus": "#AF87D7", # 紫褐色
"mofox_wire": "#AF87D7", # 紫褐色
# 日志系统
"logger": "#808080", # 深灰色
"confirm": "#FFFF00", # 黄色+粗体

View File

@@ -1,6 +1,6 @@
import os
from mofox_bus import MessageServer
from mofox_wire import MessageServer
from src.common.logger import get_logger
from src.common.server import get_global_server
@@ -45,7 +45,7 @@ def get_global_api() -> MessageServer:
if bus_config.auth_token:
kwargs["enable_token"] = True
kwargs["custom_logger"] = get_logger("mofox_bus")
kwargs["custom_logger"] = get_logger("mofox_wire")
global_api = MessageServer(**kwargs)
for token in bus_config.auth_token:

View File

@@ -575,7 +575,7 @@ class ExperimentalConfig(ValidatedConfigBase):
class MessageBusConfig(ValidatedConfigBase):
"""mofox_bus 消息服务配置"""
"""mofox_wire 消息服务配置"""
use_custom: bool = Field(default=False, description="是否使用自定义地址")
host: str = Field(default="127.0.0.1", description="消息服务主机")

View File

@@ -92,7 +92,7 @@ import traceback
import uuid
from typing import TYPE_CHECKING, Any
from mofox_bus import MessageEnvelope
from mofox_wire import MessageEnvelope
from src.common.data_models.database_data_model import DatabaseUserInfo
if TYPE_CHECKING:
from src.common.data_models.database_data_model import DatabaseMessages

View File

@@ -1,7 +1,7 @@
"""
插件系统 Adapter 基类
提供插件化的适配器支持,包装 mofox_bus.AdapterBase
提供插件化的适配器支持,包装 mofox_wire.AdapterBase
添加插件生命周期、配置管理、自动启动等特性。
"""
@@ -12,7 +12,7 @@ from abc import ABC, abstractmethod
from pathlib import Path
from typing import TYPE_CHECKING, Any, Dict, Optional
from mofox_bus import AdapterBase as MoFoxAdapterBase, CoreSink, MessageEnvelope, ProcessCoreSink
from mofox_wire import AdapterBase as MoFoxAdapterBase, CoreSink, MessageEnvelope, ProcessCoreSink
if TYPE_CHECKING:
from src.plugin_system.base.base_plugin import BasePlugin
@@ -26,7 +26,7 @@ class BaseAdapter(MoFoxAdapterBase, ABC):
"""
插件系统的 Adapter 基类
相比 mofox_bus.AdapterBase增加了以下特性
相比 mofox_wire.AdapterBase增加了以下特性
1. 插件生命周期管理 (on_adapter_loaded, on_adapter_unloaded)
2. 配置管理集成
3. 自动重连与健康检查

View File

@@ -19,7 +19,7 @@ from typing import TYPE_CHECKING, Dict, Optional
if TYPE_CHECKING:
from src.plugin_system.base.base_adapter import BaseAdapter
from mofox_bus import ProcessCoreSinkServer
from mofox_wire import ProcessCoreSinkServer
from src.common.logger import get_logger
logger = get_logger("adapter_manager")
@@ -45,7 +45,7 @@ def _adapter_process_entry(
"""
import asyncio
import contextlib
from mofox_bus import ProcessCoreSink
from mofox_wire import ProcessCoreSink
async def _run() -> None:
adapter_cls = _load_class(*adapter_path)

View File

@@ -1,13 +1,13 @@
# NEW_napcat_adapter
基于 mofox-bus v2.x 的 Napcat 适配器(使用 BaseAdapter 架构)
基于 mofox-wire v2.x 的 Napcat 适配器(使用 BaseAdapter 架构)
## 🏗️ 架构设计
本插件采用 **BaseAdapter 继承模式** 重写,完全抛弃旧版 maim_message 库,改用 mofox-bus 的 TypedDict 数据结构。
本插件采用 **BaseAdapter 继承模式** 重写,完全抛弃旧版 maim_message 库,改用 mofox-wire 的 TypedDict 数据结构。
### 核心组件
- **NapcatAdapter**: 继承自 `mofox_bus.AdapterBase`,负责 OneBot 11 协议与 MessageEnvelope 的双向转换
- **NapcatAdapter**: 继承自 `mofox_wire.AdapterBase`,负责 OneBot 11 协议与 MessageEnvelope 的双向转换
- **WebSocketAdapterOptions**: 自动管理 WebSocket 连接,提供 incoming_parser 和 outgoing_encoder
- **CoreMessageSink**: 通过 `InProcessCoreSink` 将消息递送到核心系统
- **Handlers**: 独立的消息处理器,分为 to_core接收和 to_napcat发送两个方向
@@ -56,10 +56,10 @@ NEW_napcat_adapter/
## 🔑 核心数据结构
### MessageEnvelope (mofox-bus v2.x)
### MessageEnvelope (mofox-wire v2.x)
```python
from mofox_bus import MessageEnvelope, SegPayload, MessageInfoPayload
from mofox_wire import MessageEnvelope, SegPayload, MessageInfoPayload
# 创建消息信封
envelope: MessageEnvelope = {
@@ -249,13 +249,13 @@ class NapcatAdapter(BaseAdapter):
```python
# ❌ 旧版maim_message
from mofox_bus import Seg, MessageBase
from mofox_wire import Seg, MessageBase
seg = Seg(type="text", data="hello")
message = MessageBase(message_info=info, message_segment=seg)
# ✅ 新版mofox-bus v2.x
from mofox_bus import SegPayload, MessageEnvelope
# ✅ 新版mofox-wire v2.x
from mofox_wire import SegPayload, MessageEnvelope
seg_payload: SegPayload = {"type": "text", "data": "hello"}
envelope: MessageEnvelope = {
@@ -359,8 +359,8 @@ async def from_platform_message(self, message: dict[str, Any]) -> MessageEnvelop
## 📚 参考资料
- **mofox-bus 文档**: 查看 `mofox_bus/types.py` 了解 TypedDict 定义
- **BaseAdapter 示例**: 参考 `docs/mofox_bus_demo_adapter.py`
- **mofox-wire 文档**: 查看 `mofox_wire/types.py` 了解 TypedDict 定义
- **BaseAdapter 示例**: 参考 `docs/mofox_wire_demo_adapter.py`
- **旧版实现**: `src/plugins/built_in/napcat_adapter_plugin/` (仅参考逻辑)
- **OneBot 11 协议**: [OneBot 11 标准](https://github.com/botuniverse/onebot-11)

View File

@@ -17,7 +17,7 @@ from typing import Any, ClassVar, Dict, List, Optional
import orjson
import websockets
from mofox_bus import CoreSink, MessageEnvelope, WebSocketAdapterOptions
from mofox_wire import CoreSink, MessageEnvelope, WebSocketAdapterOptions
from src.common.logger import get_logger
from src.plugin_system import register_plugin
from src.plugin_system.base import BaseAdapter, BasePlugin
@@ -33,7 +33,7 @@ logger = get_logger("napcat_adapter")
class NapcatAdapter(BaseAdapter):
"""Napcat 适配器 - 完全基于 mofox-bus 架构"""
"""Napcat 适配器 - 完全基于 mofox-wire 架构"""
adapter_name = "napcat_adapter"
adapter_version = "2.0.0"

View File

@@ -5,10 +5,10 @@ from __future__ import annotations
import time
from typing import TYPE_CHECKING, Any, Dict, List, Optional
from mofox_bus import MessageBuilder
from mofox_wire import MessageBuilder
from src.common.logger import get_logger
from src.plugin_system.apis import config_api
from mofox_bus import (
from mofox_wire import (
MessageEnvelope,
SegPayload,
MessageInfoPayload,

View File

@@ -1,4 +1,4 @@
from mofox_bus import RouteConfig, Router, TargetConfig
from mofox_wire import RouteConfig, Router, TargetConfig
from src.common.logger import get_logger
from src.common.server import get_global_server