defmodule ElixirAiWeb.ChatMessage do use Phoenix.Component alias ElixirAiWeb.Markdown alias Phoenix.LiveView.JS attr :content, :string, required: true def user_message(assigns) do ~H"""
{@content}
""" end attr :content, :string, required: true attr :reasoning_content, :string, default: nil attr :tool_calls, :list, default: [] def assistant_message(assigns) do assigns = assigns |> assign(:_reasoning_id, "reasoning-#{:erlang.phash2(assigns.content)}") |> assign(:_expanded, false) ~H""" <.message_bubble reasoning_id={@_reasoning_id} content={@content} reasoning_content={@reasoning_content} tool_calls={@tool_calls} expanded={@_expanded} /> """ end attr :content, :string, required: true attr :reasoning_content, :string, default: nil attr :tool_calls, :list, default: [] def streaming_assistant_message(assigns) do assigns = assigns |> assign(:_reasoning_id, "reasoning-stream") |> assign(:_expanded, true) ~H""" <.message_bubble reasoning_id={@_reasoning_id} content={@content} reasoning_content={@reasoning_content} tool_calls={@tool_calls} expanded={@_expanded} /> """ end attr :content, :string, required: true attr :reasoning_content, :string, default: nil attr :tool_calls, :list, default: [] attr :reasoning_id, :string, required: true attr :expanded, :boolean, default: false defp message_bubble(assigns) do ~H"""
<%= if @reasoning_content && @reasoning_content != "" do %>
{Markdown.render(@reasoning_content)}
<% end %> <%= for tool_call <- @tool_calls do %>
{tool_call.name}
<%= if tool_call[:arguments] && tool_call[:arguments] != "" do %>
args{tool_call.arguments}
<% end %> <%= if Map.has_key?(tool_call, :result) do %>
result{inspect(tool_call.result)}
<% end %> <%= if Map.has_key?(tool_call, :error) do %>
error{tool_call.error}
<% end %>
<% end %> <%= if @content && @content != "" do %>
{Markdown.render(@content)}
<% end %>
""" end end