← Todos los articulos

Foundation Models en iOS 27: control de las llamadas a herramientas

Part 7 of iOS with Agents

iOS 26 le dio a una app un modelo de lenguaje grande en el dispositivo, una forma de obtener salidas con tipos seguros mediante @Generable y un protocolo Tool que permitía al modelo llamar a tu código en plena generación1. El modelo decidía cuándo recurrir a una herramienta, y tú escribías la herramienta. Lo único que no podías hacer era dirigir el propio comportamiento de las llamadas, y lo único que siempre tenías que hacer era escribir cada herramienta a mano, incluidas las que toda app necesita. iOS 27 cierra ambas brechas. GenerationOptions.ToolCallingMode te deja controlar cómo interactúa el modelo con las herramientas en cada solicitud2, y el framework Vision ahora incluye dos herramientas listas para usar, OCRTool y BarcodeReaderTool, que conectas a una sesión sin escribir tú mismo el código de reconocimiento34. Juntas completan el bucle agéntico que el framework había iniciado: el modelo decide qué hacer, tú decides con cuánta firmeza se le permite hacerlo y Apple aporta las herramientas de percepción que leen el mundo físico.

Lo que sigue es la capa de iOS 27 sobre la referencia del framework. Si todavía no conoces LanguageModelSession, el protocolo Tool o la generación guiada, empieza por la explicación del framework Foundation Models y vuelve luego.

En resumen

  • GenerationOptions.ToolCallingMode es una estructura nueva en iOS 27 que describe el comportamiento del modelo en torno al uso de herramientas, y se establece por solicitud a través de GenerationOptions2. Apple documenta tres modos.
  • El framework puede cambiar de modo tras la primera llamada a una herramienta, de modo que el modelo deja de llamar a herramientas y produce una respuesta final, lo que acota la actividad de herramientas de una sola solicitud2.
  • OCRTool reconoce texto en una imagen y devuelve una cadena con todo lo que leyó. Lo activas configurando tu LanguageModelSession con una instancia de OCRTool3.
  • BarcodeReaderTool escanea códigos legibles por máquina y devuelve un arreglo de resultados Barcode, cada uno con el contenido decodificado y el tipo de simbología. Lo activas de la misma forma, configurando la sesión con una instancia4.
  • Ambas herramientas Vision te dejan reemplazar el nombre y la descripción predeterminados, así que controlas cómo identifica el modelo cada una y decide usarla34.
  • Todo lo de aquí pertenece a la beta de iOS 27 (y a las betas correspondientes de iPadOS, macOS, visionOS y, para dos de los tres símbolos, watchOS)234.

Qué cambió entre iOS 26 e iOS 27

El framework de iOS 26 trataba las llamadas a herramientas como algo binario en la superficie de la API. Le entregabas a una sesión un conjunto de herramientas y, a partir de ahí, solo el modelo decidía si las llamaba y con qué frecuencia. Eso funciona para una consulta puntual. Se vuelve incómodo en cuanto quieres un comportamiento distinto entre solicitudes dentro de una misma sesión: un prompt en el que el modelo debe consultar una herramienta y otro en el que preferirías que respondiera desde el contexto y se ahorrara el viaje de ida y vuelta.

iOS 27 pone esa decisión en tus manos. ToolCallingMode es un valor que pasas a través de GenerationOptions, el mismo objeto de opciones que ya controla la decodificación25, y el modo es una propiedad de la solicitud, no de la sesión. Las herramientas Vision integradas cambian el otro lado de la ecuación: en lugar de escribir una canalización de OCR o un lector de códigos de barras y envolverlo en tu propia conformidad con Tool, conectas la implementación de Apple y dedicas tu esfuerzo al prompt.

GenerationOptions.ToolCallingMode: dirigir las llamadas

ToolCallingMode es una estructura bajo GenerationOptions, disponible en las betas de iOS 27, iPadOS 27, Mac Catalyst 27, macOS 27, visionOS 27 y watchOS 272. El resumen de Apple es una sola frase: un valor que usas para describir el comportamiento del modelo en lo relativo al uso de herramientas2. La declaración no puede ser más escueta:

// iOS 27 beta
struct ToolCallingMode

La documentación de Apple indica que el modo de llamada a herramientas admite tres modos2. El texto de discusión que nombraría cada uno está parcialmente omitido en la referencia al momento de escribir esto, así que, en vez de adivinar los identificadores, describiré lo que el framework documenta sobre el comportamiento, que es la parte que de verdad guía tu diseño.

