fix: estimate history token count

This commit is contained in:
kangfenmao 2024-08-05 13:09:13 +08:00
parent 7ffa42caa0
commit 8759a50727
6 changed files with 45 additions and 36 deletions

View File

@ -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'

View File

@ -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<Props> = ({ 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<Props> = ({ assistant, setActiveTopic }) => {
const inputRef = useRef<TextAreaRef>(null)
const { t } = useTranslation()
_text = text
const sendMessage = useCallback(() => {
if (generating) {
return

View File

@ -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({

View File

@ -1,5 +0,0 @@
import { Message } from '@renderer/types'
export const filterAtMessages = (messages: Message[]) => {
return messages.filter((message) => message.type !== '@')
}

View 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
}

View File

@ -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