Loading
システム管理者に対するフィッシング耐性MFA・全従業員ユーザーMFAの適用のお知らせ 続きを読む
ただいま大変多くのお問い合わせをいただいており、ご連絡までにお時間を頂戴しております続きを読む
AgentforceおよびEinstein生成AI
セールス メール プロンプト テンプレートへの Apex 差し込み項目の追加

セールス メール プロンプト テンプレートへの Apex 差し込み項目の追加

Apex を使用するセールスメールプロンプトテンプレートの例を作成します。

必要なエディション

使用可能なインターフェース: Lightning Experience
使用可能なエディション: Einstein for Platform、Einstein または Agentforce for Sales/Service アドオン、または Agentforce Foundation が付属する Enterprise Edition、Performance Edition、および Unlimited Edition
必要なユーザー権限
プロンプトビルダーでプロンプトテンプレートを作成および管理する

「プロンプトテンプレートマネージャー」権限セット

  • プロンプトテンプレートの管理
  • Execute Prompt Templates (プロンプトテンプレートの実行)

または

「アプリケーションのカスタマイズ」権限セット

たとえば、Salesforce システム管理者が、営業チームから取引先責任者に近隣のマーケティングイベントに関するメールを送信するための簡単な方法を要求されているとします。

Apex クラスを起動するメール プロンプト テンプレートを作成し、取引先責任者と同じ市区郡および州のマーケティング イベントを取得します。Apex クラスは、LLM のイベントとその場所のリストを取得します。

プロンプトテンプレートのリソースとしてアクセスする Apex クラスを次に示します。

public class ContactEventsPrompt {
    @InvocableMethod(label='Contact Events'
      description='Find Events for a Contact'
      CapabilityType='PromptTemplateType://einstein_gpt__salesEmail')
    public static List<Response> getContactsPrompt(List<Request> requests) {
        // validate the expected number of requests as an input
        if (requests.size() != 1)
            throw new ListException('The requests list must contain one entry only');
        Contact c = requests[0].Recipient;
        // Protect against SOQL Injection
        string searchCity = '%' + c.MailingCity + '%';
        string searchState = '%' + c.MailingState + '%';
        List<Event> events =
          [SELECT Id, Subject, Description, Location, StartDateTime
           FROM Event
           WHERE IsArchived = false AND Location LIKE :searchCity
            AND Location LIKE :searchState WITH USER_MODE]; 
        string responseData = '';

        if(events.isEmpty()) {
            responseData = 'No upcoming Marketing events near you.';
        } else {
            for(Event e : events) {
                responseData += 'Event details: ';
                responseData += e.Subject;
                responseData += ', ';
                responseData += e.Description;
                responseData += ', ';
                responseData += e.Location;
                responseData += '/nStart Time: ';
                responseData += e.StartDateTime.format();
                responseData += '.';
            }
        }

        List<Response> responses = new List<Response>();
        Response res = new Response();
        res.Prompt = responseData;
        responses.add(res);
        return responses;
      }

      public class Request {
          @InvocableVariable(required=true)
          public User Sender;
          @InvocableVariable(required=true)
          public Contact Recipient;
      }

      public class Response {
          @InvocableVariable
          public String Prompt;
      }
}

Apex クラスの要件については、「 Apex 差し込み項目を使用したグラウンディング 」を参照してください。

テストカバー率は重要であるため、テストクラスを追加しましょう。テストクラスは、プロンプトビルダーから送信されるデータをシミュレートします。2 つのテストケースが用意されています。1 つはイベントが見つかった場合のテストケース、もう 1 つはイベントがない場合のテストケースです。

@IsTest
public class ContactEventsPrompt_Test {
  @IsTest
  public static void noEventsForContactResponse() {
    List<ContactEventsPrompt.Request> requestsInput
     = new List<ContactEventsPrompt.Request>();
    ContactEventsPrompt.Request request
     = new ContactEventsPrompt.Request();
    request.Recipient = new Contact();
    requestsInput.add(request);
    List<ContactEventsPrompt.Response> responses =
      ContactEventsPrompt.getContactsPrompt(requestsInput);
    Assert.areEqual(1, responses.size());
    ContactEventsPrompt.Response response = responses[0];
    Assert.areEqual('No upcoming Marketing events near you.', 
      response.Prompt);
  }
  

