diff --git a/packages/shared/data/preference/preferenceTypes.ts b/packages/shared/data/preference/preferenceTypes.ts index 397e4d19b6..ada67ce0a9 100644 --- a/packages/shared/data/preference/preferenceTypes.ts +++ b/packages/shared/data/preference/preferenceTypes.ts @@ -1,3 +1,5 @@ +import * as z from 'zod' + import type { PreferenceSchemas } from './preferenceSchemas' export type PreferenceDefaultScopeType = PreferenceSchemas['default'] @@ -38,14 +40,38 @@ export type SelectionActionItem = { searchEngine?: string } -export type BuiltinActionItemId = 'translate' | 'explain' | 'summary' | 'search' | 'copy' | 'refine' | 'quote' +const SelectionBuiltinActionItemIdSchema = z.enum([ + 'translate', + 'explain', + 'summary', + 'search', + 'copy', + 'refine', + 'quote' +]) + +export type SelectionBuiltinActionItemId = z.infer + +export function isBuiltinActionItemId(id: string): id is SelectionBuiltinActionItemId { + return SelectionBuiltinActionItemIdSchema.safeParse(id).success +} export interface SelectionBuiltinActionItem extends SelectionActionItem { - id: BuiltinActionItemId + id: SelectionBuiltinActionItemId isBuiltIn: true assistantId?: never } +export function isSelectionBuiltinActionItem( + item: SelectionActionItem | null | undefined +): item is SelectionBuiltinActionItem { + if (!item) { + return false + } + + return isBuiltinActionItemId(item.id) +} + export enum ThemeMode { light = 'light', dark = 'dark', diff --git a/src/renderer/src/windows/selection/action/SelectionActionApp.tsx b/src/renderer/src/windows/selection/action/SelectionActionApp.tsx index f7fe90099b..fa4b4f5f6c 100644 --- a/src/renderer/src/windows/selection/action/SelectionActionApp.tsx +++ b/src/renderer/src/windows/selection/action/SelectionActionApp.tsx @@ -2,9 +2,11 @@ import { Button, Tooltip } from '@cherrystudio/ui' import { usePreference } from '@data/hooks/usePreference' import { isMac } from '@renderer/config/constant' import i18n from '@renderer/i18n' -import { getAssistantById } from '@renderer/services/AssistantService' +import { getAssistantById, getDefaultModel, getTranslateModel } from '@renderer/services/AssistantService' +import { getProviderNameById } from '@renderer/services/ProviderService' +import type { Model } from '@renderer/types' import { defaultLanguage } from '@shared/config/constant' -import type { SelectionActionItem } from '@shared/data/preference/preferenceTypes' +import { isSelectionBuiltinActionItem, type SelectionActionItem } from '@shared/data/preference/preferenceTypes' import { IpcChannel } from '@shared/IpcChannel' import { Slider } from 'antd' import { Droplet, Minus, Pin, X } from 'lucide-react' @@ -23,13 +25,25 @@ const SelectionActionApp: FC = () => { const { t } = useTranslation() const [action, setAction] = useState(null) - const assistant = useMemo(() => { - if (action?.assistantId) { - return getAssistantById(action.assistantId) - } else { - return null + const model: Model | undefined = useMemo(() => { + if (isSelectionBuiltinActionItem(action)) { + switch (action.id) { + case 'translate': + return getTranslateModel() + case 'explain': + case 'summary': + case 'refine': + return getDefaultModel() + default: + return undefined + } } - }, [action?.assistantId]) + if (action?.assistantId) { + const assistant = getAssistantById(action.assistantId) + return assistant?.model + } + return undefined + }, [action]) const isActionLoaded = useRef(false) @@ -214,7 +228,11 @@ const SelectionActionApp: FC = () => { )} {action.isBuiltIn ? t(action.name) : action.name} - {assistant?.model !== undefined && {assistant.model.name}} + {model !== undefined && ( + + {getProviderNameById(model.provider)} | {model.name} + + )} = ({ action, scrollToBottom }) => { +const ActionTranslate = ({ action, scrollToBottom }: Props) => { const { t } = useTranslation() const [language] = usePreference('app.language')