From a60a40bca33ff46381c5961ec4273ec0527f8239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=B3=AF=E7=B1=B3=E8=8C=A8?= <143102889+nuomicici@users.noreply.github.com> Date: Fri, 13 Mar 2026 20:51:39 +0800 Subject: [PATCH 01/19] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=96=B0=E7=89=88=E6=9C=AC=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update the instructions for installing and configuring the Matrix adapter in AstrBot. --- docs/zh/platform/matrix.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/zh/platform/matrix.md b/docs/zh/platform/matrix.md index e4445e739..d27b337c2 100644 --- a/docs/zh/platform/matrix.md +++ b/docs/zh/platform/matrix.md @@ -8,6 +8,7 @@ 进入 AstrBot WebUI 的插件市场,搜索 `astrbot_plugin_matrix_adapter`,点击安装。 安装完成后,前往 消息平台 → 新增适配器 → 选择 Matrix(若选项缺失,尝试重启 AstrBot 或检查插件安装状态)。 +> 新版本`消息平台`更名为`机器人` 在弹出的配置对话框中点击 `启用`。 From 97732987d97b721f17ba6951251f09fa5347a530 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=B3=AF=E7=B1=B3=E8=8C=A8?= <143102889+nuomicici@users.noreply.github.com> Date: Fri, 13 Mar 2026 20:53:41 +0800 Subject: [PATCH 02/19] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=96=B0=E7=89=88=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/platform/wecom_ai_bot.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/zh/platform/wecom_ai_bot.md b/docs/zh/platform/wecom_ai_bot.md index 904c0790c..6ea10ad57 100644 --- a/docs/zh/platform/wecom_ai_bot.md +++ b/docs/zh/platform/wecom_ai_bot.md @@ -31,6 +31,7 @@ ## 配置 AstrBot 1. 进入 AstrBot 的管理面板,点击左侧栏 `消息平台`,然后在右侧的界面中,点击 `+ 新增适配器`,选择 `企业微信智能机器人`,进入配置页面。 + > 请注意,最新版本`消息平台`已更名为`机器人`! ![新增适配器](https://files.astrbot.app/docs/source/images/wecom_ai_bot/image-2.png) From 8d2140f607506423cf5f5c572be73b11ea6b5138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=B3=AF=E7=B1=B3=E8=8C=A8?= <143102889+nuomicici@users.noreply.github.com> Date: Fri, 13 Mar 2026 21:13:45 +0800 Subject: [PATCH 03/19] Update docs/zh/platform/wecom_ai_bot.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- docs/zh/platform/wecom_ai_bot.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/zh/platform/wecom_ai_bot.md b/docs/zh/platform/wecom_ai_bot.md index 6ea10ad57..55aca1b01 100644 --- a/docs/zh/platform/wecom_ai_bot.md +++ b/docs/zh/platform/wecom_ai_bot.md @@ -30,8 +30,7 @@ ## 配置 AstrBot -1. 进入 AstrBot 的管理面板,点击左侧栏 `消息平台`,然后在右侧的界面中,点击 `+ 新增适配器`,选择 `企业微信智能机器人`,进入配置页面。 - > 请注意,最新版本`消息平台`已更名为`机器人`! +1. 进入 AstrBot 的管理面板,点击左侧栏 `机器人`(旧版本为 `消息平台`),然后在右侧的界面中,点击 `+ 新增适配器`,选择 `企业微信智能机器人`,进入配置页面。 ![新增适配器](https://files.astrbot.app/docs/source/images/wecom_ai_bot/image-2.png) From 1afbb357db4e134fbb2aaf3d955a2e5245e78177 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=B3=AF=E7=B1=B3=E8=8C=A8?= <143102889+nuomicici@users.noreply.github.com> Date: Fri, 13 Mar 2026 21:14:00 +0800 Subject: [PATCH 04/19] Update docs/zh/platform/matrix.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- docs/zh/platform/matrix.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/zh/platform/matrix.md b/docs/zh/platform/matrix.md index d27b337c2..822ce853d 100644 --- a/docs/zh/platform/matrix.md +++ b/docs/zh/platform/matrix.md @@ -7,8 +7,7 @@ 进入 AstrBot WebUI 的插件市场,搜索 `astrbot_plugin_matrix_adapter`,点击安装。 -安装完成后,前往 消息平台 → 新增适配器 → 选择 Matrix(若选项缺失,尝试重启 AstrBot 或检查插件安装状态)。 -> 新版本`消息平台`更名为`机器人` +安装完成后,前往 机器人(旧版本为 `消息平台`) → 新增适配器 → 选择 Matrix(若选项缺失,尝试重启 AstrBot 或检查插件安装状态)。 在弹出的配置对话框中点击 `启用`。 From 493662524a4516e25c8c44afa7a9aff9d4efec56 Mon Sep 17 00:00:00 2001 From: Salman Chishti Date: Sat, 14 Mar 2026 10:08:25 +0000 Subject: [PATCH 05/19] ci: upgrade GitHub Actions to latest versions (#6251) Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 68da87dfd..0cfe18261 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -50,7 +50,7 @@ jobs: echo "tag=$tag" >> "$GITHUB_OUTPUT" - name: Setup pnpm - uses: pnpm/action-setup@v4.3.0 + uses: pnpm/action-setup@v4.4.0 with: version: 10.28.2 From 89fbd75e7ac9c23e2e8e02f297b5c104c0f38b75 Mon Sep 17 00:00:00 2001 From: MousseC <31097345+MousseC@users.noreply.github.com> Date: Sat, 14 Mar 2026 18:12:55 +0800 Subject: [PATCH 06/19] perf(OneBot): add a whitespace after At component (#6238) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复 At 组件后的空格在发送时被 strip 移除的问题。在消息解析时检测 At 组件并在其后额外插入空格。 --- .../sources/aiocqhttp/aiocqhttp_message_event.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py b/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py index 7e42a0fd8..4b642d8ce 100644 --- a/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py +++ b/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py @@ -6,6 +6,7 @@ from aiocqhttp import CQHttp, Event from astrbot.api.event import AstrMessageEvent, MessageChain from astrbot.api.message_components import ( + At, BaseMessageComponent, File, Image, @@ -70,11 +71,19 @@ class AiocqhttpMessageEvent(AstrMessageEvent): """解析成 OneBot json 格式""" ret = [] for segment in message_chain.chain: - if isinstance(segment, Plain): + if isinstance(segment, At): + # At 组件后插入一个空格,避免与后续文本粘连 + d = await AiocqhttpMessageEvent._from_segment_to_dict(segment) + ret.append(d) + ret.append({"type": "text", "data": {"text": " "}}) + elif isinstance(segment, Plain): if not segment.text.strip(): continue - d = await AiocqhttpMessageEvent._from_segment_to_dict(segment) - ret.append(d) + d = await AiocqhttpMessageEvent._from_segment_to_dict(segment) + ret.append(d) + else: + d = await AiocqhttpMessageEvent._from_segment_to_dict(segment) + ret.append(d) return ret @classmethod From 38f5e077ee59996dcfae5ba40b5ed1e05406ac8d Mon Sep 17 00:00:00 2001 From: lalala Date: Sat, 14 Mar 2026 18:15:06 +0800 Subject: [PATCH 07/19] fix: remove duplicate dependencies (#6247) remove duplicate `aiocqhttp` `aiodocker` `aiohttp` in requirements.txt --- requirements.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 49e0707e0..124937039 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,6 @@ aiocqhttp>=1.4.4 aiodocker>=0.24.0 aiohttp>=3.11.18 -aiocqhttp>=1.4.4 -aiodocker>=0.24.0 -aiohttp>=3.11.18 aiosqlite>=0.21.0 anthropic>=0.51.0 apscheduler>=3.11.0 From 08fc6577555f7aa5fddea80b42e7fa2a24302706 Mon Sep 17 00:00:00 2001 From: qingyun Date: Sat, 14 Mar 2026 18:18:14 +0800 Subject: [PATCH 08/19] fix: preserve whitespace in Plain.toDict() for @ mentions (#6244) * fix: preserve whitespace in Plain.toDict() for @ mentions - Remove .strip() from Plain.toDict() to match async to_dict() behavior - Fixes #6237: QQ @mentions no longer lose trailing spaces - This ensures '@user message' displays correctly instead of '@usermessage' * refactor: remove redundant to_dict() from Plain class - Let Plain inherit to_dict() from BaseMessageComponent - BaseMessageComponent.to_dict() calls toDict() by default - Reduces code duplication and prevents future divergence - Addressed code review feedback from @gemini-code-assist and @sourcery-ai * feat: add async to_dict method to Plain message component * fix: add return type hint to Plain.toDict method --------- Co-authored-by: ccsang Co-authored-by: Soulter <905617992@qq.com> --- astrbot/core/message/components.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/astrbot/core/message/components.py b/astrbot/core/message/components.py index d9ea6aa26..6311681cd 100644 --- a/astrbot/core/message/components.py +++ b/astrbot/core/message/components.py @@ -96,10 +96,10 @@ class Plain(BaseMessageComponent): def __init__(self, text: str, convert: bool = True, **_) -> None: super().__init__(text=text, convert=convert, **_) - def toDict(self): - return {"type": "text", "data": {"text": self.text.strip()}} + def toDict(self) -> dict: + return {"type": "text", "data": {"text": self.text}} - async def to_dict(self): + async def to_dict(self) -> dict: return {"type": "text", "data": {"text": self.text}} From 326183a3fd5037b43d17ae8cf1ddb84fa895bed3 Mon Sep 17 00:00:00 2001 From: DroidKali <21024784+DroidKali@users.noreply.github.com> Date: Sat, 14 Mar 2026 18:20:48 +0800 Subject: [PATCH 09/19] fix: update startup command to 'astrbot run' in all README files (#6189) Updated the quick start command from 'astrbot' to 'astrbot run' across all language versions of README documentation for consistency and correctness. Co-authored-by: DroidKali Co-authored-by: Qwen-Coder --- README.md | 2 +- README_fr.md | 2 +- README_ja.md | 2 +- README_ru.md | 2 +- README_zh-TW.md | 2 +- README_zh.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 8ad697131..7b56c756a 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ For users who want to quickly experience AstrBot, are familiar with command-line ```bash uv tool install astrbot astrbot init # Only execute this command for the first time to initialize the environment -astrbot +astrbot run ``` > Requires [uv](https://docs.astral.sh/uv/) to be installed. diff --git a/README_fr.md b/README_fr.md index e406d32b2..98e7f9955 100644 --- a/README_fr.md +++ b/README_fr.md @@ -78,7 +78,7 @@ Pour les utilisateurs qui veulent découvrir AstrBot rapidement, qui sont famili ```bash uv tool install astrbot astrbot init # Exécutez cette commande uniquement la première fois pour initialiser l'environnement -astrbot +astrbot run ``` > [uv](https://docs.astral.sh/uv/) doit être installé. diff --git a/README_ja.md b/README_ja.md index 7aa146c13..2b7c43d48 100644 --- a/README_ja.md +++ b/README_ja.md @@ -78,7 +78,7 @@ AstrBot を素早く試したいユーザーで、コマンドラインに慣れ ```bash uv tool install astrbot astrbot init # 初回のみ実行して環境を初期化します -astrbot +astrbot run ``` > [uv](https://docs.astral.sh/uv/) のインストールが必要です。 diff --git a/README_ru.md b/README_ru.md index 35da14acb..29d077b45 100644 --- a/README_ru.md +++ b/README_ru.md @@ -78,7 +78,7 @@ AstrBot — это универсальная платформа Agent-чатб ```bash uv tool install astrbot astrbot init # Выполните эту команду только при первом запуске для инициализации окружения -astrbot +astrbot run ``` > Требуется установленный [uv](https://docs.astral.sh/uv/). diff --git a/README_zh-TW.md b/README_zh-TW.md index 1ace852b8..20749a077 100644 --- a/README_zh-TW.md +++ b/README_zh-TW.md @@ -78,7 +78,7 @@ AstrBot 是一個開源的一站式 Agent 聊天機器人平台,可接入主 ```bash uv tool install astrbot astrbot init # 僅首次執行此命令以初始化環境 -astrbot +astrbot run ``` > 需要安裝 [uv](https://docs.astral.sh/uv/)。 diff --git a/README_zh.md b/README_zh.md index e13d9b4e5..1e7c6b7f3 100644 --- a/README_zh.md +++ b/README_zh.md @@ -78,7 +78,7 @@ AstrBot 是一个开源的一站式 Agentic 个人和群聊助手,可在 QQ、 ```bash uv tool install astrbot astrbot init # 仅首次执行此命令以初始化环境 -astrbot +astrbot run ``` > 需要安装 [uv](https://docs.astral.sh/uv/)。 From 1a03180643dbc335e59a7a86535bd0a64cf676a8 Mon Sep 17 00:00:00 2001 From: Ann-Holmes <41296458+Ann-Holmes@users.noreply.github.com> Date: Sat, 14 Mar 2026 18:21:47 +0800 Subject: [PATCH 10/19] Add binding for local temp directory in YAML (#6191) * Add binding for local temp directory in YAML Bind the local temp directory to the sandbox for file access. * Update compose-with-shipyard.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> --------- Co-authored-by: Soulter <37870767+Soulter@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> --- compose-with-shipyard.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/compose-with-shipyard.yml b/compose-with-shipyard.yml index 338f7b86f..24ced5a95 100644 --- a/compose-with-shipyard.yml +++ b/compose-with-shipyard.yml @@ -37,6 +37,7 @@ services: - DEFAULT_SHIP_MEMORY=512m volumes: - ${PWD}/data/shipyard/bay_data:/app/data + - ${PWD}/data/temp:/AstrBot/data/temp # Bind the local temp directory to the sandbox so that the uploaded file can be accessed in the sandbox - /var/run/docker.sock:/var/run/docker.sock:ro networks: - astrbot_network From 86ef758a9a13731661795fe9f2ef4aba9f16d34b Mon Sep 17 00:00:00 2001 From: eason <85663565+mango766@users.noreply.github.com> Date: Sat, 14 Mar 2026 18:22:14 +0800 Subject: [PATCH 11/19] fix: prevent ValueError when removing already-removed API key in retry loop (#6193) In _handle_api_error(), when a 429 rate-limit is encountered, the code calls available_api_keys.remove(chosen_key). If the same key was already removed in a previous retry iteration (e.g. the key rotated back to the same value), this raises ValueError which crashes the entire LLM request with an opaque error instead of a proper retry/fallback. Add a membership check before calling remove() to prevent the crash. Co-authored-by: easonysliu --- astrbot/core/provider/sources/openai_source.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/astrbot/core/provider/sources/openai_source.py b/astrbot/core/provider/sources/openai_source.py index adee24073..c40234ed4 100644 --- a/astrbot/core/provider/sources/openai_source.py +++ b/astrbot/core/provider/sources/openai_source.py @@ -629,7 +629,8 @@ class ProviderOpenAIOfficial(Provider): # 最后一次不等待 if retry_cnt < max_retries - 1: await asyncio.sleep(1) - available_api_keys.remove(chosen_key) + if chosen_key in available_api_keys: + available_api_keys.remove(chosen_key) if len(available_api_keys) > 0: chosen_key = random.choice(available_api_keys) return ( From f8d075b5d3c040a1eff1bf3bd6ed00ef25f8f009 Mon Sep 17 00:00:00 2001 From: Sakari <20642596+sakarie9@users.noreply.github.com> Date: Sat, 14 Mar 2026 18:27:13 +0800 Subject: [PATCH 12/19] fix(telegram): avoid treating normal replies as topic threads (#6174) --- astrbot/core/platform/sources/telegram/tg_adapter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/astrbot/core/platform/sources/telegram/tg_adapter.py b/astrbot/core/platform/sources/telegram/tg_adapter.py index 2dd72bd0c..87e21391e 100644 --- a/astrbot/core/platform/sources/telegram/tg_adapter.py +++ b/astrbot/core/platform/sources/telegram/tg_adapter.py @@ -289,8 +289,8 @@ class TelegramPlatformAdapter(Platform): else: message.type = MessageType.GROUP_MESSAGE message.group_id = str(update.message.chat.id) - if update.message.message_thread_id: - # Topic Group + if update.message.is_topic_message and update.message.message_thread_id: + # Telegram Topic Group: include thread id to isolate per-topic sessions. message.group_id += "#" + str(update.message.message_thread_id) message.session_id = message.group_id message.message_id = str(update.message.message_id) From 91933bbd19e88b1c174ff2c0158a7d4062674813 Mon Sep 17 00:00:00 2001 From: Anima Date: Sat, 14 Mar 2026 20:45:55 +0800 Subject: [PATCH 13/19] perf: webui theme color improvement (#6263) * fix: update scrollbar styles to follow theme variables * fix: update theme colors to use CSS variables for consistency * fix: change login button color to primary for better visibility * fix: update theme colors for Dark and Light themes; change login button color to secondary * fix: update border and theme colors for consistency in DarkTheme * fix: update sidebar list class to conditionally hide scrollbar in mini sidebar mode * fix: simplify button visibility logic and remove unnecessary leftPadding style * fix: refactor language switcher to use grouped menu for better UX * fix: update theme colors to use primary color for consistency across components * fix: add preview text for template output in multiple languages --- dashboard/src/components/chat/ChatInput.vue | 22 +-- .../components/chat/ConversationSidebar.vue | 170 ++++++++++++++---- .../chat/message_list_comps/RefNode.vue | 13 +- .../components/shared/LanguageSwitcher.vue | 9 +- dashboard/src/components/shared/Logo.vue | 5 +- .../src/components/shared/StyledMenu.vue | 32 ++-- .../src/i18n/locales/en-US/core/shared.json | 1 + .../src/i18n/locales/ru-RU/core/shared.json | 1 + .../src/i18n/locales/zh-CN/core/shared.json | 1 + .../full/vertical-header/VerticalHeader.vue | 90 +++++++--- .../full/vertical-sidebar/VerticalSidebar.vue | 2 +- .../src/scss/components/_VScrollbar.scss | 81 +++------ dashboard/src/scss/layout/_sidebar.scss | 15 +- dashboard/src/theme/DarkTheme.ts | 18 +- dashboard/src/theme/LightTheme.ts | 8 +- .../views/authentication/auth/LoginPage.vue | 4 +- 16 files changed, 288 insertions(+), 184 deletions(-) diff --git a/dashboard/src/components/chat/ChatInput.vue b/dashboard/src/components/chat/ChatInput.vue index 87cc82c66..d2d9c4b88 100644 --- a/dashboard/src/components/chat/ChatInput.vue +++ b/dashboard/src/components/chat/ChatInput.vue @@ -15,7 +15,7 @@
- mdi-cloud-upload + mdi-cloud-upload {{ tm('input.dropToUpload') }}
@@ -41,7 +41,7 @@ @@ -87,7 +87,7 @@ {{ tm('voice.liveMode') }} --> - @@ -95,13 +95,13 @@ {{ isRecording ? tm('voice.speaking') : tm('voice.startRecording') }} - + {{ tm('input.stopGenerating') }} - @@ -117,7 +117,7 @@
- + {{ tm('voice.recording') }} @@ -126,7 +126,7 @@
- + {{ file.original_name }} @@ -399,8 +399,8 @@ defineExpose({ left: 0; right: 0; bottom: 0; - background-color: rgba(103, 58, 183, 0.15); - border: 2px dashed rgba(103, 58, 183, 0.5); + background-color: rgba(var(--v-theme-primary), 0.12); + border: 2px dashed rgba(var(--v-theme-primary), 0.45); border-radius: 24px; display: flex; align-items: center; @@ -419,7 +419,7 @@ defineExpose({ .drop-text { font-size: 16px; font-weight: 500; - color: #673ab7; + color: rgb(var(--v-theme-primary)); } /* Fade transition for drop overlay */ @@ -439,7 +439,7 @@ defineExpose({ justify-content: space-between; padding: 8px 16px; margin: 8px 8px 0 8px; - background-color: rgba(103, 58, 183, 0.06); + background-color: rgba(var(--v-theme-primary), 0.06); border-radius: 12px; gap: 8px; max-height: 500px; diff --git a/dashboard/src/components/chat/ConversationSidebar.vue b/dashboard/src/components/chat/ConversationSidebar.vue index 01a5fccfb..37dee4041 100644 --- a/dashboard/src/components/chat/ConversationSidebar.vue +++ b/dashboard/src/components/chat/ConversationSidebar.vue @@ -5,7 +5,7 @@ 'mobile-sidebar-open': isMobile && mobileMenuOpen, 'mobile-sidebar': isMobile }" - :style="{ 'background-color': isDark ? sidebarCollapsed ? '#1e1e1e' : '#2d2d2d' : sidebarCollapsed ? '#ffffff' : '#f1f4f9' }"> + :style="{ backgroundColor: sidebarCollapsed && !isMobile ? 'rgb(var(--v-theme-surface))' : 'rgb(var(--v-theme-mcpCardBg))' }">