セールス メール プロンプト テンプレートへの Apex 差し込み項目の追加
Apex を使用するセールスメールプロンプトテンプレートの例を作成します。
必要なエディション
| 使用可能なインターフェース: Lightning Experience |
| 使用可能なエディション: Einstein for Platform、Einstein または Agentforce for Sales/Service アドオン、または Agentforce Foundation が付属する Enterprise Edition、Performance Edition、および Unlimited Edition |
| 必要なユーザー権限 | |
|---|---|
| プロンプトビルダーでプロンプトテンプレートを作成および管理する | 「プロンプトテンプレートマネージャー」権限セット
または 「アプリケーションのカスタマイズ」権限セット |
たとえば、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 クラスの準備ができたら、プロンプトビルダーから呼び出してみましょう。
プロンプトビルダーで、新しいプロンプトテンプレートを作成します。
- [プロンプトテンプレート種別] ドロップダウンで、[セールスメール] を選択します。
- [プロンプトテンプレート名] に「Apex: Nearby Events Marketing Email」と入力します。
- [受信者種別] で、[取引先責任者] を選択します。
- [説明] 項目を空白のままにします。
- [作成] をクリックすると、プロンプトテンプレートワークスペースにリダイレクトされます。
- サンプルプロンプトテンプレートライブラリで、セールスメールプロンプトテンプレート「Draft an email for a contact about regional marketing events」を見つけます。このテンプレートをコピーしてプロンプトテンプレートワークスペースに貼り付けます。
- プロンプトビルダーでこのテンプレートを実行する前に、[プロンプト] セクションで [リソースの挿入] をクリックします。検索項目は、このオプションを初めてクリックしたときに表示されます。
-
検索バーを使用して、プレースホルダーを差し込み項目に置き換えます。
-
プロンプトテンプレートワークスペースで、
<Get_Events_Near_Contact__Prompt__Flow>プレースホルダーを削除します。 - [プロンプト] セクションで、[リソース] 検索バーをクリックし、Apex を選択します。
-
[Contact Events] を選択して、
ContactEventsPromptApex クラスをテンプレートに追加します。Contact Events は、ContactEventsPromptApex クラスの@InvocableMethodアノテーションで設定した label 属性です。Apex クラスは、プロンプトテンプレートにApex:ContactEventsPromptとして挿入されます。 -
<sender.Name__Merge_Field>プレースホルダーを削除します。 - [リソース] 検索バーをクリックし、 [送信者 | 氏名] [] を選択します。
-
<recipient.Name__Merge_Field>プレースホルダーを削除します。 - [Resource (リソース)] 検索バーをクリックし、[Recipient | Full Name (受信者の氏名)] を選択します。
-
<recipient.Company__Merge_Field>プレースホルダーを削除します。 - [Resource (リソース)] 検索バーをクリックし、[Current Organization | Name (現在の組織名)] を選択します。
-
プロンプトテンプレートワークスペースで、
この記事で問題は解決されましたか?
ご意見をお待ちしております。
