From cf3320a4ea8b77c8369d3174bffd1834b2eee82d Mon Sep 17 00:00:00 2001
From: Alex Yang <himself65@outlook.com>
Date: Sun, 6 Oct 2024 19:15:55 -0700
Subject: [PATCH] fix: improve `getResponseSynthesizer` type (#1304)

---
 .../core/src/response-synthesizers/factory.ts | 32 +++++++++----------
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/packages/core/src/response-synthesizers/factory.ts b/packages/core/src/response-synthesizers/factory.ts
index 5d14b025e..85d4d3e5f 100644
--- a/packages/core/src/response-synthesizers/factory.ts
+++ b/packages/core/src/response-synthesizers/factory.ts
@@ -403,27 +403,27 @@ class MultiModal extends BaseSynthesizer {
   }
 }
 
-export function getResponseSynthesizer(
-  mode: ResponseMode,
+const modeToSynthesizer = {
+  compact: CompactAndRefine,
+  refine: Refine,
+  tree_summarize: TreeSummarize,
+  multi_modal: MultiModal,
+} as const;
+
+export function getResponseSynthesizer<Mode extends ResponseMode>(
+  mode: Mode,
   options: BaseSynthesizerOptions & {
     textQATemplate?: TextQAPrompt;
     refineTemplate?: RefinePrompt;
     summaryTemplate?: TreeSummarizePrompt;
     metadataMode?: MetadataMode;
   } = {},
-) {
-  switch (mode) {
-    case "compact": {
-      return new CompactAndRefine(options);
-    }
-    case "refine": {
-      return new Refine(options);
-    }
-    case "tree_summarize": {
-      return new TreeSummarize(options);
-    }
-    case "multi_modal": {
-      return new MultiModal(options);
-    }
+): InstanceType<(typeof modeToSynthesizer)[Mode]> {
+  const Synthesizer: (typeof modeToSynthesizer)[Mode] = modeToSynthesizer[mode];
+  if (!Synthesizer) {
+    throw new Error(`Invalid response mode: ${mode}`);
   }
+  return new Synthesizer(options) as InstanceType<
+    (typeof modeToSynthesizer)[Mode]
+  >;
 }
-- 
GitLab