Publicat: 12 iunie 2026 | Timp de citire: 7 minute | Categorie: Salesforce


TL;DR

Construirea unui agent de servicii Agentforce pentru capturarea lead-urilor necesită gestionarea stării multi-turn în mod securizat. În timp ce fluxurile standard sunt excelente pentru sarcini simple, utilizarea unui @InvocableMethod Apex permite urmărirea persistentă a stării pe parcursul mai multor iterații ale conversației și operațiuni DML securizate în USER_MODE. Iată exact cum să construiești unul.


Introducere: Era Agentforce

Salesforce Agentforce a schimbat complet modul în care ne gândim la interacțiunile automate cu clienții. Trecem de la chatbot-uri rigide, bazate pe arbori, la agenți autonomi care pot raționa, pune întrebări de clarificare și executa acțiuni.

Unul dintre cele mai comune cazuri de utilizare timpurii pentru Agentforce este Capturarea Lead-urilor. Scopul este simplu: un agent AI întreabă utilizatorul informațiile sale (de exemplu, Nume de familie și Companie), păstrează acele informații pe parcursul mai multor iterații ale conversației și creează o înregistrare de Lead Salesforce odată ce toate datele necesare sunt colectate.

În timp ce ați putea încerca acest lucru cu un flux de ecran sau un flux autolaunched, acțiunile invocabile Apex oferă un control semnificativ mai mare asupra gestionării stării și a contextului de securitate.

Iată planul exact pentru un agent de capturare a lead-urilor pregătit pentru producție în 2026.


Arhitectura

Soluția noastră necesită trei componente principale:

  1. Routerul Agentului (start_agent): Întâmpină utilizatorul și îl direcționează către subagentul corect pe baza intenției.
  2. Subagentul de Capturare a Lead-urilor (subagent): Instruiește LLM-ul cu privire la exact ce câmpuri sunt necesare (Nume de familie și Companie) și declanșează acțiunea.
  3. Acțiunea Invocabilă Apex (@InvocableMethod): „Motorul” real care analizează intrarea, păstrează starea și efectuează inserarea în baza de date.

1. DSL-ul Scriptului Agentului

Agentforce utilizează un limbaj specific domeniului (DSL) pentru a defini comportamentul agentului. Definim variabile pentru a păstra intrarea utilizatorului pe parcursul iterațiilor.

variables:
    last_name: mutable string = ""
        description: "Lead last name"
    company: mutable string = ""
        description: "Lead company"
    lead_created: mutable boolean = False
        description: "Whether the lead has already been created"
    last_lead_id: mutable string = ""
        description: "The most recently created Lead ID"

Logica subagentului nostru dictează că pentru fiecare mesaj pe care îl trimite utilizatorul în timp ce se află în subiectul de capturare a lead-urilor, apelăm acțiunea noastră Apex. Trecem userMessage-ul curent, împreună cu variabilele last_name și company pe care le-am colectat până acum.

subagent lead_capture:
    label: "Lead Capture"
    description: "Collect last name and company, then create a Salesforce Lead through Apex."
    reasoning:
        instructions: ->
            if @variables.lead_created == True:
                | A lead has already been created in this conversation. Share the Lead ID and ask if the user wants anything else.
            if @variables.lead_created == False:
                | Use Process Lead Capture Turn for every lead-capture message.
        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. Acțiunea Invocabilă Apex

Puterea reală a acestui model constă în clasa Apex. În loc să lăsăm LLM-ul să ghicească când să creeze lead-ul, folosim o acțiune invocabilă pentru a gestiona logica de business în mod securizat.

De ce Apex în locul Fluxului?

  • Stare Multi-turn: Prin transmiterea knownLastName și knownCompany în acțiunea Apex și returnarea resolvedLastName și resolvedCompany, menținem starea conversației perfect, chiar dacă utilizatorul furnizează informațiile în ordine greșită.
  • Context de Securitate: Putem impune permisiunile de nivel de câmp (FLS) și CRUD în mod dinamic folosind AccessLevel.USER_MODE.

Iată structura variabilelor de intrare și ieșire:

public class LeadCaptureTurnAction {
    
    public class Request {
        @InvocableVariable(required=true label='User Message')
        public String userMessage;
        
        @InvocableVariable(label='Known Last Name')
        public String knownLastName;
        
        @InvocableVariable(label='Known Company')
        public String knownCompany;
    }
    
