diff --git a/src/renderer/src/pages/home/components/Messages.tsx b/src/renderer/src/pages/home/components/Messages.tsx index c9c2e48d..c06b1d75 100644 --- a/src/renderer/src/pages/home/components/Messages.tsx +++ b/src/renderer/src/pages/home/components/Messages.tsx @@ -2,10 +2,10 @@ import { useAssistant } from '@renderer/hooks/useAssistant' import { useProviderByAssistant } from '@renderer/hooks/useProvider' import { fetchChatCompletion, fetchMessagesSummary } from '@renderer/services/api' import { EVENT_NAMES, EventEmitter } from '@renderer/services/event' -import { filterAtMessages } from '@renderer/services/message' +import { estimateHistoryTokenCount, filterAtMessages } from '@renderer/services/messages' import LocalStorage from '@renderer/services/storage' import { Assistant, Message, Model, Topic } from '@renderer/types' -import { estimateHistoryTokenCount, getBriefInfo, runAsyncFunction, uuid } from '@renderer/utils' +import { getBriefInfo, runAsyncFunction, uuid } from '@renderer/utils' import { t } from 'i18next' import localforage from 'localforage' import { debounce, last, reverse } from 'lodash' diff --git a/src/renderer/src/pages/home/components/input/Inputbar.tsx b/src/renderer/src/pages/home/components/input/Inputbar.tsx index cfde8450..b11e9d01 100644 --- a/src/renderer/src/pages/home/components/input/Inputbar.tsx +++ b/src/renderer/src/pages/home/components/input/Inputbar.tsx @@ -13,10 +13,11 @@ import { useAssistant } from '@renderer/hooks/useAssistant' import { useSettings } from '@renderer/hooks/useSettings' import { getDefaultTopic } from '@renderer/services/assistant' import { EVENT_NAMES, EventEmitter } from '@renderer/services/event' +import { estimateInputTokenCount } from '@renderer/services/messages' import store, { useAppSelector } from '@renderer/store' import { setGenerating } from '@renderer/store/runtime' import { Assistant, Message, Topic } from '@renderer/types' -import { estimateInputTokenCount, uuid } from '@renderer/utils' +import { uuid } from '@renderer/utils' import { Button, Popconfirm, Tag, Tooltip } from 'antd' import TextArea, { TextAreaRef } from 'antd/es/input/TextArea' import dayjs from 'dayjs' @@ -32,8 +33,10 @@ interface Props { setActiveTopic: (topic: Topic) => void } +let _text = '' + const Inputbar: FC = ({ assistant, setActiveTopic }) => { - const [text, setText] = useState('') + const [text, setText] = useState(_text) const { addTopic } = useAssistant(assistant.id) const { sendMessageShortcut, showInputEstimatedTokens } = useSettings() const [expended, setExpend] = useState(false) @@ -42,6 +45,8 @@ const Inputbar: FC = ({ assistant, setActiveTopic }) => { const inputRef = useRef(null) const { t } = useTranslation() + _text = text + const sendMessage = useCallback(() => { if (generating) { return diff --git a/src/renderer/src/services/api.ts b/src/renderer/src/services/api.ts index 4d6b78f7..ff6ae082 100644 --- a/src/renderer/src/services/api.ts +++ b/src/renderer/src/services/api.ts @@ -14,7 +14,7 @@ import { getTranslateModel } from './assistant' import { EVENT_NAMES, EventEmitter } from './event' -import { filterAtMessages } from './message' +import { filterAtMessages } from './messages' import ProviderSDK from './ProviderSDK' export async function fetchChatCompletion({ diff --git a/src/renderer/src/services/message.ts b/src/renderer/src/services/message.ts deleted file mode 100644 index 237b7f23..00000000 --- a/src/renderer/src/services/message.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Message } from '@renderer/types' - -export const filterAtMessages = (messages: Message[]) => { - return messages.filter((message) => message.type !== '@') -} diff --git a/src/renderer/src/services/messages.ts b/src/renderer/src/services/messages.ts new file mode 100644 index 00000000..84166593 --- /dev/null +++ b/src/renderer/src/services/messages.ts @@ -0,0 +1,34 @@ +import { Assistant, Message } from '@renderer/types' +import { getAssistantSettings } from '@renderer/utils' +import { GPTTokens } from 'gpt-tokens' +import { takeRight } from 'lodash' + +export const filterAtMessages = (messages: Message[]) => { + return messages.filter((message) => message.type !== '@') +} + +export function estimateInputTokenCount(text: string) { + const input = new GPTTokens({ + model: 'gpt-4o', + messages: [{ role: 'user', content: text }] + }) + + return input.usedTokens - 7 +} + +export function estimateHistoryTokenCount(assistant: Assistant, msgs: Message[]) { + const { contextCount } = getAssistantSettings(assistant) + + const all = new GPTTokens({ + model: 'gpt-4o', + messages: [ + { role: 'system', content: assistant.prompt }, + ...filterAtMessages(takeRight(msgs, contextCount)).map((message) => ({ + role: message.role, + content: message.content + })) + ] + }) + + return all.usedTokens - 7 +} diff --git a/src/renderer/src/utils/index.ts b/src/renderer/src/utils/index.ts index c5078c41..ff81cb4e 100644 --- a/src/renderer/src/utils/index.ts +++ b/src/renderer/src/utils/index.ts @@ -1,8 +1,6 @@ import { DEFAULT_CONEXTCOUNT, DEFAULT_TEMPERATURE } from '@renderer/config/constant' -import { Assistant, AssistantSettings, Message, Model } from '@renderer/types' +import { Assistant, AssistantSettings, Model } from '@renderer/types' import imageCompression from 'browser-image-compression' -import { GPTTokens } from 'gpt-tokens' -import { takeRight } from 'lodash' import { v4 as uuidv4 } from 'uuid' export const runAsyncFunction = async (fn: () => void) => { @@ -181,29 +179,6 @@ export const getAssistantSettings = (assistant: Assistant): AssistantSettings => } } -export function estimateInputTokenCount(text: string) { - const input = new GPTTokens({ - model: 'gpt-4o', - messages: [{ role: 'user', content: text }] - }) - - return input.usedTokens - 7 -} - -export function estimateHistoryTokenCount(assistant: Assistant, msgs: Message[]) { - const { contextCount } = getAssistantSettings(assistant) - - const all = new GPTTokens({ - model: 'gpt-4o', - messages: [ - { role: 'system', content: assistant.prompt }, - ...takeRight(msgs, contextCount).map((message) => ({ role: message.role, content: message.content })) - ] - }) - - return all.usedTokens - 7 -} - /** * is valid proxy url * @param url proxy url