Программистам
Эта инструкция поможет вам подготовить код на Node.js, Python, PHP, R, Go, Java или C#, запустить его и протестировать навык.
Для примера создадим навык Попугай
: он повторяет все, что написал или сказал пользователь.
Создайте функцию
Если вы не работали с Yandex Cloud
- Перейдите по ссылке. Примите условия и нажмите кнопку Войти.
- Введите название нового облака и нажмите кнопку Создать.
Создайте в Yandex Cloud функцию для навыка:
-
Откройте консоль управления.
-
Выберите Cloud Functions.
-
Нажмите кнопку Создать функцию.
-
Введите имя функции. Условия:
-
длина — от 3 до 63 символов;
-
может содержать строчные буквы латинского алфавита, цифры и дефисы;
-
первый символ — буква, последний — не дефис.
Например,
my-first-function
.
-
-
Нажмите кнопку Создать.
-
Если у вас нет платежного аккаунта, зарегистрируйте его.
Платежный аккаунт необходим для любых сервисов Yandex Cloud, даже бесплатных. Функции Cloud Functions для навыков Алисы не тарифицируются — Yandex Cloud не будет списывать деньги с вашей карты.
Сразу после создания функция содержит только метаинформацию: имя, описание, уникальный идентификатор и т. д. Вы добавите в функцию код навыка на следующем шаге.
Создайте версию функции
Каждая версия функции — это исходный код на языке программирования. Поддерживаются Node.js, Python, Go, Java, C#, PHP, R.
1. Сохраните пример кода в файл с названием index.js
(или скачайте готовый файл с GitHub) и создайте ZIP-архив parrot-js.zip
с этим файлом.
module.exports.handler = async (event, context) => {
const {version, session, request} = event;
let text = "Hello! I\'ll repeat anything you say to me.";
if (request["original_utterance"].length > 0)
text = request["original_utterance"];
return {
version,
session,
response: {
text: text,
end_session: false,
},
};
};
2. В консоли управления в каталоге, где хотите создать версию функции, откройте Cloud Functions
3. Выберите функцию.
4. В разделе Последняя версия нажмите кнопку Создать в редакторе.
5. Задайте параметры версии:
- Среда выполнения:
nodejs12
. - Таймаут, секунды: 2.
- Память: 128 МБ.
- Сервисный аккаунт: Не выбрано.
6. Подготовьте код функции:
- Способ: ZIP-архив.
- Файл:
parrot-js.zip
. - Точка входа:
index.handler
.
7. В правом верхнем углу нажмите кнопку Создать версию.
1. Сохраните пример кода в файл с названием parrot.py
(или скачайте готовый файл с GitHub) и создайте ZIP-архив parrot-py.zip
с этим файлом.
def handler(event, context):
"""
Entry-point for Serverless Function.
:param event: request payload.
:param context: information about current execution context.
:return: response to be serialized as JSON.
"""
text = "Hello! I\'ll repeat anything you say to me."
if "request" in event and \
"original_utterance" in event["request"] \
and len(event["request"]["original_utterance"]) > 0:
text = event["request"]["original_utterance"]
return {
"version": event["version"],
"session": event["session"],
"response": {
"text": text,
"end_session": "false"
},
}
2. В консоли управления в каталоге, где хотите создать версию функции, откройте Cloud Functions
3. Выберите функцию.
4. В разделе Последняя версия нажмите кнопку Создать в редакторе.
5. Задайте параметры версии:
- Среда выполнения:
python37
. - Таймаут, секунды: 2.
- Память: 128 МБ.
- Сервисный аккаунт: Не выбрано.
6. Подготовьте код функции:
- Способ: ZIP-архив.
- Файл:
parrot-py.zip
. - Точка входа:
parrot.handler
.
7. В правом верхнем углу нажмите кнопку Создать версию.
1. Сохраните пример кода в файл с названием parrot.php
и создайте ZIP-архив parrot-php.zip
с этим файлом.
<?php
function handler($event, $context) {
$version = $event["version"];
$session = $event["session"];
$request = $event["request"];
$text = "Hello! I'll repeat anything you say to me.";
if (strlen($request["original_utterance"]) > 0) {
$text = $request["original_utterance"];
}
return array(
"version" => $version,
"session" => $session,
"response" => array(
"text" => $text,
"end_session" => false
)
);
}
2. В консоли управления в каталоге, где хотите создать версию функции, откройте Cloud Functions.
3. Выберите функцию.
4. В разделе Последняя версия нажмите кнопку Создать в редакторе.
5. Задайте параметры версии:
- Среда выполнения:
php74
. - Таймаут, секунды: 2.
- Память: 128 МБ.
- Сервисный аккаунт: Не выбрано.
6. Подготовьте код функции:
- Способ: ZIP-архив.
- Файл:
parrot-php.zip
. - Точка входа:
parrot.handler
.
7. В правом верхнем углу нажмите кнопку Создать версию.
1. Сохраните пример кода в файл с названием parrot.r
и создайте ZIP-архив parrot-r.zip
с этим файлом.
handler <- function(event, context) {
version <- event$version
session <- event$session
request <- event$request
text <- "Hello! I\'ll repeat anything you say to me."
if (nchar(request[["original_utterance"]]) > 0) {
text <- request[["original_utterance"]]
}
return(list(
version = version,
session = session,
response = list(
text = text,
end_session = FALSE
)
))
}
2. В консоли управления в каталоге, где хотите создать версию функции, откройте Cloud Functions.
3. Выберите функцию.
4. В разделе Последняя версия нажмите кнопку Создать в редакторе.
5. Задайте параметры версии:
- Среда выполнения:
r40
. - Таймаут, секунды: 2.
- Память: 128 МБ.
- Сервисный аккаунт: Не выбрано.
6. Подготовьте код функции:
- Способ: ZIP-архив.
- Файл:
parrot-r.zip
. - Точка входа:
parrot.handler
.
7. В правом верхнем углу нажмите кнопку Создать версию.
1. Сохраните пример кода в файл с названием parrot.go
и создайте ZIP-архив parrot-go.zip
с этим файлом.
package main
import (
"context"
"encoding/json"
"fmt"
)
type Event struct {
Version string `json:"version"`
Session struct{} `json:"session"`
Request struct {
OriginalUtterance string `json:"original_utterance"`
} `json:"request"`
}
type Response struct {
Version string `json:"version"`
Session struct{} `json:"session"`
Result struct {
Text string `json:"text"`
EndSession bool `json:"end_session"`
} `json:"response"`
}
func Handler(ctx context.Context, event []byte) (*Response, error) {
var input Event
err := json.Unmarshal(event, &input)
if err != nil {
return nil, fmt.Errorf("an error has occurred when parsing event: %v", err)
}
text := "Hello! I'll repeat anything you say to me."
if input.Request.OriginalUtterance != "" {
text = input.Request.OriginalUtterance
}
return &Response{
Version: input.Version,
Session: input.Session,
Result: struct {
Text string `json:"text"`
EndSession bool `json:"end_session"`
}{
Text: text,
EndSession: false,
},
}, nil
}
2. В консоли управления в каталоге, где хотите создать версию функции, откройте Cloud Functions.
3. Выберите функцию.
4. В разделе Последняя версия нажмите кнопку Создать в редакторе.
5. Задайте параметры версии:
- Среда выполнения:
golang119
. - Таймаут, секунды: 2.
- Память: 128 МБ.
- Сервисный аккаунт: Не выбрано.
6. Подготовьте код функции:
- Способ: ZIP-архив.
- Файл:
parrot-go.zip
. - Точка входа:
parrot.Handler
.
7. В правом верхнем углу нажмите кнопку Создать версию.
1. Сохраните пример кода в файл с названием Handler.java
и создайте ZIP-архив parrot-java.zip
с этим файлом.
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
class Request {
Map<String, String> queryStringParameters;
Map<String, Object> request;
Object version;
Object session;
}
class Response {
private Object version;
private Object session;
private Map<String, Object> response;
public Response(Object version, Object session, Map<String, Object> response) {
this.version = version;
this.session = session;
this.response = response;
}
}
public class Handler implements Function<Request, Response> {
@Override
public Response apply(Request request) {
Map<String, Object> response = new HashMap<>();
Object version = request.version;
Object session = request.session;
String originalUtterance = (String) request.request.get("original_utterance");
String text = "Hello! I'll repeat anything you say to me.";
if (originalUtterance != null && originalUtterance.length() > 0) {
text = originalUtterance;
}
response.put("text", text);
response.put("end_session", false);
return new Response(version, session, response);
}
}
2. В консоли управления в каталоге, где хотите создать версию функции, откройте Cloud Functions.
3. Выберите функцию.
4. В разделе Последняя версия нажмите кнопку Создать в редакторе.
5. Задайте параметры версии:
- Среда выполнения:
java17
. - Таймаут, секунды: 2.
- Память: 128 МБ.
- Сервисный аккаунт: Не выбрано.
6. Подготовьте код функции:
- Способ: ZIP-архив.
- Файл:
parrot-java.zip
. - Точка входа:
Handler
.
7. В правом верхнем углу нажмите кнопку Создать версию.
1. Сохраните пример кода в файл с названием Handler.cs
и создайте ZIP-архив parrot-csharp.zip
с этим файлом.
using System;
using System.Text.Json;
public class Request
{
public string version { get; set; }
public JsonElement session { get; set; }
public JsonElement request { get; set; }
}
public class Response
{
public string version { get; set; }
public JsonElement session { get; set; }
public object response { get; set; }
public Response(string version, JsonElement session, object response)
{
this.version = version;
this.session = session;
this.response = response;
}
}
public class Handler
{
public Response FunctionHandler(Request r)
{
string version = r.version;
JsonElement session = r.session;
JsonElement request = r.request;
string text = "Hello! I'll repeat anything you say to me.";
if (request.GetProperty("original_utterance").ToString().Length > 0)
text = request.GetProperty("original_utterance").ToString();
var responseObj = new
{
text = text,
end_session = false,
};
return new Response(version, session, responseObj);
}
}
2. В консоли управления в каталоге, где хотите создать версию функции, откройте Cloud Functions.
3. Выберите функцию.
4. В разделе Последняя версия нажмите кнопку Создать в редакторе.
5. Задайте параметры версии:
- Среда выполнения:
dotnet6
. - Таймаут, секунды: 2.
- Память: 128 МБ.
- Сервисный аккаунт: Не выбрано.
6. Подготовьте код функции:
- Способ: ZIP-архив.
- Файл:
parrot-csharp.zip
. - Точка входа:
Handler
.
7. В правом верхнем углу нажмите кнопку Создать версию.
Вне зависимости от таймаута в настройках версии Яндекс Диалоги будут ждать ответа функции не больше 4,5 секунды.
Откроется страница функции, где в блоке История версий появится ваша версия с тегом $latest
.
Укажите функцию в настройках навыка
После того как навык заработает, зарегистрируйте его:
- Перейдите в консоль разработчика навыка.
- Создайте навык и перейдите на вкладку Настройки.
- В блоке Backend выберите вариант Функция в Яндекс Облаке.
- Из выпадающего списка выберите функцию.
- Заполните обязательные поля в блоках Основные настройки и Публикация в каталоге.
- Внизу страницы нажмите кнопку Сохранить.
В списке отображаются функции, которые вы имеете право просматривать. Но навык заработает, только если вы имеете право запускать функцию. Разрешение на запуск входит в роли Yandex Cloud functions.functionInvoker, editor и выше.
Проверьте работу навыка
-
На странице навыка откройте вкладку Тестирование.
-
Если все настроено правильно, навык предложит начать беседу: «Hello! I'll repeat anything you say to me».
-
Отправьте сообщение с любым текстом и убедитесь, что вам пришел такой же ответ.
-
Попробуйте изменить код навыка. Откройте функцию во вкладке Редактор в консоли Yandex Cloud и отредактируйте код:
Измените приветственную фразу
Найдите строку и измените текст в кавычках. Например:
Node.jsPythonДо:
let text = 'Hello! I\'ll repeat anything you say to me.'
После:
let text = 'Hello! I\'ll repeat anything you say to me twice.'
До:
text = 'Hello! I\'ll repeat anything you say to me.'
После:
text = 'Hello! I\'ll repeat anything you say to me twice.'.
Измените ответ
Добавьте еще один повтор реплики:
Node.jsPythonДо:
text = request['original_utterance'];
После:
text = request['original_utterance'].concat('\n').repeat(2);
До:
text = event['request']['original_utterance']
После:
text = '\n'.join(2*[event['request']['original_utterance']])
Чтобы сохранить новую версию функции, нажмите Создать версию. Проверьте изменения в навыке.
-
Попробуйте заменить код и среду выполнения в рамках одной функции. Функция останется активной, и накопленная статистика сохранится.
Что дальше
- Попробуйте выполнить другие функции, которые возвращают в ответе изображения и проигрывают звуки.
- Узнайте обо всех дополнительных возможностях в протоколе работы Яндекс Диалогов и модели программирования Cloud Functions.