    public class Result {
        @InvocableVariable(label='Is Success')
        public Boolean isSuccess;
        
        @InvocableVariable(label='Lead ID')
        public String leadId; // GOTCHA: Must be String, not Id
        
        @InvocableVariable(label='Resolved Last Name')
        public String resolvedLastName;
        
        @InvocableVariable(label='Resolved Company')
        public String resolvedCompany;
        
        @InvocableVariable(label='Message')
        public String message;
    }
    
    @InvocableMethod(label='Process Lead Capture Turn')
    public static List<Result> processTurn(List<Request> requests) {
        // 1. Parse the userMessage for missing fields using Regex
        // 2. Combine found fields with knownLastName and knownCompany
        // 3. If both are present, insert the Lead
        // 4. Return the Result
    }
}

Gotcha-ul de legare leadId

Observați că public String leadId; este definit ca String și nu Id. Aceasta este o nuanță critică în Agentforce. Când legați ieșirea unei acțiuni invocabile înapoi la o variabilă de script Agent (set @variables.last_lead_id = @outputs.leadId), Agentforce preferă puternic tipurile primitive de șiruri de caractere în locul tipurilor stricte Id Salesforce. Utilizarea Id poate cauza eșecuri silențioase de legare în timpul execuției.


3. Impunerea Securității cu USER_MODE

Când Agentforce execută o acțiune invocabilă, rulează în contextul utilizatorului Einstein Service Agent (sau al utilizatorului agent implicit configurat).

Dacă încercați să inserați un lead folosind DML standard (insert newLead;), contextul sistemului ar putea ocoli verificările de securitate necesare sau ar putea eșua imprevizibil, în funcție de setările de partajare ale organizației.

Abordarea corectă în 2026 este să impuneți întotdeauna DML în modul utilizator:

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

Setul de Permisiuni Lipsă

Pentru ca inserarea USER_MODE să funcționeze, utilizatorul Einstein Service Agent trebuie să aibă permisiunea de a crea înregistrări de Lead.

Trebuie să creați un Set de Permisiuni (de exemplu, LeadCaptureAgent_Apex_Access) care acordă:

  1. Acces la Clasa Apex: La clasa dvs. LeadCaptureTurnAction.
  2. Acces la Obiect: Permisiuni de citire și creare pe obiectul Lead.
  3. Permisiuni la Câmp: Acces de editare la LastName și Company.

Atribuiți acest Set de Permisiuni utilizatorului Einstein Service Agent. Fără acesta, agentul va intra într-o buclă infinită, cerând câmpuri pe care le-a colectat deja, deoarece eșecul silențios al DML-ului USER_MODE împiedică isSuccess să returneze vreodată true.


4. Testarea Agentului Local

Înainte de publicare, ar trebui să validați logica multi-turn folosind Salesforce CLI. Comanda sf agent preview vă permite să simulați conversația direct din terminalul dvs.

# Start the session
sf agent preview start --json --authoring-bundle LeadCaptureAgent --use-live-actions --target-org my-org

# Send the first utterance (Company only)
sf agent preview send --json --session-id <SESSION_ID> --utterance "My company is Acme Corp" --authoring-bundle LeadCaptureAgent --target-org my-org

# Send the second utterance (Last Name)
sf agent preview send --json --session-id <SESSION_ID> --utterance "My last name is Smith" --authoring-bundle LeadCaptureAgent --target-org my-org

# Verify the Lead creation
sf data query --query "SELECT Id, LastName, Company FROM Lead ORDER BY CreatedDate DESC LIMIT 1" --target-org my-org

Concluzia

Agentforce ne permite să construim experiențe conversaționale incredibil de dinamice, dar necesită o schimbare în modul în care gestionăm starea și securitatea. Prin direcționarea capturării lead-urilor printr-un subagent dedicat și bazându-ne pe acțiunile invocabile Apex pentru gestionarea deterministă a stării, asigurați o experiență sigură, rezilientă și ușor de utilizat.

Amintiți-vă întotdeauna să folosiți String pentru ieșirile ID, să impuneți DML USER_MODE și să atribuiți seturile de permisiuni corecte utilizatorului agent.


Despre Autor: Acest ghid este scris de echipa editorială tehnică Resumity, explorând intersecția dintre platformele moderne de AI și arhitectura CRM enterprise.