Préparation à la création d’une application Apex
Objectifs de formation
Une fois cette unité terminée, vous pourrez :
- Préparer votre organisation à l’élaboration d’actions
- Vérifier qu’Apex est prêt pour les actions
Prévisions : un ciel ensoleillé
Quand on part en vacances, il est essentiel de surveiller le temps qu’il fait pour tirer le meilleur parti de ses projets de voyage. Et à Coral Cloud Resorts, les clients peuvent s’attendre à ce qu’il fasse beau et chaud… jusqu’à ce que le ciel n’en décide autrement. Pour s’assurer que les clients profitent au maximum de leur séjour, quel que soit le temps, l’équipe de Coral Cloud souhaite intégrer une nouvelle capacité à ses agents IA : recueillir des informations météorologiques. Pour ce faire, elle doit créer une action qui extrait des données météorologiques depuis une classe Apex à l’aide d’une API externe.
Inscription à une organisation Developer Edition avec Agentforce
Pour suivre entièrement ce module, vous avez besoin d’une organisation Developer Edition spéciale disposant d’Agentforce et de nos exemples de données. Inscrivez-vous gratuitement à cette organisation Developer Edition incluant Agentforce gratuite et personnalisée en cliquant sur ce lien et connectez-la à Trailhead dès maintenant afin de pouvoir relever les défis de ce module. Notez que cette organisation est conçue spécifiquement pour les défis de ce badge et qu’elle est susceptible de ne pas fonctionner pour d’autres badges. Vérifiez toujours que vous utilisez le Trailhead Playground ou l’organisation spéciale Developer Edition que nous recommandons.
- Inscrivez-vous pour obtenir une organisation Developer Edition gratuite comportant Agentforce.
- Remplissez le formulaire :
- Renseignez une adresse e-mail active dans le champ E-mail.
- Pour Username (Nom d’utilisateur), saisissez un nom d’utilisateur unique au format d’une adresse e-mail (mais il ne doit pas nécessairement correspondre à un compte de messagerie valide ; ce peut être, par exemple, votrenom@exemple.com).
- Renseignez une adresse e-mail active dans le champ E-mail.
- Une fois le formulaire renseigné, cliquez sur Inscrivez-moi. Un message de confirmation s’affiche.
- Lorsque vous recevrez l’e-mail d’activation (cela peut prendre quelques minutes), ouvrez-le et cliquez sur Vérifier le compte.
- Terminez votre inscription en définissant votre mot de passe et une question de vérification. Conseil : enregistrez votre nom d’utilisateur, votre mot de passe et votre URL de connexion dans un endroit sûr, comme un gestionnaire de mots de passe, pour pouvoir y accéder facilement à l’avenir.
- Vous êtes désormais connecté à votre Developer Edition.
Connectez maintenant votre nouvelle organisation Developer Edition à Trailhead.
- Assurez-vous que vous êtes connecté à votre compte Trailhead.
- Dans la section Challenge (Défi) située en bas de cette page, cliquez sur le nom de l’organisation, puis sur Connect Org (Connecter l’organisation).
- Sur l’écran de connexion, saisissez le nom d’utilisateur et le mot de passe pour l’organisation Developer Edition que vous venez de configurer.
- Sur l’écran Autoriser l’accès ?, cliquez sur Autoriser.
- Sur l’écran Want to connect this org for hands-on challenges? (Vous souhaitez connecter cette organisation pour les défis pratiques ?), cliquez sur Yes! Save it. (Oui, enregistrer). Vous êtes redirigé vers la page de défi et prêt à utiliser votre nouvelle organisation Developer Edition pour gagner ce badge.
Préparation de l’organisation pour les agents
Avant de commencer à personnaliser les agents, activez toutes les fonctionnalités requises pour l’organisation.
- Cliquez sur Setup (Configuration)
et sélectionnez Setup (Configuration).
- Dans la zone de recherche rapide de Setup (Configuration), recherchez et sélectionnez Einstein Setup (Configuration d’Einstein).
- Vérifiez qu’Einstein est activé. S’il est déjà activé, désactivez-le, puis activez-le de nouveau.

- Actualisez votre navigateur pour recharger la page Setup (Configuration).
- Dans la recherche rapide de Setup (Configuration), recherchez et sélectionnez Salesforce Go.
- Dans la zone de texte Recherchez des fonctionnalités..., saisissez et sélectionnez Agentforce (Default) (Par défaut).

