From 037164bedaa000b34d25728638ed7b4311b5394c Mon Sep 17 00:00:00 2001 From: Futureppo Date: Thu, 10 Apr 2025 23:52:14 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9D=83=E9=99=90?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/astrbot/main.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index 410151510..ae1a9d02b 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -111,7 +111,8 @@ async def help(self, event: AstrMessageEvent): {notice}""" event.set_result(MessageEventResult().message(msg).use_t2i(False)) - + + @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("llm") async def llm(self, event: AstrMessageEvent): """开启/关闭 LLM""" @@ -126,6 +127,7 @@ async def llm(self, event: AstrMessageEvent): cfg.save_config() yield event.plain_result(f"{status} LLM 聊天功能。") + @filter.command_group("tool") def tool(self): pass @@ -178,6 +180,7 @@ async def tool_all_off(self, event: AstrMessageEvent): self.context.deactivate_llm_tool(tool.name) event.set_result(MessageEventResult().message("停用所有工具成功。")) + @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("plugin") async def plugin( self, event: AstrMessageEvent, oper1: str = None, oper2: str = None @@ -278,6 +281,7 @@ async def plugin( ret += "更多帮助信息请查看插件仓库 README。" event.set_result(MessageEventResult().message(ret).use_t2i(False)) + @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("t2i") async def t2i(self, event: AstrMessageEvent): """开关文本转图片""" @@ -291,6 +295,7 @@ async def t2i(self, event: AstrMessageEvent): config.save_config() event.set_result(MessageEventResult().message("已开启文本转图片模式。")) + @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("tts") async def tts(self, event: AstrMessageEvent): """开关文本转语音""" @@ -304,6 +309,7 @@ async def tts(self, event: AstrMessageEvent): config.save_config() event.set_result(MessageEventResult().message("已开启文本转语音。")) + @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("sid") async def sid(self, event: AstrMessageEvent): """获取会话 ID 和 管理员 ID""" @@ -378,6 +384,7 @@ async def dwl(self, event: AstrMessageEvent, sid: str): except ValueError: event.set_result(MessageEventResult().message("此 SID 不在白名单内。")) + @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("provider") async def provider( self, event: AstrMessageEvent, idx: Union[str, int] = None, idx2: int = None @@ -531,6 +538,7 @@ async def reset(self, message: AstrMessageEvent): message.set_result(MessageEventResult().message(ret)) + @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("model") async def model_ls( self, message: AstrMessageEvent, idx_or_name: Union[int, str] = None @@ -596,6 +604,7 @@ async def model_ls( ) ) + @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("history") async def his(self, message: AstrMessageEvent, page: int = 1): """查看对话记录""" @@ -642,6 +651,7 @@ async def his(self, message: AstrMessageEvent, page: int = 1): message.set_result(MessageEventResult().message(ret).use_t2i(False)) + @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("ls") async def convs(self, message: AstrMessageEvent, page: int = 1): """查看对话列表""" @@ -781,6 +791,7 @@ async def groupnew_conv(self, message: AstrMessageEvent, sid: str): MessageEventResult().message("请输入群聊 ID。/groupnew 群聊ID。") ) + @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("switch") async def switch_conv(self, message: AstrMessageEvent, index: int = None): """通过 /ls 前面的序号切换对话""" @@ -842,6 +853,7 @@ async def switch_conv(self, message: AstrMessageEvent, index: int = None): ) ) + @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("rename") async def rename_conv(self, message: AstrMessageEvent, new_name: str): """重命名对话""" @@ -862,6 +874,7 @@ async def rename_conv(self, message: AstrMessageEvent, new_name: str): ) message.set_result(MessageEventResult().message("重命名对话成功。")) + @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("del") async def del_conv(self, message: AstrMessageEvent): """删除当前对话""" @@ -1061,6 +1074,7 @@ async def update_dashboard(self, event: AstrMessageEvent): await download_dashboard() yield event.plain_result("管理面板更新完成。") + @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("set") async def set_variable(self, event: AstrMessageEvent, key: str, value: str): # session_id = event.get_session_id() @@ -1076,6 +1090,7 @@ async def set_variable(self, event: AstrMessageEvent, key: str, value: str): yield event.plain_result(f"会话 {uid} 变量 {key} 存储成功。使用 /unset 移除。") + @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("unset") async def unset_variable(self, event: AstrMessageEvent, key: str): uid = event.unified_msg_origin @@ -1090,6 +1105,7 @@ async def unset_variable(self, event: AstrMessageEvent, key: str): sp.put("session_variables", session_vars) yield event.plain_result(f"会话 {uid} 变量 {key} 移除成功。") + @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("gewe_logout") async def gewe_logout(self, event: AstrMessageEvent): platforms = self.context.platform_manager.platform_insts @@ -1100,6 +1116,7 @@ async def gewe_logout(self, event: AstrMessageEvent): yield event.plain_result("已登出 gewechat,请重启 AstrBot") return + @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("gewe_code") async def gewe_code(self, event: AstrMessageEvent, code: str): """保存 gewechat 验证码""" @@ -1232,7 +1249,7 @@ async def decorate_llm_req(self, event: AstrMessageEvent, req: ProviderRequest): if mood_dialogs := persona["_mood_imitation_dialogs_processed"]: req.system_prompt += "\nHere are few shots of dialogs, you need to imitate the tone of 'B' in the following dialogs to respond:\n" req.system_prompt += mood_dialogs - if (begin_dialogs := persona["_begin_dialogs_processed"]) and not req.contexts: + if begin_dialogs := persona["_begin_dialogs_processed"]: req.contexts[:0] = begin_dialogs if quote and quote.message_str: From 463fbd1376f3c0e9adc9ee09fd6a82bf28f2e383 Mon Sep 17 00:00:00 2001 From: anka <1350989414@qq.com> Date: Fri, 11 Apr 2025 00:17:55 +0800 Subject: [PATCH 2/6] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=E4=B8=80=E5=A4=84?= =?UTF-8?q?=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/astrbot/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index ae1a9d02b..43c5c4a67 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -1249,7 +1249,7 @@ async def decorate_llm_req(self, event: AstrMessageEvent, req: ProviderRequest): if mood_dialogs := persona["_mood_imitation_dialogs_processed"]: req.system_prompt += "\nHere are few shots of dialogs, you need to imitate the tone of 'B' in the following dialogs to respond:\n" req.system_prompt += mood_dialogs - if begin_dialogs := persona["_begin_dialogs_processed"]: + if (begin_dialogs := persona["_begin_dialogs_processed"]) and not req.contexts: req.contexts[:0] = begin_dialogs if quote and quote.message_str: From f1badbfb236f20848a12c23175769a3aa4b60783 Mon Sep 17 00:00:00 2001 From: Futureppo Date: Wed, 23 Apr 2025 00:02:36 +0800 Subject: [PATCH 3/6] Update main.py --- packages/astrbot/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index 43c5c4a67..47d5f0874 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -309,7 +309,6 @@ async def tts(self, event: AstrMessageEvent): config.save_config() event.set_result(MessageEventResult().message("已开启文本转语音。")) - @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("sid") async def sid(self, event: AstrMessageEvent): """获取会话 ID 和 管理员 ID""" From 2b3879cf72d4134a88fe1f2ead4114d131254091 Mon Sep 17 00:00:00 2001 From: Futureppo Date: Wed, 23 Apr 2025 08:10:05 +0800 Subject: [PATCH 4/6] Update main.py --- packages/astrbot/main.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index 47d5f0874..afb60605f 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -180,7 +180,6 @@ async def tool_all_off(self, event: AstrMessageEvent): self.context.deactivate_llm_tool(tool.name) event.set_result(MessageEventResult().message("停用所有工具成功。")) - @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("plugin") async def plugin( self, event: AstrMessageEvent, oper1: str = None, oper2: str = None @@ -383,7 +382,6 @@ async def dwl(self, event: AstrMessageEvent, sid: str): except ValueError: event.set_result(MessageEventResult().message("此 SID 不在白名单内。")) - @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("provider") async def provider( self, event: AstrMessageEvent, idx: Union[str, int] = None, idx2: int = None @@ -603,7 +601,6 @@ async def model_ls( ) ) - @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("history") async def his(self, message: AstrMessageEvent, page: int = 1): """查看对话记录""" @@ -650,7 +647,6 @@ async def his(self, message: AstrMessageEvent, page: int = 1): message.set_result(MessageEventResult().message(ret).use_t2i(False)) - @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("ls") async def convs(self, message: AstrMessageEvent, page: int = 1): """查看对话列表""" @@ -790,7 +786,6 @@ async def groupnew_conv(self, message: AstrMessageEvent, sid: str): MessageEventResult().message("请输入群聊 ID。/groupnew 群聊ID。") ) - @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("switch") async def switch_conv(self, message: AstrMessageEvent, index: int = None): """通过 /ls 前面的序号切换对话""" @@ -852,7 +847,6 @@ async def switch_conv(self, message: AstrMessageEvent, index: int = None): ) ) - @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("rename") async def rename_conv(self, message: AstrMessageEvent, new_name: str): """重命名对话""" @@ -873,7 +867,6 @@ async def rename_conv(self, message: AstrMessageEvent, new_name: str): ) message.set_result(MessageEventResult().message("重命名对话成功。")) - @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("del") async def del_conv(self, message: AstrMessageEvent): """删除当前对话""" @@ -1073,7 +1066,6 @@ async def update_dashboard(self, event: AstrMessageEvent): await download_dashboard() yield event.plain_result("管理面板更新完成。") - @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("set") async def set_variable(self, event: AstrMessageEvent, key: str, value: str): # session_id = event.get_session_id() @@ -1089,7 +1081,6 @@ async def set_variable(self, event: AstrMessageEvent, key: str, value: str): yield event.plain_result(f"会话 {uid} 变量 {key} 存储成功。使用 /unset 移除。") - @filter.permission_type(filter.PermissionType.ADMIN) @filter.command("unset") async def unset_variable(self, event: AstrMessageEvent, key: str): uid = event.unified_msg_origin From 963f9b6b168d875c7aae5fa83a0a963ab018e679 Mon Sep 17 00:00:00 2001 From: Futureppo Date: Tue, 5 Aug 2025 23:03:23 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0tool=20on=5Fall=20?= =?UTF-8?q?=E6=8C=87=E4=BB=A4=E7=94=A8=E4=BA=8E=E5=BC=80=E5=90=AF=E6=89=80?= =?UTF-8?q?=E6=9C=89=E5=87=BD=E6=95=B0=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/astrbot/main.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index 1dd2cbe2f..cebc98498 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -202,6 +202,14 @@ async def tool_all_off(self, event: AstrMessageEvent): self.context.deactivate_llm_tool(tool.name) event.set_result(MessageEventResult().message("停用所有工具成功。")) + @tool.command("on_all") + async def tool_all_on(self, event: AstrMessageEvent): + """启用所有函数工具""" + tm = self.context.get_llm_tool_manager() + for tool in tm.func_list: + self.context.activate_llm_tool(tool.name) + event.set_result(MessageEventResult().message("启用所有工具成功。")) + @filter.command_group("plugin") def plugin(self): pass From c744a6490611c6a0395c5adb94ba8163714cf20c Mon Sep 17 00:00:00 2001 From: Futureppo Date: Thu, 2 Oct 2025 18:36:59 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=B8=82=E5=9C=BA?= =?UTF-8?q?=E6=8B=BC=E9=9F=B3=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dashboard/package.json | 1 + dashboard/src/views/ExtensionPage.vue | 29 ++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/dashboard/package.json b/dashboard/package.json index 56d6540e5..9c5d6f1e9 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -27,6 +27,7 @@ "lodash": "4.17.21", "marked": "^15.0.7", "markdown-it": "^14.1.0", + "pinyin-pro": "^3.26.0", "pinia": "2.1.6", "remixicon": "3.5.0", "vee-validate": "4.11.3", diff --git a/dashboard/src/views/ExtensionPage.vue b/dashboard/src/views/ExtensionPage.vue index 0560cc018..0dfd4430b 100644 --- a/dashboard/src/views/ExtensionPage.vue +++ b/dashboard/src/views/ExtensionPage.vue @@ -5,6 +5,7 @@ import ConsoleDisplayer from '@/components/shared/ConsoleDisplayer.vue'; import ReadmeDialog from '@/components/shared/ReadmeDialog.vue'; import ProxySelector from '@/components/shared/ProxySelector.vue'; import axios from 'axios'; +import { pinyin } from 'pinyin-pro'; import { useCommonStore } from '@/stores/common'; import { useI18n, useModuleI18n } from '@/i18n/composables'; @@ -65,6 +66,32 @@ const marketSearch = ref(""); const filterKeys = ['name', 'desc', 'author']; const refreshingMarket = ref(false); +// 插件市场拼音搜索 +const normalizeStr = (s) => (s ?? '').toString().toLowerCase().trim(); +const toPinyinText = (s) => pinyin(s ?? '', { toneType: 'none' }).toLowerCase().replace(/\s+/g, ''); +const toInitials = (s) => pinyin(s ?? '', { pattern: 'first', toneType: 'none' }).toLowerCase().replace(/\s+/g, ''); +const marketCustomFilter = (value, query, item) => { + const q = normalizeStr(query); + if (!q) return true; + + const candidates = new Set(); + if (value != null) candidates.add(String(value)); + if (item?.name) candidates.add(String(item.name)); + if (item?.trimmedName) candidates.add(String(item.trimmedName)); + if (item?.desc) candidates.add(String(item.desc)); + if (item?.author) candidates.add(String(item.author)); + + for (const v of candidates) { + const nv = normalizeStr(v); + if (nv.includes(q)) return true; + const pv = toPinyinText(v); + if (pv.includes(q)) return true; + const iv = toInitials(v); + if (iv.includes(q)) return true; + } + return false; +}; + const plugin_handler_info_headers = computed(() => [ { title: tm('table.headers.eventType'), key: 'event_type_h' }, { title: tm('table.headers.description'), key: 'desc', maxWidth: '250px' }, @@ -772,7 +799,7 @@ onMounted(async () => { + :loading="loading_" v-model:search="marketSearch" :filter-keys="filterKeys" :custom-filter="marketCustomFilter">