Alexa SMAPI - намерение обновления возвращает ошибку: «С указанным навыком или языковым стандартом не связана модель». - PullRequest
1 голос
/ 06 мая 2019

Я использую Amazon Alexa API управления навыками (SMAPI) для клонирования одного из моих навыков и изменения ключевых переменных, таких как имя навыка, и я могу сделатьэто успешно: я получаю манифест, делаю некоторые изменения и создаю новый навык, используя этот обновленный манифест.

Затем я жду, пока статус навыка не будет завершен, и затем я могу успешно получить свой планмодель взаимодействия навыка, но когда я ОБНОВЛЯЮ новый навык с моделью взаимодействия, я получаю эту ошибку:

"{" message ":" С указанным навыком или языковым стандартом не связана модель. "} "

Я искал через API способ" связать "модель для нового навыка перед обновлением, но я ничего не могу найти.API действительно говорит, что при использовании Обновить модель взаимодействия "Создает модель взаимодействия для навыка." Поэтому я ожидаю, что он создаст модель, если навык неУ меня есть еще один связанный.

Я связался и еще не получил ответ от службы поддержки Amazon.

ДЕТАЛИ

Вот шаги, которые я предпринимаю, которые приводят к указанной выше ошибке:

Я использую свою собственную веб-страницу, построенную на PHP, для управления навыками Alexa с помощью SMAPI.

Сначала я использую Amazon Login, чтобы получить access_token с необходимыми разрешениями:

 alexa::ask:skills:read  
 alexa::ask:skills:readwrite 
 alexa::ask:models:read 
 alexa::ask:models:readwrite 
 alexa::ask:skills:test

Это успешно возвращает access_token.Затем я использую access_token, чтобы получить список навыков.Затем вышлите эти навыки кнопкой, чтобы клонировать их.При этом в качестве шаблона skillId будет использоваться идентификатор навыка.

Код навыка клонирования:

//GET THE MANIFEST OF THE BLUEPRINT SKILL
$manifestObj = getAlexaSkillManifest($access_token, $skillId);

//CHANGE THE NAME IN THE SKILL MANIFEST
$manifestObj['manifest']['publishingInformation']['locales']['en-US']['name'] = "clone test";

//CREATE NEW SKILL USING BLUEPRINT MANIFEST
$createdSkill = createAlexaSkillManifest($access_token, $vendorId, $manifestObj['manifest'], $body);
$newSkillId = $createdSkill['skillId'];

//SUCCESSFUL SO FAR

//GET BLUEPRINT SKILL'S INTERACTION MODEL
$blueprintSkillIntents = getAlexaSkillIntents($access_token, $skillId);

//CHECK AND WAIT FOR THE NEW SKILL TO BE COMPLETELY CREATED BEFORE ATTEMPTING TO UPDATE THE NEW SKILL'S INTERACTION MODEL
for ($i=0; $i <= 3; $i++) {
    $status = getAlexaSkillStatus ($access_token, $newSkillId);
    if($status['manifest']['lastUpdateRequest']['status']=="SUCCEEDED") {

        //LOGGING HERE SHOWS THIS FIRES AFTER NEW SKILL STATUS IS COMPLETE

        //UPDATE NEW SKILL INTERACTION MODEL
        $newSkillIntents = updateAlexaSkillIntents($access_token, $newSkillId, $blueprintSkillIntents);
        break;
    }
    sleep(1);
}

Получить функцию модели взаимодействия с планом (SUCCESSFUL):

function getAlexaSkillIntents ($access_token, $skillId, $stage="development", $version="~current") {

    $locale="en-US";
    $url = "https://api.amazonalexa.com/v1/skills/$skillId/stages/$stage/interactionModel/locales/$locale/versions/$version";

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: '.$access_token));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_HTTP_VERSION, 'CURLOPT_HTTP_VERSION_NONE');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);
    curl_close($ch);

    $result = json_decode($result, true);
    return $result;
}

//SUCCESSFULLY RETURNS THE INTERACTION MODEL OF THE BLUEPRINT SKILL

Обновите новый навык Функция модели взаимодействия (ОШИБКИ):

function updateAlexaSkillIntents ($access_token, $skillId, $intentModel, $stage="development") {

    $intentModel=json_encode($intentModel);

    $locale="en-US";
    $url = "https://api.amazonalexa.com/v1/skills/$skillId/stages/$stage/interactionModel/locales/$locale";

    $fp = fopen('php://temp/maxmemory:256000', 'w');

    if (!$fp) { die('could not open temp memory data'); }

    fwrite($fp, $intentModel);
    fseek($fp, 0);

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
    curl_setopt($ch, CURLOPT_INFILE, $fp); // file pointer
    curl_setopt($ch, CURLOPT_INFILESIZE, strlen($intentModel));
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: '.$access_token));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_HTTP_VERSION, 'CURLOPT_HTTP_VERSION_NONE');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);
    curl_close($ch);

    $result = json_decode($result, true);
    return $result;
}

То, что $result возвращает ошибку из Alexa SMAPI:

"{" message ":" Theуказанному навыку или локали не соответствует модель. "}"

Как я могу устранить эту ошибку? или Как мне использовать SMAPI для клонированияумение?

1 Ответ

1 голос
/ 28 мая 2019

Я получил такое же сообщение об ошибке при использовании ASK CLI для обновления модели навыков.Проблема была в локали.Я использовал en-UK в командной строке, в то время как навык поддерживал только en-US.

Пример:

ask api get-model --debug -s "skill id ..."--stage development -l en-US > model.json
...