Merge branch 'dev' of github.com:Mai-with-u/MaiBot into r-dev

This commit is contained in:
UnCLAS-Prommer
2026-01-31 21:59:44 +08:00
3 changed files with 133 additions and 54 deletions

View File

@@ -189,6 +189,7 @@ async def _send_message(message: MessageSending, show_log=True) -> bool:
# 如果未开启 API Server直接跳过 Fallback
if not global_config.maim_message.enable_api_server:
logger.debug(f"[API Server Fallback] API Server未开启跳过fallback")
if legacy_exception:
raise legacy_exception
return False
@@ -196,36 +197,80 @@ async def _send_message(message: MessageSending, show_log=True) -> bool:
global_api = get_global_api()
extra_server = getattr(global_api, "extra_server", None)
if extra_server and extra_server.is_running():
# Fallback: 使用极其简单的 Platform -> API Key 映射
# 只有收到过该平台的消息,我们才知道该平台的 API Key才能回传消息
platform_map = getattr(global_api, "platform_map", {})
target_api_key = platform_map.get(platform)
if not extra_server:
logger.warning(f"[API Server Fallback] extra_server不存在")
if legacy_exception:
raise legacy_exception
return False
if target_api_key:
# 构造 APIMessageBase
from maim_message.message import APIMessageBase, MessageDim
if not extra_server.is_running():
logger.warning(f"[API Server Fallback] extra_server未运行")
if legacy_exception:
raise legacy_exception
return False
msg_dim = MessageDim(api_key=target_api_key, platform=platform)
# Fallback: 使用极其简单的 Platform -> API Key 映射
# 只有收到过该平台的消息,我们才知道该平台的 API Key才能回传消息
platform_map = getattr(global_api, "platform_map", {})
logger.debug(f"[API Server Fallback] platform_map: {platform_map}, 目标平台: '{platform}'")
target_api_key = platform_map.get(platform)
api_message = APIMessageBase(
message_info=message.message_info,
message_segment=message.message_segment,
message_dim=msg_dim,
if not target_api_key:
logger.warning(f"[API Server Fallback] 未找到平台'{platform}'的API Key映射")
if legacy_exception:
raise legacy_exception
return False
# 使用 MessageConverter 转换 Legacy MessageBase 到 APIMessageBase
# 发送场景MaiMBot 发送回复消息给外部用户
# group_info/user_info 是消息接收者信息,放入 receiver_info
from maim_message import MessageConverter
# 修复 API Server Fallback 模式下的 user_info 问题
# 在 Legacy 模式下MessageSending.to_dict() 的第 454 行会将 user_info 替换为 chat_stream.user_info
# 但在 API Server Fallback 模式下MessageConverter.to_api_send() 直接访问 message 对象,不调用 to_dict()
# 需要手动应用相同的变通方案在私聊场景下user_info 应该是接收者sender_info
message_for_conversion = message
if hasattr(message, "message_info") and message.message_info.group_info is None:
# 私聊场景group_info 为 None
# user_info 应该是接收者,从 chat_stream.user_info 或 sender_info 获取
temp_dict = message.to_dict()
if (
hasattr(message, "chat_stream")
and message.chat_stream
and hasattr(message.chat_stream, "user_info")
):
temp_dict["message_info"]["user_info"] = message.chat_stream.user_info.to_dict()
# 重新构建 MessageBase 对象(不保留 sender_info 等扩展属性)
from maim_message import MessageBase
message_for_conversion = MessageBase.from_dict(temp_dict)
api_message = MessageConverter.to_api_send(
message=message_for_conversion,
api_key=target_api_key,
platform=platform,
)
# 直接调用 Server 的 send_message 接口,它会自动处理路由
logger.debug(f"[API Server Fallback] 正在通过extra_server发送消息...")
results = await extra_server.send_message(api_message)
logger.debug(f"[API Server Fallback] 发送结果: {results}")
# 检查是否有任何连接发送成功
if any(results.values()):
if show_log:
logger.info(
f"已通过API Server Fallback将消息 '{message_preview}' 发往平台'{platform}' (key: {target_api_key})"
)
return True
else:
logger.warning(f"[API Server Fallback] 没有连接发送成功, results={results}")
except Exception as e:
logger.error(f"[API Server Fallback] 发生异常: {e}")
import traceback
# 直接调用 Server 的 send_message 接口,它会自动处理路由
results = await extra_server.send_message(api_message)
# 检查是否有任何连接发送成功
if any(results.values()):
if show_log:
logger.info(
f"已通过API Server Fallback将消息 '{message_preview}' 发往平台'{platform}' (key: {target_api_key})"
)
return True
except Exception:
pass
logger.debug(traceback.format_exc())
# 如果 Fallback 失败,且存在 legacy 异常,则抛出 legacy 异常
if legacy_exception:
@@ -234,13 +279,17 @@ async def _send_message(message: MessageSending, show_log=True) -> bool:
try:
send_result = await get_global_api().send_message(message)
# if send_result:
if show_log:
logger.info(f"已将消息 '{message_preview}' 发往平台'{message.message_info.platform}'")
return True
# Legacy API 返回 False (发送失败但未报错),尝试 Fallback
# return await send_with_new_api()
if send_result:
if show_log:
logger.info(f"已将消息 '{message_preview}' 发往平台'{message.message_info.platform}'")
return True
else:
# Legacy API 返回 False (发送失败但未报错),尝试 Fallback
fallback_result = await send_with_new_api()
if fallback_result and show_log:
# Fallback成功的日志已在send_with_new_api中打印
pass
return fallback_result
except Exception as legacy_e:
# Legacy API 抛出异常,尝试 Fallback