Communitygithub.com

ModelosFundamentoEnDispositivo

Framework FoundationModels de Apple para LLM en el dispositivo — generación de texto, generación guiada con @Generable, llamadas a herramientas y transmisión de instantáneas en iOS 26+. Úsalo al agregar funciones LLM en el dispositivo con FoundationModels en iOS 26+.

¿Qué es ModelosFundamentoEnDispositivo?

Esta habilidad proporciona patrones para integrar el modelo de lenguaje local de Apple en aplicaciones iOS 26+ utilizando el framework FoundationModels. Cubre cuatro patrones clave: verificación de disponibilidad del modelo, creación de sesiones básicas (de un solo turno o multi-turno con instrucciones), generación estructurada con el macro `@Generable` para obtener tipos Swift directamente (con guías opcionales), y llamadas a herramientas personalizadas para acciones específicas del dominio. También incluye transmisión de instantáneas con tipos parcialmente generados para actualizaciones de UI en tiempo real. Toda la ejecución ocurre en el dispositivo, garantizando privacidad y funcionamiento sin conexión. La habilidad detalla consideraciones como el límite de 4,096 tokens, la necesidad de verificar `model.availability` antes de usar, y cómo evitar anti-patrones como enviar peticiones concurrentes a una misma sesión o usar `.output` en lugar de `.content`. Es compatible con Swift 6+ y Xcode 16+ para proyectos que implementen Apple Intelligence.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/foundation-models-on-device

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

FoundationModels: LLM en el Dispositivo (iOS 26)

Patrones para integrar el modelo de lenguaje local de Apple en aplicaciones utilizando el framework FoundationModels. Cubre generación de texto, salida estructurada con @Generable, llamadas a herramientas personalizadas y transmisión de instantáneas, todo ejecutándose en el dispositivo para garantizar privacidad y soporte sin conexión.

Cuándo Activarlo

  • Construir funciones potenciadas por IA usando Apple Intelligence en el dispositivo
  • Generar o resumir texto sin dependencia de la nube
  • Extraer datos estructurados a partir de entrada en lenguaje natural
  • Implementar llamadas a herramientas personalizadas para acciones de IA específicas del dominio
  • Transmitir respuestas estructuradas para actualizaciones de UI en tiempo real
  • Necesitar IA que preserve la privacidad (ningún dato sale del dispositivo)

Patrón Principal — Verificación de Disponibilidad

Siempre verifica la disponibilidad del modelo antes de crear una sesión:

struct GenerativeView: View {
    private var model = SystemLanguageModel.default

    var body: some View {
        switch model.availability {
        case .available:
            ContentView()
        case .unavailable(.deviceNotEligible):
            Text("Dispositivo no elegible para Apple Intelligence")
        case .unavailable(.appleIntelligenceNotEnabled):
            Text("Activa Apple Intelligence en Ajustes")
        case .unavailable(.modelNotReady):
            Text("El modelo se está descargando o no está listo")
        case .unavailable(let other):
            Text("Modelo no disponible: \(other)")
        }
    }
}

Patrón Principal — Sesión Básica

// Una sola interacción: crea una nueva sesión cada vez
let session = LanguageModelSession()
let response = try await session.respond(to: "¿Cuál es un buen mes para visitar París?")
print(response.content)

// Múltiples interacciones: reutiliza la sesión para mantener contexto conversacional
let session = LanguageModelSession(instructions: """
    Eres un asistente de cocina.
    Proporciona sugerencias de recetas basadas en los ingredientes.
    Mantén las sugerencias breves y prácticas.
    """)

let first = try await session.respond(to: "Tengo pollo y arroz")
let followUp = try await session.respond(to: "¿Qué tal una opción vegetariana?")

Puntos clave para las instrucciones:

  • Define el rol del modelo ("Eres un mentor")
  • Especifica qué hacer ("Ayuda a extraer eventos del calendario")
  • Establece preferencias de estilo ("Responde lo más breve posible")
  • Añade medidas de seguridad ("Responde con 'No puedo ayudar con eso' para solicitudes peligrosas")

Patrón Principal — Generación Guiada con @Generable

Genera tipos Swift estructurados en lugar de cadenas de texto sin procesar:

1. Define un Tipo Generable

@Generable(description: "Información básica de perfil sobre un gato")
struct CatProfile {
    var name: String

    @Guide(description: "La edad del gato", .range(0...20))
    var age: Int

    @Guide(description: "Un perfil de una oración sobre la personalidad del gato")
    var profile: String
}

2. Solicita Salida Estructurada

let response = try await session.respond(
    to: "Genera un gato de rescate adorable",
    generating: CatProfile.self
)

// Accede directamente a los campos estructurados
print("Nombre: \(response.content.name)")
print("Edad: \(response.content.age)")
print("Perfil: \(response.content.profile)")

Restricciones de @Guide Compatibles

  • .range(0...20) — rango numérico
  • .count(3) — cantidad de elementos en un array
  • description: — guía semántica para la generación

