llama-desktop 1.0.0

Desktop interface for Ollama
use crate::protocol::ModelList;
use eyre::*;
use std::env;
use url::Url;

static mut HOST: Option<String> = None;

pub fn init() -> Result<()> {
    unsafe {
        HOST = Some(get_ollama_host()?);
    }
    Ok(())
}

pub fn path(path: &str) -> Result<String> {
    unsafe { Ok(format!("{}{}", get_host()?, path)) }
}

pub async fn get_models() -> Result<Vec<String>> {
    let uri = path("/api/tags")?;
    let mut models = reqwest::get(uri).await?.json::<ModelList>().await?.models;
    models.sort_by(|a, b| b.modified_at.cmp(&a.modified_at));
    let models = models
        .iter()
        .map(|model| model.name.to_owned())
        .collect::<Vec<_>>();

    if models.is_empty() {
        Err(eyre!("no model found"))
    } else {
        dbg!("Models received");
        Ok(models)
    }
}

unsafe fn get_host() -> Result<String> {
    HOST.clone().ok_or_eyre("OLLAMA_HOST not loaded yet")
}

fn get_ollama_host() -> Result<String> {
    let uri = env::var("OLLAMA_HOST").unwrap_or("http://localhost:11434".to_owned());
    let uri = Url::parse(&uri)?;
    Ok(format!(
        "{}://{}:{}",
        uri.scheme(),
        uri.host_str()
            .ok_or_eyre(format!("fail to parse {}", uri))?,
        uri.port().unwrap_or(11434),
    ))
}