Skip to main content

examples/streaming_tool_call_chunks.exs

alias BeamWeaver.Core.Messages
alias BeamWeaver.Stream
alias BeamWeaver.Stream.Envelope
alias BeamWeaver.Stream.Events
alias BeamWeaver.Stream.Finalize

events = [
  %Envelope{
    event: %Events.MessageChunk{
      chunk:
        Messages.ai_chunk("",
          id: "msg-1",
          tool_call_chunks: [
            Messages.tool_call_chunk(
              id: "call_weather",
              index: 0,
              name: "get_weather",
              args: ~s({"city")
            )
          ]
        )
    },
    run_id: "run-1",
    node: "llm"
  },
  %Envelope{
    event: %Events.MessageChunk{
      chunk:
        Messages.ai_chunk("",
          id: "msg-1",
          tool_call_chunks: [
            Messages.tool_call_chunk(
              id: "call_weather",
              index: 0,
              args: ~s(: "Nicosia"})
            )
          ]
        )
    },
    run_id: "run-1",
    node: "llm"
  }
]

for %Envelope{event: %Events.MessageChunk{chunk: chunk}} <- events,
    tool_chunk <- chunk.tool_call_chunks do
  IO.inspect(
    %{id: tool_chunk.id, name: tool_chunk.name, args_delta: tool_chunk.args},
    label: "streamed tool-call chunk"
  )
end

final_message =
  events
  |> Enum.map(fn %Envelope{event: %Events.MessageChunk{chunk: chunk}} -> chunk end)
  |> Finalize.finalize()

IO.inspect(final_message.tool_calls, label: "reconstructed tool calls")
IO.inspect(Stream.event_mode(hd(events).event), label: "native stream mode")