defmodule ArcanaWeb.MaintenanceLive do @moduledoc """ LiveView for maintenance operations in Arcana. """ use Phoenix.LiveView import ArcanaWeb.DashboardComponents @impl true def mount(_params, session, socket) do repo = get_repo_from_session(session) {:ok, socket |> assign(repo: repo) |> assign( reembed_running: false, reembed_progress: nil, embedding_info: get_embedding_info() ) |> load_data()} end defp load_data(socket) do repo = socket.assigns.repo socket |> assign(stats: load_stats(repo)) end defp get_embedding_info do Arcana.Maintenance.embedding_info() rescue _ -> %{type: :unknown, dimensions: nil} end @impl true def handle_event("reembed", _params, socket) do repo = socket.assigns.repo parent = self() socket = assign(socket, reembed_running: true, reembed_progress: %{current: 0, total: 0}) Task.start(fn -> progress_fn = fn current, total -> send(parent, {:reembed_progress, current, total}) end result = Arcana.Maintenance.reembed(repo, batch_size: 50, progress: progress_fn) send(parent, {:reembed_complete, result}) end) {:noreply, socket} end @impl true def handle_info({:reembed_progress, current, total}, socket) do {:noreply, assign(socket, reembed_progress: %{current: current, total: total})} end def handle_info({:reembed_complete, result}, socket) do socket = case result do {:ok, %{reembedded: count}} -> socket |> assign(reembed_running: false, reembed_progress: nil) |> put_flash(:info, "Re-embedded #{count} chunks successfully!") {:error, reason} -> socket |> assign(reembed_running: false, reembed_progress: nil) |> put_flash(:error, "Re-embedding failed: #{inspect(reason)}") end {:noreply, socket} end @impl true def render(assigns) do ~H""" <.dashboard_layout stats={@stats} current_tab={:maintenance}>
View embedding configuration and re-embed documents if settings change.
Re-embed all chunks using the current embedding configuration. Use this after changing embedding models.
<%= if @reembed_running do %>