🚀 New: chi (χ) — an open-source autoresearch harness for fleets of LLM coding agents. Read the announcement.

iOS 27 Shipped a New Siri. The Bigger Change Is One Swift Protocol.

iOS 27 shipped Siri AI on September 14, built on a Gemini collaboration and routed through on-device and Private Cloud Compute models. The change developers should actually care about is quieter: the Foundation Models framework's LanguageModel protocol now makes the model behind LanguageModelSession swappable, with Claude and Gemini as real conforming providers. Includes a runnable comparison of the three call sites.

Contents

Apple shipped iOS 27 on September 14, and with it the public debut of Siri AI, a rebuilt assistant trained in collaboration with Google’s Gemini team and running across on-device Apple Foundation Models and Apple’s Private Cloud Compute.[1][2] That is the headline. It is not, for developers, the interesting part.

The interesting part shipped in the same release and got a fraction of the coverage: the Foundation Models framework’s LanguageModelSession API, the same one powering Siri AI’s app integrations, now runs on a LanguageModel protocol that third parties can conform to. Apple’s on-device model is no longer the only thing you can drop into that session. Google and Anthropic have both shipped conforming packages, so LanguageModelSession becomes a genuine abstraction layer over which model actually answers the prompt.[3]

What actually shipped

Two things, tied together but worth separating:

Siri AI itself understands on-screen context, drafts and edits inside third-party apps through App Intents 2.0, and asks multi-turn follow-up questions instead of resetting after every command. App Intents 2.0 adds a View Annotations API, so a command like “reply to that message” can resolve “that” against whatever is on screen, not just what’s in the request text.[1][4] None of this required a new model API from Apple’s side; it is built entirely on tools any iOS developer already has access to.

The protocol underneath is the part that outlives this specific Siri release. LanguageModel describes what a model can do; LanguageModelExecutor is where generation happens. Apple’s on-device model, Apple’s server-side Private Cloud Compute model, and now Claude via Anthropic’s ClaudeForFoundationModels package all conform to it.[3] Swap the model: argument passed into LanguageModelSession, and respond(to:), streaming, structured output through @Generable, and tool calling all keep working unchanged.

Try it: same call, three providers

The three snippets differ by one argument. That is the whole pitch: pick the on-device model for a quick, private, offline-capable task; fall back to Apple’s hosted model when you need a bigger context window; escalate to Claude when the task needs frontier reasoning, web search, or code execution as a server-side tool call the framework can invoke mid-session.[3]

Why this matters more than the assistant

Every iOS app that added an AI feature in the last two years hit the same fork: ship Apple’s on-device model and accept its limits, or hand-roll a networking layer to a cloud API and lose the framework’s session handling, structured output, and tool-calling conveniences. The LanguageModel protocol collapses that fork into a runtime decision. You can catch LanguageModelError.rateLimited on a Claude call and fall back to SystemLanguageModel for that turn, or route by task complexity from the start, all inside one session type.[3]

Siri AI is the flashy demo. The protocol is the reusable part, and it is available to any app on iOS 27 today, not just Apple’s own assistant.

What I’d actually build with this

The pattern I keep coming back to is a two-tier session: start every request on SystemLanguageModel for latency and privacy, and escalate to a cloud provider only when the on-device model’s structured output fails validation or the task needs a tool the on-device model doesn’t support. Because all three providers share respond(to:), streamResponse(to:), and the same @Generable machinery for structured output, that escalation is a conditional around one line, not a second code path with its own request shapes and error types to maintain.

The near-term risk is the opposite of lock-in: if every provider conforms to the same protocol, the framework’s error handling and tool-calling semantics become the real API surface, and any gaps between what LanguageModel can express and what a given provider actually supports (Apple’s own docs already note prompt caching controls, stop sequences, and batch processing don’t have a representation in the protocol) become the sharp edges app developers hit first. Worth testing before you build a fallback chain around it, not after.

Sources

[1] https://www.macrumors.com/2026/09/13/ios-27-release-date-new-features/: iOS 27 release date and Siri AI overview [2] https://www.macrumors.com/2026/01/30/apple-explains-how-gemini-powered-siri-will-work/: Apple on the Gemini collaboration for personalized Siri [3] https://platform.claude.com/docs/en/cli-sdks-libraries/libraries/apple-foundation-models: Claude for Foundation Models, the LanguageModel protocol and LanguageModelSession API [4] https://ecorpit.com/ios-27-app-intents-siri-ai-developer-guide-2026/: App Intents 2.0 and the View Annotations API