Przeglądaj źródła

fix: complete speaking sessions before reports

jimmylee 2 tygodni temu
rodzic
commit
d049d184f9

+ 1 - 0
src/types/englishSpeaking.ts

@@ -286,6 +286,7 @@ export interface TaskHint {
 // 对话 API 接口
 export interface DialogueAPI {
   createSession(config: SessionConfig): Promise<SessionInfo>
+  completeSession(sessionId: string): Promise<void>
   /** Throws DOMException('AbortError') on signal abort; throws DialogueApiError on non-OK HTTP. */
   generateGreeting(sessionId: string, signal?: AbortSignal): Promise<GreetingInfo>
   generateTaskHint(sessionId: string): Promise<TaskHint>

+ 6 - 0
src/views/Editor/EnglishSpeaking/composables/useDialogueEngine.ts

@@ -230,6 +230,11 @@ export function useDialogueEngine(mode: 'preview' | 'real' = 'preview') {
     return report
   }
 
+  async function completeSession(): Promise<void> {
+    if (!sessionId.value) return
+    await api.completeSession(sessionId.value)
+  }
+
   // ==================== TTS ====================
 
   function speakTTS(text: string) {
@@ -440,6 +445,7 @@ export function useDialogueEngine(mode: 'preview' | 'real' = 'preview') {
     retryMessage,
     regenerateAiMessage,
     getReport,
+    completeSession,
     abort,
     cancelTTS,
   }

+ 1 - 0
src/views/Editor/EnglishSpeaking/preview/DialogueChatView.vue

@@ -797,6 +797,7 @@ async function handleExitConfirm() {
 
 async function fetchReportSafe(): Promise<DialogueReport | null> {
   try {
+    await engine.completeSession()
     return await engine.getReport()
   } catch (err) {
     console.warn('[speaking] getReport failed:', err)

+ 14 - 0
src/views/Editor/EnglishSpeaking/services/llmService.ts

@@ -221,6 +221,16 @@ export class RealDialogueAPI implements DialogueAPI {
     }
   }
 
+  async completeSession(sessionId: string): Promise<void> {
+    const res = await fetch(`${API_BASE}/session/${encodeURIComponent(sessionId)}/complete`, {
+      method: 'POST',
+      credentials: 'include',
+    })
+    if (!res.ok) {
+      throw new DialogueApiError(`completeSession failed: ${res.status}`, res.status)
+    }
+  }
+
   async generateGreeting(sessionId: string, signal?: AbortSignal): Promise<GreetingInfo> {
     const res = await fetch(`${API_BASE}/session/${sessionId}/greeting`, {
       method: 'POST',
@@ -297,6 +307,10 @@ export class MockDialogueAPI implements DialogueAPI {
     }
   }
 
+  async completeSession(_sessionId: string): Promise<void> {
+    return undefined
+  }
+
   async generateGreeting(_sessionId: string, signal?: AbortSignal): Promise<GreetingInfo> {
     await delay(300, signal)
     return { aiMessage: "Hi! What's your favorite animal?" }