← Todos los articulos

Foundation Models desde Python: la CLI fm

Durante un año, el gran modelo de lenguaje on-device de Apple vivió detrás de un muro: solo lo alcanzabas desde Swift y únicamente dentro de una app que construyeras en Xcode1. macOS 27 derriba ese muro. Apple ahora incluye una herramienta de línea de comandos llamada fm, preinstalada con el sistema operativo, y un SDK de Foundation Models para Python que instalas con pip1. El modelo que antes exigía un proyecto, una compilación y un LanguageModelSession en Swift compilado ahora responde a un comando de shell de una sola línea y se ejecuta dentro de un notebook de Jupyter. Eric Gourlaouen, ingeniero del equipo de Foundation Models Framework, planteó el cambio sin rodeos en la sesión 334 de la WWDC26: “hasta ahora, esos modelos solo estaban disponibles desde código Swift”1. El cambio no es un modelo nuevo. El cambio es que ese mismo modelo on-device de repente se puede automatizar, scriptar y evaluar desde fuera de una app, sin clave de API y sin coste en la nube1.

Watch on Apple Developer ↗
Apple presenta dos nuevas formas de alcanzar el Apple Foundation Model on-device en macOS: la herramienta de línea de comandos fm preinstalada y un SDK de Foundation Models para Python.

Resumen

  • macOS 27 incluye fm, una herramienta de línea de comandos preinstalada para el Apple Foundation Model on-device. Sus subcomandos incluyen respond (un prompt único hacia stdout), chat (sesión interactiva) y schema (definir salida estructurada)1.
  • fm respond ofrece opciones para el modelo (cambiar a Private Cloud Compute), para una entrada de imagen y para un esquema de salida estructurada; --help lista las demás1.
  • El SDK de Python alcanza el mismo modelo on-device desde Python; requiere Python 3.10 o posterior, Xcode instalado y un Mac con Apple Silicon, y se instala mediante pip u otro gestor de paquetes1.
  • El SDK refleja el framework de Swift: un LanguageModelSession sobre el que llamas a respond, llamadas a herramientas y generación guiada mediante el decorador fm.generable que se pasa a fm.respond como el argumento de generación1.
  • Ambas superficies usan por defecto el modelo on-device siempre disponible y pueden optar por el modelo más grande de Private Cloud Compute, más capaz pero sujeto a límites de uso1.
  • La recompensa es el prototipado y la automatización: scripts de shell que ordenan archivos por su significado, y pipelines de evaluación en Python que califican variantes de prompts con Pandas y matplotlib1.

La herramienta de línea de comandos fm

Abre Terminal en macOS 27 y escribe fm: la herramienta imprime los comandos que admite1. Apple destaca tres. fm respond envía un prompt al modelo y devuelve una respuesta. fm chat inicia una conversación interactiva. fm schema crea un esquema para salida estructurada1. El uso más sencillo posible es el que Eric mostró primero: escribe fm respond, escribe un prompt, pulsa Intro y lee la respuesta del modelo en la terminal un momento después1.

Watch on Apple Developer ↗
La herramienta viene preinstalada en macOS 27 y reside en la app Terminal; al escribir fm se listan los comandos disponibles.

Los dos comandos de nivel superior se dividen por una línea clara: exploración frente a scripting. fm chat sirve para tomarle el primer pulso al modelo. Haces una pregunta, haces otra de seguimiento y la conversación se mantiene, con sus propios comandos de barra: /model cambia la conversación al modelo de Private Cloud Compute, y /save guarda la conversación para retomarla más tarde1. Cuando prefieres una respuesta en línea que puedas capturar, como en un script, recurres en cambio a fm respond, que escribe la salida del modelo en stdout1.

fm respond es donde viven las opciones. Eric nombró tres de forma explícita. Una opción de modelo envía el prompt al modelo de Private Cloud Compute en lugar de al modelo on-device por defecto. Una opción de imagen incluye una imagen en el prompt. Y una opción de esquema se combina con fm schema object para restringir la salida a una estructura que hayas definido1. Señaló que hay más y remitió a la opción de ayuda para listarlas todas1. La transcripción nombra las opciones por su función en lugar de por la grafía exacta de cada flag (la única forma literal que aparece en pantalla es fm schema object), así que cuando describo una opción más abajo describo el comportamiento documentado, sin inventar una cadena de flag.

