Je suis nouveau sur les API Google. Je souhaite savoir comment appeler l'API Google Dialogflow en C # pour obtenir une intention dans le texte saisi. Mais je ne trouve aucun exemple pour appeler Dialogflow en utilisant C #.
Veuillez donner un exemple pour appeler Dialogflow à partir de C #.
Si je comprends bien votre question, vous souhaitez appeler l'API DialogFlow à partir d'une application C # (plutôt que d'écrire des points de terminaison d'exécution appelés à partir de DialogFlow. Si c'est le cas, voici un exemple pour effectuer cet appel:
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();
Dans une version antérieure de DialogFlowAPI, je rencontrais des problèmes de verrouillage de fichier lorsque je tentais de redéployer un projet d'API Web que la fonction channel.ShutDownAsync()
semblait résoudre. Je pense que cela a été corrigé dans une version récente.
C’est la version la plus simple d’une demande DF que j’ai utilisée. Il existe une version plus complexe qui passe dans un contexte de saisie dans cet article: Appels DetectIntent DialogFlow v2 avec w/C # (y compris le contexte de saisie)
(Je suppose que vous savez que DialogFlow appellera votre code comme spécifié/enregistré dans l'action de DialogFlow? Votre code ne peut donc que répondre.)
N'appelez pas Google. Apis . Dialogflow.v2 (avec GoogleCloudDialogflowV2WebhookRequest
et GoogleCloudDialogflowV2WebhookResponse
), mais utilisez Google. Cloud . Dialogflow.v2 (avec WebhookRequest
et WebhookResponse
) - voir ceci eTag -Erreur .
Utilisation de Google.Cloud.Dialogflow.v2 NuGet Beta , actuellement en aperçu:
[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" }; ;
}
Edit: Il s'avère que la liaison de modèle ne lie pas correctement toutes les propriétés du 'ProtoBuf-json' (par exemple, WebhookRequest.outputContexts[N].parameters
), . Il est donc conseillé d'utiliser le Google.Protobuf.JsonParser
(par exemple, voir cette documentation ).
Cet analyseur peut trébucher sur des champs inconnus, donc on veut probablement aussi l'ignorer. Alors maintenant, j'utilise ce code (je pourrais un jour rendre la méthode générique plus générique et donc utile, en faisant de HttpContext.Request.InputStream
un paramètre):
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;
}
BTW: Ce 'ProtoBuf-json' est également la raison d'utiliser WebhookResponse.ToString()
qui à son tour utilise Google.Protobuf.JsonFormatter.ToDiagnosticString
.
Packages BotBuilder de Microsoft et Modèle Visual Studio . Je ne l'ai pas encore utilisé, mais je m'attends à peu près au même code?
Un exemple simple de code de requête entrante (appelé NLU-Response by Google) est fourni par Madoka Chiyoda ( Chomado ) sur Github . L'appel entrant est simplement analysé vers elle DialogFlowResponseModel :
public static async Task<HttpResponseMessage> Run([...]HttpRequestMessage req, [...]CloudBlockBlob mp3Out, TraceWriter log)
...
var data = await req.Content.ReadAsAsync<Models.DialogFlowResponseModel>();
Si vous envisagez de travailler sans DialogFlow ultérieurement, notez que l'interface pour Gactions diffère considérablement de l'interface avec DialogFlow. Les paramètres json et les valeurs renvoyées présentent un chevauchement, mais rien vous faire gagner du temps de programmation (probablement perdre du temps en recommençant).
Cependant, commencer par DialogFlow peut vous procurer une expérience de dialogue rapide (par exemple, conception/prototypage de questions/réponses). Et l’API-DialogFlow possède un package NuGet, où l’interface Gactions n’a pas d’interface NuGet. package pour l'instant .