await handleTurn()

in conversational-assistant/lib/assistant.ts [102:239]


  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()
    }
  })