import { byId, isNotEmpty } from '@typebot.io/lib' import { Variable, VariableWithValue } from '@typebot.io/schemas' import { ChatCompletionOpenAIOptions } from '@typebot.io/schemas/features/blocks/integrations/openai' import type { OpenAI } from 'openai' import { parseVariables } from '../../../variables/parseVariables' import { transformStringVariablesToList } from '../../../variables/transformVariablesToList' export const parseChatCompletionMessages = (variables: Variable[]) => ( messages: ChatCompletionOpenAIOptions['messages'] ): { variablesTransformedToList: VariableWithValue[] messages: OpenAI.Chat.ChatCompletionMessageParam[] } => { const variablesTransformedToList: VariableWithValue[] = [] const parsedMessages = messages ?.flatMap((message) => { if (!message.role) return if (message.role === 'Messages sequence ✨') { if ( !message.content?.assistantMessagesVariableId || !message.content?.userMessagesVariableId ) return variablesTransformedToList.push( ...transformStringVariablesToList(variables)([ message.content.assistantMessagesVariableId, message.content.userMessagesVariableId, ]) ) const updatedVariables = variables.map((variable) => { const variableTransformedToList = variablesTransformedToList.find( byId(variable.id) ) if (variableTransformedToList) return variableTransformedToList return variable }) const userMessages = (updatedVariables.find( (variable) => variable.id === message.content?.userMessagesVariableId )?.value ?? []) as string[] const assistantMessages = (updatedVariables.find( (variable) => variable.id === message.content?.assistantMessagesVariableId )?.value ?? []) as string[] let allMessages: OpenAI.Chat.ChatCompletionMessageParam[] = [] if (userMessages.length > assistantMessages.length) allMessages = userMessages.flatMap((userMessage, index) => [ { role: 'user', content: userMessage, }, { role: 'assistant', content: assistantMessages.at(index) ?? '' }, ]) satisfies OpenAI.Chat.ChatCompletionMessageParam[] else { allMessages = assistantMessages.flatMap( (assistantMessage, index) => [ { role: 'assistant', content: assistantMessage }, { role: 'user', content: userMessages.at(index) ?? '', }, ] ) satisfies OpenAI.Chat.ChatCompletionMessageParam[] } return allMessages } if (message.role === 'Dialogue') { if (!message.dialogueVariableId) return const dialogue = (variables.find( (variable) => variable.id === message.dialogueVariableId )?.value ?? []) as string[] return dialogue.map( (dialogueItem, index) => { if (index === 0 && message.startsBy === 'assistant') return { role: 'assistant', content: dialogueItem, } return { role: index % (message.startsBy === 'assistant' ? 1 : 2) === 0 ? 'user' : 'assistant', content: dialogueItem, } } ) } return { role: message.role, content: parseVariables(variables)(message.content), name: message.name ? parseVariables(variables)(message.name) : undefined, } satisfies OpenAI.Chat.ChatCompletionMessageParam }) .filter( (message) => isNotEmpty(message?.role) && isNotEmpty(message?.content?.toString()) ) as OpenAI.Chat.ChatCompletionMessageParam[] return { variablesTransformedToList, messages: parsedMessages, } }