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 && (
+