Skip to main content

foundation_models/model/
mod.rs

1//! [`SystemLanguageModel`] — entry point for querying device capability.
2
3use crate::error::Unavailability;
4use crate::ffi;
5
6/// The on-device default language model provided by the operating system.
7///
8/// `FoundationModels` exposes a single shared `SystemLanguageModel.default`;
9/// this type mirrors that singleton and only carries availability queries.
10/// To actually generate text, construct a [`crate::LanguageModelSession`].
11///
12/// # Examples
13///
14/// ```rust,no_run
15/// use foundation_models::SystemLanguageModel;
16///
17/// if SystemLanguageModel::is_available() {
18///     println!("Apple Intelligence model is ready.");
19/// } else {
20///     eprintln!("Unavailable: {:?}", SystemLanguageModel::availability());
21/// }
22/// ```
23#[derive(Debug, Clone, Copy)]
24pub struct SystemLanguageModel;
25
26impl SystemLanguageModel {
27    /// Convenience: `availability() == Availability::Available`.
28    #[must_use]
29    pub fn is_available() -> bool {
30        unsafe { ffi::fm_system_model_is_available() }
31    }
32
33    /// Detailed availability state of the on-device model.
34    #[must_use]
35    pub fn availability() -> Availability {
36        let code = unsafe { ffi::fm_system_model_availability_code() };
37        match code {
38            0 => Availability::Available,
39            1 => Availability::Unavailable(Unavailability::DeviceNotEligible),
40            2 => Availability::Unavailable(Unavailability::AppleIntelligenceNotEnabled),
41            3 => Availability::Unavailable(Unavailability::ModelNotReady),
42            -1 => Availability::Unavailable(Unavailability::OsTooOld),
43            _ => Availability::Unavailable(Unavailability::Unknown),
44        }
45    }
46}
47
48/// Result of [`SystemLanguageModel::availability`].
49#[derive(Debug, Clone, Copy, PartialEq, Eq)]
50#[non_exhaustive]
51pub enum Availability {
52    /// Model is loaded and ready to generate.
53    Available,
54    /// Model cannot be used; the inner value explains why.
55    Unavailable(Unavailability),
56}