Как обновить сущность сеанса в Dialogflow? - PullRequest
0 голосов
/ 19 января 2019

Я определил сущность с именем visible_objects в моем агенте Dialogflow.

В консоли Dialogflow я поместил одну запись с именем placeholder2 с заполнителем синонимов.

enter image description here

Когда пользователь начинает взаимодействовать с агентом, я обновляю эту сущность с помощью запроса исправления projects.agent.sessions.entity.Ниже приводится содержание запроса, который я отправляю.

`{
    "name": "projects\/{PROJECT_NAME}\/agent\/sessions\/{SESSION}\/entityTypes\/visible_objects",
    "entityOverrideMode": "ENTITY_OVERRIDE_MODE_OVERRIDE",
    "entities": [
        {
            "value": "door",
            "synonyms": [
                "door"
            ]
        },
        {
            "value": "desk",
            "synonyms": [
                "desk"
            ]
        },
        {
            "value": "test tubes",
            "synonyms": [
                "test tubes",
                "test",
                "tubes"
            ]
        }
    ]
}`

И вот код, который я использую для его генерации:

<?php

$json = file_get_contents('php://input');
$request = json_decode($json, true);
$df_action = $request['queryResult']['action'];
$df_contexts = $request['queryResult']['outputContexts'];
$df_parameters = $request['queryResult']['parameters'];

// taken from private_key in my GCP authentication .json file
$CLIENT_ACCESS_TOKEN = "-----BEGIN PRIVATE KEY-----xxxxxxxxxxxxxx---END PRIVATE KEY-----\n";

// loop through the visible objects and prepare the output for dialogflow
foreach($_SESSION['STORY']['VISIBLE_OBJECTS'] as $visible_object)
{
    unset($synonyms);       // clear any existing synonyms
    $synonyms = array();
    $synonyms[] = $visible_object['name'];
    if (strpos($visible_object['name'], ' ', 1))
    {       // multiple words so split it as synonyms
        $sub_objects = explode(' ', $visible_object['name']);
        foreach($sub_objects as $sub_object)
            $synonyms[] = $sub_object;
    }

    // add the object to the user entity
    $user_ent_objects[] = array('value'=>$visible_object['name'], 'synonyms'=>$synonyms);
}

// prepare user_entity
$user_entity = array('name'=>$request['session'] . '/entityTypes/visible_objects', 'entityOverrideMode'=>'ENTITY_OVERRIDE_MODE_OVERRIDE', 'entities'=>$user_ent_objects);

// log for debugging
file_put_contents($SITE_DIR . '/webhook/user-entity-visible-objects.txt',  json_encode($user_entity,JSON_PRETTY_PRINT));

$ch = curl_init('https://dialogflow.googleapis.com/v2/' . $request['session'] . '/entityTypes/visible_objects');

curl_setopt($ch, CURLOPT_POST, true);        // tell it we're posting
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Authorization: Bearer ' . $CLIENT_ACCESS_TOKEN));      // set the headers
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($user_entity));     // load our data
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$curl_response = curl_exec($ch);     // execute it

?>

У меня есть намерение "посмотрите на имя объекта ", где имя объекта сопоставлено с объектом visible_objects.Вот что я вижу для некоторых примеров фраз:

  • посмотрите на заполнитель -> «заполнитель» обнаружен как имя объекта
  • посмотрите на тесте -> имя объекта не обнаружено
  • взгляд на трубы -> имя объекта не обнаружено
  • взгляд на стол -> имя объекта не обнаружено

На основании этих ответов появляется объект сеансане обновляется, так как новые значения не обнаруживаются, и аналогично старое значение placeholder2 не перезаписывается.

Мой webhook написан на PHP, и я не использую Google SDK (он используется только в альфа-версии дляPHP).Я получаю ответ от запроса curl_exec , но ничего не возвращается.

С помощью curl_getinfo я вижу следующее:

`[url] => https://dialogflow.googleapis.com/v2/projects/escaperoom-447aa/agent/sessions/SESSION_ID_MASKED/entityTypes/visible_objects
[content_type] => text/html; charset=UTF-8
[http_code] => 400
[header_size] => 144
[request_size] => 2002
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.072034
[namelookup_time] => 0.023728
[connect_time] => 0.031063
[pretransfer_time] => 0.065598
[size_upload] => 394
[size_download] => 0
[speed_download] => 0
[speed_upload] => 5472
[download_content_length] => 1555
[upload_content_length] => 394
[starttransfer_time] => 0.065659
[redirect_time] => 0
[redirect_url] => 
[primary_ip] => 216.58.192.234
[certinfo] => Array
    (
    )

[primary_port] => 443
[local_ip] => 66.198.240.46
[local_port] => 41442

`

Кто-нибудь может увидеть, что я здесь делаю не так?

1 Ответ

0 голосов
/ 23 января 2019

Проблема в том, что вы не устанавливаете $CLIENT_ACCESS_TOKEN на токен доступа.Вы устанавливаете его на свой личный ключ, который должен быть связан с учетной записью службы.

Вам потребуется использовать этот закрытый ключ, чтобы сгенерировал токен доступа - это не сам токен доступа.Поскольку для службы Dialogflow существует определение службы, вы можете просто создать подписанный JWT для службы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...