-
Notifications
You must be signed in to change notification settings - Fork 22
Expand file tree
/
Copy pathLuisTrainClient.cs
More file actions
129 lines (110 loc) · 5.26 KB
/
LuisTrainClient.cs
File metadata and controls
129 lines (110 loc) · 5.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
namespace NLU.DevOps.Luis
{
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Azure.CognitiveServices.Language.LUIS.Authoring;
using Microsoft.Azure.CognitiveServices.Language.LUIS.Authoring.Models;
using Newtonsoft.Json;
internal class LuisTrainClient : ILuisTrainClient
{
public LuisTrainClient(ILuisConfiguration luisConfiguration)
{
this.LuisConfiguration = luisConfiguration ?? throw new ArgumentNullException(nameof(luisConfiguration));
var authoringCredentials = new ApiKeyServiceClientCredentials(luisConfiguration.AuthoringKey);
this.AuthoringClient = new LUISAuthoringClient(authoringCredentials)
{
Endpoint = luisConfiguration.AuthoringEndpoint,
};
}
private ILuisConfiguration LuisConfiguration { get; }
private LUISAuthoringClient AuthoringClient { get; }
public async Task<string> CreateAppAsync(string appName, CancellationToken cancellationToken)
{
var request = new ApplicationCreateObject
{
Name = appName,
Culture = "en-us",
};
// Creating LUIS app.
var appId = await this.AuthoringClient.Apps.AddAsync(request, cancellationToken).ConfigureAwait(false);
// Assign Azure resource to LUIS app.
var azureSubscriptionInfo = AzureSubscriptionInfo.Create(this.LuisConfiguration);
if (azureSubscriptionInfo != null)
{
await this.AssignAzureResourceAsync(azureSubscriptionInfo, appId).ConfigureAwait(false);
}
return appId.ToString();
}
public Task DeleteAppAsync(string appId, CancellationToken cancellationToken)
{
return this.AuthoringClient.Apps.DeleteAsync(Guid.Parse(appId), cancellationToken: cancellationToken);
}
public Task DeleteVersionAsync(string appId, string versionId, CancellationToken cancellationToken)
{
return this.AuthoringClient.Versions.DeleteAsync(Guid.Parse(appId), versionId, cancellationToken);
}
public async Task<OperationResponse<IList<ModelTrainingInfo>>> GetTrainingStatusAsync(string appId, string versionId, CancellationToken cancellationToken)
{
var operationResponse = await this.AuthoringClient.Train.GetStatusWithHttpMessagesAsync(Guid.Parse(appId), versionId, cancellationToken: cancellationToken).ConfigureAwait(false);
return OperationResponse.Create(operationResponse.Body, operationResponse.Response);
}
public Task ImportVersionAsync(string appId, string versionId, LuisApp luisApp, CancellationToken cancellationToken)
{
return this.AuthoringClient.Versions.ImportAsync(Guid.Parse(appId), luisApp, versionId, cancellationToken);
}
public Task PublishAppAsync(string appId, string versionId, CancellationToken cancellationToken)
{
var request = new ApplicationPublishObjectWithDirectVersionPublish();
request.IsStaging = this.LuisConfiguration.IsStaging;
request.VersionId = this.LuisConfiguration.VersionId;
request.DirectVersionPublish = this.LuisConfiguration.DirectVersionPublish;
return this.AuthoringClient.Apps.PublishAsync(Guid.Parse(appId), request, cancellationToken);
}
public Task TrainAsync(string appId, string versionId, CancellationToken cancellationToken)
{
return this.AuthoringClient.Train.TrainVersionAsync(Guid.Parse(appId), versionId, cancellationToken);
}
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
protected void Dispose(bool disposing)
{
if (disposing)
{
this.AuthoringClient.Dispose();
}
}
private async Task AssignAzureResourceAsync(AzureSubscriptionInfo azureSubscriptionInfo, Guid appId)
{
var jsonBody = JsonConvert.SerializeObject(azureSubscriptionInfo);
var data = new StringContent(jsonBody, Encoding.UTF8, "application/json");
var url = $"{this.AuthoringClient.Endpoint}/luis/api/v2.0/apps/{appId}/azureaccounts";
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri(url),
Headers =
{
{ HttpRequestHeader.Authorization.ToString(), $"Bearer {this.LuisConfiguration.ArmToken}" },
{ "Ocp-Apim-Subscription-Key", this.LuisConfiguration.AuthoringKey }
},
Content = data,
};
var result = await this.AuthoringClient.HttpClient.SendAsync(request).ConfigureAwait(false);
result.EnsureSuccessStatusCode();
}
private class ApplicationPublishObjectWithDirectVersionPublish : ApplicationPublishObject
{
public bool DirectVersionPublish { get; set; }
}
}
}