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:
parent
57177d4409
commit
6ee5d16e5c
@ -1 +1 @@
|
||||
0.4.11
|
||||
0.4.12
|
||||
|
||||
@ -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
31
web/utils/Stack.ts
Normal 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]
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user