diff --git a/src/renderer/src/aiCore/index_new.ts b/src/renderer/src/aiCore/index_new.ts index 897fc1c48a..2c55ed35c3 100644 --- a/src/renderer/src/aiCore/index_new.ts +++ b/src/renderer/src/aiCore/index_new.ts @@ -8,8 +8,8 @@ */ import { createExecutor } from '@cherrystudio/ai-core' +import { preferenceService } from '@data/PreferenceService' import { loggerService } from '@logger' -import { getEnableDeveloperMode } from '@renderer/hooks/useSettings' import { addSpan, endSpan } from '@renderer/services/SpanManagerService' import { StartSpanParams } from '@renderer/trace/types/ModelSpanEntity' import type { Assistant, GenerateImageParams, Model, Provider } from '@renderer/types' @@ -131,7 +131,7 @@ export default class ModernAiProvider { } } - if (config.topicId && getEnableDeveloperMode()) { + if (config.topicId && (await preferenceService.get('app.developer_mode.enabled'))) { // TypeScript类型窄化:确保topicId是string类型 const traceConfig = { ...config, @@ -200,7 +200,7 @@ export default class ModernAiProvider { isImageGeneration: config.isImageGenerationEndpoint }) - const span = addSpan(traceParams) + const span = await addSpan(traceParams) if (!span) { logger.warn('Failed to create span, falling back to regular completions', { topicId: config.topicId, @@ -276,7 +276,7 @@ export default class ModernAiProvider { }) // 根据条件构建插件数组 - const plugins = buildPlugins(config) + const plugins = await buildPlugins(config) // 用构建好的插件数组创建executor const executor = createExecutor(this.config!.providerId, this.config!.options, plugins) diff --git a/src/renderer/src/aiCore/plugins/PluginBuilder.ts b/src/renderer/src/aiCore/plugins/PluginBuilder.ts index 792e05b240..3b4d4b4d85 100644 --- a/src/renderer/src/aiCore/plugins/PluginBuilder.ts +++ b/src/renderer/src/aiCore/plugins/PluginBuilder.ts @@ -1,8 +1,8 @@ import { AiPlugin } from '@cherrystudio/ai-core' import { createPromptToolUsePlugin, webSearchPlugin } from '@cherrystudio/ai-core/built-in/plugins' +import { preferenceService } from '@data/PreferenceService' import { loggerService } from '@logger' -import { getEnableDeveloperMode } from '@renderer/hooks/useSettings' -import { Assistant } from '@renderer/types' +import type { Assistant } from '@renderer/types' import { AiSdkMiddlewareConfig } from '../middleware/AiSdkMiddlewareBuilder' import reasoningTimePlugin from './reasoningTimePlugin' @@ -13,12 +13,12 @@ const logger = loggerService.withContext('PluginBuilder') /** * 根据条件构建插件数组 */ -export function buildPlugins( +export async function buildPlugins( middlewareConfig: AiSdkMiddlewareConfig & { assistant: Assistant; topicId?: string } -): AiPlugin[] { +): Promise { const plugins: AiPlugin[] = [] - if (middlewareConfig.topicId && getEnableDeveloperMode()) { + if (middlewareConfig.topicId && (await preferenceService.get('app.developer_mode.enabled'))) { // 0. 添加 telemetry 插件 plugins.push( createTelemetryPlugin({ diff --git a/src/renderer/src/aiCore/plugins/searchOrchestrationPlugin.ts b/src/renderer/src/aiCore/plugins/searchOrchestrationPlugin.ts index 3e6ca8cc3d..aca53219c5 100644 --- a/src/renderer/src/aiCore/plugins/searchOrchestrationPlugin.ts +++ b/src/renderer/src/aiCore/plugins/searchOrchestrationPlugin.ts @@ -8,17 +8,17 @@ */ import { type AiRequestContext, definePlugin } from '@cherrystudio/ai-core' import { loggerService } from '@logger' -// import { generateObject } from '@cherrystudio/ai-core' -import { - SEARCH_SUMMARY_PROMPT, - SEARCH_SUMMARY_PROMPT_KNOWLEDGE_ONLY, - SEARCH_SUMMARY_PROMPT_WEB_ONLY -} from '@renderer/config/prompts' import { getDefaultModel, getProviderByModel } from '@renderer/services/AssistantService' import store from '@renderer/store' import { selectCurrentUserId, selectGlobalMemoryEnabled, selectMemoryConfig } from '@renderer/store/memory' import type { Assistant } from '@renderer/types' import { extractInfoFromXML, ExtractResults } from '@renderer/utils/extract' +// import { generateObject } from '@cherrystudio/ai-core' +import { + SEARCH_SUMMARY_PROMPT, + SEARCH_SUMMARY_PROMPT_KNOWLEDGE_ONLY, + SEARCH_SUMMARY_PROMPT_WEB_ONLY +} from '@shared/config/prompts' import type { ModelMessage } from 'ai' import { isEmpty } from 'lodash' diff --git a/src/renderer/src/aiCore/tools/KnowledgeSearchTool.ts b/src/renderer/src/aiCore/tools/KnowledgeSearchTool.ts index 5d2c0efe8a..9c1101f49d 100644 --- a/src/renderer/src/aiCore/tools/KnowledgeSearchTool.ts +++ b/src/renderer/src/aiCore/tools/KnowledgeSearchTool.ts @@ -1,7 +1,7 @@ -import { REFERENCE_PROMPT } from '@renderer/config/prompts' import { processKnowledgeSearch } from '@renderer/services/KnowledgeService' import type { Assistant, KnowledgeReference } from '@renderer/types' import { ExtractResults, KnowledgeExtractResults } from '@renderer/utils/extract' +import { REFERENCE_PROMPT } from '@shared/config/prompts' import { type InferToolInput, type InferToolOutput, tool } from 'ai' import { isEmpty } from 'lodash' import { z } from 'zod' diff --git a/src/renderer/src/aiCore/tools/WebSearchTool.ts b/src/renderer/src/aiCore/tools/WebSearchTool.ts index 81f64dbde5..28c2cf19a3 100644 --- a/src/renderer/src/aiCore/tools/WebSearchTool.ts +++ b/src/renderer/src/aiCore/tools/WebSearchTool.ts @@ -1,7 +1,7 @@ -import { REFERENCE_PROMPT } from '@renderer/config/prompts' import WebSearchService from '@renderer/services/WebSearchService' import { WebSearchProvider, WebSearchProviderResponse } from '@renderer/types' import { ExtractResults } from '@renderer/utils/extract' +import { REFERENCE_PROMPT } from '@shared/config/prompts' import { type InferToolInput, type InferToolOutput, tool } from 'ai' import { z } from 'zod' diff --git a/src/renderer/src/aiCore/utils/websearch.ts b/src/renderer/src/aiCore/utils/websearch.ts index d2d0345826..41f1803afd 100644 --- a/src/renderer/src/aiCore/utils/websearch.ts +++ b/src/renderer/src/aiCore/utils/websearch.ts @@ -1,6 +1,6 @@ import { isOpenAIWebSearchChatCompletionOnlyModel } from '@renderer/config/models' -import { WEB_SEARCH_PROMPT_FOR_OPENROUTER } from '@renderer/config/prompts' import { Model } from '@renderer/types' +import { WEB_SEARCH_PROMPT_FOR_OPENROUTER } from '@shared/config/prompts' export function getWebSearchParams(model: Model): Record { if (model.provider === 'hunyuan') { diff --git a/src/renderer/src/components/MinApp/TopViewMinappContainer.tsx b/src/renderer/src/components/MinApp/TopViewMinappContainer.tsx index 866f46ff8e..1279673e1c 100644 --- a/src/renderer/src/components/MinApp/TopViewMinappContainer.tsx +++ b/src/renderer/src/components/MinApp/TopViewMinappContainer.tsx @@ -1,6 +1,6 @@ import MinappPopupContainer from '@renderer/components/MinApp/MinappPopupContainer' +import { useNavbarPosition } from '@renderer/hooks/useNavbar' import { useRuntime } from '@renderer/hooks/useRuntime' -import { useNavbarPosition } from '@renderer/hooks/useSettings' const TopViewMinappContainer = () => { const { openedKeepAliveMinapps, openedOneOffMinapp } = useRuntime() diff --git a/src/renderer/src/config/models/utils.ts b/src/renderer/src/config/models/utils.ts index 3fd27308f8..8d81b80a74 100644 --- a/src/renderer/src/config/models/utils.ts +++ b/src/renderer/src/config/models/utils.ts @@ -1,8 +1,8 @@ import { Model } from '@renderer/types' import { getLowerBaseModelName } from '@renderer/utils' +import { WEB_SEARCH_PROMPT_FOR_OPENROUTER } from '@shared/config/prompts' import OpenAI from 'openai' -import { WEB_SEARCH_PROMPT_FOR_OPENROUTER } from '../prompts' import { getWebSearchTools } from '../tools' import { isOpenAIReasoningModel } from './reasoning' import { isGenerateImageModel, isVisionModel } from './vision' diff --git a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx index 85603c2af4..89f6948b8c 100644 --- a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx +++ b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx @@ -11,7 +11,6 @@ import { useMessageEditing } from '@renderer/context/MessageEditingContext' import { useChatContext } from '@renderer/hooks/useChatContext' import { useMessageOperations } from '@renderer/hooks/useMessageOperations' import { useNotesSettings } from '@renderer/hooks/useNotesSettings' -import { useMessageStyle } from '@renderer/hooks/useSettings' import { useTemporaryValue } from '@renderer/hooks/useTemporaryValue' import useTranslate from '@renderer/hooks/useTranslate' import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' @@ -111,11 +110,13 @@ const MessageMenubar: FC = (props) => { removeMessageBlock } = useMessageOperations(topic) - const { isBubbleStyle } = useMessageStyle() + const [messageStyle] = usePreference('chat.message.style') const [enableDeveloperMode] = usePreference('app.developer_mode.enabled') const [confirmDeleteMessage] = usePreference('chat.message.confirm_delete') const [confirmRegenerateMessage] = usePreference('chat.message.confirm_regenerate') + const isBubbleStyle = messageStyle === 'bubble' + // const loading = useTopicLoading(topic) const isUserMessage = message.role === 'user' @@ -644,7 +645,7 @@ const MessageMenubar: FC = (props) => { onClick={async (e) => { e.stopPropagation() const title = await getMessageTitle(message) - const markdown = messageToMarkdown(message) + const markdown = await messageToMarkdown(message) exportMessageToNotes(title, markdown, notesPath) }} $softHoverBg={softHoverBg}> diff --git a/src/renderer/src/pages/minapps/MinAppPage.tsx b/src/renderer/src/pages/minapps/MinAppPage.tsx index f56b60c761..534eaa773f 100644 --- a/src/renderer/src/pages/minapps/MinAppPage.tsx +++ b/src/renderer/src/pages/minapps/MinAppPage.tsx @@ -2,8 +2,8 @@ import { loggerService } from '@logger' import { DEFAULT_MIN_APPS } from '@renderer/config/minapps' import { useMinappPopup } from '@renderer/hooks/useMinappPopup' import { useMinapps } from '@renderer/hooks/useMinapps' +import { useNavbarPosition } from '@renderer/hooks/useNavbar' import { useRuntime } from '@renderer/hooks/useRuntime' -import { useNavbarPosition } from '@renderer/hooks/useSettings' import TabsService from '@renderer/services/TabsService' import { FC, useEffect, useMemo, useRef } from 'react' import { useNavigate, useParams } from 'react-router-dom' diff --git a/src/renderer/src/pages/minapps/components/MinimalToolbar.tsx b/src/renderer/src/pages/minapps/components/MinimalToolbar.tsx index 60a43b8684..631014ff54 100644 --- a/src/renderer/src/pages/minapps/components/MinimalToolbar.tsx +++ b/src/renderer/src/pages/minapps/components/MinimalToolbar.tsx @@ -8,11 +8,9 @@ import { PushpinOutlined, ReloadOutlined } from '@ant-design/icons' +import { usePreference } from '@data/hooks/usePreference' import { DEFAULT_MIN_APPS } from '@renderer/config/minapps' import { useMinapps } from '@renderer/hooks/useMinapps' -import { useSettings } from '@renderer/hooks/useSettings' -import { useAppDispatch } from '@renderer/store' -import { setMinappsOpenLinkExternal } from '@renderer/store/settings' import { MinAppType } from '@renderer/types' import { Tooltip } from 'antd' import { WebviewTag } from 'electron' @@ -32,8 +30,7 @@ interface Props { const MinimalToolbar: FC = ({ app, webviewRef, currentUrl, onReload, onOpenDevTools }) => { const { t } = useTranslation() const { pinned, updatePinnedMinapps } = useMinapps() - const { minappsOpenLinkExternal } = useSettings() - const dispatch = useAppDispatch() + const [minappsOpenLinkExternal, setMinappsOpenLinkExternal] = usePreference('feature.minapp.open_link_external') const navigate = useNavigate() const [canGoBack, setCanGoBack] = useState(false) const [canGoForward, setCanGoForward] = useState(false) @@ -75,8 +72,8 @@ const MinimalToolbar: FC = ({ app, webviewRef, currentUrl, onReload, onOp }, [app, isPinned, pinned, updatePinnedMinapps]) const handleToggleOpenExternal = useCallback(() => { - dispatch(setMinappsOpenLinkExternal(!minappsOpenLinkExternal)) - }, [dispatch, minappsOpenLinkExternal]) + setMinappsOpenLinkExternal(!minappsOpenLinkExternal) + }, [setMinappsOpenLinkExternal, minappsOpenLinkExternal]) const handleOpenLink = useCallback(() => { const urlToOpen = currentUrl || app.url diff --git a/src/renderer/src/services/__tests__/ApiService.test.ts b/src/renderer/src/services/__tests__/ApiService.test.ts index 5702561aa2..a46f724b1c 100644 --- a/src/renderer/src/services/__tests__/ApiService.test.ts +++ b/src/renderer/src/services/__tests__/ApiService.test.ts @@ -98,7 +98,7 @@ vi.mock('@renderer/utils', () => ({ getLowerBaseModelName: vi.fn((name) => name.toLowerCase()) })) -vi.mock('@renderer/config/prompts', () => ({ +vi.mock('@shared/config/prompts', () => ({ WEB_SEARCH_PROMPT_FOR_OPENROUTER: 'mock-prompt' })) diff --git a/src/renderer/src/utils/translate.ts b/src/renderer/src/utils/translate.ts index 89d6726c18..616d22e951 100644 --- a/src/renderer/src/utils/translate.ts +++ b/src/renderer/src/utils/translate.ts @@ -1,6 +1,6 @@ import { loggerService } from '@logger' import { isQwenMTModel } from '@renderer/config/models' -import { LANG_DETECT_PROMPT } from '@renderer/config/prompts' +import { LANG_DETECT_PROMPT } from '@shared/config/prompts' import { builtinLanguages as builtinLanguages, LanguagesEnum, UNKNOWN } from '@renderer/config/translate' import db from '@renderer/databases' import i18n from '@renderer/i18n'