import React from "react"; import { Button } from "@/src/components/ui/button"; import { Dialog, DialogBody, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/src/components/ui/dialog"; import { type Prompt } from "@langfuse/shared"; import { type NewPromptFormSchemaType } from "./validation"; import DiffViewer from "@/src/components/DiffViewer"; type ReviewPromptDialogProps = { initialPrompt: Prompt; isLoading: boolean; children: React.ReactNode; onConfirm: () => void; getNewPromptValues: () => NewPromptFormSchemaType; }; const formatMessages = (messages: any[], excludeKeys: string[] = []) => { return JSON.stringify( messages.map((m) => Object.fromEntries( Object.entries(m) .filter( ([k]) => !excludeKeys.includes(k) && (k !== "type" || m.type === "placeholder"), ) .sort(([a], [b]) => a.localeCompare(b)), ), ), null, 2, ); }; export const ReviewPromptDialog: React.FC = ( props, ) => { const { initialPrompt, children, getNewPromptValues, onConfirm, isLoading } = props; const [newPromptValue, setNewPromptValues] = React.useState(null); const [open, setOpen] = React.useState(false); React.useEffect(() => { if (open) { setNewPromptValues(getNewPromptValues()); } }, [open, setNewPromptValues, getNewPromptValues]); const initialPromptContent = initialPrompt.type === "text" ? (initialPrompt.prompt as string) : formatMessages(initialPrompt.prompt as any[]); const newPromptContent = initialPrompt.type === "text" ? (newPromptValue?.textPrompt ?? "") : formatMessages(newPromptValue?.chatPrompt ?? [], ["id"]); const newConfig = JSON.stringify( JSON.parse(newPromptValue?.config ?? "{}"), null, 2, ); return ( setOpen(open)}> {children} Review Prompt Changes {initialPrompt.name}

Content

Config

); };