I'm seeing a reproducible difference in Foundation Models behavior between an iPhone 16 and iPhone 17 Pro Max, both running iOS 27.0 beta 6.
My pipeline is roughly:
Input → model generation → tool call → validation/correction → structured output
Each test starts with a fresh model session.
I run the same 50-case dataset on both devices with the same app build, prompt, tool, data, and execution order.
The main difference is not just speed: the iPhone 16 consistently makes many more tool calls, which causes the session context to grow until some runs exceed the available context window.
Both devices report a context size of roughly 4,096 tokens.
| Completed | 30/50 | 49/50 |
| Total tool calls | 222 | 67 |
| Mean calls/run | 4.44 | 1.34 |
| Max calls/run | 22 | 2 |
| Verified outputs | 75.1% | 91.0% |
The pattern is very consistent across repeated runs. On the 17 Pro Max, most requests converge after 1–2 tool calls. On the iPhone 16, some requests enter longer tool/correction loops and eventually fail because the context grows too large.
I can probably mitigate this by limiting tool calls or changing the prompt, but I'd like to understand the underlying behavior.
Is this difference expected across supported devices even on the same OS version?
In particular:
- Can different on-device model variants be used depending on hardware?
- Is there a way to determine which model/profile a
SystemLanguageModelsession is using? - Should tool-selection behavior be expected to remain reasonably consistent across devices?
- Would this be worth filing as a Foundation Models regression during the beta?
Your findings are absolutely correct, SystemLanguageModel.variant should tell you which model is running.
-
iPhone Air, iPhone 17 Pro, iPhone 17 Pro Max -> run AFM 3 Core Advanced 20B model in iOS 27.0
-
iPhone 15 Pro, iPhone 15 Pro Max, iPhone 16 or later -> run AFM 3 Core 3B model in iOS 27.0
-
All Apple Intelligence-compatible devices before 27.0 betas -> run a prior version of the 3B model
In my experience, AFM 3 Core and AFM 3 Core Advanced have pretty different "personalities" in how they handle the same task, including their tool calling behavior. For the best results, I recommend specializing your task for the model variant. Start with the lightest "easiest" specialization first, see if it helps, and then diverge your pipeline more as-needed:
- Try splitting a Prompt into a different versions for the each variant, so you can tune to the wording that works best for that model.
- Next, specialize Instructions if you need to escalate.
- Next escalation > chunk your pipeline differently for each model variant to figure out the sequence and size of pipeline "steps" each model can handle best.