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}