From f3397f6f08b27649c8d94d47ab54feebf4f81186 Mon Sep 17 00:00:00 2001 From: Dt8333 <25431943+Dt8333@users.noreply.github.com> Date: Thu, 5 Feb 2026 21:54:12 +0800 Subject: [PATCH] fix: pyright lint (#4874) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 将 MessageSession 的 platform_id 改为 init=False,实例化时无需传入 Co-authored-by: aider (openai/gpt-5.2) * refactor: 将 isinstance 检查改为元组、将默认模型值设为空字符串、将类型注解改为 Any 并导入 * refactor: 为 _serialize_job 增加返回类型注解 dict * fix: 使用 cast 获取百度 AIP 的 msg 并对 psutil_addr 引入 type: ignore Co-authored-by: aider (openai/gpt-5.2) * refactor: 引入 _AddrWithPort 协议并替换 conn.laddr 的 cast Co-authored-by: aider (openai/gpt-5.2) * fix: 在构建 AstrBotMessage 时对 ctx.channel 可能为 None 进行兜底处理 Co-authored-by: aider (openai/gpt-5.2) --------- Co-authored-by: aider (openai/gpt-5.2) --- .../content_safety_check/strategies/baidu_aip.py | 5 ++++- astrbot/core/platform/message_session.py | 4 ++-- .../sources/discord/discord_platform_adapter.py | 15 +++++++++++++-- .../provider/sources/fishaudio_tts_api_source.py | 2 +- astrbot/dashboard/routes/cron.py | 2 +- astrbot/dashboard/routes/knowledge_base.py | 3 ++- astrbot/dashboard/server.py | 10 +++++++--- 7 files changed, 30 insertions(+), 11 deletions(-) diff --git a/astrbot/core/pipeline/content_safety_check/strategies/baidu_aip.py b/astrbot/core/pipeline/content_safety_check/strategies/baidu_aip.py index bfa82de0e..dd8ca629e 100644 --- a/astrbot/core/pipeline/content_safety_check/strategies/baidu_aip.py +++ b/astrbot/core/pipeline/content_safety_check/strategies/baidu_aip.py @@ -1,5 +1,7 @@ """使用此功能应该先 pip install baidu-aip""" +from typing import Any, cast + from aip import AipContentCensor from . import ContentSafetyStrategy @@ -23,7 +25,8 @@ class BaiduAipStrategy(ContentSafetyStrategy): count = len(res["data"]) parts = [f"百度审核服务发现 {count} 处违规:\n"] for i in res["data"]: - parts.append(f"{i['msg']};\n") + # 百度 AIP 返回结构是动态 dict;类型检查时 i 可能被推断为序列,转成 dict 后用 get 取字段 + parts.append(f"{cast(dict[str, Any], i).get('msg', '')};\n") parts.append("\n判断结果:" + res["conclusion"]) info = "".join(parts) return False, info diff --git a/astrbot/core/platform/message_session.py b/astrbot/core/platform/message_session.py index 982a844c2..b282b307a 100644 --- a/astrbot/core/platform/message_session.py +++ b/astrbot/core/platform/message_session.py @@ -1,4 +1,4 @@ -from dataclasses import dataclass +from dataclasses import dataclass, field from astrbot.core.platform.message_type import MessageType @@ -13,7 +13,7 @@ class MessageSession: """平台适配器实例的唯一标识符。自 AstrBot v4.0.0 起,该字段实际为 platform_id。""" message_type: MessageType session_id: str - platform_id: str | None = None + platform_id: str = field(init=False) def __str__(self): return f"{self.platform_id}:{self.message_type.value}:{self.session_id}" diff --git a/astrbot/core/platform/sources/discord/discord_platform_adapter.py b/astrbot/core/platform/sources/discord/discord_platform_adapter.py index d81afd1ab..ed9899f6f 100644 --- a/astrbot/core/platform/sources/discord/discord_platform_adapter.py +++ b/astrbot/core/platform/sources/discord/discord_platform_adapter.py @@ -444,9 +444,20 @@ class DiscordPlatformAdapter(Platform): logger.warning(f"[Discord] 指令 '{cmd_name}' defer 失败: {e}") # 2. 构建 AstrBotMessage + channel = ctx.channel abm = AstrBotMessage() - abm.type = self._get_message_type(ctx.channel, ctx.guild_id) - abm.group_id = self._get_channel_id(ctx.channel) + if channel is not None: + abm.type = self._get_message_type(channel, ctx.guild_id) + abm.group_id = self._get_channel_id(channel) + else: + # 防守式兜底:channel 取不到时,仍能根据 guild_id/channel_id 推断会话信息 + abm.type = ( + MessageType.GROUP_MESSAGE + if ctx.guild_id is not None + else MessageType.FRIEND_MESSAGE + ) + abm.group_id = str(ctx.channel_id) + abm.message_str = message_str_for_filter abm.sender = MessageMember( user_id=str(ctx.author.id), diff --git a/astrbot/core/provider/sources/fishaudio_tts_api_source.py b/astrbot/core/provider/sources/fishaudio_tts_api_source.py index e246e00ed..70eabd289 100644 --- a/astrbot/core/provider/sources/fishaudio_tts_api_source.py +++ b/astrbot/core/provider/sources/fishaudio_tts_api_source.py @@ -63,7 +63,7 @@ class ProviderFishAudioTTSAPI(TTSProvider): self.headers = { "Authorization": f"Bearer {self.chosen_api_key}", } - self.set_model(provider_config.get("model", None)) + self.set_model(provider_config.get("model", "")) async def _get_reference_id_by_character(self, character: str) -> str | None: """获取角色的reference_id diff --git a/astrbot/dashboard/routes/cron.py b/astrbot/dashboard/routes/cron.py index 6bef93859..8861fc5cc 100644 --- a/astrbot/dashboard/routes/cron.py +++ b/astrbot/dashboard/routes/cron.py @@ -23,7 +23,7 @@ class CronRoute(Route): ] self.register_routes() - def _serialize_job(self, job): + def _serialize_job(self, job) -> dict: data = job.model_dump() if hasattr(job, "model_dump") else job.__dict__ for k in ["created_at", "updated_at", "last_run_at", "next_run_time"]: if isinstance(data.get(k), datetime): diff --git a/astrbot/dashboard/routes/knowledge_base.py b/astrbot/dashboard/routes/knowledge_base.py index 537a81f0b..25bc2cf34 100644 --- a/astrbot/dashboard/routes/knowledge_base.py +++ b/astrbot/dashboard/routes/knowledge_base.py @@ -4,6 +4,7 @@ import asyncio import os import traceback import uuid +from typing import Any import aiofiles from quart import request @@ -75,7 +76,7 @@ class KnowledgeBaseRoute(Route): } def _set_task_result( - self, task_id: str, status: str, result: any = None, error: str | None = None + self, task_id: str, status: str, result: Any = None, error: str | None = None ) -> None: self.upload_tasks[task_id] = { "status": status, diff --git a/astrbot/dashboard/server.py b/astrbot/dashboard/server.py index 57b8ad741..5378f1a85 100644 --- a/astrbot/dashboard/server.py +++ b/astrbot/dashboard/server.py @@ -2,14 +2,13 @@ import asyncio import logging import os import socket -from typing import cast +from typing import Protocol, cast import jwt import psutil from flask.json.provider import DefaultJSONProvider from hypercorn.asyncio import serve from hypercorn.config import Config as HyperConfig -from psutil._common import addr as psutil_addr from quart import Quart, g, jsonify, request from quart.logging import default_handler @@ -29,6 +28,11 @@ from .routes.session_management import SessionManagementRoute from .routes.subagent import SubAgentRoute from .routes.t2i import T2iRoute + +class _AddrWithPort(Protocol): + port: int + + APP: Quart @@ -168,7 +172,7 @@ class AstrBotDashboard: """获取占用端口的进程详细信息""" try: for conn in psutil.net_connections(kind="inet"): - if cast(psutil_addr, conn.laddr).port == port: + if cast(_AddrWithPort, conn.laddr).port == port: try: process = psutil.Process(conn.pid) # 获取详细信息