Los LLM ya son herramientas esenciales para las apps modernas, pero en el ecosistema Apple integrarlos sigue siendo doloroso. ¿Por qué? Porque los desarrolladores terminan combinando modelos locales, APIs en la nube y las Foundation Models de Apple, cada uno con su propio contrato, su propia forma de inicializar sesiones y su propia curva de aprendizaje.
Hoy Hugging Face presenta AnyLanguageModel, un paquete Swift que se propone resolver ese dolor: una implementación drop-in compatible con la API de Foundation Models que soporta múltiples proveedores, tanto locales como remotos. La idea es simple y poderosa: cambia import FoundationModels por import AnyLanguageModel y mantén la misma ergonomía de Swift.
Qué es AnyLanguageModel y por qué importa
AnyLanguageModel es una capa de compatibilidad que unifica el acceso a modelos en Apple platforms (iOS, macOS con Apple Silicon, etc.). Está pensado para desarrolladores que quieren experimentar con modelos locales (privacidad, offline, latencia baja) sin renunciar a la opción de usar proveedores en la nube como respaldo.
¿Por qué usarlo? Porque reduce fricción: menos cambios conceptuales entre modelos, menos tiempo perdido tratando de adaptar diferentes SDKs, y una ruta clara para probar modelos open source en producción.
Intercambio mínimo de código
Ejemplo con el modelo del sistema (Foundation Models):
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)
Y exactamente el mismo patrón con un modelo local vía 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)
La API mantiene las abstracciones familiares: LanguageModelSession, generación, y herramientas para streaming o persistencia. Eso facilita comparar proveedores cambiando solo la instancia del modelo.
Proveedores y soporte técnico
AnyLanguageModel cubre una amplia gama de backends:
Apple Foundation Models (sistema, macOS 26+ / iOS 26+)
Core ML (modelos convertidos y aceleración Neural Engine)
MLX (modelos cuantizados para Apple Silicon)
llama.cpp (carga de modelos GGUF vía backend de llama.cpp / llama.swift)
Ollama (conexión a modelos servidos localmente por Ollama)
OpenAI, Anthropic, Google Gemini (nube como fallback)
Proveedores de inferencia de Hugging Face (varios modelos en la nube)
El enfoque privilegia modelos que puedes descargar del Hugging Face Hub y ejecutar localmente. Las integraciones en la nube están para facilitar el arranque y ofrecer un camino de migración: haz que funcione primero, optimiza luego.
Control de dependencias: traits de Swift 6.1
Una de las decisiones clave es evitar bloat por soporte múltiple. AnyLanguageModel usa las traits de paquetes Swift para que solo arrastres los backends que necesitas. Ejemplo de dependencia donde solo activas MLX:
dependencies: [
.package(
url: "https://github.com/mattt/AnyLanguageModel.git",
from: "0.4.0",
traits: ["MLX"] // Solo trae dependencias necesarias para MLX
)
]
Traits disponibles: CoreML, MLX, Llama (para llama.cpp / llama.swift). Por defecto no incluye dependencias pesadas; la API base y los proveedores en la nube solo usan URLSession.
Si usas Xcode y aún no soporta traits en tu flujo, la solución recomendada es crear un paquete Swift interno que dependa de AnyLanguageModel con los traits requeridos, y luego agregar ese paquete al proyecto.
Extensiones pragmáticas: visión y más allá de Foundation Models
Foundation Models hoy no acepta imágenes en prompts. AnyLanguageModel toma una decisión práctica: extender la API para soportar visión-lenguaje ahora, aun cuando eso pueda diferir de la futura implementación de Apple. Ejemplo enviando una imagen a 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"))
)
Sí, existe el riesgo de que Apple cambie su API más adelante. Pero la apuesta es útil: visión-lenguaje es demasiado práctico para esperar.
Estado actual y hoja de ruta técnica
AnyLanguageModel está pre-1.0. La API central es estable, pero siguen trabajando en parity con Foundation Models y optimizaciones para todos los adaptadores. Prioridades en desarrollo:
Tool calling consistente en todos los proveedores
Integración MCP para herramientas y elicitation
Guided generation para salidas estructuradas
Optimizaciones de rendimiento para inferencia local (cuantización, uso eficiente de Neural Engine, streaming)
La visión de largo plazo es proveer una API de inferencia unificada sobre la cual construir flujos agenticos en macOS/iOS: modelos que usen herramientas, accedan recursos del sistema y completen tareas complejas.
Ejemplo práctico: chat-ui-swift
Para ver AnyLanguageModel en acción, revisa chat-ui-swift, una app SwiftUI de referencia que muestra:
Integración con Apple Intelligence (Foundation Models)
Autenticación Hugging Face para modelos con acceso restringido
Respuestas en streaming
Persistencia de chat
Forkéala, cámbiale el modelo, pruébala con MLX o llama.cpp y compara latencias y costos.
Qué significa esto para ti, desarrollador
¿Eres curioso y quieres probar modelos locales sin rehacer tu arquitectura? AnyLanguageModel te da una ruta clara. ¿Eres responsable de un producto y necesitas opciones de privacidad y costos? Puedes empezar con un proveedor en la nube y luego migrar a local sin reescribir la app.
Técnicamente, reduce la fricción de experimentación y evita que el costo de probar impida descubrir que un modelo abierto y corriendo en el dispositivo puede ser suficiente —y a veces mejor— para tu caso de uso.