DialogFlow detectIntentText - PullRequest
       19

DialogFlow detectIntentText

0 голосов
/ 07 мая 2018

Я использую DF с Python API, и вот код, и я не могу использовать текст определения намерения.

Если я использую вторую строку, я получаю следующую ошибку: google.api_core.exceptions.PermissionDenied: 403 Разрешение IAM 'dialogflow.sessions.detectIntent' для 'projects / newagent / agent' отклонено.

Если я использую первый: google.api_core.exceptions.InvalidArgument: 400 Имя ресурса 'projects / newagent / agent / environment / draft / users // agent / session / 5276b6d4-a0b6-4e91-84d3-16512d1f3299' не соответствует 'projects / / agent /environments//users//sessions/'.

Я включил биллинг в Google Cloud, и у пользователя есть права владельца. Что не так?

def detect_intent_texts(project_id, session_id, texts, language_code):
session_client = dialogflow_v2.SessionsClient()

#----------------------------------------------------------Lines that I talk about in the question---------------------------------------------------------------------------------------------------
#session = session_client.session_path(project_id, session_id)
session = "projects/newagent/agent/environments/draft/users/<user id>/sessions/6344a857-9de5-406c-ba0f-c71b7b3ffdba"
#----------------------------------------------------------Lines that I talk about in the question---------------------------------------------------------------------------------------------------

for text in texts:
    text_input = dialogflow_v2.types.TextInput(text=text, language_code=language_code)
    query_input = dialogflow_v2.types.QueryInput(text=text_input)
    response = session_client.detect_intent(session=session, query_input=query_input)

detect_intent_texts("newagent/agent/environments/draft/users/<User Number>",str(uuid.uuid4()),"Que tal?","es-ES")

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Когда удостоверение вызывает API-интерфейс Google Cloud Platform, Google Identity and Access Management (IAM) требует, чтобы удостоверение имело соответствующие разрешения для использования ресурса, для которого вам нужно создать пользовательские роли, а затем назначить учетной записи службы. Затем вы будете использовать эту учетную запись службы для вызова API Google Cloud Platform. Здесь вы можете искать Dialogflow и видеть, что DF поддерживается только с пользовательскими ролями. Вот почему у вас есть google.api_core.exceptions.PermissionDenied: 403 разрешение IAM 'dialogflow.sessions.detectIntent'. Выполните следующие шаги:

  1. Перейдите к своему проекту в Google Cloud Platform и выберите роли, как показано здесь: as shown here
  2. Затем нажмите «Создать роль», введите имя роли и соответствующие поля. Затем нажмите Add Permissions и в фильтре выполните поиск «Service: Dialogflow». Выберите необходимые разрешения и нажмите «Создать».
  3. Затем выберите это: Then select this.
  4. Нажмите «Создать учетную запись службы» и выберите «Выбор роли», введите и найдите роль, созданную на шаге 2, и сохраните учетную запись.
  5. Сделайте это: Do this. Список сервисных аккаунтов покажет. Нажмите кнопку «Создать учетные данные».
  6. Выберите учетную запись службы, созданную на предыдущих этапах, и выберите JSON. Затем выберите Создать. Скачайте файл JSON.
  7. Добавьте этот файл в свой код как: os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'yourfilename.json'
  8. Создайте агента в консоли Dialogflow с проектом Google, для которого вы выполнили все вышеперечисленные шаги. Наслаждайтесь: D
0 голосов
/ 08 мая 2018

Идентификатор сеанса должен иметь формат projects/<Project ID>/agent/sessions/<Session ID> (то есть <Project ID> идентификатор проекта GCP, в котором находится ваш агент, и <Session ID> идентификатор, который вы используете для текущего сеанса), как видно из эта страница документации .

В вашем коде я вижу, что вы вызываете функцию detect_intent_texts(), например:

project_id = "newagent/agent/environments/draft/users/<User Number>"
session_id = str(uuid.uuid4())
texts = "Que tal?"
language_code = "es-ES"

Здесь я вижу две основные ошибки:

  1. Идентификатор проекта имеет неправильный формат, это должен быть идентификатор вашего проекта GCP, который обычно имеет формат, такой как my-first-project или аналогичный, и косые черты / не поддерживаются, поэтому вы используете неправильный Идентификатор проекта .
  2. Текст должен представлять собой список строк в Python, например ["hello"], а не просто "hello".

В качестве примера следующий минимальный код дает следующий результат:

import dialogflow

def detect_intent_texts(project_id, session_id, texts, language_code):
    session_client = dialogflow.SessionsClient()

    session = session_client.session_path(project_id, session_id)
    print('Session path: {}\n'.format(session))

    for text in texts:
        text_input = dialogflow.types.TextInput(text=text, language_code=language_code)
        query_input = dialogflow.types.QueryInput(text=text_input)
        response = session_client.detect_intent(session=session, query_input=query_input)

        print('Fulfillment text: {}\n'.format(response.query_result.fulfillment_text))

detect_intent_texts("my-project","abcd",["hello"],"en-US")

Результат:

user@my-project:~/dialogflow$ python detect_intent_minimal.py
Session path: projects/my-project/agent/sessions/abcd
Fulfillment text: Hi!

Поэтому я подозреваю, что изменение project_id на правильное значение и texts в список должно решить ваши проблемы.


EDIT: Мне удалось воспроизвести проблему, с которой вы столкнулись, в сообщении 403 PermissionDenied, используя служебную учетную запись без необходимых разрешений.

Для запуска намерений в Dialogflow вам необходимо использовать служебную учетную запись с одной из следующих ролей:

enter image description here

Администратор API Dialogflow и Клиент API Dialogflow может запрашивать намерения, и поэтому один из них необходим для выполнения типа запросов, которые вы пытаетесь выполнить с вашим сценарий.

Я вижу, вы сказали, что у вашего пользователя есть права владельца на проект. Однако проблема может заключаться в том, что вы используете неправильную учетную запись службы. Для правильной настройки аутентификации выполните шаги, описанные в документах . Таким образом, вам нужно будет создать учетную запись службы с соответствующими разрешениями, загрузить ее ключ JSON и использовать ее в качестве переменной среды, выполнив команду export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/key.json" везде, где вы запускаете сценарий.

...