fix: more work on A2UI
This commit is contained in:
@@ -31,6 +31,7 @@ defmodule BDS.Desktop.ShellLive.ChatEditor.MessageBuild do
|
||||
is_streaming: not is_nil(request),
|
||||
streaming_content: streaming_content(request),
|
||||
streaming_tool_markers: ToolTracking.tool_markers_from_events(request),
|
||||
streaming_inline_surfaces: streaming_inline_surfaces(conversation.id, request, assigns),
|
||||
offline?: Map.get(assigns, :offline_mode, true),
|
||||
needs_api_key?: ModelSelection.needs_api_key?(Map.get(assigns, :offline_mode, true)),
|
||||
action_error: Map.get(assigns.chat_editor_action_errors, conversation.id),
|
||||
@@ -49,7 +50,7 @@ defmodule BDS.Desktop.ShellLive.ChatEditor.MessageBuild do
|
||||
case message.role do
|
||||
:tool ->
|
||||
if current_entry && current_entry.role == :assistant do
|
||||
{entries, append_tool_surface(current_entry, message), turn_index}
|
||||
{entries, append_tool_result(current_entry, message), turn_index}
|
||||
else
|
||||
{entries, current_entry, turn_index}
|
||||
end
|
||||
@@ -95,18 +96,15 @@ defmodule BDS.Desktop.ShellLive.ChatEditor.MessageBuild do
|
||||
content: message.content || "",
|
||||
turn_index: turn_index,
|
||||
tool_markers: tool_markers,
|
||||
inline_surfaces: ToolSurfaces.build_render_surfaces(tool_markers, message.id, assigns),
|
||||
inline_surfaces:
|
||||
ToolSurfaces.build_render_surfaces(tool_markers, message.id, assigns)
|
||||
|> mark_latest_surface_expanded(assigns),
|
||||
tool_surfaces: []
|
||||
}
|
||||
end
|
||||
|
||||
defp append_tool_surface(entry, message) do
|
||||
entry = ToolTracking.mark_tool_call_completed(entry, message.tool_call_id)
|
||||
|
||||
case ToolSurfaces.normalize_tool_surface(message.content) do
|
||||
nil -> entry
|
||||
surface -> update_in(entry.tool_surfaces, &(&1 ++ [surface]))
|
||||
end
|
||||
defp append_tool_result(entry, message) do
|
||||
ToolTracking.mark_tool_call_completed(entry, message.tool_call_id, message.content)
|
||||
end
|
||||
|
||||
defp tool_only_assistant_entry?(%{role: :assistant, content: content} = entry) do
|
||||
@@ -125,6 +123,17 @@ defmodule BDS.Desktop.ShellLive.ChatEditor.MessageBuild do
|
||||
}
|
||||
end
|
||||
|
||||
defp mark_latest_surface_expanded([], _assigns), do: []
|
||||
|
||||
defp mark_latest_surface_expanded(surfaces, assigns) do
|
||||
dismissed = Map.get(assigns, :chat_editor_dismissed_surfaces, MapSet.new())
|
||||
|
||||
surfaces
|
||||
|> Enum.reject(&MapSet.member?(dismissed, &1.id))
|
||||
|> Enum.with_index()
|
||||
|> Enum.map(fn {surface, index} -> Map.put(surface, :expanded?, index == length(surfaces) - 1) end)
|
||||
end
|
||||
|
||||
defp pending_user_message(_messages, nil), do: nil
|
||||
|
||||
defp pending_user_message(messages, %{message: message}) when is_binary(message) do
|
||||
@@ -140,6 +149,15 @@ defmodule BDS.Desktop.ShellLive.ChatEditor.MessageBuild do
|
||||
defp streaming_content(%{content: content}) when is_binary(content), do: content
|
||||
defp streaming_content(_request), do: ""
|
||||
|
||||
defp streaming_inline_surfaces(_conversation_id, nil, _assigns), do: []
|
||||
|
||||
defp streaming_inline_surfaces(conversation_id, request, assigns) do
|
||||
request
|
||||
|> ToolTracking.tool_markers_from_events()
|
||||
|> ToolSurfaces.build_render_surfaces("streaming-#{conversation_id}", assigns)
|
||||
|> mark_latest_surface_expanded(assigns)
|
||||
end
|
||||
|
||||
defp translated(text, bindings \\ %{}),
|
||||
do: ShellData.translate(text, bindings, BDS.Desktop.UILocale.current())
|
||||
end
|
||||
|
||||
@@ -22,6 +22,7 @@ defmodule BDS.Desktop.ShellLive.ChatEditor.ToolTracking do
|
||||
name: tool_call_name(tool_call),
|
||||
arguments: arguments,
|
||||
args_preview: tool_arguments_preview(arguments),
|
||||
result: nil,
|
||||
complete?: false
|
||||
}
|
||||
end)
|
||||
@@ -39,11 +40,19 @@ defmodule BDS.Desktop.ShellLive.ChatEditor.ToolTracking do
|
||||
@spec tool_arguments_preview(term()) :: term()
|
||||
def tool_arguments_preview(_arguments), do: ""
|
||||
|
||||
@spec mark_tool_call_completed(term(), term()) :: term()
|
||||
def mark_tool_call_completed(entry, tool_call_id) when is_binary(tool_call_id) do
|
||||
mark_tool_call_completed(entry, tool_call_id, nil)
|
||||
end
|
||||
|
||||
def mark_tool_call_completed(entry, _tool_call_id), do: entry
|
||||
|
||||
@spec mark_tool_call_completed(term(), term(), term()) :: term()
|
||||
def mark_tool_call_completed(entry, tool_call_id, result) when is_binary(tool_call_id) do
|
||||
update_in(entry.tool_markers, fn markers ->
|
||||
Enum.map(markers, fn marker ->
|
||||
if marker.id == tool_call_id do
|
||||
%{marker | complete?: true}
|
||||
%{marker | complete?: true, result: result}
|
||||
else
|
||||
marker
|
||||
end
|
||||
@@ -51,8 +60,7 @@ defmodule BDS.Desktop.ShellLive.ChatEditor.ToolTracking do
|
||||
end)
|
||||
end
|
||||
|
||||
@spec mark_tool_call_completed(term(), term()) :: term()
|
||||
def mark_tool_call_completed(entry, _tool_call_id), do: entry
|
||||
def mark_tool_call_completed(entry, _tool_call_id, _result), do: entry
|
||||
|
||||
@spec tool_markers_from_events(term()) :: term()
|
||||
def tool_markers_from_events(nil), do: []
|
||||
@@ -68,6 +76,7 @@ defmodule BDS.Desktop.ShellLive.ChatEditor.ToolTracking do
|
||||
name: event.name,
|
||||
arguments: event.arguments,
|
||||
args_preview: tool_arguments_preview(event.arguments || %{}),
|
||||
result: nil,
|
||||
complete?: false
|
||||
}
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user