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;