Diterbitkan: 12 Juni 2026 | Waktu Baca: 7 menit | Kategori: Salesforce


TL;DR

Membangun Agen Layanan Agentforce untuk menangkap prospek memerlukan penanganan manajemen status multi-giliran secara aman. Meskipun Alur standar bagus untuk tugas sederhana, menggunakan @InvocableMethod Apex memungkinkan pelacakan status persisten di seluruh giliran percakapan dan operasi DML USER_MODE yang aman. Berikut adalah cara membangunnya.


Pendahuluan: Era Agentforce

Salesforce Agentforce telah sepenuhnya mengubah cara kita memikirkan interaksi pelanggan otomatis. Kita beralih dari chatbot berbasis pohon yang kaku ke agen otonom yang dapat bernalar, mengajukan pertanyaan klarifikasi, dan menjalankan tindakan.

Salah satu kasus penggunaan awal yang paling umum untuk Agentforce adalah Penangkapan Prospek. Tujuannya sederhana: agen AI meminta informasi pengguna (misalnya, Nama Belakang dan Perusahaan), menyimpan informasi tersebut di berbagai giliran percakapan, dan membuat catatan Prospek Salesforce setelah semua data yang diperlukan terkumpul.

Meskipun Anda dapat mencoba ini dengan alur layar atau alur yang diluncurkan secara otomatis, tindakan yang dapat dipanggil Apex memberikan kontrol yang jauh lebih besar atas manajemen status dan konteks keamanan.

Berikut adalah cetak biru yang tepat untuk Agen Penangkapan Prospek siap produksi di tahun 2026.


Arsitektur

Solusi kami memerlukan tiga komponen inti:

  1. Router Agen (start_agent): Menyambut pengguna dan mengarahkannya ke subagen yang benar berdasarkan maksud.
  2. Subagen Penangkapan Prospek (subagent): Menginstruksikan LLM tentang bidang apa saja yang diperlukan (Nama Belakang dan Perusahaan) dan memicu tindakan.
  3. Tindakan yang Dapat Dipanggil Apex (@InvocableMethod): "Mesin" sebenarnya yang mengurai masukan, menyimpan status, dan melakukan penyisipan basis data.

1. DSL Skrip Agen

Agentforce menggunakan Bahasa Khusus Domain (DSL) tertentu untuk mendefinisikan perilaku agen. Kita mendefinisikan variabel untuk menyimpan masukan pengguna di seluruh giliran.

variables:
    last_name: mutable string = ""
        description: "Nama belakang prospek"
    company: mutable string = ""
        description: "Perusahaan prospek"
    lead_created: mutable boolean = False
        description: "Apakah prospek sudah dibuat"
    last_lead_id: mutable string = ""
        description: "ID Prospek yang terakhir dibuat"

Logika untuk subagen kita menentukan bahwa untuk setiap pesan yang dikirim pengguna saat berada dalam topik penangkapan prospek, kita memanggil tindakan Apex kita. Kita meneruskan userMessage saat ini, bersama dengan variabel last_name dan company yang telah kita kumpulkan sejauh ini.

subagent lead_capture:
    label: "Penangkapan Prospek"
    description: "Kumpulkan nama belakang dan perusahaan, lalu buat Prospek Salesforce melalui Apex."
    reasoning:
        instructions: ->
            if @variables.lead_created == True:
                | Prospek sudah dibuat dalam percakapan ini. Bagikan ID Prospek dan tanyakan apakah pengguna menginginkan hal lain.
            if @variables.lead_created == False:
                | Gunakan Proses Giliran Penangkapan Prospek untuk setiap pesan penangkapan prospek.
        actions:
            process_lead_turn: @actions.process_lead_turn
                    with userMessage = ...
                    with knownLastName = @variables.last_name
                    with knownCompany = @variables.company
                    set @variables.last_name = @outputs.resolvedLastName
                    set @variables.company = @outputs.resolvedCompany
                    set @variables.lead_created = @outputs.isSuccess
                    set @variables.last_lead_id = @outputs.leadId

2. Tindakan yang Dapat Dipanggil Apex

Kekuatan sebenarnya dari pola ini terletak pada kelas Apex. Alih-alih meminta LLM menebak kapan harus membuat prospek, kita menggunakan tindakan yang dapat dipanggil untuk mengelola logika bisnis secara aman.

Mengapa Apex daripada Alur?

  • Status Multi-giliran: Dengan meneruskan knownLastName dan knownCompany ke tindakan Apex, dan mengembalikan resolvedLastName dan resolvedCompany, kita mempertahankan status percakapan dengan sempurna, bahkan jika pengguna memberikan informasi secara tidak berurutan.
  • Konteks Keamanan: Kita dapat menegakkan izin Keamanan Tingkat Bidang (FLS) dan CRUD secara dinamis menggunakan AccessLevel.USER_MODE.

Berikut adalah struktur variabel masukan dan keluaran:

public class LeadCaptureTurnAction {
    
    public class Request {
        @InvocableVariable(required=true label='Pesan Pengguna')
        public String userMessage;
        
