@speakableio/core 1.0.13 → 1.0.15

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.
@@ -772,6 +772,11 @@ interface PageScore {
772
772
  hint?: string[];
773
773
  reviewed?: boolean;
774
774
  error?: ('feedback_error' | 'transcript_error' | 'summary_error' | 'audio_upload_error' | 'unknown' | null)[];
775
+ stagedResponse?: {
776
+ audio?: string | null;
777
+ fileName?: string | null;
778
+ transcript?: string | null;
779
+ } | null;
775
780
  }
776
781
 
777
782
  declare enum AssignmentAnalyticsType {
@@ -993,7 +998,9 @@ declare function useUpdateCardScore({ isAssignment, activityId, userId, cardIds,
993
998
  }, Error, {
994
999
  cardId: string;
995
1000
  cardScore: PageScore;
996
- }, void>;
1001
+ }, {
1002
+ previousData: Score | undefined;
1003
+ }>;
997
1004
  };
998
1005
  declare function useClearScore(): {
999
1006
  mutationClearScore: _tanstack_react_query.UseMutationResult<{
@@ -2772,7 +2779,7 @@ declare const useBaseOpenAI: ({ onTranscriptSuccess, onTranscriptError, onComple
2772
2779
  url: string;
2773
2780
  fileName: string;
2774
2781
  }>;
2775
- uploadAudioAndGetTranscript: (audio: string, language: string) => Promise<{
2782
+ uploadAudioAndGetTranscript: (audio: string, language: string, pagePrompt: string | null) => Promise<{
2776
2783
  transcript: string;
2777
2784
  audioUrl: string;
2778
2785
  }>;
@@ -2785,19 +2792,20 @@ declare const useBaseOpenAI: ({ onTranscriptSuccess, onTranscriptError, onComple
2785
2792
  url: string;
2786
2793
  fileName: string;
2787
2794
  }>;
2788
- uploadAudioAndGetTranscript: (audio: string, language: string) => Promise<{
2795
+ uploadAudioAndGetTranscript: (audio: string, language: string, pagePrompt: string | null) => Promise<{
2789
2796
  transcript: string;
2790
2797
  audioUrl: string;
2791
2798
  }>;
2792
- getTranscript: (audioUrl: string, language: string) => Promise<string>;
2799
+ getTranscript: (audioUrl: string, language: string, prompt?: string) => Promise<any>;
2793
2800
  getFreeResponseCompletion: (messages: string[], isFreeResponse: boolean, feedbackLanguage: string, gradingStandard?: string) => Promise<any>;
2794
- getFeedback: ({ cardId, language, writtenResponse, audio, autoGrade, file, }: {
2801
+ getFeedback: ({ cardId, language, writtenResponse, audio, autoGrade, file, pagePrompt, }: {
2795
2802
  cardId: string;
2796
2803
  language: string;
2797
2804
  writtenResponse: string | null;
2798
2805
  audio: string | null;
2799
2806
  autoGrade: boolean;
2800
2807
  file: string | null;
2808
+ pagePrompt: string | null;
2801
2809
  }) => Promise<{
2802
2810
  noFeedbackAvailable: boolean;
2803
2811
  success: boolean;
@@ -772,6 +772,11 @@ interface PageScore {
772
772
  hint?: string[];
773
773
  reviewed?: boolean;
774
774
  error?: ('feedback_error' | 'transcript_error' | 'summary_error' | 'audio_upload_error' | 'unknown' | null)[];
775
+ stagedResponse?: {
776
+ audio?: string | null;
777
+ fileName?: string | null;
778
+ transcript?: string | null;
779
+ } | null;
775
780
  }
776
781
 
777
782
  declare enum AssignmentAnalyticsType {
@@ -993,7 +998,9 @@ declare function useUpdateCardScore({ isAssignment, activityId, userId, cardIds,
993
998
  }, Error, {
994
999
  cardId: string;
995
1000
  cardScore: PageScore;
996
- }, void>;
1001
+ }, {
1002
+ previousData: Score | undefined;
1003
+ }>;
997
1004
  };
998
1005
  declare function useClearScore(): {
999
1006
  mutationClearScore: _tanstack_react_query.UseMutationResult<{
@@ -2772,7 +2779,7 @@ declare const useBaseOpenAI: ({ onTranscriptSuccess, onTranscriptError, onComple
2772
2779
  url: string;
2773
2780
  fileName: string;
2774
2781
  }>;
2775
- uploadAudioAndGetTranscript: (audio: string, language: string) => Promise<{
2782
+ uploadAudioAndGetTranscript: (audio: string, language: string, pagePrompt: string | null) => Promise<{
2776
2783
  transcript: string;
2777
2784
  audioUrl: string;
2778
2785
  }>;
@@ -2785,19 +2792,20 @@ declare const useBaseOpenAI: ({ onTranscriptSuccess, onTranscriptError, onComple
2785
2792
  url: string;
2786
2793
  fileName: string;
2787
2794
  }>;
2788
- uploadAudioAndGetTranscript: (audio: string, language: string) => Promise<{
2795
+ uploadAudioAndGetTranscript: (audio: string, language: string, pagePrompt: string | null) => Promise<{
2789
2796
  transcript: string;
2790
2797
  audioUrl: string;
2791
2798
  }>;
2792
- getTranscript: (audioUrl: string, language: string) => Promise<string>;
2799
+ getTranscript: (audioUrl: string, language: string, prompt?: string) => Promise<any>;
2793
2800
  getFreeResponseCompletion: (messages: string[], isFreeResponse: boolean, feedbackLanguage: string, gradingStandard?: string) => Promise<any>;
2794
- getFeedback: ({ cardId, language, writtenResponse, audio, autoGrade, file, }: {
2801
+ getFeedback: ({ cardId, language, writtenResponse, audio, autoGrade, file, pagePrompt, }: {
2795
2802
  cardId: string;
2796
2803
  language: string;
2797
2804
  writtenResponse: string | null;
2798
2805
  audio: string | null;
2799
2806
  autoGrade: boolean;
2800
2807
  file: string | null;
2808
+ pagePrompt: string | null;
2801
2809
  }) => Promise<{
2802
2810
  noFeedbackAvailable: boolean;
2803
2811
  success: boolean;
@@ -153,6 +153,8 @@ function withErrorHandler(fn, serviceName) {
153
153
  try {
154
154
  return await fn(...args);
155
155
  } catch (error) {
156
+ console.error(`Service ${serviceName} failed with args:`, args);
157
+ console.error("Error details:", error);
156
158
  if (error instanceof Error && "code" in error) {
157
159
  const firebaseError = error;
158
160
  throw new ServiceError(
@@ -1394,7 +1396,7 @@ function useScore({
1394
1396
  enabled
1395
1397
  });
1396
1398
  }
1397
- var debounceUpdateScore = debounce(updateScore, 1e3);
1399
+ var debounceUpdateScore = debounce(updateScore, 500);
1398
1400
  function useUpdateScore() {
1399
1401
  const { queryClient } = useSpeakableApi();
1400
1402
  const mutation = (0, import_react_query2.useMutation)({
@@ -1453,6 +1455,7 @@ function useUpdateCardScore({
1453
1455
  return { cardId, scoresUpdated: newScoreUpdated };
1454
1456
  },
1455
1457
  onMutate: ({ cardId, cardScore }) => {
1458
+ const previousData = queryClient.getQueryData(queryKey);
1456
1459
  queryClient.setQueryData(queryKey, (previousScore) => {
1457
1460
  const updates = handleOptimisticScore({
1458
1461
  score: previousScore,
@@ -1466,14 +1469,18 @@ function useUpdateCardScore({
1466
1469
  ...updates
1467
1470
  };
1468
1471
  });
1472
+ return { previousData };
1469
1473
  },
1470
- // eslint-disable-next-line no-unused-vars
1471
- onError: (error) => {
1472
- console.log(error.message);
1473
- const previousData = queryClient.getQueryData(queryKey);
1474
- if (previousData) {
1475
- queryClient.setQueryData(queryKey, previousData);
1474
+ onError: (error, variables, context) => {
1475
+ console.log("Error updating card score:", error.message);
1476
+ if (context == null ? void 0 : context.previousData) {
1477
+ queryClient.setQueryData(queryKey, context.previousData);
1476
1478
  }
1479
+ },
1480
+ onSettled: () => {
1481
+ queryClient.invalidateQueries({
1482
+ queryKey
1483
+ });
1477
1484
  }
1478
1485
  });
1479
1486
  return {
@@ -1539,6 +1546,9 @@ function useClearScore() {
1539
1546
  const { queryClient } = useSpeakableApi();
1540
1547
  const mutation = (0, import_react_query2.useMutation)({
1541
1548
  mutationFn: clearScore,
1549
+ onError: (error) => {
1550
+ console.log("Error clearing score:", error.message);
1551
+ },
1542
1552
  onSettled: (result) => {
1543
1553
  var _a;
1544
1554
  queryClient.invalidateQueries({
@@ -1554,6 +1564,9 @@ function useClearScoreV2() {
1554
1564
  const { queryClient } = useSpeakableApi();
1555
1565
  const mutation = (0, import_react_query2.useMutation)({
1556
1566
  mutationFn: clearScoreV2,
1567
+ onError: (error) => {
1568
+ console.log("Error clearing score V2:", error.message);
1569
+ },
1557
1570
  onSettled: (result) => {
1558
1571
  var _a;
1559
1572
  queryClient.invalidateQueries({
@@ -3146,21 +3159,38 @@ var useBaseOpenAI = ({
3146
3159
  const { data: feedbackAccess } = useActivityFeedbackAccess({
3147
3160
  aiEnabled
3148
3161
  });
3149
- const getTranscript = async (audioUrl, language) => {
3150
- var _a, _b;
3162
+ const getTranscript = async (audioUrl, language, prompt) => {
3163
+ var _a, _b, _c, _d;
3164
+ const getGeminiTranscript = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, "getGeminiTranscript");
3165
+ const getAssemblyAITranscript = (_d = (_c = api).httpsCallable) == null ? void 0 : _d.call(_c, "transcribeAssemblyAIAudio");
3166
+ try {
3167
+ const { data } = await (getGeminiTranscript == null ? void 0 : getGeminiTranscript({
3168
+ audioUrl,
3169
+ targetLanguage: language,
3170
+ prompt: prompt || ""
3171
+ }));
3172
+ const transcript = data.transcript;
3173
+ if (transcript) {
3174
+ return transcript;
3175
+ }
3176
+ } catch (error) {
3177
+ console.log("Gemini transcript failed, trying AssemblyAI fallback:", error);
3178
+ }
3151
3179
  try {
3152
- const getAssemblyAITranscript = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, "transcribeAssemblyAIAudio");
3153
3180
  const response = await (getAssemblyAITranscript == null ? void 0 : getAssemblyAITranscript({
3154
3181
  audioUrl,
3155
3182
  language
3156
3183
  }));
3157
3184
  const transcript = response == null ? void 0 : response.data;
3158
- return transcript;
3185
+ if (transcript) {
3186
+ return transcript;
3187
+ }
3188
+ throw new Error("Both transcript services failed");
3159
3189
  } catch (error) {
3160
- console.log("error", error);
3190
+ console.log("AssemblyAI transcript also failed:", error);
3161
3191
  onTranscriptError({
3162
3192
  type: "TRANSCRIPT",
3163
- message: (error == null ? void 0 : error.message) || "Error getting transcript"
3193
+ message: (error == null ? void 0 : error.message) || "Error getting transcript from both services"
3164
3194
  });
3165
3195
  throw new Error(error);
3166
3196
  }
@@ -3215,7 +3245,8 @@ var useBaseOpenAI = ({
3215
3245
  // if the type = RESPOND_WRITE
3216
3246
  audio = null,
3217
3247
  autoGrade = true,
3218
- file = null
3248
+ file = null,
3249
+ pagePrompt = null
3219
3250
  }) => {
3220
3251
  try {
3221
3252
  if (!(feedbackAccess == null ? void 0 : feedbackAccess.canAccessFeedback)) {
@@ -3235,7 +3266,7 @@ var useBaseOpenAI = ({
3235
3266
  onTranscriptSuccess(writtenResponse);
3236
3267
  } else if (typeof audio === "string" && file) {
3237
3268
  if (feedbackAccess == null ? void 0 : feedbackAccess.canAccessFeedback) {
3238
- transcript = await getTranscript(audio, language);
3269
+ transcript = await getTranscript(audio, language, pagePrompt != null ? pagePrompt : "");
3239
3270
  audioUrl = audio;
3240
3271
  onTranscriptSuccess(transcript);
3241
3272
  } else {
@@ -3244,7 +3275,7 @@ var useBaseOpenAI = ({
3244
3275
  );
3245
3276
  }
3246
3277
  } else {
3247
- const response = await uploadAudioAndGetTranscript(audio || "", language);
3278
+ const response = await uploadAudioAndGetTranscript(audio || "", language, pagePrompt != null ? pagePrompt : "");
3248
3279
  transcript = response.transcript;
3249
3280
  audioUrl = response.audioUrl;
3250
3281
  }
@@ -3319,8 +3350,8 @@ var useBaseOpenAI = ({
3319
3350
  feedbackData = geminiResult == null ? void 0 : geminiResult.data;
3320
3351
  }
3321
3352
  const results = {
3353
+ ...proficiencyData,
3322
3354
  ...feedbackData,
3323
- // ...proficiencyData,
3324
3355
  aiSuccess: true,
3325
3356
  promptSuccess: (feedbackData == null ? void 0 : feedbackData.success) || false,
3326
3357
  transcript