8.0 KiB
API Reference
SystemLanguageModel
The SystemLanguageModel class provides access to Apple's on-device language models optimized for efficiency and privacy.
Overview
SystemLanguageModel is the main entry point for interacting with Apple's Foundation Models. It provides:
- On-device inference with no data leaving the device
- Optimized for Apple Silicon (A17 Pro and M-series chips)
- Session-based conversation management
- Built-in safety guardrails
Initialization
import Foundation
import SystemLanguageModel
// Get the default system model
let model = try await SystemLanguageModel()
// Check if model is available
if SystemLanguageModel.isAvailable {
let model = try await SystemLanguageModel()
} else {
print("Model not available on this device")
}
Properties
isAvailable
static var isAvailable: Bool { get }
Returns true if the system language model is available on the current device. Available on devices with A17 Pro or M-series chips running iOS 18.1+, macOS 15.1+, or iPadOS 18.1+.
sessionTokenLimit
var sessionTokenLimit: Int { get }
The maximum number of tokens allowed in a session, including both input and output tokens.
Creating Sessions
session(with:)
func session(with guardrails: Guardrails = .automatic) async throws -> LanguageModelSession
Creates a new conversation session with optional safety guardrails.
Parameters:
guardrails: The level of content filtering to apply (default:.automatic)
Returns: A LanguageModelSession instance for managing the conversation
Example:
// Create session with automatic guardrails
let session = try await model.session()
// Create session with custom guardrails
let session = try await model.session(with: .automatic)
Guardrails
enum Guardrails {
case automatic
case disabled
}
Controls content filtering and safety features:
.automatic: Applies Apple's default content filtering.disabled: Disables content filtering (use with caution)
LanguageModelSession
Manages a conversation with the language model, maintaining context across multiple turns.
Overview
A session maintains conversation history and manages the interaction with the model. Sessions are tied to the model's token limit and automatically handle context management.
Creating Prompts
// Create a simple prompt
let prompt = Prompt(text: "What is Swift?")
// Create a prompt with system instructions
let prompt = Prompt {
Instructions("You are a helpful coding assistant")
"Explain closures in Swift"
}
Generating Responses
respond(to:)
func respond(to prompt: Prompt) async throws -> String
Generates a complete response to a prompt.
Parameters:
prompt: The input prompt
Returns: The complete generated response as a String
Throws: Errors if generation fails or content is filtered
Example:
let session = try await model.session()
let prompt = Prompt(text: "Explain Swift's type system")
let response = try await session.respond(to: prompt)
print(response)
streamResponse(to:)
func streamResponse(to: Prompt) -> AsyncThrowingStream<String, Error>
Streams the response token-by-token as it's generated.
Parameters:
prompt: The input prompt
Returns: An async stream of String tokens
Example:
let session = try await model.session()
let prompt = Prompt(text: "Write a short story")
for try await token in session.streamResponse(to: prompt) {
print(token, terminator: "")
}
print() // New line after complete response
Guided Generation
respond(to:using:)
func respond<T: Generable>(to prompt: Prompt, using schema: T.Type) async throws -> T
Generates structured output conforming to a Swift type.
Type Parameters:
T: A type conforming toGenerable
Parameters:
prompt: The input promptschema: The type to generate
Returns: An instance of type T
Example:
struct Recipe: Generable {
var title: String
var ingredients: [String]
var steps: [String]
}
let session = try await model.session()
let prompt = Prompt(text: "Give me a simple pasta recipe")
let recipe = try await session.respond(to: prompt, using: Recipe.self)
print(recipe.title)
Tool Calling
respond(to:withTools:)
func respond(to prompt: Prompt, withTools tools: [Tool]) async throws -> String
Generates a response with access to custom tools.
Parameters:
prompt: The input prompttools: Array of tools the model can use
Returns: The generated response as a String
Example:
struct WeatherTool: Tool {
static let description = "Gets current weather for a location"
struct Arguments: Decodable {
let location: String
}
func call(arguments: Arguments) async throws -> String {
// Fetch weather data
return "Sunny, 72°F"
}
}
let session = try await model.session()
let prompt = Prompt(text: "What's the weather in San Francisco?")
let response = try await session.respond(to: prompt, withTools: [WeatherTool()])
Session Management
Sessions automatically manage conversation history within the token limit. When the limit is approached, older messages are removed to make room for new ones.
// Sessions maintain context across multiple interactions
let session = try await model.session()
let response1 = try await session.respond(to: Prompt(text: "My name is Alice"))
let response2 = try await session.respond(to: Prompt(text: "What's my name?"))
// response2 will reference "Alice" from the conversation history
GenerationOptions
Control how the model generates responses with temperature, sampling mode, and token limits.
Overview
Options that control how the model generates its response to a prompt.
struct GenerationOptions {
var sampling: SamplingMode
var temperature: Double
var maximumResponseTokens: Int?
}
Creating Options
let options = GenerationOptions(
sampling: .greedy,
temperature: 0.7,
maximumResponseTokens: 500
)
let response = try await session.respond(
options: options,
prompt: Prompt("Write a short story")
)
Properties
sampling - Sampling strategy for token selection
.greedy- Always pick most likely token (deterministic).topK(k: Int)- Sample from top K most likely tokens.topP(p: Double)- Nucleus sampling (cumulative probability)
temperature - Influences confidence (0.0 to 1.0)
0.0- Very deterministic, conservative0.5- Balanced (default)1.0- More creative, random
maximumResponseTokens - Limit response length
nil- Use model default100-2000- Typical range
Usage Examples
// Deterministic, factual responses
let factualOptions = GenerationOptions(
sampling: .greedy,
temperature: 0.0,
maximumResponseTokens: 200
)
// Creative writing
let creativeOptions = GenerationOptions(
sampling: .topP(p: 0.9),
temperature: 0.8,
maximumResponseTokens: 1000
)
// Balanced
let balancedOptions = GenerationOptions(
sampling: .topK(k: 50),
temperature: 0.5,
maximumResponseTokens: 500
)
Error Handling
do {
let session = try await model.session()
let response = try await session.respond(to: prompt)
} catch LanguageModelSession.GenerationError.guardrailViolation {
// Content was filtered by safety guardrails
print("Response blocked by guardrails")
} catch let error as SystemLanguageModelError {
switch error {
case .modelUnavailable:
print("Model not available on this device")
case .tokenLimitExceeded:
print("Prompt exceeds token limit")
default:
print("Error: \(error)")
}
}
Common Errors:
GenerationError.guardrailViolation- Content filtered for safetyGenerationError.tokenLimitExceeded- Too many tokensGenerationError.modelUnavailable- Model not readyToolCallError- Tool execution failed