La elección del modelo es la decisión que más importa. Por defecto, fm usa el modelo on-device que viene con macOS, que siempre está disponible1. Puedes cambiar al Apple Foundation Model en Private Cloud Compute, que Eric describió como “un modelo mucho más grande que el modelo on-device, así que rendirá mejor en problemas complejos”, con la contrapartida de que conlleva límites de uso1. El valor por defecto es el punto de partida correcto: es gratis, local y sin tope. Subes a Private Cloud Compute cuando una tarea es realmente lo bastante difícil como para necesitarlo.

Construir un script de automatización

La demo de ordenar archivos es el argumento más claro de por qué importa una CLI. Eric tenía una carpeta de proyecto llena de versiones borrador y finales de recursos, y quería un script repetible que conservara las finales, las respaldara y moviera los borradores a un disco de archivo1. Lo difícil no es mover archivos. Lo difícil es decidir qué archivo es un borrador cuando los nombres están desordenados. Como él lo expresó, llamar a un modelo de lenguaje desde el script le permite “ordenar archivos borrador frente a finales” incluso cuando “los nombres están desordenados y son difíciles de ordenar de forma predecible”1.

Watch on Apple Developer ↗
Un script práctico: carga los archivos de una carpeta, pide al modelo que separe borradores de finales y actúa sobre un resultado JSON estructurado para respaldar y archivar.

La forma se generaliza a cualquier automatización de “juicio sobre una lista”. El script carga los archivos del directorio de trabajo y luego pide al modelo, a través de fm respond, que ordene esa lista en dos grupos: archivos finales y archivos borrador1. Para que la salida sea utilizable, define de antemano un esquema con fm schema object que describe dos campos, una lista de finales y una lista de borradores, y pasa ese esquema a fm respond mediante la opción de esquema1. El modelo devuelve su respuesta como JSON, y el script lo lee para copiar los finales a un respaldo y mover los borradores al archivo1.

El paso de salida estructurada es el que sostiene todo. Una respuesta de texto libre obligaría al script a analizar prosa, la parte frágil de todo pipeline de shell que habla con un LLM. Al declarar el esquema con fm schema object y recibir JSON, el script obtiene un contrato sobre el que puede actuar directamente1. El patrón es el mismo que los desarrolladores de Swift conocen como generación guiada, expuesto aquí como una opción de la CLI1. Cualquier tarea que termine en “haz algo determinista con la decisión del modelo” pide exactamente esta forma: prompt, esquema, JSON, acción.

El SDK de Python

La segunda superficie es para otra persona en otro momento. Como dijo Eric, “si eres ingeniero de machine learning, quizá uses más Python que Swift”, y el SDK “facilita usar el modelo on-device en tu código Python”1. La propuesta se apoya en el ecosistema de Python: “Python tiene un rico ecosistema de paquetes de código abierto para machine learning y ciencia de datos”, lo que significa que puedes escribir pipelines de evaluación y “aprovechar esos paquetes para cuantificar la calidad de tu función”1.

La instalación tiene cuatro requisitos, todos enunciados en la sesión. Necesitas Python 3.10 o posterior, Xcode instalado y un Mac con Apple Silicon, e instalas el SDK mediante pip o cualquier otro gestor de paquetes de tu elección1. Los requisitos de Apple Silicon y Xcode son la señal de que el paquete es un enlace al mismo modelo on-device que ejecuta el sistema operativo, no a una API alojada.

La API resultará familiar a cualquiera que haya usado el framework de Swift2, y es a propósito: “las API y abstracciones resultarán familiares enseguida”1. Lanzas un prompt creando un LanguageModelSession, pasando opcionalmente instrucciones, y luego llamando a session.respond con tu prompt; el resultado contiene la salida del modelo1. El SDK traslada las funciones centrales del framework: entradas de texto e imagen, respuestas en streaming, llamadas a herramientas para que el modelo pueda interactuar con tu código y generación guiada para salida estructurada1.

Watch on Apple Developer ↗
El ejemplo de la app de compras: crear un LanguageModelSession, llamar a respond, exponer una herramienta que obtiene pedidos recientes y restringir la salida con el decorador fm.generable.

Dos de esas funciones recibieron un tratamiento concreto. Para las llamadas a herramientas, Eric definió una herramienta que el modelo puede llamar para obtener los últimos pedidos de un usuario, “de modo que pueda ofrecer información más personalizada”, el mismo patrón que el protocolo Tool del framework de Swift1. Para la generación guiada, usó el decorador fm.generable para definir la estructura de salida deseada, un objeto ItemsSuggestion, y lo pasó a fm.respond como el argumento de generación1. El decorador es el equivalente en Python de la macro @Generable de Swift, y el argumento de generación es la manera de entregarle al modelo la forma que quieres recibir de vuelta. Como la transcripción los muestra por su función y nombre de objeto en lugar de imprimir el cuerpo completo de la clase, trata ItemsSuggestion como el nombre que el ejemplo da a una estructura que definirías tú mismo.

