Обновление Dialogflow v2 Beta 1 с Python - PullRequest
0 голосов
/ 13 марта 2019

Я потерян. У меня есть текущее намерение в моем проекте, и я пытаюсь обновить ВСЕ поля программно, потому что этого требует мой проект.

Я прочитал эту документацию и проверил этот исходный файл на GitHub, и я думаю, что причина, по которой я получаю сообщение об ошибке, заключается в том, что я не понимаю эту часть источника:

Args: намерение (объединение [dict, ~ google.cloud.dialogflow_v2beta1.types.Intent]): обязательно. Намерение обновлять. Формат: projects/<Project ID>/agent/intents/<Intent ID>. Если указан dict, он должен иметь ту же форму, что и protobuf сообщение: класс: ~google.cloud.dialogflow_v2beta1.types.Intent

(строка 484 для справки)

Платформа прекрасно работает, я просто не знаю, чего мне здесь не хватает ..

Мой код

from constants import *
from google.oauth2 import service_account
import dialogflow_v2beta1
cred = service_account.Credentials.from_service_account_file(AUTH_JSON)
client = dialogflow_v2beta1.IntentsClient(credentials=cred)
params = dialogflow_v2beta1.types.Intent.Parameter(name='test', display_name='test', value='test', is_list=True)
t = dialogflow_v2beta1.types.Intent.Message.Text(text='TEST TEXT')
m = dialogflow_v2beta1.types.Intent.Message(text=t)
p = dialogflow_v2beta1.types.Intent.TrainingPhrase.Part(text='test',entity_type='@test_type', alias='test_alias', user_defined=True)
t = dialogflow_v2beta1.types.Intent.TrainingPhrase(name='test',type=2, parts=[p])
modified_intent = dialogflow_v2beta1.types.Intent(
    display_name='test',       
    messages=[m],
    webhook_state=1,
    is_fallback=False,
    ml_disabled=False,
    input_context_names=PROJECT_DIR+'agent/sessions/-/contexts/' + 'TEST_CONTEXT',
    events='TESTING EVENT',
    training_phrases=[t],
    action='TESTING ACTION',
    reset_contexts=False,
    parameters=[params]
    ) 
name = client.intent_path(PROJECT_NAME, '7b8f2105-53d4-4724-8d4c-0170b8db7028')
intent = client.get_intent(name)
client.update_intent(intent=modified_intent, language_code=LANGUAGE_CODE, intent_view=0)

Полное сообщение об ошибке

Traceback (most recent call last):
  File "/anaconda/envs/data/lib/python3.6/site-packages/google/api_core/grpc_helpers.py", line 57, in error_remapped_callable
    return callable_(*args, **kwargs)
  File "/anaconda/envs/data/lib/python3.6/site-packages/grpc/_channel.py", line 550, in __call__
    return _end_unary_response_blocking(state, call, False, None)
  File "/anaconda/envs/data/lib/python3.6/site-packages/grpc/_channel.py", line 467, in _end_unary_response_blocking
    raise _Rendezvous(state, None, None, deadline)
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with:
        status = StatusCode.INVALID_ARGUMENT
        details = "Resource name '' does not match 'projects/*/agent/intents/*'."
        debug_error_string = "{"created":"@1552461629.958860000","description":"Error received from peer","file":"src/core/lib/surface/call.cc","file_line":1036,"grpc_message":"Resource name '' does not match 'projects/*/agent/intents/*'.","grpc_status":3}"
>

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "test.py", line 26, in <module>
    client.update_intent(intent=modified_intent, language_code=LANGUAGE_CODE, intent_view=0)
  File "/anaconda/envs/data/lib/python3.6/site-packages/dialogflow_v2beta1/gapic/intents_client.py", line 535, in update_intent
    request, retry=retry, timeout=timeout, metadata=metadata)
  File "/anaconda/envs/data/lib/python3.6/site-packages/google/api_core/gapic_v1/method.py", line 143, in __call__
    return wrapped_func(*args, **kwargs)
  File "/anaconda/envs/data/lib/python3.6/site-packages/google/api_core/retry.py", line 270, in retry_wrapped_func
    on_error=on_error,
  File "/anaconda/envs/data/lib/python3.6/site-packages/google/api_core/retry.py", line 179, in retry_target
    return target()
  File "/anaconda/envs/data/lib/python3.6/site-packages/google/api_core/timeout.py", line 214, in func_with_timeout
    return func(*args, **kwargs)
  File "/anaconda/envs/data/lib/python3.6/site-packages/google/api_core/grpc_helpers.py", line 59, in error_remapped_callable
    six.raise_from(exceptions.from_grpc_error(exc), exc)
  File "<string>", line 3, in raise_from
google.api_core.exceptions.InvalidArgument: 400 Resource name '' does not match 'projects/*/agent/intents/*'.

1 Ответ

1 голос
/ 15 марта 2019

Вы можете получить намерение, которое хотите правильно изменить, используя

name = client.intent_path(PROJECT_NAME, your_intent_id)

Вы получите полное определение своего намерения.
Затем вам нужно изменить значения этого намерения, получив к ним доступ и присвоив свои значения.
После этого вам нужно передать то же самое намерение в вашей функции update_intent().
Также рекомендуется использовать update_mask, чтобы избежать изменения любого другого поля или установки остальных полей. Нет.

Вот пример обновления намерения display_name с greet до hello :

client = dialogflow.IntentsClient()
intent_name = client.intent_path(project_id, intent_id)
intent = client.get_intent(intent_name, intent_view=dialogflow.enums.IntentView.INTENT_VIEW_FULL)
intent.display_name = 'hello'
update_mask = field_mask_pb2.FieldMask(paths=['display_name']) 
print(response)

Вам также потребуется дополнительный импорт в вашем коде:

from google.protobuf import field_mask_pb2

Таким образом, имя дисплея намерения будет изменено.
Вы можете сделать то же самое для остальной части вашей собственности. Просто не забудьте передать значение, которое ожидает свойство, следуя этой документации , и вы также можете получить помощь по этой проблеме .

Надеюсь, это поможет.

...