Section 13/141 menit

13. Real Use Cases

13. Real Use Cases

Use Case 1: Multi-Agent Document Processing Pipeline

Pipeline yang menggunakan beberapa session dengan spesialisasi berbeda untuk memproses dokumen kompleks.

swift
import FoundationModels

// Setiap "agent" adalah session dengan instruksi spesifik
actor DocumentProcessingPipeline {
    // Agent 1: Ekstraksi struktur dokumen
    private let structureAgent = LanguageModelSession(
        instructions: Instructions("""
        Kamu spesialis mengidentifikasi struktur dokumen.
        Ekstrak: judul, seksi, dan hierarki konten.
        Jangan menganalisis konten — hanya struktur.
        """)
    )

    // Agent 2: Analisis konten per seksi
    private let contentAgent = LanguageModelSession(
        instructions: Instructions("""
        Kamu analis konten teknis.
        Beri rating kompleksitas dan identifikasi konsep kunci.
        Respons singkat dan terstruktur.
        """)
    )

    // Agent 3: Quality check dan summary akhir
    private let qcAgent = LanguageModelSession(
        instructions: Instructions("""
        Kamu quality assurance untuk analisis dokumen.
        Verifikasi konsistensi analisis dan buat summary eksekutif.
        """)
    )

    @Generable
    struct DocumentStructure {
        @Guide(description: "Judul dokumen")
        var title: String
        @Guide(description: "Daftar nama seksi utama")
        var sections: [String]
        @Guide(description: "Tipe dokumen: technical, business, legal, atau educational")
        var documentType: String
    }

    @Generable
    struct SectionAnalysis {
        @Guide(description: "Nama seksi")
        var sectionName: String
        @Guide(description: "Konsep kunci yang dibahas, maksimal 4")
        var keyConcepts: [String]
        @Guide(description: "Kompleksitas: beginner, intermediate, atau advanced")
        var complexity: String
    }

    @Generable
    struct ProcessedDocument {
        @Guide(description: "Judul dokumen")
        var title: String
        @Guide(description: "Ringkasan eksekutif 2-3 kalimat")
        var executiveSummary: String
        @Guide(description: "Skor kualitas keseluruhan dari 1 sampai 10")
        var qualityScore: Int
        @Guide(description: "Rekomendasi pembaca target")
        var targetAudience: String
    }

    func process(document: String) async throws -> ProcessedDocument {
        // Step 1: Ekstrak struktur
        let structure = try await structureAgent.respond(
            to: "Analisis struktur dokumen:\n\n\(document.truncatedForAI(maxCharacters: 2000))",
            generating: DocumentStructure.self
        ).content

        // Step 2: Analisis setiap seksi (paralel untuk performa)
        var sectionAnalyses: [SectionAnalysis] = []
        try await withThrowingTaskGroup(of: SectionAnalysis.self) { group in
            for section in structure.sections.prefix(5) {
                group.addTask {
                    // Session baru per analisis — stateless untuk task ini
                    let session = LanguageModelSession(
                        instructions: Instructions("Kamu analis konten teknis. Respons singkat dan terstruktur.")
                    )
                    return try await session.respond(
                        to: "Analisis seksi '\(section)' dari dokumen \(structure.documentType):",
                        generating: SectionAnalysis.self
                    ).content
                }
            }
            for try await analysis in group {
                sectionAnalyses.append(analysis)
            }
        }

        // Step 3: QC dan final summary
        let analysisContext = sectionAnalyses.map {
            "Seksi '\($0.sectionName)': \($0.keyConcepts.joined(separator: ", ")), level \($0.complexity)"
        }.joined(separator: "\n")

        return try await qcAgent.respond(
            to: """
            Buat laporan akhir untuk dokumen '\(structure.title)'.
            Tipe: \(structure.documentType)
            Analisis seksi:\n\(analysisContext)
            """,
            generating: ProcessedDocument.self
        ).content
    }
}

Use Case 2: Smart Form Completion dengan Validation Loop

AI yang membantu pengguna melengkapi form kompleks, dengan loop validasi sampai data valid.

swift
import FoundationModels

@Generable
struct ExtractedFormData {
    @Guide(description: "Nama lengkap dari teks pengguna")
    var fullName: String

    @Guide(description: "Tanggal lahir dalam format YYYY-MM-DD, nil jika tidak disebutkan")
    var birthDate: String?

    @Guide(description: "Nomor KTP 16 digit, nil jika tidak ada")
    var nationalId: String?

    @Guide(description: "Kota domisili saat ini")
    var city: String

    @Guide(description: "Pekerjaan atau profesi")
    var occupation: String

    @Guide(description: "Field yang masih kosong atau tidak jelas yang perlu ditanyakan ke user")
    var missingFields: [String]
}