Pipelines de evaluación: la verdadera razón para usar Python

El caso práctico es donde el SDK de Python deja de ser una comodidad y se convierte en un método. Eric estaba construyendo una función para predecir qué quiere añadir un usuario a su carrito de la compra, y tenía tres implementaciones de prompt distintas: una mínima, otra más descriptiva y una detallada que enumeraba una lista completa de reglas1. La pregunta que enfrenta todo prompt engineer es cuál es realmente la mejor, y la respuesta honesta exige medición, no gusto.

Watch on Apple Developer ↗
Un pipeline de evaluación en un notebook de Jupyter: generar datos de evaluación con un modelo de servidor, ejecutar tres variantes de prompts, almacenar entradas y salidas en un DataFrame de Pandas, calificar con funciones de juez y graficar con matplotlib.

Apple es explícita en que los desarrolladores de Swift tienen su propia respuesta aquí. El framework Evaluations se incluye con Xcode 27 y facilita crear evaluaciones y seguir la precisión de una función a lo largo de las iteraciones1. El SDK de Python es la vía paralela para los científicos de datos que viven en los notebooks. Eric realizó todo el análisis desde Jupyter1.

El pipeline se lee como un bucle de evaluación de ML estándar apuntado al modelo on-device. Primero, usó un gran modelo de servidor para generar datos de evaluación, obteniendo entradas y una salida esperada para cada una1. Luego, para cada entrada, generó salidas a partir de cada una de las tres implementaciones de prompt y almacenó las entradas y salidas como filas en un DataFrame de Pandas1. A continuación, funciones de juez respaldadas por un modelo de servidor calificaron cada salida según criterios que él eligió, y esas métricas volvieron al DataFrame1. Por último, matplotlib convirtió las calificaciones en gráficos1.

Los gráficos contaron una historia que ninguna cantidad de mirar fijamente los prompts habría revelado: el prompt detallado alcanzó una alta tasa de errores de generación, que Eric atribuyó a llegar al tamaño máximo de la ventana de contexto del modelo; los dos prompts menos detallados añadían artículos de más al carrito mientras que el detallado añadía menos; el prompt detallado se dejaba más artículos esperados; y el prompt mínimo alucinaba la mayor cantidad de artículos1. Cada prompt tenía un modo de fallo diferente, y solo la medición los sacó a la luz. Ese es el argumento a favor de todo el enfoque. “Con Python, puedo hacer esas iteraciones rápidamente desde mi notebook sin tener que reconstruir todo el proyecto”, dijo Eric1.

Cuándo recurrir a cada uno

De los contratos anteriores se derivan unas cuantas reglas.

Recurre a fm respond cuando un script de shell necesite un juicio. Ordenar nombres de archivo desordenados, clasificar una línea de entrada, extraer un campo de texto no estructurado. Combínalo con fm schema object y la opción de esquema para que el script actúe sobre JSON en lugar de analizar prosa1.

Recurre a fm chat cuando estés explorando, no scriptando. Es la forma más rápida de tomarle el primer pulso a cómo el modelo maneja tus prompts, con /model para escalar a Private Cloud Compute y /save para conservar una sesión1.

Recurre al SDK de Python cuando quieras medir, más allá de simplemente llamar. En el momento en que tienes más de un prompt y necesitas saber cuál es mejor, el bucle de notebook más Pandas más matplotlib es la herramienta, porque el modelo on-device es lo bastante gratuito y local como para ejecutar un conjunto de evaluación completo sin una factura1.

Usa por defecto el modelo on-device; sube a Private Cloud Compute de forma deliberada. El modelo on-device siempre está disponible y no tiene límite de uso. Private Cloud Compute es más grande y mejor en problemas complejos, pero conlleva límites de uso, así que resérvalo para las tareas que lo merezcan1.

Prototipa aquí, lanza en Swift. El propio planteamiento de Eric es que puedes usar estas herramientas “junto a tu proyecto de Xcode, como una forma de prototipar y evaluar prompts”, o “por sí solas, para usar el modelo de maneras novedosas”1. El ejemplo de la app de compras prototipa prompts en Python “antes de implementarlos en Swift”1. La CLI y el SDK acortan el bucle entre la idea y la evidencia; la app sigue siendo donde aterriza la función.

Preguntas frecuentes

¿Qué es la herramienta de línea de comandos fm?