  @IsTest
  public static void findMatchingEventsForContact() {
    Contact c = new Contact(LastName='TestContact',
      MailingCity='San Francisco', MailingState='CA');
    insert c;
    Event e = new Event(Subject='Test Event', Description='Big Event', 
      Location='415 Mission St, San Francisco, CA 94105, USA',   
      StartDateTime=DateTime.newInstance(2023,09,28), 
      DurationInMinutes=5 );
    insert e;
    List<ContactEventsPrompt.Request> requestsInput
      = new List<ContactEventsPrompt.Request>();
    ContactEventsPrompt.Request request
      = new ContactEventsPrompt.Request();
    request.Recipient = c;
    requestsInput.add(request);
    

    Test.startTest();
    List<ContactEventsPrompt.Response> responses = 
      ContactEventsPrompt.getContactsPrompt(requestsInput);
    Test.stopTest();
    Assert.areEqual(1, responses.size());
    ContactEventsPrompt.Response response = responses[0];
    Assert.areEqual(formatEventString(e), response.Prompt);
  }

   
  private static String formatEventString(Event event) {
    String formattedEventString = 'Event details: ';
    formattedEventString += event.Subject;
    formattedEventString += ', ';
    formattedEventString += event.Description;
    formattedEventString += ', ';
    formattedEventString += event.Location;
    formattedEventString += '/nStart Time: ';
    formattedEventString += event.StartDateTime.format();
    formattedEventString += '.';
    return formattedEventString;
  }
}

Apex クラスの準備ができたら、プロンプトビルダーから呼び出してみましょう。

プロンプトビルダーで、新しいプロンプトテンプレートを作成します。

  1. [プロンプトテンプレート種別] ドロップダウンで、[セールスメール] を選択します。
  2. [プロンプトテンプレート名] に「Apex: Nearby Events Marketing Email」と入力します。
  3. [受信者種別] で、[取引先責任者] を選択します。
  4. [説明] 項目を空白のままにします。
  5. [作成] をクリックすると、プロンプトテンプレートワークスペースにリダイレクトされます。
  6. サンプルプロンプトテンプレートライブラリで、セールスメールプロンプトテンプレート「Draft an email for a contact about regional marketing events」を見つけます。このテンプレートをコピーしてプロンプトテンプレートワークスペースに貼り付けます。
  7. プロンプトビルダーでこのテンプレートを実行する前に、[プロンプト] セクションで [リソースの挿入] をクリックします。検索項目は、このオプションを初めてクリックしたときに表示されます。
  8. 検索バーを使用して、プレースホルダーを差し込み項目に置き換えます。
    1. プロンプトテンプレートワークスペースで、 <Get_Events_Near_Contact__Prompt__Flow> プレースホルダーを削除します。
    2. [プロンプト] セクションで、[リソース] 検索バーをクリックし、Apex を選択します。
    3. [Contact Events] を選択して、ContactEventsPrompt Apex クラスをテンプレートに追加します。Contact Events は、ContactEventsPrompt Apex クラスの @InvocableMethod アノテーションで設定した label 属性です。
      Apex クラスは、プロンプトテンプレートに Apex:ContactEventsPrompt として挿入されます。
    4. <sender.Name__Merge_Field> プレースホルダーを削除します。
    5. [リソース] 検索バーをクリックし、 [送信者 | 氏名] [] を選択します。
    6. <recipient.Name__Merge_Field> プレースホルダーを削除します。
    7. [Resource (リソース)] 検索バーをクリックし、[Recipient | Full Name (受信者の氏名)] を選択します。
    8. <recipient.Company__Merge_Field> プレースホルダーを削除します。
    9. [Resource (リソース)] 検索バーをクリックし、[Current Organization | Name (現在の組織名)] を選択します。
 
読み込み中
Salesforce Help | Article