@servicetitan/titan-chatbot-api 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/dist/api-client/__mocks__/chatbot-api-client.mock.d.ts +11 -0
- package/dist/api-client/__mocks__/chatbot-api-client.mock.d.ts.map +1 -0
- package/dist/api-client/__mocks__/chatbot-api-client.mock.js +47 -0
- package/dist/api-client/__mocks__/chatbot-api-client.mock.js.map +1 -0
- package/dist/api-client/base/chatbot-api-client.d.ts +27 -0
- package/dist/api-client/base/chatbot-api-client.d.ts.map +1 -0
- package/dist/api-client/base/chatbot-api-client.js +10 -0
- package/dist/api-client/base/chatbot-api-client.js.map +1 -0
- package/dist/api-client/help-center/__tests__/converter-from-models.test.d.ts +2 -0
- package/dist/api-client/help-center/__tests__/converter-from-models.test.d.ts.map +1 -0
- package/dist/api-client/help-center/__tests__/converter-from-models.test.js +34 -0
- package/dist/api-client/help-center/__tests__/converter-from-models.test.js.map +1 -0
- package/dist/api-client/help-center/__tests__/converter-to-models.test.d.ts +2 -0
- package/dist/api-client/help-center/__tests__/converter-to-models.test.d.ts.map +1 -0
- package/dist/api-client/help-center/__tests__/converter-to-models.test.js +82 -0
- package/dist/api-client/help-center/__tests__/converter-to-models.test.js.map +1 -0
- package/dist/api-client/help-center/chatbot-api-client.d.ts +31 -0
- package/dist/api-client/help-center/chatbot-api-client.d.ts.map +1 -0
- package/dist/api-client/help-center/chatbot-api-client.js +90 -0
- package/dist/api-client/help-center/chatbot-api-client.js.map +1 -0
- package/dist/api-client/help-center/converter-from-models.d.ts +13 -0
- package/dist/api-client/help-center/converter-from-models.d.ts.map +1 -0
- package/dist/api-client/help-center/converter-from-models.js +113 -0
- package/dist/api-client/help-center/converter-from-models.js.map +1 -0
- package/dist/api-client/help-center/converter-to-models.d.ts +13 -0
- package/dist/api-client/help-center/converter-to-models.d.ts.map +1 -0
- package/dist/api-client/help-center/converter-to-models.js +95 -0
- package/dist/api-client/help-center/converter-to-models.js.map +1 -0
- package/dist/api-client/help-center/index.d.ts +2 -0
- package/dist/api-client/help-center/index.d.ts.map +1 -0
- package/dist/api-client/help-center/index.js +2 -0
- package/dist/api-client/help-center/index.js.map +1 -0
- package/dist/api-client/help-center/native-client.d.ts +1260 -0
- package/dist/api-client/help-center/native-client.d.ts.map +1 -0
- package/dist/api-client/help-center/native-client.js +6169 -0
- package/dist/api-client/help-center/native-client.js.map +1 -0
- package/dist/api-client/index.d.ts +8 -0
- package/dist/api-client/index.d.ts.map +1 -0
- package/dist/api-client/index.js +8 -0
- package/dist/api-client/index.js.map +1 -0
- package/dist/api-client/models/__mocks__/models.mock.d.ts +13 -0
- package/dist/api-client/models/__mocks__/models.mock.d.ts.map +1 -0
- package/dist/api-client/models/__mocks__/models.mock.js +114 -0
- package/dist/api-client/models/__mocks__/models.mock.js.map +1 -0
- package/dist/api-client/models/index.d.ts +22 -0
- package/dist/api-client/models/index.d.ts.map +1 -0
- package/dist/api-client/models/index.js +15 -0
- package/dist/api-client/models/index.js.map +1 -0
- package/dist/api-client/titan-chat/chatbot-api-client.d.ts +34 -0
- package/dist/api-client/titan-chat/chatbot-api-client.d.ts.map +1 -0
- package/dist/api-client/titan-chat/chatbot-api-client.js +72 -0
- package/dist/api-client/titan-chat/chatbot-api-client.js.map +1 -0
- package/dist/api-client/titan-chat/index.d.ts +2 -0
- package/dist/api-client/titan-chat/index.d.ts.map +1 -0
- package/dist/api-client/titan-chat/index.js +2 -0
- package/dist/api-client/titan-chat/index.js.map +1 -0
- package/dist/api-client/titan-chat/native-client.d.ts +225 -0
- package/dist/api-client/titan-chat/native-client.d.ts.map +1 -0
- package/dist/api-client/titan-chat/native-client.js +931 -0
- package/dist/api-client/titan-chat/native-client.js.map +1 -0
- package/dist/api-client/utils/model-utils.d.ts +4 -0
- package/dist/api-client/utils/model-utils.d.ts.map +1 -0
- package/dist/api-client/utils/model-utils.js +58 -0
- package/dist/api-client/utils/model-utils.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/models/chatbot-customizations.d.ts +15 -0
- package/dist/models/chatbot-customizations.d.ts.map +1 -0
- package/dist/models/chatbot-customizations.js +2 -0
- package/dist/models/chatbot-customizations.js.map +1 -0
- package/dist/models/index.d.ts +2 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +2 -0
- package/dist/models/index.js.map +1 -0
- package/dist/stores/__tests__/chatbot-ui-backend.store.test.d.ts +2 -0
- package/dist/stores/__tests__/chatbot-ui-backend.store.test.d.ts.map +1 -0
- package/dist/stores/__tests__/chatbot-ui-backend.store.test.js +341 -0
- package/dist/stores/__tests__/chatbot-ui-backend.store.test.js.map +1 -0
- package/dist/stores/__tests__/chatbot-ui.store.test.d.ts +2 -0
- package/dist/stores/__tests__/chatbot-ui.store.test.d.ts.map +1 -0
- package/dist/stores/__tests__/chatbot-ui.store.test.js +166 -0
- package/dist/stores/__tests__/chatbot-ui.store.test.js.map +1 -0
- package/dist/stores/__tests__/filter.store.test.d.ts +2 -0
- package/dist/stores/__tests__/filter.store.test.d.ts.map +1 -0
- package/dist/stores/__tests__/filter.store.test.js +316 -0
- package/dist/stores/__tests__/filter.store.test.js.map +1 -0
- package/dist/stores/__tests__/initialize.store.test.d.ts +2 -0
- package/dist/stores/__tests__/initialize.store.test.d.ts.map +1 -0
- package/dist/stores/__tests__/initialize.store.test.js +54 -0
- package/dist/stores/__tests__/initialize.store.test.js.map +1 -0
- package/dist/stores/chatbot-ui-backend.store.d.ts +61 -0
- package/dist/stores/chatbot-ui-backend.store.d.ts.map +1 -0
- package/dist/stores/chatbot-ui-backend.store.js +396 -0
- package/dist/stores/chatbot-ui-backend.store.js.map +1 -0
- package/dist/stores/chatbot-ui.store.d.ts +25 -0
- package/dist/stores/chatbot-ui.store.d.ts.map +1 -0
- package/dist/stores/chatbot-ui.store.js +87 -0
- package/dist/stores/chatbot-ui.store.js.map +1 -0
- package/dist/stores/filter.store.d.ts +30 -0
- package/dist/stores/filter.store.d.ts.map +1 -0
- package/dist/stores/filter.store.js +334 -0
- package/dist/stores/filter.store.js.map +1 -0
- package/dist/stores/index.d.ts +4 -0
- package/dist/stores/index.d.ts.map +1 -0
- package/dist/stores/index.js +4 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/stores/initialize.store.d.ts +17 -0
- package/dist/stores/initialize.store.d.ts.map +1 -0
- package/dist/stores/initialize.store.js +98 -0
- package/dist/stores/initialize.store.js.map +1 -0
- package/dist/utils/__tests__/axios-utils.test.d.ts +2 -0
- package/dist/utils/__tests__/axios-utils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/axios-utils.test.js +33 -0
- package/dist/utils/__tests__/axios-utils.test.js.map +1 -0
- package/dist/utils/axios-utils.d.ts +5 -0
- package/dist/utils/axios-utils.d.ts.map +1 -0
- package/dist/utils/axios-utils.js +23 -0
- package/dist/utils/axios-utils.js.map +1 -0
- package/dist/utils/test-utils.d.ts +5 -0
- package/dist/utils/test-utils.d.ts.map +1 -0
- package/dist/utils/test-utils.js +17 -0
- package/dist/utils/test-utils.js.map +1 -0
- package/package.json +45 -0
- package/src/api-client/__mocks__/chatbot-api-client.mock.ts +11 -0
- package/src/api-client/base/chatbot-api-client.ts +33 -0
- package/src/api-client/help-center/__tests__/converter-from-models.test.ts +41 -0
- package/src/api-client/help-center/__tests__/converter-to-models.test.ts +89 -0
- package/src/api-client/help-center/chatbot-api-client.ts +107 -0
- package/src/api-client/help-center/converter-from-models.ts +132 -0
- package/src/api-client/help-center/converter-to-models.ts +124 -0
- package/src/api-client/help-center/index.ts +1 -0
- package/src/api-client/help-center/native-client.ts +5662 -0
- package/src/api-client/index.ts +12 -0
- package/src/api-client/models/__mocks__/models.mock.ts +141 -0
- package/src/api-client/models/index.ts +48 -0
- package/src/api-client/titan-chat/chatbot-api-client.ts +77 -0
- package/src/api-client/titan-chat/index.ts +1 -0
- package/src/api-client/titan-chat/native-client.ts +826 -0
- package/src/api-client/utils/model-utils.ts +68 -0
- package/src/cypress.d.ts +10 -0
- package/src/index.ts +6 -0
- package/src/models/chatbot-customizations.ts +16 -0
- package/src/models/index.ts +1 -0
- package/src/stores/__tests__/chatbot-ui-backend.store.test.ts +426 -0
- package/src/stores/__tests__/chatbot-ui.store.test.ts +196 -0
- package/src/stores/__tests__/filter.store.test.ts +363 -0
- package/src/stores/__tests__/initialize.store.test.ts +73 -0
- package/src/stores/chatbot-ui-backend.store.ts +401 -0
- package/src/stores/chatbot-ui.store.ts +82 -0
- package/src/stores/filter.store.ts +250 -0
- package/src/stores/index.ts +12 -0
- package/src/stores/initialize.store.ts +62 -0
- package/src/utils/__tests__/axios-utils.test.ts +40 -0
- package/src/utils/axios-utils.ts +25 -0
- package/src/utils/test-utils.ts +22 -0
- package/tsconfig.json +19 -0
- package/tsconfig.tsbuildinfo +1 -0
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@servicetitan/titan-chatbot-api",
|
|
3
|
+
"version": "3.0.0",
|
|
4
|
+
"description": "Chatbot client API package",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/servicetitan/titan-chatbot-client",
|
|
8
|
+
"directory": "packages/titan-chatbot-api"
|
|
9
|
+
},
|
|
10
|
+
"main": "./dist/index.js",
|
|
11
|
+
"typings": "./dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"publish:local": "yalc publish",
|
|
17
|
+
"push:local": "yalc push"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@servicetitan/titan-chat-ui-common": "^3.0.0",
|
|
21
|
+
"lodash": "^4.17.21",
|
|
22
|
+
"nanoid": "^5.1.5"
|
|
23
|
+
},
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"@servicetitan/log-service": ">=27",
|
|
26
|
+
"@servicetitan/react-ioc": ">=24",
|
|
27
|
+
"axios": ">=0.28.0",
|
|
28
|
+
"mobx": ">=6",
|
|
29
|
+
"mobx-react": ">=9",
|
|
30
|
+
"mobx-utils": ">=6",
|
|
31
|
+
"react": "^18",
|
|
32
|
+
"react-dom": "^18"
|
|
33
|
+
},
|
|
34
|
+
"keywords": [
|
|
35
|
+
"ServiceTitan"
|
|
36
|
+
],
|
|
37
|
+
"author": "Alexander Yarmolchuk",
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
},
|
|
41
|
+
"cli": {
|
|
42
|
+
"webpack": false
|
|
43
|
+
},
|
|
44
|
+
"gitHead": "5c9c88b8b55c56cacefef6b8452e9367c31c9ad3"
|
|
45
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { IChatbotApiClient } from '..';
|
|
2
|
+
|
|
3
|
+
export class ChatbotApiClientMock implements IChatbotApiClient {
|
|
4
|
+
postFeedback = jest.fn();
|
|
5
|
+
postMessage = jest.fn();
|
|
6
|
+
getOptions = jest.fn();
|
|
7
|
+
postSession = jest.fn();
|
|
8
|
+
patchSession = jest.fn();
|
|
9
|
+
deleteSession = jest.fn();
|
|
10
|
+
postRefreshAuthCookies = jest.fn();
|
|
11
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { symbolToken } from '@servicetitan/react-ioc';
|
|
2
|
+
import { Models } from '..';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Token for injecting the chatbot client settings for proper initialization of the client.
|
|
6
|
+
*/
|
|
7
|
+
export const CHATBOT_CLIENT_SETTINGS =
|
|
8
|
+
symbolToken<IChatbotClientSettings>('CHATBOT_CLIENT_SETTINGS');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Token for injecting the chatbot API client.
|
|
12
|
+
*/
|
|
13
|
+
export const CHATBOT_API_CLIENT = symbolToken<IChatbotApiClient>('CHATBOT_API_CLIENT');
|
|
14
|
+
|
|
15
|
+
type Constructor = abstract new (...args: any) => any;
|
|
16
|
+
type ConstructorParametersFactory<T extends Constructor> = () => Required<ConstructorParameters<T>>;
|
|
17
|
+
type ParametersFromFactory<T extends Constructor> = ReturnType<ConstructorParametersFactory<T>>;
|
|
18
|
+
export type FirstParameterType<T extends Constructor> =
|
|
19
|
+
ParametersFromFactory<T> extends [infer P1, ...any[]] ? Exclude<P1, undefined> : undefined;
|
|
20
|
+
export type SecondParameterType<T extends Constructor> =
|
|
21
|
+
ParametersFromFactory<T> extends [any, infer P2, ...any[]] ? Exclude<P2, undefined> : undefined;
|
|
22
|
+
|
|
23
|
+
export interface IChatbotClientSettings {}
|
|
24
|
+
|
|
25
|
+
export interface IChatbotApiClient {
|
|
26
|
+
postFeedback(body: Models.IFeedback, abortSignal?: AbortSignal): Promise<Models.Feedback>;
|
|
27
|
+
postMessage(body: Models.IUserMessage, abortSignal?: AbortSignal): Promise<Models.BotMessage>;
|
|
28
|
+
getOptions(abortSignal?: AbortSignal): Promise<Models.FrontendModel>;
|
|
29
|
+
postSession(body: Models.ISession, abortSignal?: AbortSignal): Promise<Models.Session>;
|
|
30
|
+
patchSession(body: Models.ISession, abortSignal?: AbortSignal): Promise<Models.Session>;
|
|
31
|
+
deleteSession(body: Models.ISession, abortSignal?: AbortSignal): Promise<Models.Session>;
|
|
32
|
+
postRefreshAuthCookies(abortSignal?: AbortSignal): Promise<boolean>; // TODO: This is a temporary method which will be removed in the future (ticket is created) and implemented in the internal chatbot client
|
|
33
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { expect } from '@jest/globals';
|
|
2
|
+
import { Models } from '../..';
|
|
3
|
+
import { ConverterFromModels } from '../converter-from-models';
|
|
4
|
+
|
|
5
|
+
describe('ConverterFromModels', () => {
|
|
6
|
+
test('convertFilters', () => {
|
|
7
|
+
expect(ConverterFromModels.convertFilters()).toBeUndefined();
|
|
8
|
+
expect(ConverterFromModels.convertFilters({})).toBeUndefined();
|
|
9
|
+
expect(
|
|
10
|
+
ConverterFromModels.convertFilters({
|
|
11
|
+
subOptions: {
|
|
12
|
+
ProductAreas: { values: [] },
|
|
13
|
+
},
|
|
14
|
+
} as unknown as Models.ISelections)
|
|
15
|
+
).toEqual({
|
|
16
|
+
productAreas: [],
|
|
17
|
+
});
|
|
18
|
+
expect(
|
|
19
|
+
ConverterFromModels.convertFilters({
|
|
20
|
+
subOptions: {
|
|
21
|
+
ProductAreas: { values: ['area1', 'area2'] },
|
|
22
|
+
},
|
|
23
|
+
} as unknown as Models.ISelections)
|
|
24
|
+
).toEqual({
|
|
25
|
+
productAreas: ['area1', 'area2'],
|
|
26
|
+
});
|
|
27
|
+
expect(
|
|
28
|
+
ConverterFromModels.convertFilters({
|
|
29
|
+
subOptions: {
|
|
30
|
+
Sources: { values: ['source1', 'source2'] },
|
|
31
|
+
ContentTypes: { values: ['type1'] },
|
|
32
|
+
ProductAreas: { values: ['area1', 'area2'] },
|
|
33
|
+
},
|
|
34
|
+
} as unknown as Models.ISelections)
|
|
35
|
+
).toEqual({
|
|
36
|
+
sources: ['source1', 'source2'],
|
|
37
|
+
contentTypes: ['type1'],
|
|
38
|
+
productAreas: ['area1', 'area2'],
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
});
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { expect } from '@jest/globals';
|
|
2
|
+
import { Models } from '../..';
|
|
3
|
+
import { ConverterToModels } from '../converter-to-models';
|
|
4
|
+
// eslint-disable-next-line no-restricted-imports
|
|
5
|
+
import * as HelpCenterClient from '../native-client';
|
|
6
|
+
|
|
7
|
+
describe('ConverterToModels', () => {
|
|
8
|
+
test('convertFilterOptions', () => {
|
|
9
|
+
expect(ConverterToModels.convertFilterOptions({})).toEqual(
|
|
10
|
+
new Models.FrontendModel({
|
|
11
|
+
options: new Models.Option({
|
|
12
|
+
key: 'help-center-filters-root',
|
|
13
|
+
displayName: 'help-center-filters-root',
|
|
14
|
+
type: Models.OptionType.Group,
|
|
15
|
+
subOptions: [],
|
|
16
|
+
}),
|
|
17
|
+
})
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
expect(
|
|
21
|
+
ConverterToModels.convertFilterOptions({
|
|
22
|
+
sources: [
|
|
23
|
+
new HelpCenterClient.FilterOption({
|
|
24
|
+
id: 'source1',
|
|
25
|
+
displayName: 'Source 1',
|
|
26
|
+
}),
|
|
27
|
+
new HelpCenterClient.FilterOption({
|
|
28
|
+
id: 'source2',
|
|
29
|
+
displayName: 'Source 2',
|
|
30
|
+
}),
|
|
31
|
+
],
|
|
32
|
+
productAreas: [
|
|
33
|
+
new HelpCenterClient.FilterOption({
|
|
34
|
+
id: 'area1',
|
|
35
|
+
displayName: 'Area 1',
|
|
36
|
+
}),
|
|
37
|
+
new HelpCenterClient.FilterOption({
|
|
38
|
+
id: 'area2',
|
|
39
|
+
displayName: 'Area 2',
|
|
40
|
+
}),
|
|
41
|
+
],
|
|
42
|
+
})
|
|
43
|
+
).toEqual(
|
|
44
|
+
new Models.FrontendModel({
|
|
45
|
+
options: new Models.Option({
|
|
46
|
+
key: 'help-center-filters-root',
|
|
47
|
+
displayName: 'help-center-filters-root',
|
|
48
|
+
type: Models.OptionType.Group,
|
|
49
|
+
subOptions: [
|
|
50
|
+
new Models.Option({
|
|
51
|
+
key: 'Sources',
|
|
52
|
+
displayName: 'Sources',
|
|
53
|
+
type: Models.OptionType.Group,
|
|
54
|
+
subOptions: [
|
|
55
|
+
new Models.Option({
|
|
56
|
+
key: 'source1',
|
|
57
|
+
displayName: 'Source 1',
|
|
58
|
+
type: Models.OptionType.Selectable,
|
|
59
|
+
}),
|
|
60
|
+
new Models.Option({
|
|
61
|
+
key: 'source2',
|
|
62
|
+
displayName: 'Source 2',
|
|
63
|
+
type: Models.OptionType.Selectable,
|
|
64
|
+
}),
|
|
65
|
+
],
|
|
66
|
+
}),
|
|
67
|
+
new Models.Option({
|
|
68
|
+
key: 'ProductAreas',
|
|
69
|
+
displayName: 'Product Areas',
|
|
70
|
+
type: Models.OptionType.Group,
|
|
71
|
+
subOptions: [
|
|
72
|
+
new Models.Option({
|
|
73
|
+
key: 'area1',
|
|
74
|
+
displayName: 'Area 1',
|
|
75
|
+
type: Models.OptionType.Selectable,
|
|
76
|
+
}),
|
|
77
|
+
new Models.Option({
|
|
78
|
+
key: 'area2',
|
|
79
|
+
displayName: 'Area 2',
|
|
80
|
+
type: Models.OptionType.Selectable,
|
|
81
|
+
}),
|
|
82
|
+
],
|
|
83
|
+
}),
|
|
84
|
+
],
|
|
85
|
+
}),
|
|
86
|
+
})
|
|
87
|
+
);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { inject, injectable } from '@servicetitan/react-ioc';
|
|
2
|
+
import { Models } from '..';
|
|
3
|
+
import {
|
|
4
|
+
CHATBOT_CLIENT_SETTINGS,
|
|
5
|
+
FirstParameterType,
|
|
6
|
+
IChatbotApiClient,
|
|
7
|
+
IChatbotClientSettings,
|
|
8
|
+
SecondParameterType,
|
|
9
|
+
} from '../base/chatbot-api-client';
|
|
10
|
+
import { ConverterFromModels } from './converter-from-models';
|
|
11
|
+
import { ConverterToModels } from './converter-to-models';
|
|
12
|
+
// eslint-disable-next-line no-restricted-imports
|
|
13
|
+
import { ChatClient } from './native-client';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Settings for the chatbot client, which includes a factory for constructor parameters, and additional settings
|
|
17
|
+
* like instance and area which are used in the API calls.
|
|
18
|
+
*/
|
|
19
|
+
export interface IChatbotClientSettingsHelpCenter extends IChatbotClientSettings {
|
|
20
|
+
constructorParametersFactory: () => {
|
|
21
|
+
baseUrl?: FirstParameterType<typeof ChatClient>;
|
|
22
|
+
axiosInstance?: SecondParameterType<typeof ChatClient>;
|
|
23
|
+
};
|
|
24
|
+
instance: string;
|
|
25
|
+
area: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Client adapter adopts the generated titan chatbot client to the generic IChatbotApiClient interface.
|
|
30
|
+
*/
|
|
31
|
+
@injectable()
|
|
32
|
+
export class ChatbotApiClient implements IChatbotApiClient {
|
|
33
|
+
private readonly client: ChatClient;
|
|
34
|
+
|
|
35
|
+
constructor(
|
|
36
|
+
@inject(CHATBOT_CLIENT_SETTINGS)
|
|
37
|
+
private readonly chatbotApiClientSettings: IChatbotClientSettingsHelpCenter
|
|
38
|
+
) {
|
|
39
|
+
const { axiosInstance, baseUrl } =
|
|
40
|
+
this.chatbotApiClientSettings.constructorParametersFactory();
|
|
41
|
+
this.client = new ChatClient(baseUrl, axiosInstance);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async postRefreshAuthCookies(abortSignal?: AbortSignal) {
|
|
45
|
+
const result = await this.client.refreshAuthCookies(abortSignal);
|
|
46
|
+
return Boolean(result);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async postFeedback(body: Models.Feedback, abortSignal?: AbortSignal) {
|
|
50
|
+
if (body?.messageId) {
|
|
51
|
+
await this.client.sendBotMessageFeedback(
|
|
52
|
+
body.sessionId,
|
|
53
|
+
body.messageId,
|
|
54
|
+
ConverterFromModels.convertMessageFeedback(body),
|
|
55
|
+
abortSignal
|
|
56
|
+
);
|
|
57
|
+
return body;
|
|
58
|
+
} else if (body?.sessionId) {
|
|
59
|
+
await this.client.sendSessionFeedback(
|
|
60
|
+
body.sessionId,
|
|
61
|
+
ConverterFromModels.convertSessionFeedback(body),
|
|
62
|
+
abortSignal
|
|
63
|
+
);
|
|
64
|
+
return body;
|
|
65
|
+
}
|
|
66
|
+
throw new Error('Feedback must contain either messageId or sessionId');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async postMessage(body: Models.UserMessage, abortSignal?: AbortSignal) {
|
|
70
|
+
const hcMessage = ConverterFromModels.convertUserMessage(
|
|
71
|
+
body,
|
|
72
|
+
this.chatbotApiClientSettings.area
|
|
73
|
+
);
|
|
74
|
+
const botMessage = await this.client.sendUserMessage(hcMessage, abortSignal);
|
|
75
|
+
return ConverterToModels.convertBotMessage(botMessage);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async getOptions(abortSignal?: AbortSignal): Promise<Models.FrontendModel> {
|
|
79
|
+
const filterOptions = await this.client.getFilterOptions(abortSignal);
|
|
80
|
+
return ConverterToModels.convertFilterOptions(filterOptions);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async postSession(body: Models.Session, abortSignal?: AbortSignal) {
|
|
84
|
+
body.data = body.data ?? {};
|
|
85
|
+
body.data.instance ??= this.chatbotApiClientSettings.instance;
|
|
86
|
+
const hcSession = ConverterFromModels.convertSession(body);
|
|
87
|
+
const newSession = await this.client.createSession(hcSession.source!, abortSignal);
|
|
88
|
+
return ConverterToModels.convertSession(newSession);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async patchSession(body: Models.Session, abortSignal?: AbortSignal) {
|
|
92
|
+
const session = ConverterFromModels.convertSession(body);
|
|
93
|
+
await this.client.updateSessionCategory(
|
|
94
|
+
session.source?.category,
|
|
95
|
+
session.source?.subCategory,
|
|
96
|
+
session.id,
|
|
97
|
+
abortSignal
|
|
98
|
+
);
|
|
99
|
+
return body;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async deleteSession(body: Models.Session, abortSignal?: AbortSignal) {
|
|
103
|
+
const session = ConverterFromModels.convertSession(body);
|
|
104
|
+
await this.client.closeSession(session.id, abortSignal);
|
|
105
|
+
return body;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { Models } from '..';
|
|
2
|
+
// eslint-disable-next-line no-restricted-imports
|
|
3
|
+
import * as HelpCenterModels from './native-client';
|
|
4
|
+
|
|
5
|
+
export class ConverterFromModels {
|
|
6
|
+
static convertSession(session: Models.ISession): HelpCenterModels.ChatbotSession {
|
|
7
|
+
const data = session.data;
|
|
8
|
+
return new HelpCenterModels.ChatbotSession({
|
|
9
|
+
id: session.id,
|
|
10
|
+
createdUtc: data?.createdUtc ? new Date(data.createdUtc) : undefined,
|
|
11
|
+
closedUtc: data?.closedUtc ? new Date(data.closedUtc) : undefined,
|
|
12
|
+
botId: data?.botId,
|
|
13
|
+
source: new HelpCenterModels.SessionSource({
|
|
14
|
+
instance: data?.instance,
|
|
15
|
+
category: data?.category,
|
|
16
|
+
subCategory: data?.subCategory,
|
|
17
|
+
}),
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
static convertUserMessage(
|
|
22
|
+
userMessage: Models.IUserMessage,
|
|
23
|
+
area: string
|
|
24
|
+
): HelpCenterModels.UserMessage {
|
|
25
|
+
const filters =
|
|
26
|
+
ConverterFromModels.convertFilters(userMessage.selections) ??
|
|
27
|
+
new HelpCenterModels.FilterSelections({});
|
|
28
|
+
const data: HelpCenterModels.IUserMessage = {
|
|
29
|
+
sessionId: userMessage.sessionId,
|
|
30
|
+
text: userMessage.question,
|
|
31
|
+
source: new HelpCenterModels.MessageSource({
|
|
32
|
+
area,
|
|
33
|
+
}),
|
|
34
|
+
...(filters ? { filters } : undefined),
|
|
35
|
+
};
|
|
36
|
+
return HelpCenterModels.UserMessage.fromJS(data);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
static convertFilters(
|
|
40
|
+
selections?: Models.ISelections
|
|
41
|
+
): HelpCenterModels.FilterSelections | undefined {
|
|
42
|
+
if (!selections?.subOptions || !Object.keys(selections.subOptions).length) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const data: HelpCenterModels.IFilterSelections = {};
|
|
46
|
+
const sources = selections.subOptions.Sources;
|
|
47
|
+
const contentTypes = selections.subOptions.ContentTypes;
|
|
48
|
+
const productAreas = selections.subOptions.ProductAreas;
|
|
49
|
+
if (sources?.values) {
|
|
50
|
+
data.sources = sources.values;
|
|
51
|
+
}
|
|
52
|
+
if (contentTypes?.values) {
|
|
53
|
+
data.contentTypes = contentTypes.values;
|
|
54
|
+
}
|
|
55
|
+
if (productAreas?.values) {
|
|
56
|
+
data.productAreas = productAreas.values;
|
|
57
|
+
}
|
|
58
|
+
return new HelpCenterModels.FilterSelections(data);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
static convertSessionFeedback(feedback: Models.IFeedback): HelpCenterModels.SessionFeedback {
|
|
62
|
+
return new HelpCenterModels.SessionFeedback({
|
|
63
|
+
description: feedback.description,
|
|
64
|
+
rating: ConverterFromModels.convertSessionFeedbackRating(feedback.rating),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
static convertMessageFeedback(feedback: Models.IFeedback): HelpCenterModels.MessageFeedback {
|
|
69
|
+
return new HelpCenterModels.MessageFeedback({
|
|
70
|
+
linkUrl: feedback.linkUrl,
|
|
71
|
+
description: feedback.description,
|
|
72
|
+
rating: ConverterFromModels.convertMessageFeedbackRating(feedback.rating),
|
|
73
|
+
options: ConverterFromModels.convertFeedbackOptions(feedback.options),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
static convertFeedbackOptions(
|
|
78
|
+
feedbackOptions?: Models.FeedbackOptions[]
|
|
79
|
+
): HelpCenterModels.FeedbackOptions[] | undefined {
|
|
80
|
+
if (feedbackOptions === undefined) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
return feedbackOptions.map(feedbackOption => {
|
|
84
|
+
switch (feedbackOption) {
|
|
85
|
+
case Models.FeedbackOptions.Incomplete:
|
|
86
|
+
return HelpCenterModels.FeedbackOptions.Incomplete;
|
|
87
|
+
case Models.FeedbackOptions.Incorrect:
|
|
88
|
+
return HelpCenterModels.FeedbackOptions.Incorrect;
|
|
89
|
+
case Models.FeedbackOptions.Other:
|
|
90
|
+
return HelpCenterModels.FeedbackOptions.Other;
|
|
91
|
+
case Models.FeedbackOptions.Unclear:
|
|
92
|
+
return HelpCenterModels.FeedbackOptions.Unclear;
|
|
93
|
+
case Models.FeedbackOptions.Unrelated:
|
|
94
|
+
return HelpCenterModels.FeedbackOptions.Unrelated;
|
|
95
|
+
default:
|
|
96
|
+
return HelpCenterModels.FeedbackOptions.Other;
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
static convertMessageFeedbackRating(
|
|
102
|
+
feedbackRatings?: Models.FeedbackRatings
|
|
103
|
+
): HelpCenterModels.MessageFeedbackRatings | undefined {
|
|
104
|
+
if (feedbackRatings === undefined) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
switch (feedbackRatings) {
|
|
108
|
+
case Models.FeedbackRatings.ThumbsDown:
|
|
109
|
+
return HelpCenterModels.MessageFeedbackRatings.ThumbsDown;
|
|
110
|
+
case Models.FeedbackRatings.GuardrailFeedback:
|
|
111
|
+
return HelpCenterModels.MessageFeedbackRatings.GuardrailFeedback;
|
|
112
|
+
case Models.FeedbackRatings.ThumbsUp:
|
|
113
|
+
return HelpCenterModels.MessageFeedbackRatings.ThumbsUp;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
static convertSessionFeedbackRating(
|
|
118
|
+
feedbackRatings?: Models.FeedbackRatings
|
|
119
|
+
): HelpCenterModels.SessionFeedbackRatings | undefined {
|
|
120
|
+
if (feedbackRatings === undefined) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
switch (feedbackRatings) {
|
|
124
|
+
case Models.FeedbackRatings.ThumbsDown:
|
|
125
|
+
return HelpCenterModels.SessionFeedbackRatings.ThumbsDown;
|
|
126
|
+
case Models.FeedbackRatings.ThumbsUp:
|
|
127
|
+
return HelpCenterModels.SessionFeedbackRatings.ThumbsUp;
|
|
128
|
+
default:
|
|
129
|
+
return HelpCenterModels.SessionFeedbackRatings.ThumbsDown;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { Models } from '..';
|
|
2
|
+
// eslint-disable-next-line no-restricted-imports
|
|
3
|
+
import * as HelpCenterClient from './native-client';
|
|
4
|
+
|
|
5
|
+
export class ConverterToModels {
|
|
6
|
+
static convertSession(session: HelpCenterClient.IChatbotSession): Models.Session {
|
|
7
|
+
return new Models.Session({
|
|
8
|
+
id: session.id,
|
|
9
|
+
data: ConverterToModels.convertSessionData(session),
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
static convertSessionData(session: HelpCenterClient.IChatbotSession): Models.Session['data'] {
|
|
14
|
+
const data: Models.Session['data'] = {};
|
|
15
|
+
if (session.createdUtc) {
|
|
16
|
+
data.createdUtc = session.createdUtc.toISOString();
|
|
17
|
+
}
|
|
18
|
+
if (session.closedUtc) {
|
|
19
|
+
data.closedUtc = session.closedUtc.toISOString();
|
|
20
|
+
}
|
|
21
|
+
if (session.botId) {
|
|
22
|
+
data.botId = session.botId;
|
|
23
|
+
}
|
|
24
|
+
if (session.source) {
|
|
25
|
+
if (session.source.instance) {
|
|
26
|
+
data.instance = session.source.instance;
|
|
27
|
+
}
|
|
28
|
+
if (session.source.category) {
|
|
29
|
+
data.category = session.source.category;
|
|
30
|
+
}
|
|
31
|
+
if (session.source.subCategory) {
|
|
32
|
+
data.subCategory = session.source.subCategory;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return Object.keys(data).length > 0 ? data : undefined;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Convert HC filters into single-level frontend model.
|
|
40
|
+
*/
|
|
41
|
+
static convertFilterOptions(options: HelpCenterClient.IFilterOptions): Models.FrontendModel {
|
|
42
|
+
const createFilterOption = (key: string, displayName?: string): Models.Option => {
|
|
43
|
+
return new Models.Option({
|
|
44
|
+
key,
|
|
45
|
+
displayName: displayName ?? key,
|
|
46
|
+
type: Models.OptionType.Selectable,
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
const createFilterOptions = (options?: HelpCenterClient.IFilterOption[]) =>
|
|
50
|
+
options?.map(x => createFilterOption(x.id ?? '', x.displayName));
|
|
51
|
+
const createFilter = (
|
|
52
|
+
key: string,
|
|
53
|
+
displayName?: string,
|
|
54
|
+
subOptions?: Models.Option[]
|
|
55
|
+
): Models.Option => {
|
|
56
|
+
return new Models.Option({
|
|
57
|
+
key,
|
|
58
|
+
displayName: displayName ?? key,
|
|
59
|
+
type: Models.OptionType.Group,
|
|
60
|
+
subOptions,
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const subOptions: Models.Option[] = [];
|
|
65
|
+
if (options.sources?.length) {
|
|
66
|
+
subOptions.push(
|
|
67
|
+
createFilter('Sources', 'Sources', createFilterOptions(options.sources))
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
if (options.contentTypes?.length) {
|
|
71
|
+
subOptions.push(
|
|
72
|
+
createFilter(
|
|
73
|
+
'ContentTypes',
|
|
74
|
+
'Content Types',
|
|
75
|
+
createFilterOptions(options.contentTypes)
|
|
76
|
+
)
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
if (options.productAreas?.length) {
|
|
80
|
+
subOptions.push(
|
|
81
|
+
createFilter(
|
|
82
|
+
'ProductAreas',
|
|
83
|
+
'Product Areas',
|
|
84
|
+
createFilterOptions(options.productAreas)
|
|
85
|
+
)
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
return new Models.FrontendModel({
|
|
89
|
+
options: new Models.Option({
|
|
90
|
+
key: 'help-center-filters-root',
|
|
91
|
+
displayName: 'help-center-filters-root',
|
|
92
|
+
type: Models.OptionType.Group,
|
|
93
|
+
subOptions,
|
|
94
|
+
}),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
static convertBotMessage(botMessage: HelpCenterClient.IBotMessage): Models.BotMessage {
|
|
99
|
+
return new Models.BotMessage({
|
|
100
|
+
id: botMessage.id ?? 0,
|
|
101
|
+
answer: botMessage.text ?? '',
|
|
102
|
+
isGuardrailed: botMessage.isGuardrailed ?? false,
|
|
103
|
+
guardFlag: botMessage.guardFlag ?? 'N',
|
|
104
|
+
sessionId: botMessage.sessionId ?? 0,
|
|
105
|
+
scoredUrls: ConverterToModels.convertScoredUrls(botMessage.scoredUrls),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
static convertScoredUrls(
|
|
110
|
+
scoredUrls?: HelpCenterClient.IScoredUrl[]
|
|
111
|
+
): Models.ScoredUrl[] | undefined {
|
|
112
|
+
if (scoredUrls === undefined) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
return scoredUrls.map(
|
|
116
|
+
url =>
|
|
117
|
+
new Models.ScoredUrl({
|
|
118
|
+
url: url.url,
|
|
119
|
+
score: url.score,
|
|
120
|
+
title: url.title,
|
|
121
|
+
})
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ChatbotApiClient, IChatbotClientSettingsHelpCenter } from './chatbot-api-client';
|