- Cliquez sur Get Started (Commencer).
- Cliquez sur Turn On (Activer).
- Cliquez sur Confirm (Confirmer).
Élaboration d’actions d’agents avec les fonctionnalités dont vous disposez déjà
Un peu de patience ! Vous êtes presque prêt à créer une action personnalisée pour votre agent. L’un des principaux avantages de la création d’agents IA avec Salesforce est que vous pouvez utiliser les fonctionnalités déjà intégrées à votre organisation. Dans ce cas, vous souhaitez ajouter les informations météorologiques pour Coral Cloud Resort à un agent IA. Coral Cloud dispose déjà d’une classe Apex WeatherService qui permet d’obtenir la météo pour l’emplacement Coral Cloud Resort à partir d’une API externe. Voyons comment cela s’applique à une action.
public with sharing class WeatherService {
/**
* Gets the weather at Coral Cloud Resorts for the provided date
*/
public static Weather getResortWeather(Datetime dateToCheck) {
Integer currentYear = Date.today().year();
Integer yearDelta = currentYear - dateToCheck.year();
dateToCheck = dateToCheck.addYears(yearDelta);
String isoDate = dateToCheck.format('yyyy-MM-dd');
String dateString = dateToCheck.format('MMMM d');
// Prepare API request
HttpRequest req = new HttpRequest();
req.setEndpoint(
'callout:Weather_Endpoint/weather?lat=37.789782764570425&lon=-122.39723702244089&date=' +
isoDate
);
req.setMethod('GET');
// Make callout
Http http = new Http();
HttpResponse res = http.send(req);
if (res.getStatusCode() != 200) {
throw new CalloutException('Bad response: ' + res);
}
// The response contains a list of temperatures for different times of the day
// We parse the response and find the min and max temperatures
String body = res.getBody();
WeatherApiResponse weatherResponse = (WeatherApiResponse) JSON.deserialize(
body,
WeatherAPIResponse.class
);
List<Decimal> temperatures = new List<Decimal>();
for (TemperatureWrapper item : weatherResponse.weather) {
if (item.temperature != null) {
temperatures.add(item.temperature);
}
}
temperatures.sort();
// Prepare temperatures and description
Decimal minTempC = temperatures[0];
Decimal maxTempC = temperatures[temperatures.size() - 1];
Decimal minTempF = toFahrenheit(minTempC);
Decimal maxTempF = toFahrenheit(maxTempC);
String description =
'On ' +
dateString +
', temperature should be between ' +
minTempC +
'°C (' +
minTempF +
'°F) and ' +
maxTempC +
'°C (' +
maxTempF +
'°F) at Coral Cloud Resorts.';
// Return weather info
Weather weather = new Weather();
weather.minTemperatureC = minTempC;
weather.minTemperatureF = minTempF;
weather.maxTemperatureC = maxTempC;
weather.maxTemperatureF = maxTempF;
weather.description = description;
return weather;
}
private static Decimal toFahrenheit(Decimal celsius) {
return (celsius * 9 / 5 + 32).setScale(1);
}
private class WeatherApiResponse {
public List<TemperatureWrapper> weather;
}
private class TemperatureWrapper {
public Decimal temperature;
}
public class Weather {
public Decimal minTemperatureC;
public Decimal minTemperatureF;
public Decimal maxTemperatureC;
public Decimal maxTemperatureF;
public String description;
}
}Il s’agit d’une classe Apex simple qui envoie une requête HTTP à un service météorologique pour obtenir la météo du jour saisi. La classe Apex n’est cependant pas disponible pour le générateur Agentforce. Vous pouvez mettre à jour cette classe pour en faire une méthode invocable, mais la meilleure pratique consiste à créer une classe Apex qui est définie comme InvocableMethod et qui appelle le WeatherService original. L’annotation InvocableMethod vous permet d’appeler du code Apex personnalisé à partir d’outils déclaratifs tels que les flux, les applications externes via REST et Agentforce.
La bonne nouvelle, c’est que l’équipe de Coral Cloud a élaboré une classe Apex qui effectue déjà des appels à WeatherService. Jetons un coup d’œil à la classe et voyons comment elle implémente WeatherService.
public with sharing class CheckWeather {
@InvocableMethod(
label='Check Weather'
description='Check weather at Coral Cloud Resorts at a specific date'
)
public static List<WeatherResponse> getWeather(
List<WeatherRequest> requests
) {
// Retrieve the date for which we want to check the weather
Datetime dateToCheck = (Datetime) requests[0].dateToCheck;
WeatherService.Weather weather = WeatherService.getResortWeather(
dateToCheck
);
// Create the response for Copilot
WeatherResponse response = new WeatherResponse();
response.minTemperature = weather.minTemperatureC;
response.maxTemperature = weather.maxTemperatureC;
response.temperatureDescription =
'Temperatures will be between ' +
weather.minTemperatureC +
'°C (' +
weather.minTemperatureF +
'°F) and ' +
weather.maxTemperatureC +
'°C (' +
weather.maxTemperatureF +
'°F) at Coral Cloud.';
return new List<WeatherResponse>{ response };
}
public class WeatherRequest {
@InvocableVariable(
required=true
description='Date for which we want to check the temperature. The variable needs to be an Apex Date type with format yyyy-MM-dd.'
)
public Date dateToCheck;
}
public class WeatherResponse {
@InvocableVariable(
description='Minimum temperature in Celsius at Coral Cloud Resorts location for the provided date'
)
public Decimal minTemperature;
@InvocableVariable(
description='Maximum temperature in Celsius at Coral Cloud Resorts location for the provided date'
)
public Decimal maxTemperature;
@InvocableVariable(
description='Description of temperatures at Coral Cloud Resorts location for the provided date'
)
public String temperatureDescription;
}
}La première chose à remarquer est l’annotation @InvocableMethod pour la méthode getWeather. Les deux paramètres transmis sont utilisés dans le processus Create an Agent Action (Créer une action d’agent). Le paramètre label (étiquette) apparaît comme l’étiquette d’action de l’agent. Le paramètre de description apparaît en tant qu’instructions d’action de l’agent. Les descriptions sont importantes pour les agents IA et la manière dont l’agent comprend la méthode.
Il y a ensuite deux classes publiques, WeatherRequest et WeatherResponse, qui ont des annotations @InvocableVariable pour l’entrée et les sorties de Create an Agent Action (Créer une action d’agent) respectivement.
Pour WeatherRequest, l’annotation @InvocableVariable pour dateToCheck comporte le paramètre required (requis) défini sur true. Cela oblige l’entrée requise Create an Agent Action (Créer une action d’agent) à être cochée par défaut. Le paramètre description s’affiche en tant qu’instructions d’entrée. En outre, le fait de définir le type de variable sur Date pour dateToCheck définit le type de données d’entrée.
Pour WeatherResponse, il existe trois variables avec l’annotation @InvocableVariable : minTemperature, maxTemperature et temperatureDescription. Chacune d’entre elles possède un ensemble de paramètres description qui s’affiche dans les instructions de sortie Create an Agent Action (Créer une action d’agent). Les types de variables Decimal (Décimal), Decimal (Décimal) et String (Chaîne) sont également affichés en tant que Output Rendering (Restitution de la sortie). Le type de variable String (Chaîne) sera défini en tant que Text (Texte) pour Output Rendering (Restitution de la sortie).
Configuration des autorisations
Comme pour toute fonctionnalité Apex, vous devez avoir le bon accès au fichier Apex. Cette étape est déjà réalisée dans l’organisation de développement personnalisée que vous utilisez pour ce badge. Les autorisations ont déjà été définies, donnant à l’agent IA l’accès à la classe Apex qui contient la méthode invocable par le biais d’un ensemble d’autorisations. Si ce n’était pas le cas, l’agent ne pourrait pas en tenir compte lors de l’élaboration d’un plan, même si vous avez créé une action et l’avez ajoutée à un agent. L’absence d’autorisation appropriée est l’une des principales raisons pour lesquelles les actions Apex ne fonctionnent pas comme prévu dans Agentforce.
Vous avez maintenant une meilleure idée de ce qui est nécessaire afin d’utiliser Apex pour les actions. C’est un peu difficile à assimiler, mais cela prendra tout son sens lorsque vous développerez l’action dans l’unité suivante.
