Skip to content
This repository was archived by the owner on Jan 15, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 20 additions & 10 deletions packages/lu/src/parser/lubuild/builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ const LUOptions = require('./../lu/luOptions')
const Content = require('./../lu/lu')
const recognizerType = require('./../utils/enums/recognizertypes')

const maxVersionCount = 100

export class Builder {
private readonly handler: (input: string) => any

Expand Down Expand Up @@ -159,7 +161,7 @@ export class Builder {
botName: string,
suffix: string,
fallbackLocale: string,
deleteOldVersion: boolean,
keptVersionCount: number,
isStaging: boolean,
multiRecognizers?: Map<string, MultiLanguageRecognizer>,
settings?: Settings,
Expand Down Expand Up @@ -227,7 +229,7 @@ export class Builder {
// otherwise create a new application
if (recognizer.getAppId() && recognizer.getAppId() !== '') {
// To see if need update the model
needTrainAndPublish = await this.updateApplication(currentApp, luBuildCore, recognizer, timeBucket, deleteOldVersion)
needTrainAndPublish = await this.updateApplication(currentApp, luBuildCore, recognizer, timeBucket, keptVersionCount ?? maxVersionCount)
} else {
// create a new application
needTrainAndPublish = await this.createApplication(currentApp, luBuildCore, recognizer, timeBucket)
Expand Down Expand Up @@ -256,7 +258,10 @@ export class Builder {

// update settings asset
if (settings) {
settings.luis[content.name.split('.').join('_').replace(/-/g, '_')] = recognizer.getAppId()
settings.luis[content.name.split('.').join('_').replace(/-/g, '_')] = {
"appId": recognizer.getAppId(),
"version": recognizer.versionId
}
}
}))
}
Expand Down Expand Up @@ -367,7 +372,7 @@ export class Builder {
return currentApp
}

async updateApplication(currentApp: any, luBuildCore: LuBuildCore, recognizer: Recognizer, timeBucket: number, deleteOldVersion: boolean) {
async updateApplication(currentApp: any, luBuildCore: LuBuildCore, recognizer: Recognizer, timeBucket: number, keptVersionCount: number) {
await delay(timeBucket)
const appInfo = await luBuildCore.getApplicationInfo(recognizer.getAppId())
recognizer.versionId = appInfo.activeVersion || appInfo.endpoints.PRODUCTION.versionId
Expand All @@ -387,11 +392,13 @@ export class Builder {
this.handler(`${recognizer.getLuPath()} creating version=${newVersionId}\n`)
await delay(timeBucket)
await luBuildCore.importNewVersion(recognizer.getAppId(), currentApp, options)

if (deleteOldVersion) {
await delay(timeBucket)
const versionObjs = await luBuildCore.listApplicationVersions(recognizer.getAppId())
for (const versionObj of versionObjs) {

// get all available versions
await delay(timeBucket)
const versionObjs = await luBuildCore.listApplicationVersions(recognizer.getAppId())
if (keptVersionCount < versionObjs.length) {
const versionObjsToDelete = versionObjs.reverse().splice(0, versionObjs.length - keptVersionCount)
for (const versionObj of versionObjsToDelete) {
if (versionObj.version !== newVersionId) {
this.handler(`${recognizer.getLuPath()} deleting old version=${versionObj.version}`)
await delay(timeBucket)
Expand Down Expand Up @@ -479,7 +486,10 @@ export class Builder {
for (const content of contents) {
const luisAppsMap = JSON.parse(content.content).luis
for (const appName of Object.keys(luisAppsMap)) {
settings.luis[appName] = luisAppsMap[appName]
settings.luis[appName] = {
"appId": luisAppsMap[appName]["appId"],
"version": luisAppsMap[appName]["version"]
}
}
}

Expand Down
7 changes: 5 additions & 2 deletions packages/lu/src/parser/lubuild/recognizer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export class Recognizer {
versionId: string
private readonly id: string
private readonly applicationId: string | undefined
private readonly version: string | undefined
private readonly endpoint: string | undefined
private readonly endpointKey: string | undefined
private readonly $schema: string | undefined
Expand All @@ -35,10 +36,11 @@ export class Recognizer {
constructor(private readonly luFile: string, targetFileName: string, schema?: string) {
this.appId = ''
this.id = `LUIS_${targetFileName.split('.')[0]}`
this.applicationId = `=settings.luis.${targetFileName.split('.').join('_').replace(/-/g, '_')}`
this.applicationId = `=settings.luis.${targetFileName.split('.').join('_').replace(/-/g, '_')}.appId`
this.endpoint = '=settings.luis.endpoint'
this.endpointKey = '=settings.luis.endpointKey'
this.versionId = '0.1'
this.version = `=settings.luis.${targetFileName.split('.').join('_').replace(/-/g, '_')}.version`
this.versionId = "0.1"
this.$schema = schema
}

Expand All @@ -47,6 +49,7 @@ export class Recognizer {
$kind: 'Microsoft.LuisRecognizer',
id: this.id,
applicationId: this.applicationId,
version: this.version,
endpoint: this.endpoint,
endpointKey: this.endpointKey
}
Expand Down
7 changes: 6 additions & 1 deletion packages/luis/src/commands/luis/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,12 @@ export default class LuisBuild extends Command {

// update or create and then train and publish luis applications based on loaded resources
if (log) this.log('Handling applications...')
const dialogContents = await builder.build(luContents, recognizers, authoringKey, endpoint, botName, suffix, fallbackLocale, deleteOldVersion, isStaging, multiRecognizers, settings, crosstrainedRecognizers, dialog)

// LUIS support maximun 100 versions for an application, keepVersions default set to 100 if deleteOldVersion is not specified.
let keptVersionCount = 100
if (deleteOldVersion) keptVersionCount = 1

const dialogContents = await builder.build(luContents, recognizers, authoringKey, endpoint, botName, suffix, fallbackLocale, keptVersionCount, isStaging, multiRecognizers, settings, crosstrainedRecognizers, dialog)

// write dialog assets based on config
if (out) {
Expand Down
48 changes: 46 additions & 2 deletions packages/luis/test/commands/luis/build.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,16 @@ describe('luis:build update application succeed when utterances changed', () =>
.post(uri => uri.includes('import'))
.reply(201, '0.2')

nock('https://westus.api.cognitive.microsoft.com')
.get(uri => uri.includes('apps'))
.reply(200, [
{
version: '0.2'
},
{
version: '0.1'
}])

nock('https://westus.api.cognitive.microsoft.com')
.post(uri => uri.includes('train'))
.reply(202, {
Expand Down Expand Up @@ -216,6 +226,16 @@ describe('luis:build update application succeed when utterances added', () => {
nock('https://westus.api.cognitive.microsoft.com')
.post(uri => uri.includes('import'))
.reply(201, '0.2')

nock('https://westus.api.cognitive.microsoft.com')
.get(uri => uri.includes('apps'))
.reply(200, [
{
version: '0.2'
},
{
version: '0.1'
}])

nock('https://westus.api.cognitive.microsoft.com')
.post(uri => uri.includes('train'))
Expand Down Expand Up @@ -704,15 +724,29 @@ describe('luis:build update application succeed with parameters set from luconfi
.get(uri => uri.includes('apps'))
.reply(200, [
{
version: '0.1'
version: '0.4'
},
{
version: '0.3'
},
{
version: '0.2'
},
{
version: '0.1'
}
])

nock('https://chinaeast2.api.cognitive.azure.cn')
.delete(uri => uri.includes('apps'))
.delete(uri => uri.includes('0.1'))
.reply(200)

nock('https://chinaeast2.api.cognitive.azure.cn')
.delete(uri => uri.includes('0.2'))
.reply(200)

nock('https://chinaeast2.api.cognitive.azure.cn')
.delete(uri => uri.includes('0.3'))
.reply(200)

nock('https://chinaeast2.api.cognitive.azure.cn')
Expand Down Expand Up @@ -849,6 +883,16 @@ describe('luis:build update application succeed when activeVersion is null', ()
.post(uri => uri.includes('import'))
.reply(201, '0.2')

nock('https://westus.api.cognitive.microsoft.com')
.get(uri => uri.includes('apps'))
.reply(200, [
{
version: '0.2'
},
{
version: '0.1'
}])

nock('https://westus.api.cognitive.microsoft.com')
.post(uri => uri.includes('train'))
.reply(202, {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
{
"luis": {
"non_empty_en_us_lu": "f8c64e2a-1111-3a09-8f78-39d7adc76ec5"
"non_empty_en_us_lu": {
"appId": "f8c64e2a-1111-3a09-8f78-39d7adc76ec5",
"version": "0.1"
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
{
"$kind": "Microsoft.LuisRecognizer",
"id": "LUIS_non-empty",
"applicationId": "=settings.luis.non_empty_en_us_lu",
"applicationId": "=settings.luis.non_empty_en_us_lu.appId",
"version": "=settings.luis.non_empty_en_us_lu.version",
"endpoint": "=settings.luis.endpoint",
"endpointKey": "=settings.luis.endpointKey"
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,16 @@
{
"luis": {
"foo_fr_fr_lu": "f8c64e2a-1111-3a09-8f78-39d7adc76ec5",
"foo_en_us_lu": "f8c64e2a-2222-3a09-8f78-39d7adc76ec5",
"foo_zh_cn_lu": "f8c64e2a-3333-3a09-8f78-39d7adc76ec5"
"foo_fr_fr_lu": {
"appId": "f8c64e2a-1111-3a09-8f78-39d7adc76ec5",
"version": "0.1"
},
"foo_en_us_lu": {
"appId": "f8c64e2a-2222-3a09-8f78-39d7adc76ec5",
"version": "0.1"
},
"foo_zh_cn_lu": {
"appId": "f8c64e2a-3333-3a09-8f78-39d7adc76ec5",
"version": "0.1"
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
{
"$kind": "Microsoft.LuisRecognizer",
"id": "LUIS_foo",
"applicationId": "=settings.luis.foo_en_us_lu",
"applicationId": "=settings.luis.foo_en_us_lu.appId",
"version": "=settings.luis.foo_en_us_lu.version",
"endpoint": "=settings.luis.endpoint",
"endpointKey": "=settings.luis.endpointKey"
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
{
"$kind": "Microsoft.LuisRecognizer",
"id": "LUIS_foo",
"applicationId": "=settings.luis.foo_fr_fr_lu",
"applicationId": "=settings.luis.foo_fr_fr_lu.appId",
"version": "=settings.luis.foo_fr_fr_lu.version",
"endpoint": "=settings.luis.endpoint",
"endpointKey": "=settings.luis.endpointKey"
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
{
"$kind": "Microsoft.LuisRecognizer",
"id": "LUIS_foo",
"applicationId": "=settings.luis.foo_zh_cn_lu",
"applicationId": "=settings.luis.foo_zh_cn_lu.appId",
"version": "=settings.luis.foo_zh_cn_lu.version",
"endpoint": "=settings.luis.endpoint",
"endpointKey": "=settings.luis.endpointKey"
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,16 @@
{
"luis": {
"foo_en_us_lu": "f8c64e2a-2222-3a09-8f78-39d7adc76ec5",
"foo_fr_fr_lu": "f8c64e2a-1111-3a09-8f78-39d7adc76ec5",
"foo_zh_cn_lu": "f8c64e2a-3333-3a09-8f78-39d7adc76ec5"
"foo_en_us_lu": {
"appId": "f8c64e2a-2222-3a09-8f78-39d7adc76ec5",
"version": "0.1"
},
"foo_fr_fr_lu": {
"appId": "f8c64e2a-1111-3a09-8f78-39d7adc76ec5",
"version": "0.1"
},
"foo_zh_cn_lu": {
"appId": "f8c64e2a-3333-3a09-8f78-39d7adc76ec5",
"version": "0.1"
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"$kind": "Microsoft.LuisRecognizer",
"id": "LUIS_foo",
"applicationId": "f8c64e2a-2222-3a09-8f78-39d7adc76ec5",
"version": "0.1",
"endpoint": "yyy",
"endpointKey": "zzz"
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"$kind": "Microsoft.LuisRecognizer",
"id": "LUIS_foo",
"applicationId": "f8c64e2a-1111-3a09-8f78-39d7adc76ec5",
"version": "0.1",
"endpoint": "yyy",
"endpointKey": "zzz"
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
{
"$kind": "Microsoft.LuisRecognizer",
"id": "LUIS_foo",
"applicationId": "=settings.luis.foo_zh_cn_lu",
"applicationId": "=settings.luis.foo_zh_cn_lu.appId",
"version": "=settings.luis.foo_zh_cn_lu.version",
"endpoint": "=settings.luis.endpoint",
"endpointKey": "=settings.luis.endpointKey"
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"$kind": "Microsoft.LuisRecognizer",
"id": "LUIS_foo",
"applicationId": "f8c64e2a-2222-3a09-8f78-39d7adc76ec5",
"version": "0.1",
"endpoint": "yyy",
"endpointKey": "zzz"
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"$kind": "Microsoft.LuisRecognizer",
"id": "LUIS_foo",
"applicationId": "f8c64e2a-1111-3a09-8f78-39d7adc76ec5",
"version": "0.1",
"endpoint": "yyy",
"endpointKey": "zzz"
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
{
"luis": {
"foo_en_us_lu": "f8c64e2a-2222-3a09-8f78-39d7adc76ec5",
"foo_fr_fr_lu": "f8c64e2a-1111-3a09-8f78-39d7adc76ec5"
"foo_en_us_lu": {
"appId": "f8c64e2a-2222-3a09-8f78-39d7adc76ec5",
"version": 0.1
},
"foo_fr_fr_lu": {
"appId": "f8c64e2a-1111-3a09-8f78-39d7adc76ec5",
"version": 0.1
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
{
"luis": {
"test_en_us_lu": "f8c64e2a-8635-3a09-8f78-39d7adc76ec5"
"test_en_us_lu": {
"appId": "f8c64e2a-8635-3a09-8f78-39d7adc76ec5",
"version": "0.2"
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
{
"$kind": "Microsoft.LuisRecognizer",
"id": "LUIS_test",
"applicationId": "=settings.luis.test_en_us_lu",
"applicationId": "=settings.luis.test_en_us_lu.appId",
"version": "=settings.luis.test_en_us_lu.version",
"endpoint": "=settings.luis.endpoint",
"endpointKey": "=settings.luis.endpointKey"
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
{
"luis": {
"sandwich_en_us_lu": "f8c64e2a-8635-3a09-8f78-39d7adc76ec5"
"sandwich_en_us_lu": {
"appId": "f8c64e2a-8635-3a09-8f78-39d7adc76ec5",
"version": "0.1"
}
}
}
Loading