AnyLanguageModel 发布:为 Apple 平台本地与远程 LLM 提供统一 API
Introducing AnyLanguageModel: One API for Local and Remote LLMs on Apple Platforms
AnyLanguageModel 是一个 Swift 包,作为 Apple Foundation Models 框架的 drop-in 替代,只需把 import FoundationModels 换成 import AnyLanguageModel 即可保持相同 API。
AnyLanguageModel 用 Apple Foundation Models 的统一 API 接入本地与云端模型,读者可据此评估跨后端切换的成本。
LLM 已成为构建软件不可或缺的工具。 但对于 Apple 开发者来说,集成它们仍然异常痛苦。
构建 AI 驱动应用的开发者通常采用混合方案, 组合使用以下几种方式:
- 使用 Core ML 或 MLX 的本地模型,以实现隐私保护和离线能力
- 像 OpenAI 或 Anthropic 这样的云服务提供商,以获取前沿能力
- Apple 的 Foundation Models 作为系统级回退方案
每一种都有不同的 API、不同的要求、不同的集成模式。 这太多了,而且很快就会累积成负担。 当我采访开发者关于构建 AI 驱动应用的情况时, 模型集成方面的摩擦立刻就被提及。 一位开发者直言不讳地说:
我本以为可以很快用 demo 测试一下,也许再快速粗糙地构建一下 结果却浪费了太多时间。 快把我逼疯了。
实验的成本很高, 这阻碍了开发者去发现 本地开源模型可能实际上非常适合他们的使用场景。
今天我们宣布推出 AnyLanguageModel, 这是一个 Swift 包,提供了 Apple Foundation Models 框架的即插即用替代方案, 并支持多个模型提供商。 我们的目标是减少在 Apple 平台上使用 LLM 的摩擦, 并让采用本地运行的开源模型变得更加容易。
解决方案
核心思想很简单:
替换你的 import 语句,保持相同的 API。
- import FoundationModels
+ import AnyLanguageModel
下面是实际使用中的样子。 从 Apple 的内置模型开始:
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 支持一系列提供商:
- Apple Foundation Models:与 Apple 系统模型的原生集成(macOS 26+ / iOS 26+)
- Core ML:利用神经网络引擎加速运行转换后的模型
- MLX:在 Apple Silicon 上高效运行量化模型
- llama.cpp:通过 llama.cpp 后端加载 GGUF 模型
- Ollama:通过 Ollama 的 HTTP API 连接本地提供的模型
- OpenAI、Anthropic、Google Gemini:用于对比和回退的云服务提供商
- HF Mirror Inference Providers:由世界级 推理提供商 驱动的数百个云端模型。
重点是可以从 HF Mirror Hub 下载的本地模型。 包含云服务提供商是为了降低入门门槛并提供迁移路径。 先让它能用,再让它变好。
为什么以 Foundation Models 作为基础 API
在设计 AnyLanguageModel 时,我们面临一个选择: 创建一个试图囊括一切的新抽象, 还是在现有 API 的基础上构建。 我们选择了后者, 使用 Apple 的 Foundation Models 框架 作为模板。
这看起来可能违反直觉。 为什么要让自己受限于 Apple 的选择? 有几个原因:
Foundation Models 确实设计得很好。 它利用 Swift 的宏等特性提供了符合人体工程学的开发者体验, 其围绕会话、工具和生成的抽象很好地映射了 LLM 的实际工作方式。
它刻意保持有限。 Foundation Models 代表了语言模型能力的大致最低共同标准。 与其将其视为弱点, 我们把它当作稳定的基础(嘿嘿)。 每一位面向 Apple 平台的 Swift 开发者都会遇到这个 API, 所以直接基于它构建意味着更少的概念负担。
它让我们保持脚踏实地。 每增加一层抽象,都会让你离真正要解决的问题更远。 抽象很强大, 但堆叠太多,它们本身就成了问题。
结果是,在不同提供方之间切换只需极少的代码改动, 而核心抽象依然保持干净且可预测。
包特性:只包含你需要的
多后端库的一个挑战是依赖臃肿。 如果你只想运行 MLX 模型, 就不该被迫引入 llama.cpp 以及它的所有依赖。
AnyLanguageModel 使用 Swift 6.1 包特性来解决这个问题。 你可以只选择需要的后端:
dependencies: [
.package(
url: "https://github.com/mattt/AnyLanguageModel.git",
from: "0.4.0",
traits: ["MLX"] // Pull in MLX dependencies only
)
]
可用的特性包括 CoreML、MLX 和 Llama(用于 llama.cpp / llama.swift)。
默认情况下,不包含任何笨重的依赖。
你得到的是基础 API 加上云提供方,
它们只需要标准的 URLSession 网络支持。
对于 Xcode 项目(目前尚不支持直接声明特性), 你可以创建一个小的内部 Swift 包,让它以所需的特性依赖 AnyLanguageModel, 然后将该包添加为本地依赖。 README 中有详细说明。
图像支持(以及 API 设计的取舍)
视觉语言模型能力惊人且被广泛使用。 它们可以描述图像、 从截图中提取文本、 分析图表、 并回答关于视觉内容的问题。 遗憾的是, Apple 的 Foundation Models 框架目前不支持随提示发送图像。
基于现有 API 构建,就意味着接受它的约束。 Apple 很可能会在未来版本中加入图像支持(也许是 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"))
)
我们在这里冒了一个经过权衡的风险; 我们设计的东西可能会与 Apple 最终实现产生冲突。 但这正是弃用警告存在的意义。 有时你必须为尚不存在的框架编写 API。
试一试:chat-ui-swift
想看看 AnyLanguageModel 的实际效果, 请查看 chat-ui-swift, 这是一个展示该库能力的 SwiftUI 聊天应用。
该应用包括:
- 通过 Foundation Models 集成 Apple Intelligence(macOS 26+)
- HF Mirror OAuth 认证,用于访问受限模型
- 流式响应
- 聊天持久化
它的定位是一个起点: 复刻它、扩展它、换入不同的模型。 看看各部分如何组合,并把它改造成适合你的需求。
下一步
AnyLanguageModel 目前处于 1.0 之前的阶段。 核心 API 已稳定, 但我们正在积极将 Foundation Models 的完整功能集带给所有适配器,即:
- 在所有提供方之间支持 工具调用
- 用于工具和引导的 MCP 集成
- 用于结构化输出的 受引导生成
- 本地推理的性能优化
这个库是迈向更大目标的第一步。 统一的推理 API 提供了在 Apple 平台上构建无缝智能体工作流所需的基础设施—— 在这样的应用中,模型可以使用工具、访问系统资源并完成复杂任务。 很快会有更多内容。🤫
参与其中
我们很希望你能帮忙把它做得更好:
- 试一试 —— 构建点东西,试试看
- 分享你的经验——什么方法有效?什么令人沮丧?我们想听听你在将 AI 集成到应用中时面临的挑战
- 未解决问题——功能请求、bug 报告、问题
- 贡献——欢迎提交 PR
链接
我们很期待看到你构建的作品 🦾
来源:Hugging Face Blog · hf-mirror.com
