Communitygithub.com

FoundationModels no dispositivo

Framework FoundationModels da Apple para LLM no dispositivo — geração de texto, geração guiada com @Generable, chamada de ferramentas e streaming de instantâneos no iOS 26+. Use ao adicionar recursos de LLM no dispositivo com FoundationModels da Apple no iOS 26+.

O que é FoundationModels no dispositivo?

Este skill fornece padrões para integrar o modelo de linguagem no dispositivo da Apple em aplicativos usando o framework FoundationModels. Ele abrange verificação de disponibilidade, criação de sessões, geração estruturada com o macro `@Generable`, chamada de ferramentas personalizadas e streaming de instantâneos para interfaces de usuário em tempo real, tudo executado localmente no dispositivo para garantir privacidade e suporte offline. O skill é útil para desenvolvedores que criam recursos com IA usando Apple Intelligence, necessitando de geração ou sumarização de texto sem dependência de nuvem, extração de dados estruturados de linguagem natural, ou implementação de ações de IA específicas de domínio. Ele suporta o iOS 26+ e as plataformas da Apple, e seu funcionamento é baseado na criação de sessões do `LanguageModelSession`, disponibilidade via `SystemLanguageModel.default`, e uso do macro `@Generable` para tipos Swift com segurança de compilação. As decisões de design-chave incluem execução no dispositivo, limite de 4.096 tokens, streaming de instantâneos (não deltas) e restrição de uma requisição por sessão, garantindo boas práticas como sempre verificar `model.availability` e acessar resultados via `response.content`.

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

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

FoundationModels: LLM no Dispositivo (iOS 26)

Padrões para integrar o modelo de linguagem no dispositivo da Apple em aplicativos usando o framework FoundationModels. Abrange geração de texto, saída estruturada com @Generable, chamada de ferramentas personalizada e streaming de instantâneos — tudo executado no dispositivo para privacidade e suporte offline.

Quando Ativar

  • Construindo recursos com tecnologia de IA usando Apple Intelligence no dispositivo
  • Gerando ou sumarizando texto sem dependência de nuvem
  • Extraindo dados estruturados de entrada de linguagem natural
  • Implementando chamada de ferramentas personalizada para ações de IA específicas de domínio
  • Transmitindo respostas estruturadas para atualizações de UI em tempo real
  • Necessidade de IA que preserva a privacidade (nenhum dado sai do dispositivo)

Padrão Principal — Verificação de Disponibilidade

Sempre verifique a disponibilidade do modelo antes de criar uma sessão:

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

    var body: some View {
        switch model.availability {
        case .available:
            ContentView()
        case .unavailable(.deviceNotEligible):
            Text("Dispositivo não elegível para Apple Intelligence")
        case .unavailable(.appleIntelligenceNotEnabled):
            Text("Por favor, ative Apple Intelligence em Ajustes")
        case .unavailable(.modelNotReady):
            Text("O modelo está baixando ou não está pronto")
        case .unavailable(let other):
            Text("Modelo indisponível: \(other)")
        }
    }
}

Padrão Principal — Sessão Básica

// Turno único: cria uma nova sessão a cada vez
let session = LanguageModelSession()
let response = try await session.respond(to: "Qual é um bom mês para visitar Paris?")
print(response.content)

// Vários turnos: reutiliza sessão para contexto de conversa
let session = LanguageModelSession(instructions: """
    Você é um assistente de culinária.
    Forneça sugestões de receitas com base nos ingredientes.
    Mantenha as sugestões breves e práticas.
    """)

let first = try await session.respond(to: "Tenho frango e arroz")
let followUp = try await session.respond(to: "E uma opção vegetariana?")

Pontos-chave para instruções:

  • Defina o papel do modelo ("Você é um mentor")
  • Especifique o que fazer ("Ajude a extrair eventos de calendário")
  • Defina preferências de estilo ("Responda da forma mais breve possível")
  • Adicione medidas de segurança ("Responda com 'Não posso ajudar com isso' para solicitações perigosas")

Padrão Principal — Geração Guiada com @Generable

Gere tipos Swift estruturados em vez de strings brutas:

1. Defina um Tipo Generable

@Generable(description: "Informações básicas de perfil sobre um gato")
struct CatProfile {
    var name: String

    @Guide(description: "A idade do gato", .range(0...20))
    var age: Int

