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')}
-
-
+ <>
+
+
+ {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