Программистам
Эта инструкция поможет вам подготовить код на 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.