Add CI/CD pipeline for BotFramework Composer using CLU (#3893)
* add pipeline for clu service * add bot sample for CLU service * remove LUIS references * Update README.md * Improving README information * Clean up .csproj * Remove unused scripts folder * Remove ref to MyGet from Nuget.config * Remove Nuget.config file --------- Co-authored-by: JhontSouth <jhonatan.sandoval@southworks.com> Co-authored-by: Jhonatan Sandoval Velasco <122501764+JhontSouth@users.noreply.github.com> Co-authored-by: Joel Mut <joel.mut@southworks.com>
This commit is contained in:
Родитель
3ffd4d2704
Коммит
1ea6f6701a
|
@ -0,0 +1,25 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.30503.244
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BasicAssistantCLU", "BasicAssistantCLU\BasicAssistantCLU.csproj", "{F6A71770-EE25-47AB-ACD5-7AF621AD6C59}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{F6A71770-EE25-47AB-ACD5-7AF621AD6C59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{F6A71770-EE25-47AB-ACD5-7AF621AD6C59}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{F6A71770-EE25-47AB-ACD5-7AF621AD6C59}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{F6A71770-EE25-47AB-ACD5-7AF621AD6C59}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {170A0EAB-750C-4F54-9B49-D0EC5A1D6E1D}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"$schema": "https://raw.githubusercontent.com/microsoft/BotFramework-Composer/main/Composer/packages/server/schemas/botproject.schema",
|
||||
"name": "BasicAssistantCLU",
|
||||
"skills": {}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
<AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
|
||||
<UserSecretsId>74e508c9-0df9-45fe-b083-d73a77324acc</UserSecretsId>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="**/*.blu;**/*.dialog;**/*.lg;**/*.lu;**/*.model;**/*.onnx;**/*.qna;**/*.txt" Exclude="$(BaseOutputPath)/**;$(BaseIntermediateOutputPath)/**;wwwroot/**">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.8" />
|
||||
<PackageReference Include="Microsoft.Bot.Builder.AI.QnA" Version="4.18.1" />
|
||||
<PackageReference Include="Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime" Version="4.18.1" />
|
||||
<PackageReference Include="Microsoft.Bot.Components.HelpAndCancel" Version="1.3.0" />
|
||||
<PackageReference Include="Microsoft.Bot.Components.Recognizers.CLURecognizer" Version="1.0.0" />
|
||||
<PackageReference Include="Microsoft.Bot.Components.Welcome" Version="1.3.0" />
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -0,0 +1,159 @@
|
|||
{
|
||||
"$kind": "Microsoft.AdaptiveDialog",
|
||||
"$designer": {
|
||||
"name": "BasicAssistantCLU",
|
||||
"description": "",
|
||||
"id": "4pM5gc"
|
||||
},
|
||||
"autoEndDialog": true,
|
||||
"defaultResultProperty": "dialog.result",
|
||||
"triggers": [
|
||||
{
|
||||
"$kind": "Microsoft.OnConversationUpdateActivity",
|
||||
"$designer": {
|
||||
"id": "376720",
|
||||
"comment": "This trigger runs when a conversation update activity is sent to the bot. This indicates a user or bot being added or removed from a conversation."
|
||||
},
|
||||
"actions": [
|
||||
{
|
||||
"$kind": "Microsoft.Foreach",
|
||||
"$designer": {
|
||||
"id": "518944",
|
||||
"name": "Loop: for each item",
|
||||
"comment": "For each member added to the conversation."
|
||||
},
|
||||
"itemsProperty": "turn.Activity.membersAdded",
|
||||
"actions": [
|
||||
{
|
||||
"$kind": "Microsoft.IfCondition",
|
||||
"$designer": {
|
||||
"id": "641773",
|
||||
"name": "Branch: if/else",
|
||||
"comment": "Checks that that member added ID does not match the bot ID. This prevents the greeting message from being sent when the bot is added to a conversation."
|
||||
},
|
||||
"condition": "=string(dialog.foreach.value.id) != string(turn.Activity.Recipient.id)",
|
||||
"actions": [
|
||||
{
|
||||
"$kind": "Microsoft.BeginDialog",
|
||||
"$designer": {
|
||||
"id": "PlH6iz",
|
||||
"comment": "Launches the WelcomeDialog containing logic for greeting users."
|
||||
},
|
||||
"activityProcessed": true,
|
||||
"dialog": "WelcomeDialog"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"$kind": "Microsoft.OnIntent",
|
||||
"$designer": {
|
||||
"id": "e1i6lY",
|
||||
"name": "Cancel",
|
||||
"comment": "Triggered when the Cancel intent is recognized in the user's utterance."
|
||||
},
|
||||
"intent": "Cancel",
|
||||
"actions": [
|
||||
{
|
||||
"$kind": "Microsoft.BeginDialog",
|
||||
"$designer": {
|
||||
"id": "FDsuIq",
|
||||
"comment": "Launches the CancelDialog."
|
||||
},
|
||||
"activityProcessed": true,
|
||||
"dialog": "CancelDialog"
|
||||
}
|
||||
],
|
||||
"condition": "=turn.recognized.score > 0.9"
|
||||
},
|
||||
{
|
||||
"$kind": "Microsoft.OnIntent",
|
||||
"$designer": {
|
||||
"id": "9wETGs",
|
||||
"name": "Help",
|
||||
"comment": "Triggered when the Help intent is recognized in the user's utterance."
|
||||
},
|
||||
"intent": "Help",
|
||||
"actions": [
|
||||
{
|
||||
"$kind": "Microsoft.BeginDialog",
|
||||
"$designer": {
|
||||
"id": "B0NP8m",
|
||||
"comment": "Launches the HelpDialog."
|
||||
},
|
||||
"activityProcessed": true,
|
||||
"dialog": "HelpDialog"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"$kind": "Microsoft.OnError",
|
||||
"$designer": {
|
||||
"id": "aLQGr7",
|
||||
"comment": "Triggered when an error event is thrown by the dialog stack. "
|
||||
},
|
||||
"actions": [
|
||||
{
|
||||
"$kind": "Microsoft.TelemetryTrackEventAction",
|
||||
"$designer": {
|
||||
"id": "Aucn7t",
|
||||
"comment": "Logs the error received in the Telelmetry Client (typically Application Insights for production instances)."
|
||||
},
|
||||
"eventName": "ErrorOccurred",
|
||||
"properties": {
|
||||
"Type": "=turn.dialogEvent.value.className",
|
||||
"Exception": "=turn.dialogEvent.value"
|
||||
}
|
||||
},
|
||||
{
|
||||
"$kind": "Microsoft.SendActivity",
|
||||
"$designer": {
|
||||
"id": "2outgQ",
|
||||
"comment": "Shows error message to user."
|
||||
},
|
||||
"activity": "${SendActivity_ErrorOccured()}"
|
||||
},
|
||||
{
|
||||
"$kind": "Microsoft.TraceActivity",
|
||||
"$designer": {
|
||||
"id": "NVFqr5",
|
||||
"comment": "Emits a trace activity with the error value that is visible in local testing channels such as the Bot Framework Composer Web Chat window and the Bot Framework Emulator."
|
||||
},
|
||||
"name": "=turn.dialogEvent.value.className",
|
||||
"valueType": "Exception",
|
||||
"value": "=turn.dialogEvent.value",
|
||||
"label": "ErrorOccurred"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"$kind": "Microsoft.OnUnknownIntent",
|
||||
"$designer": {
|
||||
"id": "FOxcnx",
|
||||
"comment": "This trigger fires when an incoming activity is not handled by any other trigger."
|
||||
},
|
||||
"actions": [
|
||||
{
|
||||
"$kind": "Microsoft.SendActivity",
|
||||
"$designer": {
|
||||
"id": "IQMEuO",
|
||||
"comment": "It is recommended to show a message to the user when the bot does not know how to handle an incoming activity and provide follow up options or a help message.\n"
|
||||
},
|
||||
"activity": "${SendActivity_DidNotUnderstand()}"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"generator": "BasicAssistantCLU.lg",
|
||||
"id": "BasicAssistantCLU",
|
||||
"recognizer": {
|
||||
"$kind": "Microsoft.CluRecognizer",
|
||||
"projectName": "=settings.clu.projectName",
|
||||
"endpoint": "=settings.clu.endpoint",
|
||||
"endpointKey": "=settings.clu.endpointKey",
|
||||
"deploymentName": "=settings.clu.deploymentName"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,186 @@
|
|||
{
|
||||
"projectFileVersion": "2022-10-01-preview",
|
||||
"stringIndexType": "Utf16CodeUnit",
|
||||
"metadata": {
|
||||
"projectKind": "Conversation",
|
||||
"settings": {
|
||||
"confidenceThreshold": 0,
|
||||
"normalizeCasing": false
|
||||
},
|
||||
"projectName": "BasicAssistantCLU",
|
||||
"multilingual": false,
|
||||
"description": "",
|
||||
"language": "en-us"
|
||||
},
|
||||
"assets": {
|
||||
"projectKind": "Conversation",
|
||||
"intents": [
|
||||
{
|
||||
"category": "None"
|
||||
},
|
||||
{
|
||||
"category": "Help"
|
||||
},
|
||||
{
|
||||
"category": "Cancel"
|
||||
}
|
||||
],
|
||||
"entities": [],
|
||||
"utterances": [
|
||||
{
|
||||
"text": "end this now",
|
||||
"language": "en-us",
|
||||
"intent": "Cancel",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "just stop already",
|
||||
"language": "en-us",
|
||||
"intent": "Cancel",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "forget about it",
|
||||
"language": "en-us",
|
||||
"intent": "Cancel",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "never mind",
|
||||
"language": "en-us",
|
||||
"intent": "Cancel",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "exit",
|
||||
"language": "en-us",
|
||||
"intent": "Cancel",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "abort",
|
||||
"language": "en-us",
|
||||
"intent": "Cancel",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "quit",
|
||||
"language": "en-us",
|
||||
"intent": "Cancel",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "cancel",
|
||||
"language": "en-us",
|
||||
"intent": "Cancel",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "i need some assistance",
|
||||
"language": "en-us",
|
||||
"intent": "Help",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "i need help",
|
||||
"language": "en-us",
|
||||
"intent": "Help",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "what can you help me with",
|
||||
"language": "en-us",
|
||||
"intent": "Help",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "what can you do",
|
||||
"language": "en-us",
|
||||
"intent": "Help",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "how do you work",
|
||||
"language": "en-us",
|
||||
"intent": "Help",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "im stuck",
|
||||
"language": "en-us",
|
||||
"intent": "Help",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "duck",
|
||||
"language": "en-us",
|
||||
"intent": "None",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "do unicorns really exist",
|
||||
"language": "en-us",
|
||||
"intent": "None",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "check my account balance",
|
||||
"language": "en-us",
|
||||
"intent": "None",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "turn on the lights",
|
||||
"language": "en-us",
|
||||
"intent": "None",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "Is it going to rain?",
|
||||
"language": "en-us",
|
||||
"intent": "None",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "place an item on hold",
|
||||
"language": "en-us",
|
||||
"intent": "None",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "I want to order a pizza",
|
||||
"language": "en-us",
|
||||
"intent": "None",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
},
|
||||
{
|
||||
"text": "where is my car?",
|
||||
"language": "en-us",
|
||||
"intent": "None",
|
||||
"entities": [],
|
||||
"dataset": "Train"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
|
@ -0,0 +1,76 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Bot.Builder;
|
||||
using Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime.Settings;
|
||||
using Microsoft.Bot.Builder.Integration.AspNet.Core;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace BasicAssistantCLU.Controllers
|
||||
{
|
||||
// This ASP Controller is created to handle a request. Dependency Injection will provide the Adapter and IBot
|
||||
// implementation at runtime. Multiple different IBot implementations running at different endpoints can be
|
||||
// achieved by specifying a more specific type for the bot constructor argument.
|
||||
[ApiController]
|
||||
public class BotController : ControllerBase
|
||||
{
|
||||
private readonly Dictionary<string, IBotFrameworkHttpAdapter> _adapters = new Dictionary<string, IBotFrameworkHttpAdapter>();
|
||||
private readonly IBot _bot;
|
||||
private readonly ILogger<BotController> _logger;
|
||||
|
||||
public BotController(
|
||||
IConfiguration configuration,
|
||||
IEnumerable<IBotFrameworkHttpAdapter> adapters,
|
||||
IBot bot,
|
||||
ILogger<BotController> logger)
|
||||
{
|
||||
_bot = bot ?? throw new ArgumentNullException(nameof(bot));
|
||||
_logger = logger;
|
||||
|
||||
var adapterSettings = configuration.GetSection(AdapterSettings.AdapterSettingsKey).Get<List<AdapterSettings>>() ?? new List<AdapterSettings>();
|
||||
adapterSettings.Add(AdapterSettings.CoreBotAdapterSettings);
|
||||
|
||||
foreach (var adapter in adapters ?? throw new ArgumentNullException(nameof(adapters)))
|
||||
{
|
||||
var settings = adapterSettings.FirstOrDefault(s => s.Enabled && s.Type == adapter.GetType().FullName);
|
||||
|
||||
if (settings != null)
|
||||
{
|
||||
_adapters.Add(settings.Route, adapter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[HttpGet]
|
||||
[Route("api/{route}")]
|
||||
public async Task PostAsync(string route)
|
||||
{
|
||||
if (string.IsNullOrEmpty(route))
|
||||
{
|
||||
_logger.LogError($"PostAsync: No route provided.");
|
||||
throw new ArgumentNullException(nameof(route));
|
||||
}
|
||||
|
||||
if (_adapters.TryGetValue(route, out IBotFrameworkHttpAdapter adapter))
|
||||
{
|
||||
if (_logger.IsEnabled(LogLevel.Debug))
|
||||
{
|
||||
_logger.LogInformation($"PostAsync: routed '{route}' to {adapter.GetType().Name}");
|
||||
}
|
||||
|
||||
// Delegate the processing of the HTTP POST to the appropriate adapter.
|
||||
// The adapter will invoke the bot.
|
||||
await adapter.ProcessAsync(Request, Response, _bot).ConfigureAwait(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogError($"PostAsync: No adapter registered and enabled for route {route}.");
|
||||
throw new KeyNotFoundException($"No adapter registered and enabled for route {route}.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Bot.Builder;
|
||||
using Microsoft.Bot.Builder.Integration.AspNet.Core;
|
||||
using Microsoft.Bot.Schema;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace BasicAssistantCLU.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// A controller that handles skill replies to the bot.
|
||||
/// </summary>
|
||||
[ApiController]
|
||||
[Route("api/skills")]
|
||||
public class SkillController : ChannelServiceController
|
||||
{
|
||||
private readonly ILogger<SkillController> _logger;
|
||||
|
||||
public SkillController(ChannelServiceHandlerBase handler, ILogger<SkillController> logger)
|
||||
: base(handler)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public override Task<IActionResult> ReplyToActivityAsync(string conversationId, string activityId, Activity activity)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_logger.IsEnabled(LogLevel.Debug))
|
||||
{
|
||||
_logger.LogDebug($"ReplyToActivityAsync: conversationId={conversationId}, activityId={activityId}");
|
||||
}
|
||||
|
||||
return base.ReplyToActivityAsync(conversationId, activityId, activity);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, $"ReplyToActivityAsync: {ex}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public override Task<IActionResult> SendToConversationAsync(string conversationId, Activity activity)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_logger.IsEnabled(LogLevel.Debug))
|
||||
{
|
||||
_logger.LogDebug($"SendToConversationAsync: conversationId={conversationId}");
|
||||
}
|
||||
|
||||
return base.SendToConversationAsync(conversationId, activity);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, $"SendToConversationAsync: {ex}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
using System;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime.Extensions;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
|
||||
namespace BasicAssistantCLU
|
||||
{
|
||||
public class Program
|
||||
{
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
CreateHostBuilder(args).Build().Run();
|
||||
}
|
||||
|
||||
public static IHostBuilder CreateHostBuilder(string[] args) =>
|
||||
Host.CreateDefaultBuilder(args)
|
||||
.ConfigureAppConfiguration((hostingContext, builder) =>
|
||||
{
|
||||
var applicationRoot = AppDomain.CurrentDomain.BaseDirectory;
|
||||
var environmentName = hostingContext.HostingEnvironment.EnvironmentName;
|
||||
var settingsDirectory = "settings";
|
||||
|
||||
builder.AddBotRuntimeConfiguration(applicationRoot, settingsDirectory, environmentName);
|
||||
|
||||
builder.AddCommandLine(args);
|
||||
})
|
||||
.ConfigureWebHostDefaults(webBuilder =>
|
||||
{
|
||||
webBuilder.UseStartup<Startup>();
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
# Welcome to your new bot
|
||||
|
||||
This bot project was created using the Core Bot with Azure Language Understanding template, and contains support for a base set of conversational flows.
|
||||
|
||||
## Next steps
|
||||
|
||||
### Start building your bot
|
||||
|
||||
Composer can help guide you through getting started building your bot. From your bot settings page (the wrench icon on the left navigation rail), click on the rocket-ship icon on the top right for some quick navigation links.
|
||||
|
||||
Another great resource if you're just getting started is the **[guided tutorial](https://docs.microsoft.com/en-us/composer/tutorial/tutorial-introduction)** in our documentation.
|
||||
|
||||
### Connect with your users
|
||||
|
||||
Your bot comes pre-configured to connect to our Web Chat and DirectLine channels, but there are many more places you can connect your bot to - including Microsoft Teams, Telephony, DirectLine Speech, Slack, Facebook, Outlook and more. Check out all of the places you can connect to on the bot settings page.
|
||||
|
||||
### Publish your bot to Azure from Composer
|
||||
|
||||
Composer can help you provision the Azure resources necessary for your bot, and publish your bot to them. To get started, create a publishing profile from your bot settings page in Composer (the wrench icon on the left navigation rail). Make sure you only provision the optional Azure resources you need!
|
||||
|
||||
### Extend your bot with packages
|
||||
|
||||
From Package Manager in Composer you can find useful packages to help add additional pre-built functionality you can add to your bot - everything from simple dialogs & custom actions for working with specific scenarios to custom adapters for connecting your bot to users on clients like Facebook or Slack.
|
||||
|
||||
### Extend your bot with code
|
||||
|
||||
You can also extend your bot with code - simply open up the folder that was generated for you in the location you chose during the creation process with your favorite IDE (like Visual Studio). You can do things like create custom actions that can be used during dialog flows, create custom middleware to pre-process (or post-process) messages, and more. See [our documentation](https://aka.ms/bf-extend-with-code) for more information.
|
|
@ -0,0 +1,58 @@
|
|||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.AspNetCore.StaticFiles;
|
||||
using Microsoft.Bot.Builder.Dialogs.Adaptive.Runtime.Extensions;
|
||||
using Microsoft.Bot.Builder.Integration.AspNet.Core;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
|
||||
namespace BasicAssistantCLU
|
||||
{
|
||||
public class Startup
|
||||
{
|
||||
public Startup(IConfiguration configuration)
|
||||
{
|
||||
Configuration = configuration;
|
||||
}
|
||||
|
||||
public IConfiguration Configuration { get; }
|
||||
|
||||
// This method gets called by the runtime. Use this method to add services to the container.
|
||||
public void ConfigureServices(IServiceCollection services)
|
||||
{
|
||||
services.AddControllers().AddNewtonsoftJson(options => {
|
||||
options.SerializerSettings.MaxDepth = HttpHelper.BotMessageSerializerSettings.MaxDepth;
|
||||
});
|
||||
services.AddBotRuntime(Configuration);
|
||||
}
|
||||
|
||||
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
||||
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
||||
{
|
||||
if (env.IsDevelopment())
|
||||
{
|
||||
app.UseDeveloperExceptionPage();
|
||||
}
|
||||
|
||||
app.UseDefaultFiles();
|
||||
|
||||
// Set up custom content types - associating file extension to MIME type.
|
||||
var provider = new FileExtensionContentTypeProvider();
|
||||
provider.Mappings[".qna"] = "application/vnd.microsoft.qna";
|
||||
|
||||
// Expose static files in manifests folder for skill scenarios.
|
||||
app.UseStaticFiles(new StaticFileOptions
|
||||
{
|
||||
ContentTypeProvider = provider
|
||||
});
|
||||
app.UseWebSockets();
|
||||
app.UseRouting();
|
||||
app.UseAuthorization();
|
||||
app.UseEndpoints(endpoints =>
|
||||
{
|
||||
endpoints.MapControllers();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,85 @@
|
|||
{
|
||||
"$kind": "Microsoft.AdaptiveDialog",
|
||||
"$designer": {
|
||||
"id": "GYEcZe",
|
||||
"name": "CancelDialog",
|
||||
"description": "Prompts the user to cancel the bot activity."
|
||||
},
|
||||
"autoEndDialog": true,
|
||||
"defaultResultProperty": "dialog.result",
|
||||
"triggers": [
|
||||
{
|
||||
"$kind": "Microsoft.OnBeginDialog",
|
||||
"$designer": {
|
||||
"name": "BeginDialog",
|
||||
"description": "",
|
||||
"id": "jTsOkO"
|
||||
},
|
||||
"actions": [
|
||||
{
|
||||
"$kind": "Microsoft.ConfirmInput",
|
||||
"$designer": {
|
||||
"id": "DTdbkd"
|
||||
},
|
||||
"defaultLocale": "en-us",
|
||||
"disabled": false,
|
||||
"maxTurnCount": 3,
|
||||
"alwaysPrompt": false,
|
||||
"allowInterruptions": false,
|
||||
"prompt": "${ConfirmInput_Prompt_AreYouSure()}",
|
||||
"unrecognizedPrompt": "",
|
||||
"invalidPrompt": "",
|
||||
"choiceOptions": {
|
||||
"includeNumbers": true,
|
||||
"inlineOrMore": ", or ",
|
||||
"inlineOr": " or ",
|
||||
"inlineSeparator": ", "
|
||||
},
|
||||
"property": "dialog.cancelConfirmed"
|
||||
},
|
||||
{
|
||||
"$kind": "Microsoft.IfCondition",
|
||||
"$designer": {
|
||||
"id": "cPaSR9"
|
||||
},
|
||||
"condition": "=dialog.cancelConfirmed",
|
||||
"actions": [
|
||||
{
|
||||
"$kind": "Microsoft.SendActivity",
|
||||
"$designer": {
|
||||
"id": "zbC0VV"
|
||||
},
|
||||
"activity": "${SendActivity_CancelConfirmation()}"
|
||||
},
|
||||
{
|
||||
"$kind": "Microsoft.CancelAllDialogs",
|
||||
"$designer": {
|
||||
"id": "VOhJtq"
|
||||
},
|
||||
"activityProcessed": true
|
||||
}
|
||||
],
|
||||
"elseActions": [
|
||||
{
|
||||
"$kind": "Microsoft.SendActivity",
|
||||
"$designer": {
|
||||
"id": "5kB8oO"
|
||||
},
|
||||
"activity": "${SendActivity_ContinueConfirmation()}"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"generator": "CancelDialog.lg",
|
||||
"recognizer": {
|
||||
"$kind": "Microsoft.CluRecognizer",
|
||||
"projectName": "=settings.clu.projectName",
|
||||
"endpoint": "=settings.clu.endpoint",
|
||||
"endpointKey": "=settings.clu.endpointKey",
|
||||
"deploymentName": "=settings.clu.deploymentName"
|
||||
},
|
||||
"id": "CancelDialog",
|
||||
"$Imported": "7ace8b3c7d6add6c499b34efbbc7c563"
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
{
|
||||
"$kind": "Microsoft.AdaptiveDialog",
|
||||
"$designer": {
|
||||
"id": "3yk4OT",
|
||||
"name": "HelpDialog",
|
||||
"description": "Displays help information about the bot"
|
||||
},
|
||||
"autoEndDialog": true,
|
||||
"defaultResultProperty": "dialog.result",
|
||||
"triggers": [
|
||||
{
|
||||
"$kind": "Microsoft.OnBeginDialog",
|
||||
"$designer": {
|
||||
"name": "BeginDialog",
|
||||
"description": "",
|
||||
"id": "qXCGer"
|
||||
},
|
||||
"actions": [
|
||||
{
|
||||
"$kind": "Microsoft.SendActivity",
|
||||
"$designer": {
|
||||
"id": "5JQ9rf"
|
||||
},
|
||||
"activity": "${SendActivity_HelpOverview()}"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"generator": "HelpDialog.lg",
|
||||
"recognizer": {
|
||||
"$kind": "Microsoft.CluRecognizer",
|
||||
"projectName": "=settings.clu.projectName",
|
||||
"endpoint": "=settings.clu.endpoint",
|
||||
"endpointKey": "=settings.clu.endpointKey",
|
||||
"deploymentName": "=settings.clu.deploymentName"
|
||||
},
|
||||
"id": "HelpDialog",
|
||||
"$Imported": "a1be0cb91341b11b8cd09b0301040284"
|
||||
}
|
|
@ -0,0 +1,68 @@
|
|||
{
|
||||
"$kind": "Microsoft.AdaptiveDialog",
|
||||
"$designer": {
|
||||
"$designer": {
|
||||
"name": "WelcomeDialog",
|
||||
"description": "Greets new and returning users",
|
||||
"id": "8pOkoq"
|
||||
},
|
||||
"name": "WelcomeDialog"
|
||||
},
|
||||
"autoEndDialog": true,
|
||||
"defaultResultProperty": "dialog.result",
|
||||
"triggers": [
|
||||
{
|
||||
"$kind": "Microsoft.OnBeginDialog",
|
||||
"$designer": {
|
||||
"id": "tcqJ5M",
|
||||
"name": "BeginDialog"
|
||||
},
|
||||
"actions": [
|
||||
{
|
||||
"$kind": "Microsoft.IfCondition",
|
||||
"$designer": {
|
||||
"id": "sF0fYv"
|
||||
},
|
||||
"condition": "exists(user.greeted)",
|
||||
"actions": [
|
||||
{
|
||||
"$kind": "Microsoft.SendActivity",
|
||||
"$designer": {
|
||||
"id": "PsAJ3p"
|
||||
},
|
||||
"activity": "${SendActivity_WelcomeReturningUser()}"
|
||||
}
|
||||
],
|
||||
"elseActions": [
|
||||
{
|
||||
"$kind": "Microsoft.SendActivity",
|
||||
"$designer": {
|
||||
"id": "f3uG2y"
|
||||
},
|
||||
"activity": "${SendActivity_WelcomeNewUser()}"
|
||||
},
|
||||
{
|
||||
"$kind": "Microsoft.SetProperty",
|
||||
"$designer": {
|
||||
"id": "ucFnwQ"
|
||||
},
|
||||
"property": "user.greeted",
|
||||
"value": "true"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"$schema": "https://raw.githubusercontent.com/microsoft/BotFramework-Composer/stable/Composer/packages/server/schemas/sdk.schema",
|
||||
"generator": "WelcomeDialog.lg",
|
||||
"id": "WelcomeDialog",
|
||||
"recognizer": {
|
||||
"$kind": "Microsoft.CluRecognizer",
|
||||
"projectName": "=settings.clu.projectName",
|
||||
"endpoint": "=settings.clu.endpoint",
|
||||
"endpointKey": "=settings.clu.endpointKey",
|
||||
"deploymentName": "=settings.clu.deploymentName"
|
||||
},
|
||||
"$Imported": "af4f041fedef6fc782dfdbdc10c87be3"
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
|
||||
|
||||
> Imported: 68b329da9893e34099c7d8ad5cb9c940
|
|
@ -0,0 +1,25 @@
|
|||
[import](common.lg)
|
||||
|
||||
# SendActivity_WelcomeReturningUser()
|
||||
[Activity
|
||||
Text = ${SendActivity_WelcomeReturningUser_text()}
|
||||
]
|
||||
|
||||
# SendActivity_WelcomeReturningUser_text()
|
||||
- 🖐️ Welcome back! How can I help you today?
|
||||
- 🖐️ Hello again! What can I help with?
|
||||
- 🖐️ Good to see you again. What do you want to do today?
|
||||
- 🖐️ Hey, there! Let's get started.
|
||||
- 🖐️ Hello again! How can I help?
|
||||
|
||||
# SendActivity_WelcomeNewUser()
|
||||
[Activity
|
||||
Text = ${SendActivity_WelcomeNewUser_text()}
|
||||
]
|
||||
|
||||
# SendActivity_WelcomeNewUser_text()
|
||||
- 🖐️ Hey, there! How can I help you today?
|
||||
- 🖐️ Hi! How can I help?
|
||||
- 🖐️ Hello! What do you want to do today?
|
||||
|
||||
> Imported: ecb31044e0e5c0b54f49870e6872f158
|
|
@ -0,0 +1,3 @@
|
|||
|
||||
|
||||
> Imported: 68b329da9893e34099c7d8ad5cb9c940
|
|
@ -0,0 +1,22 @@
|
|||
[import](common.lg)
|
||||
|
||||
# SendActivity_ErrorOccured()
|
||||
[Activity
|
||||
Text = ${SendActivity_ErrorOccured_text()}
|
||||
]
|
||||
|
||||
# SendActivity_ErrorOccured_text()
|
||||
- Oops, looks like I'm stuck. Can you try to ask me in a different way?
|
||||
- Looks like I'm all mixed up. Let's try asking again, but maybe rephrase your request?
|
||||
- Sorry, it looks like something went wrong. Can you please try again?
|
||||
|
||||
# SendActivity_DidNotUnderstand()
|
||||
[Activity
|
||||
Text = ${SendActivity_DidNotUnderstand_text()}
|
||||
]
|
||||
|
||||
# SendActivity_DidNotUnderstand_text()
|
||||
- Sorry, I didn't get that
|
||||
- I'm not sure I understand. Can you please try again?
|
||||
- Hmm, I don't understand. Can you try to ask me in a different way.
|
||||
- I didn't get that. Would you mind rephrasing and try it again.
|
|
@ -0,0 +1,2 @@
|
|||
> To learn more about the LG file format, read the documentation at
|
||||
> https://aka.ms/lg-file-format
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,82 @@
|
|||
{
|
||||
"customFunctions": [],
|
||||
"defaultLanguage": "en-us",
|
||||
"defaultLocale": "en-us",
|
||||
"importedLibraries": [],
|
||||
"languages": [
|
||||
"en-us"
|
||||
],
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft": "Warning",
|
||||
"Microsoft.Hosting.Lifetime": "Information"
|
||||
}
|
||||
},
|
||||
"luFeatures": {
|
||||
"enableCompositeEntities": true,
|
||||
"enableListEntities": true,
|
||||
"enableMLEntities": true,
|
||||
"enablePattern": true,
|
||||
"enablePhraseLists": true,
|
||||
"enablePrebuiltEntities": true,
|
||||
"enableRegexEntities": true
|
||||
},
|
||||
"MicrosoftAppId": "",
|
||||
"publishTargets": [],
|
||||
"qna": {
|
||||
"hostname": "",
|
||||
"knowledgebaseid": "",
|
||||
"qnaRegion": "westus"
|
||||
},
|
||||
"runtime": {
|
||||
"command": "dotnet run --project BasicAssistantCLU.csproj",
|
||||
"customRuntime": true,
|
||||
"key": "adaptive-runtime-dotnet-webapp",
|
||||
"path": "../"
|
||||
},
|
||||
"runtimeSettings": {
|
||||
"adapters": [],
|
||||
"features": {
|
||||
"removeRecipientMentions": false,
|
||||
"showTyping": false,
|
||||
"traceTranscript": false,
|
||||
"useInspection": false,
|
||||
"setSpeak": {
|
||||
"voiceFontName": "en-US-JennyNeural",
|
||||
"fallbackToTextForSpeechIfEmpty": true
|
||||
}
|
||||
},
|
||||
"components": [
|
||||
{
|
||||
"name": "Microsoft.Bot.Components.Recognizers.CLURecognizer",
|
||||
"settingsPrefix": "Microsoft.Bot.Components.Recognizers.CLURecognizer"
|
||||
}
|
||||
],
|
||||
"skills": {
|
||||
"allowedCallers": []
|
||||
},
|
||||
"storage": "",
|
||||
"telemetry": {
|
||||
"logActivities": true,
|
||||
"logPersonalInformation": false,
|
||||
"options": {
|
||||
"connectionString": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"skillConfiguration": {},
|
||||
"luis": {
|
||||
"endpoint": "",
|
||||
"authoringEndpoint": "",
|
||||
"name": "BasicAssistantCLU",
|
||||
"authoringRegion": ""
|
||||
},
|
||||
"skillHostEndpoint": "http://localhost:3981/api/skills",
|
||||
"clu": {
|
||||
"projectName": "",
|
||||
"endpoint": "",
|
||||
"endpointKey": "",
|
||||
"deploymentName": ""
|
||||
}
|
||||
}
|
|
@ -0,0 +1,364 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>BasicAssistantCLU</title>
|
||||
<style>
|
||||
body {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
font-family: Segoe UI;
|
||||
}
|
||||
html,
|
||||
body {
|
||||
height: 100%;
|
||||
}
|
||||
header {
|
||||
background-image: url("data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 4638.9 651.6' style='enable-background:new 0 0 4638.9 651.6;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%2355A0E0;%7D .st1%7Bfill:none;%7D .st2%7Bfill:%230058A8;%7D .st3%7Bfill:%23328BD8;%7D .st4%7Bfill:%23B6DCF1;%7D .st5%7Bopacity:0.2;fill:url(%23SVGID_1_);enable-background:new ;%7D%0A%3C/style%3E%3Crect y='1.1' class='st0' width='4640' height='646.3'/%3E%3Cpath class='st1' d='M3987.8,323.6L4310.3,1.1h-65.6l-460.1,460.1c-17.5,17.5-46.1,17.5-63.6,0L3260.9,1.1H0v646.3h3660.3 L3889,418.7c17.5-17.5,46.1-17.5,63.6,0l228.7,228.7h66.6l-260.2-260.2C3970.3,369.8,3970.3,341.1,3987.8,323.6z'/%3E%3Cpath class='st2' d='M3784.6,461.2L4244.7,1.1h-983.9l460.1,460.1C3738.4,478.7,3767.1,478.7,3784.6,461.2z'/%3E%3Cpath class='st3' d='M4640,1.1h-329.8l-322.5,322.5c-17.5,17.5-17.5,46.1,0,63.6l260.2,260.2H4640L4640,1.1L4640,1.1z'/%3E%3Cpath class='st4' d='M3889,418.8l-228.7,228.7h521.1l-228.7-228.7C3935.2,401.3,3906.5,401.3,3889,418.8z'/%3E%3ClinearGradient id='SVGID_1_' gradientUnits='userSpaceOnUse' x1='3713.7576' y1='438.1175' x2='3911.4084' y2='14.2535' gradientTransform='matrix(1 0 0 -1 0 641.3969)'%3E%3Cstop offset='0' style='stop-color:%23FFFFFF;stop-opacity:0.5'/%3E%3Cstop offset='1' style='stop-color:%23FFFFFF'/%3E%3C/linearGradient%3E%3Cpath class='st5' d='M3952.7,124.5c-17.5-17.5-46.1-17.5-63.6,0l-523,523h1109.6L3952.7,124.5z'/%3E%3C/svg%3E%0A");
|
||||
background-repeat: no-repeat;
|
||||
background-size: 100%;
|
||||
background-position: right;
|
||||
background-color: #55A0E0;
|
||||
width: 100%;
|
||||
font-size: 44px;
|
||||
height: 120px;
|
||||
color: white;
|
||||
padding: 30px 0 40px 0px;
|
||||
display: inline-block;
|
||||
}
|
||||
.header-icon {
|
||||
background-image: url("data:image/svg+xml;utf8,%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20150.2%20125%22%20style%3D%22enable-background%3Anew%200%200%20150.2%20125%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23FFFFFF%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.5%22%20class%3D%22st0%22%20width%3D%22149.7%22%20height%3D%22125%22/%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M59%2C102.9L21.8%2C66c-3.5-3.5-3.5-9.1%2C0-12.5l37-36.5l2.9%2C3l-37%2C36.4c-1.8%2C1.8-1.8%2C4.7%2C0%2C6.6l37.2%2C37L59%2C102.9z%22%0A%09%09/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M92.5%2C102.9l-3-3l37.2-37c0.9-0.9%2C1.4-2%2C1.4-3.3c0-1.2-0.5-2.4-1.4-3.3L89.5%2C20l2.9-3l37.2%2C36.4%0A%09%09c1.7%2C1.7%2C2.6%2C3.9%2C2.6%2C6.3s-0.9%2C4.6-2.6%2C6.3L92.5%2C102.9z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M90.1%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C98.1%2C64.7%2C94.4%2C68.4%2C90.1%2C68.4z%0A%09%09%20M90.1%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S91.9%2C56.5%2C90.1%2C56.5z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M61.4%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C69.5%2C64.7%2C65.8%2C68.4%2C61.4%2C68.4z%0A%09%09%20M61.4%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S63.3%2C56.5%2C61.4%2C56.5z%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A");
|
||||
background-repeat: no-repeat;
|
||||
float: left;
|
||||
height: 140px;
|
||||
width: 140px;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.header-text {
|
||||
padding-left: 1%;
|
||||
color: #FFFFFF;
|
||||
font-family: "Segoe UI";
|
||||
font-size: 72px;
|
||||
font-weight: 300;
|
||||
letter-spacing: 0.35px;
|
||||
line-height: 96px;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.header-inner-container {
|
||||
min-width: 480px;
|
||||
max-width: 1366px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.header-inner-container::after {
|
||||
content: "";
|
||||
clear: both;
|
||||
display: table;
|
||||
}
|
||||
.main-content-area {
|
||||
padding-left: 30px;
|
||||
}
|
||||
.content-title {
|
||||
color: #000000;
|
||||
font-family: "Segoe UI";
|
||||
font-size: 46px;
|
||||
font-weight: 300;
|
||||
line-height: 62px;
|
||||
}
|
||||
.main-text {
|
||||
color: #808080;
|
||||
font-size: 24px;
|
||||
font-family: "Segoe UI";
|
||||
font-size: 24px;
|
||||
font-weight: 200;
|
||||
line-height: 32px;
|
||||
}
|
||||
.main-text-p1{
|
||||
padding-top: 48px;
|
||||
padding-bottom: 28px;
|
||||
}
|
||||
.endpoint {
|
||||
height: 32px;
|
||||
width: 571px;
|
||||
color: #808080;
|
||||
font-family: "Segoe UI";
|
||||
font-size: 24px;
|
||||
font-weight: 200;
|
||||
line-height: 32px;
|
||||
padding-top: 28px;
|
||||
}
|
||||
.how-to-build-section {
|
||||
padding-top: 20px;
|
||||
padding-left: 30px;
|
||||
}
|
||||
.how-to-build-section>h3 {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.35px;
|
||||
line-height: 22px;
|
||||
margin: 0 0 24px 0;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.step-container {
|
||||
display: flex;
|
||||
align-items: stretch;
|
||||
position: relative;
|
||||
}
|
||||
.step-container dl {
|
||||
border-left: 1px solid #A0A0A0;
|
||||
display: block;
|
||||
padding: 0 24px;
|
||||
margin: 0;
|
||||
}
|
||||
.step-container dl>dt::before {
|
||||
background-color: white;
|
||||
border: 1px solid #A0A0A0;
|
||||
border-radius: 100%;
|
||||
content: '';
|
||||
left: 47px;
|
||||
height: 11px;
|
||||
position: absolute;
|
||||
width: 11px;
|
||||
}
|
||||
.step-container dl>.test-bullet::before {
|
||||
background-color: blue;
|
||||
}
|
||||
.step-container dl>dt {
|
||||
display: block;
|
||||
font-size: inherit;
|
||||
font-weight: bold;
|
||||
line-height: 20px;
|
||||
}
|
||||
.step-container dl>dd {
|
||||
font-size: inherit;
|
||||
line-height: 20px;
|
||||
margin-left: 0;
|
||||
padding-bottom: 32px;
|
||||
}
|
||||
.step-container:last-child dl {
|
||||
border-left: 1px solid transparent;
|
||||
}
|
||||
.ctaLink {
|
||||
background-color: transparent;
|
||||
border: 1px solid transparent;
|
||||
color: #006AB1;
|
||||
cursor: pointer;
|
||||
font-weight: 600;
|
||||
padding: 0;
|
||||
white-space: normal;
|
||||
}
|
||||
.ctaLink:focus {
|
||||
outline: 1px solid #00bcf2;
|
||||
}
|
||||
.ctaLink:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.step-icon {
|
||||
display: flex;
|
||||
height: 38px;
|
||||
margin-right: 15px;
|
||||
width: 38px;
|
||||
}
|
||||
.step-icon>div {
|
||||
height: 30px;
|
||||
width: 30px;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
.ms-logo-container {
|
||||
min-width: 580px;
|
||||
max-width: 980px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
left: 0;
|
||||
right: 0;
|
||||
transition: bottom 400ms;
|
||||
}
|
||||
.ms-logo {
|
||||
float: right;
|
||||
background-image: url("data:image/svg+xml;utf8,%0A%3Csvg%20version%3D%221.1%22%20id%3D%22MS-symbol%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20400%20120%22%20style%3D%22enable-background%3Anew%200%200%20400%20120%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23737474%3B%7D%0A%09.st2%7Bfill%3A%23D63F26%3B%7D%0A%09.st3%7Bfill%3A%23167D3E%3B%7D%0A%09.st4%7Bfill%3A%232E76BC%3B%7D%0A%09.st5%7Bfill%3A%23FDB813%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.6%22%20class%3D%22st0%22%20width%3D%22398.7%22%20height%3D%22119%22/%3E%0A%3Cpath%20class%3D%22st1%22%20d%3D%22M171.3%2C38.4v43.2h-7.5V47.7h-0.1l-13.4%2C33.9h-5l-13.7-33.9h-0.1v33.9h-6.9V38.4h10.8l12.4%2C32h0.2l13.1-32H171.3%0A%09z%20M177.6%2C41.7c0-1.2%2C0.4-2.2%2C1.3-3c0.9-0.8%2C1.9-1.2%2C3.1-1.2c1.3%2C0%2C2.4%2C0.4%2C3.2%2C1.3c0.8%2C0.8%2C1.3%2C1.8%2C1.3%2C3c0%2C1.2-0.4%2C2.2-1.3%2C3%0A%09c-0.9%2C0.8-1.9%2C1.2-3.2%2C1.2s-2.3-0.4-3.1-1.2C178%2C43.8%2C177.6%2C42.8%2C177.6%2C41.7z%20M185.7%2C50.6v31h-7.3v-31H185.7z%20M207.8%2C76.3%0A%09c1.1%2C0%2C2.3-0.3%2C3.6-0.8c1.3-0.5%2C2.5-1.2%2C3.6-2v6.8c-1.2%2C0.7-2.5%2C1.2-4%2C1.5c-1.5%2C0.3-3.1%2C0.5-4.9%2C0.5c-4.6%2C0-8.3-1.4-11.1-4.3%0A%09c-2.9-2.9-4.3-6.6-4.3-11c0-5%2C1.5-9.1%2C4.4-12.3c2.9-3.2%2C7-4.8%2C12.4-4.8c1.4%2C0%2C2.7%2C0.2%2C4.1%2C0.5c1.4%2C0.4%2C2.5%2C0.8%2C3.3%2C1.2v7%0A%09c-1.1-0.8-2.3-1.5-3.4-1.9c-1.2-0.5-2.4-0.7-3.6-0.7c-2.9%2C0-5.2%2C0.9-7%2C2.8c-1.8%2C1.9-2.7%2C4.4-2.7%2C7.6c0%2C3.1%2C0.8%2C5.6%2C2.5%2C7.3%0A%09C202.6%2C75.4%2C204.9%2C76.3%2C207.8%2C76.3z%20M235.7%2C50.1c0.6%2C0%2C1.1%2C0%2C1.6%2C0.1s0.9%2C0.2%2C1.2%2C0.3v7.4c-0.4-0.3-0.9-0.5-1.7-0.8%0A%09c-0.7-0.3-1.6-0.4-2.7-0.4c-1.8%2C0-3.3%2C0.8-4.5%2C2.3c-1.2%2C1.5-1.9%2C3.8-1.9%2C7v15.6h-7.3v-31h7.3v4.9h0.1c0.7-1.7%2C1.7-3%2C3-4%0A%09C232.2%2C50.6%2C233.8%2C50.1%2C235.7%2C50.1z%20M238.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3%0A%09c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5c-4.8%2C0-8.6-1.4-11.4-4.2C240.3%2C75.3%2C238.9%2C71.4%2C238.9%2C66.6z%0A%09%20M246.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5%0A%09c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7C247.2%2C60.5%2C246.5%2C63%2C246.5%2C66.3z%20M281.5%2C58.8c0%2C1%2C0.3%2C1.9%2C1%2C2.5%0A%09c0.7%2C0.6%2C2.1%2C1.3%2C4.4%2C2.2c2.9%2C1.2%2C5%2C2.5%2C6.1%2C3.9c1.2%2C1.5%2C1.8%2C3.2%2C1.8%2C5.3c0%2C2.9-1.1%2C5.3-3.4%2C7c-2.2%2C1.8-5.3%2C2.7-9.1%2C2.7%0A%09c-1.3%2C0-2.7-0.2-4.3-0.5c-1.6-0.3-2.9-0.7-4-1.2v-7.2c1.3%2C0.9%2C2.8%2C1.7%2C4.3%2C2.2c1.5%2C0.5%2C2.9%2C0.8%2C4.2%2C0.8c1.6%2C0%2C2.9-0.2%2C3.6-0.7%0A%09c0.8-0.5%2C1.2-1.2%2C1.2-2.3c0-1-0.4-1.9-1.2-2.5c-0.8-0.7-2.4-1.5-4.6-2.4c-2.7-1.1-4.6-2.4-5.7-3.8c-1.1-1.4-1.7-3.2-1.7-5.4%0A%09c0-2.8%2C1.1-5.1%2C3.3-6.9c2.2-1.8%2C5.1-2.7%2C8.6-2.7c1.1%2C0%2C2.3%2C0.1%2C3.6%2C0.4c1.3%2C0.2%2C2.5%2C0.6%2C3.4%2C0.9v6.9c-1-0.6-2.1-1.2-3.4-1.7%0A%09c-1.3-0.5-2.6-0.7-3.8-0.7c-1.4%2C0-2.5%2C0.3-3.2%2C0.8C281.9%2C57.1%2C281.5%2C57.8%2C281.5%2C58.8z%20M297.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2%0A%09c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5%0A%09c-4.8%2C0-8.6-1.4-11.4-4.2C299.4%2C75.3%2C297.9%2C71.4%2C297.9%2C66.6z%20M305.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6%0A%09c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7%0A%09C306.3%2C60.5%2C305.5%2C63%2C305.5%2C66.3z%20M353.9%2C56.6h-10.9v25h-7.4v-25h-5.2v-6h5.2v-4.3c0-3.3%2C1.1-5.9%2C3.2-8c2.1-2.1%2C4.8-3.1%2C8.1-3.1%0A%09c0.9%2C0%2C1.7%2C0%2C2.4%2C0.1c0.7%2C0.1%2C1.3%2C0.2%2C1.8%2C0.4V42c-0.2-0.1-0.7-0.3-1.3-0.5c-0.6-0.2-1.3-0.3-2.1-0.3c-1.5%2C0-2.7%2C0.5-3.5%2C1.4%0A%09s-1.2%2C2.4-1.2%2C4.2v3.7h10.9v-7l7.3-2.2v9.2h7.4v6h-7.4v14.5c0%2C1.9%2C0.3%2C3.3%2C1%2C4c0.7%2C0.8%2C1.8%2C1.2%2C3.3%2C1.2c0.4%2C0%2C0.9-0.1%2C1.5-0.3%0A%09c0.6-0.2%2C1.1-0.4%2C1.6-0.7v6c-0.5%2C0.3-1.2%2C0.5-2.3%2C0.7c-1.1%2C0.2-2.1%2C0.3-3.2%2C0.3c-3.1%2C0-5.4-0.8-6.9-2.5c-1.5-1.6-2.3-4.1-2.3-7.4%0A%09V56.6z%22/%3E%0A%3Cg%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2224%22%20class%3D%22st2%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2224%22%20class%3D%22st3%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2261.8%22%20class%3D%22st4%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2261.8%22%20class%3D%22st5%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A");
|
||||
}
|
||||
.ms-logo-container>div {
|
||||
min-height: 60px;
|
||||
width: 150px;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
.row {
|
||||
padding: 90px 0px 0 20px;
|
||||
min-width: 480px;
|
||||
max-width: 1366px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
.column {
|
||||
float: left;
|
||||
width: 45%;
|
||||
padding-right: 20px;
|
||||
}
|
||||
.row:after {
|
||||
content: "";
|
||||
display: table;
|
||||
clear: both;
|
||||
}
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
.download-the-emulator {
|
||||
height: 20px;
|
||||
color: #0063B1;
|
||||
font-size: 15px;
|
||||
line-height: 20px;
|
||||
padding-bottom: 70px;
|
||||
}
|
||||
.how-to-iframe {
|
||||
max-width: 700px !important;
|
||||
min-width: 650px !important;
|
||||
height: 700px !important;
|
||||
}
|
||||
.remove-frame-height {
|
||||
height: 10px;
|
||||
}
|
||||
@media only screen and (max-width: 1300px) {
|
||||
.ms-logo {
|
||||
padding-top: 30px;
|
||||
}
|
||||
.header-text {
|
||||
font-size: 40x;
|
||||
}
|
||||
.column {
|
||||
float: none;
|
||||
padding-top: 30px;
|
||||
width: 100%;
|
||||
}
|
||||
.ms-logo-container {
|
||||
padding-top: 30px;
|
||||
min-width: 480px;
|
||||
max-width: 650px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
.row {
|
||||
padding: 20px 0px 0 20px;
|
||||
min-width: 480px;
|
||||
max-width: 650px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
}
|
||||
@media only screen and (max-width: 1370px) {
|
||||
header {
|
||||
background-color: #55A0E0;
|
||||
background-size: auto 200px;
|
||||
}
|
||||
}
|
||||
@media only screen and (max-width: 1230px) {
|
||||
header {
|
||||
background-color: #55A0E0;
|
||||
background-size: auto 200px;
|
||||
}
|
||||
.header-text {
|
||||
font-size: 44px;
|
||||
}
|
||||
.header-icon {
|
||||
height: 120px;
|
||||
width: 120px;
|
||||
}
|
||||
}
|
||||
@media only screen and (max-width: 1000px) {
|
||||
header {
|
||||
background-color: #55A0E0;
|
||||
background-image: none;
|
||||
}
|
||||
}
|
||||
@media only screen and (max-width: 632px) {
|
||||
.header-text {
|
||||
font-size: 32px;
|
||||
}
|
||||
.row {
|
||||
padding: 10px 0px 0 10px;
|
||||
max-width: 490px !important;
|
||||
min-width: 410px !important;
|
||||
}
|
||||
.endpoint {
|
||||
font-size: 25px;
|
||||
}
|
||||
.main-text {
|
||||
font-size: 20px;
|
||||
}
|
||||
.step-container dl>dd {
|
||||
font-size: 14px;
|
||||
}
|
||||
.column {
|
||||
padding-right: 5px;
|
||||
}
|
||||
.header-icon {
|
||||
height: 110px;
|
||||
width: 110px;
|
||||
}
|
||||
.how-to-iframe {
|
||||
max-width: 480px !important;
|
||||
min-width: 400px !important;
|
||||
height: 650px !important;
|
||||
overflow: hidden;
|
||||
}
|
||||
}
|
||||
.remove-frame-height {
|
||||
max-height: 10px;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
loadFrame();
|
||||
});
|
||||
var loadFrame = function () {
|
||||
var iframe = document.createElement('iframe');
|
||||
iframe.setAttribute("id", "iframe");
|
||||
var offLineHTMLContent = "";
|
||||
var frameElement = document.getElementById("how-to-iframe");
|
||||
if (window.navigator.onLine) {
|
||||
iframe.src = 'https://docs.botframework.com/static/abs/pages/f5.htm';
|
||||
iframe.setAttribute("scrolling", "no");
|
||||
iframe.setAttribute("frameborder", "0");
|
||||
iframe.setAttribute("width", "100%");
|
||||
iframe.setAttribute("height", "100%");
|
||||
var frameDiv = document.getElementById("how-to-iframe");
|
||||
frameDiv.appendChild(iframe);
|
||||
} else {
|
||||
frameElement.classList.add("remove-frame-height");
|
||||
}
|
||||
};
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header class="header">
|
||||
<div class="header-inner-container">
|
||||
<div class="header-icon" style="display: inline-block"></div>
|
||||
<div class="header-text" style="display: inline-block">BasicAssistantCLU</div>
|
||||
</div>
|
||||
</header>
|
||||
<div class="row">
|
||||
<div class="column" class="main-content-area">
|
||||
<div class="content-title">Your bot is ready!</div>
|
||||
<div class="main-text main-text-p1">You can test your bot in the Bot Framework Emulator<br />
|
||||
by connecting to http://localhost:3978/api/messages.</div>
|
||||
<div class="main-text download-the-emulator"><a class="ctaLink" href="https://aka.ms/bot-framework-F5-download-emulator"
|
||||
target="_blank">Download the Emulator</a></div>
|
||||
<div class="main-text">Visit <a class="ctaLink" href="https://aka.ms/bot-framework-F5-abs-home" target="_blank">Azure
|
||||
Bot Service</a> to register your bot and add it to<br />
|
||||
various channels. The bot's endpoint URL typically looks
|
||||
like this:</div>
|
||||
<div class="endpoint">https://<i>your_bots_hostname</i>/api/messages</div>
|
||||
</div>
|
||||
<div class="column how-to-iframe" id="how-to-iframe"></div>
|
||||
</div>
|
||||
<div class="ms-logo-container">
|
||||
<div class="ms-logo"></div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,125 @@
|
|||
# Prerequisites
|
||||
- If you don't have an Azure subscription, create a [free account](https://portal.azure.com/) before you begin.
|
||||
- An [Azure subscription](https://learn.microsoft.com/en-us/azure/guides/developer/azure-developer-guide#understanding-accounts-subscriptions-and-billing) to use for your bot.
|
||||
- An [Azure DevOps project](https://learn.microsoft.com/en-us/devops/what-is-devops) in which to configure the Azure pipeline.
|
||||
- An [Azure resource group](https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-portal#what-is-a-resource-group) with the following resources provisioned and configured:
|
||||
- An [Azure App Service plan](https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans) for your web apps. ([Create resource](https://portal.azure.com/#create/Microsoft.AppServicePlanCreate)).
|
||||
- An [Azure App Service](https://learn.microsoft.com/en-us/azure/app-service/overview) to deploy your bot. ([Create resource](https://portal.azure.com/#create/Microsoft.WebSite)).
|
||||
- An [Azure Bot](https://learn.microsoft.com/en-us/azure/bot-service/abs-quickstart?view=azure-bot-service-4.0&tabs=userassigned) resource. ([Create resource](https://portal.azure.com/#create/Microsoft.AzureBot)).
|
||||
- A [Conversational Language Understanding (CLU)](https://learn.microsoft.com/en-us/azure/cognitive-services/language-service/conversational-language-understanding/quickstart?pivots=language-studio) service. ([Create resource](https://portal.azure.com/#create/Microsoft.CognitiveServicesTextAnalytics)).
|
||||
- An _optional_ [QnA Maker](https://learn.microsoft.com/en-us/azure/cognitive-services/QnAMaker/quickstarts/create-publish-knowledge-base) resource. ([Create resource](https://portal.azure.com/#create/Microsoft.CognitiveServicesQnAMaker)).
|
||||
|
||||
The sample YAML files referenced in this article can be found on GitHub at [microsoft/BotBuilder-Samples](./build/yaml).
|
||||
| File | Description |
|
||||
| ------ | ------ |
|
||||
| [buildAndDeploy.yaml](./build/yaml/buildAndDeploy.yaml) | The main YAML file used when the Azure DevOps pipeline is triggered. It maps Azure DevOps variables (see [Define variables](https://learn.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch) for additional information) into YAML [runtime parameters](https://learn.microsoft.com/en-us/azure/devops/pipelines/process/runtime-parameters?view=azure-devops&tabs=script) and then sequentially calls the YAML templates in the templates folder to build and deploy the bot. |
|
||||
| [templates/installPrerequisites.yaml](./build/yaml/templates/installPrerequisites.yaml) | Installs the tools needed to run the pipeline, like npm, BF CLI, and .NET core. |
|
||||
| [templates/buildAndDeployModels.yaml](./build/yaml/templates/buildAndDeployModels.yaml) | Builds, trains, and deploys the optional QnA Maker model. This template also creates a **generated** subfolder in your bot project's directory. The **generated** folder is needed by the bot. |
|
||||
| [templates/buildAndDeployDotNetWebApp.yaml](./build/yaml/templates/buildAndDeployDotNetWebApp.yaml) | Builds the dotnet bot app, prepares the zip package, and deploys it to Azure. It also configures the app settings for the app in Azure once it's deployed. |
|
||||
|
||||
# Provision your Azure environment
|
||||
You first need to provision Azure resources to publish your bot. Take note of the configuration settings so you can later configure the CI/CD pipeline. To make this easier, copy and paste the [Pipeline parameters table](#pipeline-parameters) provided in a separate document and use it as a template.
|
||||
|
||||
> **Note**: This is a good time to update the `BotProjectDirectory` and `BotProjectName` settings in your pipeline's parameters table with your `.csproj` name and the relative path (in forward slash format `/`) to its location in your source tree.
|
||||
|
||||
# Configure your CLU prediction resources (first time only)
|
||||
> **Note**: Because BF CLI is not compatible with CLU, the creation of the resources must be separated from the execution of this pipeline.
|
||||
> [Here](https://learn.microsoft.com/en-us/azure/cognitive-services/language-service/conversational-language-understanding/how-to/create-project?tabs=language-studio%2CLanguage-Studio) you can find the guide to create a CLU resource.
|
||||
|
||||
> **Note**: When creating a new CLU project in the Language Studio, you can use the following [cognitive model](./BasicAssistantCLU/BasicAssistantCLU/CognitiveModels/BasicAssistantCLU.json) from the BasicAssistantCLU sample to import the project instead.
|
||||
|
||||
From the [CLU resource](https://language.cognitive.azure.com/), after a project has been created, you must take the following credentials from Language Studio to set them in the [pipeline's parameters table](#pipeline-parameters).
|
||||
- The `CluDeploymentName` value can be found in the `Deploying a model` blade under `Deployments` inside `Language Studio`.
|
||||
|
||||
- The `CluEndpoint` value can be found in the `Deploying a model` blade under `Deployments` inside `Language Studio` by clicking on the `Get prediction URL` option. It can also be found in the `Keys & Endpoint` blade of your Language resource in the Azure Portal. The endpoint should take the format `https://<language-resource-name>.cognitiveservices.azure.com`.
|
||||
|
||||
- The `CluProjectName` and `CluEndpointKey` values can be found in your `Project Settings` blade under `Azure Language Resource` inside `Language Studio`.
|
||||
|
||||
See [CLU Recognizer](https://github.com/Microsoft/botframework-components/tree/main/packages/Recognizers/ConversationLanguageUnderstanding/dotnet) in Composer package for additional information.
|
||||
|
||||
> **Note**: Ensure that you have selected the correct values for each field. Using the wrong values can lead to errors when running the bot.
|
||||
|
||||
# Create and configure your CI/CD pipeline
|
||||
## Configure an Azure Service Connection for your Azure DevOps project
|
||||
|
||||
|
||||
> **Note**: **Important**. Ensure that your user has 'Owner' or 'User Access Administrator' permissions on the Azure Subscription before you try to create the service connection.
|
||||
|
||||
> **Note**: The name you use for the resource will be used as `AzureServiceConnection` in the [pipeline's parameters table](#pipeline-parameters).
|
||||
|
||||
The following steps will guide you on how to add a Service Connection to an Azure Resource Manager in your DevOps organization. This is a required step to connect your Azure Subscription to the pipelines and deploy resources to Azure.
|
||||
|
||||
### Steps
|
||||
|
||||
- From your Azure DevOps project, go to `Project settings -> Service Connections -> New Service connection`.
|
||||
|
||||
![image](https://github.com/microsoft/BotBuilder-Samples/assets/62260472/2de8b21b-faba-4bf7-accf-b5a4704e2760)
|
||||
|
||||
- Select `Azure Resource Manager -> Service principal (manual)` and fill out the form. Check the `Grant access permission to all pipelines` option. The name you use for the Subscription Name field will be your `AzureServiceConnection` variable in the pipelines. [More Info](https://docs.microsoft.com/en-us/azure/devops/pipelines/library/connect-to-azure?view=azure-devops#create-an-azure-resource-manager-service-connection-with-an-existing-service-principal).
|
||||
|
||||
![image](https://github.com/microsoft/BotBuilder-Samples/assets/62260472/7d212645-5db9-40f3-9781-dba57de118c7)
|
||||
|
||||
- Click on `Verify and save` when done.
|
||||
|
||||
See [Service connections](https://learn.microsoft.com/en-us/azure/devops/pipelines/library/service-endpoints?view=azure-devops&tabs=yaml) in the Azure DevOps documentation for additional information.
|
||||
|
||||
## Create the pipeline
|
||||
In your Azure DevOps project pipelines section, select new pipeline.
|
||||
|
||||
Select your repository and source code provider in the first two tabs and scroll down to the bottom of the page and select **Existing Azure Pipelines YAML file**.
|
||||
|
||||
![image](https://github.com/microsoft/BotBuilder-Samples/assets/62260472/62bb1732-a3a8-4565-88e2-c120e8e9b5ab)
|
||||
![image](https://github.com/microsoft/BotBuilder-Samples/assets/62260472/ba2f7da8-e831-4e27-ad27-f95745624b6e)
|
||||
![image](https://github.com/microsoft/BotBuilder-Samples/assets/62260472/b3c56397-38fa-40bb-9912-332e7285fa63)
|
||||
|
||||
Then select the [buildAndDeploy.yaml](./build/yaml/buildAndDeploy.yaml) file.
|
||||
|
||||
![image](https://github.com/microsoft/BotBuilder-Samples/assets/62260472/40e01ef2-f055-4894-ab7c-6fd00054bfa9)
|
||||
|
||||
In the **Review** tab, select the **Variables** button and create the variables with the values defined in the [pipeline's parameters table](#pipeline-parameters). Make sure you check the **Keep this value** secret option for sensitive parameters.
|
||||
|
||||
![image](https://github.com/microsoft/BotBuilder-Samples/assets/62260472/ab16b423-9ccd-47dc-84b6-4701995c1cf0)
|
||||
|
||||
|
||||
Then select **Run**. This saves and executes your pipeline for the fist time, seen below:
|
||||
|
||||
![image](https://github.com/microsoft/BotBuilder-Samples/assets/62260472/29bdb1b8-528f-4349-8a50-0134b0bdd5bc)
|
||||
|
||||
# Run and test your deployed bot
|
||||
You can now run and test your bot from the configured channels.
|
||||
|
||||
# Additional information
|
||||
|
||||
## Pipeline parameters
|
||||
| Configuration setting | Description | Example |
|
||||
| ------ | ------ | ------ |
|
||||
| AzureServiceConnection | The name of the Azure DevOps service connection used to deploy the bot to Azure | *MyCICDBotDeployment* |
|
||||
| BotName | Your bot's name | *MyCICDBot* |
|
||||
| BotProjectDirectory | The relative path from the repo root to your bot's *.csproj* file | *BasicAssistantCLU/BasicAssistantCLU* |
|
||||
| BotProjectName | The name of your bot's *.csproj* file | *BasicAssistantCLU.csproj* |
|
||||
| BuildYamlDirectory | The relative path from the repo root to your pipeline's *.yaml* files | *build/yaml* |
|
||||
| CluDeploymentName | The name of the deployment model from the Language service | *BasicAssistantCLUDeployment* |
|
||||
| CluEndpoint | The CLU endpoint where the Language service project has been deployed | *https://basicassistantclu.cognitiveservices.azure.com* |
|
||||
| CluEndpointKey | The endpoint key used to access the published project | *11111111-1111-1111-1111-111111111111* |
|
||||
| CluProjectName | The name of the project created in the Language service resource | *BasicAssistantCLU* |
|
||||
| MicrosoftAppId | The Azure Active Directory app registration app ID for your bot | *11111111-1111-1111-1111-111111111111* |
|
||||
| MicrosoftAppPassword | The Azure Active Directory app registration app password for your bot | *YourAppPassword* |
|
||||
| QnAEndpointKey | The endpoint key used to access /QnA Maker/ (from QnA portal <your_knowledgebase>/Settings/Deployment Details/Authorization: EndpointKey) | *11111111-1111-1111-1111-111111111111* |
|
||||
| QnAHostName | Your QnA Maker host URL (from QnA portal <your_knowledgebase>/Settings/Deployment Details/Host) | *https://mycicdbotapp-qna-qnahost.azurewebsites.net/qnamaker* |
|
||||
| QnAKnowledgebaseId | Your QnA Maker knowledge base ID (from /QnA portal/ <your_knowledgebase>/Settings/Deployment Details/knowledgebases) | *11111111-1111-1111-1111-111111111111* |
|
||||
| QnARegion | Your QnA Maker region (from the /Azure portal/ <qna_maker_resource>/Keys and Endpoint/Location) | *westus* |
|
||||
| QnASubscriptionKey | The QnA Maker subscription key (from the /Azure portal/ <qna_maker_resource>/Keys and Endpoint/KEY 1) | *1234567890abcdef1234567890abcdef* |
|
||||
| ResourceGroupName | The Azure resource group containing your bot's deployed resources | *MyTestBot-RG* |
|
||||
| WebAppName | The Azure app service name for your bot | *MyCICDBotApp* |
|
||||
|
||||
## Portals
|
||||
- [Azure portal](https://portal.azure.com/#home) - Access to your bot's deployment and Azure resources.
|
||||
- [Language Studio portal](https://language.cognitive.azure.com/home) - Most LUIS pipeline parameter values are under <app_name>/Manage/Azure Resources.
|
||||
- [QnA Maker portal](https://www.qnamaker.ai/) - Most QnA pipeline parameter values are under <your_knowledgebase>/Settings/Deployment Details.
|
||||
|
||||
## Submit Feedback or file an issue
|
||||
1. Go to the [create new issue](https://github.com/microsoft/BotFramework-Composer/issues/new/choose) page for the BotFramework-Composer repository.
|
||||
2. Select the appropriate option: **Bug, Feature Request, or Other**.
|
||||
3. Fill out template and submit your issue.
|
||||
4. Add the **Area: CICD** label to the issue.
|
||||
|
|
@ -0,0 +1,152 @@
|
|||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
# Licensed under the MIT License.
|
||||
#
|
||||
# Starter pipeline
|
||||
# Minimal pipeline to deploy a basic assistant bot that you can customize to build and deploy your code.
|
||||
# Add steps that build, run tests, deploy, and more:
|
||||
# https://aka.ms/yaml
|
||||
#
|
||||
|
||||
trigger:
|
||||
- none
|
||||
|
||||
pool:
|
||||
vmImage: ubuntu-latest
|
||||
|
||||
# Parameters with defaults formatted as $(name) get their values
|
||||
# from variables of that name defined in the Azure DevOps pipeline UI.
|
||||
parameters:
|
||||
- name: azureServiceConnection
|
||||
displayName: Azure service connection
|
||||
type: string
|
||||
default: $(AZURESERVICECONNECTION)
|
||||
|
||||
- name: botName
|
||||
displayName: Bot name
|
||||
type: string
|
||||
default: $(BOTNAME)
|
||||
|
||||
- name: microsoftAppId
|
||||
displayName: Bot"s Microsoft app ID
|
||||
type: string
|
||||
default: $(MICROSOFTAPPID)
|
||||
|
||||
- name: microsoftAppPassword
|
||||
displayName: Bot"s Microsoft app password
|
||||
type: string
|
||||
default: $(MICROSOFTAPPPASSWORD)
|
||||
|
||||
- name: resourceGroupName
|
||||
displayName: Azure resource group
|
||||
type: string
|
||||
default: $(RESOURCEGROUPNAME)
|
||||
|
||||
- name: webAppName
|
||||
displayName: Azure web app name
|
||||
type: string
|
||||
default: $(WEBAPPNAME)
|
||||
|
||||
- name: botProjectDirectory
|
||||
displayName: Relative path to the bot's csproj file (e.g. BasicAssistantCLU/BasicAssistantCLU)
|
||||
type: string
|
||||
default: $(BOTPROJECTDIRECTORY)
|
||||
|
||||
- name: botProjectName
|
||||
displayName: Bot"s project name (csproj)
|
||||
type: string
|
||||
default: $(BOTPROJECTNAME)
|
||||
|
||||
- name: buildYamlDirectory
|
||||
displayName: Relative path to the pipeline's .yaml folder (e.g. build/yaml)
|
||||
type: string
|
||||
default: $(BUILDYAMLDIRECTORY)
|
||||
|
||||
# CLU parameters
|
||||
- name: cluProjectName
|
||||
displayName: CLU Project name
|
||||
type: string
|
||||
default: $(CLUPROJECTNAME)
|
||||
|
||||
- name: cluEndpoint
|
||||
displayName: CLU Endpoint
|
||||
type: string
|
||||
default: $(CLUENDPOINT)
|
||||
|
||||
- name: cluEndpointKey
|
||||
displayName: CLU Endpoint key
|
||||
type: string
|
||||
default: $(CLUENDPOINTKEY)
|
||||
|
||||
- name: cluDeploymentName
|
||||
displayName: CLU Deployment name
|
||||
type: string
|
||||
default: $(CLUDEPLOYMENTNAME)
|
||||
|
||||
# QnAMaker parameters
|
||||
- name: qnaSubscriptionKey
|
||||
displayName: QnA Maker subscription key
|
||||
type: string
|
||||
default: $(QNASUBSCRIPTIONKEY)
|
||||
|
||||
- name: qnaEndpointKey
|
||||
displayName: QnA Maker endpoint key
|
||||
type: string
|
||||
default: $(QNAENDPOINTKEY)
|
||||
|
||||
- name: qnaHostName
|
||||
displayName: QnA Maker host name
|
||||
type: string
|
||||
default: $(QNAHOSTNAME)
|
||||
|
||||
- name: qnaKnowledgebaseId
|
||||
displayName: QnA Maker knowledgebase ID
|
||||
type: string
|
||||
default: $(QNAKNOWLEDGEBASEID)
|
||||
|
||||
- name: qnaRegion
|
||||
displayName: QnA Maker region
|
||||
type: string
|
||||
default: $(QNAREGION)
|
||||
|
||||
steps:
|
||||
# Install prerequisites
|
||||
- template: templates/installPrerequisites.yaml
|
||||
|
||||
# Build and deploy QnAMaker models
|
||||
- template: templates/buildAndDeployModels.yaml
|
||||
parameters:
|
||||
sourceDirectory: "$(System.DefaultWorkingDirectory)/${{ parameters.botProjectDirectory }}"
|
||||
yamlDirectory: "$(System.DefaultWorkingDirectory)/${{ parameters.buildYamlDirectory }}"
|
||||
botName: "${{ parameters.botName }}"
|
||||
qnaSubscriptionKey: "${{ parameters.qnaSubscriptionKey }}"
|
||||
|
||||
# Deploy and configure web app
|
||||
- template: templates/buildAndDeployDotNetWebApp.yaml
|
||||
parameters:
|
||||
azureServiceConnection: "${{ parameters.azureServiceConnection }}"
|
||||
webAppName: "${{ parameters.webAppName }}"
|
||||
resourceGroupName: "${{ parameters.resourceGroupName }}"
|
||||
botProjectFile: "$(System.DefaultWorkingDirectory)/${{ parameters.botProjectDirectory }}/${{ parameters.botProjectName }}"
|
||||
botName: "${{ parameters.botName }}"
|
||||
microsoftAppId: "${{ parameters.microsoftAppId }}"
|
||||
microsoftAppPassword: "${{ parameters.microsoftAppPassword }}"
|
||||
cluProjectName: "${{ parameters.cluProjectName }}"
|
||||
cluEndpoint: "${{ parameters.cluEndpoint }}"
|
||||
cluEndpointKey: "${{ parameters.cluEndpointKey }}"
|
||||
cluDeploymentName: "${{ parameters.cluDeploymentName }}"
|
||||
qnaSubscriptionKey: "${{ parameters.qnaSubscriptionKey }}"
|
||||
qnaEndpointKey: "${{ parameters.qnaEndpointKey }}"
|
||||
qnaHostName: "${{ parameters.qnaHostName }}"
|
||||
qnaKnowledgebaseId: "${{ parameters.qnaKnowledgebaseId }}"
|
||||
qnaRegion: "${{ parameters.qnaRegion }}"
|
||||
|
||||
# Helper to output the working folder directory contents for diagnostics
|
||||
- task: PowerShell@2
|
||||
displayName: "Dir workspace"
|
||||
continueOnError: true
|
||||
condition: succeededOrFailed()
|
||||
inputs:
|
||||
targetType: "inline"
|
||||
script: |
|
||||
cd ..
|
||||
ls -R
|
|
@ -0,0 +1,167 @@
|
|||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
# Licensed under the MIT License.
|
||||
#
|
||||
# Builds, deploys and configures the bot's dotnet web app
|
||||
#
|
||||
|
||||
parameters:
|
||||
- name: azureServiceConnection
|
||||
displayName: Azure Service Connection
|
||||
type: string
|
||||
|
||||
- name: webAppName
|
||||
displayName: Azure web app name
|
||||
type: string
|
||||
|
||||
- name: resourceGroupName
|
||||
displayName: Resource group
|
||||
type: string
|
||||
|
||||
- name: botProjectFile
|
||||
displayName: Bot project to build and deploy
|
||||
type: string
|
||||
|
||||
- name: botName
|
||||
displayName: Bot name
|
||||
type: string
|
||||
|
||||
- name: microsoftAppId
|
||||
displayName: Bot's Microsoft app ID
|
||||
type: string
|
||||
|
||||
- name: microsoftAppPassword
|
||||
displayName: Bot's Microsoft app Password
|
||||
type: string
|
||||
|
||||
- name: cluProjectName
|
||||
displayName: CLU Project name
|
||||
type: string
|
||||
|
||||
- name: cluEndpoint
|
||||
displayName: CLU Endpoint
|
||||
type: string
|
||||
|
||||
- name: cluEndpointKey
|
||||
displayName: CLU Endpoint key
|
||||
type: string
|
||||
|
||||
- name: cluDeploymentName
|
||||
displayName: CLU Deployment name
|
||||
type: string
|
||||
|
||||
- name: qnaSubscriptionKey
|
||||
displayName: QnA Maker subscription key
|
||||
type: string
|
||||
|
||||
- name: qnaEndpointKey
|
||||
displayName: QnA Maker endpoint key
|
||||
type: string
|
||||
|
||||
- name: qnaHostName
|
||||
displayName: QnA Maker host name
|
||||
type: string
|
||||
|
||||
- name: qnaKnowledgebaseId
|
||||
displayName: QnA Maker knowledgebase ID
|
||||
type: string
|
||||
|
||||
- name: qnaRegion
|
||||
displayName: QnA Maker region
|
||||
type: string
|
||||
|
||||
steps:
|
||||
# Build bot
|
||||
# Note: this step also packages the generated folder created by the buildAndDeployModels yaml script.
|
||||
# https://stackoverflow.com/questions/63788646/naming-resulting-zip-archive-in-azure-pipelines-build
|
||||
- task: DotNetCoreCLI@2
|
||||
displayName: "Build the bot publishing package"
|
||||
inputs:
|
||||
command: "publish"
|
||||
projects: "${{ parameters.botProjectFile }}"
|
||||
publishWebProjects: false #setting it to false to make sure only this csproj gets compiled and published.
|
||||
arguments: "--output $(System.DefaultWorkingDirectory)/output/zipDeploy"
|
||||
zipAfterPublish: True
|
||||
|
||||
# Publish output artifacts to Azure DevOps
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: "Publish build artifacts"
|
||||
inputs:
|
||||
pathtoPublish: "$(System.DefaultWorkingDirectory)/output/zipDeploy"
|
||||
artifactName: "BuildArtifacts-$(Build.BuildId)"
|
||||
|
||||
# Deploy the web app to azure
|
||||
- task: AzureWebApp@1
|
||||
displayName: "Deploy Azure Web App: ${{ parameters.webAppName }}"
|
||||
inputs:
|
||||
azureSubscription: ${{ parameters.azureServiceConnection }}
|
||||
appName: "${{ parameters.webAppName }}"
|
||||
resourceGroupName: "${{ parameters.resourceGroupName }}"
|
||||
package: "$(System.DefaultWorkingDirectory)/output/zipDeploy/*.zip"
|
||||
deploymentMethod: runFromPackage
|
||||
|
||||
# Configure web appSettings
|
||||
- task: AzureAppServiceSettings@1
|
||||
displayName: "Configure App Service Settings"
|
||||
inputs:
|
||||
azureSubscription: "${{ parameters.azureServiceConnection }}"
|
||||
appName: "${{ parameters.webAppName }}"
|
||||
# To deploy the settings on a slot, provide slot name as below (e.g: slotName: staging).
|
||||
# By default, the settings would be applied to the actual Web App (Production slot)
|
||||
appSettings: |
|
||||
[
|
||||
{
|
||||
"name": "MicrosoftAppId",
|
||||
"value": "${{ parameters.microsoftAppId }}",
|
||||
"slotSetting": false
|
||||
},
|
||||
{
|
||||
"name": "MicrosoftAppPassword",
|
||||
"value": "${{ parameters.microsoftAppPassword }}",
|
||||
"slotSetting": false
|
||||
},
|
||||
{
|
||||
"name": "clu__projectName",
|
||||
"value": "${{ parameters.cluProjectName }}",
|
||||
"slotSetting": false
|
||||
},
|
||||
{
|
||||
"name": "clu__endpoint",
|
||||
"value": "${{ parameters.cluEndpoint }}",
|
||||
"slotSetting": false
|
||||
},
|
||||
{
|
||||
"name": "clu__endpointKey",
|
||||
"value": "${{ parameters.cluEndpointKey }}",
|
||||
"slotSetting": false
|
||||
},
|
||||
{
|
||||
"name": "clu__deploymentName",
|
||||
"value": "${{ parameters.cluDeploymentName }}",
|
||||
"slotSetting": false
|
||||
},
|
||||
{
|
||||
"name": "qna__hostname",
|
||||
"value": "${{ parameters.qnaHostName }}",
|
||||
"slotSetting": false
|
||||
},
|
||||
{
|
||||
"name": "qna__knowledgebaseid",
|
||||
"value": "${{ parameters.qnaKnowledgebaseId }}",
|
||||
"slotSetting": false
|
||||
},
|
||||
{
|
||||
"name": "qna__qnaRegion",
|
||||
"value": "${{ parameters.qnaRegion }}",
|
||||
"slotSetting": false
|
||||
},
|
||||
{
|
||||
"name": "qna__endpointKey",
|
||||
"value": "${{ parameters.qnaEndpointKey }}",
|
||||
"slotSetting": false
|
||||
},
|
||||
{
|
||||
"name": "qna__subscriptionKey",
|
||||
"value": "${{ parameters.qnaSubscriptionKey }}",
|
||||
"slotSetting": false
|
||||
}
|
||||
]
|
|
@ -0,0 +1,73 @@
|
|||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
# Licensed under the MIT License.
|
||||
#
|
||||
# Builds, deploys and train language models (QnA Maker)
|
||||
#
|
||||
|
||||
parameters:
|
||||
- name: sourceDirectory
|
||||
displayName: Directory to the source code in the build pipeline
|
||||
type: string
|
||||
|
||||
- name: yamlDirectory
|
||||
displayName: Directory to the yaml files in the build pipeline
|
||||
type: string
|
||||
|
||||
- name: botName
|
||||
displayName: Bot name
|
||||
type: string
|
||||
|
||||
- name: qnaSubscriptionKey
|
||||
displayName: QnA Maker subscription key
|
||||
type: string
|
||||
|
||||
steps:
|
||||
# Prepare working folders
|
||||
- task: PowerShell@2
|
||||
displayName: "Prepare working folders"
|
||||
inputs:
|
||||
targetType: "inline"
|
||||
script: |
|
||||
$generatedDirectory = "${{ parameters.sourceDirectory }}/generated"
|
||||
|
||||
# Clean and recreate the generated directory
|
||||
if (Test-Path $generatedDirectory)
|
||||
{
|
||||
Remove-Item -Path $generatedDirectory -Force -Recurse
|
||||
}
|
||||
|
||||
$outputDirectory = "$generatedDirectory/interruption"
|
||||
New-Item -Path /. -name $outputDirectory -ItemType "directory"
|
||||
condition: and(succeeded(), ne(variables['qnaSubscriptionKey'], ''))
|
||||
|
||||
# Publish QnA Maker KBs if qnaSubscriptionKey is defined
|
||||
- task: PowerShell@2
|
||||
displayName: "Publish QnA"
|
||||
inputs:
|
||||
targetType: "inline"
|
||||
script: |
|
||||
$sourceDirectory = "${{ parameters.sourceDirectory }}/generated/interruption"
|
||||
$outputDirectory = "${{ parameters.sourceDirectory }}/generated"
|
||||
|
||||
# Build, train and publish the QnA maker models
|
||||
bf qnamaker:build --out $outputDirectory --in $sourceDirectory --subscriptionKey ${{ parameters.qnaSubscriptionKey }} --botName ${{ parameters.botName }} --suffix composer --force --log
|
||||
condition: and(succeeded(), ne(variables['qnaSubscriptionKey'], ''))
|
||||
|
||||
# Compress generated folder
|
||||
- task: ArchiveFiles@2
|
||||
displayName: "Compress generated files"
|
||||
inputs:
|
||||
rootFolderOrFile: "${{ parameters.sourceDirectory }}/generated"
|
||||
includeRootFolder: true
|
||||
archiveType: "zip"
|
||||
archiveFile: "$(System.DefaultWorkingDirectory)/output/generated.zip"
|
||||
verbose: true
|
||||
condition: and(succeeded(), ne(variables['qnaSubscriptionKey'], ''))
|
||||
|
||||
# Publish output artifacts to Azure DevOps
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: "Publish generated artifacts"
|
||||
inputs:
|
||||
pathtoPublish: "$(System.DefaultWorkingDirectory)/output/generated.zip"
|
||||
artifactName: "BuildArtifacts-$(Build.BuildId)"
|
||||
condition: and(succeeded(), ne(variables['qnaSubscriptionKey'], ''))
|
2
composer-samples/csharp_dotnetcore/pipelines/CICDPipelineSampleLUIS/BasicAssistant/BasicAssistant/.gitignore
поставляемый
Normal file
2
composer-samples/csharp_dotnetcore/pipelines/CICDPipelineSampleLUIS/BasicAssistant/BasicAssistant/.gitignore
поставляемый
Normal file
|
@ -0,0 +1,2 @@
|
|||
# files generated during the lubuild process
|
||||
generated/
|
|
@ -0,0 +1,27 @@
|
|||
{
|
||||
"iisSettings": {
|
||||
"windowsAuthentication": false,
|
||||
"anonymousAuthentication": true,
|
||||
"iisExpress": {
|
||||
"applicationUrl": "http://localhost:3978",
|
||||
"sslPort": 0
|
||||
}
|
||||
},
|
||||
"profiles": {
|
||||
"IIS Express": {
|
||||
"commandName": "IISExpress",
|
||||
"launchBrowser": true,
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"BotProject": {
|
||||
"commandName": "Project",
|
||||
"launchBrowser": true,
|
||||
"applicationUrl": "http://localhost:3978",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
|
||||
|
||||
> Imported: 68b329da9893e34099c7d8ad5cb9c940
|
|
@ -0,0 +1,35 @@
|
|||
[import](common.lg)
|
||||
|
||||
# ConfirmInput_Prompt_AreYouSure()
|
||||
[Activity
|
||||
Text = ${ConfirmInput_Prompt_AreYouSure_text()}
|
||||
]
|
||||
|
||||
# ConfirmInput_Prompt_AreYouSure_text()
|
||||
- Are you sure you want to cancel?
|
||||
- Do you want to cancel?
|
||||
- I will cancel this for you, but are you sure?
|
||||
|
||||
# SendActivity_CancelConfirmation()
|
||||
[Activity
|
||||
Text = ${SendActivity_CancelConfirmation_text()}
|
||||
]
|
||||
|
||||
# SendActivity_CancelConfirmation_text()
|
||||
- OK, no problem.
|
||||
- Sure. I'll cancel.
|
||||
- OK, I will stop.
|
||||
- Got it, I'll stop here.
|
||||
- No problem, I will stop.
|
||||
|
||||
# SendActivity_ContinueConfirmation()
|
||||
[Activity
|
||||
Text = ${SendActivity_ContinueConfirmation_text()}
|
||||
]
|
||||
|
||||
# SendActivity_ContinueConfirmation_text()
|
||||
- OK, let's continue.
|
||||
- Alright, let's move on.
|
||||
- Let's continue then.
|
||||
|
||||
> Imported: 184d315b4c724ad6466cf3feb5320df4
|
|
@ -0,0 +1,3 @@
|
|||
|
||||
|
||||
> Imported: 68b329da9893e34099c7d8ad5cb9c940
|
|
@ -0,0 +1,3 @@
|
|||
|
||||
|
||||
> Imported: 68b329da9893e34099c7d8ad5cb9c940
|
|
@ -0,0 +1,13 @@
|
|||
[import](common.lg)
|
||||
|
||||
# SendActivity_HelpOverview()
|
||||
[Activity
|
||||
Text = ${SendActivity_HelpOverview_text()}
|
||||
]
|
||||
|
||||
# SendActivity_HelpOverview_text()
|
||||
- I'm here to help with simple asks. I'm just a basic bot for now.
|
||||
- I'm a simple bot, I can help you with minimal requests.
|
||||
- For now, I can only help you with simple questions.
|
||||
|
||||
> Imported: 95949fcc5eb2077f9cffd10817a11340
|
|
@ -0,0 +1,3 @@
|
|||
|
||||
|
||||
> Imported: 68b329da9893e34099c7d8ad5cb9c940
|
Двоичный файл не отображается.
Двоичный файл не отображается.
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче