Перейти к основному содержимому

Продвинутые возможности

Пример с двумя агентами

В этом примере показан бот, который помогает клиентам банка. В сценарии используются два агента:

  • bank_info — он отвечает на общие вопросы о банке и может сообщить email банка.
  • card_application — он помогает пользователю создать заявку на выпуск карты.

У обоих агентов указан параметр llmClassificationEnabled = true, что позволяет им переводить диалог на другого агента. Например, если пользователь во время диалога с агентом bank_info попросит открыть банковскую карту, то агент bank_info переведет диалог на агента card_application.

theme: /

state: Start
q!: $regex</start>
script:
// Создаем новую сессию
$jsapi.startSession();
// Указываем данные о пользователе
$session.userData = {
userId: 111111,
userName: "Иван"
};
# Бот сразу переходит в стейт /Info
go!: /Info


state: Info
# Агент, который отвечает на общие вопросы о банке
AIAgent:
id = bank_info
model = gpt-4o
topP = 1.0
role = Сотрудник банка
goal = Отвечай на общие вопросы. Например, ты можешь дать контакты банка
instructions = Отвечай на языке пользователя
# Агент запросит город пользователя, если посчитает нужным
requiredData =
[
{
"name":"userCity",
"type":"string",
"description":"Город пользователя",
"isRequired":false
}
]
# Агент может вызвать функцию, чтобы получить email банка в городе пользователя
functions = ["getEmail"]
llmClassificationEnabled = true
chatHistoryEnabled = true
# Передаем данные о пользователе в качестве контекста
context = {{JSON.stringify($session.userData)}}
# Бот перейдет в /Feedback, если агент выполнит цель
nextState = /Feedback

state: Card
# Агент, который оформляет банковские карты
AIAgent:
id = card_application
model = gpt-4o
topP = 1.0
role = Сотрудник банка
goal = Помоги пользователю открыть карту
instructions = Отвечай на языке пользователя
# Для открытия карты нужны возраст, город и телефон пользователя
requiredData =
[
{
"name":"userAge",
"type":"number",
"description":"Возраст пользователя",
"reasonForQuestion":"Оформить карту могут только совершеннолетние"
},
{
"name":"userCity",
"type":"string",
"description":"Город пользователя",
"condition":"Только если пользователю уже есть 18 лет",
"dependsOn":"userAge"
},
{
"name":"userPhone",
"type":"string",
"description":"Телефон пользователя",
"condition":"Только если пользователю уже есть 18 лет",
"dependsOn":"userAge"
}
]
# Агент может вызвать функцию, чтобы создать заявку на карту
functions = ["createCardApplication"]
# Передаем данные о пользователе в качестве контекста
context = {{JSON.stringify($session.userData)}}
chatHistoryEnabled = true
llmClassificationEnabled = true
# Бот перейдет в /Feedback, если агент выполнит цель
nextState = /Feedback

state: Feedback
InputText:
prompt = Оцените работу бота
varName = feedback
then = /Info

Управление промтом и ответом

Если вы хотите изменить промт или текст ответа агента, создайте файл /src/ai-agent-interceptors.js.

Изменение промта

Чтобы изменить промт, добавьте в файл метод systemPromptPostProcess. Когда диалог переходит в агента, метод получает два аргумента:

  • agentId — идентификатор агента.
  • systemPrompts — массив с промтами для агента.

Вы можете изменить массив с промтами перед тем, как он дальше будет использоваться агентом.

/src/ai-agent-interceptors.js
export default {
systemPromptPostProcess: (agentId, systemPrompts) => {
// Текущие предложения от банка
const promos = [
"мы предлагаем новые выгодные проценты по вкладам.",
"теперь можно выбрать категории для кешбэка в приложении.",
"клиент может участвовать в розыгрыше призов."
];
// Изменяем список с промтами только для агента bank_info
if (agentId === "bank_info"){
// Выбираем случайное предложение от банка
const randomIndex = $jsapi.random(promos.length);
const selectedPromo = promos[randomIndex];
// Добавляем еще один промт. Агент должен сообщить о предложении банка
systemPrompts.push({ prompt: "Сразу упомяни наше новое предложение: " + selectedPromo})
}
}
}

В этом примере, если диалог перешел в агента bank_info, то агент сообщит о случайном предложении банка клиенту.

Изменение текста ответа

Чтобы изменить текст ответа, добавьте в файл метод processLlmAnswer. Метод получает два аргумента:

  • agentId — идентификатор агента.
  • content — оригинальный текст ответа агента.

Если метод указан, то агент не будет сам отвечать пользователю. Вы можете изменить текст ответа и отправить его пользователю внутри метода:

/src/ai-agent-interceptors.js
export default {
processLlmAnswer: (agentId, content) => {
// Изменяем ответ только для агента card_application
if (agentId === "card_application"){
// Добавляем текст перед ответом и отправляем пользователю
$reactions.answer("Оформление карты 💳 \n\n" + content);
} else {
// Другие агенты отправляют оригинальный текст ответа
$reactions.answer(content);
}
}
}

В этом примере агент card_application будет добавлять Оформление карты 💳 перед ответом. Другие агенты будут отвечать без изменений.

предупреждение

Метод не влияет на confirmationPhrase перед вызовом функции.