@dereekb/nestjs 12.2.0 → 12.3.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 +13 -0
- package/mailgun/package.json +1 -1
- package/openai/LICENSE +21 -0
- package/openai/package.json +9 -0
- package/openai/src/index.d.ts +1 -0
- package/openai/src/index.js +5 -0
- package/openai/src/index.js.map +1 -0
- package/openai/src/lib/index.d.ts +6 -0
- package/openai/src/lib/index.js +10 -0
- package/openai/src/lib/index.js.map +1 -0
- package/openai/src/lib/openai.api.d.ts +7 -0
- package/openai/src/lib/openai.api.js +22 -0
- package/openai/src/lib/openai.api.js.map +1 -0
- package/openai/src/lib/openai.config.d.ts +18 -0
- package/openai/src/lib/openai.config.js +29 -0
- package/openai/src/lib/openai.config.js.map +1 -0
- package/openai/src/lib/openai.module.d.ts +5 -0
- package/openai/src/lib/openai.module.js +41 -0
- package/openai/src/lib/openai.module.js.map +1 -0
- package/openai/src/lib/openai.type.d.ts +20 -0
- package/openai/src/lib/openai.type.js +3 -0
- package/openai/src/lib/openai.type.js.map +1 -0
- package/openai/src/lib/webhook/index.d.ts +6 -0
- package/openai/src/lib/webhook/index.js +10 -0
- package/openai/src/lib/webhook/index.js.map +1 -0
- package/openai/src/lib/webhook/webhook.openai.config.d.ts +12 -0
- package/openai/src/lib/webhook/webhook.openai.config.js +17 -0
- package/openai/src/lib/webhook/webhook.openai.config.js.map +1 -0
- package/openai/src/lib/webhook/webhook.openai.controller.d.ts +8 -0
- package/openai/src/lib/webhook/webhook.openai.controller.js +30 -0
- package/openai/src/lib/webhook/webhook.openai.controller.js.map +1 -0
- package/openai/src/lib/webhook/webhook.openai.d.ts +44 -0
- package/openai/src/lib/webhook/webhook.openai.js +41 -0
- package/openai/src/lib/webhook/webhook.openai.js.map +1 -0
- package/openai/src/lib/webhook/webhook.openai.module.d.ts +5 -0
- package/openai/src/lib/webhook/webhook.openai.module.js +39 -0
- package/openai/src/lib/webhook/webhook.openai.module.js.map +1 -0
- package/openai/src/lib/webhook/webhook.openai.service.d.ts +17 -0
- package/openai/src/lib/webhook/webhook.openai.service.js +48 -0
- package/openai/src/lib/webhook/webhook.openai.service.js.map +1 -0
- package/openai/src/lib/webhook/webhook.openai.verify.d.ts +36 -0
- package/openai/src/lib/webhook/webhook.openai.verify.js +37 -0
- package/openai/src/lib/webhook/webhook.openai.verify.js.map +1 -0
- package/package.json +7 -1
- package/stripe/package.json +1 -1
- package/vapiai/package.json +1 -1
- package/vapiai/src/lib/vapiai.type.d.ts +13 -2
- package/vapiai/src/lib/webhook/webhook.vapiai.d.ts +3 -4
- package/vapiai/src/lib/webhook/webhook.vapiai.js +8 -10
- package/vapiai/src/lib/webhook/webhook.vapiai.js.map +1 -1
- package/vapiai/src/lib/webhook/webhook.vapiai.types.d.ts +34 -53
- package/vapiai/src/lib/webhook/webhook.vapiai.types.js +4 -0
- package/vapiai/src/lib/webhook/webhook.vapiai.types.js.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver).
|
|
4
4
|
|
|
5
|
+
# [12.3.0](https://github.com/dereekb/dbx-components/compare/v12.2.1-dev...v12.3.0) (2025-07-04)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* added @dereekb/nestjs/openai integration ([611724f](https://github.com/dereekb/dbx-components/commit/611724f3c5354f2c38a6aecf75a64085f2aa6bcd))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## [12.2.1](https://github.com/dereekb/dbx-components/compare/v12.2.0-dev...v12.2.1) (2025-07-02)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
5
18
|
# [12.2.0](https://github.com/dereekb/dbx-components/compare/v12.1.14-dev...v12.2.0) (2025-06-29)
|
|
6
19
|
|
|
7
20
|
|
package/mailgun/package.json
CHANGED
package/openai/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Hapier Creative LLC.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './lib';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/nestjs/openai/src/index.ts"],"names":[],"mappings":";;;AAAA,gDAAsB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./webhook"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./openai.module"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./openai.api"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./openai.module"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./openai.config"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./openai.type"), exports);
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/nestjs/openai/src/lib/index.ts"],"names":[],"mappings":";;;AAAA,oDAA0B;AAC1B,0DAAgC;AAChC,uDAA6B;AAC7B,0DAAgC;AAChC,0DAAgC;AAChC,wDAA8B"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpenAIApi = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const openai_config_1 = require("./openai.config");
|
|
7
|
+
const openai_1 = require("openai");
|
|
8
|
+
let OpenAIApi = class OpenAIApi {
|
|
9
|
+
config;
|
|
10
|
+
openAIClient;
|
|
11
|
+
constructor(config) {
|
|
12
|
+
this.config = config;
|
|
13
|
+
this.openAIClient = new openai_1.OpenAI(config.openai.config);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
exports.OpenAIApi = OpenAIApi;
|
|
17
|
+
exports.OpenAIApi = OpenAIApi = tslib_1.__decorate([
|
|
18
|
+
(0, common_1.Injectable)(),
|
|
19
|
+
tslib_1.__param(0, (0, common_1.Inject)(openai_config_1.OpenAIServiceConfig)),
|
|
20
|
+
tslib_1.__metadata("design:paramtypes", [openai_config_1.OpenAIServiceConfig])
|
|
21
|
+
], OpenAIApi);
|
|
22
|
+
//# sourceMappingURL=openai.api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.api.js","sourceRoot":"","sources":["../../../../../../packages/nestjs/openai/src/lib/openai.api.ts"],"names":[],"mappings":";;;;AAAA,2CAAoD;AACpD,mDAAsD;AACtD,mCAAgC;AAGzB,IAAM,SAAS,GAAf,MAAM,SAAS;IAG8B;IAFzC,YAAY,CAAS;IAE9B,YAAkD,MAA2B;QAA3B,WAAM,GAAN,MAAM,CAAqB;QAC3E,IAAI,CAAC,YAAY,GAAG,IAAI,eAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC;CACF,CAAA;AANY,8BAAS;oBAAT,SAAS;IADrB,IAAA,mBAAU,GAAE;IAIE,mBAAA,IAAA,eAAM,EAAC,mCAAmB,CAAC,CAAA;6CAAkB,mCAAmB;GAHlE,SAAS,CAMrB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ClientOptions } from 'openai';
|
|
2
|
+
/**
|
|
3
|
+
* Default environment variable for the OpenAI API key.
|
|
4
|
+
*/
|
|
5
|
+
export declare const OPENAI_API_KEY_ENV_VAR = "OPENAI_API_KEY";
|
|
6
|
+
export declare const OPENAI_BASE_URL_ENV_VAR = "OPENAI_BASE_URL";
|
|
7
|
+
export declare const OPENAI_ORGANIZATION_ID_ENV_VAR = "OPENAI_ORG_ID";
|
|
8
|
+
export declare const OPENAI_PROJECT_ID_ENV_VAR = "OPENAI_PROJECT_ID";
|
|
9
|
+
export interface OpenAIServiceApiConfig {
|
|
10
|
+
readonly config: ClientOptions;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Configuration for OpenAIService
|
|
14
|
+
*/
|
|
15
|
+
export declare abstract class OpenAIServiceConfig {
|
|
16
|
+
readonly openai: OpenAIServiceApiConfig;
|
|
17
|
+
static assertValidConfig(config: OpenAIServiceConfig): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpenAIServiceConfig = exports.OPENAI_PROJECT_ID_ENV_VAR = exports.OPENAI_ORGANIZATION_ID_ENV_VAR = exports.OPENAI_BASE_URL_ENV_VAR = exports.OPENAI_API_KEY_ENV_VAR = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Default environment variable for the OpenAI API key.
|
|
6
|
+
*/
|
|
7
|
+
exports.OPENAI_API_KEY_ENV_VAR = 'OPENAI_API_KEY';
|
|
8
|
+
exports.OPENAI_BASE_URL_ENV_VAR = 'OPENAI_BASE_URL';
|
|
9
|
+
exports.OPENAI_ORGANIZATION_ID_ENV_VAR = 'OPENAI_ORG_ID';
|
|
10
|
+
exports.OPENAI_PROJECT_ID_ENV_VAR = 'OPENAI_PROJECT_ID';
|
|
11
|
+
/**
|
|
12
|
+
* Configuration for OpenAIService
|
|
13
|
+
*/
|
|
14
|
+
class OpenAIServiceConfig {
|
|
15
|
+
openai;
|
|
16
|
+
static assertValidConfig(config) {
|
|
17
|
+
if (!config.openai.config.apiKey) {
|
|
18
|
+
throw new Error('No OpenAI API key specified.');
|
|
19
|
+
}
|
|
20
|
+
else if (!config.openai.config.organization) {
|
|
21
|
+
throw new Error('No OpenAI organization specified.');
|
|
22
|
+
}
|
|
23
|
+
else if (!config.openai.config.project) {
|
|
24
|
+
throw new Error('No OpenAI project specified.');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.OpenAIServiceConfig = OpenAIServiceConfig;
|
|
29
|
+
//# sourceMappingURL=openai.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.config.js","sourceRoot":"","sources":["../../../../../../packages/nestjs/openai/src/lib/openai.config.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACU,QAAA,sBAAsB,GAAG,gBAAgB,CAAC;AAC1C,QAAA,uBAAuB,GAAG,iBAAiB,CAAC;AAC5C,QAAA,8BAA8B,GAAG,eAAe,CAAC;AACjD,QAAA,yBAAyB,GAAG,mBAAmB,CAAC;AAM7D;;GAEG;AACH,MAAsB,mBAAmB;IAC9B,MAAM,CAA0B;IAEzC,MAAM,CAAC,iBAAiB,CAAC,MAA2B;QAClD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;CACF;AAZD,kDAYC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpenAIModule = void 0;
|
|
4
|
+
exports.openAIServiceConfigFactory = openAIServiceConfigFactory;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
const common_1 = require("@nestjs/common");
|
|
7
|
+
const config_1 = require("@nestjs/config");
|
|
8
|
+
const openai_api_1 = require("./openai.api");
|
|
9
|
+
const openai_config_1 = require("./openai.config");
|
|
10
|
+
function openAIServiceConfigFactory(configService) {
|
|
11
|
+
const config = {
|
|
12
|
+
openai: {
|
|
13
|
+
config: {
|
|
14
|
+
apiKey: configService.get(openai_config_1.OPENAI_API_KEY_ENV_VAR),
|
|
15
|
+
baseURL: configService.get(openai_config_1.OPENAI_BASE_URL_ENV_VAR) ?? undefined,
|
|
16
|
+
organization: configService.get(openai_config_1.OPENAI_ORGANIZATION_ID_ENV_VAR),
|
|
17
|
+
project: configService.get(openai_config_1.OPENAI_PROJECT_ID_ENV_VAR)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
openai_config_1.OpenAIServiceConfig.assertValidConfig(config);
|
|
22
|
+
return config;
|
|
23
|
+
}
|
|
24
|
+
let OpenAIModule = class OpenAIModule {
|
|
25
|
+
};
|
|
26
|
+
exports.OpenAIModule = OpenAIModule;
|
|
27
|
+
exports.OpenAIModule = OpenAIModule = tslib_1.__decorate([
|
|
28
|
+
(0, common_1.Module)({
|
|
29
|
+
imports: [config_1.ConfigModule],
|
|
30
|
+
providers: [
|
|
31
|
+
{
|
|
32
|
+
provide: openai_config_1.OpenAIServiceConfig,
|
|
33
|
+
inject: [config_1.ConfigService],
|
|
34
|
+
useFactory: openAIServiceConfigFactory
|
|
35
|
+
},
|
|
36
|
+
openai_api_1.OpenAIApi
|
|
37
|
+
],
|
|
38
|
+
exports: [openai_api_1.OpenAIApi]
|
|
39
|
+
})
|
|
40
|
+
], OpenAIModule);
|
|
41
|
+
//# sourceMappingURL=openai.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.module.js","sourceRoot":"","sources":["../../../../../../packages/nestjs/openai/src/lib/openai.module.ts"],"names":[],"mappings":";;;AAMA,gEAcC;;AApBD,2CAAwC;AACxC,2CAA6D;AAC7D,6CAAyC;AACzC,mDAAkK;AAGlK,SAAgB,0BAA0B,CAAC,aAA4B;IACrE,MAAM,MAAM,GAAwB;QAClC,MAAM,EAAE;YACN,MAAM,EAAE;gBACN,MAAM,EAAE,aAAa,CAAC,GAAG,CAAe,sCAAsB,CAAiB;gBAC/E,OAAO,EAAE,aAAa,CAAC,GAAG,CAAqB,uCAAuB,CAAC,IAAI,SAAS;gBACpF,YAAY,EAAE,aAAa,CAAC,GAAG,CAAuB,8CAA8B,CAAC;gBACrF,OAAO,EAAE,aAAa,CAAC,GAAG,CAAkB,yCAAyB,CAAC;aACvE;SACF;KACF,CAAC;IAEF,mCAAmB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO,MAAM,CAAC;AAChB,CAAC;AAcM,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IAZxB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,qBAAY,CAAC;QACvB,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,mCAAmB;gBAC5B,MAAM,EAAE,CAAC,sBAAa,CAAC;gBACvB,UAAU,EAAE,0BAA0B;aACvC;YACD,sBAAS;SACV;QACD,OAAO,EAAE,CAAC,sBAAS,CAAC;KACrB,CAAC;GACW,YAAY,CAAG"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Api key used by OpenAI for making requests.
|
|
3
|
+
*/
|
|
4
|
+
export type OpenAIApiKey = string;
|
|
5
|
+
/**
|
|
6
|
+
* Your OpenAI organization id.
|
|
7
|
+
*/
|
|
8
|
+
export type OpenAIOrganizationId = string;
|
|
9
|
+
/**
|
|
10
|
+
* Your OpenAI project id.
|
|
11
|
+
*/
|
|
12
|
+
export type OpenAIProjectId = string;
|
|
13
|
+
/**
|
|
14
|
+
* Webhook secret used by OpenAI for validating webhook events.
|
|
15
|
+
*/
|
|
16
|
+
export type OpenAIWebhookSecret = string;
|
|
17
|
+
/**
|
|
18
|
+
* Assistant id used by OpenAI.
|
|
19
|
+
*/
|
|
20
|
+
export type OpenAIAssistantId = string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.type.js","sourceRoot":"","sources":["../../../../../../packages/nestjs/openai/src/lib/openai.type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./webhook.openai"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./webhook.openai.config"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./webhook.openai.controller"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./webhook.openai.module"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./webhook.openai.service"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./webhook.openai.verify"), exports);
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/nestjs/openai/src/lib/webhook/index.ts"],"names":[],"mappings":";;;AAAA,2DAAiC;AACjC,kEAAwC;AACxC,sEAA4C;AAC5C,kEAAwC;AACxC,mEAAyC;AACzC,kEAAwC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { OpenAIWebhookSecret } from '../openai.type';
|
|
2
|
+
export declare const OPENAI_WEBHOOK_SECRET_ENV_VAR = "OPENAI_WEBHOOK_SECRET";
|
|
3
|
+
export interface OpenAIWebhookConfig {
|
|
4
|
+
readonly webhookSecret: OpenAIWebhookSecret;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Configuration for OpenAIService
|
|
8
|
+
*/
|
|
9
|
+
export declare abstract class OpenAIWebhookServiceConfig {
|
|
10
|
+
readonly openaiWebhook: OpenAIWebhookConfig;
|
|
11
|
+
static assertValidConfig(config: OpenAIWebhookServiceConfig): void;
|
|
12
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpenAIWebhookServiceConfig = exports.OPENAI_WEBHOOK_SECRET_ENV_VAR = void 0;
|
|
4
|
+
exports.OPENAI_WEBHOOK_SECRET_ENV_VAR = 'OPENAI_WEBHOOK_SECRET';
|
|
5
|
+
/**
|
|
6
|
+
* Configuration for OpenAIService
|
|
7
|
+
*/
|
|
8
|
+
class OpenAIWebhookServiceConfig {
|
|
9
|
+
openaiWebhook;
|
|
10
|
+
static assertValidConfig(config) {
|
|
11
|
+
if (!config.openaiWebhook.webhookSecret) {
|
|
12
|
+
throw new Error('No OpenAI webhook secret specified.');
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.OpenAIWebhookServiceConfig = OpenAIWebhookServiceConfig;
|
|
17
|
+
//# sourceMappingURL=webhook.openai.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.openai.config.js","sourceRoot":"","sources":["../../../../../../../packages/nestjs/openai/src/lib/webhook/webhook.openai.config.ts"],"names":[],"mappings":";;;AAEa,QAAA,6BAA6B,GAAG,uBAAuB,CAAC;AAMrE;;GAEG;AACH,MAAsB,0BAA0B;IACrC,aAAa,CAAuB;IAE7C,MAAM,CAAC,iBAAiB,CAAC,MAAkC;QACzD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;CACF;AARD,gEAQC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { RawBodyBuffer } from '@dereekb/nestjs';
|
|
2
|
+
import { Request } from 'express';
|
|
3
|
+
import { OpenAIWebhookService } from './webhook.openai.service';
|
|
4
|
+
export declare class OpenAIWebhookController {
|
|
5
|
+
private readonly _openaiWebhookService;
|
|
6
|
+
constructor(openaiWebhookService: OpenAIWebhookService);
|
|
7
|
+
handleOpenAIWebhook(req: Request, rawBody: RawBodyBuffer): Promise<void>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpenAIWebhookController = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const nestjs_1 = require("@dereekb/nestjs");
|
|
6
|
+
const common_1 = require("@nestjs/common");
|
|
7
|
+
const webhook_openai_service_1 = require("./webhook.openai.service");
|
|
8
|
+
let OpenAIWebhookController = class OpenAIWebhookController {
|
|
9
|
+
_openaiWebhookService;
|
|
10
|
+
constructor(openaiWebhookService) {
|
|
11
|
+
this._openaiWebhookService = openaiWebhookService;
|
|
12
|
+
}
|
|
13
|
+
async handleOpenAIWebhook(req, rawBody) {
|
|
14
|
+
await this._openaiWebhookService.updateForWebhook(req, rawBody);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
exports.OpenAIWebhookController = OpenAIWebhookController;
|
|
18
|
+
tslib_1.__decorate([
|
|
19
|
+
(0, common_1.Post)(),
|
|
20
|
+
tslib_1.__param(0, (0, common_1.Req)()),
|
|
21
|
+
tslib_1.__param(1, (0, nestjs_1.RawBody)()),
|
|
22
|
+
tslib_1.__metadata("design:type", Function),
|
|
23
|
+
tslib_1.__metadata("design:paramtypes", [Object, Object]),
|
|
24
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
25
|
+
], OpenAIWebhookController.prototype, "handleOpenAIWebhook", null);
|
|
26
|
+
exports.OpenAIWebhookController = OpenAIWebhookController = tslib_1.__decorate([
|
|
27
|
+
(0, common_1.Controller)('/webhook/openai'),
|
|
28
|
+
tslib_1.__metadata("design:paramtypes", [webhook_openai_service_1.OpenAIWebhookService])
|
|
29
|
+
], OpenAIWebhookController);
|
|
30
|
+
//# sourceMappingURL=webhook.openai.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.openai.controller.js","sourceRoot":"","sources":["../../../../../../../packages/nestjs/openai/src/lib/webhook/webhook.openai.controller.ts"],"names":[],"mappings":";;;;AAAA,4CAAyD;AACzD,2CAAuD;AAEvD,qEAAgE;AAGzD,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IACjB,qBAAqB,CAAuB;IAE7D,YAAY,oBAA0C;QACpD,IAAI,CAAC,qBAAqB,GAAG,oBAAoB,CAAC;IACpD,CAAC;IAGK,AAAN,KAAK,CAAC,mBAAmB,CAAQ,GAAY,EAAa,OAAsB;QAC9E,MAAM,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;CACF,CAAA;AAXY,0DAAuB;AAQ5B;IADL,IAAA,aAAI,GAAE;IACoB,mBAAA,IAAA,YAAG,GAAE,CAAA;IAAgB,mBAAA,IAAA,gBAAO,GAAE,CAAA;;;;kEAExD;kCAVU,uBAAuB;IADnC,IAAA,mBAAU,EAAC,iBAAiB,CAAC;6CAIM,6CAAoB;GAH3C,uBAAuB,CAWnC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { HandlerBindAccessor, HandlerMappedSetFunction, Handler } from '@dereekb/util';
|
|
2
|
+
import '../openai.type';
|
|
3
|
+
import { BatchCancelledWebhookEvent, BatchCompletedWebhookEvent, BatchExpiredWebhookEvent, BatchFailedWebhookEvent, EvalRunCanceledWebhookEvent, EvalRunFailedWebhookEvent, EvalRunSucceededWebhookEvent, FineTuningJobCancelledWebhookEvent, FineTuningJobFailedWebhookEvent, FineTuningJobSucceededWebhookEvent, ResponseCancelledWebhookEvent, ResponseCompletedWebhookEvent, ResponseFailedWebhookEvent, ResponseIncompleteWebhookEvent, UnwrapWebhookEvent } from 'openai/resources/webhooks';
|
|
4
|
+
export type OpenAIWebhookEventType = UnwrapWebhookEvent['type'];
|
|
5
|
+
export interface RawOpenAIWebhookEvent {
|
|
6
|
+
readonly message: UntypedOpenAIWebhookEvent;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* A parsed OpenAIWebhookEventType that contains the relevant data and the original event.
|
|
10
|
+
*/
|
|
11
|
+
export type OpenAIWebhookEvent<T extends UnwrapWebhookEvent = UnwrapWebhookEvent, ET extends OpenAIWebhookEventType = OpenAIWebhookEventType> = T & {
|
|
12
|
+
/**
|
|
13
|
+
* The event type
|
|
14
|
+
*/
|
|
15
|
+
readonly type: ET;
|
|
16
|
+
};
|
|
17
|
+
export type UntypedOpenAIWebhookEvent = UnwrapWebhookEvent;
|
|
18
|
+
/**
|
|
19
|
+
* Creates a OpenAIWebhookEvent and treats the data as the input type.
|
|
20
|
+
*
|
|
21
|
+
* @param event
|
|
22
|
+
* @returns
|
|
23
|
+
*/
|
|
24
|
+
export declare function openAIWebhookEvent<T extends UnwrapWebhookEvent = UnwrapWebhookEvent>(event: UntypedOpenAIWebhookEvent): OpenAIWebhookEvent<T>;
|
|
25
|
+
export type OpenAIEventHandler = Handler<UntypedOpenAIWebhookEvent, OpenAIWebhookEventType>;
|
|
26
|
+
export declare const openaiEventHandlerFactory: import("@dereekb/util").HandlerFactory<UnwrapWebhookEvent, "batch.cancelled" | "batch.completed" | "batch.expired" | "batch.failed" | "eval.run.canceled" | "eval.run.failed" | "eval.run.succeeded" | "fine_tuning.job.cancelled" | "fine_tuning.job.failed" | "fine_tuning.job.succeeded" | "response.cancelled" | "response.completed" | "response.failed" | "response.incomplete", boolean>;
|
|
27
|
+
export type OpenAIHandlerMappedSetFunction<T extends UnwrapWebhookEvent = UnwrapWebhookEvent> = HandlerMappedSetFunction<OpenAIWebhookEvent<T>>;
|
|
28
|
+
export interface OpenAIEventHandlerConfigurer extends HandlerBindAccessor<UntypedOpenAIWebhookEvent, OpenAIWebhookEventType> {
|
|
29
|
+
readonly handleBatchCancelled: OpenAIHandlerMappedSetFunction<BatchCancelledWebhookEvent>;
|
|
30
|
+
readonly handleBatchCompleted: OpenAIHandlerMappedSetFunction<BatchCompletedWebhookEvent>;
|
|
31
|
+
readonly handleBatchExpired: OpenAIHandlerMappedSetFunction<BatchExpiredWebhookEvent>;
|
|
32
|
+
readonly handleBatchFailed: OpenAIHandlerMappedSetFunction<BatchFailedWebhookEvent>;
|
|
33
|
+
readonly handleEvalRunCanceled: OpenAIHandlerMappedSetFunction<EvalRunCanceledWebhookEvent>;
|
|
34
|
+
readonly handleEvalRunFailed: OpenAIHandlerMappedSetFunction<EvalRunFailedWebhookEvent>;
|
|
35
|
+
readonly handleEvalRunSucceeded: OpenAIHandlerMappedSetFunction<EvalRunSucceededWebhookEvent>;
|
|
36
|
+
readonly handleFineTuningJobCancelled: OpenAIHandlerMappedSetFunction<FineTuningJobCancelledWebhookEvent>;
|
|
37
|
+
readonly handleFineTuningJobFailed: OpenAIHandlerMappedSetFunction<FineTuningJobFailedWebhookEvent>;
|
|
38
|
+
readonly handleFineTuningJobSucceeded: OpenAIHandlerMappedSetFunction<FineTuningJobSucceededWebhookEvent>;
|
|
39
|
+
readonly handleResponseCancelled: OpenAIHandlerMappedSetFunction<ResponseCancelledWebhookEvent>;
|
|
40
|
+
readonly handleResponseCompleted: OpenAIHandlerMappedSetFunction<ResponseCompletedWebhookEvent>;
|
|
41
|
+
readonly handleResponseFailed: OpenAIHandlerMappedSetFunction<ResponseFailedWebhookEvent>;
|
|
42
|
+
readonly handleResponseIncomplete: OpenAIHandlerMappedSetFunction<ResponseIncompleteWebhookEvent>;
|
|
43
|
+
}
|
|
44
|
+
export declare const openaiEventHandlerConfigurerFactory: import("@dereekb/util").HandlerConfigurerFactory<OpenAIEventHandlerConfigurer, UnwrapWebhookEvent, "batch.cancelled" | "batch.completed" | "batch.expired" | "batch.failed" | "eval.run.canceled" | "eval.run.failed" | "eval.run.succeeded" | "fine_tuning.job.cancelled" | "fine_tuning.job.failed" | "fine_tuning.job.succeeded" | "response.cancelled" | "response.completed" | "response.failed" | "response.incomplete", boolean>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.openaiEventHandlerConfigurerFactory = exports.openaiEventHandlerFactory = void 0;
|
|
4
|
+
exports.openAIWebhookEvent = openAIWebhookEvent;
|
|
5
|
+
const util_1 = require("@dereekb/util");
|
|
6
|
+
require("../openai.type");
|
|
7
|
+
/**
|
|
8
|
+
* Creates a OpenAIWebhookEvent and treats the data as the input type.
|
|
9
|
+
*
|
|
10
|
+
* @param event
|
|
11
|
+
* @returns
|
|
12
|
+
*/
|
|
13
|
+
function openAIWebhookEvent(event) {
|
|
14
|
+
return event;
|
|
15
|
+
}
|
|
16
|
+
exports.openaiEventHandlerFactory = (0, util_1.handlerFactory)((x) => x.type);
|
|
17
|
+
exports.openaiEventHandlerConfigurerFactory = (0, util_1.handlerConfigurerFactory)({
|
|
18
|
+
configurerForAccessor: (accessor) => {
|
|
19
|
+
// eslint-disable-next-line
|
|
20
|
+
const fnWithKey = (0, util_1.handlerMappedSetFunctionFactory)(accessor, openAIWebhookEvent);
|
|
21
|
+
const configurer = {
|
|
22
|
+
...accessor,
|
|
23
|
+
handleBatchCancelled: fnWithKey('batch.cancelled'),
|
|
24
|
+
handleBatchCompleted: fnWithKey('batch.completed'),
|
|
25
|
+
handleBatchExpired: fnWithKey('batch.expired'),
|
|
26
|
+
handleBatchFailed: fnWithKey('batch.failed'),
|
|
27
|
+
handleEvalRunCanceled: fnWithKey('eval.run.canceled'),
|
|
28
|
+
handleEvalRunFailed: fnWithKey('eval.run.failed'),
|
|
29
|
+
handleEvalRunSucceeded: fnWithKey('eval.run.succeeded'),
|
|
30
|
+
handleFineTuningJobCancelled: fnWithKey('fine_tuning.job.cancelled'),
|
|
31
|
+
handleFineTuningJobFailed: fnWithKey('fine_tuning.job.failed'),
|
|
32
|
+
handleFineTuningJobSucceeded: fnWithKey('fine_tuning.job.succeeded'),
|
|
33
|
+
handleResponseCancelled: fnWithKey('response.cancelled'),
|
|
34
|
+
handleResponseCompleted: fnWithKey('response.completed'),
|
|
35
|
+
handleResponseFailed: fnWithKey('response.failed'),
|
|
36
|
+
handleResponseIncomplete: fnWithKey('response.incomplete')
|
|
37
|
+
};
|
|
38
|
+
return configurer;
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=webhook.openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.openai.js","sourceRoot":"","sources":["../../../../../../../packages/nestjs/openai/src/lib/webhook/webhook.openai.ts"],"names":[],"mappings":";;;AA4BA,gDAEC;AA9BD,wCAAkK;AAClK,0BAAwB;AAqBxB;;;;;GAKG;AACH,SAAgB,kBAAkB,CAAoD,KAAgC;IACpH,OAAO,KAA8B,CAAC;AACxC,CAAC;AAIY,QAAA,yBAAyB,GAAG,IAAA,qBAAc,EAAoD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAqB7G,QAAA,mCAAmC,GAAG,IAAA,+BAAwB,EAAkF;IAC3J,qBAAqB,EAAE,CAAC,QAAgF,EAAE,EAAE;QAC1G,2BAA2B;QAC3B,MAAM,SAAS,GAAG,IAAA,sCAA+B,EAAuD,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QAEtI,MAAM,UAAU,GAAiC;YAC/C,GAAG,QAAQ;YACX,oBAAoB,EAAE,SAAS,CAAC,iBAAiB,CAAC;YAClD,oBAAoB,EAAE,SAAS,CAAC,iBAAiB,CAAC;YAClD,kBAAkB,EAAE,SAAS,CAAC,eAAe,CAAC;YAC9C,iBAAiB,EAAE,SAAS,CAAC,cAAc,CAAC;YAC5C,qBAAqB,EAAE,SAAS,CAAC,mBAAmB,CAAC;YACrD,mBAAmB,EAAE,SAAS,CAAC,iBAAiB,CAAC;YACjD,sBAAsB,EAAE,SAAS,CAAC,oBAAoB,CAAC;YACvD,4BAA4B,EAAE,SAAS,CAAC,2BAA2B,CAAC;YACpE,yBAAyB,EAAE,SAAS,CAAC,wBAAwB,CAAC;YAC9D,4BAA4B,EAAE,SAAS,CAAC,2BAA2B,CAAC;YACpE,uBAAuB,EAAE,SAAS,CAAC,oBAAoB,CAAC;YACxD,uBAAuB,EAAE,SAAS,CAAC,oBAAoB,CAAC;YACxD,oBAAoB,EAAE,SAAS,CAAC,iBAAiB,CAAC;YAClD,wBAAwB,EAAE,SAAS,CAAC,qBAAqB,CAAC;SAC3D,CAAC;QAEF,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { OpenAIWebhookServiceConfig } from './webhook.openai.config';
|
|
2
|
+
import { ConfigService } from '@nestjs/config';
|
|
3
|
+
export declare function openAIWebhookServiceConfigFactory(configService: ConfigService): OpenAIWebhookServiceConfig;
|
|
4
|
+
export declare class OpenAIWebhookModule {
|
|
5
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpenAIWebhookModule = void 0;
|
|
4
|
+
exports.openAIWebhookServiceConfigFactory = openAIWebhookServiceConfigFactory;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
const webhook_openai_controller_1 = require("./webhook.openai.controller");
|
|
7
|
+
const common_1 = require("@nestjs/common");
|
|
8
|
+
const webhook_openai_service_1 = require("./webhook.openai.service");
|
|
9
|
+
const webhook_openai_config_1 = require("./webhook.openai.config");
|
|
10
|
+
const config_1 = require("@nestjs/config");
|
|
11
|
+
const openai_module_1 = require("../openai.module");
|
|
12
|
+
function openAIWebhookServiceConfigFactory(configService) {
|
|
13
|
+
const config = {
|
|
14
|
+
openaiWebhook: {
|
|
15
|
+
webhookSecret: configService.get(webhook_openai_config_1.OPENAI_WEBHOOK_SECRET_ENV_VAR)
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
webhook_openai_config_1.OpenAIWebhookServiceConfig.assertValidConfig(config);
|
|
19
|
+
return config;
|
|
20
|
+
}
|
|
21
|
+
let OpenAIWebhookModule = class OpenAIWebhookModule {
|
|
22
|
+
};
|
|
23
|
+
exports.OpenAIWebhookModule = OpenAIWebhookModule;
|
|
24
|
+
exports.OpenAIWebhookModule = OpenAIWebhookModule = tslib_1.__decorate([
|
|
25
|
+
(0, common_1.Module)({
|
|
26
|
+
imports: [config_1.ConfigModule, openai_module_1.OpenAIModule],
|
|
27
|
+
controllers: [webhook_openai_controller_1.OpenAIWebhookController],
|
|
28
|
+
providers: [
|
|
29
|
+
{
|
|
30
|
+
provide: webhook_openai_config_1.OpenAIWebhookServiceConfig,
|
|
31
|
+
inject: [config_1.ConfigService],
|
|
32
|
+
useFactory: openAIWebhookServiceConfigFactory
|
|
33
|
+
},
|
|
34
|
+
webhook_openai_service_1.OpenAIWebhookService
|
|
35
|
+
],
|
|
36
|
+
exports: [webhook_openai_service_1.OpenAIWebhookService]
|
|
37
|
+
})
|
|
38
|
+
], OpenAIWebhookModule);
|
|
39
|
+
//# sourceMappingURL=webhook.openai.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.openai.module.js","sourceRoot":"","sources":["../../../../../../../packages/nestjs/openai/src/lib/webhook/webhook.openai.module.ts"],"names":[],"mappings":";;;AAQA,8EASC;;AAjBD,2EAAsE;AACtE,2CAAwC;AACxC,qEAAgE;AAChE,mEAAoG;AACpG,2CAA6D;AAE7D,oDAAgD;AAEhD,SAAgB,iCAAiC,CAAC,aAA4B;IAC5E,MAAM,MAAM,GAA+B;QACzC,aAAa,EAAE;YACb,aAAa,EAAE,aAAa,CAAC,GAAG,CAAsB,qDAA6B,CAAwB;SAC5G;KACF,CAAC;IAEF,kDAA0B,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC;AAChB,CAAC;AAeM,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;CAAG,CAAA;AAAtB,kDAAmB;8BAAnB,mBAAmB;IAb/B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,qBAAY,EAAE,4BAAY,CAAC;QACrC,WAAW,EAAE,CAAC,mDAAuB,CAAC;QACtC,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,kDAA0B;gBACnC,MAAM,EAAE,CAAC,sBAAa,CAAC;gBACvB,UAAU,EAAE,iCAAiC;aAC9C;YACD,6CAAoB;SACrB;QACD,OAAO,EAAE,CAAC,6CAAoB,CAAC;KAChC,CAAC;GACW,mBAAmB,CAAG"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Request } from 'express';
|
|
2
|
+
import { OpenAIWebhookEvent, OpenAIWebhookEventType } from './webhook.openai';
|
|
3
|
+
import { Handler } from '@dereekb/util';
|
|
4
|
+
import { OpenAIWebhookServiceConfig } from './webhook.openai.config';
|
|
5
|
+
import { OpenAIApi } from '../openai.api';
|
|
6
|
+
/**
|
|
7
|
+
* Service that makes system changes based on OpenAI webhook events.
|
|
8
|
+
*/
|
|
9
|
+
export declare class OpenAIWebhookService {
|
|
10
|
+
private readonly logger;
|
|
11
|
+
private readonly _verifier;
|
|
12
|
+
readonly handler: Handler<OpenAIWebhookEvent, OpenAIWebhookEventType>;
|
|
13
|
+
readonly configure: import("@dereekb/util").HandlerConfigurer<import("./webhook.openai").OpenAIEventHandlerConfigurer, import("openai/resources/webhooks").UnwrapWebhookEvent, "batch.cancelled" | "batch.completed" | "batch.expired" | "batch.failed" | "eval.run.canceled" | "eval.run.failed" | "eval.run.succeeded" | "fine_tuning.job.cancelled" | "fine_tuning.job.failed" | "fine_tuning.job.succeeded" | "response.cancelled" | "response.completed" | "response.failed" | "response.incomplete", boolean>;
|
|
14
|
+
constructor(openAiApi: OpenAIApi, openAIWebhookServiceConfig: OpenAIWebhookServiceConfig);
|
|
15
|
+
updateForWebhook(req: Request, rawBody: Buffer): Promise<void>;
|
|
16
|
+
updateForOpenAIEvent(event: OpenAIWebhookEvent): Promise<void>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpenAIWebhookService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const webhook_openai_1 = require("./webhook.openai");
|
|
7
|
+
const webhook_openai_config_1 = require("./webhook.openai.config");
|
|
8
|
+
const openai_api_1 = require("../openai.api");
|
|
9
|
+
const webhook_openai_verify_1 = require("./webhook.openai.verify");
|
|
10
|
+
/**
|
|
11
|
+
* Service that makes system changes based on OpenAI webhook events.
|
|
12
|
+
*/
|
|
13
|
+
let OpenAIWebhookService = class OpenAIWebhookService {
|
|
14
|
+
logger = new common_1.Logger('OpenAIWebhookService');
|
|
15
|
+
_verifier;
|
|
16
|
+
handler = (0, webhook_openai_1.openaiEventHandlerFactory)();
|
|
17
|
+
configure = (0, webhook_openai_1.openaiEventHandlerConfigurerFactory)(this.handler);
|
|
18
|
+
constructor(openAiApi, openAIWebhookServiceConfig) {
|
|
19
|
+
const { webhookSecret } = openAIWebhookServiceConfig.openaiWebhook;
|
|
20
|
+
this._verifier = (0, webhook_openai_verify_1.openAIWebhookEventVerifier)({
|
|
21
|
+
secret: webhookSecret,
|
|
22
|
+
client: openAiApi.openAIClient
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
async updateForWebhook(req, rawBody) {
|
|
26
|
+
const result = await this._verifier(req, rawBody);
|
|
27
|
+
if (!result.valid) {
|
|
28
|
+
this.logger.warn('Received invalid OpenAI event.', req);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
await this.updateForOpenAIEvent(result.event);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async updateForOpenAIEvent(event) {
|
|
35
|
+
const result = await this.handler(event);
|
|
36
|
+
if (!result) {
|
|
37
|
+
this.logger.warn('Received unexpected/unhandled OpenAI event.', event);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
exports.OpenAIWebhookService = OpenAIWebhookService;
|
|
42
|
+
exports.OpenAIWebhookService = OpenAIWebhookService = tslib_1.__decorate([
|
|
43
|
+
(0, common_1.Injectable)(),
|
|
44
|
+
tslib_1.__param(0, (0, common_1.Inject)(openai_api_1.OpenAIApi)),
|
|
45
|
+
tslib_1.__param(1, (0, common_1.Inject)(webhook_openai_config_1.OpenAIWebhookServiceConfig)),
|
|
46
|
+
tslib_1.__metadata("design:paramtypes", [openai_api_1.OpenAIApi, webhook_openai_config_1.OpenAIWebhookServiceConfig])
|
|
47
|
+
], OpenAIWebhookService);
|
|
48
|
+
//# sourceMappingURL=webhook.openai.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.openai.service.js","sourceRoot":"","sources":["../../../../../../../packages/nestjs/openai/src/lib/webhook/webhook.openai.service.ts"],"names":[],"mappings":";;;;AAAA,2CAA4D;AAE5D,qDAA8I;AAE9I,mEAAqE;AACrE,8CAA0C;AAC1C,mEAAiG;AAEjG;;GAEG;AAEI,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IACd,MAAM,GAAG,IAAI,eAAM,CAAC,sBAAsB,CAAC,CAAC;IAE5C,SAAS,CAA6B;IAE9C,OAAO,GAAwD,IAAA,0CAAyB,GAAE,CAAC;IAC3F,SAAS,GAAG,IAAA,oDAAmC,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEvE,YAA+B,SAAoB,EAAsC,0BAAsD;QAC7I,MAAM,EAAE,aAAa,EAAE,GAAG,0BAA0B,CAAC,aAAa,CAAC;QAEnE,IAAI,CAAC,SAAS,GAAG,IAAA,kDAA0B,EAAC;YAC1C,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,SAAS,CAAC,YAAY;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,GAAY,EAAE,OAAe;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAElD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,KAA2B,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,KAAyB;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6CAA6C,EAAE,KAAK,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;CACF,CAAA;AAlCY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;IASE,mBAAA,IAAA,eAAM,EAAC,sBAAS,CAAC,CAAA;IAAwB,mBAAA,IAAA,eAAM,EAAC,kDAA0B,CAAC,CAAA;6CAA9C,sBAAS,EAAkE,kDAA0B;GARpI,oBAAoB,CAkChC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Request } from 'express';
|
|
2
|
+
import { OpenAI } from 'openai';
|
|
3
|
+
import { OpenAIWebhookSecret } from '../openai.type';
|
|
4
|
+
import { Maybe } from '@dereekb/util';
|
|
5
|
+
import { UnwrapWebhookEvent } from 'openai/resources/webhooks';
|
|
6
|
+
export interface OpenAIWebhookEventVerificationConfig {
|
|
7
|
+
/**
|
|
8
|
+
* Secret token to use for verification.
|
|
9
|
+
*
|
|
10
|
+
* If not defined, uses what is configured in the client.
|
|
11
|
+
*/
|
|
12
|
+
readonly secret?: OpenAIWebhookSecret;
|
|
13
|
+
/**
|
|
14
|
+
* OpenAI client to use for verification.
|
|
15
|
+
*/
|
|
16
|
+
readonly client: OpenAI;
|
|
17
|
+
}
|
|
18
|
+
export type OpenAIWebhookEventVerificationResult = OpenAIWebhookEventVerificationSuccessResult | OpenAIWebhookEventVerificationErrorResult;
|
|
19
|
+
export interface OpenAIWebhookEventVerificationSuccessResult {
|
|
20
|
+
readonly valid: true;
|
|
21
|
+
readonly event: Maybe<UnwrapWebhookEvent>;
|
|
22
|
+
}
|
|
23
|
+
export interface OpenAIWebhookEventVerificationErrorResult {
|
|
24
|
+
readonly valid: false;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Function that verifies a OpenAI webhook event.
|
|
28
|
+
*/
|
|
29
|
+
export type OpenAIWebhookEventVerifier = (req: Request, rawBody: Buffer) => Promise<OpenAIWebhookEventVerificationResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Verifies a OpenAI webhook event header.
|
|
32
|
+
*
|
|
33
|
+
* @param vapiSecretTokenGetter The OpenAI secret token. The Vapi client allows for using an AsyncGetterOrValue type, so the verifier supports that as well.
|
|
34
|
+
* @returns A function that verifies a OpenAI webhook event.
|
|
35
|
+
*/
|
|
36
|
+
export declare function openAIWebhookEventVerifier(config: OpenAIWebhookEventVerificationConfig): OpenAIWebhookEventVerifier;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.openAIWebhookEventVerifier = openAIWebhookEventVerifier;
|
|
4
|
+
const openai_1 = require("openai");
|
|
5
|
+
/**
|
|
6
|
+
* Verifies a OpenAI webhook event header.
|
|
7
|
+
*
|
|
8
|
+
* @param vapiSecretTokenGetter The OpenAI secret token. The Vapi client allows for using an AsyncGetterOrValue type, so the verifier supports that as well.
|
|
9
|
+
* @returns A function that verifies a OpenAI webhook event.
|
|
10
|
+
*/
|
|
11
|
+
function openAIWebhookEventVerifier(config) {
|
|
12
|
+
const { secret, client } = config;
|
|
13
|
+
return async (request, rawBody) => {
|
|
14
|
+
const headers = request.headers;
|
|
15
|
+
const requestBodyString = String(request.body);
|
|
16
|
+
let event;
|
|
17
|
+
let valid = false;
|
|
18
|
+
try {
|
|
19
|
+
event = await client.webhooks.unwrap(requestBodyString, headers, secret);
|
|
20
|
+
valid = true;
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
if (e instanceof openai_1.InvalidWebhookSignatureError) {
|
|
24
|
+
valid = false;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
throw e;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const result = {
|
|
31
|
+
valid,
|
|
32
|
+
event
|
|
33
|
+
};
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=webhook.openai.verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.openai.verify.js","sourceRoot":"","sources":["../../../../../../../packages/nestjs/openai/src/lib/webhook/webhook.openai.verify.ts"],"names":[],"mappings":";;AAyCA,gEA4BC;AApED,mCAA8D;AAkC9D;;;;;GAKG;AACH,SAAgB,0BAA0B,CAAC,MAA4C;IACrF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAElC,OAAO,KAAK,EAAE,OAAgB,EAAE,OAAe,EAAE,EAAE;QACjD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE/C,IAAI,KAAgC,CAAC;QACrC,IAAI,KAAK,GAAG,KAAK,CAAC;QAElB,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACzE,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,qCAA4B,EAAE,CAAC;gBAC9C,KAAK,GAAG,KAAK,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,CAAC;YACV,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAyC;YACnD,KAAK;YACL,KAAK;SACN,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dereekb/nestjs",
|
|
3
|
-
"version": "12.
|
|
3
|
+
"version": "12.3.0",
|
|
4
4
|
"type": "commonjs",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -26,6 +26,12 @@
|
|
|
26
26
|
"main": "./vapiai/src/index.js",
|
|
27
27
|
"require": "./vapiai/src/index.js",
|
|
28
28
|
"default": "./vapiai/src/index.js"
|
|
29
|
+
},
|
|
30
|
+
"./openai": {
|
|
31
|
+
"types": "./openai/src/index.d.ts",
|
|
32
|
+
"main": "./openai/src/index.js",
|
|
33
|
+
"require": "./openai/src/index.js",
|
|
34
|
+
"default": "./openai/src/index.js"
|
|
29
35
|
}
|
|
30
36
|
},
|
|
31
37
|
"main": "./src/index.js",
|
package/stripe/package.json
CHANGED
package/vapiai/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Vapi } from '@vapi-ai/server-sdk';
|
|
2
2
|
/**
|
|
3
3
|
* Secret token used by Vapi.ai for making requests.
|
|
4
4
|
*/
|
|
@@ -30,8 +30,19 @@ export type VapiApiWebhookEventVerificationType = 'none' | 'secret' | 'hmac';
|
|
|
30
30
|
/**
|
|
31
31
|
* Cost item used by Vapi.ai.
|
|
32
32
|
*/
|
|
33
|
-
export type VapiCostsItem =
|
|
33
|
+
export type VapiCostsItem = Vapi.ServerMessageEndOfCallReport.Costs.Item;
|
|
34
34
|
/**
|
|
35
35
|
* Assistant id used by Vapi.ai.
|
|
36
36
|
*/
|
|
37
37
|
export type VapiAssistantId = string;
|
|
38
|
+
export type VapiTranscript = string;
|
|
39
|
+
export interface VapiTranscriptRef {
|
|
40
|
+
transcript?: VapiTranscript;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Call with transcript.
|
|
44
|
+
*
|
|
45
|
+
* The Vapi.ai server-sdk does not include the transcript in the call object, so we extend it here.
|
|
46
|
+
*/
|
|
47
|
+
export interface VapiCallWithTranscript extends Vapi.Call, VapiTranscriptRef {
|
|
48
|
+
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { HandlerBindAccessor, HandlerMappedSetFunction, Handler, Maybe } from '@dereekb/util';
|
|
2
|
-
import '
|
|
3
|
-
|
|
4
|
-
export type VapiAiWebhookEventType = VapiWebhookEnum | string;
|
|
2
|
+
import { AssistantRequestPayload, EndOfCallReportPayload, FunctionCallPayload, HangPayload, SpeechUpdatePayload, StatusUpdatePayload, TranscriptPayload, VapiPayload, VapiPayloadType, VapiResponse } from './webhook.vapiai.types';
|
|
3
|
+
export type VapiAiWebhookEventType = VapiPayloadType | string;
|
|
5
4
|
export interface VapiAiWebhookResult {
|
|
6
5
|
readonly handled: boolean;
|
|
7
6
|
/**
|
|
@@ -23,7 +22,7 @@ export type VapiAiWebhookEvent<T extends VapiPayload = VapiPayload, ET extends V
|
|
|
23
22
|
};
|
|
24
23
|
export type UntypedVapiAiWebhookEvent = VapiAiWebhookEvent;
|
|
25
24
|
/**
|
|
26
|
-
* Creates a
|
|
25
|
+
* Creates a VapiAiWebhookEvent and treats the data as the input type.
|
|
27
26
|
*
|
|
28
27
|
* @param event
|
|
29
28
|
* @returns
|
|
@@ -3,10 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.vapiaiEventHandlerConfigurerFactory = exports.vapiaiEventHandlerFactory = void 0;
|
|
4
4
|
exports.vapiAiWebhookEvent = vapiAiWebhookEvent;
|
|
5
5
|
const util_1 = require("@dereekb/util");
|
|
6
|
-
require("../vapiai.type");
|
|
7
|
-
const webhook_vapiai_types_1 = require("./webhook.vapiai.types");
|
|
8
6
|
/**
|
|
9
|
-
* Creates a
|
|
7
|
+
* Creates a VapiAiWebhookEvent and treats the data as the input type.
|
|
10
8
|
*
|
|
11
9
|
* @param event
|
|
12
10
|
* @returns
|
|
@@ -30,13 +28,13 @@ exports.vapiaiEventHandlerConfigurerFactory = (0, util_1.handlerConfigurerFactor
|
|
|
30
28
|
const fnWithKey = (0, util_1.handlerMappedSetFunctionFactory)(accessor, vapiAiWebhookEvent);
|
|
31
29
|
const configurer = {
|
|
32
30
|
...accessor,
|
|
33
|
-
handleAssistantRequest: fnWithKey(
|
|
34
|
-
handleStatusUpdate: fnWithKey(
|
|
35
|
-
handleFunctionCall: fnWithKey(
|
|
36
|
-
handleEndOfCallReport: fnWithKey(
|
|
37
|
-
handleHang: fnWithKey(
|
|
38
|
-
handleSpeechUpdate: fnWithKey(
|
|
39
|
-
handleTranscript: fnWithKey(
|
|
31
|
+
handleAssistantRequest: fnWithKey('assistant-request'),
|
|
32
|
+
handleStatusUpdate: fnWithKey('status-update'),
|
|
33
|
+
handleFunctionCall: fnWithKey('function-call'),
|
|
34
|
+
handleEndOfCallReport: fnWithKey('end-of-call-report'),
|
|
35
|
+
handleHang: fnWithKey('hang'),
|
|
36
|
+
handleSpeechUpdate: fnWithKey('speech-update'),
|
|
37
|
+
handleTranscript: fnWithKey('transcript')
|
|
40
38
|
};
|
|
41
39
|
return configurer;
|
|
42
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.vapiai.js","sourceRoot":"","sources":["../../../../../../../packages/nestjs/vapiai/src/lib/webhook/webhook.vapiai.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"webhook.vapiai.js","sourceRoot":"","sources":["../../../../../../../packages/nestjs/vapiai/src/lib/webhook/webhook.vapiai.ts"],"names":[],"mappings":";;;AAmCA,gDAEC;AArCD,wCAAyK;AA6BzK;;;;;GAKG;AACH,SAAgB,kBAAkB,CAAwB,KAAgC;IACxF,OAAO,KAA8B,CAAC;AACxC,CAAC;AAIY,QAAA,yBAAyB,GAAG,IAAA,qBAAc,EAAyE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;IAC7I,aAAa,EAAE;QACb,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,SAAS;KACpB;IACD,cAAc,EAAE;QACd,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,SAAS;KACpB;CACF,CAAC,CAAC;AAoBU,QAAA,mCAAmC,GAAG,IAAA,+BAAwB,EAAuG;IAChL,qBAAqB,EAAE,CAAC,QAAqG,EAAE,EAAE;QAC/H,2BAA2B;QAC3B,MAAM,SAAS,GAAG,IAAA,sCAA+B,EAAmF,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QAElK,MAAM,UAAU,GAAiC;YAC/C,GAAG,QAAQ;YACX,sBAAsB,EAAE,SAAS,CAAC,mBAAmB,CAAC;YACtD,kBAAkB,EAAE,SAAS,CAAC,eAAe,CAAC;YAC9C,kBAAkB,EAAE,SAAS,CAAC,eAAe,CAAC;YAC9C,qBAAqB,EAAE,SAAS,CAAC,oBAAoB,CAAC;YACtD,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC;YAC7B,kBAAkB,EAAE,SAAS,CAAC,eAAe,CAAC;YAC9C,gBAAgB,EAAE,SAAS,CAAC,YAAY,CAAC;SAC1C,CAAC;QAEF,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,102 +1,65 @@
|
|
|
1
1
|
import { DollarAmount, ISO8601DateStringUTCFull, JSONEncodedString, UnixDateTimeNumber, WebsiteUrlWithPrefix } from '@dereekb/util';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
export
|
|
5
|
-
ASSISTANT_REQUEST = "assistant-request",
|
|
6
|
-
FUNCTION_CALL = "function-call",
|
|
7
|
-
STATUS_UPDATE = "status-update",
|
|
8
|
-
END_OF_CALL_REPORT = "end-of-call-report",
|
|
9
|
-
HANG = "hang",
|
|
10
|
-
/**
|
|
11
|
-
* @deprecated needs documentation link
|
|
12
|
-
*/
|
|
13
|
-
SPEECH_UPDATE = "speech-update",
|
|
14
|
-
/**
|
|
15
|
-
* @deprecated needs documentation link
|
|
16
|
-
*/
|
|
17
|
-
TRANSCRIPT = "transcript"
|
|
18
|
-
}
|
|
2
|
+
import { VapiAssistantId, VapiCostsItem, VapiTranscriptRef } from '../vapiai.type';
|
|
3
|
+
import { Vapi } from '@vapi-ai/server-sdk';
|
|
4
|
+
export type BaseVapiPayloadCall = Required<Pick<Vapi.Call, 'id' | 'orgId' | 'createdAt' | 'updatedAt' | 'type' | 'monitor' | 'transport' | 'status' | 'assistantId' | 'assistantOverrides'>>;
|
|
19
5
|
interface BaseVapiPayload {
|
|
20
|
-
readonly call: Call
|
|
6
|
+
readonly call: BaseVapiPayloadCall & Partial<Vapi.Call>;
|
|
21
7
|
}
|
|
22
8
|
/**
|
|
23
9
|
* Assistant request event payload
|
|
24
10
|
*
|
|
25
11
|
* https://docs.vapi.ai/server-url/events#retrieving-assistants
|
|
26
12
|
*/
|
|
27
|
-
export
|
|
28
|
-
readonly type: VapiWebhookEnum.ASSISTANT_REQUEST;
|
|
29
|
-
}
|
|
13
|
+
export type AssistantRequestPayload = BaseVapiPayload & Omit<Vapi.ServerMessageAssistantRequest, 'call'>;
|
|
30
14
|
/**
|
|
31
15
|
* Status update event payload
|
|
32
16
|
*
|
|
33
17
|
* https://docs.vapi.ai/server-url/events#call-status-updates
|
|
34
18
|
*/
|
|
35
|
-
export
|
|
36
|
-
readonly type: VapiWebhookEnum.STATUS_UPDATE;
|
|
37
|
-
readonly status: CallStatus;
|
|
38
|
-
}
|
|
19
|
+
export type StatusUpdatePayload = BaseVapiPayload & Omit<Vapi.ServerMessageStatusUpdate, 'call'>;
|
|
39
20
|
/**
|
|
40
21
|
* Function call event payload
|
|
41
22
|
*
|
|
42
23
|
* https://docs.vapi.ai/server-url/events#function-calling
|
|
43
24
|
*/
|
|
44
25
|
export interface FunctionCallPayload extends BaseVapiPayload {
|
|
45
|
-
readonly type:
|
|
46
|
-
readonly functionCall:
|
|
47
|
-
readonly name: string;
|
|
48
|
-
readonly parameters: JSONEncodedString;
|
|
49
|
-
};
|
|
26
|
+
readonly type: 'function-call';
|
|
27
|
+
readonly functionCall: Vapi.FunctionCall;
|
|
50
28
|
}
|
|
51
29
|
/**
|
|
52
30
|
* End of call report event payload
|
|
53
31
|
*
|
|
54
32
|
* https://docs.vapi.ai/server-url/events#end-of-call-report
|
|
55
33
|
*/
|
|
56
|
-
export interface EndOfCallReportPayload extends BaseVapiPayload {
|
|
57
|
-
readonly type: VapiWebhookEnum.END_OF_CALL_REPORT;
|
|
34
|
+
export interface EndOfCallReportPayload extends BaseVapiPayload, Omit<Vapi.ServerMessageEndOfCallReport, 'call'>, VapiTranscriptRef {
|
|
58
35
|
readonly timestamp: UnixDateTimeNumber;
|
|
59
|
-
readonly analysis: Analysis;
|
|
60
|
-
readonly artifact: Artifact;
|
|
61
36
|
readonly startedAt: ISO8601DateStringUTCFull;
|
|
62
37
|
readonly endedAt: ISO8601DateStringUTCFull;
|
|
63
|
-
readonly endedReason: CallEndedReason;
|
|
64
38
|
readonly cost: DollarAmount;
|
|
65
|
-
readonly costBreakdown: CostBreakdown;
|
|
39
|
+
readonly costBreakdown: Vapi.CostBreakdown;
|
|
66
40
|
readonly costs: VapiCostsItem[];
|
|
67
41
|
readonly transcript: string;
|
|
68
|
-
readonly messages:
|
|
42
|
+
readonly messages: Vapi.Chat.Messages.Item[];
|
|
69
43
|
readonly summary: string;
|
|
70
44
|
readonly recordingUrl?: WebsiteUrlWithPrefix;
|
|
71
45
|
readonly stereoRecordingUrl?: WebsiteUrlWithPrefix;
|
|
72
|
-
readonly assistant: Assistant;
|
|
73
46
|
}
|
|
74
47
|
/**
|
|
75
48
|
* Hang event payload
|
|
76
49
|
*
|
|
77
50
|
* https://docs.vapi.ai/server-url/events#hang-notifications
|
|
78
51
|
*/
|
|
79
|
-
export
|
|
80
|
-
readonly type: VapiWebhookEnum.HANG;
|
|
81
|
-
}
|
|
52
|
+
export type HangPayload = BaseVapiPayload & Omit<Vapi.ServerMessageHang, 'call'>;
|
|
82
53
|
/**
|
|
83
54
|
* @deprecated needs documentation link
|
|
84
55
|
*/
|
|
85
|
-
export
|
|
86
|
-
readonly type: VapiWebhookEnum.SPEECH_UPDATE;
|
|
87
|
-
readonly status: 'started' | 'stopped';
|
|
88
|
-
readonly role: 'assistant' | 'user';
|
|
89
|
-
}
|
|
56
|
+
export type SpeechUpdatePayload = BaseVapiPayload & Omit<Vapi.ServerMessageSpeechUpdate, 'call'>;
|
|
90
57
|
/**
|
|
91
58
|
* @deprecated needs documentation link
|
|
92
59
|
*/
|
|
93
|
-
export
|
|
94
|
-
readonly type: VapiWebhookEnum.TRANSCRIPT;
|
|
95
|
-
readonly role: 'assistant' | 'user';
|
|
96
|
-
readonly transcriptType: 'partial' | 'final';
|
|
97
|
-
readonly transcript: string;
|
|
98
|
-
}
|
|
60
|
+
export type TranscriptPayload = BaseVapiPayload & Omit<Vapi.ServerMessageTranscript, 'call'>;
|
|
99
61
|
export type VapiPayload = AssistantRequestPayload | StatusUpdatePayload | FunctionCallPayload | EndOfCallReportPayload | SpeechUpdatePayload | TranscriptPayload | HangPayload;
|
|
62
|
+
export type VapiPayloadType = VapiPayload['type'];
|
|
100
63
|
/**
|
|
101
64
|
* Response returned when a function is called.
|
|
102
65
|
*
|
|
@@ -116,7 +79,7 @@ export interface AssistantRequestMessageSuccessIdResponse {
|
|
|
116
79
|
readonly assistantId: VapiAssistantId;
|
|
117
80
|
}
|
|
118
81
|
export interface AssistantRequestMessageSuccessObjectResponse {
|
|
119
|
-
readonly assistant: Assistant;
|
|
82
|
+
readonly assistant: Vapi.Assistant;
|
|
120
83
|
}
|
|
121
84
|
export interface AssistantRequestMessageErrorResponse {
|
|
122
85
|
readonly error?: string;
|
|
@@ -131,4 +94,22 @@ export type TranscriptMessageResponse = VapiVoidResponse;
|
|
|
131
94
|
export type HangMessageResponse = VapiVoidResponse;
|
|
132
95
|
export type EndOfCallReportMessageResponse = VapiVoidResponse;
|
|
133
96
|
export type VapiResponse = AssistantRequestMessageResponse | FunctionCallMessageResponse | EndOfCallReportMessageResponse | HangMessageResponse | StatusUpdateMessageResponse | SpeechUpdateMessageResponse | TranscriptMessageResponse;
|
|
97
|
+
/**
|
|
98
|
+
* @deprecated use VapiWebhookPayloadType instead.
|
|
99
|
+
*/
|
|
100
|
+
export declare enum VapiWebhookEnum {
|
|
101
|
+
ASSISTANT_REQUEST = "assistant-request",
|
|
102
|
+
FUNCTION_CALL = "function-call",
|
|
103
|
+
STATUS_UPDATE = "status-update",
|
|
104
|
+
END_OF_CALL_REPORT = "end-of-call-report",
|
|
105
|
+
HANG = "hang",
|
|
106
|
+
/**
|
|
107
|
+
* @deprecated needs documentation link
|
|
108
|
+
*/
|
|
109
|
+
SPEECH_UPDATE = "speech-update",
|
|
110
|
+
/**
|
|
111
|
+
* @deprecated needs documentation link
|
|
112
|
+
*/
|
|
113
|
+
TRANSCRIPT = "transcript"
|
|
114
|
+
}
|
|
134
115
|
export {};
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.VapiWebhookEnum = void 0;
|
|
4
|
+
// MARK: Compat
|
|
5
|
+
/**
|
|
6
|
+
* @deprecated use VapiWebhookPayloadType instead.
|
|
7
|
+
*/
|
|
4
8
|
var VapiWebhookEnum;
|
|
5
9
|
(function (VapiWebhookEnum) {
|
|
6
10
|
VapiWebhookEnum["ASSISTANT_REQUEST"] = "assistant-request";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.vapiai.types.js","sourceRoot":"","sources":["../../../../../../../packages/nestjs/vapiai/src/lib/webhook/webhook.vapiai.types.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"webhook.vapiai.types.js","sourceRoot":"","sources":["../../../../../../../packages/nestjs/vapiai/src/lib/webhook/webhook.vapiai.types.ts"],"names":[],"mappings":";;;AAoHA,eAAe;AAEf;;GAEG;AACH,IAAY,eAeX;AAfD,WAAY,eAAe;IACzB,0DAAuC,CAAA;IACvC,kDAA+B,CAAA;IAC/B,kDAA+B,CAAA;IAC/B,4DAAyC,CAAA;IACzC,gCAAa,CAAA;IACb,yGAAyG;IACzG;;OAEG;IACH,kDAA+B,CAAA;IAC/B;;OAEG;IACH,4CAAyB,CAAA;AAC3B,CAAC,EAfW,eAAe,+BAAf,eAAe,QAe1B"}
|