Communitygithub.com

FoundationModels auf dem Gerät

Apple FoundationModels-Framework für On-Device LLM – Textgenerierung, geführte Generierung mit @Generable, Tool-Aufruf und Snapshot-Streaming in iOS 26+. Verwenden Sie dies, wenn Sie On-Device LLM-Funktionen mit Apple FoundationModels auf iOS 26+ hinzufügen.

Was ist FoundationModels auf dem Gerät?

Diese Fähigkeit bietet Entwicklern eine umfassende Anleitung zur Integration von Apples On-Device-Sprachmodell in iOS-Apps mit dem FoundationModels-Framework (iOS 26+). Sie ermöglicht Textgenerierung, strukturierte Ausgaben mit dem `@Generable`-Makro, benutzerdefinierte Tool-Aufrufe und Snapshot-Streaming – alles lokal auf dem Gerät, um Privatsphäre und Offline-Funktionalität zu gewährleisten. Die Fähigkeit ist besonders nützlich für Apps, die KI-gestützte Funktionen benötigen, ohne auf Cloud-Dienste angewiesen zu sein, z. B. für Textzusammenfassung, strukturierte Datenextraktion aus natürlicher Sprache oder Echtzeit-UI-Updates. Sie betont wichtige Entwurfsmuster wie die Verfügbarkeitsprüfung des Modells, die Verwendung von `LanguageModelSession` für Einzel- und Mehrfachdialoge, das Definieren von `@Generable`-Typen für sichere strukturierte Ausgaben und das Erstellen benutzerdefinierter Tools für domänenspezifische KI-Aktionen. Darüber hinaus behandelt sie Snapshot-Streaming für progressive UI-Updates und gibt Best Practices sowie Anti-Patterns, um häufige Fehler zu vermeiden.

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

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

FoundationModels: On-Device LLM (iOS 26)

Muster für die Integration von Apples On-Device-Sprachmodell in Apps mit dem FoundationModels-Framework. Deckt Textgenerierung, strukturierte Ausgabe mit @Generable, benutzerdefinierte Tool-Aufrufe und Snapshot-Streaming ab – alles lokal auf dem Gerät für Privatsphäre und Offline-Unterstützung.

Wann zu aktivieren

  • Erstellung KI-gestützter Funktionen mit Apple Intelligence auf dem Gerät
  • Generieren oder Zusammenfassen von Text ohne Cloud-Abhängigkeit
  • Extrahieren strukturierter Daten aus natürlicher Spracheingabe
  • Implementierung benutzerdefinierter Tool-Aufrufe für domänenspezifische KI-Aktionen
  • Streamen strukturierter Antworten für Echtzeit-UI-Updates
  • Benötigen datenschutzfreundlicher KI (keine Daten verlassen das Gerät)

Kernmuster – Verfügbarkeitsprüfung

Überprüfen Sie immer die Modellverfügbarkeit, bevor Sie eine Sitzung erstellen:

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

    var body: some View {
        switch model.availability {
        case .available:
            ContentView()
        case .unavailable(.deviceNotEligible):
            Text("Das Gerät ist nicht für Apple Intelligence berechtigt")
        case .unavailable(.appleIntelligenceNotEnabled):
            Text("Bitte aktivieren Sie Apple Intelligence in den Einstellungen")
        case .unavailable(.modelNotReady):
            Text("Das Modell wird heruntergeladen oder ist nicht bereit")
        case .unavailable(let other):
            Text("Modell nicht verfügbar: \(other)")
        }
    }
}

Kernmuster – Basissitzung

// Einmalige Antwort: jedes Mal eine neue Sitzung erstellen
let session = LanguageModelSession()
let response = try await session.respond(to: "Welcher Monat ist gut für einen Paris-Besuch?")
print(response.content)

// Mehrere Antworten: Sitzung für Gesprächskontext wiederverwenden
let session = LanguageModelSession(instructions: """
    Du bist ein Kochassistent.
    Gib Rezeptvorschläge basierend auf den Zutaten.
    Halte Vorschläge kurz und praktisch.
    """)

let first = try await session.respond(to: "Ich habe Hühnchen und Reis")
let followUp = try await session.respond(to: "Was ist mit einer vegetarischen Option?")

Wichtige Punkte für Anweisungen:

  • Definieren Sie die Rolle des Modells ("Du bist ein Mentor")
  • Geben Sie an, was zu tun ist ("Hilf, Kalendereinträge zu extrahieren")
  • Legen Sie Stilpräferenzen fest ("Antworte so kurz wie möglich")
  • Fügen Sie Sicherheitsmaßnahmen hinzu ("Antworte mit 'Das kann ich nicht helfen' bei gefährlichen Anfragen")

Kernmuster – Geführte Generierung mit @Generable

Generieren Sie strukturierte Swift-Typen anstelle von Rohstrings:

1. Definieren Sie einen @Generable-Typ

@Generable(description: "Basisprofilinformationen über eine Katze")
struct CatProfile {
    var name: String

    @Guide(description: "Das Alter der Katze", .range(0...20))
    var age: Int

    @Guide(description: "Ein Ein-Satz-Profil über die Persönlichkeit der Katze")
    var profile: String
}

2. Strukturierte Ausgabe anfordern

