fix: filter empty user messages

This commit is contained in:
kangfenmao 2024-08-08 18:13:15 +08:00
parent 5a0927393d
commit 30a082b979
5 changed files with 12 additions and 13 deletions

View File

@ -56,5 +56,4 @@ electronDownload:
afterSign: scripts/notarize.js afterSign: scripts/notarize.js
releaseInfo: releaseInfo:
releaseNotes: | releaseNotes: |
支持保存自定义智能体 错误修复,优化体验
修复话题重命名的问题

View File

@ -212,8 +212,7 @@ const resources = {
'keep_alive_time.description': 'The time in minutes to keep the connection alive, default is 5 minutes.' 'keep_alive_time.description': 'The time in minutes to keep the connection alive, default is 5 minutes.'
}, },
error: { error: {
'chat.response': 'chat.response': 'Something went wrong. Please check if you have set your API key in the Settings > Providers'
'Something went wrong. Please check your API key in settings > providers, or check your proxy in Settings > General > Proxy'
} }
} }
}, },
@ -427,7 +426,7 @@ const resources = {
'keep_alive_time.description': '对话后模型在内存中保持的时间默认5分钟' 'keep_alive_time.description': '对话后模型在内存中保持的时间默认5分钟'
}, },
error: { error: {
'chat.response': '出错了,这通常是由于没有正确配置 API 密钥或代理导致的, 请前往设置 > 模型提供商中配置 API 密钥' 'chat.response': '出错了,如果没有配置 API 密钥,请前往设置 > 模型提供商中配置密钥'
} }
} }
} }

View File

@ -2,7 +2,7 @@ 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 { estimateHistoryTokenCount, filterAtMessages } from '@renderer/services/messages' import { estimateHistoryTokenCount, filterMessages } 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 { getBriefInfo, runAsyncFunction, uuid } from '@renderer/utils' import { getBriefInfo, runAsyncFunction, uuid } from '@renderer/utils'
@ -77,7 +77,7 @@ const Messages: FC<Props> = ({ assistant, topic }) => {
setTimeout(() => EventEmitter.emit(EVENT_NAMES.AI_AUTO_RENAME), 100) setTimeout(() => EventEmitter.emit(EVENT_NAMES.AI_AUTO_RENAME), 100)
}), }),
EventEmitter.on(EVENT_NAMES.REGENERATE_MESSAGE, async (model: Model) => { EventEmitter.on(EVENT_NAMES.REGENERATE_MESSAGE, async (model: Model) => {
const lastUserMessage = last(filterAtMessages(messages).filter((m) => m.role === 'user')) const lastUserMessage = last(filterMessages(messages).filter((m) => m.role === 'user'))
if (lastUserMessage) { if (lastUserMessage) {
const content = `[@${model.name}](#) ${getBriefInfo(lastUserMessage.content)}` const content = `[@${model.name}](#) ${getBriefInfo(lastUserMessage.content)}`
onSendMessage({ ...lastUserMessage, id: uuid(), type: '@', content }) onSendMessage({ ...lastUserMessage, id: uuid(), type: '@', content })

View File

@ -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 './messages' import { filterMessages } from './messages'
import ProviderSDK from './ProviderSDK' import ProviderSDK from './ProviderSDK'
export async function fetchChatCompletion({ export async function fetchChatCompletion({
@ -61,11 +61,12 @@ export async function fetchChatCompletion({
}, 1000) }, 1000)
try { try {
await providerSdk.completions(filterAtMessages(messages), assistant, ({ text, usage }) => { await providerSdk.completions(filterMessages(messages), assistant, ({ text, usage }) => {
message.content = message.content + text || '' message.content = message.content + text || ''
message.usage = usage message.usage = usage
onResponse({ ...message, status: 'pending' }) onResponse({ ...message, status: 'pending' })
}) })
message.status = 'success'
} catch (error: any) { } catch (error: any) {
message.content = `Error: ${error.message}` message.content = `Error: ${error.message}`
message.status = 'error' message.status = 'error'

View File

@ -1,11 +1,11 @@
import { Assistant, Message } from '@renderer/types' import { Assistant, Message } from '@renderer/types'
import { GPTTokens } from 'gpt-tokens' import { GPTTokens } from 'gpt-tokens'
import { takeRight } from 'lodash' import { isEmpty, takeRight } from 'lodash'
import { getAssistantSettings } from './assistant' import { getAssistantSettings } from './assistant'
export const filterAtMessages = (messages: Message[]) => { export const filterMessages = (messages: Message[]) => {
return messages.filter((message) => message.type !== '@') return messages.filter((message) => message.type !== '@').filter((message) => !isEmpty(message.content.trim()))
} }
export function estimateInputTokenCount(text: string) { export function estimateInputTokenCount(text: string) {
@ -24,7 +24,7 @@ export function estimateHistoryTokenCount(assistant: Assistant, msgs: Message[])
model: 'gpt-4o', model: 'gpt-4o',
messages: [ messages: [
{ role: 'system', content: assistant.prompt }, { role: 'system', content: assistant.prompt },
...filterAtMessages(takeRight(msgs, contextCount)).map((message) => ({ ...filterMessages(takeRight(msgs, contextCount)).map((message) => ({
role: message.role, role: message.role,
content: message.content content: message.content
})) }))