El comportamiento que Apple sí detalla es este: el framework puede cambiar de modo tras la primera llamada a una herramienta, lo que permite al modelo producir una respuesta final2. Esa única frase es la pieza que sostiene todo lo demás. Significa que una solicitud puede empezar en una postura en la que el modelo es libre de llamar a una herramienta (o está obligado a hacerlo) y, una vez que esa primera llamada regresa, el framework cambia el modo para que el modelo deje de recurrir a herramientas y se comprometa con una respuesta. El efecto práctico es acotar la actividad de herramientas de una sola solicitud: no quedas a merced de un modelo que sigue llamando a herramientas en bucle hasta agotar la ventana de contexto.

El modo se establece a través del objeto de opciones que ya pasas a respond(to:):

import FoundationModels

let session = LanguageModelSession(tools: [FindContacts()])

// A request where you want to govern tool-calling behavior explicitly.
var options = GenerationOptions()
options.toolCallingMode = .someMode   // one of the three documented modes
let response = try await session.respond(
    to: "Draft a dinner invite to three of my contacts.",
    options: options
)

La grafía exacta de .someMode proviene de los tres casos documentados; lo que importa es el mecanismo, y el mecanismo consiste en que el comportamiento va por solicitud y lo transporta GenerationOptions. Ese objeto es la misma estructura de iOS 26 que gobierna la estrategia de decodificación, la manera en que el modelo elige los tokens de salida y el límite opcional de tokens de respuesta al que solo recurres para protegerte de una verbosidad desbocada5. El modo de llamada a herramientas es una nueva dimensión sobre una superficie de control que ya usas, no un objeto nuevo que tengas que pasar por todo tu código.

El control se sitúa en el nivel de la solicitud y no en el de la sesión porque la necesidad de herramienta es una propiedad de la pregunta, no de la conversación. Una sesión de chat puede atender un turno que de verdad exige una consulta de contactos y un turno siguiente que es pura reformulación que el modelo puede hacer con lo que ya tiene. Forzar una llamada a herramienta en el segundo turno desperdicia un viaje de ida y vuelta y quema tokens que la ventana de contexto compartida no puede ceder5. El modo por solicitud deja que cada turno declare su propia postura.

Herramientas Vision integradas: OCRTool y BarcodeReaderTool

La segunda mitad de la historia de iOS 27 viene del framework Vision, expuesto como herramientas de Foundation Models. Apple ahora incluye dos herramientas que conectas a una LanguageModelSession igual que conectarías una propia, salvo que no escribes nada del código de reconocimiento.

Watch on Apple Developer ↗
Apple presenta las herramientas del sistema: dos herramientas nativas respaldadas por Vision, más una herramienta de búsqueda de Spotlight, que conectas a una LanguageModelSession sin escribir el código de reconocimiento.

En la sesión 241, Apple presenta BarcodeReaderTool y OCRTool como herramientas del sistema integradas que potencian la capacidad del modelo de razonar sobre información visual de maneras que no puede lograr de forma nativa.7

OCRTool

OCRTool reconoce texto en una imagen. El resumen de Apple es exactamente eso, y la discusión es precisa sobre el contrato: la herramienta devuelve una cadena que contiene todo el texto reconocido en la imagen3. Para activarla, configuras tu LanguageModelSession con una instancia de OCRTool3. La declaración:

// iOS 27 beta, Vision framework
struct OCRTool

Conectarla sigue la misma forma que cualquier herramienta, porque para la sesión no es más que otro Tool:

import FoundationModels
import Vision

// Configure the session with an OCRTool instance to enable it.
let session = LanguageModelSession(tools: [OCRTool()])

let response = try await session.respond(
    to: "Pull the total and the date off this receipt image and summarize them."
)

El modelo decide cuándo el prompt necesita texto sacado de una imagen, llama a OCRTool, recibe de vuelta una cadena con todo lo que la herramienta leyó e incorpora esa cadena a su respuesta igual que incorporaría el resultado de una herramienta que tú hubieras escrito3. No escribiste ninguna solicitud de Vision ni código de manejo. Conectaste una herramienta y describiste el trabajo.

