From f57fc1ff80043c0722a007dad24536f46e0f102c Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Mon, 4 May 2026 18:05:52 +0800 Subject: [PATCH] =?UTF-8?q?fear=EF=BC=9A=E6=8C=81=E7=BB=AD=E8=8E=B7?= =?UTF-8?q?=E5=8F=96maisak=E7=9B=91=E6=8E=A7=EF=BC=88=E5=A3=B3=E5=BC=80?= =?UTF-8?q?=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dashboard/src/routes/config/bot.tsx | 36 -- .../config/bot/hooks/complexFieldHooks.tsx | 6 - .../src/routes/config/bot/hooks/index.ts | 1 - .../bot/sections/ExperimentalSection.tsx | 311 ----------------- .../src/routes/config/bot/sections/index.ts | 1 - dashboard/src/routes/config/bot/types.ts | 12 - .../src/routes/monitor/maisaka-monitor.tsx | 21 +- .../src/routes/monitor/use-maisaka-monitor.ts | 330 +++++++++++------- pytests/test_maisaka_monitor_protocol.py | 35 ++ requirements.txt | 1 - src/maisaka/runtime.py | 2 +- 11 files changed, 254 insertions(+), 502 deletions(-) delete mode 100644 dashboard/src/routes/config/bot/sections/ExperimentalSection.tsx diff --git a/dashboard/src/routes/config/bot.tsx b/dashboard/src/routes/config/bot.tsx index ce62a96b..08c0bf5a 100644 --- a/dashboard/src/routes/config/bot.tsx +++ b/dashboard/src/routes/config/bot.tsx @@ -29,7 +29,6 @@ import { Code2, Info, Layout, Power, Save } from 'lucide-react' import type { ConfigSchema } from '@/types/config-schema' import { ChatTalkValueRulesHook, - ExperimentalChatPromptsHook, ExpressionGroupsHook, ExpressionLearningListHook, KeywordRulesHook, @@ -53,9 +52,7 @@ const TAB_ORDER = [ 'expression', 'emoji', 'response_post_process', - 'lpmm_knowledge', 'webui', - 'maisaka', 'plugin_runtime', 'log', ] @@ -156,22 +153,18 @@ function BotConfigPageContent() { const [expressionConfig, setExpressionConfig] = useState(null) const [emojiConfig, setEmojiConfig] = useState(null) const [memoryConfig, setMemoryConfig] = useState(null) - const [relationshipConfig, setRelationshipConfig] = useState(null) const [visualConfig, setVisualConfig] = useState(null) const [voiceConfig, setVoiceConfig] = useState(null) const [messageReceiveConfig, setMessageReceiveConfig] = useState(null) - const [lpmmConfig, setLpmmConfig] = useState(null) const [keywordReactionConfig, setKeywordReactionConfig] = useState(null) const [responsePostProcessConfig, setResponsePostProcessConfig] = useState(null) const [chineseTypoConfig, setChineseTypoConfig] = useState(null) const [responseSplitterConfig, setResponseSplitterConfig] = useState(null) const [debugConfig, setDebugConfig] = useState(null) - const [experimentalConfig, setExperimentalConfig] = useState(null) const [maimMessageConfig, setMaimMessageConfig] = useState(null) const [telemetryConfig, setTelemetryConfig] = useState(null) const [webuiConfig, setWebuiConfig] = useState(null) const [databaseConfig, setDatabaseConfig] = useState(null) - const [maisakaConfig, setMaisakaConfig] = useState(null) const [mcpConfig, setMcpConfig] = useState(null) const [pluginRuntimeConfig, setPluginRuntimeConfig] = useState(null) const [aMemorixConfig, setAMemorixConfig] = useState(null) @@ -255,22 +248,18 @@ function BotConfigPageContent() { setExpressionConfig((config.expression ?? {}) as ConfigSectionData) setEmojiConfig((config.emoji ?? {}) as ConfigSectionData) setMemoryConfig((config.memory ?? {}) as ConfigSectionData) - setRelationshipConfig((config.relationship ?? {}) as ConfigSectionData) setVisualConfig((config.visual ?? {}) as ConfigSectionData) setVoiceConfig((config.voice ?? {}) as ConfigSectionData) setMessageReceiveConfig((config.message_receive ?? {}) as ConfigSectionData) - setLpmmConfig((config.lpmm_knowledge ?? {}) as ConfigSectionData) setKeywordReactionConfig((config.keyword_reaction ?? {}) as ConfigSectionData) setResponsePostProcessConfig((config.response_post_process ?? {}) as ConfigSectionData) setChineseTypoConfig((config.chinese_typo ?? {}) as ConfigSectionData) setResponseSplitterConfig((config.response_splitter ?? {}) as ConfigSectionData) setDebugConfig((config.debug ?? {}) as ConfigSectionData) - setExperimentalConfig((config.experimental ?? {}) as ConfigSectionData) setMaimMessageConfig((config.maim_message ?? {}) as ConfigSectionData) setTelemetryConfig((config.telemetry ?? {}) as ConfigSectionData) setWebuiConfig((config.webui ?? {}) as ConfigSectionData) setDatabaseConfig((config.database ?? {}) as ConfigSectionData) - setMaisakaConfig((config.maisaka ?? {}) as ConfigSectionData) setMcpConfig((config.mcp ?? {}) as ConfigSectionData) setPluginRuntimeConfig((config.plugin_runtime ?? {}) as ConfigSectionData) setAMemorixConfig((config.a_memorix ?? {}) as ConfigSectionData) @@ -289,22 +278,18 @@ function BotConfigPageContent() { expression: expressionConfig, emoji: emojiConfig, memory: memoryConfig, - relationship: relationshipConfig, visual: visualConfig, voice: voiceConfig, message_receive: messageReceiveConfig, - lpmm_knowledge: lpmmConfig, keyword_reaction: keywordReactionConfig, response_post_process: responsePostProcessConfig, chinese_typo: chineseTypoConfig, response_splitter: responseSplitterConfig, debug: debugConfig, - experimental: experimentalConfig, maim_message: maimMessageConfig, telemetry: telemetryConfig, webui: webuiConfig, database: databaseConfig, - maisaka: maisakaConfig, mcp: mcpConfig, plugin_runtime: pluginRuntimeConfig, a_memorix: aMemorixConfig, @@ -316,22 +301,18 @@ function BotConfigPageContent() { expressionConfig, emojiConfig, memoryConfig, - relationshipConfig, visualConfig, voiceConfig, messageReceiveConfig, - lpmmConfig, keywordReactionConfig, responsePostProcessConfig, chineseTypoConfig, responseSplitterConfig, debugConfig, - experimentalConfig, maimMessageConfig, telemetryConfig, webuiConfig, databaseConfig, - maisakaConfig, mcpConfig, pluginRuntimeConfig, aMemorixConfig, @@ -414,7 +395,6 @@ function BotConfigPageContent() { useEffect(() => { const hookEntries = [ ['chat.talk_value_rules', ChatTalkValueRulesHook], - ['experimental.chat_prompts', ExperimentalChatPromptsHook], ['expression.expression_groups', ExpressionGroupsHook], ['expression.learning_list', ExpressionLearningListHook], ['keyword_reaction.keyword_rules', KeywordRulesHook], @@ -450,22 +430,18 @@ function BotConfigPageContent() { useConfigAutoSave(expressionConfig, 'expression', initialLoadRef.current, triggerAutoSave) useConfigAutoSave(emojiConfig, 'emoji', initialLoadRef.current, triggerAutoSave) useConfigAutoSave(memoryConfig, 'memory', initialLoadRef.current, triggerAutoSave) - useConfigAutoSave(relationshipConfig, 'relationship', initialLoadRef.current, triggerAutoSave) useConfigAutoSave(visualConfig, 'visual', initialLoadRef.current, triggerAutoSave) useConfigAutoSave(voiceConfig, 'voice', initialLoadRef.current, triggerAutoSave) useConfigAutoSave(messageReceiveConfig, 'message_receive', initialLoadRef.current, triggerAutoSave) - useConfigAutoSave(lpmmConfig, 'lpmm_knowledge', initialLoadRef.current, triggerAutoSave) useConfigAutoSave(keywordReactionConfig, 'keyword_reaction', initialLoadRef.current, triggerAutoSave) useConfigAutoSave(responsePostProcessConfig, 'response_post_process', initialLoadRef.current, triggerAutoSave) useConfigAutoSave(chineseTypoConfig, 'chinese_typo', initialLoadRef.current, triggerAutoSave) useConfigAutoSave(responseSplitterConfig, 'response_splitter', initialLoadRef.current, triggerAutoSave) useConfigAutoSave(debugConfig, 'debug', initialLoadRef.current, triggerAutoSave) - useConfigAutoSave(experimentalConfig, 'experimental', initialLoadRef.current, triggerAutoSave) useConfigAutoSave(maimMessageConfig, 'maim_message', initialLoadRef.current, triggerAutoSave) useConfigAutoSave(telemetryConfig, 'telemetry', initialLoadRef.current, triggerAutoSave) useConfigAutoSave(webuiConfig, 'webui', initialLoadRef.current, triggerAutoSave) useConfigAutoSave(databaseConfig, 'database', initialLoadRef.current, triggerAutoSave) - useConfigAutoSave(maisakaConfig, 'maisaka', initialLoadRef.current, triggerAutoSave) useConfigAutoSave(mcpConfig, 'mcp', initialLoadRef.current, triggerAutoSave) useConfigAutoSave(pluginRuntimeConfig, 'plugin_runtime', initialLoadRef.current, triggerAutoSave) useConfigAutoSave(aMemorixConfig, 'a_memorix', initialLoadRef.current, triggerAutoSave) @@ -667,22 +643,18 @@ function BotConfigPageContent() { expression: expressionConfig, emoji: emojiConfig, memory: memoryConfig, - relationship: relationshipConfig, visual: visualConfig, voice: voiceConfig, message_receive: messageReceiveConfig, - lpmm_knowledge: lpmmConfig, keyword_reaction: keywordReactionConfig, response_post_process: responsePostProcessConfig, chinese_typo: chineseTypoConfig, response_splitter: responseSplitterConfig, debug: debugConfig, - experimental: experimentalConfig, maim_message: maimMessageConfig, telemetry: telemetryConfig, webui: webuiConfig, database: databaseConfig, - maisaka: maisakaConfig, mcp: mcpConfig, plugin_runtime: pluginRuntimeConfig, a_memorix: aMemorixConfig, @@ -694,22 +666,18 @@ function BotConfigPageContent() { expressionConfig, emojiConfig, memoryConfig, - relationshipConfig, visualConfig, voiceConfig, messageReceiveConfig, - lpmmConfig, keywordReactionConfig, responsePostProcessConfig, chineseTypoConfig, responseSplitterConfig, debugConfig, - experimentalConfig, maimMessageConfig, telemetryConfig, webuiConfig, databaseConfig, - maisakaConfig, mcpConfig, pluginRuntimeConfig, aMemorixConfig, @@ -724,22 +692,18 @@ function BotConfigPageContent() { expression: setExpressionConfig, emoji: setEmojiConfig, memory: setMemoryConfig, - relationship: setRelationshipConfig, visual: setVisualConfig, voice: setVoiceConfig, message_receive: setMessageReceiveConfig, - lpmm_knowledge: setLpmmConfig, keyword_reaction: setKeywordReactionConfig, response_post_process: setResponsePostProcessConfig, chinese_typo: setChineseTypoConfig, response_splitter: setResponseSplitterConfig, debug: setDebugConfig, - experimental: setExperimentalConfig, maim_message: setMaimMessageConfig, telemetry: setTelemetryConfig, webui: setWebuiConfig, database: setDatabaseConfig, - maisaka: setMaisakaConfig, mcp: setMcpConfig, plugin_runtime: setPluginRuntimeConfig, a_memorix: setAMemorixConfig, diff --git a/dashboard/src/routes/config/bot/hooks/complexFieldHooks.tsx b/dashboard/src/routes/config/bot/hooks/complexFieldHooks.tsx index a39e5cb4..2bb2f111 100644 --- a/dashboard/src/routes/config/bot/hooks/complexFieldHooks.tsx +++ b/dashboard/src/routes/config/bot/hooks/complexFieldHooks.tsx @@ -101,12 +101,6 @@ export const ExpressionGroupsHook = createJsonFieldHook({ placeholder: '[\n {\n "expression_groups": [\n {\n "platform": "qq",\n "item_id": "123456",\n "rule_type": "group"\n }\n ]\n }\n]', }) -export const ExperimentalChatPromptsHook = createJsonFieldHook({ - emptyValue: [], - helperText: '实验配置中的定向 Prompt 列表使用 JSON 编辑。每一项应包含 platform、item_id、rule_type、prompt。', - placeholder: '[\n {\n "platform": "qq",\n "item_id": "123456",\n "rule_type": "group",\n "prompt": "这里填写额外提示词"\n }\n]', -}) - export const MCPRootItemsHook = createJsonFieldHook({ emptyValue: [], helperText: 'MCP Roots 条目为对象数组,使用 JSON 编辑。', diff --git a/dashboard/src/routes/config/bot/hooks/index.ts b/dashboard/src/routes/config/bot/hooks/index.ts index c4988b1e..a5120209 100644 --- a/dashboard/src/routes/config/bot/hooks/index.ts +++ b/dashboard/src/routes/config/bot/hooks/index.ts @@ -12,7 +12,6 @@ export type { } from './useAutoSave' export { ChatTalkValueRulesHook, - ExperimentalChatPromptsHook, ExpressionGroupsHook, ExpressionLearningListHook, KeywordRulesHook, diff --git a/dashboard/src/routes/config/bot/sections/ExperimentalSection.tsx b/dashboard/src/routes/config/bot/sections/ExperimentalSection.tsx deleted file mode 100644 index 5f86d821..00000000 --- a/dashboard/src/routes/config/bot/sections/ExperimentalSection.tsx +++ /dev/null @@ -1,311 +0,0 @@ -import React from 'react' -import { Label } from '@/components/ui/label' -import { Textarea } from '@/components/ui/textarea' -import { Input } from '@/components/ui/input' -import { Button } from '@/components/ui/button' -import { Switch } from '@/components/ui/switch' -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from '@/components/ui/select' -import { - AlertDialog, - AlertDialogAction, - AlertDialogCancel, - AlertDialogContent, - AlertDialogDescription, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogTitle, - AlertDialogTrigger, -} from '@/components/ui/alert-dialog' -import { - Popover, - PopoverContent, - PopoverTrigger, -} from '@/components/ui/popover' -import { Plus, Trash2, AlertTriangle, Eye, Code2 } from 'lucide-react' -import type { ExperimentalConfig } from '../types' - -interface ChatPromptData { - platform: string - id: string - type: 'group' | 'private' - prompt: string -} - -interface ExperimentalSectionProps { - config: ExperimentalConfig - onChange: (config: ExperimentalConfig) => void -} - -export const ExperimentalSection = React.memo(function ExperimentalSection({ config, onChange }: ExperimentalSectionProps) { - // 解析 chat_prompt 字符串为结构化数据 - const parseChatPrompt = (promptStr: string): ChatPromptData => { - const parts = promptStr.split(':') - if (parts.length >= 4) { - const platform = parts[0] - const id = parts[1] - const type = parts[2] as 'group' | 'private' - const prompt = parts.slice(3).join(':') // 处理 prompt 中可能包含的冒号 - return { platform, id, type, prompt } - } - return { platform: 'qq', id: '', type: 'group', prompt: '' } - } - - // 将结构化数据转换为字符串 - const stringifyChatPrompt = (data: ChatPromptData): string => { - return `${data.platform}:${data.id}:${data.type}:${data.prompt}` - } - - const addChatPrompt = () => { - onChange({ ...config, chat_prompts: [...config.chat_prompts, 'qq::group:'] }) - } - - const removeChatPrompt = (index: number) => { - onChange({ - ...config, - chat_prompts: config.chat_prompts.filter((_, i) => i !== index), - }) - } - - const updateChatPrompt = (index: number, data: Partial) => { - const currentData = parseChatPrompt(config.chat_prompts[index]) - const newData = { ...currentData, ...data } - const newPrompts = [...config.chat_prompts] - newPrompts[index] = stringifyChatPrompt(newData) - onChange({ ...config, chat_prompts: newPrompts }) - } - - // 预览组件 - const ChatPromptPreview = ({ promptStr }: { promptStr: string }) => { - return ( - - - - - -
-

配置预览

-
- "{promptStr}" -
-

- 这是保存到 bot_config.toml 文件中的格式 -

-
-
-
- ) - } - - return ( -
-
- -
-

实验性功能

-

- 此部分包含实验性功能,可能不稳定或在未来版本中发生变化。请谨慎使用,并注意不推荐在生产环境中修改私聊规则。 -

-
-
- -
-

实验性设置

- -
-
- - onChange({ ...config, lpmm_memory: checked }) - } - /> - -
-

- 开启后,chat_history_summarizer 总结出的历史记录会同时导入到知识库 -

- -
- -