diff --git a/src/renderer/src/i18n/index.ts b/src/renderer/src/i18n/index.ts index 54c0bc0a..232c1674 100644 --- a/src/renderer/src/i18n/index.ts +++ b/src/renderer/src/i18n/index.ts @@ -113,6 +113,7 @@ const resources = { file: 'File', name: 'Name', size: 'Size', + count: 'Count', created_at: 'Created At' }, agents: { @@ -385,6 +386,7 @@ const resources = { file: '文件', name: '文件名', size: '大小', + count: '文件数', created_at: '创建时间' }, agents: { diff --git a/src/renderer/src/pages/files/FilesPage.tsx b/src/renderer/src/pages/files/FilesPage.tsx index 6c6b96e9..60872c2e 100644 --- a/src/renderer/src/pages/files/FilesPage.tsx +++ b/src/renderer/src/pages/files/FilesPage.tsx @@ -22,6 +22,7 @@ const FilesPage: FC = () => { file: isImage ? ImageView : {file.origin_name}, name: {file.origin_name}, size: `${(file.size / 1024 / 1024).toFixed(2)} MB`, + count: file.count, created_at: dayjs(file.created_at).format('MM-DD HH:mm') } }) @@ -44,6 +45,12 @@ const FilesPage: FC = () => { key: 'size', width: '100px' }, + { + title: t('files.count'), + dataIndex: 'count', + key: 'count', + width: '100px' + }, { title: t('files.created_at'), dataIndex: 'created_at', diff --git a/src/renderer/src/pages/home/Messages/Message.tsx b/src/renderer/src/pages/home/Messages/Message.tsx index 51e57195..36fe2577 100644 --- a/src/renderer/src/pages/home/Messages/Message.tsx +++ b/src/renderer/src/pages/home/Messages/Message.tsx @@ -17,7 +17,6 @@ import { useAssistant } from '@renderer/hooks/useAssistant' import useAvatar from '@renderer/hooks/useAvatar' import { useModel } from '@renderer/hooks/useModel' import { useSettings } from '@renderer/hooks/useSettings' -import { useRuntime } from '@renderer/hooks/useStore' import { EVENT_NAMES, EventEmitter } from '@renderer/services/event' import { Message, Model } from '@renderer/types' import { firstLetter, removeLeadingEmoji, removeTrailingDoubleSpaces } from '@renderer/utils' @@ -31,6 +30,7 @@ import styled from 'styled-components' import SelectModelDropdown from '../components/SelectModelDropdown' import Markdown from '../Markdown/Markdown' import MessageAttachments from './MessageAttachments' +import MessgeTokens from './MessageTokens' interface Props { message: Message @@ -152,9 +152,10 @@ const MessageItem: FC = ({ message, index, showMenu, onDeleteMessage }) = - + + {showMenu && ( - + {message.role === 'user' && ( @@ -204,39 +205,12 @@ const MessageItem: FC = ({ message, index, showMenu, onDeleteMessage }) = )} )} - ) } -const MessgeTokens: React.FC<{ message: Message }> = ({ message }) => { - const { generating } = useRuntime() - - if (!message.usage) { - return null - } - - if (message.role === 'user') { - return Tokens: {message?.usage?.total_tokens} - } - - if (generating) { - return null - } - - if (message.role === 'assistant') { - return ( - - Tokens: {message?.usage?.total_tokens} | ↑{message?.usage?.prompt_tokens} | ↓{message?.usage?.completion_tokens} - - ) - } - - return null -} - const MessageContent: React.FC<{ message: Message }> = ({ message }) => { const { t } = useTranslation() @@ -358,13 +332,6 @@ const MenusBar = styled.div` margin-left: -5px; ` -const MessageMetadata = styled.div` - font-size: 12px; - color: var(--color-text-2); - user-select: text; - margin: 2px 0; -` - const ActionButton = styled.div` cursor: pointer; border-radius: 8px; diff --git a/src/renderer/src/pages/home/Messages/MessageTokens.tsx b/src/renderer/src/pages/home/Messages/MessageTokens.tsx new file mode 100644 index 00000000..24e81d3c --- /dev/null +++ b/src/renderer/src/pages/home/Messages/MessageTokens.tsx @@ -0,0 +1,38 @@ +import { useRuntime } from '@renderer/hooks/useStore' +import { Message } from '@renderer/types' +import styled from 'styled-components' + +const MessgeTokens: React.FC<{ message: Message }> = ({ message }) => { + const { generating } = useRuntime() + + if (!message.usage) { + return null + } + + if (message.role === 'user') { + return Tokens: {message?.usage?.total_tokens} + } + + if (generating) { + return null + } + + if (message.role === 'assistant') { + return ( + + Tokens: {message?.usage?.total_tokens} | ↑{message?.usage?.prompt_tokens} | ↓{message?.usage?.completion_tokens} + + ) + } + + return null +} + +const MessageMetadata = styled.div` + font-size: 12px; + color: var(--color-text-2); + user-select: text; + margin: 2px 0; +` + +export default MessgeTokens diff --git a/src/renderer/src/pages/settings/GeneralSettings.tsx b/src/renderer/src/pages/settings/GeneralSettings.tsx index 9e18006a..faba2d67 100644 --- a/src/renderer/src/pages/settings/GeneralSettings.tsx +++ b/src/renderer/src/pages/settings/GeneralSettings.tsx @@ -77,20 +77,22 @@ const GeneralSettings: FC = () => { ]} /> - {isMac && ( - - {t('settings.theme.window.style.title')} - + + )} @@ -108,7 +110,7 @@ const GeneralSettings: FC = () => { {topicPosition === 'left' && ( <> - + {t('settings.advanced.click_assistant_switch_to_topics')} { + private async getMessageParam( + message: Message, + model: Model + ): Promise { + const isVision = isVisionModel(model) + if (message.role !== 'user') { return { role: message.role, @@ -49,7 +55,7 @@ export default class OpenAIProvider extends BaseProvider { ] for (const file of message.files || []) { - if (file.type === FileTypes.IMAGE) { + if (file.type === FileTypes.IMAGE && isVision) { const image = await window.api.file.base64Image(file.id + file.ext) parts.push({ type: 'image_url', @@ -83,7 +89,7 @@ export default class OpenAIProvider extends BaseProvider { onFilterMessages(_messages) for (const message of _messages) { - userMessages.push(await this.getMessageParam(message)) + userMessages.push(await this.getMessageParam(message, model)) } // @ts-ignore key is not typed