web-dev-qa-db-ja.com

C#でgoogle.apis.dialogflow.v2を呼び出す方法

Google APIは初めてです。 C#でGoogle Dialogflow APIを呼び出して、入力テキストから意図を取得する方法を知りたい。しかし、C#を使用してDialogflowを呼び出す例は見つかりません。

C#からDialogflowを呼び出す例をいくつか提供してください。

8
Gowdham

質問を正しく理解できたら、DialogFlowから呼び出されるフルフィルメントエンドポイントを記述するのではなく、C#アプリケーション内からDialogFlow APIを呼び出します。その場合は、その呼び出しのサンプルを次に示します。

_using Google.Cloud.Dialogflow.V2;

...
...

var query = new QueryInput
{
    Text = new TextInput
    {
        Text = "Something you want to ask a DF agent",
        LanguageCode = "en-us"
    }
};

var sessionId = "SomeUniqueId";
var agent = "MyAgentName";
var creds = GoogleCredential.FromJson("{ json google credentials file)");
var channel = new Grpc.Core.Channel(SessionsClient.DefaultEndpoint.Host, 
              creds.ToChannelCredentials());

var client = SessionsClient.Create(channel);

var dialogFlow = client.DetectIntent(
    new SessionName(agent, sessionId),
    query
);
channel.ShutdownAsync();
_

DialogFlowAPIの以前のバージョンでは、channel.ShutDownAsync()が解決したと思われるWeb APIプロジェクトを再デプロイしようとしたときにファイルロックの問題が発生していました。これは最近のリリースで修正されたと思います。

これは、私が使用したDFリクエストの最も簡単なバージョンです。この投稿の入力コンテキストに渡すより複雑なバージョンがあります。 DialogFlow v2 DetectIntent Calls w/C#(入力コンテキストを含む)

6

Nitpicking:DialogFlowがDialogFlowのアクションで指定/登録されたコードを呼び出すことを知っていると思いますか?コードはDialogFlowにのみ応答し、呼び出しはできません。

短い答え/リダイレクト:
Googleを使用しないでください。Apis。Dialogflow.v2(GoogleCloudDialogflowV2WebhookRequestおよびGoogleCloudDialogflowV2WebhookResponseを使用)が、Googleを使用します。Cloud。Dialogflow.v2(WebhookRequestおよびWebhookResponseを使用)-こちらをご覧ください eTag-error また、下にいくつかの他の選択肢についても言及します。

Google.Cloud.Dialogflow.v2

Google.Cloud.Dialogflow.v2 NuGetEdit:FWIW:このコードはベータプレビュー用に作成された)を使用:

    [HttpPost]
    public dynamic PostWithCloudResponse([FromBody] WebhookRequest dialogflowRequest)
    {
        var intentName = dialogflowRequest.QueryResult.Intent.DisplayName;
        var actualQuestion = dialogflowRequest.QueryResult.QueryText;
        var testAnswer = $"Dialogflow Request for intent '{intentName}' and question '{actualQuestion}'";
        var dialogflowResponse = new WebhookResponse
        {
            FulfillmentText = testAnswer,
            FulfillmentMessages =
                { new Intent.Types.Message
                    { SimpleResponses = new Intent.Types.Message.Types.SimpleResponses
                        { SimpleResponses_ =
                            { new Intent.Types.Message.Types.SimpleResponse
                                {
                                   DisplayText = testAnswer,
                                   TextToSpeech = testAnswer,
                                   //Ssml = $"<speak>{testAnswer}</speak>"
                                }
                            }
                        }
                    }
            }
        };
        var jsonResponse = dialogflowResponse.ToString();
        return new ContentResult { Content = jsonResponse, ContentType = "application/json" }; ;
    }

編集:モデルバインディングが 'ProtoBuf-json'のすべてのプロパティを正しくバインドできない場合がある(たとえばWebhookRequest.outputContexts[N].parameters)ため、おそらくGoogle.Protobuf.JsonParserを使用する必要があります(たとえば このドキュメントを参照) )。

このパーサーは未知のフィールドをトリップする可能性があるため、おそらくそれも無視したいと思うでしょう。そこで、このコードを使用します(いつかHttpContext.Request.InputStreamをパラメーターにすることで、ジェネリックメソッドをよりジェネリックにし、便利にすることができます)。

    public ActionResult PostWithCloudResponse()
    {
       var dialogflowRequest = ParseProtobufRequest<WebhookRequest>();
       ...
        var jsonResponse = dialogflowResponse.ToString();
        return new ContentResult { Content = jsonResponse, ContentType = "application/json" }; ;
    }

    private T ParseProtobufRequest<T>() where T : Google.Protobuf.iMessage, new()
    {
        // parse ProtoBuf (not 'normal' json) with unknown fields, else it may not bind ProtoBuf correctly
        // https://github.com/googleapis/google-cloud-dotnet/issues/2425 "ask the Protobuf code to parse the result"
        string requestBody;
        using (var reader = new StreamReader(HttpContext.Request.InputStream))
        {
            requestBody = reader.ReadToEnd();
        }
        var parser = new Google.Protobuf.JsonParser(JsonParser.Settings.Default.WithIgnoreUnknownFields(true));
        var typedRequest = parser.Parse<T>(requestBody);
        return typedRequest;
    }

ところで:この「ProtoBuf-json」は、Google.Protobuf.JsonFormatter.ToDiagnosticStringを使用するWebhookResponse.ToString()を使用する理由でもあります。

MicrosoftのBotBuilder

MicrosoftのBotBuilderパッケージおよび Visual Studioテンプレート 。まだ使用していませんが、ほぼ同じコードを期待していますか?

手書きの独自コード

着信リクエストコード(GoogleのNLUレスポンスと呼ばれる)の簡単な例は、千代田まどか( ChomadoGithub で提供されています。着信コールは単に彼女に解析されます DialogFlowResponseModel

    public static async Task<HttpResponseMessage> Run([...]HttpRequestMessage req, [...]CloudBlockBlob mp3Out, TraceWriter log)
        ...
        var data = await req.Content.ReadAsAsync<Models.DialogFlowResponseModel>();

ガクション

後でwithout DialogFlowを使用する場合は、GactionsのインターフェースがDialogFlowのインターフェースと大きく異なることに注意してください。 jsonパラメーターと戻り値にはオーバーラップがありますが、プログラミング時間を増やすことはありません(「オーバー」を開始することで時間を失う可能性があります)。

ただし、DialogFlowから始めると、ダイアログをすばやく体験できる場合があります(質問と回答の設計/プロトタイプ作成など)。また、DialogFlow-APIにはNuGetパッケージがあり、Gactions-interfaceにはNuGetパッケージがありません ちょうど

4
Yahoo Serious