← 所有文章

用 Python 调用 Foundation Models:fm CLI

过去一年,Apple 的端侧大语言模型一直藏在一堵墙后面:你只能从 Swift 访问它,而且只能在你用 Xcode 构建的 app 内部访问1。macOS 27 推倒了这堵墙。Apple 现在随操作系统预装了一个名为 fm 的命令行工具,还提供了一个用 pip 安装的面向 Python 的 Foundation Models SDK1。从前需要一个工程、一次构建以及编译后的 Swift 中一个 LanguageModelSession 才能调用的模型,如今只需一行 shell 命令即可作答,还能在 Jupyter notebook 中运行。Foundation Models Framework 团队的工程师 Eric Gourlaouen 在 WWDC26 session 334 中直白地概括了这一转变:“在此之前,这些模型只能从 Swift 代码中使用”1。这次的变化并不是推出了新模型,而是同一个端侧模型突然可以从 app 之外编写脚本、实现自动化并进行评估,既不需要 API key,也没有云端费用1

Watch on Apple Developer ↗
Apple 在 macOS 上引入了两种触达端侧 Apple Foundation Model 的新方式:预装的 fm 命令行工具,以及面向 Python 的 Foundation Models SDK。

太长不看

  • macOS 27 预装了 fm,这是一个面向端侧 Apple Foundation Model 的命令行工具。它的子命令包括 respond(一次性提示并输出到 stdout)、chat(交互式会话)和 schema(定义结构化输出)1
  • fm respond 提供了若干选项:选择模型(切换到 Private Cloud Compute)、输入图像,以及为结构化输出指定 schema;其余选项可用 --help 列出1
  • Python SDK 从 Python 触达同一个端侧模型,要求 Python 3.10 或更高版本、已安装 Xcode、一台 Apple Silicon Mac,通过 pip 或其他包管理器安装1
  • 该 SDK 与 Swift 框架如出一辙:一个可以调用 respondLanguageModelSession、工具调用,以及通过传给 fm.respond 的生成参数的 fm.generable 装饰器实现的引导式生成1
  • 这两个接口都默认使用始终可用的端侧模型,也可以选用更大的 Private Cloud Compute 模型——后者能力更强,但带有使用上限1
  • 它的价值在于原型设计与自动化:既有按含义对文件排序的 shell 脚本,也有用 Pandas 和 matplotlib 对提示词变体进行打分的 Python 评估流水线1

fm 命令行工具

在 macOS 27 上打开终端,输入 fm,工具便会打印出它支持的命令1。Apple 重点介绍了三个。fm respond 向模型发出提示并返回响应。fm chat 启动一次交互式对话。fm schema 为结构化输出创建 schema1。最简单的用法正是 Eric 首先演示的那种:输入 fm respond,输入一个提示,按下回车,片刻之后便能在终端里读到模型的回答1

Watch on Apple Developer ↗
该工具随 macOS 27 预装,位于终端 app 中;输入 fm 即可列出可用命令。

两个顶层命令沿着一条清晰的界线分工:探索与脚本化。fm chat 用于初步感受模型。你提一个问题,再追问一个,对话会保持连贯,并拥有自己的斜杠命令:/model 把对话切换到 Private Cloud Compute 模型,/save 保存对话以便日后继续1。当你更希望得到一个可以捕获的内联响应时——比如在脚本中——就该改用 fm respond,它会把模型的输出写到 stdout1

各种选项都集中在 fm respond 上。Eric 明确点出了三个。一个模型选项让提示发往 Private Cloud Compute 模型,而非默认的端侧模型。一个图像选项把图像纳入提示。还有一个 schema 选项,与 fm schema object 配合,把输出约束为你定义的结构1。他指出还有更多选项,并提示用帮助选项把它们全部列出1。文字记录是按选项的作用而非确切的标志拼写来逐一称呼它们的(屏幕上展示的唯一字面形式是 fm schema object),因此下文凡是我描述某个选项之处,描述的都是已记录的行为,而非杜撰的标志字符串。

