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