@Observable
class SmartFormViewModel {
    var userNarrative = ""
    var extractedData: ExtractedFormData?
    var clarificationQuestion = ""
    var isProcessing = false

    private let session = LanguageModelSession(
        instructions: Instructions("""
        Kamu membantu mengisi formulir registrasi dari deskripsi pengguna.
        Ekstrak informasi sebanyak mungkin dari narasi.
        Identifikasi field yang masih kurang untuk ditanyakan.
        Gunakan bahasa yang ramah dan natural saat meminta klarifikasi.
        """)
    )

    func processNarrative() async {
        guard !userNarrative.trimmingCharacters(in: .whitespaces).isEmpty else { return }
        isProcessing = true
        defer { isProcessing = false }

        do {
            // Ekstrak data dari narasi
            let extracted = try await session.respond(
                to: "Ekstrak data formulir dari narasi pengguna:\n\"\(userNarrative)\"",
                generating: ExtractedFormData.self
            ).content
            extractedData = extracted

            // Jika ada field kosong, minta klarifikasi
            if !extracted.missingFields.isEmpty {
                clarificationQuestion = try await session.respond(
                    to: "Buat satu pertanyaan natural untuk mendapatkan: \(extracted.missingFields.joined(separator: " dan "))"
                ).content
            }
        } catch {
            clarificationQuestion = "Maaf, terjadi kesalahan. Bisa ceritakan ulang informasi Anda?"
        }
    }

    func submitClarification(_ answer: String) async {
        userNarrative += " \(answer)"
        await processNarrative()
    }
}

Use Case 3: AI-Powered Code Review Assistant dengan Context Awareness

Code review assistant yang membangun konteks tentang codebase seiring waktu dalam satu session.

swift
import FoundationModels

@Generable
enum IssueSeverity: String {
    case critical, warning, suggestion, info
}

@Generable
struct CodeIssue {
    @Guide(description: "Deskripsi masalah yang ditemukan")
    var description: String

    @Guide(description: "Tingkat keparahan")
    var severity: IssueSeverity

    @Guide(description: "Baris atau fungsi yang bermasalah")
    var location: String

    @Guide(description: "Saran perbaikan konkret")
    var suggestion: String
}

@Generable
struct CodeReview {
    @Guide(description: "Daftar masalah yang ditemukan, kosong jika tidak ada")
    var issues: [CodeIssue]

    @Guide(description: "Poin positif dari kode yang sudah baik")
    var positives: [String]

    @Guide(description: "Skor kualitas keseluruhan 1-10")
    var score: Int

    @Guide(description: "Apakah kode siap untuk review lanjut atau perlu revisi dulu")
    var readyForMerge: Bool
}

actor CodeReviewSession {
    private let session: LanguageModelSession
    private var reviewedFiles: [String] = []

    init(projectContext: String) {
        session = LanguageModelSession(
            instructions: Instructions("""
            Kamu senior Swift/iOS engineer melakukan code review.
            Konteks project: \(projectContext)
            
            Fokus pada: Swift best practices, memory safety, concurrency, performance.
            Berikan feedback yang konstruktif dan actionable.
            Ingat file-file yang sudah kamu review untuk konsistensi.
            """)
        )
    }

    func review(fileName: String, code: String) async throws -> CodeReview {
        reviewedFiles.append(fileName)

        let context = reviewedFiles.count > 1
            ? "File yang sudah direviu sebelumnya: \(reviewedFiles.dropLast().joined(separator: ", "))\n\n"
            : ""

        return try await session.respond(
            to: "\(context)Review file '\(fileName)':\n\n```swift\n\(code)\n```",
            generating: CodeReview.self
        ).content
    }

    func askFollowUp(question: String) async throws -> String {
        try await session.respond(to: question).content
    }

    func generateConsolidatedReport() async throws -> String {
        let files = reviewedFiles.joined(separator: ", ")
        return try await session.respond(
            to: "Buat laporan konsolidasi dari semua file yang sudah direviu (\(files)). Highlight pattern masalah yang berulang dan rekomendasi prioritas."
        ).content
    }
}

// Penggunaan
let reviewer = CodeReviewSession(projectContext: "App e-commerce iOS dengan SwiftUI + SwiftData")

let reviewResult1 = try await reviewer.review(
    fileName: "CartViewModel.swift",
    code: cartViewModelCode
)

let reviewResult2 = try await reviewer.review(
    fileName: "CheckoutService.swift",
    code: checkoutServiceCode
)

// Session ingat konteks dari review sebelumnya
let followUp = try await reviewer.askFollowUp(
    "Apakah CartViewModel dan CheckoutService sudah thread-safe secara konsisten?"
)

let finalReport = try await reviewer.generateConsolidatedReport()