Apple te deja reemplazar el nombre y la descripción predeterminados para personalizar cómo identifica y usa la herramienta el modelo3. Ese gancho es la única palanca que tienes sobre cuándo el modelo recurre al OCR. Si tu app lee recibos, redactar la descripción de la herramienta en términos de recibos inclina al modelo a llamarla en prompts con forma de recibo y a apartarse de prompts donde la imagen es decorativa. La descripción es una documentación de función que el modelo lee, así que escríbela como tal.

BarcodeReaderTool

BarcodeReaderTool escanea códigos legibles por máquina en una imagen4. Donde OCRTool devuelve una cadena plana, la herramienta de códigos de barras devuelve estructura: cuando el modelo se topa con una imagen que contiene códigos legibles por máquina, puede llamar a esta herramienta para decodificarlos, y la herramienta devuelve un arreglo de resultados Barcode, cada uno con el contenido decodificado y el tipo de simbología4. La declaración y la conexión son un reflejo de OCRTool:

// iOS 27 beta, Vision framework
struct BarcodeReaderTool

// Configure the session with a BarcodeReaderTool instance to enable it.
let session = LanguageModelSession(tools: [BarcodeReaderTool()])

let response = try await session.respond(
    to: "Scan this label and tell me what product it is and which standard the code uses."
)

El tipo de simbología que lleva cada resultado Barcode es el detalle que justifica el retorno estructurado4. Un código QR, un código de barras EAN-13 de supermercado y un PDF417 en una licencia de conducir son todos códigos legibles por máquina, pero significan cosas distintas para tu app. Como la herramienta devuelve la simbología junto con la carga útil decodificada, el modelo (y tu código posterior) puede bifurcar según el tipo de código, no solo según los bytes que contiene. Igual que con OCRTool, puedes reemplazar el nombre y la descripción predeterminados para dirigir cómo identifica y usa la herramienta el modelo4.

Ambas herramientas tienen la misma disponibilidad en beta: iOS 27, iPadOS 27, Mac Catalyst 27, macOS 27 y visionOS 27 para las dos, y BarcodeReaderTool figura además para watchOS 2734.

Componer el bucle: percepción más llamadas controladas

Las dos funciones son interesantes por separado y mejores juntas, porque se sitúan en extremos opuestos de una misma solicitud agéntica. Las herramientas Vision son percepción, los ojos del modelo sobre una imagen. ToolCallingMode es gobernanza, tu mano sobre cuánto se apoya el modelo en esos ojos.

Imagina una función de reposición de despensa. La persona fotografía un estante. La sesión tiene conectadas ambas herramientas Vision y una herramienta propia, un LookUpProduct que consulta el catálogo de la app. Una sola solicitud le pide al modelo que identifique los artículos y arme una lista de reposición. El modelo llama a BarcodeReaderTool para decodificar las etiquetas que ve, lee con OCRTool cualquier texto impreso de los artículos sin un código nítido y llama a tu LookUpProduct para resolver cada carga útil decodificada en una entrada del catálogo. Tres herramientas, un prompt, una respuesta coherente.

import FoundationModels
import Vision

let session = LanguageModelSession(tools: [
    OCRTool(),
    BarcodeReaderTool(),
    LookUpProduct(),     // your own Tool conformance over the app catalog
])

var options = GenerationOptions()
options.toolCallingMode = .someMode   // govern how the model sequences the calls
let response = try await session.respond(
    to: "Identify everything on this shelf and build a reorder list.",
    options: options
)

Ese es el bucle hacia el que el framework ha venido construyendo. iOS 26 aportó el modelo en tiempo de ejecución, la generación guiada y el protocolo Tool que permite al modelo en el dispositivo invocar tu código sin que tengas que analizar texto libre1. El artículo de arquitectura de este grupo trazó la línea entre ese modelo en tiempo de ejecución y el LLM de herramientas que un desarrollador ejecuta en Claude Code para escribir la app, y defendió una única función de dominio en Swift que respalde un Tool de Foundation Models, un App Intent y una herramienta MCP mediante tres adaptadores delgados6. iOS 27 encaja en el lado de ejecución de ese cuadro: las herramientas Vision integradas son funciones de dominio que Apple escribió y tú montas, LookUpProduct es la función de dominio que tú escribiste, el modelo orquesta todas ellas y ToolCallingMode es el acelerador de la orquestación.