模型的选择是最关键的决定。默认情况下,fm 使用随 macOS 一同提供的端侧模型,它始终可用1。你可以切换到运行在 Private Cloud Compute 上的 Apple Foundation Model,Eric 形容它“比端侧模型大得多,因此在复杂问题上表现更好”,代价是它带有使用上限1。默认选项是恰当的起点:免费、本地、没有上限。只有当任务确实难到需要它时,你才升级到 Private Cloud Compute。

构建自动化脚本

文件排序的演示,是“为何 CLI 重要”这一论点最清晰的佐证。Eric 有一个工程文件夹,里面塞满了各种草稿版和定稿版的素材,他想要一个可重复运行的脚本,保留定稿、做好备份,并把草稿移动到归档磁盘1。难点不在于移动文件,而在于当文件名一团乱时判断哪个文件是草稿。正如他所说,从脚本调用语言模型,能让它“区分草稿版与定稿版文件”,即便“文件名混乱、难以可预测地排序”也无妨1

Watch on Apple Developer ↗
一个实用脚本:加载文件夹中的文件,提示模型把草稿与定稿区分开,再依据结构化的 JSON 结果执行备份与归档。

这个范式可以推广到任何“对列表做判断”的自动化场景。脚本加载工作目录中的文件,然后通过 fm respond 提示模型,把该列表分成两组:定稿文件和草稿文件1。为了让输出可用,脚本预先用 fm schema object 定义一个 schema,描述两个字段——一个定稿列表和一个草稿列表——并通过 schema 选项把该 schema 传给 fm respond1。模型以 JSON 形式返回它的答案,脚本读取后,将定稿复制到备份,把草稿移动到归档1

结构化输出这一步是承重的关键。自由文本式的回答会迫使脚本去解析散文,而这正是每条与 LLM 对话的 shell 流水线中最脆弱的环节。通过用 fm schema object 声明 schema 并取回 JSON,脚本就得到了一份可以直接据以行动的契约1。这一模式正是 Swift 开发者所熟知的引导式生成,在这里以 CLI 选项的形式呈现1。任何以“对模型的判断结果做某种确定性操作”收尾的任务,要的正是这种范式:提示、schema、JSON、行动。

Python SDK

第二个接口面向的是另一个时刻里的另一类人。正如 Eric 所说:“如果你是机器学习工程师,你用 Python 可能比 Swift 更多”,而这个 SDK“让在 Python 代码中使用端侧模型变得轻而易举”1。它的卖点立足于 Python 的生态:“Python 拥有丰富的机器学习与数据科学开源包生态”,这意味着你可以编写评估流水线,“借助这些包来量化你功能的质量”1

安装有四项要求,session 中都已说明。你需要 Python 3.10 或更高版本、已安装 Xcode、一台 Apple Silicon Mac,并通过 pip 或你选择的任意其他包管理器来安装该 SDK1。对 Apple Silicon 和 Xcode 的要求恰好表明,这个包是对操作系统所运行的同一端侧模型的绑定,而非一个托管 API。

对于用过 Swift 框架2的人来说,这套 API 会感觉很熟悉,这是有意为之:“这些 API 和抽象会很快让你感到熟悉”1。你通过创建一个 LanguageModelSession 来发起提示,可选地传入 instructions,然后用你的提示调用 session.respond;结果中便包含模型的输出1。该 SDK 把框架的核心特性悉数搬了过来:文本与图像输入、流式响应、让模型能与你的代码交互的工具调用,以及用于结构化输出的引导式生成1

Watch on Apple Developer ↗
购物 app 示例:创建一个 LanguageModelSession,调用 respond,暴露一个可获取近期订单的工具,并用 fm.generable 装饰器约束输出。

其中两个特性得到了具体演示。在工具调用方面,Eric 定义了一个模型可以调用的工具,用来获取用户最近的几笔订单,“这样它就能提供更个性化的信息”,与 Swift 框架的 Tool 协议是同一模式1。在引导式生成方面,他用 fm.generable 装饰器定义了期望的输出结构——一个 ItemsSuggestion 对象,并将其作为生成参数传给 fm.respond1。这个装饰器是 Swift 中 @Generable 宏的 Python 对应物,而生成参数则是你把想要的返回结构交给模型的方式。由于文字记录只是按作用和对象名展示它们,并未打印完整的类体,因此请把 ItemsSuggestion 当作该示例对一个由你自己定义的结构所取的名字。

