Prepararse para crear una acción de Apex
Objetivos de aprendizaje
Después de completar esta unidad, podrá:
- Preparar su organización para crear acciones.
- Comprobar que su Apex esté listo para las acciones.
Pronóstico: Se aproximan días soleados
Toda persona que estuvo de vacaciones sabe que prestar atención al clima es esencial para aprovechar al máximo sus planes de viaje. Y en Coral Cloud Resorts, los huéspedes pueden prever días soleados y cálidos... hasta que el clima cambia. Para asegurarse de que sus huéspedes están aprovechando al máximo su estadía, independientemente del clima, el equipo de Coral Cloud quiere agregar la capacidad de recopilar información del clima a sus agentes de IA. Para hacerlo, necesita crear una acción que extraiga los datos climáticos de una clase de Apex a través de una API externa.
Registrarse para obtener una organización de Developer Edition con Agentforce
Para completar este módulo, necesita una organización especial de Developer Edition que contiene Agentforce y nuestros datos de muestra. Regístrese para obtener esta organización gratuita y personalizada de Developer Edition con Agentforce, haga clic en el vínculo y conéctela a Trailhead para completar los retos de este módulo. Tenga en cuenta que esta organización está diseñada para trabajar con los retos de esta insignia y podría no funcionar con otras insignias. Siempre compruebe que está utilizando el Trailhead Playground o la organización especial Developer Edition que recomendamos.
- Regístrese para obtener una organización gratuita de Developer Edition con Agentforce.
- Complete el formulario:
- Para Email, ingrese una dirección de email activa.
- En Username (Nombre de usuario), ingrese un nombre de usuario que parezca una dirección de email y sea único, pero no es necesario que sea una cuenta de email válida (por ejemplo, sunombre@ejemplo.com).
- Para Email, ingrese una dirección de email activa.
- Después de completar el formulario, haga clic en Registrarme. Se muestra un mensaje de confirmación.
- Cuando reciba el email de activación (podría tardar unos minutos), ábralo y haga clic en Verificar cuenta.
- Complete el registro por medio de su contraseña y la pregunta de comprobación. Sugerencia: Guarde su nombre de usuario, contraseña y URL de inicio de sesión en un lugar seguro, como un gestor de contraseñas, para acceder a estos datos fácilmente en otro momento.
- Habrá iniciado sesión en su cuenta de Developer Edition.
Ahora, conecte su nueva organización Developer Edition a Trailhead.
- Asegúrese de haber iniciado sesión en su cuenta de Trailhead.
- En la sección Challenge (Reto) de la parte inferior de esta página, haga clic en el nombre de la organización y, luego, haga clic en Connect Org (Conectar organización).
- En la página de inicio de sesión, ingrese el nombre de usuario y la contraseña para la Developer Edition que acaba de configurar.
- En la pantalla ¿Permitir acceso?, haga clic en Permitir.
- En la pantalla Want to connect this org for hands-on challenges? (¿Desea conectar esta organización para retos prácticos?), haga clic en Yes! (Sí). Guarde los cambios. Se le redirigirá de nuevo a la página del reto y estará listo para utilizar su nueva Developer Edition para ganar esta insignia.
Preparar la organización para los agentes
Antes de que empiece a personalizar los agentes, habilite todas las funciones obligatorias de la organización.
- Haga clic en Setup (Configuración)
y seleccione Setup (Configuración).
- En el cuadro de búsqueda rápida de configuración, busque y seleccione Einstein Setup (Configuración de Einstein).
- Asegúrese de que Einstein esté activado. Si ya está activado, haga clic en el botón de alternancia Off (Desactivado) y, luego, de vuelta en On (Activado).

