onde/lib.rs
1//! # Onde
2//!
3//! **On-device chat inference for cross-platform apps.**
4//!
5//! Run LLM chat locally — no cloud, no latency, no data leaving the device.
6//!
7//! Onde wraps [mistral.rs](https://github.com/EricLBuehler/mistral.rs) with a
8//! unified API for model discovery, HuggingFace Hub downloads, cache
9//! management, and GPU acceleration across every platform.
10//!
11//! Built by [Onde Inference](https://ondeinference.com)
12//!
13//! ## Modules
14//!
15//! - [`hf_cache`] — HuggingFace Hub cache inspection, repair, and model
16//! download with a framework-agnostic progress-callback API.
17//! - [`inference`] — Chat inference engine, UniFFI FFI wrapper, model metadata,
18//! and HuggingFace token resolution.
19//!
20//! ## Re-exports
21//!
22//! `mistralrs`, `hf_hub`, and `mistralrs_core` are re-exported so that apps
23//! depending on `onde` do not need their own direct dependency on those crates.
24//! Access them as `onde::mistralrs`, `onde::hf_hub`, and `onde::mistralrs_core`.
25//!
26//! ## Example
27//!
28//! ```rust,ignore
29//! use onde::inference::ChatEngine;
30//! use onde::inference::GgufModelConfig;
31//!
32//! let engine = ChatEngine::new();
33//! engine
34//! .load_gguf_model(
35//! GgufModelConfig::platform_default(),
36//! Some("You are a helpful assistant.".into()),
37//! None,
38//! )
39//! .await?;
40//!
41//! let result = engine.send_message("Hello!").await?;
42//! println!("{}", result.text);
43//! ```
44
45pub mod hf_cache;
46
47pub mod inference;
48pub mod pulse;
49
50static PANIC_HOOK_ONCE: std::sync::Once = std::sync::Once::new();
51
52pub(crate) fn install_panic_hook_once() {
53 PANIC_HOOK_ONCE.call_once(|| {
54 std::panic::set_hook(Box::new(|panic_info| {
55 let location = panic_info
56 .location()
57 .map(|loc| format!("{}:{}:{}", loc.file(), loc.line(), loc.column()))
58 .unwrap_or_else(|| "<unknown>".to_string());
59
60 let message = if let Some(msg) = panic_info.payload().downcast_ref::<&str>() {
61 (*msg).to_string()
62 } else if let Some(msg) = panic_info.payload().downcast_ref::<String>() {
63 msg.clone()
64 } else {
65 "<non-string panic payload>".to_string()
66 };
67
68 log::error!("Rust panic at {}: {}", location, message);
69 }));
70 });
71}
72
73uniffi::setup_scaffolding!();
74
75// Re-export mistralrs for every platform that onde supports.
76// Apps use `onde::mistralrs::Model` etc. instead of declaring a direct dep.
77#[cfg(any(
78 target_os = "macos",
79 target_os = "ios",
80 target_os = "tvos",
81 target_os = "visionos",
82 target_os = "watchos",
83 target_os = "windows",
84 target_os = "linux",
85 target_os = "android"
86))]
87pub use mistralrs;
88
89// Re-exports needed for the GLOBAL_HF_CACHE workaround on sandboxed platforms.
90// On iOS/tvOS `~/.cache` is outside the container; on Android `dirs::home_dir()`
91// panics. All three need `hf_hub::Cache` + `mistralrs_core::GLOBAL_HF_CACHE`.
92#[cfg(any(target_os = "android", target_os = "ios", target_os = "tvos"))]
93pub use hf_hub;
94#[cfg(any(target_os = "android", target_os = "ios", target_os = "tvos"))]
95pub use mistralrs_core;