Продвинутые возможности
Пример с двумя агентами
В этом примере показан бот, который помогает клиентам банка. В сценарии используются два агента:
bank_info
— он отвечает на общие вопросы о банке и может сообщить email банка.card_application
— он помогает пользователю создать заявку на выпуск карты.
У обоих агентов указан параметр llmClassificationEnabled = true
, что позволяет им переводить диалог на другого агента.
Например, если пользователь во время диалога с агентом bank_info
попросит открыть банковскую карту, то агент bank_info
переведет диалог на агента card_application
.
- /src/main.sc
- /src/function-specs.js
- /src/scripts/custom-functions.js
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
import customFunctions from './scripts/custom-functions.js'
export default {
createCardApplication: {
description: "Создать заявку на выпуск банковской карты",
confirmation: {
confirmationPhrase: "Создать заявку на открытие карты для номера {userPhone}?",
yesPattern: "* $yes *",
noPattern: "* $no *"
},
parameters: {
type: "object",
properties: {
city: {
type: "string",
description: "Город, например, Москва",
},
age: {
type: "number",
description: "Возраст пользователя",
},
phone: {
type: "string",
description: "Телефон пользователя",
}
},
required: ["city", "age", "phone"]
},
function: customFunctions.createCardApplication
},
getEmail: {
description: "Получить email банка в городе пользователя",
parameters: {
type: "object",
properties: {
city: {
type: "string",
description: "Город, например, Москва"
}
},
required: ["city"]
},
function: customFunctions.getEmail
},
};
export default {
createCardApplication: ({city, age, phone}) => {
// …
$reactions.answer("Номер заявки: 12345")
},
getEmail: ({city}) => {
const emails = {"Москва": "moscow@example.com", "Волгоград": "volgograd@example.com"};
return emails[city]
}
}
Управление промтом и ответом
Если вы хотите изменить промт или текст ответа агента, создайте файл /src/ai-agent-interceptors.js
.
Изменение промта
Чтобы изменить промт, добавьте в файл метод systemPromptPostProcess
.
Когда диалог переходит в агента, метод получает два аргумента:
agentId
— идентификатор агента.systemPrompts
— массив с промтами для агента.
Вы можете изменить массив с промтами перед тем, как он дальше будет использоваться агентом.
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
— оригинальный текст ответа агента.
Если метод указан, то агент не будет сам отвечать пользователю. Вы можете изменить текст ответа и отправить его пользователю внутри метода:
export default {
processLlmAnswer: (agentId, content) => {
// Изменяем ответ только для агента card_application
if (agentId === "card_application"){
// Добавляем текст перед ответом и отправляем пользователю
$reactions.answer("Оформление карты 💳 \n\n" + content);
} else {
// Другие агенты отправляют оригинальный текст ответа
$reactions.answer(content);
}
}
}
В этом примере агент card_application
будет добавлять Оформление карты 💳
перед ответом.
Другие агенты будут отвечать без изменений.
Метод не влияет на confirmationPhrase
перед вызовом функции.