LangChain chat model provider for Apple's on-device Foundation Models framework
Project description
langchain-apple-foundation-models
Use Apple's on-device Foundation Models as a drop-in LangChain chat model. Runs fully offline on macOS 26+ Apple Silicon -- no API key, no network call, no per-token cost.
from langchain_apple_foundation_models import ChatAppleFoundationModels
llm = ChatAppleFoundationModels()
llm.invoke("What is the capital of France?")
Install
pip install langchain-apple-foundation-models
Requires macOS 26+ with Apple Intelligence enabled and Apple Silicon.
Why
Apple shipped a Python SDK for its on-device model this year (apple-foundation-models), but there was no LangChain provider for it -- meaning none of LangChain's chains, agents, or tool-calling abstractions could target Apple's on-device model. This closes that gap.
Features
- Tool calling: pass LangChain
@tool-decorated functions via.bind_tools([...]), same as any other LangChain chat model. - Structured output:
.with_structured_output(schema)for JSON-schema or Pydantic-constrained generation. - Streaming:
.stream(...)yields tokens as they're generated. - Zero network calls -- generation happens entirely on-device via Apple's Neural Engine.
Architecture
flowchart LR
App["Your LangChain code<br/>chains / agents / tools"] -->|".invoke() .stream() .bind_tools()"| Provider["ChatAppleFoundationModels"]
Provider --> SDK["apple-foundation-models<br/>(Python SDK)"]
SDK --> FM["Foundation Models framework<br/>on-device, Apple Silicon, Neural Engine"]
FM -.->|"no network call, ever"| SDK
ChatAppleFoundationModels implements LangChain's standard chat model interface, so it drops into any existing chain, agent, or tool-calling setup as a swap-in for a cloud provider -- the only difference is generation happens on-device.
Example: tool calling
from langchain_core.tools import tool
from langchain_apple_foundation_models import ChatAppleFoundationModels
@tool
def get_weather(city: str) -> str:
"""Get the current weather for a city."""
return f"The weather in {city} is sunny and 72F."
llm = ChatAppleFoundationModels().bind_tools([get_weather])
llm.invoke("What's the weather in Austin?")
Known limitations
- Multi-turn history is owned by the underlying
Session, not LangChain's message list. EachChatAppleFoundationModelsinstance lazily creates one on-deviceSessionand reuses it across calls; if you pass a message list that diverges from what the session itself has tracked, the two can get out of sync. Fresh chains work naturally; manually-edited history does not yet. - Built on the
apple-foundation-modelsunofficial Python bindings (alpha), which itself wraps Apple's Foundation Models framework -- both inherit Apple's current 4,096-token context window. - No support (yet) for Apple's newer multi-model / Private Cloud Compute routing announced at WWDC26 -- that requires an OS/SDK combination not yet stable enough to depend on. See the repo issues for status.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file langchain_apple_foundation_models-0.2.0.tar.gz.
File metadata
- Download URL: langchain_apple_foundation_models-0.2.0.tar.gz
- Upload date:
- Size: 79.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f081c5222eda47653f85883ccdbad8fc768ba74278d9fca076f7e700f692b151
|
|
| MD5 |
2ebd624360ea8c513c0c20a4540959ec
|
|
| BLAKE2b-256 |
e2231a96b89156bcc5eec08e73047e0497a443fbdc02f0582fd12a94ea4f561e
|
File details
Details for the file langchain_apple_foundation_models-0.2.0-py3-none-any.whl.
File metadata
- Download URL: langchain_apple_foundation_models-0.2.0-py3-none-any.whl
- Upload date:
- Size: 7.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a5a3283aa32863684164917af76a1a584f73dc36d68d43508927fd57c69d84c5
|
|
| MD5 |
d4530df39ada3367d0545b03f3e5e753
|
|
| BLAKE2b-256 |
d28396117b7725eb7e2b01db074ec46f21d27a07cf0084723c75fc0d35173104
|