La frontera de confianza no se mueve. OCRTool y BarcodeReaderTool se ejecutan dentro del proceso de la app en el dispositivo, sobre la imagen de la persona usuaria, bajo el mismo entorno aislado y la misma postura de privacidad que una herramienta que tú mismo escribieras. Que Apple aporte la implementación cambia quién mantiene el código de reconocimiento, no quién responde por la función. Sigues siendo dueño del prompt, de la sesión, de la comprobación de disponibilidad y de la decisión de poner una cámara delante de la persona usuaria.

Cuándo usar cada modo y cada herramienta

Algunas reglas que se desprenden de los contratos anteriores.

Recurre a ToolCallingMode cuando la necesidad de herramienta varíe de una solicitud a otra. Si cada turno de una sesión necesita el mismo comportamiento de herramienta, el valor predeterminado basta y el modo es ruido. El modo se gana su lugar cuando una solicitud debe consultar una herramienta y otra debería responder desde el contexto, o cuando quieres que el cambio del framework tras la primera llamada acote una solicitud que de otro modo podría entrar en bucle2. Establécelo en la solicitud, no una sola vez para la sesión, porque ahí es donde vive el control2.

Recurre a OCRTool cuando la respuesta sea texto atrapado en una imagen. Recibos, letreros, notas manuscritas, capturas de pantalla de texto. La herramienta devuelve una sola cadena con todo lo que leyó3, así que encaja en prompts donde quieres que el modelo razone sobre las palabras, no sobre la disposición. Si necesitas cuadros delimitadores o confianza por línea, eso es una solicitud de Vision de más bajo nivel, no esta herramienta.

Recurre a BarcodeReaderTool cuando la imagen lleve códigos legibles por máquina y el tipo de código importe. Etiquetas de productos, entradas, identificaciones, etiquetas de inventario. El retorno estructurado, contenido decodificado más simbología4, es la razón para preferirlo a tratar un código de barras como texto genérico. Bifurca según la simbología en tu propia herramienta o en tu posprocesamiento.

Reemplaza el nombre y la descripción siempre que tu app tenga un trabajo concreto para una herramienta genérica. Ambas herramientas Vision tienen por defecto identidades genéricas, y el modelo elige las herramientas en parte por sus descripciones34. Una app que solo lee recibos debería decirlo en la descripción de la herramienta de OCR, para que el modelo no la llame en cada foto que casualmente contenga una palabra.

Preguntas frecuentes

¿Qué es GenerationOptions.ToolCallingMode en iOS 27?

Es una estructura, nueva en la beta de iOS 27, que describe el comportamiento del modelo en torno al uso de herramientas para una solicitud dada. La estableces a través del GenerationOptions que pasas a respond(to:), así que el comportamiento de las llamadas a herramientas es una propiedad de cada solicitud y no de toda la sesión. Apple documenta tres modos2.

¿Cuántos modos de llamada a herramientas documenta Apple y cómo se llaman?

La documentación de Apple indica que el modo de llamada a herramientas admite tres modos2. El texto de la referencia que nombraría cada modo individual está parcialmente omitido al momento de escribir esto, así que describo el comportamiento documentado en lugar de adivinar los identificadores. El comportamiento que Apple sí enuncia de forma explícita: el framework puede cambiar de modo tras la primera llamada a una herramienta para que el modelo produzca una respuesta final, lo que acota la actividad de herramientas de una sola solicitud2.

¿Cómo activo la herramienta de OCR integrada de Apple?

Configura tu LanguageModelSession con una instancia de OCRTool, igual que conectas cualquier herramienta3. El modelo la llama entonces cuando un prompt necesita texto de una imagen, y la herramienta devuelve una cadena que contiene todo el texto reconocido. OCRTool está en el framework Vision y se encuentra disponible en la beta de iOS 273.

¿Qué devuelve BarcodeReaderTool?

Devuelve un arreglo de resultados Barcode, cada uno con el contenido decodificado y el tipo de simbología4. La simbología te permite distinguir un código QR de un EAN-13 o de un PDF417 y bifurcar según el tipo de código, no solo según su carga útil. Lo activas configurando una LanguageModelSession con una instancia de BarcodeReaderTool4.

¿Puedo cambiar cómo decide el modelo usar las herramientas Vision integradas?

Sí. Tanto OCRTool como BarcodeReaderTool te dejan reemplazar el nombre y la descripción predeterminados para personalizar cómo identifica y usa la herramienta el modelo34. La descripción es la palanca sobre cuándo el modelo recurre a la herramienta, así que redactarla en los propios términos de tu app inclina al modelo hacia las llamadas correctas.

