From e7545c5a942adabc0285d41b14b59cd0d3d4d7b7 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Sun, 29 Dec 2024 10:19:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=94=A8=E6=88=B7=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E8=AF=9D=E9=A2=98=E6=80=BB=E7=BB=93Prompt=20#562?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit close #562 --- src/renderer/src/config/prompts.ts | 2 +- src/renderer/src/hooks/useSettings.ts | 7 +++++- src/renderer/src/i18n/locales/en-us.json | 4 +++ src/renderer/src/i18n/locales/ja-jp.json | 4 +++ src/renderer/src/i18n/locales/ru-ru.json | 4 +++ src/renderer/src/i18n/locales/zh-cn.json | 4 +++ src/renderer/src/i18n/locales/zh-tw.json | 4 +++ .../ModalSettings/TopicNamingModalPopup.tsx | 25 ++++++++++++++++--- .../src/providers/AnthropicProvider.ts | 5 ++-- src/renderer/src/providers/GeminiProvider.ts | 5 ++-- src/renderer/src/providers/OpenAIProvider.ts | 5 ++-- src/renderer/src/store/index.ts | 2 +- src/renderer/src/store/migrate.ts | 4 +++ src/renderer/src/store/settings.ts | 10 ++++++-- 14 files changed, 71 insertions(+), 14 deletions(-) diff --git a/src/renderer/src/config/prompts.ts b/src/renderer/src/config/prompts.ts index 1374c5fe..2dfbcd6d 100644 --- a/src/renderer/src/config/prompts.ts +++ b/src/renderer/src/config/prompts.ts @@ -45,7 +45,7 @@ export const AGENT_PROMPT = ` ` export const SUMMARIZE_PROMPT = - '你是一名擅长会话的助理,你需要将用户的会话总结为 10 个字以内的标题,不要使用标点符号和其他特殊符号。' + '你是一名擅长会话的助理,你需要将用户的会话总结为 10 个字以内的标题,标题语言与用户的首要语言一致,不要使用标点符号和其他特殊符号' export const TRANSLATE_PROMPT = 'You are a translation expert. Translate from input language to {{target_language}}, provide the translation result directly without any explanation and keep original format. Do not translate if the target language is the same as the source language.' diff --git a/src/renderer/src/hooks/useSettings.ts b/src/renderer/src/hooks/useSettings.ts index 0080d46a..793b9153 100644 --- a/src/renderer/src/hooks/useSettings.ts +++ b/src/renderer/src/hooks/useSettings.ts @@ -1,8 +1,9 @@ -import { useAppDispatch, useAppSelector } from '@renderer/store' +import store, { useAppDispatch, useAppSelector } from '@renderer/store' import { SendMessageShortcut, setSendMessageShortcut as _setSendMessageShortcut, setTheme, + SettingsState, setTopicPosition, setTray, setWindowStyle @@ -41,3 +42,7 @@ export function useMessageStyle() { isBubbleStyle } } + +export const getStoreSetting = (key: keyof SettingsState) => { + return store.getState().settings[key] +} diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 7990c41e..7aa0d49c 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -417,6 +417,7 @@ "models.translate_model_prompt_title": "Translate Model Prompt", "models.topic_naming_model_setting_title": "Topic Naming Model Settings", "models.enable_topic_naming": "Topic Auto Naming", + "models.topic_naming_prompt": "Topic Naming Prompt", "provider": { "add.name": "Provider Name", "add.name.placeholder": "Example: OpenAI", @@ -586,6 +587,9 @@ "embedding_model": "Embedding Model", "embedding_model_tooltip": "Add in Settings->Model Provider->Manage", "dimensions": "Dimensions {{dimensions}}" + }, + "prompts": { + "summarize": "You are an assistant who is good at conversation. You need to summarize the user's conversation into a title of 10 characters or less, ensuring it matches the user's primary language without using punctuation or other special symbols." } } } diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index 3896582a..796ffe74 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -415,6 +415,7 @@ "models.translate_model_prompt_title": "翻訳モデルのプロンプト", "models.topic_naming_model_setting_title": "トピック命名モデルの設定", "models.enable_topic_naming": "トピックの自動命名", + "models.topic_naming_prompt": "トピック命名プロンプト", "provider": { "add.name": "プロバイダー名", "add.name.placeholder": "例:OpenAI", @@ -568,6 +569,9 @@ "embedding": "埋め込みモデル", "embedding_model": "埋め込みモデル", "embedding_model_tooltip": "設定->モデルサービス->管理で追加" + }, + "prompts": { + "summarize": "あなたは会話を得意とするアシスタントです。ユーザーの会話を10文字以内のタイトルに要約し、ユーザーの主言語と一致していることを確認してください。句読点や特殊記号は使用しないでください。" } } } diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index 7cc3552d..ab405be7 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -417,6 +417,7 @@ "models.translate_model_prompt_title": "Модель перевода", "models.topic_naming_model_setting_title": "Настройки модели именования топика", "models.enable_topic_naming": "Автоматическое переименование топика", + "models.topic_naming_prompt": "Подсказка для именования топика", "provider": { "add.name": "Имя провайдера", "add.name.placeholder": "Пример: OpenAI", @@ -586,6 +587,9 @@ "embedding_model": "Встраиваемые модели", "embedding_model_tooltip": "Добавьте в настройки->модель сервиса->управление", "dimensions": "{{dimensions}} мер" + }, + "prompts": { + "summarize": "Вы - эксперт в общении, который суммирует разговоры пользователя в 10-символьном заголовке, совпадающем с языком пользователя, без использования знаков препинания и других специальных символов" } } } diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index d46b0e2e..67f19a7e 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -418,6 +418,7 @@ "models.translate_model_prompt_title": "翻译模型提示词", "models.topic_naming_model_setting_title": "话题命名模型设置", "models.enable_topic_naming": "话题自动重命名", + "models.topic_naming_prompt": "话题命名提示词", "provider": { "add.name": "提供商名称", "add.name.placeholder": "例如 OpenAI", @@ -575,6 +576,9 @@ "embedding_model": "嵌入模型", "embedding_model_tooltip": "在设置->模型服务中点击管理按钮添加", "dimensions": "{{dimensions}} 维" + }, + "prompts": { + "summarize": "你是一名擅长会话的助理,你需要将用户的会话总结为 10 个字以内的标题,标题语言与用户的首要语言一致,不要使用标点符号和其他特殊符号" } } } diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index fec3f0ac..de74933d 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -417,6 +417,7 @@ "models.translate_model_prompt_title": "翻譯模型提示詞", "models.topic_naming_model_setting_title": "話題命名模型設定", "models.enable_topic_naming": "話題自動重命名", + "models.topic_naming_prompt": "話題命名提示詞", "provider": { "add.name": "提供者名稱", "add.name.placeholder": "例如:OpenAI", @@ -574,6 +575,9 @@ "embedding_model": "嵌入模型", "embedding_model_tooltip": "在设置->模型服务中点击管理按钮添加", "dimensions": "{{dimensions}} 維" + }, + "prompts": { + "summarize": "你是一名擅長會話的助理,你需要將用戶的會話總結為 10 個字以內的標題,標題語言與用戶的首要語言一致,不要使用標點符號和其他特殊符號" } } } diff --git a/src/renderer/src/pages/settings/ModalSettings/TopicNamingModalPopup.tsx b/src/renderer/src/pages/settings/ModalSettings/TopicNamingModalPopup.tsx index a1b26775..424174bb 100644 --- a/src/renderer/src/pages/settings/ModalSettings/TopicNamingModalPopup.tsx +++ b/src/renderer/src/pages/settings/ModalSettings/TopicNamingModalPopup.tsx @@ -1,8 +1,8 @@ import { HStack } from '@renderer/components/Layout' import { useSettings } from '@renderer/hooks/useSettings' import { useAppDispatch } from '@renderer/store' -import { setEnableTopicNaming } from '@renderer/store/settings' -import { Divider, Modal, Switch } from 'antd' +import { setEnableTopicNaming, setTopicNamingPrompt } from '@renderer/store/settings' +import { Button, Divider, Input, Modal, Switch } from 'antd' import { useState } from 'react' import { useTranslation } from 'react-i18next' @@ -15,7 +15,7 @@ interface Props { const PopupContainer: React.FC = ({ resolve }) => { const [open, setOpen] = useState(true) const { t } = useTranslation() - const { enableTopicNaming } = useSettings() + const { enableTopicNaming, topicNamingPrompt } = useSettings() const dispatch = useAppDispatch() const onOk = () => { @@ -30,6 +30,10 @@ const PopupContainer: React.FC = ({ resolve }) => { resolve({}) } + const handleReset = () => { + dispatch(setTopicNamingPrompt('')) + } + TopicNamingModalPopup.hide = onCancel return ( @@ -47,6 +51,21 @@ const PopupContainer: React.FC = ({ resolve }) => {
{t('settings.models.enable_topic_naming')}
dispatch(setEnableTopicNaming(v))} /> + +
+
{t('settings.models.topic_naming_prompt')}
+ dispatch(setTopicNamingPrompt(e.target.value.trim()))} + placeholder={t('prompts.summarize')} + /> + {topicNamingPrompt && ( + + )} +
) } diff --git a/src/renderer/src/providers/AnthropicProvider.ts b/src/renderer/src/providers/AnthropicProvider.ts index da59b382..c71c4fce 100644 --- a/src/renderer/src/providers/AnthropicProvider.ts +++ b/src/renderer/src/providers/AnthropicProvider.ts @@ -2,7 +2,8 @@ import Anthropic from '@anthropic-ai/sdk' import { MessageCreateParamsNonStreaming, MessageParam } from '@anthropic-ai/sdk/resources' import { DEFAULT_MAX_TOKENS } from '@renderer/config/constant' import { isEmbeddingModel } from '@renderer/config/models' -import { SUMMARIZE_PROMPT } from '@renderer/config/prompts' +import { getStoreSetting } from '@renderer/hooks/useSettings' +import i18n from '@renderer/i18n' import { getAssistantSettings, getDefaultModel, getTopNamingModel } from '@renderer/services/AssistantService' import { EVENT_NAMES } from '@renderer/services/EventService' import { filterContextMessages } from '@renderer/services/MessagesService' @@ -188,7 +189,7 @@ export default class AnthropicProvider extends BaseProvider { const systemMessage = { role: 'system', - content: SUMMARIZE_PROMPT + content: (getStoreSetting('topicNamingPrompt') as string) || i18n.t('prompts.summarize') } const userMessage = { diff --git a/src/renderer/src/providers/GeminiProvider.ts b/src/renderer/src/providers/GeminiProvider.ts index 56872117..246dafd5 100644 --- a/src/renderer/src/providers/GeminiProvider.ts +++ b/src/renderer/src/providers/GeminiProvider.ts @@ -9,7 +9,8 @@ import { TextPart } from '@google/generative-ai' import { isEmbeddingModel, isWebSearchModel } from '@renderer/config/models' -import { SUMMARIZE_PROMPT } from '@renderer/config/prompts' +import { getStoreSetting } from '@renderer/hooks/useSettings' +import i18n from '@renderer/i18n' import { getAssistantSettings, getDefaultModel, getTopNamingModel } from '@renderer/services/AssistantService' import { EVENT_NAMES } from '@renderer/services/EventService' import { filterContextMessages } from '@renderer/services/MessagesService' @@ -198,7 +199,7 @@ export default class GeminiProvider extends BaseProvider { const systemMessage = { role: 'system', - content: SUMMARIZE_PROMPT + content: (getStoreSetting('topicNamingPrompt') as string) || i18n.t('prompts.summarize') } const userMessage = { diff --git a/src/renderer/src/providers/OpenAIProvider.ts b/src/renderer/src/providers/OpenAIProvider.ts index 45882836..3883cf89 100644 --- a/src/renderer/src/providers/OpenAIProvider.ts +++ b/src/renderer/src/providers/OpenAIProvider.ts @@ -1,5 +1,6 @@ import { isEmbeddingModel, isSupportedModel, isVisionModel } from '@renderer/config/models' -import { SUMMARIZE_PROMPT } from '@renderer/config/prompts' +import { getStoreSetting } from '@renderer/hooks/useSettings' +import i18n from '@renderer/i18n' import { getAssistantSettings, getDefaultModel, getTopNamingModel } from '@renderer/services/AssistantService' import { EVENT_NAMES } from '@renderer/services/EventService' import { filterContextMessages } from '@renderer/services/MessagesService' @@ -219,7 +220,7 @@ export default class OpenAIProvider extends BaseProvider { const systemMessage = { role: 'system', - content: SUMMARIZE_PROMPT + content: getStoreSetting('topicNamingPrompt') || i18n.t('prompts.summarize') } const userMessage = { diff --git a/src/renderer/src/store/index.ts b/src/renderer/src/store/index.ts index fa734fb5..1e9c599f 100644 --- a/src/renderer/src/store/index.ts +++ b/src/renderer/src/store/index.ts @@ -28,7 +28,7 @@ const persistedReducer = persistReducer( { key: 'cherry-studio', storage, - version: 50, + version: 51, blacklist: ['runtime'], migrate }, diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index 1fa21bc1..21148fb6 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -771,6 +771,10 @@ const migrateConfig = { enabled: false }) return state + }, + '51': (state: RootState) => { + state.settings.topicNamingPrompt = '' + return state } } diff --git a/src/renderer/src/store/settings.ts b/src/renderer/src/store/settings.ts index b6d8edd3..b778aff0 100644 --- a/src/renderer/src/store/settings.ts +++ b/src/renderer/src/store/settings.ts @@ -45,6 +45,7 @@ export interface SettingsState { showMinappIcon: boolean showFilesIcon: boolean customCss: string + topicNamingPrompt: string } const initialState: SettingsState = { @@ -85,7 +86,8 @@ const initialState: SettingsState = { enableTopicNaming: true, showMinappIcon: true, showFilesIcon: true, - customCss: '' + customCss: '', + topicNamingPrompt: '' } const settingsSlice = createSlice({ @@ -212,6 +214,9 @@ const settingsSlice = createSlice({ }, setCustomCss: (state, action: PayloadAction) => { state.customCss = action.payload + }, + setTopicNamingPrompt: (state, action: PayloadAction) => { + state.topicNamingPrompt = action.payload } } }) @@ -256,7 +261,8 @@ export const { setShowMinappIcon, setShowFilesIcon, setPasteLongTextThreshold, - setCustomCss + setCustomCss, + setTopicNamingPrompt } = settingsSlice.actions export default settingsSlice.reducer