Skip to content
This repository was archived by the owner on Jan 15, 2025. It is now read-only.

Commit 6536d7c

Browse files
authored
add $schema for luis build and qnamaker build dialog files (#844)
* add schema parameters for luis build * add schema parameters for qnamaker build * resolve comments
1 parent 09d2523 commit 6536d7c

File tree

20 files changed

+246
-54
lines changed

20 files changed

+246
-54
lines changed

packages/lu/src/parser/lubuild/builder.ts

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ export class Builder {
3333
files: string[],
3434
culture: string,
3535
suffix: string,
36-
region: string) {
36+
region: string,
37+
schema?: string) {
3738
let multiRecognizers = new Map<string, MultiLanguageRecognizer>()
3839
let settings = new Map<string, Settings>()
3940
let recognizers = new Map<string, Recognizer>()
@@ -76,12 +77,15 @@ export class Builder {
7677
const multiRecognizerPath = path.join(fileFolder, `${fileName}.lu.dialog`)
7778
if (!multiRecognizers.has(fileName)) {
7879
let multiRecognizerContent = {}
80+
let multiRecognizerSchema = schema
7981
if (fs.existsSync(multiRecognizerPath)) {
80-
multiRecognizerContent = JSON.parse(await fileHelper.getContentFromFile(multiRecognizerPath)).recognizers
82+
let multiRecognizerObject = JSON.parse(await fileHelper.getContentFromFile(multiRecognizerPath))
83+
multiRecognizerContent = multiRecognizerObject.recognizers
84+
multiRecognizerSchema = multiRecognizerSchema || multiRecognizerObject.$schema
8185
this.handler(`${multiRecognizerPath} loaded\n`)
8286
}
8387

84-
multiRecognizers.set(fileName, new MultiLanguageRecognizer(multiRecognizerPath, multiRecognizerContent))
88+
multiRecognizers.set(fileName, new MultiLanguageRecognizer(multiRecognizerPath, multiRecognizerContent, multiRecognizerSchema as string))
8589
}
8690

8791
const settingsPath = path.join(fileFolder, `luis.settings.${suffix}.${region}.json`)
@@ -105,7 +109,11 @@ export class Builder {
105109
this.handler(`${dialogFile} loaded\n`)
106110
}
107111

108-
let recognizer = Recognizer.load(content.path, content.name, dialogFile, settings.get(fileFolder) as Settings, existingDialogObj)
112+
if (existingDialogObj && schema) {
113+
existingDialogObj.$schema = schema
114+
}
115+
116+
let recognizer = Recognizer.load(content.path, content.name, dialogFile, settings.get(fileFolder) as Settings, existingDialogObj, schema)
109117
recognizers.set(content.name, recognizer)
110118
}
111119

@@ -221,7 +229,7 @@ export class Builder {
221229
return dialogContents
222230
}
223231

224-
async writeDialogAssets(contents: any[], force: boolean, out: string, dialogType: string, luconfig: string) {
232+
async writeDialogAssets(contents: any[], force: boolean, out: string, dialogType: string, luconfig: string, schema: string) {
225233
let writeDone = false
226234

227235
let writeContents = contents.filter(c => c.id.endsWith('.dialog'))
@@ -248,7 +256,7 @@ export class Builder {
248256
}
249257

250258
this.handler(`Writing to ${outFilePath}\n`)
251-
await this.writeDialog(content.content, outFilePath, dialogType)
259+
await this.writeDialog(content.content, outFilePath, dialogType, schema)
252260
writeDone = true
253261
}
254262
}
@@ -260,7 +268,7 @@ export class Builder {
260268
}
261269

262270
this.handler(`Writing to ${content.path}\n`)
263-
await this.writeDialog(content.content, content.path, dialogType)
271+
await this.writeDialog(content.content, content.path, dialogType, schema)
264272
writeDone = true
265273
}
266274
}
@@ -411,7 +419,7 @@ export class Builder {
411419
}
412420
}
413421

