diff --git a/astrbot/builtin_stars/astrbot/main.py b/astrbot/builtin_stars/astrbot/main.py
index cc2c368a23b..76b3942ca0a 100644
--- a/astrbot/builtin_stars/astrbot/main.py
+++ b/astrbot/builtin_stars/astrbot/main.py
@@ -240,7 +240,9 @@ async def on_message(self, event: AstrMessageEvent):
if not session_curr_cid:
logger.error(
- "当前未处于对话状态,无法主动回复,请确保 平台设置->会话隔离(unique_session) 未开启,并使用 /new 创建一个会话。",
+ "No active conversation is available for proactive replies. "
+ "Disable Isolate Conversation in Config -> Platforms & Messages "
+ "-> General, then use /new to create a conversation.",
)
return
diff --git a/astrbot/core/config/default.py b/astrbot/core/config/default.py
index 549aa557995..ff00d945e18 100644
--- a/astrbot/core/config/default.py
+++ b/astrbot/core/config/default.py
@@ -1240,7 +1240,7 @@ def get_local_permission_defaults(system: str | None = None) -> dict:
"id_whitelist": {
"type": "list",
"items": {"type": "string"},
- "hint": "只处理填写的 ID 发来的消息事件,为空时不启用。可使用 /sid 指令获取在平台上的会话 ID(类似 abc:GroupMessage:123)。管理员可在 WebUI 的平台设置中管理白名单",
+ "hint": "只处理填写的 ID 发来的消息事件,为空时不启用。可使用 /sid 指令获取在平台上的会话 ID(类似 abc:GroupMessage:123)。管理员可在 WebUI 的配置文件 -> 访问控制 -> 白名单中管理白名单。",
},
"id_whitelist_log": {
"type": "bool",
@@ -3284,7 +3284,7 @@ def get_local_permission_defaults(system: str | None = None) -> dict:
"""
CONFIG_METADATA_3 = {
"ai_group": {
- "name": "AI 配置",
+ "name": "AI",
"metadata": {
"agent_runner": {
"description": "Agent 执行方式",
@@ -3825,7 +3825,7 @@ def get_local_permission_defaults(system: str | None = None) -> dict:
"provider_settings.computer_use_require_admin": {
"description": "沙箱能力需要 AstrBot 管理员权限",
"type": "bool",
- "hint": "开启后,需要 AstrBot 管理员权限才能调用远程沙箱能力。在平台配置->管理员中可添加管理员。使用 /sid 指令查看管理员 ID。",
+ "hint": "开启后,需要 AstrBot 管理员权限才能调用远程沙箱能力。在配置文件 -> 访问控制 -> 管理员 -> 管理员 ID 中可添加管理员。给机器人发送 /sid 指令以获取 ID。",
"condition": {
"provider_settings.computer_use_runtime": "sandbox",
},
@@ -4280,17 +4280,12 @@ def get_local_permission_defaults(system: str | None = None) -> dict:
},
},
"platform_group": {
- "name": "平台配置",
+ "name": "平台与消息",
"metadata": {
"general": {
"description": "基本",
"type": "object",
"items": {
- "admins_id": {
- "description": "管理员 ID",
- "type": "list",
- "items": {"type": "string"},
- },
"platform_settings.unique_session": {
"description": "隔离对话",
"type": "bool",
@@ -4332,36 +4327,6 @@ def get_local_permission_defaults(system: str | None = None) -> dict:
},
},
},
- "whitelist": {
- "description": "白名单",
- "type": "object",
- "items": {
- "platform_settings.enable_id_white_list": {
- "description": "启用白名单",
- "type": "bool",
- "hint": "启用后,只有在白名单内的会话会被响应。",
- },
- "platform_settings.id_whitelist": {
- "description": "白名单 ID 列表",
- "type": "list",
- "items": {"type": "string"},
- "hint": "使用 /sid 获取 ID。当白名单列表为空时,代表不启用白名单(即所有 ID 都在白名单内)。",
- },
- "platform_settings.id_whitelist_log": {
- "description": "输出日志",
- "type": "bool",
- "hint": "启用后,当一条消息没通过白名单时,会输出 INFO 级别的日志。",
- },
- "platform_settings.wl_ignore_admin_on_group": {
- "description": "管理员群组消息无视 ID 白名单",
- "type": "bool",
- },
- "platform_settings.wl_ignore_admin_on_friend": {
- "description": "管理员私聊消息无视 ID 白名单",
- "type": "bool",
- },
- },
- },
"rate_limit": {
"description": "速率限制",
"type": "object",
@@ -4488,8 +4453,55 @@ def get_local_permission_defaults(system: str | None = None) -> dict:
},
},
},
+ "access_group": {
+ "name": "访问控制",
+ "metadata": {
+ "admins": {
+ "description": "管理员",
+ "type": "object",
+ "items": {
+ "admins_id": {
+ "description": "管理员 ID",
+ "type": "list",
+ "items": {"type": "string"},
+ "hint": "给机器人发送 /sid 指令以获取 ID。",
+ },
+ },
+ },
+ "whitelist": {
+ "description": "白名单",
+ "type": "object",
+ "items": {
+ "platform_settings.enable_id_white_list": {
+ "description": "启用白名单",
+ "type": "bool",
+ "hint": "启用后,只有在白名单内的会话会被响应。",
+ },
+ "platform_settings.id_whitelist": {
+ "description": "白名单 ID 列表",
+ "type": "list",
+ "items": {"type": "string"},
+ "hint": "给机器人发送 /sid 指令以获取 ID。为空时代表不启用白名单功能。",
+ },
+ "platform_settings.id_whitelist_log": {
+ "description": "输出拦截日志",
+ "type": "bool",
+ "hint": "输出未通过白名单校验的消息的日志。",
+ },
+ "platform_settings.wl_ignore_admin_on_group": {
+ "description": "管理员群组消息无视 ID 白名单",
+ "type": "bool",
+ },
+ "platform_settings.wl_ignore_admin_on_friend": {
+ "description": "管理员私聊消息无视 ID 白名单",
+ "type": "bool",
+ },
+ },
+ },
+ },
+ },
"plugin_group": {
- "name": "插件配置",
+ "name": "插件",
"metadata": {
"plugin": {
"description": "插件",
diff --git a/astrbot/core/pipeline/whitelist_check/stage.py b/astrbot/core/pipeline/whitelist_check/stage.py
index 0948de6c89e..856c8fa1fd5 100644
--- a/astrbot/core/pipeline/whitelist_check/stage.py
+++ b/astrbot/core/pipeline/whitelist_check/stage.py
@@ -65,6 +65,7 @@ async def process(
logger.info(
f"Session ID {event.unified_msg_origin} is not in the session "
"allowlist, so event propagation was stopped. Add this session "
- "ID to the allowlist in the configuration file.",
+ "ID in WebUI: Config -> Access Control -> Whitelist -> "
+ "Whitelist ID List, using the profile assigned to this bot.",
)
event.stop_event()
diff --git a/astrbot/core/tools/computer_tools/util.py b/astrbot/core/tools/computer_tools/util.py
index d31e5ff0460..5a65103d5ee 100644
--- a/astrbot/core/tools/computer_tools/util.py
+++ b/astrbot/core/tools/computer_tools/util.py
@@ -166,7 +166,9 @@ def check_admin_permission(
if require_admin and context.context.event.role != "admin":
return (
f"error: Permission denied. {operation_name} is only allowed for admin users. "
- "Tell user to set admins in `AstrBot WebUI -> Config -> General Config` by adding their user ID to the admins list if they need this feature. "
+ "Tell user to add their user ID under `AstrBot WebUI -> Config -> "
+ "Access Control -> Administrators -> Administrator IDs` in the "
+ "profile used by this bot if they need this feature. "
f"User's ID is: {context.context.event.get_sender_id()}. User's ID can be found by using /sid command."
)
return None
diff --git a/changelogs/unreleased.md b/changelogs/unreleased.md
index da75d417e64..5a551bf6137 100644
--- a/changelogs/unreleased.md
+++ b/changelogs/unreleased.md
@@ -1,5 +1,10 @@
# Unreleased
+- WebUI: Add model settings shortcuts beside selected models and inside model/fallback menus. Model edits save immediately for all profiles using that model.
+- WebUI: Move **Platform → General → Administrator IDs** to **Access Control → Administrators**, and **Platform → Whitelist** to **Access Control → Whitelist**. Rename Platform to Platforms & Messages. Order sections as AI, Platforms & Messages, Access Control, Plugin, and Extensions; remove the “configuration” suffix from section labels.
+- WebUI:模型选择器旁及模型、回退模型菜单内新增设置齿轮,模型设置保存后立即影响引用它的所有配置文件。
+- WebUI:**平台配置 → 基本 → 管理员 ID** 移至 **访问控制 → 管理员**,**平台配置 → 白名单** 移至 **访问控制 → 白名单**;平台分区改名为平台与消息;分区顺序调整为 AI、平台与消息、访问控制、插件、扩展功能,分区名称去掉“配置”后缀。
+
- Generate numbered original-path notices in the image preparation stage during main-agent construction, including quoted images. After request hooks, apply the same size and format policy only to newly introduced image references and refresh their notices. Skipped and captioned attachments retain explicit status without taking a visual index; animation labels identify frame montages.
- Raise the model image input cap from 32 MiB to 64 MiB. Larger originals are skipped before reading image bytes, with a model notice retaining their paths and suggesting the file-reading tool or a smaller upload; accepted inputs still produce images strictly below 512 KiB.
- Local Agent input images are always prepared as JPEG/PNG files strictly below 512 KiB. Compliant local images are reused without copying. Transparent previews retain PNG alpha; animations become 3×3 montages. Original attachment paths remain available to tools, and event-owned previews are deleted after use without a shared conversion cache.
diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css b/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css
index 0fb6e32fb1c..0bfb2cd1ba1 100644
--- a/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css
+++ b/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css
@@ -1,4 +1,4 @@
-/* Auto-generated MDI subset – 265 icons */
+/* Auto-generated MDI subset – 266 icons */
/* Do not edit manually. Run: pnpm run subset-icons */
@font-face {
@@ -32,6 +32,10 @@
content: "\F0FFB";
}
+.mdi-account-lock-outline::before {
+ content: "\F115F";
+}
+
.mdi-account-voice::before {
content: "\F05CB";
}
diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff b/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff
index 5076192f336..73751090427 100644
Binary files a/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff and b/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff differ
diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff2 b/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff2
index 74a42d29c41..b428589c9e3 100644
Binary files a/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff2 and b/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff2 differ
diff --git a/dashboard/src/components/config/AstrBotCoreConfigWrapper.vue b/dashboard/src/components/config/AstrBotCoreConfigWrapper.vue
index 5d44dbc0f45..546bb8ef046 100644
--- a/dashboard/src/components/config/AstrBotCoreConfigWrapper.vue
+++ b/dashboard/src/components/config/AstrBotCoreConfigWrapper.vue
@@ -99,9 +99,10 @@ import AstrBotConfigV4 from '@/components/shared/AstrBotConfigV4.vue';
import PluginSetSelector from '@/components/shared/PluginSetSelector.vue';
import { useModuleI18n } from '@/i18n/composables';
-const SECTION_ORDER = ['ai_group', 'plugin_group', 'platform_group', 'ext_group'];
+const SECTION_ORDER = ['ai_group', 'platform_group', 'access_group', 'plugin_group', 'ext_group'];
const SECTION_ICONS = {
ai_group: 'mdi-auto-fix',
+ access_group: 'mdi-account-lock-outline',
plugin_group: 'mdi-puzzle-outline',
platform_group: 'mdi-robot-outline',
ext_group: 'mdi-tune-variant'
diff --git a/dashboard/src/components/shared/ProviderSelectMenu.vue b/dashboard/src/components/shared/ProviderSelectMenu.vue
index fb9460af9ce..298e0a65561 100644
--- a/dashboard/src/components/shared/ProviderSelectMenu.vue
+++ b/dashboard/src/components/shared/ProviderSelectMenu.vue
@@ -298,6 +298,23 @@
{{ providerTm("models.testButton") }}
+
+
+
+
+ {{ providerTm("dialogs.config.editTitle") }}
+
+
+
+
+
+ {{ providerTm("dialogs.config.editTitle") }}
+
+
+
+
+
+ {{ providerEditDialogTitle }}
+
+
+
+
+
+
+
+ {{ providerTm("dialogs.config.cancel") }}
+
+
+ {{ providerTm("dialogs.config.save") }}
+
+
+
+