mod download;
mod infer;
pub use download::{DownloadProgress, ModelChoice, ModelPaths, is_model_cached};
use std::path::{Path, PathBuf};
pub fn default_cache_dir() -> PathBuf {
if let Ok(xdg) = std::env::var("XDG_CACHE_HOME")
&& !xdg.is_empty()
{
return PathBuf::from(xdg).join("fim-engine");
}
if let Ok(home) = std::env::var("HOME")
&& !home.is_empty()
{
return PathBuf::from(home).join(".cache").join("fim-engine");
}
PathBuf::from(".fim-engine-cache")
}
pub struct FimEngine {
model: infer::Model,
}
impl FimEngine {
pub fn load(
cache_dir: &Path,
choice: ModelChoice,
progress: &(dyn Fn(DownloadProgress) + Sync),
) -> Result<Self, String> {
let paths = download::ensure_model(cache_dir, choice, progress)?;
let model = infer::Model::load(&paths.gguf, &paths.tokenizer)?;
Ok(FimEngine { model })
}
pub fn complete(
&mut self,
prefix: &str,
suffix: &str,
max_tokens: usize,
) -> Result<String, String> {
self.model.complete(prefix, suffix, max_tokens)
}
}