fm es una herramienta de línea de comandos que viene preinstalada con macOS 27 y alcanza el Apple Foundation Model on-device desde la app Terminal1. Sus subcomandos incluyen respond para enviar un prompt al modelo e imprimir una respuesta, chat para iniciar una conversación interactiva y schema para definir salida estructurada. La ejecutas sin clave de API y sin coste en la nube, porque el modelo por defecto se ejecuta on-device1.

¿Cómo obtengo JSON estructurado de fm?

Define un esquema con fm schema object y luego pasa ese esquema a fm respond mediante su opción de esquema. El modelo devuelve su respuesta como JSON que coincide con el esquema, sobre el que un script puede actuar directamente en lugar de analizar texto libre1. El mecanismo es la versión de CLI de la generación guiada del framework1.

¿Qué requiere el SDK de Foundation Models para Python?

Python 3.10 o posterior, Xcode instalado y un Mac con Apple Silicon1. Lo instalas mediante pip u otro gestor de paquetes de tu elección. Los requisitos de Apple Silicon y Xcode reflejan que el SDK se enlaza al mismo modelo on-device que ejecuta el sistema operativo, en lugar de llamar a una API alojada1.

¿En qué se diferencia el SDK de Python del framework de Swift?

Es el mismo modelo y una API deliberadamente familiar en otro lenguaje. Creas un LanguageModelSession, llamas a respond, expones herramientas y usas generación guiada mediante el decorador fm.generable que se pasa a fm.respond como el argumento de generación1. La razón para elegir Python es el ecosistema: Pandas, matplotlib, Jupyter y el resto del stack de ciencia de datos para pipelines de evaluación que Swift no alcanza de forma tan directa1.

¿Cuándo debo usar Private Cloud Compute en lugar del modelo on-device?

Tanto fm como el SDK usan por defecto el modelo on-device, que siempre está disponible y no tiene límite de uso1. Cambia a Private Cloud Compute, mediante la opción de modelo de fm respond o el comando /model de fm chat, cuando un problema sea lo bastante complejo como para necesitar el modelo más grande, aceptando que conlleva límites de uso1.

El clúster completo de Apple Ecosystem: la explicación del framework Foundation Models para la base de Swift que estas herramientas reflejan; los controles de llamadas a herramientas de iOS 27 para cómo el modelo usa las herramientas; el flujo de trabajo agéntico de Foundation Models para la elección entre modelo on-device y modelo más grande; y los agentes de codificación de Xcode 27 para la vertiente dentro del IDE de un flujo de trabajo centrado en agentes. El hub está en la serie Apple Ecosystem. Para el panorama más amplio de construir iOS con agentes, consulta la guía de desarrollo de agentes para iOS.



  1. Apple, WWDC26 session 334, “Build AI-powered scripts with the fm CLI and Python SDK,” presented by Eric Gourlaouen of the Foundation Models Framework team. developer.apple.com/videos/play/wwdc2026/334. Source for: the fm tool pre-installed with macOS 27 and its respond, chat, and schema subcommands; fm chat’s /model and /save commands; fm respond’s model, image, schema, and help options; fm schema object for defining structured output and the JSON result contract; the file-sorting automation script; the on-device versus Private Cloud Compute model choice and the latter’s usage limits; the Python SDK’s requirements (Python 3.10+, Xcode, Apple Silicon, install via pip); LanguageModelSession, session.respond, tool calling, and guided generation via the fm.generable decorator passed to fm.respond as the generating argument; the Jupyter/Pandas/matplotlib evaluation pipeline, the three prompt variants, the judge functions backed by a server model, and the per-prompt failure modes (generation errors at max context window, excess items, missed items, hallucinated items); the Xcode 27 Evaluations framework reference; and the “prototype in Python before implementing in Swift” framing. The Python SDK GitHub repository with example snippets and documentation is referenced in the session but no URL is given on screen, so it is described rather than linked. 

  2. Apple Developer, “Foundation Models” framework overview. The WWDC25 Swift framework that introduced the on-device Apple Foundation Model, LanguageModelSession, guided generation, and the Tool protocol, which the fm CLI and Python SDK mirror on macOS 27. 

Artículos relacionados

Ejecutar IA agéntica en el Mac con MLX

WWDC 2026: ejecuta todo el bucle de IA agéntica en local en el Mac con MLX, escálalo entre varios Mac y luego asegúralo …

17 min de lectura

Apple va a liberar el código del framework Foundation Models

WWDC 2026: el framework Foundation Models se vuelve open source este verano, así que la misma Swift API corre del lado d…

14 min de lectura

La tesis del CLI

Tres hilos principales de HN sobre Claude Code convergen en una conclusión: la arquitectura CLI-first es más económica, …

14 min de lectura