@craftedxp/sdk-node 0.2.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/CONSUMING.md +119 -0
- package/DEVELOPING.md +82 -0
- package/README.md +151 -0
- package/dist/index.d.mts +434 -0
- package/dist/index.d.ts +434 -0
- package/dist/index.js +477 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +438 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +46 -0
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
interface HttpClientOptions {
|
|
2
|
+
apiKey: string;
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
timeoutMs?: number;
|
|
5
|
+
maxRetries?: number;
|
|
6
|
+
fetch?: typeof fetch;
|
|
7
|
+
onRequest?: (info: {
|
|
8
|
+
method: string;
|
|
9
|
+
url: string;
|
|
10
|
+
status: number;
|
|
11
|
+
durationMs: number;
|
|
12
|
+
attempt: number;
|
|
13
|
+
}) => void;
|
|
14
|
+
}
|
|
15
|
+
interface HttpRequest {
|
|
16
|
+
method: 'GET' | 'POST' | 'PATCH' | 'DELETE';
|
|
17
|
+
path: string;
|
|
18
|
+
query?: Record<string, string | number | boolean | undefined>;
|
|
19
|
+
body?: unknown;
|
|
20
|
+
formData?: FormData;
|
|
21
|
+
timeoutMs?: number;
|
|
22
|
+
headers?: Record<string, string>;
|
|
23
|
+
}
|
|
24
|
+
declare const createHttpClient: (opts: HttpClientOptions) => {
|
|
25
|
+
request: <T>(req: HttpRequest) => Promise<T>;
|
|
26
|
+
};
|
|
27
|
+
type HttpClient = ReturnType<typeof createHttpClient>;
|
|
28
|
+
|
|
29
|
+
type TtsProvider = 'pockettts' | 'cartesia' | 'fish-audio' | 'gemini';
|
|
30
|
+
type SttProvider = 'deepgram';
|
|
31
|
+
type LlmProvider = 'gemini' | 'openai' | 'anthropic';
|
|
32
|
+
type EndpointingMode = 'smart' | 'simple';
|
|
33
|
+
interface AgentVoice {
|
|
34
|
+
provider: TtsProvider;
|
|
35
|
+
voiceId?: string;
|
|
36
|
+
language?: string;
|
|
37
|
+
}
|
|
38
|
+
interface AgentTranscriber {
|
|
39
|
+
provider: SttProvider;
|
|
40
|
+
model: string;
|
|
41
|
+
language?: string;
|
|
42
|
+
}
|
|
43
|
+
interface AgentModel {
|
|
44
|
+
provider: LlmProvider;
|
|
45
|
+
model: string;
|
|
46
|
+
temperature?: number;
|
|
47
|
+
maxTokens?: number;
|
|
48
|
+
systemPromptOverride?: string;
|
|
49
|
+
apiKey?: string;
|
|
50
|
+
hasApiKey?: boolean;
|
|
51
|
+
}
|
|
52
|
+
interface AgentEndpointing {
|
|
53
|
+
silenceThresholdMs: number;
|
|
54
|
+
mode: EndpointingMode;
|
|
55
|
+
}
|
|
56
|
+
interface AgentHttpTool {
|
|
57
|
+
toolId?: string;
|
|
58
|
+
type: 'http';
|
|
59
|
+
name: string;
|
|
60
|
+
description: string;
|
|
61
|
+
parameters?: Record<string, unknown>;
|
|
62
|
+
url: string;
|
|
63
|
+
method: 'GET' | 'POST' | 'PUT' | 'PATCH';
|
|
64
|
+
headers?: Record<string, string>;
|
|
65
|
+
timeoutMs?: number;
|
|
66
|
+
}
|
|
67
|
+
type AgentTool = AgentHttpTool;
|
|
68
|
+
interface AgentRecording {
|
|
69
|
+
enabled: boolean;
|
|
70
|
+
retentionDays?: number;
|
|
71
|
+
}
|
|
72
|
+
interface Agent {
|
|
73
|
+
agentId: string;
|
|
74
|
+
orgId: string;
|
|
75
|
+
name: string;
|
|
76
|
+
systemPrompt: string;
|
|
77
|
+
firstMessage: string;
|
|
78
|
+
voice: AgentVoice;
|
|
79
|
+
transcriber: AgentTranscriber;
|
|
80
|
+
model: AgentModel;
|
|
81
|
+
endpointing: AgentEndpointing;
|
|
82
|
+
maxDurationSeconds: number;
|
|
83
|
+
silenceTimeoutSeconds: number;
|
|
84
|
+
tools?: AgentTool[];
|
|
85
|
+
knowledgeBaseId?: string;
|
|
86
|
+
recording?: AgentRecording;
|
|
87
|
+
structuredDataSchema?: Record<string, unknown>;
|
|
88
|
+
createdAt: number;
|
|
89
|
+
updatedAt: number;
|
|
90
|
+
}
|
|
91
|
+
interface AgentCreateInput {
|
|
92
|
+
name: string;
|
|
93
|
+
systemPrompt: string;
|
|
94
|
+
firstMessage?: string;
|
|
95
|
+
voice?: AgentVoice;
|
|
96
|
+
transcriber?: AgentTranscriber;
|
|
97
|
+
model?: AgentModel;
|
|
98
|
+
endpointing?: AgentEndpointing;
|
|
99
|
+
maxDurationSeconds?: number;
|
|
100
|
+
silenceTimeoutSeconds?: number;
|
|
101
|
+
tools?: AgentTool[];
|
|
102
|
+
knowledgeBaseId?: string;
|
|
103
|
+
recording?: AgentRecording;
|
|
104
|
+
structuredDataSchema?: Record<string, unknown>;
|
|
105
|
+
}
|
|
106
|
+
type AgentUpdateInput = Partial<AgentCreateInput>;
|
|
107
|
+
type CallStatus = 'queued' | 'ringing' | 'in_progress' | 'completed' | 'failed' | 'no_answer';
|
|
108
|
+
type EndReason = 'caller_hung_up' | 'agent_ended' | 'max_duration' | 'silence_timeout' | 'error';
|
|
109
|
+
interface TranscriptTurn {
|
|
110
|
+
role: 'user' | 'assistant';
|
|
111
|
+
text: string;
|
|
112
|
+
startMs: number;
|
|
113
|
+
endMs: number;
|
|
114
|
+
}
|
|
115
|
+
interface CostBreakdown {
|
|
116
|
+
sttCents: number;
|
|
117
|
+
llmCents: number;
|
|
118
|
+
ttsCents: number;
|
|
119
|
+
infraCents: number;
|
|
120
|
+
totalCents: number;
|
|
121
|
+
}
|
|
122
|
+
interface RecordingMeta {
|
|
123
|
+
ready: boolean;
|
|
124
|
+
sampleRate: number;
|
|
125
|
+
callerGsUri?: string;
|
|
126
|
+
agentGsUri?: string;
|
|
127
|
+
mixedGsUri?: string;
|
|
128
|
+
callerBytes?: number;
|
|
129
|
+
agentBytes?: number;
|
|
130
|
+
mixError?: string;
|
|
131
|
+
}
|
|
132
|
+
interface CallRecord {
|
|
133
|
+
callId: string;
|
|
134
|
+
orgId: string;
|
|
135
|
+
agentId: string;
|
|
136
|
+
direction: 'inbound' | 'outbound';
|
|
137
|
+
from: string;
|
|
138
|
+
to: string;
|
|
139
|
+
status: CallStatus;
|
|
140
|
+
startedAt: number;
|
|
141
|
+
answeredAt?: number;
|
|
142
|
+
endedAt?: number;
|
|
143
|
+
durationSeconds?: number;
|
|
144
|
+
endReason?: EndReason;
|
|
145
|
+
transcript?: TranscriptTurn[];
|
|
146
|
+
summary?: string;
|
|
147
|
+
structuredData?: Record<string, unknown>;
|
|
148
|
+
recording?: RecordingMeta;
|
|
149
|
+
costBreakdown?: CostBreakdown;
|
|
150
|
+
errorMessage?: string;
|
|
151
|
+
metadata?: Record<string, string>;
|
|
152
|
+
}
|
|
153
|
+
interface CallListFilters {
|
|
154
|
+
agentId?: string;
|
|
155
|
+
status?: CallStatus;
|
|
156
|
+
limit?: number;
|
|
157
|
+
}
|
|
158
|
+
type CallSummary = Omit<CallRecord, 'transcript'> & {
|
|
159
|
+
turnCount?: number;
|
|
160
|
+
};
|
|
161
|
+
interface CallRecordingUrlResponse {
|
|
162
|
+
url: string;
|
|
163
|
+
ready: boolean;
|
|
164
|
+
artifact: 'mixed' | 'caller-raw';
|
|
165
|
+
mixError?: string;
|
|
166
|
+
}
|
|
167
|
+
interface KnowledgeBase {
|
|
168
|
+
kbId: string;
|
|
169
|
+
orgId: string;
|
|
170
|
+
name: string;
|
|
171
|
+
status: 'processing' | 'ready' | 'error';
|
|
172
|
+
fileCount: number;
|
|
173
|
+
chunkCount: number;
|
|
174
|
+
embeddingModel: string;
|
|
175
|
+
createdAt: number;
|
|
176
|
+
updatedAt: number;
|
|
177
|
+
}
|
|
178
|
+
interface KnowledgeBaseFile {
|
|
179
|
+
fileId: string;
|
|
180
|
+
kbId: string;
|
|
181
|
+
orgId: string;
|
|
182
|
+
filename: string;
|
|
183
|
+
mimeType: string;
|
|
184
|
+
sizeBytes: number;
|
|
185
|
+
status: 'processing' | 'ready' | 'error';
|
|
186
|
+
chunkCount: number;
|
|
187
|
+
uploadedAt: number;
|
|
188
|
+
processedAt?: number;
|
|
189
|
+
errorMessage?: string;
|
|
190
|
+
}
|
|
191
|
+
interface LedgerEntry {
|
|
192
|
+
entryId: string;
|
|
193
|
+
orgId: string;
|
|
194
|
+
type: 'debit' | 'credit';
|
|
195
|
+
amountCents: number;
|
|
196
|
+
description: string;
|
|
197
|
+
callId?: string;
|
|
198
|
+
balanceAfterCents: number;
|
|
199
|
+
createdAt: number;
|
|
200
|
+
meta?: Record<string, string>;
|
|
201
|
+
}
|
|
202
|
+
interface CallTokenMintInput {
|
|
203
|
+
agentId: string;
|
|
204
|
+
ttlSeconds?: number;
|
|
205
|
+
/**
|
|
206
|
+
* Phase 12: arbitrary nested-JSON context. The server lowers this into
|
|
207
|
+
* the agent's effective system prompt at session open. Use when your
|
|
208
|
+
* per-call data doesn't fit `vars`'s flat primitive shape (action
|
|
209
|
+
* lists, structured user state, fresh data the agent should know).
|
|
210
|
+
* Wins over `vars` server-side when both are supplied.
|
|
211
|
+
*/
|
|
212
|
+
context?: Record<string, unknown>;
|
|
213
|
+
/**
|
|
214
|
+
* Phase 12: opaque key/value pairs round-tripped on the `call.ended`
|
|
215
|
+
* webhook payload. NOT lowered into the system prompt — the LLM never
|
|
216
|
+
* sees these. Use for routing / billing / device identifiers your
|
|
217
|
+
* backend wants to correlate post-call (`deviceId`, `tier`,
|
|
218
|
+
* `experimentArm`). Capped at 1 KB total at mint validation; mint
|
|
219
|
+
* fails with HTTP 400 if you exceed it.
|
|
220
|
+
*/
|
|
221
|
+
metadata?: Record<string, string>;
|
|
222
|
+
/**
|
|
223
|
+
* Stable end-user identifier baked into the token. Round-tripped to
|
|
224
|
+
* the server as `contactId` for cross-call memory. 1–128 chars.
|
|
225
|
+
*/
|
|
226
|
+
contactId?: string;
|
|
227
|
+
/**
|
|
228
|
+
* Legacy flat key/value rendered into `{{placeholders}}` in the
|
|
229
|
+
* agent's static system prompt. Phase 12 superseded by `context` for
|
|
230
|
+
* new integrations. Kept for backward compat with 0.1.x SDK
|
|
231
|
+
* consumers.
|
|
232
|
+
*/
|
|
233
|
+
vars?: Record<string, string | number | boolean>;
|
|
234
|
+
allowedOrigins?: string[];
|
|
235
|
+
}
|
|
236
|
+
interface CallTokenMintResult {
|
|
237
|
+
tokenId: string;
|
|
238
|
+
token: string;
|
|
239
|
+
agentId: string;
|
|
240
|
+
expiresAt: number;
|
|
241
|
+
allowedOrigins?: string[];
|
|
242
|
+
}
|
|
243
|
+
interface CallTokenSummary {
|
|
244
|
+
tokenId: string;
|
|
245
|
+
agentId: string;
|
|
246
|
+
createdAt: number;
|
|
247
|
+
expiresAt: number;
|
|
248
|
+
lastUsedAt?: number;
|
|
249
|
+
revoked: boolean;
|
|
250
|
+
allowedOrigins?: string[];
|
|
251
|
+
}
|
|
252
|
+
type PlatformEventName = 'call.started' | 'call.ended' | 'transcript.updated' | 'call.summary.ready' | 'tool.call.requested' | 'tool.call.completed' | 'tool.call.failed' | 'credits.low';
|
|
253
|
+
interface WebhookConfig {
|
|
254
|
+
webhookId: string;
|
|
255
|
+
orgId: string;
|
|
256
|
+
agentId: string;
|
|
257
|
+
url: string;
|
|
258
|
+
events: PlatformEventName[];
|
|
259
|
+
active: boolean;
|
|
260
|
+
createdAt: number;
|
|
261
|
+
updatedAt: number;
|
|
262
|
+
secret?: string;
|
|
263
|
+
}
|
|
264
|
+
interface WebhookCreateInput {
|
|
265
|
+
url: string;
|
|
266
|
+
events: PlatformEventName[];
|
|
267
|
+
active?: boolean;
|
|
268
|
+
}
|
|
269
|
+
type WebhookUpdateInput = Partial<WebhookCreateInput>;
|
|
270
|
+
interface WebhookDelivery {
|
|
271
|
+
deliveryId: string;
|
|
272
|
+
orgId: string;
|
|
273
|
+
agentId: string;
|
|
274
|
+
webhookId: string;
|
|
275
|
+
event: PlatformEventName;
|
|
276
|
+
callId?: string;
|
|
277
|
+
url: string;
|
|
278
|
+
status: 'pending' | 'delivered' | 'failed';
|
|
279
|
+
attempts: Array<{
|
|
280
|
+
attempt: number;
|
|
281
|
+
startedAt: number;
|
|
282
|
+
durationMs: number;
|
|
283
|
+
statusCode?: number;
|
|
284
|
+
errorMessage?: string;
|
|
285
|
+
}>;
|
|
286
|
+
createdAt: number;
|
|
287
|
+
completedAt?: number;
|
|
288
|
+
requestBodyPreview: string;
|
|
289
|
+
lastResponseBodyPreview?: string;
|
|
290
|
+
}
|
|
291
|
+
interface MeResponse {
|
|
292
|
+
orgId: string;
|
|
293
|
+
name: string;
|
|
294
|
+
email: string;
|
|
295
|
+
plan: 'free' | 'paid';
|
|
296
|
+
creditBalance: number;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
declare const createMeResource: (http: HttpClient) => {
|
|
300
|
+
get: () => Promise<MeResponse>;
|
|
301
|
+
};
|
|
302
|
+
type MeResource = ReturnType<typeof createMeResource>;
|
|
303
|
+
|
|
304
|
+
declare const createAgentWebhooksResource: (http: HttpClient, agentId: string) => {
|
|
305
|
+
create: (input: WebhookCreateInput) => Promise<WebhookConfig>;
|
|
306
|
+
list: () => Promise<WebhookConfig[]>;
|
|
307
|
+
get: (webhookId: string) => Promise<WebhookConfig>;
|
|
308
|
+
update: (webhookId: string, patch: WebhookUpdateInput) => Promise<WebhookConfig>;
|
|
309
|
+
delete: (webhookId: string) => Promise<void>;
|
|
310
|
+
test: (webhookId: string) => Promise<WebhookDelivery>;
|
|
311
|
+
};
|
|
312
|
+
type AgentWebhooksResource = ReturnType<typeof createAgentWebhooksResource>;
|
|
313
|
+
|
|
314
|
+
declare const createAgentsResource: (http: HttpClient) => {
|
|
315
|
+
create: (input: AgentCreateInput) => Promise<Agent>;
|
|
316
|
+
list: () => Promise<Agent[]>;
|
|
317
|
+
listAll: () => AsyncIterable<Agent>;
|
|
318
|
+
get: (agentId: string) => Promise<Agent>;
|
|
319
|
+
update: (agentId: string, patch: AgentUpdateInput) => Promise<Agent>;
|
|
320
|
+
delete: (agentId: string) => Promise<void>;
|
|
321
|
+
webhooks: (agentId: string) => AgentWebhooksResource;
|
|
322
|
+
};
|
|
323
|
+
type AgentsResource = ReturnType<typeof createAgentsResource>;
|
|
324
|
+
|
|
325
|
+
declare const createCallsResource: (http: HttpClient) => {
|
|
326
|
+
list: (filters?: CallListFilters) => Promise<CallSummary[]>;
|
|
327
|
+
listAll: (filters?: CallListFilters) => AsyncIterable<CallSummary>;
|
|
328
|
+
get: (callId: string) => Promise<CallRecord>;
|
|
329
|
+
transcript: (callId: string) => Promise<{
|
|
330
|
+
callId: string;
|
|
331
|
+
transcript: TranscriptTurn[];
|
|
332
|
+
}>;
|
|
333
|
+
recording: (callId: string) => Promise<CallRecordingUrlResponse>;
|
|
334
|
+
};
|
|
335
|
+
type CallsResource = ReturnType<typeof createCallsResource>;
|
|
336
|
+
|
|
337
|
+
declare const createKnowledgeBasesResource: (http: HttpClient) => {
|
|
338
|
+
create: (name: string) => Promise<KnowledgeBase>;
|
|
339
|
+
list: () => Promise<KnowledgeBase[]>;
|
|
340
|
+
get: (kbId: string) => Promise<KnowledgeBase>;
|
|
341
|
+
delete: (kbId: string) => Promise<void>;
|
|
342
|
+
uploadFile: (kbId: string, source: {
|
|
343
|
+
path: string;
|
|
344
|
+
filename?: string;
|
|
345
|
+
mimeType?: string;
|
|
346
|
+
} | {
|
|
347
|
+
data: Buffer | Uint8Array;
|
|
348
|
+
filename: string;
|
|
349
|
+
mimeType?: string;
|
|
350
|
+
}) => Promise<KnowledgeBaseFile>;
|
|
351
|
+
listFiles: (kbId: string) => Promise<KnowledgeBaseFile[]>;
|
|
352
|
+
deleteFile: (kbId: string, fileId: string) => Promise<void>;
|
|
353
|
+
};
|
|
354
|
+
type KnowledgeBasesResource = ReturnType<typeof createKnowledgeBasesResource>;
|
|
355
|
+
|
|
356
|
+
declare const createCreditsResource: (http: HttpClient) => {
|
|
357
|
+
getBalance: () => Promise<{
|
|
358
|
+
orgId: string;
|
|
359
|
+
balanceCents: number;
|
|
360
|
+
}>;
|
|
361
|
+
getLedger: (opts?: {
|
|
362
|
+
limit?: number;
|
|
363
|
+
}) => Promise<LedgerEntry[]>;
|
|
364
|
+
getLedgerAll: (opts?: {
|
|
365
|
+
limit?: number;
|
|
366
|
+
}) => AsyncIterable<LedgerEntry>;
|
|
367
|
+
};
|
|
368
|
+
type CreditsResource = ReturnType<typeof createCreditsResource>;
|
|
369
|
+
|
|
370
|
+
declare const createCallTokensResource: (http: HttpClient) => {
|
|
371
|
+
mint: (input: CallTokenMintInput) => Promise<CallTokenMintResult>;
|
|
372
|
+
list: (opts?: {
|
|
373
|
+
includeRevoked?: boolean;
|
|
374
|
+
includeExpired?: boolean;
|
|
375
|
+
limit?: number;
|
|
376
|
+
}) => Promise<CallTokenSummary[]>;
|
|
377
|
+
revoke: (tokenId: string) => Promise<{
|
|
378
|
+
tokenId: string;
|
|
379
|
+
revoked: boolean;
|
|
380
|
+
alreadyRevoked?: boolean;
|
|
381
|
+
}>;
|
|
382
|
+
};
|
|
383
|
+
type CallTokensResource = ReturnType<typeof createCallTokensResource>;
|
|
384
|
+
|
|
385
|
+
declare const createWebhooksResource: (http: HttpClient) => {
|
|
386
|
+
deliveries: (filters?: {
|
|
387
|
+
agentId?: string;
|
|
388
|
+
webhookId?: string;
|
|
389
|
+
callId?: string;
|
|
390
|
+
limit?: number;
|
|
391
|
+
}) => Promise<WebhookDelivery[]>;
|
|
392
|
+
};
|
|
393
|
+
type WebhooksResource = ReturnType<typeof createWebhooksResource>;
|
|
394
|
+
|
|
395
|
+
interface PlatformClientOptions {
|
|
396
|
+
apiKey: string;
|
|
397
|
+
baseUrl?: string;
|
|
398
|
+
timeoutMs?: number;
|
|
399
|
+
maxRetries?: number;
|
|
400
|
+
fetch?: HttpClientOptions['fetch'];
|
|
401
|
+
onRequest?: HttpClientOptions['onRequest'];
|
|
402
|
+
}
|
|
403
|
+
declare class PlatformClient {
|
|
404
|
+
readonly me: MeResource;
|
|
405
|
+
readonly agents: AgentsResource;
|
|
406
|
+
readonly calls: CallsResource;
|
|
407
|
+
readonly knowledgeBases: KnowledgeBasesResource;
|
|
408
|
+
readonly credits: CreditsResource;
|
|
409
|
+
readonly callTokens: CallTokensResource;
|
|
410
|
+
readonly webhooks: WebhooksResource;
|
|
411
|
+
constructor(options: PlatformClientOptions);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
type ApiErrorCode = 'unauthorized' | 'forbidden' | 'not_found' | 'bad_request' | 'conflict' | 'rate_limited' | 'payment_required' | 'internal_error' | 'unknown';
|
|
415
|
+
declare class PlatformError extends Error {
|
|
416
|
+
readonly code: ApiErrorCode;
|
|
417
|
+
readonly status: number;
|
|
418
|
+
readonly field?: string;
|
|
419
|
+
readonly docsUrl?: string;
|
|
420
|
+
readonly body?: unknown;
|
|
421
|
+
constructor(params: {
|
|
422
|
+
code: ApiErrorCode;
|
|
423
|
+
message: string;
|
|
424
|
+
status: number;
|
|
425
|
+
field?: string;
|
|
426
|
+
docsUrl?: string;
|
|
427
|
+
body?: unknown;
|
|
428
|
+
});
|
|
429
|
+
toJSON(): Record<string, unknown>;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
declare const verifyWebhookSignature: (rawBody: Buffer | string, signatureHeader: string, secret: string) => boolean;
|
|
433
|
+
|
|
434
|
+
export { type Agent, type AgentCreateInput, type AgentEndpointing, type AgentHttpTool, type AgentModel, type AgentRecording, type AgentTool, type AgentTranscriber, type AgentUpdateInput, type AgentVoice, type AgentWebhooksResource, type AgentsResource, type ApiErrorCode, type CallListFilters, type CallRecord, type CallRecordingUrlResponse, type CallStatus, type CallSummary, type CallTokenMintInput, type CallTokenMintResult, type CallTokenSummary, type CallTokensResource, type CallsResource, type CostBreakdown, type CreditsResource, type EndReason, type EndpointingMode, type KnowledgeBase, type KnowledgeBaseFile, type KnowledgeBasesResource, type LedgerEntry, type LlmProvider, type MeResource, type MeResponse, PlatformClient, type PlatformClientOptions, PlatformError, type PlatformEventName, type RecordingMeta, type SttProvider, type TranscriptTurn, type TtsProvider, type WebhookConfig, type WebhookCreateInput, type WebhookDelivery, type WebhookUpdateInput, type WebhooksResource, verifyWebhookSignature };
|