mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-01-03 11:19:10 +08:00
fix: estimate history token count
This commit is contained in:
parent
d172df1e52
commit
bb3d044e21
@ -2,10 +2,10 @@ import { useAssistant } from '@renderer/hooks/useAssistant'
|
|||||||
import { useProviderByAssistant } from '@renderer/hooks/useProvider'
|
import { useProviderByAssistant } from '@renderer/hooks/useProvider'
|
||||||
import { fetchChatCompletion, fetchMessagesSummary } from '@renderer/services/api'
|
import { fetchChatCompletion, fetchMessagesSummary } from '@renderer/services/api'
|
||||||
import { EVENT_NAMES, EventEmitter } from '@renderer/services/event'
|
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 LocalStorage from '@renderer/services/storage'
|
||||||
import { Assistant, Message, Model, Topic } from '@renderer/types'
|
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 { t } from 'i18next'
|
||||||
import localforage from 'localforage'
|
import localforage from 'localforage'
|
||||||
import { debounce, last, reverse } from 'lodash'
|
import { debounce, last, reverse } from 'lodash'
|
||||||
|
|||||||
@ -13,10 +13,11 @@ import { useAssistant } from '@renderer/hooks/useAssistant'
|
|||||||
import { useSettings } from '@renderer/hooks/useSettings'
|
import { useSettings } from '@renderer/hooks/useSettings'
|
||||||
import { getDefaultTopic } from '@renderer/services/assistant'
|
import { getDefaultTopic } from '@renderer/services/assistant'
|
||||||
import { EVENT_NAMES, EventEmitter } from '@renderer/services/event'
|
import { EVENT_NAMES, EventEmitter } from '@renderer/services/event'
|
||||||
|
import { estimateInputTokenCount } from '@renderer/services/messages'
|
||||||
import store, { useAppSelector } from '@renderer/store'
|
import store, { useAppSelector } from '@renderer/store'
|
||||||
import { setGenerating } from '@renderer/store/runtime'
|
import { setGenerating } from '@renderer/store/runtime'
|
||||||
import { Assistant, Message, Topic } from '@renderer/types'
|
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 { Button, Popconfirm, Tag, Tooltip } from 'antd'
|
||||||
import TextArea, { TextAreaRef } from 'antd/es/input/TextArea'
|
import TextArea, { TextAreaRef } from 'antd/es/input/TextArea'
|
||||||
import dayjs from 'dayjs'
|
import dayjs from 'dayjs'
|
||||||
@ -32,8 +33,10 @@ interface Props {
|
|||||||
setActiveTopic: (topic: Topic) => void
|
setActiveTopic: (topic: Topic) => void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let _text = ''
|
||||||
|
|
||||||
const Inputbar: FC<Props> = ({ assistant, setActiveTopic }) => {
|
const Inputbar: FC<Props> = ({ assistant, setActiveTopic }) => {
|
||||||
const [text, setText] = useState('')
|
const [text, setText] = useState(_text)
|
||||||
const { addTopic } = useAssistant(assistant.id)
|
const { addTopic } = useAssistant(assistant.id)
|
||||||
const { sendMessageShortcut, showInputEstimatedTokens } = useSettings()
|
const { sendMessageShortcut, showInputEstimatedTokens } = useSettings()
|
||||||
const [expended, setExpend] = useState(false)
|
const [expended, setExpend] = useState(false)
|
||||||
@ -42,6 +45,8 @@ const Inputbar: FC<Props> = ({ assistant, setActiveTopic }) => {
|
|||||||
const inputRef = useRef<TextAreaRef>(null)
|
const inputRef = useRef<TextAreaRef>(null)
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
|
|
||||||
|
_text = text
|
||||||
|
|
||||||
const sendMessage = useCallback(() => {
|
const sendMessage = useCallback(() => {
|
||||||
if (generating) {
|
if (generating) {
|
||||||
return
|
return
|
||||||
|
|||||||
@ -14,7 +14,7 @@ import {
|
|||||||
getTranslateModel
|
getTranslateModel
|
||||||
} from './assistant'
|
} from './assistant'
|
||||||
import { EVENT_NAMES, EventEmitter } from './event'
|
import { EVENT_NAMES, EventEmitter } from './event'
|
||||||
import { filterAtMessages } from './message'
|
import { filterAtMessages } from './messages'
|
||||||
import ProviderSDK from './ProviderSDK'
|
import ProviderSDK from './ProviderSDK'
|
||||||
|
|
||||||
export async function fetchChatCompletion({
|
export async function fetchChatCompletion({
|
||||||
|
|||||||
@ -1,5 +0,0 @@
|
|||||||
import { Message } from '@renderer/types'
|
|
||||||
|
|
||||||
export const filterAtMessages = (messages: Message[]) => {
|
|
||||||
return messages.filter((message) => message.type !== '@')
|
|
||||||
}
|
|
||||||
34
src/renderer/src/services/messages.ts
Normal file
34
src/renderer/src/services/messages.ts
Normal file
@ -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
|
||||||
|
}
|
||||||
@ -1,8 +1,6 @@
|
|||||||
import { DEFAULT_CONEXTCOUNT, DEFAULT_TEMPERATURE } from '@renderer/config/constant'
|
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 imageCompression from 'browser-image-compression'
|
||||||
import { GPTTokens } from 'gpt-tokens'
|
|
||||||
import { takeRight } from 'lodash'
|
|
||||||
import { v4 as uuidv4 } from 'uuid'
|
import { v4 as uuidv4 } from 'uuid'
|
||||||
|
|
||||||
export const runAsyncFunction = async (fn: () => void) => {
|
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
|
* is valid proxy url
|
||||||
* @param url proxy url
|
* @param url proxy url
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user