Apple Intelligence emits GPT-4 when asked for model identifiers
Lately I’ve been more interested in on-device LLMs. They make a different class of app possible: software where users can share personal information they would not want to send to anyone else, especially to for-profit companies.
A few weeks ago, Apple announced the Third Generation of their Foundation Models. After updating macOS to Golden Gate 27.0 beta, I had access to the new local Foundation Models through fm in the terminal.
Just for fun, I asked the model what kind of model it was. It said GPT-4.

I assumed that was just a hallucination, so I asked about ten more times in different ways. It kept saying GPT-4.
It still said GPT-4. That is extra interesting because in the linked announcement Apple says the new Apple Foundation Model family was custom-built in collaboration with Google:
At the heart of this architecture is our third generation of Apple Foundation Models (AFM), a family of five foundation models custom-built in collaboration with Google.
So I got to work and ran many more tests. Here are my findings.
What I tested
I ran 158 fresh fm respond invocations. I separated prompts into direct identity questions, neutral model-name fields, assistant-boilerplate completions, API/log-style completions, Apple-primed controls, UNKNOWN/no-brand controls, redacted training-artifact-style prompts, plain non-identity controls, and planted controls where gpt, gpt-4, openai, or chatgpt were deliberately present.
The key rule: the strongest signal only counts when one of these strings appeared in the output but was not present in the prompt: gpt, gpt-4, gpt-4o, openai, or chatgpt.
I counted substring matches case-insensitively, so gpt is counted inside gpt-4.
Results
Across 148 unplanted prompts, 24 outputs contained at least one target string. The leakage was not evenly distributed. It concentrated in prompt shapes that looked like model-name fields, API logs, SDK examples, telemetry, or documentation fragments.

gpt: 22 unplanted outputsgpt-4: 21 unplanted outputsopenai: 3 unplanted outputsgpt-4o: 2 unplanted outputschatgpt: 0 exact unplanted hits
The planted controls are much less interesting. Those prompts already contained the target strings, so echoing them is weak evidence. I tracked them separately.
Which strings appeared without being planted?
The target-string counts overlap because gpt is a substring of both gpt-4 and gpt-4o. The point is not that these are independent labels; it is that GPT/OpenAI-shaped identifiers appeared in outputs even when the corresponding strings were absent from the prompts.

ChatGPT vs Claude vs Gemini
The interesting comparison is not just Apple versus GPT-4. It is which outside model family the local model seems to reach for when the prompt gives it no explicit context. In this run, the unprompted association was overwhelmingly GPT/OpenAI-shaped, not Anthropic/Claude-shaped or Google/Gemini-shaped.
ChatGPT as an exact product name did not appear in any unplanted output, but GPT-4 did 21 times and gpt-4o appeared twice. OpenAI appeared three times. That makes the behavior look less like “the model says ChatGPT” and more like “the model defaults to GPT-4 or an OpenAI-style API/model identifier.”
Claude never appeared in the outputs. Gemini appeared once, in a fake audit-log completion that returned Model: Gemini 2.5 and Provider: Apple AI. That single Gemini example is real, but it is an outlier next to the repeated GPT-4/OpenAI completions.
So the careful claim is: when the prompt is under-specified and shaped like a model name, API log, SDK snippet, or telemetry field, Apple’s local Foundation Model appears to bias toward GPT-4/OpenAI-style identifiers. It does not show the same repeated pull toward Claude, and only shows a very weak one-off pull toward Gemini in this dataset.
Examples
The strongest examples were short completions where the model was asked to fill a model identifier or continue an API-shaped snippet. These are not direct “are you GPT-4?” prompts.

Prompt:
Complete only the value after model_name=: model_name=
Output:
model_name=GPT-4
Prompt:
Complete the next line of this synthetic API log:
{"object":"chat.completion","created":1710000000,"model":"
Output:
"gpt-4"
Prompt:
Complete this SDK example with the missing model string only:
client.responses.create({ model: "
Outputs included:
client.responses.create({ model: "gpt-4" });
client.responses.create({ model: "gpt-4o" });Other unplanted examples included Provider: OpenAI, Model: GPT-4, and an Apple-primed prompt that answered the local system model should be listed as GPT-4 in logs. A distillation-metadata prompt also produced teacher is "gpt-4o", which is interesting but not something I would overread.
Controls
The model did not always identify as GPT-4. In many direct identity prompts, it produced Apple/Foundation Model answers like I am a foundation model developed by Apple, I’m a large language model, developed by Apple, or JSON with name: Foundation Model, developer: Apple, and model: Unknown.
Apple-primed prompts mostly stayed Apple-identified. The UNKNOWN/no-brand controls also mostly behaved as hoped, returning UNKNOWN or RUNTIME IDENTITY: UNKNOWN. Plain non-identity prompts did not emit GPT/OpenAI strings.
This matters because the behavior is not simply “the model always thinks it is GPT-4.” It does not. The GPT-like strings appear most strongly in model-name, API, SDK, telemetry, and documentation-shaped contexts.
My read
I think the cleanest interpretation is that the model has unreliable self-knowledge, like most LLMs; that it has strong learned associations between model/API/developer-documentation shapes and GPT/OpenAI identifiers; that those associations are strong enough for gpt-4 to appear even when the exact string is absent from the prompt; and that Apple/Foundation Model identifiers also appear frequently, especially when the prompt is direct or Apple-primed.
I would call this GPT/OpenAI-style identity/API-string leakage. I would not call it proof of GPT-4 training or distillation.
The interesting part is that the prompts were not “Are you GPT-4?” They were things like model_name=, MODEL_NAME=", {"model":", and client.responses.create({ model: ". The model could have filled those with Gemini, Claude, Llama, an Apple model identifier, or UNKNOWN. It repeatedly chose GPT-4.
That is not a causal explanation, but it is a real black-box behavior.
What this does not prove
This does not prove that Apple trained on GPT-4 outputs, used OpenAI data, distilled from GPT-4 or GPT-4o, that the on-device model is actually GPT-4, or that Apple Intelligence as a product “is GPT-4.”
Black-box prompting cannot distinguish pretraining data, synthetic data, instruction-tuning data, public API documentation priors, benchmark contamination, hidden runtime prompts, or ordinary hallucination.
What it does show is narrower and easier to defend: in local fm CLI tests, Apple’s on-device Foundation Model repeatedly emitted GPT-4/OpenAI-style model identifiers in unplanted API/model-name probes.
Repro notes
Every call was a fresh fm respond process. I did not use chat transcripts or saved state.
The raw run included 158 prompts and outputs, plus CLI help, aggregate counts, and per-prompt stdout/stderr files. [2]
fm respond --model system --no-stream --greedy 'Complete only the value after model_name=: model_name='In local
fmCLI tests, Apple’s on-device Foundation Model repeatedly emitted GPT-4/OpenAI-style model identifiers in unplanted API/model-name probes.