Dialogflow V2 (бета1) SDK для Obj- C - PullRequest
       0

Dialogflow V2 (бета1) SDK для Obj- C

1 голос
/ 01 февраля 2020

Я бы хотел использовать сервис диалогового потока в приложении, написанном с использованием obj- c. Некоторое время использовал библиотеку api.ai, но, похоже, не смог найти библиотеку для obj- c для dialogflow v2 (бета1) apis. Мой агент уже обновлен до версии v2, но api.ai внутренне использует / v1 / endpoints, и мне нужно использовать функции v2beta1 c, такие как доступ к базам знаний. (https://cloud.google.com/dialogflow/docs/reference/rpc/google.cloud.dialogflow.v2beta1#queryparameters - базы знаний_имений). API-интерфейс диалогового потока - это стандартный API REST, поэтому все, что мне нужно, это клиент OAuth2.0 и REST, но кодирование этого звучит как переизобретение колеса.

Пожалуйста, совет. Спасибо

Ответы [ 2 ]

1 голос
/ 09 февраля 2020

Я не думаю, что есть библиотека, написанная специально для Dialogflow v2; однако библиотека google-api-objectivec-client-for-rest является общей c библиотекой, предоставляемой Google, которая упрощает код для использования их API остальных.

Эта библиотека обновлена ​​для использования с Dialogflow V2 . Чтобы использовать его, вам нужно сопоставить Rest API с «запросами» (методы API) и «объектами» (типы API) в библиотеке, что не так сложно, поскольку имена в основном совпадают.

Например, полное имя метода detectIntent :

projects.agent.sessions.detectIntent

В библиотеке это эквивалент запроса:

GTLRDialogflowQuery_ProjectsAgentSessionsDetectIntent

Вот пример запроса на DeteIntent:

// Create the service
GTLRDialogflowService *service = [[GTLRDialogflowService alloc] init];

// Create the request object (The JSON payload)
GTLRDialogflow_GoogleCloudDialogflowV2DetectIntentRequest *request =
                     [GTLRDialogflow_GoogleCloudDialogflowV2DetectIntentRequest object];

// Set the information in the request object
request.inputAudio = myInputAudio;
request.outputAudioConfig = myOutputAudioConfig;
request.queryInput = myQueryInput;
request.queryParams = myQueryParams;

// Create a query with session (Path parameter) and the request object
GTLRDialogflowQuery_ProjectsAgentSessionsDetectIntent *query =
    [GTLRDialogflowQuery_ProjectsAgentSessionsDetectIntent queryWithObject:request
                                                            session:@"session"];

// Create a ticket with a callback to fetch the result
GTLRServiceTicket *ticket =
    [service executeQuery:query
        completionHandler:^(GTLRServiceTicket *callbackTicket,
                            GTLRDialogflow_GoogleCloudDialogflowV2DetectIntentResponse *detectIntentResponse,
                            NSError *callbackError) {
    // This callback block is run when the fetch completes.
    if (callbackError != nil) {
      NSLog(@"Fetch failed: %@", callbackError);
    } else {
      // The response from the agent
      NSLog(@"%@", detectIntentResponse.queryResult.fulfillmentText);
    }
}];

Более подробную информацию и примеры можно найти в библиотеке wiki . Наконец, в библиотеке также есть пример кода с использованием Google Cloud Storage , который иллюстрирует его использование со службами GCP.

Я думаю, что без специальной библиотеки c для Dialogflow V2 это может быть следующая вещь, которую нужно попробовать перед реализацией с нуля.

EDIT

Упс, я упустил тот факт, что сгенерированный сервис для Dialogflow не содержит v2beta1.

В этом случае необходим дополнительный первый шаг, который заключается в использовании Dialogflow v2beta1 DiscoveryDocument и ServiceGenerator , чтобы создать интерфейс службы для v2beta1. Тогда вы можете продолжать работать так же, как я упоминал ранее.

0 голосов
/ 22 февраля 2020

Следуя примеру @Tlaquetzal, я закончил тем, что сделал что-то вроде ниже

В файле pod

pod 'GoogleAPIClientForREST'
pod 'JWT'

Используя ServiceGenerator и Документ обнаружения как уже упоминалось выше, генерируется набор классов DialogFlow v2beta1. Командная строка

./ServiceGenerator --outputDir . --verbose --gtlrFrameworkName GTLR --addServiceNameDir yes --guessFormattedNames https://dialogflow.googleapis.com/\$discovery/rest?version=v2beta1

И добавила их в проект.

#import "DialogflowV2Beta1/GTLRDialogflow.h"

Следующим шагом является генерация токена JWT. Я использовал эту библиотеку JSON Реализация Web Token в Objective- C. Я хочу подключиться, используя служебную учетную запись.

NSInteger unixtime = [[NSNumber numberWithDouble: [[NSDate date] timeIntervalSince1970]] integerValue];
    NSInteger expires = unixtime + 3600;    //expire in one hour
    NSString *iat = [NSString stringWithFormat:@"%ld", unixtime];
    NSString *exp = [NSString stringWithFormat:@"%ld", expires];

    NSDictionary *payload = @{
        @"iss": @"<YOUR-SERVICE-ACCOUNT-EMAIL>",
        @"sub": @"<YOUR-SERVICE-ACCOUNT-EMAIL>",
        @"aud": @"https://dialogflow.googleapis.com/",
        @"iat": iat,
        @"exp": exp
    };

    NSDictionary *headers = @{
        @"alg" : @"RS256",
        @"typ" : @"JWT",
        @"kid" : @"<KID FROM YOUR SERVICE ACCOUNT FILE>"
    };

    NSString *algorithmName = @"RS256";
    NSData *privateKeySecretData = [[[NSDataAsset alloc] initWithName:@"<IOS-ASSET-NAME-JSON-SERVICE-ACCOUNT-FILE>"] data];
    NSString *passphraseForPrivateKey = @"<PASSWORD-FOR-PRIVATE-KEY-IN-CERT-JSON>";

    JWTBuilder *builder = [JWTBuilder encodePayload:payload].headers(headers).secretData(privateKeySecretData).privateKeyCertificatePassphrase(passphraseForPrivateKey).algorithmName(algorithmName);
NSString *token = builder.encode;

// check error
if (builder.jwtError == nil) {
    JwtToken *jwtToken = [[JwtToken alloc] initWithToken:token expires:expires];
    success(jwtToken);
}
else {
    // error occurred.
    MSLog(@"ERROR. jwtError = %@", builder.jwtError);

    failure(builder.jwtError);
}

Когда токен генерируется, его можно использовать в течение часа (или времени, указанного вами выше).

Для вызова диалогового потока вам нужно определить путь вашего проекта. Чтобы создать путь проекта для вызова, добавьте код под вашим уникальным идентификатором сеанса. Сеанс похож на диалог для диалогового потока, поэтому разные пользователи должны использовать разные идентификаторы сеанса

#define PROJECTPATH @"projects/<YOUR-PROJECT-NAME>/agent/sessions/"

Выполнение вызова диалогового потока

    // Create the service
    GTLRDialogflowService *service = [[GTLRDialogflowService alloc] init];

    //authorise with token
    service.additionalHTTPHeaders = @{
        @"Authorization" : [NSString stringWithFormat:@"Bearer %@", self.getToken.token]
    };

    // Create the request object (The JSON payload)
    GTLRDialogflow_GoogleCloudDialogflowV2beta1DetectIntentRequest *request = [GTLRDialogflow_GoogleCloudDialogflowV2beta1DetectIntentRequest object];

    //create query
    GTLRDialogflow_GoogleCloudDialogflowV2beta1QueryInput *queryInput = [GTLRDialogflow_GoogleCloudDialogflowV2beta1QueryInput object];

    //text query
    GTLRDialogflow_GoogleCloudDialogflowV2beta1TextInput *userText = [GTLRDialogflow_GoogleCloudDialogflowV2beta1TextInput object];


    userText.text = question;
    userText.languageCode = LANGUAGE;
    queryInput.text = @"YOUR QUESTION TO dialogflow agent"; //userText;

    // Set the information in the request object
    //request.inputAudio = myInputAudio;
    //request.outputAudioConfig = myOutputAudioConfig;
    request.queryInput = queryInput;
    //request.queryParams = myQueryParams;

    //Create API project path with session
    NSString *pathAndSession = [NSString stringWithFormat:@"%@%@", PROJECTPATH, [self getSession]];

    // Create a query with session (Path parameter) and the request object
    GTLRDialogflowQuery_ProjectsAgentSessionsDetectIntent *query = [GTLRDialogflowQuery_ProjectsAgentSessionsDetectIntent queryWithObject:request session:pathAndSession];


    // Create a ticket with a callback to fetch the result
//    GTLRServiceTicket *ticket =
    [service executeQuery:query
        completionHandler:^(GTLRServiceTicket *callbackTicket, GTLRDialogflow_GoogleCloudDialogflowV2beta1DetectIntentResponse *detectIntentResponse, NSError *callbackError) {

        // This callback block is run when the fetch completes.
        if (callbackError != nil) {
            NSLog(@"error");
            NSLog(@"Fetch failed: %@", callbackError);

            //TODO: Register failure with analytics

            failure( callbackError );
        }
        else {

//            NSLog(@"Success");
          // The response from the agent
//          NSLog(@"%@", detectIntentResponse.queryResult.fulfillmentText);
            NSString *response = detectIntentResponse.queryResult.fulfillmentText;
            success( response );
        }

    }];

Это базовая c реализация, но работает и хорошо для демонстрации. Удачи

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