let response = try await session.respond(
    to: "Generiere eine süße Katze aus dem Tierheim",
    generating: CatProfile.self
)

// Direkter Zugriff auf strukturierte Felder
print("Name: \(response.content.name)")
print("Alter: \(response.content.age)")
print("Profil: \(response.content.profile)")

Unterstützte @Guide-Einschränkungen

  • .range(0...20) – numerischer Bereich
  • .count(3) – Array-Elementanzahl
  • description: – semantische Anleitung für die Generierung

Kernmuster – Tool-Aufruf

Lassen Sie das Modell benutzerdefinierten Code für domänenspezifische Aufgaben aufrufen:

1. Ein Tool definieren

struct RecipeSearchTool: Tool {
    let name = "recipe_search"
    let description = "Suche nach Rezepten, die einem bestimmten Begriff entsprechen, und gib eine Liste der Ergebnisse zurück."

    @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. Sitzung mit Tools erstellen

let session = LanguageModelSession(tools: [RecipeSearchTool()])
let response = try await session.respond(to: "Finde mir einige Pasta-Rezepte")

3. Tool-Fehler behandeln

do {
    let answer = try await session.respond(to: "Finde ein Rezept für Tomatensuppe.")
} catch let error as LanguageModelSession.ToolCallError {
    print(error.tool.name)
    if case .databaseIsEmpty = error.underlyingError as? RecipeSearchToolError {
        // Behandle spezifischen Tool-Fehler
    }
}

Kernmuster – Snapshot-Streaming

Streamen von strukturierten Antworten für Echtzeit-UI mit PartiallyGenerated-Typen:

@Generable
struct TripIdeas {
    @Guide(description: "Ideen für anstehende Reisen")
    var ideas: [String]
}

let stream = session.streamResponse(
    to: "Was sind einige aufregende Reiseideen?",
    generating: TripIdeas.self
)

for try await partial in stream {
    // partial: TripIdeas.PartiallyGenerated (alle Eigenschaften Optional)
    print(partial)
}

SwiftUI-Integration

@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
        }
    }
}

Wichtige Entwurfsentscheidungen

EntscheidungBegründung
Ausführung auf dem GerätDatenschutz – keine Daten verlassen das Gerät; funktioniert offline
4.096-Token-GrenzeEinschränkung des On-Device-Modells; große Daten auf mehrere Sitzungen aufteilen
Snapshot-Streaming (keine Deltas)Strukturierte Ausgabe-freundlich; jeder Snapshot ist ein vollständiger partieller Zustand
@Generable-MakroKompilierzeit-Sicherheit für strukturierte Generierung; generiert automatisch PartiallyGenerated-Typ
Einzelanfrage pro SitzungisResponding verhindert gleichzeitige Anfragen; bei Bedarf mehrere Sitzungen erstellen
response.content (nicht .output)Korrekte API – Ergebnisse immer über die .content-Eigenschaft abrufen

Best Practices

  • Überprüfen Sie immer model.availability vor dem Erstellen einer Sitzung – behandeln Sie alle Nichtverfügbarkeitsfälle
  • Verwenden Sie instructions um das Modellverhalten zu steuern – sie haben Vorrang vor Aufforderungen
  • Überprüfen Sie isResponding bevor Sie eine neue Anfrage senden – Sitzungen bearbeiten eine Anfrage gleichzeitig
  • Greifen Sie auf response.content für Ergebnisse zu – nicht auf .output
  • Teilen Sie große Eingaben in Blöcke auf – die 4.096-Token-Grenze gilt für Anweisungen + Aufforderung + Ausgabe zusammen
  • Verwenden Sie @Generable für strukturierte Ausgaben – stärkere Garantien als das Parsen von Rohstrings
  • Verwenden Sie GenerationOptions(temperature:) um die Kreativität anzupassen (höher = kreativer)
  • Überwachen Sie mit Instruments – verwenden Sie Xcode Instruments, um die Anforderungsleistung zu profilieren

Anti-Patterns zu vermeiden

  • Sitzungen erstellen, ohne zuerst model.availability zu überprüfen
  • Eingaben senden, die das 4.096-Token-Kontextfenster überschreiten
  • Gleichzeitige Anfragen an eine einzelne Sitzung versuchen
  • .output anstelle von .content verwenden, um auf Antwortdaten zuzugreifen
  • Rohstring-Antworten parsen, wenn strukturierte Ausgabe mit @Generable funktionieren würde
  • Komplexe mehrstufige Logik in einer einzigen Aufforderung aufbauen – in mehrere fokussierte Aufforderungen aufteilen
  • Annehmen, dass das Modell immer verfügbar ist – Geräteberechtigung und -einstellungen variieren

Wann zu verwenden

  • On-Device-Textgenerierung für datenschutzsensible Apps
  • Strukturierte Datenextraktion aus Benutzereingaben (Formulare, natürliche Sprachbefehle)
  • KI-gestützte Funktionen, die offline funktionieren müssen
  • Streaming-UI, die generierte Inhalte schrittweise anzeigt
  • Domänenspezifische KI-Aktionen über Tool-Aufrufe (Suche, Berechnung, Nachschlagewerk)

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.

Verwandte Skills