From bba7ecae6ea4fbae1bf2e4d27be81b25dba4a487 Mon Sep 17 00:00:00 2001 From: Phantom Date: Mon, 8 Dec 2025 10:58:56 +0800 Subject: [PATCH 01/28] feat(agent): add tooltip for model selection and improve i18n (#11738) * refactor(settings): rename actions prop to contentAfter for clarity The prop name 'actions' was misleading as it could imply functionality rather than layout. 'contentAfter' better describes its purpose of displaying content after the title. * feat(agent): add tooltip for model selection in agent settings Add tooltip to explain that only Anthropic endpoint models are supported for agents * feat(i18n): add model tooltip and translate upload strings Add tooltip message about Anthropic endpoint model requirement for Agent feature Translate previously untranslated upload-related strings in multiple languages --- .../src/components/Popups/agent/AgentModal.tsx | 10 +++++++--- src/renderer/src/i18n/locales/en-us.json | 3 +++ src/renderer/src/i18n/locales/zh-cn.json | 3 +++ src/renderer/src/i18n/locales/zh-tw.json | 7 +++++-- src/renderer/src/i18n/translate/de-de.json | 9 ++++++--- src/renderer/src/i18n/translate/el-gr.json | 9 ++++++--- src/renderer/src/i18n/translate/es-es.json | 9 ++++++--- src/renderer/src/i18n/translate/fr-fr.json | 9 ++++++--- src/renderer/src/i18n/translate/ja-jp.json | 9 ++++++--- src/renderer/src/i18n/translate/pt-pt.json | 9 ++++++--- src/renderer/src/i18n/translate/ru-ru.json | 9 ++++++--- .../settings/AgentSettings/AccessibleDirsSetting.tsx | 2 +- .../pages/settings/AgentSettings/AdvancedSettings.tsx | 2 +- .../src/pages/settings/AgentSettings/ModelSetting.tsx | 5 ++++- .../src/pages/settings/AgentSettings/shared.tsx | 8 ++++---- 15 files changed, 70 insertions(+), 33 deletions(-) diff --git a/src/renderer/src/components/Popups/agent/AgentModal.tsx b/src/renderer/src/components/Popups/agent/AgentModal.tsx index e72433e88a..0d3ce94731 100644 --- a/src/renderer/src/components/Popups/agent/AgentModal.tsx +++ b/src/renderer/src/components/Popups/agent/AgentModal.tsx @@ -1,5 +1,6 @@ import { loggerService } from '@logger' import { ErrorBoundary } from '@renderer/components/ErrorBoundary' +import { HelpTooltip } from '@renderer/components/TooltipIcons' import { TopView } from '@renderer/components/TopView' import { permissionModeCards } from '@renderer/config/agent' import { useAgents } from '@renderer/hooks/agents/useAgents' @@ -340,9 +341,12 @@ const PopupContainer: React.FC = ({ agent, afterSubmit, resolve }) => { - +
+ + +
, - )} - + {isCherryIN && isChineseUser ? ( + + ) : ( + + setApiHost(e.target.value)} + onBlur={onUpdateApiHost} + /> + {isApiHostResettable && ( + + )} + + )} {isVertexProvider(provider) && ( {t('settings.provider.vertex_ai.api_host_help')} diff --git a/src/renderer/src/store/index.ts b/src/renderer/src/store/index.ts index 8d9176be15..30b6b72129 100644 --- a/src/renderer/src/store/index.ts +++ b/src/renderer/src/store/index.ts @@ -67,7 +67,7 @@ const persistedReducer = persistReducer( { key: 'cherry-studio', storage, - version: 182, + version: 183, blacklist: ['runtime', 'messages', 'messageBlocks', 'tabs', 'toolPermissions'], migrate }, diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index a80336e697..8559a39e27 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -2976,6 +2976,22 @@ const migrateConfig = { logger.error('migrate 182 error', error as Error) return state } + }, + '183': (state: RootState) => { + try { + state.llm.providers.forEach((provider) => { + if (provider.id === SystemProviderIds.cherryin) { + provider.apiHost = 'https://open.cherryin.cc' + provider.anthropicApiHost = 'https://open.cherryin.cc' + } + }) + state.llm.providers = moveProvider(state.llm.providers, SystemProviderIds.poe, 10) + logger.info('migrate 183 success') + return state + } catch (error) { + logger.error('migrate 183 error', error as Error) + return state + } } } From fda22874753fc11fd86707ab920baecb8623fe6b Mon Sep 17 00:00:00 2001 From: Ying-xi <62348590+Ying-xi@users.noreply.github.com> Date: Thu, 11 Dec 2025 11:21:10 +0800 Subject: [PATCH 26/28] fix(knowledge): prioritize query & refine intent prompt (#11828) Fixes logic issues in knowledge base search: 1. Inverted search priority in KnowledgeService to use specific sub-queries over generic rewrites. 2. Updated SEARCH_SUMMARY_PROMPT_KNOWLEDGE_ONLY to explicitly allow decomposed questions, improving intent recognition for complex queries. --- src/renderer/src/config/prompts.ts | 2 +- src/renderer/src/services/KnowledgeService.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/src/config/prompts.ts b/src/renderer/src/config/prompts.ts index 926a138f14..815eb7d113 100644 --- a/src/renderer/src/config/prompts.ts +++ b/src/renderer/src/config/prompts.ts @@ -306,7 +306,7 @@ export const SEARCH_SUMMARY_PROMPT_KNOWLEDGE_ONLY = ` **Use user's language to rephrase the question.** Follow these guidelines: 1. If the question is a simple writing task, greeting (e.g., Hi, Hello, How are you), or does not require searching for information (unless the greeting contains a follow-up question), return 'not_needed' in the 'question' XML block. This indicates that no search is required. - 2. For knowledge, You need rewrite user query into 'rewrite' XML block with one alternative version while preserving the original intent and meaning. Also include the original question in the 'question' block. + 2. For knowledge, You need rewrite user query into 'rewrite' XML block with one alternative version while preserving the original intent and meaning. Also include the rephrased or decomposed question(s) in the 'question' block. 3. Always return the rephrased question inside the 'question' XML block. 4. Always wrap the rephrased question in the appropriate XML blocks: use for queries that can be answered from a pre-existing knowledge base. Ensure that the rephrased question is always contained within a block inside the wrapper. 5. *use knowledge to rephrase the question* diff --git a/src/renderer/src/services/KnowledgeService.ts b/src/renderer/src/services/KnowledgeService.ts index e2f2e6fc15..e78cfa62e5 100644 --- a/src/renderer/src/services/KnowledgeService.ts +++ b/src/renderer/src/services/KnowledgeService.ts @@ -162,7 +162,7 @@ export const searchKnowledgeBase = async ( const searchResults: KnowledgeSearchResult[] = await window.api.knowledgeBase.search( { - search: rewrite || query, + search: query || rewrite || '', base: baseParams }, currentSpan?.spanContext() From 03db02d5f751e06577e017573165fa7efeb97183 Mon Sep 17 00:00:00 2001 From: Phantom Date: Thu, 11 Dec 2025 11:29:18 +0800 Subject: [PATCH 27/28] fix(ThinkingButton): show correct icon when isFixedReasoning (#11825) --- .../tools/components/ThinkingButton.tsx | 57 ++++++++++--------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/src/renderer/src/pages/home/Inputbar/tools/components/ThinkingButton.tsx b/src/renderer/src/pages/home/Inputbar/tools/components/ThinkingButton.tsx index 5909189516..96e7adca93 100644 --- a/src/renderer/src/pages/home/Inputbar/tools/components/ThinkingButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/tools/components/ThinkingButton.tsx @@ -93,7 +93,7 @@ const ThinkingButton: FC = ({ quickPanel, model, assistantId }): ReactEle level: option, label: getReasoningEffortOptionsLabel(option), description: '', - icon: ThinkingIcon(option), + icon: ThinkingIcon({ option }), isSelected: currentReasoningEffort === option, action: () => onThinkingChange(option) })) @@ -135,7 +135,7 @@ const ThinkingButton: FC = ({ quickPanel, model, assistantId }): ReactEle { label: t('assistants.settings.reasoning_effort.label'), description: '', - icon: ThinkingIcon(currentReasoningEffort), + icon: ThinkingIcon({ option: currentReasoningEffort }), isMenu: true, action: () => openQuickPanel() } @@ -163,37 +163,40 @@ const ThinkingButton: FC = ({ quickPanel, model, assistantId }): ReactEle aria-label={ariaLabel} aria-pressed={currentReasoningEffort !== 'none'} style={isFixedReasoning ? { cursor: 'default' } : undefined}> - {ThinkingIcon(currentReasoningEffort)} + {ThinkingIcon({ option: currentReasoningEffort, isFixedReasoning })} ) } -const ThinkingIcon = (option?: ThinkingOption) => { +const ThinkingIcon = (props: { option?: ThinkingOption; isFixedReasoning?: boolean }) => { let IconComponent: React.FC> | null = null - - switch (option) { - case 'minimal': - IconComponent = MdiLightbulbOn30 - break - case 'low': - IconComponent = MdiLightbulbOn50 - break - case 'medium': - IconComponent = MdiLightbulbOn80 - break - case 'high': - IconComponent = MdiLightbulbOn - break - case 'auto': - IconComponent = MdiLightbulbAutoOutline - break - case 'none': - IconComponent = MdiLightbulbOffOutline - break - default: - IconComponent = MdiLightbulbOffOutline - break + if (props.isFixedReasoning) { + IconComponent = MdiLightbulbAutoOutline + } else { + switch (props.option) { + case 'minimal': + IconComponent = MdiLightbulbOn30 + break + case 'low': + IconComponent = MdiLightbulbOn50 + break + case 'medium': + IconComponent = MdiLightbulbOn80 + break + case 'high': + IconComponent = MdiLightbulbOn + break + case 'auto': + IconComponent = MdiLightbulbAutoOutline + break + case 'none': + IconComponent = MdiLightbulbOffOutline + break + default: + IconComponent = MdiLightbulbOffOutline + break + } } return From 880673c4eba641a60b4ae6d78512c240b766c52b Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Thu, 11 Dec 2025 11:57:16 +0800 Subject: [PATCH 28/28] fix(AssistantPresetCard): update group handling to use isArray for better type safety --- .../assistants/presets/components/AssistantPresetCard.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/renderer/src/pages/store/assistants/presets/components/AssistantPresetCard.tsx b/src/renderer/src/pages/store/assistants/presets/components/AssistantPresetCard.tsx index 25b81cf38a..4c9ce082d7 100644 --- a/src/renderer/src/pages/store/assistants/presets/components/AssistantPresetCard.tsx +++ b/src/renderer/src/pages/store/assistants/presets/components/AssistantPresetCard.tsx @@ -7,6 +7,7 @@ import type { AssistantPreset } from '@renderer/types' import { getLeadingEmoji } from '@renderer/utils' import { Button, Dropdown } from 'antd' import { t } from 'i18next' +import { isArray } from 'lodash' import { ArrowDownAZ, Ellipsis, PlusIcon, SquareArrowOutUpRight } from 'lucide-react' import { type FC, memo, useCallback, useEffect, useRef, useState } from 'react' import styled from 'styled-components' @@ -142,7 +143,7 @@ const AssistantPresetCard: FC = ({ preset, onClick, activegroup, getLocal {getLocalizedGroupName('我的')} )} - {!!preset.group?.length && + {isArray(preset.group) && preset.group.map((group) => ( {getLocalizedGroupName(group)}