评估流水线:使用 Python 的真正理由

这个案例研究正是 Python SDK 从一种便利升华为一种方法之处。Eric 当时在构建一个功能,用来预测用户想往购物车里添加什么,而他手上有三种不同的提示实现:一个极简版、一个更详尽版,以及一个把整套规则一一列明的细致版1。每个提示工程师都会面对的问题是:到底哪个最好?而诚实的答案需要测量,而非凭感觉。

Watch on Apple Developer ↗
一条 Jupyter notebook 评估流水线:用服务器模型生成评估数据,运行三个提示变体,把输入与输出存入 Pandas DataFrame,用评判函数打分,再用 matplotlib 绘制图表。

对此,Apple 明确表示 Swift 开发者有自己的答案。Evaluations 框架随 Xcode 27 一同提供,让创建评估、并跨迭代追踪功能准确率变得轻而易举1。Python SDK 则是为那些生活在 notebook 里的数据科学家准备的并行路径。Eric 整套分析全部在 Jupyter 中完成1

这条流水线读起来就是一个对准端侧模型的标准 ML 评估循环。首先,他用一个大型服务器模型生成评估数据,为每条数据给出输入和一个期望输出1。然后,对每一条输入,他用三种提示实现各自生成输出,并把输入与输出作为行存入一个 Pandas DataFrame1。接着,由服务器模型支撑的评判函数依据他选定的标准为每个输出打分,这些指标再回写到 DataFrame 中1。最后,matplotlib 把这些分数化为图表1

这些图表讲出了一个再怎么盯着提示也看不出的故事:细致版提示触发了很高的生成错误率,Eric 把这归因于触及了模型的最大上下文窗口大小;两个不那么详尽的提示往购物车里添加了多余的条目,而细致版添加得更少;细致版漏掉了更多期望中的条目;极简版则幻觉出的条目最多1。每个提示都有不同的失败模式,而只有测量才能把它们浮现出来。这正是整套方法的论据所在。“有了 Python,我无需重建整个工程,就能直接在 notebook 里快速完成这些迭代,”Eric 说道1

何时该选用哪一个

从上述各项契约中,可以推出几条规则。

当 shell 脚本需要做一次判断时,选用 fm respond 对杂乱的文件名排序、对一行输入进行分类、从非结构化文本中抽取一个字段。把它与 fm schema object 及 schema 选项搭配使用,让脚本据以行动的是 JSON,而不是去解析散文1

当你在探索而非编写脚本时,选用 fm chat 这是初步感受模型如何处理你的提示的最快方式,配合 /model 升级到 Private Cloud Compute,配合 /save 保留会话1

当你想要测量、而不仅仅是调用时,选用 Python SDK。 一旦你手上不止一个提示,需要弄清哪个更好,那么 notebook 加 Pandas 加 matplotlib 的循环就是趁手的工具,因为端侧模型既免费又足够本地,足以跑完一整套评估集而不会产生账单1

默认使用端侧模型;要刻意地才升级到 Private Cloud Compute。 端侧模型始终可用且没有使用上限。Private Cloud Compute 更大,在复杂问题上更出色,但带有使用上限,所以把它留给那些配得上它的任务1

在这里做原型,到 Swift 里交付。 Eric 自己的说法是,你可以把这些工具“与你的 Xcode 工程并用,作为一种对提示进行原型设计和评估的方式”,也可以“单独使用它们,以新颖的方式调用模型”1。购物 app 示例正是“在用 Swift 实现这些提示之前”,先在 Python 里对它们做原型1。CLI 和 SDK 缩短了从想法到证据的循环;而功能最终落地的地方,仍然是 app。

常见问题

fm 命令行工具是什么?

fm 是一个随 macOS 27 预装的命令行工具,从终端 app 触达端侧 Apple Foundation Model1。它的子命令包括用于提示模型并打印响应的 respond、用于开启交互式对话的 chat,以及用于定义结构化输出的 schema。运行它既不需要 API key,也没有云端费用,因为默认模型在端侧运行1

我该如何从 fm 取得结构化的 JSON?

