@activepieces/piece-bland-ai 0.1.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/package.json +16 -0
- package/src/index.d.ts +2 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +36 -0
- package/src/index.js.map +1 -0
- package/src/lib/actions/get-call-details.d.ts +4 -0
- package/src/lib/actions/get-call-details.d.ts.map +1 -0
- package/src/lib/actions/get-call-details.js +31 -0
- package/src/lib/actions/get-call-details.js.map +1 -0
- package/src/lib/actions/list-calls.d.ts +6 -0
- package/src/lib/actions/list-calls.d.ts.map +1 -0
- package/src/lib/actions/list-calls.js +46 -0
- package/src/lib/actions/list-calls.js.map +1 -0
- package/src/lib/actions/send-call.d.ts +16 -0
- package/src/lib/actions/send-call.d.ts.map +1 -0
- package/src/lib/actions/send-call.js +145 -0
- package/src/lib/actions/send-call.js.map +1 -0
- package/src/lib/auth.d.ts +3 -0
- package/src/lib/auth.d.ts.map +1 -0
- package/src/lib/auth.js +52 -0
- package/src/lib/auth.js.map +1 -0
- package/src/lib/common/client.d.ts +9 -0
- package/src/lib/common/client.d.ts.map +1 -0
- package/src/lib/common/client.js +22 -0
- package/src/lib/common/client.js.map +1 -0
package/package.json
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@activepieces/piece-bland-ai",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"main": "./src/index.js",
|
|
5
|
+
"types": "./src/index.d.ts",
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"@activepieces/pieces-common": "0.12.0",
|
|
8
|
+
"@activepieces/pieces-framework": "0.26.0",
|
|
9
|
+
"@activepieces/shared": "0.47.0",
|
|
10
|
+
"tslib": "2.6.2"
|
|
11
|
+
},
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc -p tsconfig.lib.json && cp package.json dist/",
|
|
14
|
+
"lint": "eslint 'src/**/*.ts'"
|
|
15
|
+
}
|
|
16
|
+
}
|
package/src/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,OAAO,mHAqBlB,CAAC"}
|
package/src/index.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.blandAi = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const pieces_common_1 = require("@activepieces/pieces-common");
|
|
6
|
+
const pieces_framework_1 = require("@activepieces/pieces-framework");
|
|
7
|
+
const shared_1 = require("@activepieces/shared");
|
|
8
|
+
const auth_1 = require("./lib/auth");
|
|
9
|
+
const send_call_1 = require("./lib/actions/send-call");
|
|
10
|
+
const get_call_details_1 = require("./lib/actions/get-call-details");
|
|
11
|
+
const list_calls_1 = require("./lib/actions/list-calls");
|
|
12
|
+
exports.blandAi = (0, pieces_framework_1.createPiece)({
|
|
13
|
+
displayName: 'Bland AI',
|
|
14
|
+
description: 'AI phone calling platform for outbound and conversational voice workflows.',
|
|
15
|
+
minimumSupportedRelease: '0.30.0',
|
|
16
|
+
logoUrl: 'https://cdn.activepieces.com/pieces/bland-ai.png',
|
|
17
|
+
categories: [shared_1.PieceCategory.COMMUNICATION],
|
|
18
|
+
auth: auth_1.blandAiAuth,
|
|
19
|
+
authors: ['Harmatta'],
|
|
20
|
+
actions: [
|
|
21
|
+
send_call_1.sendCall,
|
|
22
|
+
get_call_details_1.getCallDetails,
|
|
23
|
+
list_calls_1.listCalls,
|
|
24
|
+
(0, pieces_common_1.createCustomApiCallAction)({
|
|
25
|
+
auth: auth_1.blandAiAuth,
|
|
26
|
+
baseUrl: () => auth_1.BLAND_AI_BASE_URL,
|
|
27
|
+
authMapping: (auth) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
28
|
+
return ({
|
|
29
|
+
authorization: auth.secret_text,
|
|
30
|
+
});
|
|
31
|
+
}),
|
|
32
|
+
}),
|
|
33
|
+
],
|
|
34
|
+
triggers: [],
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;AAAA,+DAAwE;AACxE,qEAA6D;AAC7D,iDAAqD;AACrD,qCAA4D;AAC5D,uDAAmD;AACnD,qEAAgE;AAChE,yDAAqD;AAExC,QAAA,OAAO,GAAG,IAAA,8BAAW,EAAC;IACjC,WAAW,EAAE,UAAU;IACvB,WAAW,EAAE,4EAA4E;IACzF,uBAAuB,EAAE,QAAQ;IACjC,OAAO,EAAE,kDAAkD;IAC3D,UAAU,EAAE,CAAC,sBAAa,CAAC,aAAa,CAAC;IACzC,IAAI,EAAE,kBAAW;IACjB,OAAO,EAAE,CAAC,UAAU,CAAC;IACrB,OAAO,EAAE;QACP,oBAAQ;QACR,iCAAc;QACd,sBAAS;QACT,IAAA,yCAAyB,EAAC;YACxB,IAAI,EAAE,kBAAW;YACjB,OAAO,EAAE,GAAG,EAAE,CAAC,wBAAiB;YAChC,WAAW,EAAE,CAAO,IAAI,EAAE,EAAE;gBAAC,OAAA,CAAC;oBAC5B,aAAa,EAAE,IAAI,CAAC,WAAW;iBAChC,CAAC,CAAA;cAAA;SACH,CAAC;KACH;IACD,QAAQ,EAAE,EAAE;CACb,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const getCallDetails: import("@activepieces/pieces-framework").IAction<import("@activepieces/pieces-framework").SecretTextProperty<true>, {
|
|
2
|
+
callId: import("@activepieces/pieces-framework").ShortTextProperty<true>;
|
|
3
|
+
}>;
|
|
4
|
+
//# sourceMappingURL=get-call-details.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-call-details.d.ts","sourceRoot":"","sources":["../../../../src/lib/actions/get-call-details.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,cAAc;;EAmBzB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCallDetails = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const pieces_common_1 = require("@activepieces/pieces-common");
|
|
6
|
+
const pieces_framework_1 = require("@activepieces/pieces-framework");
|
|
7
|
+
const auth_1 = require("../auth");
|
|
8
|
+
const client_1 = require("../common/client");
|
|
9
|
+
exports.getCallDetails = (0, pieces_framework_1.createAction)({
|
|
10
|
+
auth: auth_1.blandAiAuth,
|
|
11
|
+
name: 'get_call_details',
|
|
12
|
+
displayName: 'Get Call Details',
|
|
13
|
+
description: 'Retrieve details for a specific Bland AI call.',
|
|
14
|
+
props: {
|
|
15
|
+
callId: pieces_framework_1.Property.ShortText({
|
|
16
|
+
displayName: 'Call ID',
|
|
17
|
+
description: 'The Bland AI call identifier.',
|
|
18
|
+
required: true,
|
|
19
|
+
}),
|
|
20
|
+
},
|
|
21
|
+
run(context) {
|
|
22
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
23
|
+
return (0, client_1.blandApiCall)({
|
|
24
|
+
apiKey: context.auth.secret_text,
|
|
25
|
+
method: pieces_common_1.HttpMethod.GET,
|
|
26
|
+
path: `/calls/${encodeURIComponent(context.propsValue.callId)}`,
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=get-call-details.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-call-details.js","sourceRoot":"","sources":["../../../../src/lib/actions/get-call-details.ts"],"names":[],"mappings":";;;;AAAA,+DAAyD;AACzD,qEAAwE;AACxE,kCAAsC;AACtC,6CAAgD;AAEnC,QAAA,cAAc,GAAG,IAAA,+BAAY,EAAC;IACzC,IAAI,EAAE,kBAAW;IACjB,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,kBAAkB;IAC/B,WAAW,EAAE,gDAAgD;IAC7D,KAAK,EAAE;QACL,MAAM,EAAE,2BAAQ,CAAC,SAAS,CAAC;YACzB,WAAW,EAAE,SAAS;YACtB,WAAW,EAAE,+BAA+B;YAC5C,QAAQ,EAAE,IAAI;SACf,CAAC;KACH;IACK,GAAG,CAAC,OAAO;;YACf,OAAO,IAAA,qBAAY,EAAC;gBAClB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW;gBAChC,MAAM,EAAE,0BAAU,CAAC,GAAG;gBACtB,IAAI,EAAE,UAAU,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;aAChE,CAAC,CAAC;QACL,CAAC;KAAA;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const listCalls: import("@activepieces/pieces-framework").IAction<import("@activepieces/pieces-framework").SecretTextProperty<true>, {
|
|
2
|
+
limit: import("@activepieces/pieces-framework").NumberProperty<false>;
|
|
3
|
+
fromNumber: import("@activepieces/pieces-framework").ShortTextProperty<false>;
|
|
4
|
+
toNumber: import("@activepieces/pieces-framework").ShortTextProperty<false>;
|
|
5
|
+
}>;
|
|
6
|
+
//# sourceMappingURL=list-calls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-calls.d.ts","sourceRoot":"","sources":["../../../../src/lib/actions/list-calls.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,SAAS;;;;EAuCpB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listCalls = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const pieces_common_1 = require("@activepieces/pieces-common");
|
|
6
|
+
const pieces_framework_1 = require("@activepieces/pieces-framework");
|
|
7
|
+
const auth_1 = require("../auth");
|
|
8
|
+
const client_1 = require("../common/client");
|
|
9
|
+
exports.listCalls = (0, pieces_framework_1.createAction)({
|
|
10
|
+
auth: auth_1.blandAiAuth,
|
|
11
|
+
name: 'list_calls',
|
|
12
|
+
displayName: 'List Calls',
|
|
13
|
+
description: 'List recent Bland AI calls with optional filters.',
|
|
14
|
+
props: {
|
|
15
|
+
limit: pieces_framework_1.Property.Number({
|
|
16
|
+
displayName: 'Limit',
|
|
17
|
+
description: 'Maximum number of calls to return.',
|
|
18
|
+
required: false,
|
|
19
|
+
defaultValue: 10,
|
|
20
|
+
}),
|
|
21
|
+
fromNumber: pieces_framework_1.Property.ShortText({
|
|
22
|
+
displayName: 'From Number',
|
|
23
|
+
description: 'Optional origin phone number filter.',
|
|
24
|
+
required: false,
|
|
25
|
+
}),
|
|
26
|
+
toNumber: pieces_framework_1.Property.ShortText({
|
|
27
|
+
displayName: 'To Number',
|
|
28
|
+
description: 'Optional destination phone number filter.',
|
|
29
|
+
required: false,
|
|
30
|
+
}),
|
|
31
|
+
},
|
|
32
|
+
run(context) {
|
|
33
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
34
|
+
const { limit, fromNumber, toNumber } = context.propsValue;
|
|
35
|
+
const safeLimit = Math.max(1, Math.min(100, limit !== null && limit !== void 0 ? limit : 10));
|
|
36
|
+
const query = Object.assign(Object.assign({ limit: String(safeLimit) }, (fromNumber ? { from_number: fromNumber } : {})), (toNumber ? { to_number: toNumber } : {}));
|
|
37
|
+
return (0, client_1.blandApiCall)({
|
|
38
|
+
apiKey: context.auth.secret_text,
|
|
39
|
+
method: pieces_common_1.HttpMethod.GET,
|
|
40
|
+
path: '/calls',
|
|
41
|
+
query,
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=list-calls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-calls.js","sourceRoot":"","sources":["../../../../src/lib/actions/list-calls.ts"],"names":[],"mappings":";;;;AAAA,+DAAyD;AACzD,qEAAwE;AACxE,kCAAsC;AACtC,6CAAgD;AAEnC,QAAA,SAAS,GAAG,IAAA,+BAAY,EAAC;IACpC,IAAI,EAAE,kBAAW;IACjB,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,YAAY;IACzB,WAAW,EAAE,mDAAmD;IAChE,KAAK,EAAE;QACL,KAAK,EAAE,2BAAQ,CAAC,MAAM,CAAC;YACrB,WAAW,EAAE,OAAO;YACpB,WAAW,EAAE,oCAAoC;YACjD,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,EAAE;SACjB,CAAC;QACF,UAAU,EAAE,2BAAQ,CAAC,SAAS,CAAC;YAC7B,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,sCAAsC;YACnD,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,QAAQ,EAAE,2BAAQ,CAAC,SAAS,CAAC;YAC3B,WAAW,EAAE,WAAW;YACxB,WAAW,EAAE,2CAA2C;YACxD,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH;IACK,GAAG,CAAC,OAAO;;YACf,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;YAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,EAAE,CAAC,CAAC,CAAC;YAC1D,MAAM,KAAK,iCACT,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,IACrB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAC/C,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC7C,CAAC;YAEF,OAAO,IAAA,qBAAY,EAAC;gBAClB,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW;gBAChC,MAAM,EAAE,0BAAU,CAAC,GAAG;gBACtB,IAAI,EAAE,QAAQ;gBACd,KAAK;aACN,CAAC,CAAC;QACL,CAAC;KAAA;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const sendCall: import("@activepieces/pieces-framework").IAction<import("@activepieces/pieces-framework").SecretTextProperty<true>, {
|
|
2
|
+
phoneNumber: import("@activepieces/pieces-framework").ShortTextProperty<true>;
|
|
3
|
+
task: import("@activepieces/pieces-framework").LongTextProperty<false>;
|
|
4
|
+
pathwayId: import("@activepieces/pieces-framework").ShortTextProperty<false>;
|
|
5
|
+
firstSentence: import("@activepieces/pieces-framework").ShortTextProperty<false>;
|
|
6
|
+
voice: import("@activepieces/pieces-framework").StaticDropdownProperty<string, false>;
|
|
7
|
+
model: import("@activepieces/pieces-framework").StaticDropdownProperty<string, false>;
|
|
8
|
+
language: import("@activepieces/pieces-framework").ShortTextProperty<false>;
|
|
9
|
+
maxDuration: import("@activepieces/pieces-framework").NumberProperty<false>;
|
|
10
|
+
waitForGreeting: import("@activepieces/pieces-framework").CheckboxProperty<false>;
|
|
11
|
+
record: import("@activepieces/pieces-framework").CheckboxProperty<false>;
|
|
12
|
+
transferPhoneNumber: import("@activepieces/pieces-framework").ShortTextProperty<false>;
|
|
13
|
+
webhook: import("@activepieces/pieces-framework").ShortTextProperty<false>;
|
|
14
|
+
summaryPrompt: import("@activepieces/pieces-framework").LongTextProperty<false>;
|
|
15
|
+
}>;
|
|
16
|
+
//# sourceMappingURL=send-call.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-call.d.ts","sourceRoot":"","sources":["../../../../src/lib/actions/send-call.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;EAkJnB,CAAC"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sendCall = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const pieces_common_1 = require("@activepieces/pieces-common");
|
|
6
|
+
const pieces_framework_1 = require("@activepieces/pieces-framework");
|
|
7
|
+
const auth_1 = require("../auth");
|
|
8
|
+
const client_1 = require("../common/client");
|
|
9
|
+
exports.sendCall = (0, pieces_framework_1.createAction)({
|
|
10
|
+
auth: auth_1.blandAiAuth,
|
|
11
|
+
name: 'send_call',
|
|
12
|
+
displayName: 'Send Call',
|
|
13
|
+
description: 'Initiate an AI phone call to a recipient.',
|
|
14
|
+
props: {
|
|
15
|
+
phoneNumber: pieces_framework_1.Property.ShortText({
|
|
16
|
+
displayName: 'Phone Number',
|
|
17
|
+
description: 'The number to call in E.164 format (e.g. +12223334444). Must include the country code.',
|
|
18
|
+
required: true,
|
|
19
|
+
}),
|
|
20
|
+
task: pieces_framework_1.Property.LongText({
|
|
21
|
+
displayName: 'Task',
|
|
22
|
+
description: 'Instructions for the AI agent — what it should say, ask, or accomplish during the call. Not required if using a Pathway ID.',
|
|
23
|
+
required: false,
|
|
24
|
+
}),
|
|
25
|
+
pathwayId: pieces_framework_1.Property.ShortText({
|
|
26
|
+
displayName: 'Pathway ID',
|
|
27
|
+
description: 'UUID of a pre-built Pathway from your Bland AI dashboard. When provided, it overrides the Task field. Find it in the Pathways section of your dashboard.',
|
|
28
|
+
required: false,
|
|
29
|
+
}),
|
|
30
|
+
firstSentence: pieces_framework_1.Property.ShortText({
|
|
31
|
+
displayName: 'First Sentence',
|
|
32
|
+
description: "Exact opening line the agent will say when the call is answered. Leave blank to let the agent decide.",
|
|
33
|
+
required: false,
|
|
34
|
+
}),
|
|
35
|
+
voice: pieces_framework_1.Property.StaticDropdown({
|
|
36
|
+
displayName: 'Voice',
|
|
37
|
+
description: 'The voice the AI agent will use. Choose from Bland AI preset voices optimised for phone quality.',
|
|
38
|
+
required: false,
|
|
39
|
+
defaultValue: 'maya',
|
|
40
|
+
options: {
|
|
41
|
+
options: [
|
|
42
|
+
{ label: 'Maya — Young American Female', value: 'maya' },
|
|
43
|
+
{ label: 'Ryan — Professional American Male', value: 'ryan' },
|
|
44
|
+
{ label: 'Mason — American Male', value: 'mason' },
|
|
45
|
+
{ label: 'Tina — Gentle American Female', value: 'tina' },
|
|
46
|
+
{ label: 'Josh — American Male', value: 'josh' },
|
|
47
|
+
{ label: 'Florian', value: 'florian' },
|
|
48
|
+
{ label: 'Derek', value: 'derek' },
|
|
49
|
+
{ label: 'June', value: 'june' },
|
|
50
|
+
{ label: 'Nat', value: 'nat' },
|
|
51
|
+
{ label: 'Paige', value: 'paige' },
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
}),
|
|
55
|
+
model: pieces_framework_1.Property.StaticDropdown({
|
|
56
|
+
displayName: 'Model',
|
|
57
|
+
description: '"Base" is the standard model. "Turbo" is faster with lower latency, recommended for time-sensitive conversations.',
|
|
58
|
+
required: false,
|
|
59
|
+
defaultValue: 'base',
|
|
60
|
+
options: {
|
|
61
|
+
options: [
|
|
62
|
+
{ label: 'Base (standard)', value: 'base' },
|
|
63
|
+
{ label: 'Turbo (lower latency)', value: 'turbo' },
|
|
64
|
+
],
|
|
65
|
+
},
|
|
66
|
+
}),
|
|
67
|
+
language: pieces_framework_1.Property.ShortText({
|
|
68
|
+
displayName: 'Language',
|
|
69
|
+
description: 'Language code for transcription and speech (e.g. "en", "es", "fr"). Defaults to "babel-en" (English with accent tolerance).',
|
|
70
|
+
required: false,
|
|
71
|
+
}),
|
|
72
|
+
maxDuration: pieces_framework_1.Property.Number({
|
|
73
|
+
displayName: 'Max Duration (minutes)',
|
|
74
|
+
description: 'Maximum call length in minutes. The call ends automatically after this time. Defaults to 30.',
|
|
75
|
+
required: false,
|
|
76
|
+
defaultValue: 30,
|
|
77
|
+
}),
|
|
78
|
+
waitForGreeting: pieces_framework_1.Property.Checkbox({
|
|
79
|
+
displayName: 'Wait for Greeting',
|
|
80
|
+
description: 'When enabled, the AI waits for the recipient to speak first before responding. Useful when calling into IVR systems.',
|
|
81
|
+
required: false,
|
|
82
|
+
defaultValue: false,
|
|
83
|
+
}),
|
|
84
|
+
record: pieces_framework_1.Property.Checkbox({
|
|
85
|
+
displayName: 'Record Call',
|
|
86
|
+
description: 'When enabled, the call is recorded. The recording URL is included in the post-call data.',
|
|
87
|
+
required: false,
|
|
88
|
+
defaultValue: false,
|
|
89
|
+
}),
|
|
90
|
+
transferPhoneNumber: pieces_framework_1.Property.ShortText({
|
|
91
|
+
displayName: 'Transfer Phone Number',
|
|
92
|
+
description: 'E.164 phone number to transfer the call to if the AI decides a human is needed (e.g. +12223334444).',
|
|
93
|
+
required: false,
|
|
94
|
+
}),
|
|
95
|
+
webhook: pieces_framework_1.Property.ShortText({
|
|
96
|
+
displayName: 'Webhook URL',
|
|
97
|
+
description: 'URL that receives a POST request with full call data (transcript, summary, recording URL) after the call ends.',
|
|
98
|
+
required: false,
|
|
99
|
+
}),
|
|
100
|
+
summaryPrompt: pieces_framework_1.Property.LongText({
|
|
101
|
+
displayName: 'Summary Prompt',
|
|
102
|
+
description: 'Custom instructions for how the post-call summary should be written (max 2000 characters). Leave blank to use the default summary format.',
|
|
103
|
+
required: false,
|
|
104
|
+
}),
|
|
105
|
+
},
|
|
106
|
+
run(context) {
|
|
107
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
108
|
+
const { phoneNumber, task, pathwayId, firstSentence, voice, model, language, maxDuration, waitForGreeting, record, transferPhoneNumber, webhook, summaryPrompt, } = context.propsValue;
|
|
109
|
+
const body = {
|
|
110
|
+
phone_number: phoneNumber,
|
|
111
|
+
};
|
|
112
|
+
if (task)
|
|
113
|
+
body['task'] = task;
|
|
114
|
+
if (pathwayId)
|
|
115
|
+
body['pathway_id'] = pathwayId;
|
|
116
|
+
if (firstSentence)
|
|
117
|
+
body['first_sentence'] = firstSentence;
|
|
118
|
+
if (voice)
|
|
119
|
+
body['voice'] = voice;
|
|
120
|
+
if (model)
|
|
121
|
+
body['model'] = model;
|
|
122
|
+
if (language)
|
|
123
|
+
body['language'] = language;
|
|
124
|
+
if (maxDuration !== undefined && maxDuration !== null)
|
|
125
|
+
body['max_duration'] = maxDuration;
|
|
126
|
+
if (waitForGreeting !== undefined)
|
|
127
|
+
body['wait_for_greeting'] = waitForGreeting;
|
|
128
|
+
if (record !== undefined)
|
|
129
|
+
body['record'] = record;
|
|
130
|
+
if (transferPhoneNumber)
|
|
131
|
+
body['transfer_phone_number'] = transferPhoneNumber;
|
|
132
|
+
if (webhook)
|
|
133
|
+
body['webhook'] = webhook;
|
|
134
|
+
if (summaryPrompt)
|
|
135
|
+
body['summary_prompt'] = summaryPrompt;
|
|
136
|
+
return (0, client_1.blandApiCall)({
|
|
137
|
+
apiKey: context.auth.secret_text,
|
|
138
|
+
method: pieces_common_1.HttpMethod.POST,
|
|
139
|
+
path: '/calls',
|
|
140
|
+
body,
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
//# sourceMappingURL=send-call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-call.js","sourceRoot":"","sources":["../../../../src/lib/actions/send-call.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/lib/auth.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,iBAAiB,4BAA4B,CAAC;AAE3D,eAAO,MAAM,WAAW,mEAyCtB,CAAC"}
|
package/src/lib/auth.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.blandAiAuth = exports.BLAND_AI_BASE_URL = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const pieces_framework_1 = require("@activepieces/pieces-framework");
|
|
6
|
+
const pieces_common_1 = require("@activepieces/pieces-common");
|
|
7
|
+
exports.BLAND_AI_BASE_URL = 'https://api.bland.ai/v1';
|
|
8
|
+
exports.blandAiAuth = pieces_framework_1.PieceAuth.SecretText({
|
|
9
|
+
displayName: 'API Key',
|
|
10
|
+
description: `To get your API key:
|
|
11
|
+
1. Log in to your [Bland AI dashboard](https://app.bland.ai)
|
|
12
|
+
2. Go to **Profile** (bottom-left menu) -> **Settings**
|
|
13
|
+
3. Click **API Keys** and copy your key`,
|
|
14
|
+
required: true,
|
|
15
|
+
validate: (_a) => tslib_1.__awaiter(void 0, [_a], void 0, function* ({ auth }) {
|
|
16
|
+
var _b, _c;
|
|
17
|
+
try {
|
|
18
|
+
const response = yield pieces_common_1.httpClient.sendRequest({
|
|
19
|
+
method: pieces_common_1.HttpMethod.GET,
|
|
20
|
+
url: `${exports.BLAND_AI_BASE_URL}/calls`,
|
|
21
|
+
headers: {
|
|
22
|
+
authorization: auth,
|
|
23
|
+
'Content-Type': 'application/json',
|
|
24
|
+
},
|
|
25
|
+
queryParams: {
|
|
26
|
+
limit: '1',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
if (response.status === 200) {
|
|
30
|
+
return { valid: true };
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
valid: false,
|
|
34
|
+
error: `Unexpected status: ${response.status}`,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
const err = e;
|
|
39
|
+
if (((_b = err.response) === null || _b === void 0 ? void 0 : _b.status) === 401 || ((_c = err.response) === null || _c === void 0 ? void 0 : _c.status) === 403) {
|
|
40
|
+
return {
|
|
41
|
+
valid: false,
|
|
42
|
+
error: 'Invalid API key. Please check your Bland AI account settings.',
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
valid: false,
|
|
47
|
+
error: `Connection failed: ${String(e).slice(0, 100)}`,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}),
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/lib/auth.ts"],"names":[],"mappings":";;;;AAAA,qEAA2D;AAC3D,+DAAqE;AAExD,QAAA,iBAAiB,GAAG,yBAAyB,CAAC;AAE9C,QAAA,WAAW,GAAG,4BAAS,CAAC,UAAU,CAAC;IAC9C,WAAW,EAAE,SAAS;IACtB,WAAW,EAAE;;;wCAGyB;IACtC,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,KAAiB,EAAE,oDAAZ,EAAE,IAAI,EAAE;;QACvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,0BAAU,CAAC,WAAW,CAAC;gBAC5C,MAAM,EAAE,0BAAU,CAAC,GAAG;gBACtB,GAAG,EAAE,GAAG,yBAAiB,QAAQ;gBACjC,OAAO,EAAE;oBACP,aAAa,EAAE,IAAI;oBACnB,cAAc,EAAE,kBAAkB;iBACnC;gBACD,WAAW,EAAE;oBACX,KAAK,EAAE,GAAG;iBACX;aACF,CAAC,CAAC;YACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YACzB,CAAC;YACD,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,sBAAsB,QAAQ,CAAC,MAAM,EAAE;aAC/C,CAAC;QACJ,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,CAAuC,CAAC;YACpD,IAAI,CAAA,MAAA,GAAG,CAAC,QAAQ,0CAAE,MAAM,MAAK,GAAG,IAAI,CAAA,MAAA,GAAG,CAAC,QAAQ,0CAAE,MAAM,MAAK,GAAG,EAAE,CAAC;gBACjE,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,+DAA+D;iBACvE,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,sBAAsB,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;aACvD,CAAC;QACJ,CAAC;IACH,CAAC,CAAA;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { HttpMethod } from '@activepieces/pieces-common';
|
|
2
|
+
export declare function blandApiCall<T>(params: {
|
|
3
|
+
apiKey: string;
|
|
4
|
+
method: HttpMethod;
|
|
5
|
+
path: string;
|
|
6
|
+
body?: unknown;
|
|
7
|
+
query?: Record<string, string>;
|
|
8
|
+
}): Promise<T>;
|
|
9
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/lib/common/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAc,MAAM,6BAA6B,CAAC;AAGrE,wBAAsB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC,GAAG,OAAO,CAAC,CAAC,CAAC,CAYb"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.blandApiCall = blandApiCall;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const pieces_common_1 = require("@activepieces/pieces-common");
|
|
6
|
+
const auth_1 = require("../auth");
|
|
7
|
+
function blandApiCall(params) {
|
|
8
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
9
|
+
const response = yield pieces_common_1.httpClient.sendRequest({
|
|
10
|
+
method: params.method,
|
|
11
|
+
url: `${auth_1.BLAND_AI_BASE_URL}${params.path}`,
|
|
12
|
+
headers: {
|
|
13
|
+
authorization: params.apiKey,
|
|
14
|
+
'Content-Type': 'application/json',
|
|
15
|
+
},
|
|
16
|
+
body: params.body,
|
|
17
|
+
queryParams: params.query,
|
|
18
|
+
});
|
|
19
|
+
return response.body;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/lib/common/client.ts"],"names":[],"mappings":";;AAGA,oCAkBC;;AArBD,+DAAqE;AACrE,kCAA4C;AAE5C,SAAsB,YAAY,CAAI,MAMrC;;QACC,MAAM,QAAQ,GAAG,MAAM,0BAAU,CAAC,WAAW,CAAI;YAC/C,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,GAAG,EAAE,GAAG,wBAAiB,GAAG,MAAM,CAAC,IAAI,EAAE;YACzC,OAAO,EAAE;gBACP,aAAa,EAAE,MAAM,CAAC,MAAM;gBAC5B,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,MAAM,CAAC,KAAK;SAC1B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;CAAA"}
|