Skip to content
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
"""使用此功能应该先 pip install baidu-aip"""

from typing import Any, cast

from aip import AipContentCensor

from . import ContentSafetyStrategy
Expand All @@ -23,7 +25,8 @@ def check(self, content: str) -> tuple[bool, str]:
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
4 changes: 2 additions & 2 deletions astrbot/core/platform/message_session.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from dataclasses import dataclass
from dataclasses import dataclass, field

from astrbot.core.platform.message_type import MessageType

Expand All @@ -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)
Comment thread
sourcery-ai[bot] marked this conversation as resolved.

def __str__(self):
return f"{self.platform_id}:{self.message_type.value}:{self.session_id}"
Expand Down
15 changes: 13 additions & 2 deletions astrbot/core/platform/sources/discord/discord_platform_adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -444,9 +444,20 @@ async def dynamic_callback(
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),
Expand Down
2 changes: 1 addition & 1 deletion astrbot/core/provider/sources/fishaudio_tts_api_source.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ def __init__(
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
Expand Down
2 changes: 1 addition & 1 deletion astrbot/dashboard/routes/cron.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def __init__(
]
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):
Expand Down
3 changes: 2 additions & 1 deletion astrbot/dashboard/routes/knowledge_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import os
import traceback
import uuid
from typing import Any

import aiofiles
from quart import request
Expand Down Expand Up @@ -75,7 +76,7 @@ def _init_task(self, task_id: str, status: str = "pending") -> None:
}

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,
Expand Down
10 changes: 7 additions & 3 deletions astrbot/dashboard/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,13 @@
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

Expand All @@ -29,6 +28,11 @@
from .routes.subagent import SubAgentRoute
from .routes.t2i import T2iRoute


class _AddrWithPort(Protocol):
port: int


APP: Quart


Expand Down Expand Up @@ -168,7 +172,7 @@ def get_process_using_port(self, port: int) -> str:
"""获取占用端口的进程详细信息"""
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)
# 获取详细信息
Expand Down