我是Google API的新手。我想知道如何在C#中调用Google Dialogflow API以获得输入文本的意图。但我找不到任何使用C#调用Dialogflow的例子。
请提供一些示例从C#调用Dialogflow。
答案 0 :(得分:3)
如果我正确理解了您的问题,则希望从C#应用程序中调用DialogFlow API(而不是编写从DialogFlow调用的实现端点。如果是这种情况,以下是进行该调用的示例:>
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请求的最简单版本。这篇文章在输入上下文中传递了一个更复杂的版本: Making DialogFlow v2 DetectIntent Calls w/ C# (including input context)
答案 1 :(得分:2)
(我想您知道DialogFlow将按在DialogFlow动作中指定/注册的方式调用您的代码吗?所以您的代码只能响应。)
请勿致电Google。 Apis .Dialogflow.v2(带有GoogleCloudDialogflowV2WebhookRequest
和GoogleCloudDialogflowV2WebhookResponse
),但要使用Google。 Cloud .Dialogflow。 v2(带有WebhookRequest
和WebhookResponse
)-请参见此eTag-error。
使用Google.Cloud.Dialogflow.v2 NuGet Beta,该预览当前处于预览状态:
[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 :事实证明,模型绑定可能无法正确绑定“ ProtoBuf-json”中的所有属性(例如WebhookRequest.outputContexts[N].parameters
),
因此可能应该使用Google.Protobuf.JsonParser
(例如,参见this documentation)。
此解析器可能会越过未知字段,因此可能还想忽略它。因此,现在我使用此代码(也许有一天,我可以通过将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'也是使用WebhookResponse.ToString()
的原因,而Google.Protobuf.JsonFormatter.ToDiagnosticString
依次使用 public static async Task<HttpResponseMessage> Run([...]HttpRequestMessage req, [...]CloudBlockBlob mp3Out, TraceWriter log)
...
var data = await req.Content.ReadAsAsync<Models.DialogFlowResponseModel>();
。
Microsoft的BotBuilder软件包和Visual Studio template。 我还没有使用过,但是期望大致相同的代码吗?
Madoka Chiyoda(Chomado)在Github提供了一个传入请求代码的简单示例(谷歌称为NLU-Response)。来电仅会解析到她的DialogFlowResponseModel:
app/build.gradle
如果您打算稍后在不使用DialogFlow的情况下进行工作,请注意,Gactions的界面与DialogFlow的界面有很大不同。 json参数和返回值有一些重叠,但是没有任何东西可以使您获得任何编程时间(可能由于“ over”开始而浪费了一些时间)。
但是,从DialogFlow开始可能会获得一些快速的对话经验(例如,问题与答案的设计/原型制作)。 DialogFlow-API确实有一个NuGet程序包,而Gactions接口没有一个NuGet程序包just yet。