whio-api-sdk 1.0.177-beta → 1.0.179-beta

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 CHANGED
@@ -1,2 +1,85 @@
1
1
  # whio-sdk
2
2
  A JS SDK that interacts with our medical-assistant-api
3
+
4
+ ## Audio Transcription Queue
5
+
6
+ The SDK now supports automatic audio transcription through a background queue system. When you upload audio files, they are automatically processed and transcribed.
7
+
8
+ ### Upload Audio with Transcription Queue
9
+
10
+ ```typescript
11
+ import { ApiSDK, AudioFileStatus } from 'whio-sdk';
12
+
13
+ const sdk = new ApiSDK({ baseUrl: 'https://your-api.com' });
14
+
15
+ // Simple upload (automatically triggers transcription)
16
+ const audioFile = await sdk.uploadAudioFileToSession(sessionId, file);
17
+
18
+ // Upload with cultural context
19
+ const audioFileWithContext = await sdk.uploadAudioFileToSession(
20
+ sessionId,
21
+ file,
22
+ 'audio.mp3',
23
+ 'This is cultural context for the audio'
24
+ );
25
+
26
+ // Alternative method with options object
27
+ const audioFileAlt = await sdk.uploadAudioFileWithTranscriptionQueue(sessionId, file, {
28
+ fileName: 'recording.mp3',
29
+ culturalTranscription: 'Patient discussing symptoms in Māori'
30
+ });
31
+ ```
32
+
33
+ ### Check Transcription Results
34
+
35
+ ```typescript
36
+ // Get specific audio file with transcription results
37
+ const audioFile = await sdk.getAudioFile(audioFileId);
38
+
39
+ if (audioFile.status === AudioFileStatus.TRANSCRIBED) {
40
+ console.log('Transcription:', audioFile.transcription);
41
+ console.log('Cultural Context:', audioFile.cultural_transcription);
42
+ }
43
+
44
+ // Get all transcribed files
45
+ const transcribedFiles = await sdk.getTranscribedAudioFiles();
46
+
47
+ // Get files currently being processed
48
+ const processingFiles = await sdk.getProcessingAudioFiles();
49
+
50
+ // Get failed transcriptions
51
+ const failedFiles = await sdk.getFailedAudioFiles();
52
+ ```
53
+
54
+ ### Audio File Status
55
+
56
+ Audio files have the following status values:
57
+ - `UPLOADED` - File uploaded, waiting for transcription
58
+ - `PROCESSING` - Currently being transcribed
59
+ - `TRANSCRIBED` - Transcription complete
60
+ - `FAILED` - Transcription failed
61
+
62
+ ### Key Features
63
+
64
+ - **Automatic Processing**: Upload triggers transcription automatically
65
+ - **Serial Processing**: Files are processed one at a time for reliability
66
+ - **Cultural Context**: Optional cultural transcription field for context
67
+ - **Status Tracking**: Monitor transcription progress
68
+ - **Error Handling**: Graceful handling of transcription failures
69
+ - **Fire and Forget**: No polling required - just upload and check later
70
+
71
+ ### Example Usage
72
+
73
+ ```typescript
74
+ // Upload and get immediate response
75
+ const audioFile = await sdk.uploadAudioFileToSession(sessionId, audioBlob, 'recording.wav');
76
+ console.log('Status:', audioFile.status); // 'UPLOADED'
77
+
78
+ // Check later for transcription results
79
+ setTimeout(async () => {
80
+ const updatedFile = await sdk.getAudioFile(audioFile.id);
81
+ if (updatedFile.status === AudioFileStatus.TRANSCRIBED) {
82
+ console.log('Transcription ready:', updatedFile.transcription);
83
+ }
84
+ }, 10000); // Check after 10 seconds
85
+ ```
@@ -39,9 +39,9 @@ export declare class ApiSDK {
39
39
  getTemplates(): Promise<Template[]>;
40
40
  getTemplatesByOrganization(): Promise<Template[]>;
41
41
  getUserTemplates(): Promise<UserTemplate[]>;
42
- generateTranscriptionSummary(transcript: string, templateId: string, sessionId: string): Promise<TranscriptionSummary>;
42
+ generateTranscriptionSummary(templateId: string, sessionId: string): Promise<TranscriptionSummary>;
43
43
  getByOrganizationTranscriptionSummaries(organizationId: string): Promise<TranscriptionSummary[]>;
44
- generateTranscriptionSummaryFromUserTemplate(transcript: string, userTemplateId: string): Promise<TranscriptionSummary>;
44
+ generateTranscriptionSummaryFromUserTemplate(userTemplateId: string, sessionId: string): Promise<TranscriptionSummary>;
45
45
  updateTranscriptionSummary(id: string, content: string): Promise<TranscriptionSummary>;
46
46
  uploadLargeAudioFile(formData: FormData): Promise<string>;
47
47
  uploadAudioFile(formData: FormData): Promise<TranscriptionAudioUploadResponse | null>;
@@ -102,7 +102,11 @@ export declare class ApiSDK {
102
102
  getAgentSettingsByAgentAndOrganization(agentId: string, organizationId: string): Promise<AgentSettings>;
103
103
  updateAgentSettings(id: string, settingsData: UpdateAgentSettingsDto): Promise<AgentSettings>;
104
104
  deleteAgentSettings(id: string): Promise<void>;
105
- uploadAudioFileToSession(sessionId: string, file: File | Blob, fileName?: string): Promise<AudioFile>;
105
+ uploadAudioFileToSession(sessionId: string, file: File | Blob, fileName?: string, culturalTranscription?: string): Promise<AudioFile>;
106
+ uploadAudioFileWithTranscriptionQueue(sessionId: string, file: File | Blob, options?: {
107
+ fileName?: string;
108
+ culturalTranscription?: string;
109
+ }): Promise<AudioFile>;
106
110
  getMyAudioFiles(): Promise<AudioFile[]>;
107
111
  getAllAudioFiles(): Promise<AudioFile[]>;
108
112
  getOrganizationAudioFiles(): Promise<AudioFile[]>;
@@ -112,4 +116,7 @@ export declare class ApiSDK {
112
116
  deleteAudioFile(id: string): Promise<void>;
113
117
  downloadAudioFile(id: string): Promise<Blob>;
114
118
  downloadAudioFileAsUrl(id: string): Promise<string>;
119
+ getTranscribedAudioFiles(): Promise<AudioFile[]>;
120
+ getProcessingAudioFiles(): Promise<AudioFile[]>;
121
+ getFailedAudioFiles(): Promise<AudioFile[]>;
115
122
  }
@@ -8,7 +8,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  // sdk.ts
11
- import { OrganizationRoleType, } from './types';
11
+ import { OrganizationRoleType, AudioFileStatus, } from './types';
12
12
  import urls from './urls';
13
13
  import { jwtDecode } from 'jwt-decode';
14
14
  export class ApiSDK {
@@ -365,10 +365,9 @@ export class ApiSDK {
365
365
  // ======================
366
366
  // trANSCRIPTION SUMMARY METHODS
367
367
  // ======================
368
- generateTranscriptionSummary(transcript, templateId, sessionId) {
368
+ generateTranscriptionSummary(templateId, sessionId) {
369
369
  return __awaiter(this, void 0, void 0, function* () {
370
370
  const generateSummaryDto = {
371
- transcript,
372
371
  templateId,
373
372
  userId: this.user.id,
374
373
  fromUserTemplate: false,
@@ -383,13 +382,13 @@ export class ApiSDK {
383
382
  return this.request(`${urls.transcriptionSummaries}/organization/${organizationId}`, 'GET');
384
383
  });
385
384
  }
386
- generateTranscriptionSummaryFromUserTemplate(transcript, userTemplateId) {
385
+ generateTranscriptionSummaryFromUserTemplate(userTemplateId, sessionId) {
387
386
  return __awaiter(this, void 0, void 0, function* () {
388
387
  const generateSummaryDto = {
389
- transcript,
390
388
  templateId: userTemplateId,
391
389
  userId: this.user.id,
392
390
  fromUserTemplate: true,
391
+ sessionId: sessionId,
393
392
  };
394
393
  const transcriptionSummary = yield this.request(urls.transcriptionSummary, 'POST', generateSummaryDto);
395
394
  return transcriptionSummary;
@@ -766,10 +765,24 @@ export class ApiSDK {
766
765
  // ======================
767
766
  // AUDIO FILE METHODS
768
767
  // ======================
769
- uploadAudioFileToSession(sessionId, file, fileName) {
768
+ uploadAudioFileToSession(sessionId, file, fileName, culturalTranscription) {
770
769
  return __awaiter(this, void 0, void 0, function* () {
771
770
  const formData = new FormData();
772
771
  formData.append('file', file, fileName);
772
+ if (culturalTranscription) {
773
+ formData.append('cultural_transcription', culturalTranscription);
774
+ }
775
+ return this.fileUploadRequest(`${urls.audioFiles}/upload/${sessionId}`, formData);
776
+ });
777
+ }
778
+ uploadAudioFileWithTranscriptionQueue(sessionId, file, options) {
779
+ return __awaiter(this, void 0, void 0, function* () {
780
+ const formData = new FormData();
781
+ formData.append('file', file, options === null || options === void 0 ? void 0 : options.fileName);
782
+ if (options === null || options === void 0 ? void 0 : options.culturalTranscription) {
783
+ formData.append('cultural_transcription', options.culturalTranscription);
784
+ }
785
+ // This will automatically trigger the transcription queue
773
786
  return this.fileUploadRequest(`${urls.audioFiles}/upload/${sessionId}`, formData);
774
787
  });
775
788
  }
@@ -837,4 +850,25 @@ export class ApiSDK {
837
850
  return URL.createObjectURL(blob);
838
851
  });
839
852
  }
853
+ // ======================
854
+ // TRANSCRIPTION QUEUE HELPER METHODS
855
+ // ======================
856
+ getTranscribedAudioFiles() {
857
+ return __awaiter(this, void 0, void 0, function* () {
858
+ const audioFiles = yield this.getMyAudioFiles();
859
+ return audioFiles.filter(file => file.status === AudioFileStatus.TRANSCRIBED && file.transcription);
860
+ });
861
+ }
862
+ getProcessingAudioFiles() {
863
+ return __awaiter(this, void 0, void 0, function* () {
864
+ const audioFiles = yield this.getMyAudioFiles();
865
+ return audioFiles.filter(file => file.status === AudioFileStatus.PROCESSING);
866
+ });
867
+ }
868
+ getFailedAudioFiles() {
869
+ return __awaiter(this, void 0, void 0, function* () {
870
+ const audioFiles = yield this.getMyAudioFiles();
871
+ return audioFiles.filter(file => file.status === AudioFileStatus.FAILED);
872
+ });
873
+ }
840
874
  }
@@ -93,11 +93,10 @@ export interface UpdateTemplateDto {
93
93
  categoryId?: string;
94
94
  }
95
95
  export interface GenerateTranscriptionSummaryDto {
96
- transcript?: string;
97
96
  templateId: string;
98
97
  userId?: string;
99
98
  fromUserTemplate?: boolean;
100
- sessionId?: string;
99
+ sessionId: string;
101
100
  }
102
101
  export interface UpdateTranscriptionSummaryDto {
103
102
  anonymisedTranscript?: string;
@@ -270,6 +269,8 @@ export interface PasswordChangeResponse {
270
269
  export interface Session {
271
270
  id: string;
272
271
  transcript: string;
272
+ medicalTranscription?: string;
273
+ culturalTranscription?: string;
273
274
  dateTime: string;
274
275
  startDateTime?: string;
275
276
  stopDateTime?: string;
@@ -288,6 +289,8 @@ export interface Session {
288
289
  }
289
290
  export interface CreateSessionDto {
290
291
  transcript: string;
292
+ medicalTranscription?: string;
293
+ culturalTranscription?: string;
291
294
  dateTime: string;
292
295
  startDateTime?: string;
293
296
  stopDateTime?: string;
@@ -299,6 +302,8 @@ export interface CreateSessionDto {
299
302
  }
300
303
  export interface UpdateSessionDto {
301
304
  transcript?: string;
305
+ medicalTranscription?: string;
306
+ culturalTranscription?: string;
302
307
  dateTime?: string;
303
308
  startDateTime?: string;
304
309
  stopDateTime?: string;
@@ -343,6 +348,8 @@ export interface AudioFile {
343
348
  mimeType: string;
344
349
  uploadId?: string;
345
350
  transcriptionUrl?: string;
351
+ transcription?: string;
352
+ cultural_transcription?: string;
346
353
  status: AudioFileStatus;
347
354
  createdAt: string;
348
355
  updatedAt: string;
@@ -362,8 +369,13 @@ export interface CreateAudioFileDto {
362
369
  }
363
370
  export interface UpdateAudioFileDto {
364
371
  transcriptionUrl?: string;
372
+ transcription?: string;
373
+ cultural_transcription?: string;
365
374
  status?: AudioFileStatus;
366
375
  }
376
+ export interface UploadAudioFileDto {
377
+ cultural_transcription?: string;
378
+ }
367
379
  export interface AgentSettings {
368
380
  id: string;
369
381
  temperature: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "whio-api-sdk",
3
- "version": "1.0.177-beta",
3
+ "version": "1.0.179-beta",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
package/src/sdk/sdk.ts CHANGED
@@ -44,6 +44,7 @@ import {
44
44
  AudioFileStatus,
45
45
  CreateAudioFileDto,
46
46
  UpdateAudioFileDto,
47
+ UploadAudioFileDto,
47
48
  AgentSettings,
48
49
  CreateAgentSettingsDto,
49
50
  UpdateAgentSettingsDto,
@@ -454,9 +455,8 @@ export class ApiSDK {
454
455
  // ======================
455
456
 
456
457
  public async generateTranscriptionSummary(
457
- transcript: string, templateId: string, sessionId: string): Promise<TranscriptionSummary> {
458
+ templateId: string, sessionId: string): Promise<TranscriptionSummary> {
458
459
  const generateSummaryDto: GenerateTranscriptionSummaryDto = {
459
- transcript,
460
460
  templateId,
461
461
  userId: this.user!.id,
462
462
  fromUserTemplate: false,
@@ -479,12 +479,12 @@ export class ApiSDK {
479
479
  }
480
480
 
481
481
  public async generateTranscriptionSummaryFromUserTemplate(
482
- transcript: string, userTemplateId: string): Promise<TranscriptionSummary> {
482
+ userTemplateId: string, sessionId: string): Promise<TranscriptionSummary> {
483
483
  const generateSummaryDto: GenerateTranscriptionSummaryDto = {
484
- transcript,
485
484
  templateId: userTemplateId,
486
485
  userId: this.user!.id,
487
486
  fromUserTemplate: true,
487
+ sessionId: sessionId,
488
488
  };
489
489
  const transcriptionSummary: TranscriptionSummary = await this.request(
490
490
  urls.transcriptionSummary,
@@ -832,10 +832,26 @@ export class ApiSDK {
832
832
  // AUDIO FILE METHODS
833
833
  // ======================
834
834
 
835
- public async uploadAudioFileToSession(sessionId: string, file: File | Blob, fileName?: string): Promise<AudioFile> {
835
+ public async uploadAudioFileToSession(sessionId: string, file: File | Blob, fileName?: string, culturalTranscription?: string): Promise<AudioFile> {
836
836
  const formData = new FormData();
837
837
  formData.append('file', file, fileName);
838
838
 
839
+ if (culturalTranscription) {
840
+ formData.append('cultural_transcription', culturalTranscription);
841
+ }
842
+
843
+ return this.fileUploadRequest<AudioFile>(`${urls.audioFiles}/upload/${sessionId}`, formData);
844
+ }
845
+
846
+ public async uploadAudioFileWithTranscriptionQueue(sessionId: string, file: File | Blob, options?: { fileName?: string; culturalTranscription?: string }): Promise<AudioFile> {
847
+ const formData = new FormData();
848
+ formData.append('file', file, options?.fileName);
849
+
850
+ if (options?.culturalTranscription) {
851
+ formData.append('cultural_transcription', options.culturalTranscription);
852
+ }
853
+
854
+ // This will automatically trigger the transcription queue
839
855
  return this.fileUploadRequest<AudioFile>(`${urls.audioFiles}/upload/${sessionId}`, formData);
840
856
  }
841
857
 
@@ -902,4 +918,23 @@ export class ApiSDK {
902
918
  return URL.createObjectURL(blob);
903
919
  }
904
920
 
921
+ // ======================
922
+ // TRANSCRIPTION QUEUE HELPER METHODS
923
+ // ======================
924
+
925
+ public async getTranscribedAudioFiles(): Promise<AudioFile[]> {
926
+ const audioFiles = await this.getMyAudioFiles();
927
+ return audioFiles.filter(file => file.status === AudioFileStatus.TRANSCRIBED && file.transcription);
928
+ }
929
+
930
+ public async getProcessingAudioFiles(): Promise<AudioFile[]> {
931
+ const audioFiles = await this.getMyAudioFiles();
932
+ return audioFiles.filter(file => file.status === AudioFileStatus.PROCESSING);
933
+ }
934
+
935
+ public async getFailedAudioFiles(): Promise<AudioFile[]> {
936
+ const audioFiles = await this.getMyAudioFiles();
937
+ return audioFiles.filter(file => file.status === AudioFileStatus.FAILED);
938
+ }
939
+
905
940
  }
package/src/sdk/types.ts CHANGED
@@ -125,11 +125,10 @@ export interface UpdateTemplateDto {
125
125
 
126
126
  // Transcription summary generation DTO
127
127
  export interface GenerateTranscriptionSummaryDto {
128
- transcript?: string;
129
128
  templateId: string;
130
129
  userId?: string;
131
130
  fromUserTemplate?: boolean;
132
- sessionId?: string; // Optional session ID for linking to a session
131
+ sessionId: string; // Required session ID for linking to a session
133
132
  }
134
133
 
135
134
  // Transcription summary update DTO
@@ -345,6 +344,8 @@ export interface PasswordChangeResponse {
345
344
  export interface Session {
346
345
  id: string;
347
346
  transcript: string;
347
+ medicalTranscription?: string;
348
+ culturalTranscription?: string;
348
349
  dateTime: string;
349
350
  startDateTime?: string;
350
351
  stopDateTime?: string;
@@ -367,6 +368,8 @@ export interface Session {
367
368
  // Session DTOs
368
369
  export interface CreateSessionDto {
369
370
  transcript: string;
371
+ medicalTranscription?: string;
372
+ culturalTranscription?: string;
370
373
  dateTime: string;
371
374
  startDateTime?: string;
372
375
  stopDateTime?: string;
@@ -380,6 +383,8 @@ export interface CreateSessionDto {
380
383
 
381
384
  export interface UpdateSessionDto {
382
385
  transcript?: string;
386
+ medicalTranscription?: string;
387
+ culturalTranscription?: string;
383
388
  dateTime?: string;
384
389
  startDateTime?: string;
385
390
  stopDateTime?: string;
@@ -434,6 +439,8 @@ export interface AudioFile {
434
439
  mimeType: string;
435
440
  uploadId?: string;
436
441
  transcriptionUrl?: string;
442
+ transcription?: string;
443
+ cultural_transcription?: string;
437
444
  status: AudioFileStatus;
438
445
  createdAt: string;
439
446
  updatedAt: string;
@@ -459,9 +466,16 @@ export interface CreateAudioFileDto {
459
466
 
460
467
  export interface UpdateAudioFileDto {
461
468
  transcriptionUrl?: string;
469
+ transcription?: string;
470
+ cultural_transcription?: string;
462
471
  status?: AudioFileStatus;
463
472
  }
464
473
 
474
+ // Audio File Upload DTO (for transcription queue)
475
+ export interface UploadAudioFileDto {
476
+ cultural_transcription?: string;
477
+ }
478
+
465
479
  // Agent Settings types
466
480
  export interface AgentSettings {
467
481
  id: string;