From d3215ce11341178eee6384435603d8a7e7173622 Mon Sep 17 00:00:00 2001 From: Lee Jackson <130007945+Imagineer99@users.noreply.github.com> Date: Mon, 20 Apr 2026 20:14:49 +0100 Subject: [PATCH] Studio: Show LoRA live logs and update GGUF quant options (#5058) * export: update GGUF quant list and ordering * gguf: add Q2_K_L quantize flags for output and embeddings * export: add live console logs for LoRA export flow * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix: stream q2_k_l quantize logs and include subprocess error details * fix: route Q2_K_L preset to q2_k ftype with q8_0 output+embeddings --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Roland Tannous <115670425+rolandtannous@users.noreply.github.com> --- .../export/components/export-dialog.tsx | 40 +++++-- .../frontend/src/features/export/constants.ts | 6 +- unsloth/save.py | 111 ++++++++++++++++-- 3 files changed, 138 insertions(+), 19 deletions(-) diff --git a/studio/frontend/src/features/export/components/export-dialog.tsx b/studio/frontend/src/features/export/components/export-dialog.tsx index 401be3ff4..176b10a52 100644 --- a/studio/frontend/src/features/export/components/export-dialog.tsx +++ b/studio/frontend/src/features/export/components/export-dialog.tsx @@ -272,12 +272,13 @@ export function ExportDialog({ exportSuccess, exportOutputPath, }: ExportDialogProps) { - // Live log capture is only meaningful for export methods that run - // a slow subprocess operation with interesting stdout: merged and - // gguf. LoRA adapter export is a fast disk write and would just - // show a blank panel, so we hide it there. + // Live log capture is useful for any export path executed by the + // backend worker, including LoRA adapter-only export. const showLogPanel = - exportMethod === "merged" || exportMethod === "gguf"; + exportMethod === "merged" || + exportMethod === "gguf" || + exportMethod === "lora"; + const showCompletionScreen = exportSuccess && !showLogPanel; const { lines: logLines, connected: logConnected, error: logError } = useExportLogs(exporting && showLogPanel, exportMethod, open); @@ -314,7 +315,7 @@ export function ExportDialog({ className={showLogPanel ? "sm:max-w-2xl" : "sm:max-w-lg"} onInteractOutside={(e) => { if (exporting) e.preventDefault(); }} > - {exportSuccess ? ( + {showCompletionScreen ? ( <>
@@ -460,6 +461,27 @@ export function ExportDialog({ )} + {/* Success banner for log-driven exports. + Keep users on the log screen after completion so they can + inspect conversion output before closing. */} + {exportSuccess && showLogPanel && ( +
+ +
+ + {destination === "hub" + ? "Export finished and pushed to Hugging Face Hub." + : "Export finished successfully."} + + {exportOutputPath ? ( + + {exportOutputPath} + + ) : null} +
+
+ )} + {/* Error banner */} {exportError && (
@@ -577,14 +599,16 @@ export function ExportDialog({ onClick={() => onOpenChange(false)} disabled={exporting} > - Cancel + {exportSuccess ? "Done" : "Cancel"} -