Bläddra i källkod

support json export

wangwentong 1 år sedan
förälder
incheckning
b380421fd5
1 ändrade filer med 49 tillägg och 12 borttagningar
  1. 49 12
      app/components/exporter.tsx

+ 49 - 12
app/components/exporter.tsx

@@ -127,7 +127,7 @@ export function MessageExporter() {
   ];
   const { currentStep, setCurrentStepIndex, currentStepIndex } =
     useSteps(steps);
-  const formats = ["text", "image"] as const;
+  const formats = ["text", "image", "json"] as const;
   type ExportFormat = (typeof formats)[number];
 
   const [exportConfig, setExportConfig] = useState({
@@ -157,7 +157,21 @@ export function MessageExporter() {
     session.mask.context,
     selection,
   ]);
-
+  function preview() {
+    if (exportConfig.format === "text") {
+      return (
+        <MarkdownPreviewer messages={selectedMessages} topic={session.topic} />
+      );
+    } else if (exportConfig.format === "json") {
+      return (
+        <JsonPreviewer messages={selectedMessages} topic={session.topic} />
+      );
+    } else {
+      return (
+        <ImagePreviewer messages={selectedMessages} topic={session.topic} />
+      );
+    }
+  }
   return (
     <>
       <Steps
@@ -212,16 +226,7 @@ export function MessageExporter() {
         />
       </div>
       {currentStep.value === "preview" && (
-        <div className={styles["message-exporter-body"]}>
-          {exportConfig.format === "text" ? (
-            <MarkdownPreviewer
-              messages={selectedMessages}
-              topic={session.topic}
-            />
-          ) : (
-            <ImagePreviewer messages={selectedMessages} topic={session.topic} />
-          )}
-        </div>
+        <div className={styles["message-exporter-body"]}>{preview()}</div>
       )}
     </>
   );
@@ -545,12 +550,44 @@ export function MarkdownPreviewer(props: {
   const download = () => {
     downloadAs(mdText, `${props.topic}.md`);
   };
+  return (
+    <>
+      <PreviewActions
+        copy={copy}
+        download={download}
+        showCopy={true}
+        messages={props.messages}
+      />
+      <div className="markdown-body">
+        <pre className={styles["export-content"]}>{mdText}</pre>
+      </div>
+    </>
+  );
+}
+
+export function JsonPreviewer(props: {
+  messages: ChatMessage[];
+  topic: string;
+}) {
+  const msgs = props.messages.map((m) => ({
+    role: m.role,
+    content: m.content,
+  }));
+  const mdText = "\n" + JSON.stringify(msgs, null, 2) + "\n";
+
+  const copy = () => {
+    copyToClipboard(JSON.stringify(msgs, null, 2));
+  };
+  const download = () => {
+    downloadAs(JSON.stringify(msgs, null, 2), `${props.topic}.json`);
+  };
 
   return (
     <>
       <PreviewActions
         copy={copy}
         download={download}
+        showCopy={true}
         messages={props.messages}
       />
       <div className="markdown-body">