diff --git a/backend/fine_tune.py b/backend/fine_tune.py new file mode 100644 index 0000000..0ed5a12 --- /dev/null +++ b/backend/fine_tune.py @@ -0,0 +1,15 @@ +import sys +import time +import json + + +def main(): + config = sys.argv[1] if len(sys.argv) > 1 else "{}" + for i in range(1, 6): + payload = {"step": i, "message": f"Step {i} completed"} + print(json.dumps(payload), flush=True) + time.sleep(1) + + +if __name__ == "__main__": + main() diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index ae43927..cde32c6 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -4,6 +4,8 @@ use std::{ sync::{Arc, Mutex}, thread, time::Duration, + process::{Command, Stdio}, + io::{BufRead, BufReader}, }; use arboard::Clipboard; @@ -103,6 +105,30 @@ fn get_terminal_history() -> Result, String> { Err("History file not found".into()) } +#[tauri::command] +fn start_fine_tune(app: AppHandle, config: String) -> Result<(), String> { + thread::spawn(move || { + let mut child = Command::new("python3") + .arg("backend/fine_tune.py") + .arg(&config) + .stdout(Stdio::piped()) + .spawn() + .expect("failed to start python"); + + if let Some(stdout) = child.stdout.take() { + let reader = BufReader::new(stdout); + for line in reader.lines() { + if let Ok(line) = line { + let _ = app.emit_all("training_progress", line.clone()); + } + } + } + + let _ = child.wait(); + }); + Ok(()) +} + // ---------- main ------------------------------------------------------------ fn main() { @@ -214,7 +240,8 @@ fn main() { get_saved, add_saved, remove_saved, - get_terminal_history + get_terminal_history, + start_fine_tune ]) .run(tauri::generate_context!()) .expect("Ошибка при запуске приложения"); diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index e392d88..92e80b3 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -10,6 +10,7 @@ let savedItems: string[] = []; let savedInput = ''; let terminalItems: string[] = []; + let trainingLogs: string[] = []; const texts = { en: { @@ -103,6 +104,14 @@ } } + async function startFineTune() { + try { + await invoke('start_fine_tune', { config: 'default' }); + } catch (error) { + console.error('Failed to start training:', error); + } + } + // Обработчик изменения поискового запроса function handleSearchInput() { filterItems(); @@ -123,6 +132,10 @@ }).then(unsubscribe => { cleanup = unsubscribe; }); + + listen('training_progress', (event) => { + trainingLogs = [...trainingLogs, String(event.payload)]; + }); // Возвращаем функцию очистки return () => cleanup && cleanup(); @@ -213,6 +226,17 @@ {/if} +
+

Training Logs

+ +
+
    + {#each trainingLogs as log} +
  • {log}
  • + {/each} +
+
+
@@ -313,6 +337,20 @@ padding: 0.5rem; } + .training-section { + flex: 1 1 100%; + margin-top: 1rem; + } + + .training-container { + margin-top: 0.5rem; + max-height: 40vh; + overflow-y: auto; + border: 1px solid #ddd; + border-radius: 4px; + padding: 0.5rem; + } + .add-container { display: flex; gap: 0.5rem;