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,
|
ConversationalExtension,
|
||||||
EngineManager,
|
EngineManager,
|
||||||
ToolManager,
|
ToolManager,
|
||||||
|
ChatCompletionMessage,
|
||||||
} from '@janhq/core'
|
} from '@janhq/core'
|
||||||
import { atom, useAtom, useAtomValue, useSetAtom } from 'jotai'
|
import { atom, useAtom, useAtomValue, useSetAtom } from 'jotai'
|
||||||
|
|
||||||
@ -19,6 +20,7 @@ import {
|
|||||||
fileUploadAtom,
|
fileUploadAtom,
|
||||||
} from '@/containers/Providers/Jotai'
|
} from '@/containers/Providers/Jotai'
|
||||||
|
|
||||||
|
import { Stack } from '@/utils/Stack'
|
||||||
import { compressImage, getBase64 } from '@/utils/base64'
|
import { compressImage, getBase64 } from '@/utils/base64'
|
||||||
import { MessageRequestBuilder } from '@/utils/messageRequestBuilder'
|
import { MessageRequestBuilder } from '@/utils/messageRequestBuilder'
|
||||||
import { toRuntimeParams, toSettingParams } from '@/utils/modelParam'
|
import { toRuntimeParams, toSettingParams } from '@/utils/modelParam'
|
||||||
@ -90,6 +92,33 @@ export default function useSendChatMessage() {
|
|||||||
selectedModelRef.current = selectedModel
|
selectedModelRef.current = selectedModel
|
||||||
}, [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) => {
|
const resendChatMessage = async (currentMessage: ThreadMessage) => {
|
||||||
if (!activeThreadRef.current) {
|
if (!activeThreadRef.current) {
|
||||||
console.error('No active thread')
|
console.error('No active thread')
|
||||||
@ -140,6 +169,8 @@ export default function useSendChatMessage() {
|
|||||||
) ?? []
|
) ?? []
|
||||||
)
|
)
|
||||||
|
|
||||||
|
request.messages = normalizeMessages(request.messages ?? [])
|
||||||
|
|
||||||
const engine =
|
const engine =
|
||||||
requestBuilder.model?.engine ?? selectedModelRef.current?.engine ?? ''
|
requestBuilder.model?.engine ?? selectedModelRef.current?.engine ?? ''
|
||||||
|
|
||||||
@ -258,6 +289,7 @@ export default function useSendChatMessage() {
|
|||||||
(assistant) => assistant.tools ?? []
|
(assistant) => assistant.tools ?? []
|
||||||
) ?? []
|
) ?? []
|
||||||
)
|
)
|
||||||
|
request.messages = normalizeMessages(request.messages ?? [])
|
||||||
|
|
||||||
// Request for inference
|
// Request for inference
|
||||||
EngineManager.instance()
|
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