“没有这样的宿主。”将带有 LUIS AI 的机器人发布到 Azure 但在本地工作正常时出错
“No such host is known.” error when publishing bot with LUIS AI to Azure but working fine locally
我在 Azure 中托管了一个机器人,当通过机器人模拟器使用 ngrok 进行调试时,我收到一条错误消息:没有这样的主机已知。我以前有过这样的机器人体验,这意味着 LUIS AI 配置,特别是 LuisAPIHostName 值,没有以正确的格式写入 appsettings.json。
事实证明,当时甚至还没有托管应用程序时,问题是我从托管 LUIS 服务获得了一个端点,https://.api.cognitive.microsoft.com/ ,但我只需要使用 作为 LuisAPIHostName 的值并且应用程序开始工作,因为完整端点是在 Luis Recognizer 中编写的(来自 Microsoft 文档的代码,link 下面提供),带有字符串插值。
回到当前问题,我试图通过绕过我的应用程序中的 LUIS 逻辑来隔离问题,然后再次发布它,然后机器人开始在 Azure Web Chat 中正常工作。
所以,我猜问题可能出在 LUIS 配置上。但如果它在本地使用以前的解决方案,LUIS 服务与机器人托管在同一个订阅中,如何让它在 Azure 上运行?我为 LuisAPIHostName 尝试了一些组合,包括 Azure 提供的整个字符串并在末尾添加了一个额外的“/”,但这并没有改变任何事情......
机器人是用:
编写的
v4.13.0 Bot Builder 库
.NET 核心 3.1 框架
在 Azure 中托管为 Web App Bot,具有相应的 AppService
更新:
在我的应用程序中添加 LUIS 的配置方式
找到 BotServices 中的识别器
public BotServices(IConfiguration configuration)
{
// Read the setting for cognitive services (LUIS, QnA) from the appsettings.json
// If includeApiResults is set to true, the full response from the LUIS api (LuisResult)
// will be made available in the properties collection of the RecognizerResult
var luisApplication = new LuisApplication(
configuration["LuisAppId"],
configuration["LuisAPIKey"],
$"https://{configuration["LuisAPIHostName"]}.api.cognitive.microsoft.com");
// Set the recognizer options depending on which endpoint version you want to use.
// More details can be found in https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-migration-api-v3
var recognizerOptions = new LuisRecognizerOptionsV2(luisApplication)
{
IncludeAPIResults = true,
PredictionOptions = new LuisPredictionOptions()
{
IncludeAllIntents = true,
IncludeInstanceData = true
}
};
SampleQnA = new QnAMaker(new QnAMakerEndpoint
{
KnowledgeBaseId = configuration["QnAKnowledgebaseId"],
EndpointKey = configuration["QnAEndpointKey"],
Host = configuration["QnAEndpointHostName"]
});
Dispatch = new LuisRecognizer(recognizerOptions);
}
public LuisRecognizer Dispatch { get; private set; }
public QnAMaker SampleQnA { get; private set; }
}
如何从机器人调用服务,可在 Microsoft docs
找到
//First, we use the dispatch model to determine which cognitive service(LUIS or QnA) to use.
var recognizerResult = await _botServices.Dispatch.RecognizeAsync(turnContext, cancellationToken);
// Top intent tell us which cognitive service to use.
var (intent, _) = recognizerResult.GetTopScoringIntent();
// Next, we call the dispatcher with the top intent.
await DispatchToTopIntentAsync(turnContext, intent, recognizerResult, cancellationToken, botUser);
LUIS 应用程序似乎不是 public。
在 LUIS 门户中检查:
更新:在 Azure 门户中添加了 LUIS 配置页面
要获取 api 密钥和主机名,您必须检查 LUIS PUBLISHING 上的 Keys and Endpoint 部分Azure 中的资源(您不应使用 AUTHORING 资源,b/c 它的请求数有限,您可能会耗尽它)。
在 Azure 托管机器人应用程序服务(不是 Web 应用程序机器人)中,左侧有一个配置选项卡,默认情况下,一旦单击它会选择右侧的应用程序设置选项卡(参见 img)
我在创建 LUIS AI 服务时创建了这些键和端点。
事实证明,Azure 中的应用程序设置将 appsettings.json 或 web.config(你有什么)覆盖为 stated here。因此,如果应用程序设置文件中的值正确但与 Azure 中的应用程序设置不同,应用程序会选择 Azure 中的值。
因为在识别器中我有字符串插值,我只是从 LUIS 端点写入区域,而在 Azure 中我有 LuisAPIHostName .api.cognitive.microsoft.com 。最后端点看起来像 https://.api.cognitive.microsoft.com.api.cognitive.microsoft.com/
这就是它在本地运行但在 Azure 中托管时不起作用的原因。
我在 Azure 中托管了一个机器人,当通过机器人模拟器使用 ngrok 进行调试时,我收到一条错误消息:没有这样的主机已知。我以前有过这样的机器人体验,这意味着 LUIS AI 配置,特别是 LuisAPIHostName 值,没有以正确的格式写入 appsettings.json。
事实证明,当时甚至还没有托管应用程序时,问题是我从托管 LUIS 服务获得了一个端点,https://
回到当前问题,我试图通过绕过我的应用程序中的 LUIS 逻辑来隔离问题,然后再次发布它,然后机器人开始在 Azure Web Chat 中正常工作。 所以,我猜问题可能出在 LUIS 配置上。但如果它在本地使用以前的解决方案,LUIS 服务与机器人托管在同一个订阅中,如何让它在 Azure 上运行?我为 LuisAPIHostName 尝试了一些组合,包括 Azure 提供的整个字符串并在末尾添加了一个额外的“/”,但这并没有改变任何事情......
机器人是用:
编写的v4.13.0 Bot Builder 库
.NET 核心 3.1 框架
在 Azure 中托管为 Web App Bot,具有相应的 AppService
更新:
在我的应用程序中添加 LUIS 的配置方式
找到 BotServices 中的识别器public BotServices(IConfiguration configuration)
{
// Read the setting for cognitive services (LUIS, QnA) from the appsettings.json
// If includeApiResults is set to true, the full response from the LUIS api (LuisResult)
// will be made available in the properties collection of the RecognizerResult
var luisApplication = new LuisApplication(
configuration["LuisAppId"],
configuration["LuisAPIKey"],
$"https://{configuration["LuisAPIHostName"]}.api.cognitive.microsoft.com");
// Set the recognizer options depending on which endpoint version you want to use.
// More details can be found in https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-migration-api-v3
var recognizerOptions = new LuisRecognizerOptionsV2(luisApplication)
{
IncludeAPIResults = true,
PredictionOptions = new LuisPredictionOptions()
{
IncludeAllIntents = true,
IncludeInstanceData = true
}
};
SampleQnA = new QnAMaker(new QnAMakerEndpoint
{
KnowledgeBaseId = configuration["QnAKnowledgebaseId"],
EndpointKey = configuration["QnAEndpointKey"],
Host = configuration["QnAEndpointHostName"]
});
Dispatch = new LuisRecognizer(recognizerOptions);
}
public LuisRecognizer Dispatch { get; private set; }
public QnAMaker SampleQnA { get; private set; }
}
如何从机器人调用服务,可在 Microsoft docs
找到//First, we use the dispatch model to determine which cognitive service(LUIS or QnA) to use.
var recognizerResult = await _botServices.Dispatch.RecognizeAsync(turnContext, cancellationToken);
// Top intent tell us which cognitive service to use.
var (intent, _) = recognizerResult.GetTopScoringIntent();
// Next, we call the dispatcher with the top intent.
await DispatchToTopIntentAsync(turnContext, intent, recognizerResult, cancellationToken, botUser);
LUIS 应用程序似乎不是 public。
在 LUIS 门户中检查:
更新:在 Azure 门户中添加了 LUIS 配置页面
要获取 api 密钥和主机名,您必须检查 LUIS PUBLISHING 上的 Keys and Endpoint 部分Azure 中的资源(您不应使用 AUTHORING 资源,b/c 它的请求数有限,您可能会耗尽它)。
在 Azure 托管机器人应用程序服务(不是 Web 应用程序机器人)中,左侧有一个配置选项卡,默认情况下,一旦单击它会选择右侧的应用程序设置选项卡(参见 img)
我在创建 LUIS AI 服务时创建了这些键和端点。 事实证明,Azure 中的应用程序设置将 appsettings.json 或 web.config(你有什么)覆盖为 stated here。因此,如果应用程序设置文件中的值正确但与 Azure 中的应用程序设置不同,应用程序会选择 Azure 中的值。
因为在识别器中我有字符串插值,我只是从 LUIS 端点写入区域,而在 Azure 中我有 LuisAPIHostName
这就是它在本地运行但在 Azure 中托管时不起作用的原因。