68 lines
2.5 KiB
Rust
68 lines
2.5 KiB
Rust
use dialoguer::{Select, Input, theme::ColorfulTheme};
|
||
use reqwest::Client;
|
||
|
||
pub async fn select_model(ollama_url: &str, client: &Client) -> Result<String, String> {
|
||
// 1. Hae tagit
|
||
let mut models = vec![];
|
||
println!(" Haetaan asennettuja malleja osoitteesta {}...", ollama_url);
|
||
if let Ok(resp) = client.get(&format!("{}/api/tags", ollama_url)).send().await {
|
||
if resp.status().is_success() {
|
||
if let Ok(json) = resp.json::<serde_json::Value>().await {
|
||
if let Some(arr) = json.get("models").and_then(|v| v.as_array()) {
|
||
for m in arr {
|
||
if let Some(name) = m.get("name").and_then(|v| v.as_str()) {
|
||
models.push(name.to_string());
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
let download_opt = "[➕ Lataa uusi malli internetistä]";
|
||
let mut options = vec![download_opt.to_string()];
|
||
options.extend(models);
|
||
|
||
// 2. Kysy käyttäjältä Selectillä
|
||
let theme = ColorfulTheme::default();
|
||
let selection = Select::with_theme(&theme)
|
||
.with_prompt("Valitse Ollama-malli Kipinä-verkkoa varten:")
|
||
.default(if options.len() > 1 { 1 } else { 0 })
|
||
.items(&options)
|
||
.interact()
|
||
.map_err(|e| format!("TUI virhe: {}", e))?;
|
||
|
||
let selected = &options[selection];
|
||
|
||
// 3. Jos käyttäjä haluaa uuden, kysy nimeä
|
||
if selected == download_opt {
|
||
let new_model: String = Input::with_theme(&theme)
|
||
.with_prompt("Syötä ladattavan mallin nimi (esim. llama3 tai qwen2.5-coder:3b)")
|
||
.interact_text()
|
||
.map_err(|e| format!("TUI virhe: {}", e))?;
|
||
|
||
let new_model = new_model.trim().to_string();
|
||
if new_model.is_empty() {
|
||
return Err("Mallin nimi ei voi olla tyhjä".to_string());
|
||
}
|
||
|
||
println!(" Ladataan malleja taustalla... Tämä voi kestää hetken ({})", new_model);
|
||
// Odotetaan että pull on valmis
|
||
let pull_body = serde_json::json!({ "name": &new_model });
|
||
let resp = client.post(&format!("{}/api/pull", ollama_url))
|
||
.json(&pull_body)
|
||
.send()
|
||
.await
|
||
.map_err(|e| format!("Pull req virhe: {}", e))?;
|
||
|
||
if resp.status().is_success() {
|
||
println!(" ✓ Malli {} ladattu onnistuneesti!", new_model);
|
||
return Ok(new_model);
|
||
} else {
|
||
return Err(format!("Ollama pull epäonnistui: {}", resp.status()));
|
||
}
|
||
}
|
||
|
||
Ok(selected.clone())
|
||
}
|