¿Las herramientas Vision integradas envían las imágenes fuera del dispositivo?

No. OCRTool y BarcodeReaderTool son herramientas de Foundation Models que se ejecutan dentro del proceso de la app en el dispositivo, bajo el mismo entorno aislado y la misma postura de privacidad que una herramienta que tú mismo escribas134. Que Apple aporte el código de reconocimiento cambia quién lo mantiene, no dónde se ejecuta ni quién responde por la función.

El grupo completo de Apple Ecosystem: la explicación del framework Foundation Models; el LLM en el dispositivo; la distinción entre LLM de ejecución y LLM de herramientas; los adaptadores personalizados; los App Intents tipados; la nueva ejecución en segundo plano y sincronización de los App Intents en iOS 27; la cuestión del enrutamiento frente a las herramientas MCP; el framework Vision; la inferencia con Core ML; las tres superficies. El centro está en la serie Apple Ecosystem. Para un contexto más amplio de iOS con agentes de IA, consulta la guía de desarrollo de agentes en iOS.



  1. Apple Developer, “Foundation Models” framework overview and “Tool” protocol. The iOS 26 framework introduced the on-device model, LanguageModelSession, guided generation via @Generable, and the Tool protocol that lets the model invoke app code mid-generation. 

  2. Apple Developer, “GenerationOptions.ToolCallingMode”. A structure (struct ToolCallingMode) available in the iOS 27.0, iPadOS 27.0, Mac Catalyst 27.0, macOS 27.0, visionOS 27.0, and watchOS 27.0 betas, abstracted as a value that describes model behavior around tool usage. Apple’s discussion states tool calling mode supports three modes and that the framework can change the mode after the first tool call, which lets the model produce a final response. 

  3. Apple Developer, “OCRTool”. A Vision-framework structure (struct OCRTool) available in the iOS 27.0, iPadOS 27.0, Mac Catalyst 27.0, macOS 27.0, and visionOS 27.0 betas, abstracted as a tool that recognizes text in an image. Apple’s discussion states the tool returns a string containing all recognized text, that you enable it by configuring your LanguageModelSession with an instance of OCRTool, and that you can override the default name and description. 

  4. Apple Developer, “BarcodeReaderTool”. A Vision-framework structure (struct BarcodeReaderTool) available in the iOS 27.0, iPadOS 27.0, Mac Catalyst 27.0, macOS 27.0, visionOS 27.0, and watchOS 27.0 betas, abstracted as a tool that scans machine-readable codes in an image. Apple’s discussion states the tool returns an array of Barcode results, each containing the decoded content and the symbology type, that you enable it by configuring your LanguageModelSession with an instance of BarcodeReaderTool, and that you can override the default name and description. 

  5. Apple Developer, “GenerationOptions”. The iOS 26 structure (struct GenerationOptions) whose options determine the decoding strategy the framework uses to adjust how the model chooses output tokens; Apple notes a strict response-token limit should be used only to guard against unexpectedly verbose responses, and that all input contributes to the shared context window. 

  6. Author’s analysis in Foundation Models Agentic Workflow: In-App vs Tooling LLM, May 1, 2026, on the runtime/tooling LLM distinction, the on-device Tool protocol’s trust boundary, and the single-domain-function, multiple-adapter pattern across Foundation Models tools, App Intents, and MCP. The routing question between those surfaces is developed in App Intents vs MCP: The Routing Question

  7. Apple, WWDC26 session 241, “What’s new in the Foundation Models framework.” developer.apple.com/videos/play/wwdc2026/241. Apple introduces BarcodeReaderTool and OCRTool as native system tools backed by the Vision framework, alongside a Spotlight-powered search tool for on-device RAG, describing them as enhancing the model’s ability to reason about visual information in ways it cannot do natively. 

Artículos relacionados

Core AI: ejecutar modelos en Apple silicon

Core AI es el framework de bajo nivel de iOS 27 para ejecutar modelos: asset frente a modelo, tensores NDArray, selecció…

17 min de lectura

IA en el dispositivo a lo largo de iOS 27: Spotlight y Media

iOS 27 enhebra el modelo en el dispositivo por todo el sistema: SpotlightSearchTool fundamenta Core Spotlight en el LLM,…

16 min de lectura

The Robots Are Taking Exams in My Search Console

First-party GSC data: 91% of 3.8M impressions fail a human-query filter. Exam questions, pasted errors, and agent sweeps…

10 min de lectura