AnyLanguageModel:苹果平台统一 LLM API

大语言模型(LLM)已成为软件开发的重要工具,但对苹果开发者来说,集成它们依然麻烦。开发者通常采用混合方案:用 Core ML 或 MLX 跑本地模型保证隐私和离线能力;用 OpenAI 或 Anthropic 等云端服务获取前沿能力;或者把苹果的 Foundation Models 当作系统级备选。
每种方案都有不同的 API、不同的要求、不同的集成模式。一位开发者直言:“我本想快速用个 demo 测试一下,结果浪费了大量时间,简直要疯了。”
实验成本太高,导致开发者很难发现本地开源模型其实很适合他们的用例。
今天我们发布 AnyLanguageModel,这是一个 Swift 包,它提供了苹果 Foundation Models 框架的替代方案,支持多个模型提供商。目标是降低在苹果平台上使用 LLM 的摩擦,让开发者更容易采用本地运行的开源模型。
解决方案
核心思路很简单:换掉 import 语句,保持 API 不变。
- import FoundationModels
+ import AnyLanguageModel
实际操作起来是这样。先用苹果内置模型:
let model = SystemLanguageModel.default
let session = LanguageModelSession(model: model)
let response = try await session.respond(to: "Explain quantum computing in one sentence")
print(response.content)
现在试试通过 MLX 本地运行的开源模型:
let model = MLXLanguageModel(modelId: "mlx-community/Qwen3-4B-4bit")
let session = LanguageModelSession(model: model)
let response = try await session.respond(to: "Explain quantum computing in one sentence")
print(response.content)
AnyLanguageModel 支持一系列提供商:
- 苹果 Foundation Models:与苹果系统模型原生集成(macOS 26+ / iOS 26+)
- Core ML:运行转换后的模型,利用 Neural Engine 加速
- MLX:在 Apple Silicon 上高效运行量化模型
- llama.cpp:通过 llama.cpp 后端加载 GGUF 模型
- Ollama:通过 Ollama 的 HTTP API 连接本地服务模型
- OpenAI、Anthropic、Google Gemini:云端提供商,用于对比和备选
- Hugging Face 推理提供商:数百个云端模型,由世界级的 推理提供商 驱动
重点放在可以从 Hugging Face Hub 下载的本地模型上。包含云端提供商是为了降低入门门槛,并提供迁移路径。先让它跑起来,再让它跑得好。
为什么以 Foundation Models 为基础 API
设计 AnyLanguageModel 时,我们面临选择:创建一个试图涵盖一切的新抽象,还是基于现有 API 构建。我们选择了后者,以 苹果的 Foundation Models 框架 为模板。
这看起来可能有点反直觉。为什么要受限于苹果的设计?有几个原因:
- Foundation Models 确实设计得很好。它利用 Swift 特性(如宏)提供了顺手的开发者体验,其围绕会话(Sessions)、工具(Tools)和生成(Generation)的抽象很好地映射了 LLM 的实际工作方式。
- 它有意做了限制。Foundation Models 有点像语言模型能力的“最小公分母”。我们不把这看作弱点,而是将其视为稳定的基础。每个针对苹果平台的 Swift 开发者都会遇到这个 API,直接基于它构建意味着更少的概念负担。
- 它让我们保持脚踏实地。每多一层抽象,就离你真正要解决的问题远一步。抽象很强大,但堆叠太多,它们本身就成了问题。
结果是,切换提供商只需要极少的代码改动,核心抽象保持清晰可预测。
包特性:按需引入
多后端库的一个挑战是依赖膨胀。如果你只想跑 MLX 模型,不应该被迫拉入 llama.cpp 及其所有依赖。
AnyLanguageModel 使用 Swift 6.1 的包特性(Package Traits)来解决这个问题。你只需选择需要的后端:
dependencies: [
.package(
url: "https://github.com/mattt/AnyLanguageModel.git",
from: "0.4.0",
traits: ["MLX"] // 只引入 MLX 相关依赖
)
]
可用的特性包括 CoreML、MLX 和 Llama(用于 llama.cpp / llama.swift)。默认情况下,不包含任何重量级依赖。你会得到基础 API 和云端提供商,后者只需要标准的 URLSession 网络功能。
对于 Xcode 项目(目前还不直接支持特性声明),你可以创建一个依赖 AnyLanguageModel 并指定所需特性的小型内部 Swift 包,然后将其作为本地依赖添加。README 里有详细说明。
图像支持(及 API 设计权衡)
视觉语言模型(Vision-Language Models) 能力极强且应用广泛。它们可以描述图像、从截图中提取文字、分析图表、回答关于视觉内容的问题。不幸的是,苹果的 Foundation Models 框架目前不支持在提示词中发送图像。
基于现有 API 构建意味着接受它的限制。苹果可能会在未来版本(也许是 iOS 27?)中添加图像支持,但视觉语言模型太有用了,等不了。所以我们扩展了 Foundation Models 目前不提供的功能。
这是一个向 Claude 发送图像的示例:
let model = AnthropicLanguageModel(
apiKey: ProcessInfo.processInfo.environment["ANTHROPIC_API_KEY"]!,
model: "claude-sonnet-4-5-20250929"
)
let session = LanguageModelSession(model: model)
let response = try await session.respond(
to: "What's in this image?",
image: .init(url: URL(fileURLWithPath: "/path/to/image.png"))
)
我们在这里冒了一个计算过的风险;我们设计的东西可能与苹果最终实现冲突。但这就是弃用警告存在的意义。有时候,你必须为尚不存在的框架编写 API。
试试看:chat-ui-swift
想看看 AnyLanguageModel 的实际效果,可以试试 chat-ui-swift,这是一个 SwiftUI 聊天应用,展示了该库的功能。
这个应用包括:
- 通过 Foundation Models 的苹果智能(Apple Intelligence)集成(macOS 26+)
- Hugging Face OAuth 认证,用于访问受限制模型
- 流式输出(Streaming)响应
- 聊天记录持久化
它旨在作为一个起点:fork 它、扩展它、换用不同的模型。看看各个部分如何组合,并根据你的需求进行调整。
下一步计划
AnyLanguageModel 目前处于 1.0 之前版本。核心 API 是稳定的,但我们正在积极工作,将 Foundation Models 的完整功能集带到所有适配器中,主要是:
- 所有提供商的工具调用(Tool Calling)
- MCP 集成,用于工具和引导(Elicitations)
- 用于结构化输出的引导生成(Guided Generation)
- 本地推理的性能优化
这个库是迈向更大目标的第一步。统一的推理 API 为在苹果平台上构建无缝的智能体工作流(Agentic Workflows)提供了脚手架——这些应用中的模型可以使用工具、访问系统资源并完成复杂任务。更多内容即将揭晓。🤫
参与进来
我们很乐意得到你的帮助,让它变得更好:
- 试试看——构建点东西,测试一下
- 分享你的经验——什么好用?什么让人头疼?我们想听听你在应用中集成 AI 时遇到的挑战
- 提交问题——功能请求、错误报告、疑问
- 贡献代码——欢迎提交 PR
链接
期待看到你构建的作品 🦾
觉得有用?分享给更多人