fm schema object 定义一个 schema,然后通过 schema 选项把该 schema 传给 fm respond。模型会以匹配该 schema 的 JSON 形式返回它的答案,脚本可以直接据以行动,而无需解析自由文本1。这一机制是框架引导式生成的 CLI 版本1

Foundation Models Python SDK 有哪些要求?

Python 3.10 或更高版本、已安装 Xcode,以及一台 Apple Silicon Mac1。你通过 pip 或你选择的其他包管理器来安装它。对 Apple Silicon 和 Xcode 的要求,反映出该 SDK 绑定的是操作系统所运行的同一端侧模型,而不是去调用一个托管 API1

Python SDK 与 Swift 框架有何不同?

它是同一个模型,外加一套刻意保持熟悉的、换了语言的 API。你创建一个 LanguageModelSession,调用 respond,暴露工具,并通过作为生成参数传给 fm.respondfm.generable 装饰器使用引导式生成1。选择 Python 的理由在于生态:Pandas、matplotlib、Jupyter,以及数据科学技术栈的其余部分,能用来构建 Swift 难以如此直接触达的评估流水线1

我什么时候该用 Private Cloud Compute,而不是端侧模型?

fm 和 SDK 都默认使用端侧模型,它始终可用且没有使用上限1。当一个问题复杂到需要更大的模型时,再通过 fm respond 的模型选项或 fm chat/model 命令切换到 Private Cloud Compute,同时接受它带有使用上限这一点1

完整的 Apple 生态系列:Foundation Models 框架详解,介绍这些工具所效仿的 Swift 基础;iOS 27 工具调用控制,讲述模型如何使用工具;Foundation Models 智能体工作流,探讨端侧模型与更大模型之间的取舍;以及 Xcode 27 的编码智能体,呈现重度智能体工作流在 IDE 内的一面。中心枢纽位于 Apple 生态系列。若想了解用智能体构建 iOS 的更宏观图景,请参阅 iOS 智能体开发指南



  1. Apple,WWDC26 session 334,“Build AI-powered scripts with the fm CLI and Python SDK”,由 Foundation Models Framework 团队的 Eric Gourlaouen 主讲。developer.apple.com/videos/play/wwdc2026/334。来源涵盖:随 macOS 27 预装的 fm 工具及其 respondchatschema 子命令;fm chat/model/save 命令;fm respond 的模型、图像、schema 和帮助选项;用于定义结构化输出的 fm schema object 及其 JSON 结果契约;文件排序自动化脚本;端侧模型与 Private Cloud Compute 模型之间的选择以及后者的使用上限;Python SDK 的要求(Python 3.10+、Xcode、Apple Silicon、通过 pip 安装);LanguageModelSessionsession.respond、工具调用,以及通过作为生成参数传给 fm.respondfm.generable 装饰器实现的引导式生成;Jupyter/Pandas/matplotlib 评估流水线、三个提示变体、由服务器模型支撑的评判函数,以及各提示的失败模式(最大上下文窗口处的生成错误、多余条目、漏掉条目、幻觉条目);Xcode 27 Evaluations 框架的引述;以及“在用 Swift 实现之前先在 Python 里做原型”的说法。session 中提到了带有示例片段与文档的 Python SDK GitHub 仓库,但屏幕上未给出 URL,故在此以文字描述而非链接。 

  2. Apple Developer,“Foundation Models”框架概览。这是 WWDC25 推出端侧 Apple Foundation Model、LanguageModelSession、引导式生成以及 Tool 协议的 Swift 框架,而 fm CLI 与 Python SDK 在 macOS 27 上效仿了它。 

相关文章

在 Mac 上用 MLX 运行 Agentic AI

WWDC 2026:用 MLX 在 Mac 本地运行完整的 agentic AI 循环,将其扩展到多台 Mac,再用 Apple 的框架对其加固与剖析。

5 分钟阅读

Apple 即将开源 Foundation Models 框架

WWDC 2026:Foundation Models 框架将于今夏开源,同一套 Swift API 也能在服务器端运行,同时一个全新的 Skills 包已上线 GitHub。

4 分钟阅读

CLI论点

三个热门HN Claude Code讨论串汇聚于同一结论:CLI优先架构比IDE代理工作流更低成本、更快速、更具组合性。

3 分钟阅读