- Actualice su navegador para volver a cargar Setup (Configuración).
- En Setup Quick Find (Búsqueda rápida de configuración), busque y seleccione Salesforce Go.
- En el cuadro de texto Search features... (Buscar funciones...), ingrese y seleccione Agentforce (Default) (Agentforce [Predeterminado]).
![Agentforce (Default) (Agentforce [Predeterminado]) seleccionado.](https://res.cloudinary.com/hy4kyit2a/f_auto,fl_lossy,q_70/learn/modules/agent-customization-with-apex/get-ready-to-create-an-apex-action/images/es-MX/8c633e908d2fd728f1ae0908abb1b047_kix.szvk34w8evu.png)
- Haga clic en Get Started (Empezar).
- Haga clic en Turn On (Activar).
- Haga clic en Confirm (Confirmar).
Crear acciones de agente con funciones que ya tiene
¡Bien! Ya está todo casi listo para crear una acción personalizada para su agente. Uno de los motivos más importantes para crear agentes de IA con Salesforce es que puede usar las funciones que ya están integradas en su organización. En este caso, quiere agregarle a un agente de IA para Coral Cloud Resort la información del clima. Coral Cloud ya tiene una clase de Apex WeatherService para obtener el clima de la ubicación de Coral Cloud Resort desde una API externa. Veamos cómo se aplica a una acción.
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;
}
}Esta es una clase de Apex bastante directa que envía una solicitud HTTP a un servicio climático para obtener el clima de la fecha ingresada. Sin embargo, la clase de Apex no está disponible para que la use el Generador de Agentforce. Podría actualizar esta clase para que sea un método invocable, pero una mejor práctica es crear una nueva clase de Apex establecida en InvocableMethod que llame al WeatherService original. Con la anotación InvocableMethod, puede llamar al código Apex personalizado desde herramientas declarativas, como Flow, aplicaciones externas a través de REST y Agentforce.
La buena noticia es que el equipo de Coral Cloud creó una clase de Apex que ya está realizando llamadas a WeatherService. Echemos un vistazo a la clase y veamos cómo implementa 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;
}
}Lo primero que hay que observar es la anotación @InvocableMethod para el método getWeather. Los dos parámetros que se pasaron se usan en el proceso de crear una acción de agente. El parámetro label (etiqueta) aparece como Agent Action Label (Etiqueta de acción de agente). El parámetro description (descripción) aparece como Agent Action Instructions (Instrucciones de acción de agente). Las descripciones son importantes con los agentes de IA y cómo el agente entiende el método.
Entonces, hay dos clases públicas, WeatherRequest y WeatherResponse, que tienen anotaciones @InvocableVariable para Create an Agent Action Input (Crear un entrada de acción de agente) y Outputs (Salidas) respectivamente.
Para WeatherRequest, la anotación @InvocableVariable para dateToCheck tiene el parámetro required (obligatorio) establecido en true (verdadero). La configuración Create an Agent Action Require Input (Crear una entrada requerida para la acción de agente) se verá forzada a quedar marcada como predeterminada. El parámetro description (descripción) se mostrará como Input Instructions (Instrucciones de entrada). Además, establecer el tipo de variable en Date (Fecha) para dateToCheck establece el tipo de datos de entrada.
Para WeatherResponse, hay tres variables con la anotación @InvocableVariable, minTemperature, maxTemperature y temperatureDescription. Cada una tiene un parámetro description (descripción) establecido que se muestra en Create an Agent Action Outputs Instructions (Crear instrucciones de salida para la acción de agente). Además, los tipos de variables Decimal, Decimal y String (Cadena) aparecen como Output Rendering (Representación de salida). El tipo de variable String (Cadena) se establecerá como Text for Output Rendering (Texto para representación de salida).
Configurar permisos
Como con cualquier función de Apex, debe tener el acceso adecuado para el archivo Apex. Este paso ya se realizó en la organización de Dev personalizada que está usando para esta insignia. Ya se configuraron los permisos, por lo tanto, el agente de IA tiene acceso a la clase de Apex que contiene el método invocable a través de un conjunto de permisos. De no ser así, el agente no podría considerarlo cuando crea un plan, incluso si usted creara una acción y la agregara a un agente. La falta de permisos adecuados es uno de los principales motivos por el cual las acciones de Apex no funcionan como corresponde en Agentforce.
Ahora tiene una mejor idea de lo que hace falta al usar Apex para las acciones. Es bastante información, pero se hará una mejor idea cuando cree la acción en la próxima unidad.