        @InvocableVariable(label='Nama Belakang yang Diketahui')
        public String knownLastName;
        
        @InvocableVariable(label='Perusahaan yang Diketahui')
        public String knownCompany;
    }
    
    public class Result {
        @InvocableVariable(label='Berhasil')
        public Boolean isSuccess;
        
        @InvocableVariable(label='ID Prospek')
        public String leadId; // GOTCHA: Harus String, bukan Id
        
        @InvocableVariable(label='Nama Belakang yang Diselesaikan')
        public String resolvedLastName;
        
        @InvocableVariable(label='Perusahaan yang Diselesaikan')
        public String resolvedCompany;
        
        @InvocableVariable(label='Pesan')
        public String message;
    }
    
    @InvocableMethod(label='Proses Giliran Penangkapan Prospek')
    public static List<Result> processTurn(List<Request> requests) {
        // 1. Urai userMessage untuk bidang yang hilang menggunakan Regex
        // 2. Gabungkan bidang yang ditemukan dengan knownLastName dan knownCompany
        // 3. Jika keduanya ada, sisipkan Prospek
        // 4. Kembalikan Hasil
    }
}

Gotcha Pengikatan leadId

Perhatikan bahwa public String leadId; didefinisikan sebagai String dan bukan Id. Ini adalah nuansa penting di Agentforce. Saat mengikat keluaran dari tindakan yang dapat dipanggil kembali ke variabel Skrip Agen (set @variables.last_lead_id = @outputs.leadId), Agentforce sangat menyukai tipe string primitif daripada tipe Id Salesforce yang ketat. Menggunakan Id dapat menyebabkan kegagalan pengikatan yang tidak terlihat selama eksekusi.


3. Menegakkan Keamanan dengan USER_MODE

Ketika Agentforce menjalankan tindakan yang dapat dipanggil, tindakan tersebut berjalan di bawah konteks pengguna Agen Layanan Einstein (atau agen default Anda yang terkonfigurasi).

Jika Anda mencoba menyisipkan prospek menggunakan DML standar (insert newLead;), konteks sistem mungkin melewati pemeriksaan keamanan yang diperlukan, atau gagal secara tidak terduga tergantung pada pengaturan berbagi org.

Pendekatan yang benar di tahun 2026 adalah selalu menegakkan DML mode pengguna:

Database.SaveResult sr = Database.insert(newLead, false, AccessLevel.USER_MODE);

Izin Set yang Hilang

Agar penyisipan USER_MODE berfungsi, pengguna Agen Layanan Einstein harus memiliki izin untuk membuat catatan Prospek.

Anda harus membuat Izin Set (misalnya, LeadCaptureAgent_Apex_Access) yang memberikan:

  1. Akses Kelas Apex: Ke kelas LeadCaptureTurnAction Anda.
  2. Akses Objek: Izin Baca dan Buat pada objek Lead.
  3. Izin Bidang: Akses edit ke LastName dan Company.

Tetapkan Izin Set ini ke pengguna Agen Layanan Einstein. Tanpanya, agen akan berulang tanpa henti, meminta bidang yang sudah dikumpulkannya karena kegagalan DML USER_MODE yang tidak terlihat mencegah isSuccess mengembalikan true.


4. Menguji Agen Secara Lokal

Sebelum mempublikasikan, Anda harus memvalidasi logika multi-giliran menggunakan Salesforce CLI. Perintah sf agent preview memungkinkan Anda mensimulasikan percakapan langsung dari terminal Anda.

# Mulai sesi
sf agent preview start --json --authoring-bundle LeadCaptureAgent --use-live-actions --target-org my-org

# Kirim ucapan pertama (Hanya Perusahaan)
sf agent preview send --json --session-id <SESSION_ID> --utterance "Perusahaan saya adalah Acme Corp" --authoring-bundle LeadCaptureAgent --target-org my-org

# Kirim ucapan kedua (Nama Belakang)
sf agent preview send --json --session-id <SESSION_ID> --utterance "Nama belakang saya adalah Smith" --authoring-bundle LeadCaptureAgent --target-org my-org

# Verifikasi pembuatan Prospek
sf data query --query "SELECT Id, LastName, Company FROM Lead ORDER BY CreatedDate DESC LIMIT 1" --target-org my-org

Intinya

Agentforce memungkinkan kita membangun pengalaman percakapan yang sangat dinamis, tetapi memerlukan pergeseran dalam cara kita menangani status dan keamanan. Dengan mengarahkan penangkapan prospek melalui subagen khusus dan mengandalkan tindakan yang dapat dipanggil Apex untuk manajemen status yang deterministik, Anda memastikan pengalaman yang aman, tangguh, dan ramah pengguna.

Selalu ingat untuk menggunakan String untuk keluaran ID, menegakkan DML USER_MODE, dan menetapkan Izin Set yang benar ke pengguna agen Anda.


Tentang Penulis: Panduan ini ditulis oleh tim Editorial Teknis Resumity, mengeksplorasi persimpangan platform AI modern dan arsitektur CRM perusahaan.