    @Guide(description: "Um perfil de uma frase sobre a personalidade do gato")
    var profile: String
}

2. Solicite Saída Estruturada

let response = try await session.respond(
    to: "Gere um gato de resgate fofo",
    generating: CatProfile.self
)

// Acesse campos estruturados diretamente
print("Nome: \(response.content.name)")
print("Idade: \(response.content.age)")
print("Perfil: \(response.content.profile)")

Restrições @Guide Suportadas

  • .range(0...20) — intervalo numérico
  • .count(3) — número de elementos do array
  • description: — orientação semântica para geração

Padrão Principal — Chamada de Ferramentas

Permita que o modelo invoque código personalizado para tarefas específicas de domínio:

1. Defina uma Ferramenta

struct RecipeSearchTool: Tool {
    let name = "recipe_search"
    let description = "Pesquise receitas correspondentes a um termo dado e retorne uma 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. Crie Sessão com Ferramentas

let session = LanguageModelSession(tools: [RecipeSearchTool()])
let response = try await session.respond(to: "Encontre algumas receitas de massa")

3. Trate Erros de Ferramenta

do {
    let answer = try await session.respond(to: "Encontre uma receita de sopa de tomate.")
} catch let error as LanguageModelSession.ToolCallError {
    print(error.tool.name)
    if case .databaseIsEmpty = error.underlyingError as? RecipeSearchToolError {
        // Trata erro específico da ferramenta
    }
}

Padrão Principal — Streaming de Instantâneos

Transmita respostas estruturadas para UI em tempo real com tipos PartiallyGenerated:

@Generable
struct TripIdeas {
    @Guide(description: "Ideias para próximas viagens")
    var ideas: [String]
}

let stream = session.streamResponse(
    to: "Quais são algumas ideias de viagem empolgantes?",
    generating: TripIdeas.self
)

for try await partial in stream {
    // partial: TripIdeas.PartiallyGenerated (todas as propriedades Opcionais)
    print(partial)
}

Integração com 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
        }
    }
}

Principais Decisões de Design

DecisãoJustificativa
Execução no dispositivoPrivacidade — nenhum dado sai do dispositivo; funciona offline
Limite de 4.096 tokensRestrição do modelo no dispositivo; divida dados grandes entre sessões
Streaming de instantâneos (não deltas)Amigável a saída estruturada; cada instantâneo é um estado parcial completo
Macro @GenerableSegurança em tempo de compilação para geração estruturada; gera automaticamente o tipo PartiallyGenerated
Requisição única por sessãoisResponding previne requisições concorrentes; crie várias sessões se necessário
response.content (não .output)API correta — sempre acesse resultados via propriedade .content

Melhores Práticas

  • Sempre verifique model.availability antes de criar uma sessão — trate todos os casos de indisponibilidade
  • Use instructions para guiar o comportamento do modelo — elas têm prioridade sobre as solicitações
  • Verifique isResponding antes de enviar uma nova requisição — sessões tratam uma requisição por vez
  • Acesse response.content para resultados — não .output
  • Divida entradas grandes em partes — o limite de 4.096 tokens se aplica a instruções + solicitação + saída combinados
  • Use @Generable para saída estruturada — garantias mais fortes do que analisar strings brutas
  • Use GenerationOptions(temperature:) para ajustar criatividade (maior = mais criativo)
  • Monitore com Instruments — use Instruments do Xcode para analisar o desempenho da requisição

Anti-Padrões a Evitar

  • Criar sessões sem verificar model.availability primeiro
  • Enviar entradas que excedem a janela de contexto de 4.096 tokens
  • Tentar requisições concorrentes em uma única sessão
  • Usar .output em vez de .content para acessar dados de resposta
  • Analisar respostas de string bruta quando saída estruturada com @Generable funcionaria
  • Construir lógica complexa de várias etapas em uma única solicitação — divida em várias solicitações focadas
  • Assumir que o modelo está sempre disponível — elegibilidade do dispositivo e configurações variam

Quando Usar

  • Geração de texto no dispositivo para aplicativos sensíveis à privacidade
  • Extração de dados estruturados de entrada do usuário (formulários, comandos em linguagem natural)
  • Recursos assistidos por IA que devem funcionar offline
  • UI de streaming que mostra progressivamente conteúdo gerado
  • Ações de IA específicas de domínio via chamada de ferramentas (busca, computação, 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.

Habilidades Relacionadas