@ctchealth/plato-sdk 0.0.11 → 0.0.13
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/README.md +397 -10
- package/package.json +4 -3
- package/src/lib/constants.d.ts +16 -0
- package/src/lib/constants.js +20 -0
- package/src/lib/constants.js.map +1 -0
- package/src/lib/plato-intefaces.d.ts +57 -17
- package/src/lib/plato-intefaces.js +24 -1
- package/src/lib/plato-intefaces.js.map +1 -1
- package/src/lib/plato-sdk.d.ts +14 -2
- package/src/lib/plato-sdk.js +169 -5
- package/src/lib/plato-sdk.js.map +1 -1
- package/src/lib/utils.d.ts +24 -0
- package/src/lib/utils.js +70 -0
- package/src/lib/utils.js.map +1 -0
package/README.md
CHANGED
|
@@ -6,6 +6,16 @@ A TypeScript SDK for interacting with the Plato API to create and manage AI-powe
|
|
|
6
6
|
|
|
7
7
|
The Plato SDK provides a simple and type-safe way to integrate with the Plato platform, allowing you to create medical training simulations with AI personas and manage voice-based interactions.
|
|
8
8
|
|
|
9
|
+
## Authentication
|
|
10
|
+
|
|
11
|
+
All API requests require authentication using a Bearer token. Include your JWT token in the `API-AUTH` header:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
API-AUTH: Bearer <your-jwt-token>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Requests without a valid JWT token will be rejected with a `401 Unauthorized` response.
|
|
18
|
+
|
|
9
19
|
## Features
|
|
10
20
|
|
|
11
21
|
- Create AI personas with customizable professional profiles and personalities
|
|
@@ -24,7 +34,7 @@ npm install plato-sdk
|
|
|
24
34
|
## Quick Start
|
|
25
35
|
|
|
26
36
|
```typescript
|
|
27
|
-
import { PlatoApiClient } from 'plato-sdk';
|
|
37
|
+
import { PlatoApiClient, AvatarLanguage } from 'plato-sdk';
|
|
28
38
|
|
|
29
39
|
// Initialize the client
|
|
30
40
|
const client = new PlatoApiClient({
|
|
@@ -33,6 +43,9 @@ const client = new PlatoApiClient({
|
|
|
33
43
|
user: 'test@test.test',
|
|
34
44
|
});
|
|
35
45
|
|
|
46
|
+
// Get available assistant images
|
|
47
|
+
const images = await client.getAssistantImages();
|
|
48
|
+
|
|
36
49
|
// Create a simulation
|
|
37
50
|
const simulation = await client.createSimulation({
|
|
38
51
|
persona: {
|
|
@@ -69,6 +82,8 @@ const simulation = await client.createSimulation({
|
|
|
69
82
|
'Demonstrate efficacy of Ibuprofen in pain management Highlight safety profile and contraindications Encourage patient adherence',
|
|
70
83
|
anticipatedObjections:
|
|
71
84
|
'Concerns about gastrointestinal side effects Preference for lower-cost generic alternatives Potential interactions with other medications',
|
|
85
|
+
imageId: images[0]._id,
|
|
86
|
+
avatarLanguage: AvatarLanguage.English,
|
|
72
87
|
});
|
|
73
88
|
|
|
74
89
|
// Check the simulation status - If simulation creation phase is equals to FINISHED, the simulation is ready to use
|
|
@@ -89,7 +104,15 @@ call.on('message', message => {
|
|
|
89
104
|
});
|
|
90
105
|
|
|
91
106
|
call.on('call-end', () => {
|
|
92
|
-
console.log('Call ended');
|
|
107
|
+
console.log('Call ended - processing feedback...');
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// Automatically receive post-call feedback when ready
|
|
111
|
+
call.on('call-details-ready', callDetails => {
|
|
112
|
+
console.log('Call Summary:', callDetails.summary);
|
|
113
|
+
console.log('Score:', callDetails.score);
|
|
114
|
+
console.log('Strengths:', callDetails.strengths);
|
|
115
|
+
console.log('Areas to improve:', callDetails.weaknesses);
|
|
93
116
|
});
|
|
94
117
|
|
|
95
118
|
// Stop the call when done
|
|
@@ -225,12 +248,7 @@ Uploads a PDF file for slide analysis. The file will be uploaded to S3 and analy
|
|
|
225
248
|
|
|
226
249
|
- `file` (File | Blob): The PDF file to upload
|
|
227
250
|
|
|
228
|
-
**Returns:** `Promise<
|
|
229
|
-
|
|
230
|
-
- `objectKey`: The S3 object key where the PDF was saved
|
|
231
|
-
- `filename`: The original filename
|
|
232
|
-
- `size`: The file size in bytes
|
|
233
|
-
- `contentType`: The content type of the file
|
|
251
|
+
**Returns:** `Promise<string>` — A success message if the upload was successful.
|
|
234
252
|
|
|
235
253
|
**Example:**
|
|
236
254
|
|
|
@@ -241,11 +259,85 @@ const file = fileInput.files?.[0];
|
|
|
241
259
|
|
|
242
260
|
if (file) {
|
|
243
261
|
const result = await client.uploadPdfSlides(file);
|
|
244
|
-
console.log('PDF
|
|
245
|
-
console.log('Original filename:', result.filename);
|
|
262
|
+
console.log('PDF upload initiated');
|
|
246
263
|
}
|
|
247
264
|
```
|
|
248
265
|
|
|
266
|
+
##### getSlidesAnalysis(queryParams: PdfSlidesAnalysisQueryDto)
|
|
267
|
+
|
|
268
|
+
Retrieves a paginated and sorted list of PDF slide analysis records.
|
|
269
|
+
|
|
270
|
+
**Parameters:**
|
|
271
|
+
|
|
272
|
+
- `queryParams` (PdfSlidesAnalysisQueryDto):
|
|
273
|
+
- `limit` (optional): Number of records per page
|
|
274
|
+
- `page` (optional): Page number
|
|
275
|
+
- `sort` (optional): Sort order (`'asc'` or `'desc'`)
|
|
276
|
+
- `sortBy` (optional): Field to sort by (`'createdAt'`, `'originalFilename'`, or `'totalSlides'`)
|
|
277
|
+
|
|
278
|
+
**Returns:** `Promise<PdfSlidesDto[]>`
|
|
279
|
+
|
|
280
|
+
**Example:**
|
|
281
|
+
|
|
282
|
+
```typescript
|
|
283
|
+
const analysisList = await client.getSlidesAnalysis({
|
|
284
|
+
limit: 10,
|
|
285
|
+
page: 0,
|
|
286
|
+
sort: 'desc',
|
|
287
|
+
sortBy: 'createdAt',
|
|
288
|
+
});
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
##### getSlideAnalysis(id: string)
|
|
292
|
+
|
|
293
|
+
Retrieves the detailed analysis data for a specific PDF slide record, including the overview and individual slide analysis.
|
|
294
|
+
|
|
295
|
+
**Parameters:**
|
|
296
|
+
|
|
297
|
+
- `id` (string): The unique ID of the PDF slide record
|
|
298
|
+
|
|
299
|
+
**Returns:** `Promise<PdfSlideDto>`
|
|
300
|
+
|
|
301
|
+
**Example:**
|
|
302
|
+
|
|
303
|
+
```typescript
|
|
304
|
+
const details = await client.getSlideAnalysis('pdf-slide-id');
|
|
305
|
+
console.log('Lesson Overview:', details.lessonOverview);
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
##### deleteSlideAnalysis(id: string)
|
|
309
|
+
|
|
310
|
+
Deletes a PDF slide analysis record from the database and removes the corresponding file from S3 storage.
|
|
311
|
+
|
|
312
|
+
**Parameters:**
|
|
313
|
+
|
|
314
|
+
- `id` (string): The unique ID of the PDF slide record to delete
|
|
315
|
+
|
|
316
|
+
**Returns:** `Promise<void>`
|
|
317
|
+
|
|
318
|
+
**Example:**
|
|
319
|
+
|
|
320
|
+
```typescript
|
|
321
|
+
await client.deleteSlideAnalysis('pdf-slide-id');
|
|
322
|
+
console.log('Analysis deleted successfully');
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
##### getAssistantImages()
|
|
326
|
+
|
|
327
|
+
Retrieves all available assistant images that can be used when creating a simulation.
|
|
328
|
+
|
|
329
|
+
**Returns:** `Promise<AssistantImageDto[]>` — An array of assistant image objects, each containing:
|
|
330
|
+
|
|
331
|
+
- `_id`: Unique identifier for the image
|
|
332
|
+
- `imageUrl`: URL of the assistant image
|
|
333
|
+
|
|
334
|
+
**Example:**
|
|
335
|
+
|
|
336
|
+
```typescript
|
|
337
|
+
// Get all available assistant images
|
|
338
|
+
const images = await client.getAssistantImages();
|
|
339
|
+
```
|
|
340
|
+
|
|
249
341
|
##### getRecommendations()
|
|
250
342
|
|
|
251
343
|
Retrieves recommendations based on the user's recent call performance. Analyzes up to 10 of the most recent calls to identify patterns and provide actionable insights.
|
|
@@ -374,6 +466,7 @@ The SDK provides a comprehensive event system for managing voice calls:
|
|
|
374
466
|
- `message`: Triggered when a message is received (contains transcript and metadata)
|
|
375
467
|
- `volume-level`: Triggered with volume level updates (number)
|
|
376
468
|
- `error`: Triggered when an error occurs
|
|
469
|
+
- `call-details-ready`: Triggered when post-call processing completes and call details are available (includes full `CallDTO` with transcript, summary, ratings, and evaluation)
|
|
377
470
|
|
|
378
471
|
### Event Usage
|
|
379
472
|
|
|
@@ -391,10 +484,229 @@ call.on('volume-level', level => {
|
|
|
391
484
|
call.on('error', error => {
|
|
392
485
|
console.error('Call error:', error);
|
|
393
486
|
});
|
|
487
|
+
|
|
488
|
+
// Listen for call details after post-call processing
|
|
489
|
+
call.on('call-details-ready', callDetails => {
|
|
490
|
+
console.log('Post-call feedback ready:', callDetails);
|
|
491
|
+
});
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
## Automatic Post-Call Feedback
|
|
495
|
+
|
|
496
|
+
The SDK automatically fetches detailed call information after each call ends and completes post-call processing. This includes comprehensive feedback such as transcript, summary, evaluation metrics, strengths, weaknesses, and ratings.
|
|
497
|
+
|
|
498
|
+
### How It Works
|
|
499
|
+
|
|
500
|
+
When a call ends, the SDK automatically:
|
|
501
|
+
|
|
502
|
+
1. Triggers the `call-end` event
|
|
503
|
+
2. Processes the call on the backend (post-call analysis)
|
|
504
|
+
3. Fetches complete call details
|
|
505
|
+
4. Emits the `call-details-ready` event with full `CallDTO` data
|
|
506
|
+
|
|
507
|
+
This happens automatically—you don't need to manually call `getCallDetails()` after each call.
|
|
508
|
+
|
|
509
|
+
### Event Lifecycle
|
|
510
|
+
|
|
511
|
+
```typescript
|
|
512
|
+
const call = await client.startCall(simulationId);
|
|
513
|
+
|
|
514
|
+
// 1. Call begins
|
|
515
|
+
call.on('call-start', () => {
|
|
516
|
+
console.log('Call started');
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
// 2. Real-time transcript messages during the call
|
|
520
|
+
call.on('message', message => {
|
|
521
|
+
console.log('Real-time:', message.transcript);
|
|
522
|
+
});
|
|
523
|
+
|
|
524
|
+
// 3. Call ends
|
|
525
|
+
call.on('call-end', () => {
|
|
526
|
+
console.log('Call ended - processing feedback...');
|
|
527
|
+
});
|
|
528
|
+
|
|
529
|
+
// 4. Post-call details are automatically fetched and ready
|
|
530
|
+
call.on('call-details-ready', callDetails => {
|
|
531
|
+
console.log('Post-call feedback is ready!');
|
|
532
|
+
|
|
533
|
+
// Access all call details
|
|
534
|
+
console.log('Summary:', callDetails.summary);
|
|
535
|
+
console.log('Full Transcript:', callDetails.transcript);
|
|
536
|
+
console.log('Call Duration:', callDetails.callDurationMs, 'ms');
|
|
537
|
+
console.log('Success:', callDetails.successEvaluation);
|
|
538
|
+
console.log('Score:', callDetails.score);
|
|
539
|
+
|
|
540
|
+
// Display evaluation metrics
|
|
541
|
+
console.log(`${callDetails.metric1}: ${callDetails.metric1Value}`);
|
|
542
|
+
console.log(`${callDetails.metric2}: ${callDetails.metric2Value}`);
|
|
543
|
+
console.log(`${callDetails.metric3}: ${callDetails.metric3Value}`);
|
|
544
|
+
|
|
545
|
+
// Show strengths and areas for improvement
|
|
546
|
+
callDetails.strengths?.forEach(strength => {
|
|
547
|
+
console.log('✓ Strength:', strength);
|
|
548
|
+
});
|
|
549
|
+
|
|
550
|
+
callDetails.weaknesses?.forEach(weakness => {
|
|
551
|
+
console.log('⚠ Area to improve:', weakness);
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
// Access recording
|
|
555
|
+
if (callDetails.recordingUrl) {
|
|
556
|
+
console.log('Recording:', callDetails.recordingUrl);
|
|
557
|
+
}
|
|
558
|
+
});
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
### Practical Use Cases
|
|
562
|
+
|
|
563
|
+
#### 1. Display Post-Call Feedback in UI
|
|
564
|
+
|
|
565
|
+
```typescript
|
|
566
|
+
// Angular/React example
|
|
567
|
+
async startCall() {
|
|
568
|
+
const call = await this.client.startCall(this.simulationId);
|
|
569
|
+
|
|
570
|
+
// Automatically update UI when feedback is ready
|
|
571
|
+
call.on('call-details-ready', callDetails => {
|
|
572
|
+
this.callSummary = callDetails.summary;
|
|
573
|
+
this.callScore = callDetails.score;
|
|
574
|
+
this.strengths = callDetails.strengths;
|
|
575
|
+
this.weaknesses = callDetails.weaknesses;
|
|
576
|
+
this.showFeedbackModal = true; // Display feedback to user
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
#### 2. Track Performance Analytics
|
|
582
|
+
|
|
583
|
+
```typescript
|
|
584
|
+
call.on('call-details-ready', callDetails => {
|
|
585
|
+
// Send analytics to tracking service
|
|
586
|
+
analytics.track('call_completed', {
|
|
587
|
+
callId: callDetails._id,
|
|
588
|
+
duration: callDetails.callDurationMs,
|
|
589
|
+
score: callDetails.score,
|
|
590
|
+
success: callDetails.successEvaluation,
|
|
591
|
+
metrics: {
|
|
592
|
+
[callDetails.metric1]: callDetails.metric1Value,
|
|
593
|
+
[callDetails.metric2]: callDetails.metric2Value,
|
|
594
|
+
[callDetails.metric3]: callDetails.metric3Value,
|
|
595
|
+
},
|
|
596
|
+
});
|
|
597
|
+
});
|
|
598
|
+
```
|
|
599
|
+
|
|
600
|
+
#### 3. Store Call History
|
|
601
|
+
|
|
602
|
+
```typescript
|
|
603
|
+
call.on('call-details-ready', async callDetails => {
|
|
604
|
+
// Save to local storage or database
|
|
605
|
+
const callHistory = JSON.parse(localStorage.getItem('call_history') || '[]');
|
|
606
|
+
callHistory.push({
|
|
607
|
+
id: callDetails._id,
|
|
608
|
+
date: callDetails.createdAt,
|
|
609
|
+
summary: callDetails.summary,
|
|
610
|
+
score: callDetails.score,
|
|
611
|
+
});
|
|
612
|
+
localStorage.setItem('call_history', JSON.stringify(callHistory));
|
|
613
|
+
});
|
|
614
|
+
```
|
|
615
|
+
|
|
616
|
+
#### 4. Generate Learning Insights
|
|
617
|
+
|
|
618
|
+
```typescript
|
|
619
|
+
call.on('call-details-ready', callDetails => {
|
|
620
|
+
// Aggregate insights across multiple calls
|
|
621
|
+
if (callDetails.successEvaluation) {
|
|
622
|
+
this.successfulCalls++;
|
|
623
|
+
this.successStrategies.push(...(callDetails.strengths || []));
|
|
624
|
+
} else {
|
|
625
|
+
this.areasToImprove.push(...(callDetails.weaknesses || []));
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
this.updateLearningDashboard();
|
|
629
|
+
});
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
### Manual Fetching (Alternative Approach)
|
|
633
|
+
|
|
634
|
+
While the SDK automatically fetches call details after each call, you can also manually retrieve them later using the call ID:
|
|
635
|
+
|
|
636
|
+
```typescript
|
|
637
|
+
// Get call details at any time
|
|
638
|
+
const callDetails = await client.getCallDetails(callId);
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
This is useful when:
|
|
642
|
+
|
|
643
|
+
- Viewing historical calls
|
|
644
|
+
- Refreshing data after updates
|
|
645
|
+
- Building a call history view
|
|
646
|
+
|
|
647
|
+
### Error Handling
|
|
648
|
+
|
|
649
|
+
If fetching call details fails after a call ends, the error is logged but does not prevent the `call-end` event from completing. The call will still end gracefully.
|
|
650
|
+
|
|
651
|
+
```typescript
|
|
652
|
+
call.on('call-end', () => {
|
|
653
|
+
console.log('Call ended successfully');
|
|
654
|
+
// This will always fire, even if call-details-ready fails
|
|
655
|
+
});
|
|
656
|
+
|
|
657
|
+
call.on('call-details-ready', callDetails => {
|
|
658
|
+
// This may not fire if post-call processing fails
|
|
659
|
+
// In that case, you can manually fetch later using getCallDetails()
|
|
660
|
+
});
|
|
394
661
|
```
|
|
395
662
|
|
|
663
|
+
### Best Practices
|
|
664
|
+
|
|
665
|
+
1. **Always subscribe to `call-details-ready`** to capture post-call feedback automatically
|
|
666
|
+
2. **Show loading state** between `call-end` and `call-details-ready` events
|
|
667
|
+
3. **Handle missing data gracefully** - some fields may be `null` or `undefined` depending on call status
|
|
668
|
+
4. **Store call IDs** for later retrieval using `getCallDetails()` if needed
|
|
669
|
+
5. **Use the event data** to provide immediate feedback to users rather than making additional API calls
|
|
670
|
+
|
|
671
|
+
### Timing Considerations
|
|
672
|
+
|
|
673
|
+
- `call-end`: Fires immediately when the call stops
|
|
674
|
+
- `call-details-ready`: Fires after backend processing completes (typically 2-5 seconds after call ends)
|
|
675
|
+
|
|
676
|
+
Plan your UX accordingly—show a loading/processing state between these two events.
|
|
677
|
+
|
|
396
678
|
## Data Types
|
|
397
679
|
|
|
680
|
+
### CallDTO
|
|
681
|
+
|
|
682
|
+
Complete call details returned by `call-details-ready` event and `getCallDetails()` method:
|
|
683
|
+
|
|
684
|
+
```typescript
|
|
685
|
+
interface CallDTO {
|
|
686
|
+
_id: string; // MongoDB ID of the call
|
|
687
|
+
callId: string; // Vapi call ID
|
|
688
|
+
assistantId: string; // ID of the AI assistant used
|
|
689
|
+
summary?: string; // AI-generated summary of the conversation
|
|
690
|
+
transcript?: string; // Full transcript of the call
|
|
691
|
+
recordingUrl?: string; // URL to the call recording
|
|
692
|
+
rating?: number; // User-provided rating (0-5)
|
|
693
|
+
successEvaluation?: boolean; // Whether the call was successful
|
|
694
|
+
score?: number; // Overall score for the call
|
|
695
|
+
strengths?: string[]; // Array of identified strengths
|
|
696
|
+
weaknesses?: string[]; // Array of areas for improvement
|
|
697
|
+
metric1?: string; // Name of evaluation metric 1
|
|
698
|
+
metric1Value?: number; // Value for metric 1
|
|
699
|
+
metric2?: string; // Name of evaluation metric 2
|
|
700
|
+
metric2Value?: number; // Value for metric 2
|
|
701
|
+
metric3?: string; // Name of evaluation metric 3
|
|
702
|
+
metric3Value?: number; // Value for metric 3
|
|
703
|
+
createdAt: Date; // When the call was created
|
|
704
|
+
endedAt?: Date; // When the call ended
|
|
705
|
+
callDurationMs?: number; // Duration in milliseconds
|
|
706
|
+
// Additional fields may be present depending on call status
|
|
707
|
+
}
|
|
708
|
+
```
|
|
709
|
+
|
|
398
710
|
### CreateSimulationDto
|
|
399
711
|
|
|
400
712
|
Configuration for creating a simulation:
|
|
@@ -408,6 +720,8 @@ interface CreateSimulationDto {
|
|
|
408
720
|
objectives?: string;
|
|
409
721
|
anticipatedObjections?: string;
|
|
410
722
|
trainingConfiguration: TrainingConfigurationDto;
|
|
723
|
+
imageId: string;
|
|
724
|
+
avatarLanguage: AvatarLanguage;
|
|
411
725
|
}
|
|
412
726
|
```
|
|
413
727
|
|
|
@@ -489,6 +803,79 @@ interface ImprovementAreaDto {
|
|
|
489
803
|
}
|
|
490
804
|
```
|
|
491
805
|
|
|
806
|
+
### PdfSlidesDto
|
|
807
|
+
|
|
808
|
+
Simplified data structure for PDF slide records (used in lists):
|
|
809
|
+
|
|
810
|
+
```typescript
|
|
811
|
+
interface PdfSlidesDto {
|
|
812
|
+
_id: string;
|
|
813
|
+
originalFilename: string;
|
|
814
|
+
totalSlides?: number;
|
|
815
|
+
lessonOverview?: string;
|
|
816
|
+
createdAt: Date;
|
|
817
|
+
updatedAt: Date;
|
|
818
|
+
}
|
|
819
|
+
```
|
|
820
|
+
|
|
821
|
+
### PdfSlideDto
|
|
822
|
+
|
|
823
|
+
Detailed data structure for a single PDF slide analysis:
|
|
824
|
+
|
|
825
|
+
```typescript
|
|
826
|
+
interface PdfSlideDto {
|
|
827
|
+
_id: string;
|
|
828
|
+
originalFilename: string;
|
|
829
|
+
totalSlides?: number;
|
|
830
|
+
lessonOverview?: string;
|
|
831
|
+
slideAnalysis?: Array<{
|
|
832
|
+
slideNumber: number;
|
|
833
|
+
title: string;
|
|
834
|
+
textExtraction: string;
|
|
835
|
+
}>;
|
|
836
|
+
createdAt: Date;
|
|
837
|
+
updatedAt: Date;
|
|
838
|
+
}
|
|
839
|
+
```
|
|
840
|
+
|
|
841
|
+
### PdfSlidesAnalysisQueryDto
|
|
842
|
+
|
|
843
|
+
Query parameters for retrieving slide analysis records:
|
|
844
|
+
|
|
845
|
+
```typescript
|
|
846
|
+
interface PdfSlidesAnalysisQueryDto {
|
|
847
|
+
limit?: 5 | 10 | 25;
|
|
848
|
+
page?: number;
|
|
849
|
+
sort?: 'asc' | 'desc';
|
|
850
|
+
sortBy?: 'createdAt' | 'originalFilename' | 'totalSlides';
|
|
851
|
+
}
|
|
852
|
+
```
|
|
853
|
+
|
|
854
|
+
### AssistantImageDto
|
|
855
|
+
|
|
856
|
+
Data structure for assistant images:
|
|
857
|
+
|
|
858
|
+
```typescript
|
|
859
|
+
interface AssistantImageDto {
|
|
860
|
+
_id: string;
|
|
861
|
+
imageUrl: string;
|
|
862
|
+
}
|
|
863
|
+
```
|
|
864
|
+
|
|
865
|
+
### AvatarLanguage
|
|
866
|
+
|
|
867
|
+
Enum representing available avatar languages:
|
|
868
|
+
|
|
869
|
+
```typescript
|
|
870
|
+
enum AvatarLanguage {
|
|
871
|
+
English = 'en',
|
|
872
|
+
German = 'de',
|
|
873
|
+
Spanish = 'es',
|
|
874
|
+
Italian = 'it',
|
|
875
|
+
French = 'fr',
|
|
876
|
+
}
|
|
877
|
+
```
|
|
878
|
+
|
|
492
879
|
## Error Handling
|
|
493
880
|
|
|
494
881
|
The SDK throws errors for invalid configurations and API failures:
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ctchealth/plato-sdk",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.13",
|
|
4
4
|
"dependencies": {
|
|
5
5
|
"tslib": "^2.3.0",
|
|
6
6
|
"@vapi-ai/web": "2.1.8",
|
|
7
|
-
"axios": "^1.7.9"
|
|
7
|
+
"axios": "^1.7.9",
|
|
8
|
+
"pdf-lib": "^1.17.1"
|
|
8
9
|
},
|
|
9
10
|
"type": "commonjs",
|
|
10
11
|
"main": "./src/index.js",
|
|
@@ -12,5 +13,5 @@
|
|
|
12
13
|
"publishConfig": {
|
|
13
14
|
"access": "public"
|
|
14
15
|
},
|
|
15
|
-
"types": "
|
|
16
|
+
"types": "./../../apps/plato-lx-api/libs/plato-sdk/src/index.d.ts"
|
|
16
17
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 ctcHealth. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* This file is part of the ctcHealth Plato Platform, a proprietary software system developed by ctcHealth.
|
|
5
|
+
*
|
|
6
|
+
* This source code and all related materials are confidential and proprietary to ctcHealth.
|
|
7
|
+
* Unauthorized access, use, copying, modification, distribution, or disclosure is strictly prohibited
|
|
8
|
+
* and may result in disciplinary action and civil and/or criminal penalties.
|
|
9
|
+
*
|
|
10
|
+
* This software is intended solely for authorized use within ctcHealth and its designated partners.
|
|
11
|
+
*
|
|
12
|
+
* For internal use only.
|
|
13
|
+
*/
|
|
14
|
+
export declare const MAX_PDF_FILE_SIZE: number;
|
|
15
|
+
export declare const ALLOWED_PDF_MIME_TYPES: string[];
|
|
16
|
+
export declare const MAX_PDF_PAGES = 100;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_PDF_PAGES = exports.ALLOWED_PDF_MIME_TYPES = exports.MAX_PDF_FILE_SIZE = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Copyright (c) 2025 ctcHealth. All rights reserved.
|
|
6
|
+
*
|
|
7
|
+
* This file is part of the ctcHealth Plato Platform, a proprietary software system developed by ctcHealth.
|
|
8
|
+
*
|
|
9
|
+
* This source code and all related materials are confidential and proprietary to ctcHealth.
|
|
10
|
+
* Unauthorized access, use, copying, modification, distribution, or disclosure is strictly prohibited
|
|
11
|
+
* and may result in disciplinary action and civil and/or criminal penalties.
|
|
12
|
+
*
|
|
13
|
+
* This software is intended solely for authorized use within ctcHealth and its designated partners.
|
|
14
|
+
*
|
|
15
|
+
* For internal use only.
|
|
16
|
+
*/
|
|
17
|
+
exports.MAX_PDF_FILE_SIZE = 20 * 1024 * 1024; // 20MB
|
|
18
|
+
exports.ALLOWED_PDF_MIME_TYPES = ['application/pdf'];
|
|
19
|
+
exports.MAX_PDF_PAGES = 100;
|
|
20
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/constants.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;GAYG;AACU,QAAA,iBAAiB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAC7C,QAAA,sBAAsB,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAC7C,QAAA,aAAa,GAAG,GAAG,CAAC"}
|
|
@@ -35,6 +35,13 @@ export declare enum AssistantVoiceGender {
|
|
|
35
35
|
Male = "Male",
|
|
36
36
|
Female = "Female"
|
|
37
37
|
}
|
|
38
|
+
export declare enum AvatarLanguage {
|
|
39
|
+
English = "en",
|
|
40
|
+
German = "de",
|
|
41
|
+
Spanish = "es",
|
|
42
|
+
Italian = "it",
|
|
43
|
+
French = "fr"
|
|
44
|
+
}
|
|
38
45
|
export declare class PersonalityAndBehaviourDto {
|
|
39
46
|
riskTolerance: number;
|
|
40
47
|
researchOrientation: number;
|
|
@@ -72,6 +79,8 @@ export declare class CreateSimulationDto {
|
|
|
72
79
|
scenario: string;
|
|
73
80
|
objectives?: string;
|
|
74
81
|
anticipatedObjections?: string;
|
|
82
|
+
imageId: string;
|
|
83
|
+
avatarLanguage: AvatarLanguage;
|
|
75
84
|
}
|
|
76
85
|
export type RecordingsLimit = 5 | 10 | 25;
|
|
77
86
|
export declare class SimulationRecordingsQueryDto {
|
|
@@ -213,25 +222,18 @@ export declare enum CreationPhase {
|
|
|
213
222
|
ERROR = "ERROR"
|
|
214
223
|
}
|
|
215
224
|
/**
|
|
216
|
-
*
|
|
225
|
+
* Presigned POST data for S3 upload.
|
|
217
226
|
*/
|
|
218
|
-
export interface
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
227
|
+
export interface PresignedPost {
|
|
228
|
+
url: string;
|
|
229
|
+
fields: Record<string, string>;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Response for requesting a PDF upload.
|
|
233
|
+
*/
|
|
234
|
+
export interface RequestPdfUploadResponse {
|
|
235
|
+
presignedPost: PresignedPost;
|
|
222
236
|
objectKey: string;
|
|
223
|
-
/**
|
|
224
|
-
* The original filename
|
|
225
|
-
*/
|
|
226
|
-
filename: string;
|
|
227
|
-
/**
|
|
228
|
-
* The file size in bytes
|
|
229
|
-
*/
|
|
230
|
-
size: number;
|
|
231
|
-
/**
|
|
232
|
-
* The content type of the file
|
|
233
|
-
*/
|
|
234
|
-
contentType: string;
|
|
235
237
|
}
|
|
236
238
|
export interface SimulationDetailsDto {
|
|
237
239
|
simulationId: string;
|
|
@@ -267,3 +269,41 @@ export interface RecommendationsResponseDto {
|
|
|
267
269
|
callsAnalyzed: number;
|
|
268
270
|
generatedAt: Date;
|
|
269
271
|
}
|
|
272
|
+
export declare enum PdfSlidesSortField {
|
|
273
|
+
CREATED_AT = "createdAt",
|
|
274
|
+
FILENAME = "originalFilename",
|
|
275
|
+
TOTAL_SLIDES = "totalSlides"
|
|
276
|
+
}
|
|
277
|
+
export declare class PdfSlidesAnalysisQueryDto {
|
|
278
|
+
limit?: RecordingsLimit;
|
|
279
|
+
page?: number;
|
|
280
|
+
sort?: SortOrder;
|
|
281
|
+
sortBy?: PdfSlidesSortField;
|
|
282
|
+
}
|
|
283
|
+
export interface SlideAnalysis {
|
|
284
|
+
slideNumber: number;
|
|
285
|
+
title?: string;
|
|
286
|
+
textExtraction?: string;
|
|
287
|
+
visualDescription?: string;
|
|
288
|
+
}
|
|
289
|
+
export interface PdfSlidesDto {
|
|
290
|
+
_id: string;
|
|
291
|
+
originalFilename: string;
|
|
292
|
+
totalSlides?: number;
|
|
293
|
+
lessonOverview?: string;
|
|
294
|
+
createdAt: Date;
|
|
295
|
+
updatedAt: Date;
|
|
296
|
+
}
|
|
297
|
+
export interface PdfSlideDto {
|
|
298
|
+
_id: string;
|
|
299
|
+
originalFilename: string;
|
|
300
|
+
totalSlides?: number;
|
|
301
|
+
lessonOverview?: string;
|
|
302
|
+
slideAnalysis?: SlideAnalysis[];
|
|
303
|
+
createdAt: Date;
|
|
304
|
+
updatedAt: Date;
|
|
305
|
+
}
|
|
306
|
+
export interface AssistantImageDto {
|
|
307
|
+
_id: string;
|
|
308
|
+
imageUrl: string;
|
|
309
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RecommendationPriority = exports.CreationPhase = exports.SimulationRecordingsDto = exports.RecordingStatus = exports.SortOrder = exports.SimulationRecordingsQueryDto = exports.CreateSimulationDto = exports.ProductConfig = exports.CharacterCreateDto = exports.ContextDto = exports.ProfessionalProfileDto = exports.PersonalityAndBehaviourDto = exports.AssistantVoiceGender = exports.SegmentType = exports.PracticeType = exports.YearOfExperience = void 0;
|
|
3
|
+
exports.PdfSlidesAnalysisQueryDto = exports.PdfSlidesSortField = exports.RecommendationPriority = exports.CreationPhase = exports.SimulationRecordingsDto = exports.RecordingStatus = exports.SortOrder = exports.SimulationRecordingsQueryDto = exports.CreateSimulationDto = exports.ProductConfig = exports.CharacterCreateDto = exports.ContextDto = exports.ProfessionalProfileDto = exports.PersonalityAndBehaviourDto = exports.AvatarLanguage = exports.AssistantVoiceGender = exports.SegmentType = exports.PracticeType = exports.YearOfExperience = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* Copyright (c) 2025 ctcHealth. All rights reserved.
|
|
6
6
|
*
|
|
@@ -42,6 +42,14 @@ var AssistantVoiceGender;
|
|
|
42
42
|
AssistantVoiceGender["Male"] = "Male";
|
|
43
43
|
AssistantVoiceGender["Female"] = "Female";
|
|
44
44
|
})(AssistantVoiceGender || (exports.AssistantVoiceGender = AssistantVoiceGender = {}));
|
|
45
|
+
var AvatarLanguage;
|
|
46
|
+
(function (AvatarLanguage) {
|
|
47
|
+
AvatarLanguage["English"] = "en";
|
|
48
|
+
AvatarLanguage["German"] = "de";
|
|
49
|
+
AvatarLanguage["Spanish"] = "es";
|
|
50
|
+
AvatarLanguage["Italian"] = "it";
|
|
51
|
+
AvatarLanguage["French"] = "fr";
|
|
52
|
+
})(AvatarLanguage || (exports.AvatarLanguage = AvatarLanguage = {}));
|
|
45
53
|
class PersonalityAndBehaviourDto {
|
|
46
54
|
riskTolerance;
|
|
47
55
|
researchOrientation;
|
|
@@ -84,6 +92,8 @@ class CreateSimulationDto {
|
|
|
84
92
|
scenario;
|
|
85
93
|
objectives;
|
|
86
94
|
anticipatedObjections;
|
|
95
|
+
imageId;
|
|
96
|
+
avatarLanguage;
|
|
87
97
|
}
|
|
88
98
|
exports.CreateSimulationDto = CreateSimulationDto;
|
|
89
99
|
class SimulationRecordingsQueryDto {
|
|
@@ -127,4 +137,17 @@ var RecommendationPriority;
|
|
|
127
137
|
RecommendationPriority["MEDIUM"] = "medium";
|
|
128
138
|
RecommendationPriority["LOW"] = "low";
|
|
129
139
|
})(RecommendationPriority || (exports.RecommendationPriority = RecommendationPriority = {}));
|
|
140
|
+
var PdfSlidesSortField;
|
|
141
|
+
(function (PdfSlidesSortField) {
|
|
142
|
+
PdfSlidesSortField["CREATED_AT"] = "createdAt";
|
|
143
|
+
PdfSlidesSortField["FILENAME"] = "originalFilename";
|
|
144
|
+
PdfSlidesSortField["TOTAL_SLIDES"] = "totalSlides";
|
|
145
|
+
})(PdfSlidesSortField || (exports.PdfSlidesSortField = PdfSlidesSortField = {}));
|
|
146
|
+
class PdfSlidesAnalysisQueryDto {
|
|
147
|
+
limit;
|
|
148
|
+
page;
|
|
149
|
+
sort;
|
|
150
|
+
sortBy;
|
|
151
|
+
}
|
|
152
|
+
exports.PdfSlidesAnalysisQueryDto = PdfSlidesAnalysisQueryDto;
|
|
130
153
|
//# sourceMappingURL=plato-intefaces.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plato-intefaces.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/plato-intefaces.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;GAYG;AACH,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,qCAAmB,CAAA;IACnB,uCAAqB,CAAA;IACrB,yCAAuB,CAAA;IACvB,qCAAmB,CAAA;AACrB,CAAC,EALW,gBAAgB,gCAAhB,gBAAgB,QAK3B;AAED,IAAY,YAKX;AALD,WAAY,YAAY;IACtB,4CAA4B,CAAA;IAC5B,qCAAqB,CAAA;IACrB,iEAAiD,CAAA;IACjD,iCAAiB,CAAA;AACnB,CAAC,EALW,YAAY,4BAAZ,YAAY,QAKvB;AACD,IAAY,WAOX;AAPD,WAAY,WAAW;IACrB,oDAAqC,CAAA;IACrC,0CAA2B,CAAA;IAC3B,0EAA2D,CAAA;IAC3D,gFAAiE,CAAA;IACjE,qDAAsC,CAAA;IACtC,wEAAyD,CAAA;AAC3D,CAAC,EAPW,WAAW,2BAAX,WAAW,QAOtB;AAED,IAAY,oBAGX;AAHD,WAAY,oBAAoB;IAC9B,qCAAa,CAAA;IACb,yCAAiB,CAAA;AACnB,CAAC,EAHW,oBAAoB,oCAApB,oBAAoB,QAG/B;AAED,MAAa,0BAA0B;IACrC,aAAa,CAAU;IACvB,mBAAmB,CAAU;IAC7B,eAAe,CAAU;IACzB,YAAY,CAAU;IACtB,cAAc,CAAU;CACzB;AAND,gEAMC;AAED,MAAa,sBAAsB;IACjC,gBAAgB,CAAU;IAC1B,gBAAgB,CAAU;IAC1B,uBAAuB,CAAU;IACjC,QAAQ,CAAU;CACnB;AALD,wDAKC;AAED,MAAa,UAAU;IACrB,2BAA2B,CAAU;IACrC,iBAAiB,CAAU;IAC3B,kBAAkB,CAAU;CAC7B;AAJD,gCAIC;AAED,MAAa,kBAAkB;IAC7B,IAAI,CAAU;IACd,mBAAmB,CAA0B;IAC7C,OAAO,CAAe;IACtB,uBAAuB,CAA8B;IACrD,OAAO,CAAc;IACrB,eAAe,CAAwB;CACxC;AAPD,gDAOC;AAED,MAAa,aAAa;IACxB,IAAI,CAAU;IACd,WAAW,CAAU;CACtB;AAHD,sCAGC;AAED,MAAa,mBAAmB;IAC9B,OAAO,CAAsB;IAC7B,OAAO,CAAiB;IACxB,YAAY,CAAU;IACtB,QAAQ,CAAU;IAClB,UAAU,CAAU;IACpB,qBAAqB,CAAU;
|
|
1
|
+
{"version":3,"file":"plato-intefaces.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/plato-intefaces.ts"],"names":[],"mappings":"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"}
|
package/src/lib/plato-sdk.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CallDTO, CreateSimulationDto, CreationPhase, SimulationRecordingsDto, SimulationRecordingsQueryDto,
|
|
1
|
+
import { CallDTO, CreateSimulationDto, CreationPhase, SimulationRecordingsDto, SimulationRecordingsQueryDto, SimulationDetailsDto, RecommendationsResponseDto, PdfSlidesDto, PdfSlideDto, PdfSlidesAnalysisQueryDto, AssistantImageDto } from './plato-intefaces';
|
|
2
2
|
export interface ApiClientConfig {
|
|
3
3
|
baseUrl: string;
|
|
4
4
|
token?: string;
|
|
@@ -35,6 +35,7 @@ export interface CallEventMap {
|
|
|
35
35
|
[key: string]: unknown;
|
|
36
36
|
};
|
|
37
37
|
'volume-level': number;
|
|
38
|
+
'call-details-ready': CallDTO;
|
|
38
39
|
}
|
|
39
40
|
export type CallEventNames = keyof CallEventMap;
|
|
40
41
|
export type CallEventListener<K extends CallEventNames> = (payload: CallEventMap[K]) => void;
|
|
@@ -44,6 +45,8 @@ export declare class PlatoApiClient {
|
|
|
44
45
|
private eventListeners;
|
|
45
46
|
private callControllerInstance?;
|
|
46
47
|
private eventsAttached;
|
|
48
|
+
private currentCallId?;
|
|
49
|
+
private vapiEventNames;
|
|
47
50
|
eventNames: CallEventNames[];
|
|
48
51
|
constructor(config: ApiClientConfig);
|
|
49
52
|
/**
|
|
@@ -62,6 +65,10 @@ export declare class PlatoApiClient {
|
|
|
62
65
|
* Internal: Attach event listeners and propagate to registered listeners.
|
|
63
66
|
*/
|
|
64
67
|
private attachEvents;
|
|
68
|
+
/**
|
|
69
|
+
* Internal: Emit SDK-specific events that are not part of Vapi.
|
|
70
|
+
*/
|
|
71
|
+
private emit;
|
|
65
72
|
createSimulation(createSimulationParams: CreateSimulationDto): Promise<{
|
|
66
73
|
simulationId: string;
|
|
67
74
|
phase: CreationPhase;
|
|
@@ -97,7 +104,12 @@ export declare class PlatoApiClient {
|
|
|
97
104
|
*/
|
|
98
105
|
off: <K extends CallEventNames>(event: K, listener: CallEventListener<K>) => void;
|
|
99
106
|
}>;
|
|
107
|
+
private onCallEnded;
|
|
100
108
|
private createCall;
|
|
101
|
-
uploadPdfSlides(file: File | Blob): Promise<
|
|
109
|
+
uploadPdfSlides(file: File | Blob): Promise<string>;
|
|
102
110
|
getRecommendations(): Promise<RecommendationsResponseDto>;
|
|
111
|
+
getSlidesAnalysis(queryParams: PdfSlidesAnalysisQueryDto): Promise<PdfSlidesDto[]>;
|
|
112
|
+
getSlideAnalysis(id: string): Promise<PdfSlideDto>;
|
|
113
|
+
deleteSlideAnalysis(id: string): Promise<void>;
|
|
114
|
+
getAssistantImages(): Promise<AssistantImageDto[]>;
|
|
103
115
|
}
|
package/src/lib/plato-sdk.js
CHANGED
|
@@ -17,6 +17,8 @@ const tslib_1 = require("tslib");
|
|
|
17
17
|
*/
|
|
18
18
|
const axios_1 = tslib_1.__importDefault(require("axios"));
|
|
19
19
|
const web_1 = tslib_1.__importDefault(require("@vapi-ai/web"));
|
|
20
|
+
const utils_1 = require("./utils");
|
|
21
|
+
const constants_1 = require("./constants");
|
|
20
22
|
class PlatoApiClient {
|
|
21
23
|
config;
|
|
22
24
|
http;
|
|
@@ -24,6 +26,19 @@ class PlatoApiClient {
|
|
|
24
26
|
eventListeners = {};
|
|
25
27
|
callControllerInstance;
|
|
26
28
|
eventsAttached = false;
|
|
29
|
+
currentCallId;
|
|
30
|
+
// Vapi-native events (events that Vapi SDK supports)
|
|
31
|
+
// Exclude our custom SDK events from this list
|
|
32
|
+
vapiEventNames = [
|
|
33
|
+
'call-start',
|
|
34
|
+
'call-end',
|
|
35
|
+
'speech-start',
|
|
36
|
+
'speech-end',
|
|
37
|
+
'error',
|
|
38
|
+
'message',
|
|
39
|
+
'volume-level',
|
|
40
|
+
];
|
|
41
|
+
// All event names including SDK-specific events
|
|
27
42
|
eventNames = [
|
|
28
43
|
'call-start',
|
|
29
44
|
'call-end',
|
|
@@ -32,6 +47,7 @@ class PlatoApiClient {
|
|
|
32
47
|
'error',
|
|
33
48
|
'message',
|
|
34
49
|
'volume-level',
|
|
50
|
+
'call-details-ready',
|
|
35
51
|
];
|
|
36
52
|
constructor(config) {
|
|
37
53
|
this.config = config;
|
|
@@ -91,12 +107,22 @@ class PlatoApiClient {
|
|
|
91
107
|
return;
|
|
92
108
|
this.eventsAttached = true;
|
|
93
109
|
const vapi = this.callControllerInstance;
|
|
94
|
-
|
|
110
|
+
// Only attach Vapi-native events to the Vapi instance
|
|
111
|
+
this.vapiEventNames.forEach(event => {
|
|
95
112
|
vapi.on(event, (payload) => {
|
|
96
113
|
(this.eventListeners[event] || []).forEach(listener => listener(payload));
|
|
97
114
|
});
|
|
98
115
|
});
|
|
99
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Internal: Emit SDK-specific events that are not part of Vapi.
|
|
119
|
+
*/
|
|
120
|
+
emit(event, payload) {
|
|
121
|
+
const listeners = this.eventListeners[event];
|
|
122
|
+
if (listeners) {
|
|
123
|
+
listeners.forEach(listener => listener(payload));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
100
126
|
async createSimulation(createSimulationParams) {
|
|
101
127
|
try {
|
|
102
128
|
const res = await this.http.post('/api/v1/simulation', {
|
|
@@ -202,6 +228,12 @@ class PlatoApiClient {
|
|
|
202
228
|
if (!this.eventsAttached) {
|
|
203
229
|
this.attachEvents();
|
|
204
230
|
}
|
|
231
|
+
// Internal call-end listener
|
|
232
|
+
this.callControllerInstance.on('call-end', () => {
|
|
233
|
+
this.onCallEnded().catch(error => {
|
|
234
|
+
console.error('Error in onCallEnded: ', error);
|
|
235
|
+
});
|
|
236
|
+
});
|
|
205
237
|
const { data } = await this.http.get(`/api/v1/simulation/${simulationId}`);
|
|
206
238
|
const assistantId = data;
|
|
207
239
|
const call = await this.callControllerInstance.start(assistantId);
|
|
@@ -213,6 +245,8 @@ class PlatoApiClient {
|
|
|
213
245
|
callId: call.id,
|
|
214
246
|
assistantId: call.assistantId,
|
|
215
247
|
});
|
|
248
|
+
// Store the callId for use in onCallEnded
|
|
249
|
+
this.currentCallId = apiCall._id;
|
|
216
250
|
// Return stopCall, callId, and event subscription methods with strict typing
|
|
217
251
|
return {
|
|
218
252
|
stopCall: () => {
|
|
@@ -240,6 +274,41 @@ class PlatoApiClient {
|
|
|
240
274
|
throw e;
|
|
241
275
|
}
|
|
242
276
|
}
|
|
277
|
+
async onCallEnded() {
|
|
278
|
+
let callIdForRetry;
|
|
279
|
+
try {
|
|
280
|
+
if (!this.currentCallId) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
callIdForRetry = this.currentCallId;
|
|
284
|
+
// First attempt
|
|
285
|
+
let response = await this.http.post('/api/v1/postcall/call-ended', {
|
|
286
|
+
callId: callIdForRetry,
|
|
287
|
+
});
|
|
288
|
+
// If status is "processing", retry once immediately
|
|
289
|
+
if (response.data?.status === 'processing') {
|
|
290
|
+
response = await this.http.post('/api/v1/postcall/call-ended', {
|
|
291
|
+
callId: callIdForRetry,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
// After onCallEnded completes successfully, fetch and emit call details
|
|
295
|
+
try {
|
|
296
|
+
const callDetails = await this.getCallDetails(callIdForRetry);
|
|
297
|
+
this.emit('call-details-ready', callDetails);
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
console.error('Error fetching call details after call ended:', error);
|
|
301
|
+
// Don't throw - we don't want to break the onCallEnded flow
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
// Silently handle errors in post-call processing
|
|
306
|
+
}
|
|
307
|
+
finally {
|
|
308
|
+
// Clean up the callId after processing (success or failure)
|
|
309
|
+
this.currentCallId = undefined;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
243
312
|
async createCall(payload) {
|
|
244
313
|
const response = await this.http.post('/api/v1/simulation/call', {
|
|
245
314
|
...payload,
|
|
@@ -247,10 +316,56 @@ class PlatoApiClient {
|
|
|
247
316
|
return response.data;
|
|
248
317
|
}
|
|
249
318
|
async uploadPdfSlides(file) {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
319
|
+
try {
|
|
320
|
+
const checkResult = (0, utils_1.checkFile)(file, constants_1.MAX_PDF_FILE_SIZE, constants_1.ALLOWED_PDF_MIME_TYPES);
|
|
321
|
+
if (checkResult !== true) {
|
|
322
|
+
throw new Error(checkResult);
|
|
323
|
+
}
|
|
324
|
+
// Check PDF page count before proceeding
|
|
325
|
+
const pageCount = await (0, utils_1.getPdfPageCount)(file);
|
|
326
|
+
if (pageCount > constants_1.MAX_PDF_PAGES) {
|
|
327
|
+
throw new Error(`PDF has ${pageCount} pages, which exceeds the maximum allowed page count of ${constants_1.MAX_PDF_PAGES} pages.`);
|
|
328
|
+
}
|
|
329
|
+
const contentHash = await (0, utils_1.calculateHash)(file);
|
|
330
|
+
const filename = file instanceof File ? file.name : file.filename;
|
|
331
|
+
if (!filename) {
|
|
332
|
+
throw new Error('Invalid input: could not extract filename from the provided file or blob.');
|
|
333
|
+
}
|
|
334
|
+
if (/[^a-zA-Z0-9._ -]/.test(filename)) {
|
|
335
|
+
throw new Error('Filename contains invalid characters. Only English letters, numbers, dots, hyphens, and underscores are allowed.');
|
|
336
|
+
}
|
|
337
|
+
const { presignedPost } = (await this.http.post('/api/v1/pdfSlides/request-upload', {
|
|
338
|
+
contentHash,
|
|
339
|
+
filename,
|
|
340
|
+
})).data;
|
|
341
|
+
const formData = new FormData();
|
|
342
|
+
Object.entries(presignedPost.fields).forEach(([key, value]) => {
|
|
343
|
+
formData.append(key, value);
|
|
344
|
+
});
|
|
345
|
+
formData.append('file', file);
|
|
346
|
+
await axios_1.default.post(presignedPost.url, formData, {
|
|
347
|
+
headers: {
|
|
348
|
+
'Content-Type': 'multipart/form-data',
|
|
349
|
+
},
|
|
350
|
+
});
|
|
351
|
+
/*
|
|
352
|
+
// replace const { presignedPost } with const { presignedPost, objectKey }
|
|
353
|
+
// Uncomment this block if you are testing locally without AWS EventBridge
|
|
354
|
+
await this.http.post('/api/v1/pdfSlides/test-event-bridge', {
|
|
355
|
+
s3Name: objectKey,
|
|
356
|
+
});
|
|
357
|
+
*/
|
|
358
|
+
return 'PDF upload successful';
|
|
359
|
+
}
|
|
360
|
+
catch (e) {
|
|
361
|
+
if (axios_1.default.isAxiosError(e)) {
|
|
362
|
+
console.error('Error uploading PDF slides:', e.response?.data?.message || e.message);
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
console.error('Error uploading PDF slides:', e instanceof Error ? e.message : 'Unknown error');
|
|
366
|
+
}
|
|
367
|
+
throw e;
|
|
368
|
+
}
|
|
254
369
|
}
|
|
255
370
|
async getRecommendations() {
|
|
256
371
|
try {
|
|
@@ -264,6 +379,55 @@ class PlatoApiClient {
|
|
|
264
379
|
throw e;
|
|
265
380
|
}
|
|
266
381
|
}
|
|
382
|
+
async getSlidesAnalysis(queryParams) {
|
|
383
|
+
try {
|
|
384
|
+
const res = await this.http.get('/api/v1/pdfSlides', {
|
|
385
|
+
params: queryParams,
|
|
386
|
+
});
|
|
387
|
+
return res.data;
|
|
388
|
+
}
|
|
389
|
+
catch (e) {
|
|
390
|
+
if (axios_1.default.isAxiosError(e)) {
|
|
391
|
+
console.error('Error getting PDF slides analysis:', e.response?.data.message);
|
|
392
|
+
}
|
|
393
|
+
throw e;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
async getSlideAnalysis(id) {
|
|
397
|
+
try {
|
|
398
|
+
const res = await this.http.get(`/api/v1/pdfSlides/${id}`);
|
|
399
|
+
return res.data;
|
|
400
|
+
}
|
|
401
|
+
catch (e) {
|
|
402
|
+
if (axios_1.default.isAxiosError(e)) {
|
|
403
|
+
console.error('Error getting PDF slide analysis by ID:', e.response?.data.message);
|
|
404
|
+
}
|
|
405
|
+
throw e;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
async deleteSlideAnalysis(id) {
|
|
409
|
+
try {
|
|
410
|
+
await this.http.delete(`/api/v1/pdfSlides/${id}`);
|
|
411
|
+
}
|
|
412
|
+
catch (e) {
|
|
413
|
+
if (axios_1.default.isAxiosError(e)) {
|
|
414
|
+
console.error('Error deleting PDF slide analysis:', e.response?.data.message);
|
|
415
|
+
}
|
|
416
|
+
throw e;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
async getAssistantImages() {
|
|
420
|
+
try {
|
|
421
|
+
const res = await this.http.get('/api/v1/assistant-images');
|
|
422
|
+
return res.data;
|
|
423
|
+
}
|
|
424
|
+
catch (e) {
|
|
425
|
+
if (axios_1.default.isAxiosError(e)) {
|
|
426
|
+
console.error('Error getting assistant images:', e.response?.data.message);
|
|
427
|
+
}
|
|
428
|
+
throw e;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
267
431
|
}
|
|
268
432
|
exports.PlatoApiClient = PlatoApiClient;
|
|
269
433
|
//# sourceMappingURL=plato-sdk.js.map
|
package/src/lib/plato-sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plato-sdk.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/plato-sdk.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plato-sdk.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/plato-sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates a file against size and type constraints.
|
|
3
|
+
*
|
|
4
|
+
* @param file - The file to check.
|
|
5
|
+
* @param maxFileSize - The maximum allowed file size in bytes.
|
|
6
|
+
* @param allowedMimeTypes - An array of allowed MIME types.
|
|
7
|
+
* @returns true if valid, or a descriptive error message if invalid.
|
|
8
|
+
*/
|
|
9
|
+
export declare function checkFile(file: File | Blob, maxFileSize: number, allowedMimeTypes: string[]): true | string;
|
|
10
|
+
/**
|
|
11
|
+
* Calculates the SHA-256 hash of a file or blob.
|
|
12
|
+
*
|
|
13
|
+
* @param file - The file or blob to hash.
|
|
14
|
+
* @returns A promise that resolves to the hexadecimal SHA-256 hash.
|
|
15
|
+
*/
|
|
16
|
+
export declare function calculateHash(file: File | Blob): Promise<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Gets the page count of a PDF file.
|
|
19
|
+
*
|
|
20
|
+
* @param file - The PDF file or blob to check.
|
|
21
|
+
* @returns A promise that resolves to the number of pages in the PDF.
|
|
22
|
+
* @throws Error if the PDF cannot be parsed.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getPdfPageCount(file: File | Blob): Promise<number>;
|
package/src/lib/utils.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkFile = checkFile;
|
|
4
|
+
exports.calculateHash = calculateHash;
|
|
5
|
+
exports.getPdfPageCount = getPdfPageCount;
|
|
6
|
+
/**
|
|
7
|
+
* Copyright (c) 2025 ctcHealth. All rights reserved.
|
|
8
|
+
*
|
|
9
|
+
* This file is part of the ctcHealth Plato Platform, a proprietary software system developed by ctcHealth.
|
|
10
|
+
*
|
|
11
|
+
* This source code and all related materials are confidential and proprietary to ctcHealth.
|
|
12
|
+
* Unauthorized access, use, copying, modification, distribution, or disclosure is strictly prohibited
|
|
13
|
+
* and may result in disciplinary action and civil and/or criminal penalties.
|
|
14
|
+
*
|
|
15
|
+
* This software is intended solely for authorized use within ctcHealth and its designated partners.
|
|
16
|
+
*
|
|
17
|
+
* For internal use only.
|
|
18
|
+
*/
|
|
19
|
+
const pdf_lib_1 = require("pdf-lib");
|
|
20
|
+
/**
|
|
21
|
+
* Validates a file against size and type constraints.
|
|
22
|
+
*
|
|
23
|
+
* @param file - The file to check.
|
|
24
|
+
* @param maxFileSize - The maximum allowed file size in bytes.
|
|
25
|
+
* @param allowedMimeTypes - An array of allowed MIME types.
|
|
26
|
+
* @returns true if valid, or a descriptive error message if invalid.
|
|
27
|
+
*/
|
|
28
|
+
function checkFile(file, maxFileSize, allowedMimeTypes) {
|
|
29
|
+
if (file.size > maxFileSize) {
|
|
30
|
+
const uploadedSizeMB = (file.size / (1024 * 1024)).toFixed(2);
|
|
31
|
+
const maxSizeMB = (maxFileSize / (1024 * 1024)).toFixed(2);
|
|
32
|
+
return `File size (${uploadedSizeMB} MB) exceeds the maximum allowed size of ${maxSizeMB} MB.`;
|
|
33
|
+
}
|
|
34
|
+
if (!allowedMimeTypes.includes(file.type)) {
|
|
35
|
+
return `Invalid file type: ${file.type}. Allowed types are: ${allowedMimeTypes.join(', ')}.`;
|
|
36
|
+
}
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Calculates the SHA-256 hash of a file or blob.
|
|
41
|
+
*
|
|
42
|
+
* @param file - The file or blob to hash.
|
|
43
|
+
* @returns A promise that resolves to the hexadecimal SHA-256 hash.
|
|
44
|
+
*/
|
|
45
|
+
async function calculateHash(file) {
|
|
46
|
+
const arrayBuffer = await file.arrayBuffer();
|
|
47
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', arrayBuffer);
|
|
48
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
49
|
+
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
|
50
|
+
return hashHex;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Gets the page count of a PDF file.
|
|
54
|
+
*
|
|
55
|
+
* @param file - The PDF file or blob to check.
|
|
56
|
+
* @returns A promise that resolves to the number of pages in the PDF.
|
|
57
|
+
* @throws Error if the PDF cannot be parsed.
|
|
58
|
+
*/
|
|
59
|
+
async function getPdfPageCount(file) {
|
|
60
|
+
try {
|
|
61
|
+
const arrayBuffer = await file.arrayBuffer();
|
|
62
|
+
const pdf = await pdf_lib_1.PDFDocument.load(arrayBuffer);
|
|
63
|
+
return pdf.getPageCount();
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
const message = err instanceof Error ? err.message : 'Unknown error';
|
|
67
|
+
throw new Error(`Failed to read PDF page count: ${message}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/utils.ts"],"names":[],"mappings":";;AAuBA,8BAgBC;AAQD,sCAMC;AASD,0CASC;AAvED;;;;;;;;;;;;GAYG;AACH,qCAAsC;AAEtC;;;;;;;GAOG;AACH,SAAgB,SAAS,CACvB,IAAiB,EACjB,WAAmB,EACnB,gBAA0B;IAE1B,IAAI,IAAI,CAAC,IAAI,GAAG,WAAW,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,CAAC,WAAW,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,cAAc,cAAc,4CAA4C,SAAS,MAAM,CAAC;IACjG,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,OAAO,sBAAsB,IAAI,CAAC,IAAI,wBAAwB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC/F,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,aAAa,CAAC,IAAiB;IACnD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,eAAe,CAAC,IAAiB;IACrD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,qBAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChD,OAAO,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,kCAAkC,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
|