|
|
@@ -19,10 +19,6 @@ export class DialogueApiError extends Error {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-export function createDialogueApi(mode: 'preview' | 'real'): DialogueAPI {
|
|
|
- return mode === 'real' ? new RealDialogueAPI() : new MockDialogueAPI()
|
|
|
-}
|
|
|
-
|
|
|
// ==================== SSE 解析 ====================
|
|
|
|
|
|
async function* parseSSEStream(reader: ReadableStreamDefaultReader<Uint8Array>): AsyncGenerator<SSEEvent> {
|
|
|
@@ -192,7 +188,8 @@ export class RealDialogueAPI implements DialogueAPI {
|
|
|
res.status,
|
|
|
)
|
|
|
}
|
|
|
- return res.json()
|
|
|
+ const body = await res.json()
|
|
|
+ return { aiMessage: body.aiMessage }
|
|
|
}
|
|
|
|
|
|
async *speak(sessionId: string, audioBlob: Blob, signal: AbortSignal): AsyncGenerator<SSEEvent> {
|
|
|
@@ -243,9 +240,8 @@ export class MockDialogueAPI implements DialogueAPI {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- async generateGreeting(_sessionId: string, _signal?: AbortSignal): Promise<GreetingInfo> {
|
|
|
- // 模拟 300ms 延迟
|
|
|
- await new Promise(r => setTimeout(r, 300))
|
|
|
+ async generateGreeting(_sessionId: string, signal?: AbortSignal): Promise<GreetingInfo> {
|
|
|
+ await delay(300, signal)
|
|
|
return { aiMessage: "Hi! What's your favorite animal?" }
|
|
|
}
|
|
|
|
|
|
@@ -296,6 +292,10 @@ export class MockDialogueAPI implements DialogueAPI {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+export function createDialogueApi(mode: 'preview' | 'real'): DialogueAPI {
|
|
|
+ return mode === 'real' ? new RealDialogueAPI() : new MockDialogueAPI()
|
|
|
+}
|
|
|
+
|
|
|
function delay(ms: number, signal?: AbortSignal): Promise<void> {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
if (signal?.aborted) { reject(new DOMException('Aborted', 'AbortError')); return }
|