in challenge5/frontend/lib/assistant.ts [104:241]
await handleTurn(allConversationItems, async ({ event, data }) => {
// Handle message from the assistant
if (event === 'assistant_delta') {
assistantMessageContent += data.content || ''
// Update chat messages
const lastItemIndex = chatMessages.length - 1
if (
chatMessages[lastItemIndex] &&
chatMessages[lastItemIndex].type === 'message' &&
chatMessages[lastItemIndex].role === 'assistant'
) {
chatMessages[lastItemIndex].content = assistantMessageContent
} else {
chatMessages.push({
type: 'message',
role: 'assistant',
content: assistantMessageContent
})
}
setChatMessages([...chatMessages])
// Update conversation items
const lastMessageIndex = conversationItems.length - 1
if (
conversationItems[lastMessageIndex] &&
conversationItems[lastMessageIndex].role === 'assistant'
) {
conversationItems[lastMessageIndex].content = assistantMessageContent
} else {
conversationItems.push({
role: 'assistant',
content: assistantMessageContent
})
}
setConversationItems([...conversationItems])
}
// Handle streaming tool call
else if (event === 'function_arguments_delta') {
functionArguments += data.arguments || ''
let parsedFunctionArguments = {}
if (functionArguments.length > 0) {
parsedFunctionArguments = parse(functionArguments)
}
// Update chat messages
const lastItemIndex = chatMessages.length - 1
if (
chatMessages[lastItemIndex] &&
chatMessages[lastItemIndex].type === 'function_call' &&
chatMessages[lastItemIndex].id === data.callId
) {
chatMessages[lastItemIndex].arguments = functionArguments
chatMessages[lastItemIndex].parsedArguments = parsedFunctionArguments
} else {
chatMessages.push({
type: 'function_call',
status: 'in_progress',
id: data.callId,
name: data.name,
arguments: functionArguments,
parsedArguments: parsedFunctionArguments,
output: null
})
}
setChatMessages([...chatMessages])
// Update conversation items
const lastMessageIndex = conversationItems.length - 1
if (
conversationItems[lastMessageIndex] &&
conversationItems[lastMessageIndex].role === 'assistant'
) {
if (conversationItems[lastMessageIndex].tool_calls) {
conversationItems[lastMessageIndex].tool_calls[0].function.arguments =
functionArguments
} else {
conversationItems[lastMessageIndex].tool_calls = [
{
id: data.callId,
type: 'function',
function: {
arguments: functionArguments,
name: data.name
}
}
]
}
} else {
conversationItems.push({
role: 'assistant',
tool_calls: [
{
id: data.callId,
type: 'function',
function: {
arguments: functionArguments,
name: data.name
}
}
]
})
}
setConversationItems([...conversationItems])
}
// Handle tool call execution
else if (event === 'function_arguments_done') {
// Get tool call result
const toolCallResult = await handleTool(
data.name,
parse(functionArguments)
)
// Update chat messages
const lastItemIndex = chatMessages.length - 1
if (
chatMessages[lastItemIndex] &&
chatMessages[lastItemIndex].type === 'function_call'
) {
chatMessages[lastItemIndex].status = 'completed'
chatMessages[lastItemIndex].output = JSON.stringify(toolCallResult)
}
setChatMessages([...chatMessages])
// Update conversation items
conversationItems.push({
role: 'tool',
tool_call_id: data.callId,
content: JSON.stringify(toolCallResult)
})
setConversationItems([...conversationItems])
await processMessages()
}
})