Patrón Principal — Llamada a Herramientas

Permite que el modelo invoque código personalizado para tareas específicas del dominio:

1. Define una Herramienta

struct RecipeSearchTool: Tool {
    let name = "recipe_search"
    let description = "Busca recetas que coincidan con un término dado y devuelve una lista de resultados."

    @Generable
    struct Arguments {
        var searchTerm: String
        var numberOfResults: Int
    }

    func call(arguments: Arguments) async throws -> ToolOutput {
        let recipes = await searchRecipes(
            term: arguments.searchTerm,
            limit: arguments.numberOfResults
        )
        return .string(recipes.map { "- \($0.name): \($0.description)" }.joined(separator: "\n"))
    }
}

2. Crea una Sesión con Herramientas

let session = LanguageModelSession(tools: [RecipeSearchTool()])
let response = try await session.respond(to: "Búscame algunas recetas de pasta")

3. Maneja Errores de Herramientas

do {
    let answer = try await session.respond(to: "Encuentra una receta de sopa de tomate.")
} catch let error as LanguageModelSession.ToolCallError {
    print(error.tool.name)
    if case .databaseIsEmpty = error.underlyingError as? RecipeSearchToolError {
        // Maneja el error específico de la herramienta
    }
}

Patrón Principal — Transmisión de Instantáneas

Transmite respuestas estructuradas para UI en tiempo real con tipos PartiallyGenerated:

@Generable
struct TripIdeas {
    @Guide(description: "Ideas para próximos viajes")
    var ideas: [String]
}

let stream = session.streamResponse(
    to: "¿Cuáles son algunas ideas de viaje emocionantes?",
    generating: TripIdeas.self
)

for try await partial in stream {
    // partial: TripIdeas.PartiallyGenerated (todas las propiedades Optional)
    print(partial)
}

Integración con SwiftUI

@State private var partialResult: TripIdeas.PartiallyGenerated?
@State private var errorMessage: String?

var body: some View {
    List {
        ForEach(partialResult?.ideas ?? [], id: \.self) { idea in
            Text(idea)
        }
    }
    .overlay {
        if let errorMessage { Text(errorMessage).foregroundStyle(.red) }
    }
    .task {
        do {
            let stream = session.streamResponse(to: prompt, generating: TripIdeas.self)
            for try await partial in stream {
                partialResult = partial
            }
        } catch {
            errorMessage = error.localizedDescription
        }
    }
}

Decisiones de Diseño Clave

DecisiónJustificación
Ejecución en el dispositivoPrivacidad — ningún dato sale del dispositivo; funciona sin conexión
Límite de 4,096 tokensRestricción del modelo en el dispositivo; divide datos grandes en varias sesiones
Transmisión de instantáneas (no deltas)Amigable con salida estructurada; cada instantánea es un estado parcial completo
Macro @GenerableSeguridad en tiempo de compilación para generación estructurada; genera automáticamente el tipo PartiallyGenerated
Una solicitud por sesiónisResponding evita solicitudes concurrentes; crea varias sesiones si es necesario
response.content (no .output)API correcta — siempre accede a los resultados mediante la propiedad .content

Mejores Prácticas

  • Siempre verifica model.availability antes de crear una sesión — maneja todos los casos de no disponibilidad
  • Usa instructions para guiar el comportamiento del modelo — tienen prioridad sobre las indicaciones
  • Verifica isResponding antes de enviar una nueva solicitud — las sesiones manejan una solicitud a la vez
  • Accede a response.content para los resultados — no a .output
  • Divide entradas grandes en fragmentos — el límite de 4,096 tokens se aplica a instrucciones + indicación + salida combinados
  • Usa @Generable para salida estructurada — garantías más fuertes que analizar cadenas sin procesar
  • Usa GenerationOptions(temperature:) para ajustar la creatividad (valores más altos = más creativo)
  • Monitorea con Instruments — usa Instruments de Xcode para perfilar el rendimiento de las solicitudes

Anti-Patrones a Evitar

  • Crear sesiones sin verificar primero model.availability
  • Enviar entradas que excedan la ventana de contexto de 4,096 tokens
  • Intentar solicitudes concurrentes en una sola sesión
  • Usar .output en lugar de .content para acceder a los datos de respuesta
  • Analizar respuestas de cadena sin procesar cuando la salida estructurada con @Generable funcionaría
  • Construir lógica compleja de múltiples pasos en una sola indicación — divídela en varias indicaciones enfocadas
  • Asumir que el modelo siempre está disponible — la elegibilidad del dispositivo y la configuración varían

Cuándo Usarlo

  • Generación de texto en el dispositivo para aplicaciones sensibles a la privacidad
  • Extracción de datos estructurados a partir de entrada del usuario (formularios, comandos en lenguaje natural)
  • Funciones asistidas por IA que deben funcionar sin conexión
  • UI que transmite y muestra contenido generado progresivamente
  • Acciones de IA específicas del dominio mediante llamadas a herramientas (búsqueda, cómputo, consulta)

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Skills relacionados