fix: duplicate role inside messages cause some model to refuse to answer (#3006)

* fix: duplicate role inside messages cause some model to refuse to answer

Signed-off-by: James <namnh0122@gmail.com>

* update

* Bump cortex to 0.4.12

* some model require not empty message

update

---------

Signed-off-by: James <namnh0122@gmail.com>
Co-authored-by: Van Pham <64197333+Van-QA@users.noreply.github.com>
This commit is contained in:
NamH 2024-06-10 16:19:31 +07:00 committed by GitHub
parent 57177d4409
commit 6ee5d16e5c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 64 additions and 1 deletions

View File

@ -1 +1 @@
0.4.11
0.4.12

View File

@ -10,6 +10,7 @@ import {
ConversationalExtension,
EngineManager,
ToolManager,
ChatCompletionMessage,
} from '@janhq/core'
import { atom, useAtom, useAtomValue, useSetAtom } from 'jotai'
@ -19,6 +20,7 @@ import {
fileUploadAtom,
} from '@/containers/Providers/Jotai'
import { Stack } from '@/utils/Stack'
import { compressImage, getBase64 } from '@/utils/base64'
import { MessageRequestBuilder } from '@/utils/messageRequestBuilder'
import { toRuntimeParams, toSettingParams } from '@/utils/modelParam'
@ -90,6 +92,33 @@ export default function useSendChatMessage() {
selectedModelRef.current = selectedModel
}, [selectedModel])
const normalizeMessages = (
messages: ChatCompletionMessage[]
): ChatCompletionMessage[] => {
const stack = new Stack<ChatCompletionMessage>()
for (const message of messages) {
if (stack.isEmpty()) {
stack.push(message)
continue
}
const topMessage = stack.peek()
if (message.role === topMessage.role) {
// add an empty message
stack.push({
role:
topMessage.role === ChatCompletionRole.User
? ChatCompletionRole.Assistant
: ChatCompletionRole.User,
content: '.', // some model requires not empty message
})
}
stack.push(message)
}
return stack.reverseOutput()
}
const resendChatMessage = async (currentMessage: ThreadMessage) => {
if (!activeThreadRef.current) {
console.error('No active thread')
@ -140,6 +169,8 @@ export default function useSendChatMessage() {
) ?? []
)
request.messages = normalizeMessages(request.messages ?? [])
const engine =
requestBuilder.model?.engine ?? selectedModelRef.current?.engine ?? ''
@ -258,6 +289,7 @@ export default function useSendChatMessage() {
(assistant) => assistant.tools ?? []
) ?? []
)
request.messages = normalizeMessages(request.messages ?? [])
// Request for inference
EngineManager.instance()

31
web/utils/Stack.ts Normal file
View File

@ -0,0 +1,31 @@
export class Stack<T> {
private array: T[] = []
pop(): T | undefined {
if (this.isEmpty()) throw new Error()
return this.array.pop()
}
push(data: T): void {
this.array.push(data)
}
peek(): T {
if (this.isEmpty()) throw new Error()
return this.array[this.array.length - 1]
}
isEmpty(): boolean {
return this.array.length === 0
}
size(): number {
return this.array.length
}
reverseOutput(): T[] {
return [...this.array]
}
}