1
1
mirror of https://github.com/leon-ai/leon.git synced 2024-12-25 01:31:47 +03:00

feat(server): add JSON models with TypeBox

Later, we will be able to validate JSON files thanks to AJV.
This commit is contained in:
Divlo 2022-10-23 11:05:55 +02:00
parent 5acd22a885
commit 2a7b2f45d6
7 changed files with 1782 additions and 6600 deletions

8241
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -75,6 +75,7 @@
"@nlpjs/lang-all": "^4.22.12",
"@nlpjs/nlp": "^4.22.17",
"archiver": "^5.3.1",
"@sinclair/typebox": "0.24.49",
"async": "^3.2.0",
"axios": "1.1.2",
"cross-env": "^7.0.3",

View File

@ -0,0 +1,12 @@
import type { Static } from '@sinclair/typebox'
import { Type } from '@sinclair/typebox'
export const domainSchema = {
name: Type.String({ minLength: 1 })
}
export const domainSchemaObject = Type.Strict(
Type.Object(domainSchema, { additionalProperties: false })
)
export type Domain = Static<typeof domainSchemaObject>

View File

@ -0,0 +1,18 @@
import type { Static } from '@sinclair/typebox'
import { Type } from '@sinclair/typebox'
export const globalEntity = {
options: Type.Record(
Type.String(),
Type.Object({
synonyms: Type.Array(Type.String()),
data: Type.Record(Type.String(), Type.Array(Type.String()))
})
)
}
export const globalEntitySchemaObject = Type.Strict(
Type.Object(globalEntity, { additionalProperties: false })
)
export type GlobalEntity = Static<typeof globalEntitySchemaObject>

View File

@ -0,0 +1,19 @@
import type { Static } from '@sinclair/typebox'
import { Type } from '@sinclair/typebox'
export const globalResolver = {
name: Type.String(),
intents: Type.Record(
Type.String(),
Type.Object({
utterance_samples: Type.Array(Type.String()),
value: Type.Unknown()
})
)
}
export const globalResolverSchemaObject = Type.Strict(
Type.Object(globalResolver, { additionalProperties: false })
)
export type GlobalResolver = Static<typeof globalResolverSchemaObject>

View File

@ -0,0 +1,68 @@
import type { Static } from '@sinclair/typebox'
import { Type } from '@sinclair/typebox'
export const skillActionTypes = [Type.Literal('logic'), Type.Literal('dialog')]
export const skillDataTypes = [
Type.Literal('skill_resolver'),
Type.Literal('global_resolver'),
Type.Literal('entity')
]
export const skillConfigSchema = {
variables: Type.Optional(Type.Record(Type.String(), Type.String())),
actions: Type.Record(
Type.String(),
Type.Object({
type: Type.Union(skillActionTypes),
loop: Type.Optional(
Type.Object({
expected_item: Type.Object({
type: Type.Union(skillDataTypes),
name: Type.String()
})
})
),
utterance_samples: Type.Optional(Type.Array(Type.String())),
answers: Type.Optional(Type.Array(Type.String())),
unknown_answers: Type.Optional(Type.Array(Type.String())),
suggestions: Type.Optional(Type.Array(Type.String())),
slots: Type.Optional(
Type.Array(
Type.Object({
name: Type.String(),
item: Type.Object({
type: Type.Union(skillDataTypes),
name: Type.String()
}),
questions: Type.Array(Type.String()),
suggestions: Type.Optional(Type.Array(Type.String()))
})
)
),
entities: Type.Optional(
Type.Array(
Type.Object({
type: Type.Literal('enum'),
name: Type.String(),
options: Type.Record(
Type.String(),
Type.Object({
synonyms: Type.Array(Type.String())
})
)
})
)
),
next_action: Type.Optional(Type.String())
})
),
answers: Type.Optional(Type.Record(Type.String(), Type.Array(Type.String()))),
entities: Type.Optional(Type.Record(Type.String(), Type.String()))
}
export const skillConfigSchemaObject = Type.Strict(
Type.Object(skillConfigSchema, { additionalProperties: false })
)
export type SkillConfig = Static<typeof skillConfigSchemaObject>

View File

@ -0,0 +1,23 @@
import type { Static } from '@sinclair/typebox'
import { Type } from '@sinclair/typebox'
export const skillBridges = [Type.Literal('python')]
export const skillSchema = {
name: Type.String({ minLength: 1 }),
bridge: Type.Union(skillBridges),
version: Type.String({ minLength: 1 }),
description: Type.String({ minLength: 1 }),
author: Type.Object({
name: Type.String({ minLength: 1 }),
email: Type.String({ minLength: 1, maxLength: 254, format: 'email' }),
url: Type.String({ minLength: 1, maxLength: 255, format: 'uri' })
})
}
export const skillSchemaObject = Type.Strict(
Type.Object(skillSchema, { additionalProperties: false })
)
export type SkillBridge = Static<typeof skillSchema.bridge>
export type Skill = Static<typeof skillSchemaObject>