Skip to main content

fm_bindings/
lib.rs

1//! # Foundation Models Bindings for Rust
2//!
3//! Rust bindings for Apple's [Foundation Models framework](https://developer.apple.com/documentation/foundationmodels),
4//! providing access to on-device large language models (LLMs) that power Apple Intelligence.
5//!
6//! ## Requirements
7//!
8//! - macOS 26+ or iOS 26+
9//! - Apple Intelligence enabled in System Settings
10//!
11//! ## Features
12//!
13//! - **Blocking Response**: Get complete responses with `response()`
14//! - **Streaming Response**: Get real-time incremental updates with `stream_response()`
15//! - **Instructions**: Configure model behavior with system prompts
16//! - **Transcript Persistence**: Save and restore session state across app launches
17//! - Type-safe error handling with `Result<T, Error>`
18//!
19//! ## Examples
20//!
21//! ### Basic Usage
22//!
23//! ```no_run
24//! use fm_bindings::LanguageModelSession;
25//!
26//! fn main() -> Result<(), Box<dyn std::error::Error>> {
27//!     let session = LanguageModelSession::new()?;
28//!     let response = session.response("What is Rust?")?;
29//!     println!("{}", response);
30//!     Ok(())
31//! }
32//! ```
33//!
34//! ### With Instructions
35//!
36//! ```no_run
37//! use fm_bindings::LanguageModelSession;
38//!
39//! fn main() -> Result<(), Box<dyn std::error::Error>> {
40//!     let session = LanguageModelSession::with_instructions(
41//!         "You are a friendly assistant. Keep responses brief and helpful."
42//!     )?;
43//!     let response = session.response("Hello!")?;
44//!     println!("{}", response);
45//!     Ok(())
46//! }
47//! ```
48//!
49//! ### Streaming Response
50//!
51//! ```no_run
52//! use fm_bindings::LanguageModelSession;
53//! use std::io::{self, Write};
54//!
55//! fn main() -> Result<(), Box<dyn std::error::Error>> {
56//!     let session = LanguageModelSession::new()?;
57//!
58//!     session.stream_response("Tell me a story", |chunk| {
59//!         print!("{}", chunk);
60//!         let _ = io::stdout().flush();
61//!     })?;
62//!
63//!     println!(); // newline after stream
64//!     Ok(())
65//! }
66//! ```
67//!
68//! ### Persisting Sessions
69//!
70//! ```no_run
71//! use fm_bindings::LanguageModelSession;
72//!
73//! fn main() -> Result<(), Box<dyn std::error::Error>> {
74//!     // Create and use a session
75//!     let session = LanguageModelSession::with_instructions("You are a travel guide.")?;
76//!     let _ = session.response("Tell me about Paris")?;
77//!     let _ = session.response("What about the food?")?;
78//!
79//!     // Save the transcript
80//!     let transcript = session.transcript_json()?;
81//!     std::fs::write("session.json", &transcript)?;
82//!
83//!     // Later: restore the session
84//!     let saved = std::fs::read_to_string("session.json")?;
85//!     let restored = LanguageModelSession::from_transcript_json(&saved)?;
86//!
87//!     // Continue with full context
88//!     let response = restored.response("Any restaurant recommendations?")?;
89//!     println!("{}", response);
90//!     Ok(())
91//! }
92//! ```
93//!
94//! ### Error Handling
95//!
96//! ```no_run
97//! use fm_bindings::{LanguageModelSession, Error};
98//!
99//! fn main() -> Result<(), Box<dyn std::error::Error>> {
100//!     let session = match LanguageModelSession::new() {
101//!         Ok(s) => s,
102//!         Err(Error::ModelNotAvailable) => {
103//!             eprintln!("Apple Intelligence not enabled");
104//!             return Ok(());
105//!         }
106//!         Err(e) => return Err(e.into()),
107//!     };
108//!
109//!     let response = session.response("Hello")?;
110//!     println!("{}", response);
111//!     Ok(())
112//! }
113//! ```
114
115// Internal modules
116mod error;
117mod ffi;
118mod session;
119
120// Public API exports
121pub use error::{Error, Result};
122pub use session::LanguageModelSession;