Section 7/151 menit

7. Tool Calling

7. Tool Calling

Tool calling memungkinkan model memanggil kode Swift Anda untuk mendapatkan data real-time atau melakukan aksi sebelum memberikan jawaban akhir.

Mendefinisikan Tool

swift
import FoundationModels

// Tool mengambil data cuaca
struct WeatherTool: Tool {
    // Nama yang dikenali model
    let name = "get_current_weather"
    let description = "Mengambil informasi cuaca terkini untuk sebuah kota"

    // Argumen yang diberikan model ke tool — harus @Generable
    @Generable
    struct Arguments {
        @Guide(description: "Nama kota dalam bahasa Inggris, contoh: Jakarta, Surabaya")
        var city: String

        @Guide(description: "Satuan suhu: celsius atau fahrenheit")
        var unit: String
    }

    // Implementasi tool — dipanggil oleh framework saat model meminta
    func call(arguments: Arguments) async throws -> ToolOutput {
        // Dalam implementasi nyata: fetch dari weather API
        let fakeWeather = "Cerah, \(25)°\(arguments.unit == "celsius" ? "C" : "F")"
        return ToolOutput("Cuaca di \(arguments.city): \(fakeWeather)")
    }
}

Session dengan Tools

swift
// Buat session dengan tools yang tersedia
let weatherSession = LanguageModelSession(tools: [WeatherTool()])

// Model akan otomatis memanggil WeatherTool jika diperlukan
let response = try await weatherSession.respond(
    to: "Apakah cuaca di Bali cocok untuk surfing hari ini?"
)
print(response.content)
// Model memanggil get_current_weather(city: "Bali", unit: "celsius")
// lalu merangkai jawaban berdasarkan data cuaca yang dikembalikan

Multiple Tools

swift
struct CalendarTool: Tool {
    let name = "get_calendar_events"
    let description = "Mengambil jadwal/event dari kalender pengguna"

    @Generable
    struct Arguments {
        @Guide(description: "Tanggal dalam format YYYY-MM-DD")
        var date: String
    }

    func call(arguments: Arguments) async throws -> ToolOutput {
        // Fetch dari EventKit dalam implementasi nyata
        return ToolOutput("Jadwal untuk \(arguments.date): Rapat tim pukul 09:00, Makan siang pukul 12:00")
    }
}

struct ReminderTool: Tool {
    let name = "create_reminder"
    let description = "Membuat pengingat baru untuk pengguna"

    @Generable
    struct Arguments {
        @Guide(description: "Teks pengingat")
        var text: String

        @Guide(description: "Waktu pengingat dalam format HH:mm")
        var time: String
    }

    func call(arguments: Arguments) async throws -> ToolOutput {
        // Simpan ke EventKit / UserNotifications dalam implementasi nyata
        return ToolOutput("Pengingat '\(arguments.text)' berhasil dibuat untuk pukul \(arguments.time)")
    }
}

// Session asisten personal dengan banyak tools
let personalAssistantSession = LanguageModelSession(
    tools: [WeatherTool(), CalendarTool(), ReminderTool()]
)

let response = try await personalAssistantSession.respond(
    to: "Lihat jadwalku besok dan ingatkan saya 30 menit sebelum rapat pertama"
)
print(response.content)