414-
async writeDialog(content: string, filePath: string, dialogType: string) {
422+
async writeDialog(content: string, filePath: string, dialogType: string, schema: string) {
415423
await fs.writeFile(filePath, content, 'utf-8')
416424
const contentObj = JSON.parse(content)
417425
if (dialogType === recognizerType.CROSSTRAINED && contentObj.$kind === 'Microsoft.MultiLanguageRecognizer') {
@@ -427,7 +435,7 @@ export class Builder {
427435
content = JSON.stringify(existingCRDialog, null, 4)
428436
} else {
429437
const recognizers = [fileName + '.lu']
430-
content = new CrossTrainedRecognizer(crossTrainedFilePath, recognizers).save()
438+
content = new CrossTrainedRecognizer(crossTrainedFilePath, recognizers, schema).save()
431439
}
432440

433441
await fs.writeFile(crossTrainedFilePath, content, 'utf-8')

packages/lu/src/parser/lubuild/cross-trained-recognizer.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,24 @@
66
export class CrossTrainedRecognizer {
77
public recognizers: any
88
private readonly dialogPath: string
9+
private readonly $schema: string | undefined
910

10-
constructor(dialogPath: string, recognizers: any) {
11+
constructor(dialogPath: string, recognizers: any, schema?: string) {
1112
this.dialogPath = dialogPath
1213
this.recognizers = recognizers
14+
this.$schema = schema
1315
}
1416

1517
save(): string {
16-
let output = {
18+
let output: any = {
1719
$kind: 'Microsoft.CrossTrainedRecognizerSet',
1820
recognizers: this.recognizers
1921
}
2022

23+
if (this.$schema) {
24+
output = {$schema: this.$schema, ...output}
25+
}
26+
2127
return JSON.stringify(output, null, 4)
2228
}
2329

packages/lu/src/parser/lubuild/multi-language-recognizer.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,24 @@
66
export class MultiLanguageRecognizer {
77
public recognizers: any
88
private readonly dialogPath: string
9+
private readonly $schema: string | undefined
910

10-
constructor(dialogPath: string, recognizers: any) {
11+
constructor(dialogPath: string, recognizers: any, schema?: string) {
1112
this.dialogPath = dialogPath
1213
this.recognizers = recognizers
14+
this.$schema = schema
1315
}
1416

1517
save(): string {
16-
let output = {
18+
let output: any = {
1719
$kind: 'Microsoft.MultiLanguageRecognizer',
1820
recognizers: this.recognizers
1921
}
2022

23+
if (this.$schema) {
24+
output = {$schema: this.$schema, ...output}
25+
}
26+
2127
return JSON.stringify(output, null, 4)
2228
}
2329

packages/lu/src/parser/lubuild/recognizer.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,45 +7,51 @@ import {Settings} from './settings'
77
import * as path from 'path'
88

99
export class Recognizer {
10-
static load(luFile: string, targetFileName: string, dialogPath: string, luisSettings: Settings, existingRecognizer: any): Recognizer {
10+
static load(luFile: string, targetFileName: string, dialogPath: string, luisSettings: Settings, existingRecognizer: any, schema?: string): Recognizer {
1111
if (existingRecognizer) {
12-
let recognizer = new Recognizer(luFile, targetFileName)
12+
let recognizer = new Recognizer(luFile, targetFileName, schema)
1313
recognizer.dialogPath = dialogPath
1414
Object.assign(recognizer, existingRecognizer)
1515
recognizer.setAppId(luisSettings.luis[path.basename(luFile).split('.').join('_')])
1616

1717
return recognizer
1818
}
1919

20-
let recognizer = new Recognizer(luFile, targetFileName)
20+
let recognizer = new Recognizer(luFile, targetFileName, schema)
2121
recognizer.dialogPath = dialogPath
2222

2323
return recognizer
2424
}
2525

2626
versionId: string
27-
readonly applicationId: string | undefined
28-
readonly endpoint: string | undefined
29-
readonly endpointKey: string | undefined
27+
private readonly applicationId: string | undefined
28+
private readonly endpoint: string | undefined
29+
private readonly endpointKey: string | undefined
30+
private readonly $schema: string | undefined
3031
private appId: string
3132
private dialogPath: string | undefined
3233

33-
constructor(private readonly luFile: string, targetFileName: string) {
34+
constructor(private readonly luFile: string, targetFileName: string, schema?: string) {
3435
this.appId = ''
3536
this.applicationId = `=settings.luis.${targetFileName.split('.').join('_').replace(/-/g, '_')}`
3637
this.endpoint = '=settings.luis.endpoint'
3738
this.endpointKey = '=settings.luis.endpointKey'
3839
this.versionId = '0.1'
40+
this.$schema = schema
3941
}
4042

4143
save(): string {
42-
let output = {
44+
let output: any = {
4345
$kind: 'Microsoft.LuisRecognizer',
4446
applicationId: this.applicationId,
4547
endpoint: this.endpoint,
4648
endpointKey: this.endpointKey
4749
}
4850

51+
if (this.$schema) {
52+
output = {$schema: this.$schema, ...output}
53+
}
54+
4955
return JSON.stringify(output, null, 4)
5056
}
5157

packages/lu/src/parser/qnabuild/builder.ts

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ export class Builder {
3535
botName: string,
3636
suffix: string,
3737
region: string,
38-
culture: string) {
38+
culture: string,
39+
schema?: string) {
3940
let multiRecognizer: any
4041
let settings: any
4142
let recognizers = new Map<string, Recognizer>()
@@ -73,12 +74,15 @@ export class Builder {
7374
if (multiRecognizer === undefined) {
7475
const multiRecognizerPath = path.join(fileFolder, `${botName}.qna.dialog`)
7576
let multiRecognizerContent = {}
77+
let multiRecognizerSchema = schema
7678
if (fs.existsSync(multiRecognizerPath)) {
77-
multiRecognizerContent = JSON.parse(await fileHelper.getContentFromFile(multiRecognizerPath)).recognizers
79+
let multiRecognizerObject = JSON.parse(await fileHelper.getContentFromFile(multiRecognizerPath))
80+
multiRecognizerContent = multiRecognizerObject.recognizers
81+
multiRecognizerSchema = multiRecognizerSchema || multiRecognizerObject.$schema
7882
this.handler(`${multiRecognizerPath} loaded\n`)
7983
}
8084

81-
multiRecognizer = new MultiLanguageRecognizer(multiRecognizerPath, multiRecognizerContent)
85+
multiRecognizer = new MultiLanguageRecognizer(multiRecognizerPath, multiRecognizerContent, multiRecognizerSchema as string)
8286
}
8387

8488
if (settings === undefined) {
@@ -102,7 +106,11 @@ export class Builder {
102106
this.handler(`${dialogFile} loaded\n`)
103107
}
104108

105-
let recognizer = Recognizer.load(content.path, content.name, dialogFile, settings, existingDialogObj)
109+
if (existingDialogObj && schema) {
110+
existingDialogObj.$schema = schema
111+
}
112+
113+
let recognizer = Recognizer.load(content.path, content.name, dialogFile, settings, existingDialogObj, schema)
106114
recognizers.set(content.name, recognizer)
107115
qnaContents.set(content.name, content)
108116
} else {
@@ -294,7 +302,7 @@ export class Builder {
294302
return kbToLuContent
295303
}
296304

297-
async writeDialogAssets(contents: any[], force: boolean, out: string, dialogType: string, files: string[]) {
305+
async writeDialogAssets(contents: any[], force: boolean, out: string, dialogType: string, files: string[], schema: string) {
298306
let writeDone = false
299307

300308
for (const content of contents) {
@@ -307,7 +315,7 @@ export class Builder {
307315

308316
if (force || !fs.existsSync(outFilePath)) {
309317
this.handler(`Writing to ${outFilePath}\n`)
310-
await this.writeDialog(content.content, outFilePath, dialogType, files)
318+
await this.writeDialog(content.content, outFilePath, dialogType, files, schema)
311319
writeDone = true
312320
}
313321
}
@@ -473,7 +481,7 @@ export class Builder {
473481
this.handler(`Publishing finished for kb ${kbName}\n`)
474482
}
475483

476-
async writeDialog(content: string, filePath: string, dialogType: string, files: string[]) {
484+
async writeDialog(content: string, filePath: string, dialogType: string, files: string[], schema: string) {
477485
await fs.writeFile(filePath, content, 'utf-8')
478486
const contentObj = JSON.parse(content)
479487
if (dialogType === recognizerType.CROSSTRAINED && contentObj.$kind === 'Microsoft.MultiLanguageRecognizer') {
@@ -500,7 +508,7 @@ export class Builder {
500508
content = JSON.stringify(existingCRDialog, null, 4)
501509
} else {
502510
let recognizers = [fileName]
503-
content = new CrossTrainedRecognizer(crossTrainedFilePath, recognizers).save()
511+
content = new CrossTrainedRecognizer(crossTrainedFilePath, recognizers, schema).save()
504512
}
505513

506514
await fs.writeFile(crossTrainedFilePath, content, 'utf-8')

packages/lu/src/parser/qnabuild/cross-trained-recognizer.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,24 @@
66
export class CrossTrainedRecognizer {
77
public recognizers: any
88
private readonly dialogPath: string
9+
private readonly $schema: string | undefined
910

10-
constructor(dialogPath: string, recognizers: any) {
11+
constructor(dialogPath: string, recognizers: any, schema?: string) {
1112
this.dialogPath = dialogPath
1213
this.recognizers = recognizers
14+
this.$schema = schema
1315
}
1416

1517
save(): string {
16-
let output = {
18+
let output: any = {
1719
$kind: 'Microsoft.CrossTrainedRecognizerSet',
1820
recognizers: this.recognizers
1921
}
2022

23+
if (this.$schema) {
24+
output = {$schema: this.$schema, ...output}
25+
}
26+
2127
return JSON.stringify(output, null, 4)
2228
}
2329

packages/lu/src/parser/qnabuild/multi-language-recognizer.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,24 @@
66
export class MultiLanguageRecognizer {
77
public recognizers: any
88
private readonly dialogPath: string
9+
private readonly $schema: string | undefined
910

10-
constructor(dialogPath: string, recognizers: any) {
11+
constructor(dialogPath: string, recognizers: any, schema?: string) {
1112
this.dialogPath = dialogPath
1213
this.recognizers = recognizers
14+
this.$schema = schema
1315
}
1416

1517
save(): string {
16-
let output = {
18+
let output: any = {
1719
$kind: 'Microsoft.MultiLanguageRecognizer',
1820
recognizers: this.recognizers
1921
}
2022

23+
if (this.$schema) {
24+
output = {$schema: this.$schema, ...output}
25+
}
26+
2127
return JSON.stringify(output, null, 4)
2228
}
2329

packages/lu/src/parser/qnabuild/recognizer.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,47 +7,52 @@ import {Settings} from './settings'
77
import * as path from 'path'
88

99
export class Recognizer {
10-
static load(qnaFile: string, targetFileName: string, dialogPath: string, qnaSettings: Settings, existingRecognizer: any): Recognizer {
10+
static load(qnaFile: string, targetFileName: string, dialogPath: string, qnaSettings: Settings, existingRecognizer: any, schema?: string): Recognizer {
1111
if (existingRecognizer) {
12-
let recognizer = new Recognizer(qnaFile, targetFileName)
12+
let recognizer = new Recognizer(qnaFile, targetFileName, schema)
1313
recognizer.dialogPath = dialogPath
1414
Object.assign(recognizer, existingRecognizer)
1515
recognizer.setKBId(qnaSettings.qna[path.basename(qnaFile).split('.').join('_')])
1616

1717
return recognizer
1818
}
1919

20-
let recognizer = new Recognizer(qnaFile, targetFileName)
20+
let recognizer = new Recognizer(qnaFile, targetFileName, schema)
2121
recognizer.dialogPath = dialogPath
2222

2323
return recognizer
2424
}
2525

26-
readonly id: string
27-
readonly knowledgeBaseId: string | undefined
28-
readonly hostname: string | undefined
29-
readonly endpointKey: string | undefined
30-
26+
private readonly id: string
27+
private readonly knowledgeBaseId: string | undefined
28+
private readonly hostname: string | undefined
29+
private readonly endpointKey: string | undefined
30+
private readonly $schema: string | undefined
3131
private kbId: string
3232
private dialogPath: string | undefined
3333

34-
constructor(private readonly qnaFile: string, targetFileName: string) {
34+
constructor(private readonly qnaFile: string, targetFileName: string, schema?: string) {
3535
this.kbId = ''
3636
this.id = `QnA_${targetFileName.split('.')[0]}`
3737
this.knowledgeBaseId = `=settings.qna.${targetFileName.split('.').join('_').replace(/-/g, '_')}`
3838
this.hostname = '=settings.qna.hostname'
3939
this.endpointKey = '=settings.qna.endpointKey'
40+
this.$schema = schema
4041
}
4142

4243
save(): string {
43-
let output = {
44+
let output: any = {
4445
$kind: 'Microsoft.QnAMakerRecognizer',
4546
id: this.id,
4647
knowledgeBaseId: this.knowledgeBaseId,
4748
hostname: this.hostname,
4849
endpointKey: this.endpointKey
4950
}
5051

52+
if (this.$schema) {
53+
output = {$schema: this.$schema, ...output}
54+
}
55+
5156
return JSON.stringify(output, null, 4)
5257
}
5358

0 commit comments

Comments
 (0)