Программистам

Эта инструкция поможет вам подготовить код на Node.js, Python, PHP, R, Go, Java или C#, запустить его и протестировать навык.

Для примера создадим навык Попугай: он повторяет все, что написал или сказал пользователь.

Создайте функцию

Если вы не работали с Yandex Cloud
  1. Перейдите по ссылке. Примите условия и нажмите кнопку Войти.
  2. Введите название нового облака и нажмите кнопку Создать.

Создайте в Yandex Cloud функцию для навыка:

  1. Откройте консоль управления.

  2. Выберите Cloud Functions.

  3. Нажмите кнопку Создать функцию.

  4. Введите имя функции. Условия:

    • длина — от 3 до 63 символов;

    • может содержать строчные буквы латинского алфавита, цифры и дефисы;

    • первый символ — буква, последний — не дефис.

      Например, my-first-function.

  5. Нажмите кнопку Создать.

  6. Если у вас нет платежного аккаунта, зарегистрируйте его.

Платежный аккаунт необходим для любых сервисов 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.

Укажите функцию в настройках навыка

После того как навык заработает, зарегистрируйте его:

  1. Перейдите в консоль разработчика навыка.
  2. Создайте навык и перейдите на вкладку Настройки.
  3. В блоке Backend выберите вариант Функция в Яндекс Облаке.
  4. Из выпадающего списка выберите функцию.
  5. Заполните обязательные поля в блоках Основные настройки и Публикация в каталоге.
  6. Внизу страницы нажмите кнопку Сохранить.

В списке отображаются функции, которые вы имеете право просматривать. Но навык заработает, только если вы имеете право запускать функцию. Разрешение на запуск входит в роли Yandex Cloud functions.functionInvoker, editor и выше.

Проверьте работу навыка

  1. На странице навыка откройте вкладку Тестирование.

  2. Если все настроено правильно, навык предложит начать беседу: «Hello! I'll repeat anything you say to me».

  3. Отправьте сообщение с любым текстом и убедитесь, что вам пришел такой же ответ.

  4. Попробуйте изменить код навыка. Откройте функцию во вкладке Редактор в консоли Yandex Cloud и отредактируйте код:

    Измените приветственную фразу

    Найдите строку и измените текст в кавычках. Например:

    До: 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.'.

    Измените ответ

    Добавьте еще один повтор реплики:

    До: 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']])

    Чтобы сохранить новую версию функции, нажмите Создать версию. Проверьте изменения в навыке.

  5. Попробуйте заменить код и среду выполнения в рамках одной функции. Функция останется активной, и накопленная статистика сохранится.

Что дальше

Полезные видео

Школа Алисы. Как бесплатно разместить навык в Yandex Cloud

Навык за 20 минут