From fc7cc209f58d01d81dee17c06dd49c9cca99b128 Mon Sep 17 00:00:00 2001 From: Shuchang Zheng Date: Sat, 1 Feb 2025 16:31:17 +0800 Subject: [PATCH] show error for invalid schema in extraction, text prompt, pdf parser (#1696) --- .../editor/nodes/PDFParserNode/types.ts | 5 +++ .../editor/nodes/TextPromptNode/types.ts | 5 +++ .../workflows/editor/workflowEditorUtils.ts | 33 +++++++++++++++++-- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/skyvern-frontend/src/routes/workflows/editor/nodes/PDFParserNode/types.ts b/skyvern-frontend/src/routes/workflows/editor/nodes/PDFParserNode/types.ts index d9ad6142..f29f6aff 100644 --- a/skyvern-frontend/src/routes/workflows/editor/nodes/PDFParserNode/types.ts +++ b/skyvern-frontend/src/routes/workflows/editor/nodes/PDFParserNode/types.ts @@ -1,5 +1,6 @@ import type { Node } from "@xyflow/react"; import { NodeBaseData } from "../types"; +import { AppNode } from ".."; export type PDFParserNodeData = NodeBaseData & { fileUrl: string; @@ -15,3 +16,7 @@ export const pdfParserNodeDefaultData: PDFParserNodeData = { continueOnFailure: false, jsonSchema: "null", } as const; + +export function isPdfParserNode(node: AppNode): node is PDFParserNode { + return node.type === "pdfParser"; +} diff --git a/skyvern-frontend/src/routes/workflows/editor/nodes/TextPromptNode/types.ts b/skyvern-frontend/src/routes/workflows/editor/nodes/TextPromptNode/types.ts index bff6d0fd..a1e1d6ce 100644 --- a/skyvern-frontend/src/routes/workflows/editor/nodes/TextPromptNode/types.ts +++ b/skyvern-frontend/src/routes/workflows/editor/nodes/TextPromptNode/types.ts @@ -1,5 +1,6 @@ import type { Node } from "@xyflow/react"; import { NodeBaseData } from "../types"; +import { AppNode } from ".."; export type TextPromptNodeData = NodeBaseData & { prompt: string; @@ -17,3 +18,7 @@ export const textPromptNodeDefaultData: TextPromptNodeData = { continueOnFailure: false, parameterKeys: [], } as const; + +export function isTextPromptNode(node: AppNode): node is TextPromptNode { + return node.type === "textPrompt"; +} diff --git a/skyvern-frontend/src/routes/workflows/editor/workflowEditorUtils.ts b/skyvern-frontend/src/routes/workflows/editor/workflowEditorUtils.ts index fa3a085e..deb3ebde 100644 --- a/skyvern-frontend/src/routes/workflows/editor/workflowEditorUtils.ts +++ b/skyvern-frontend/src/routes/workflows/editor/workflowEditorUtils.ts @@ -67,7 +67,10 @@ import { StartNodeData, } from "./nodes/StartNode/types"; import { isTaskNode, taskNodeDefaultData } from "./nodes/TaskNode/types"; -import { textPromptNodeDefaultData } from "./nodes/TextPromptNode/types"; +import { + isTextPromptNode, + textPromptNodeDefaultData, +} from "./nodes/TextPromptNode/types"; import { NodeBaseData } from "./nodes/types"; import { uploadNodeDefaultData } from "./nodes/UploadNode/types"; import { @@ -87,7 +90,10 @@ import { loginNodeDefaultData } from "./nodes/LoginNode/types"; import { isWaitNode, waitNodeDefaultData } from "./nodes/WaitNode/types"; import { fileDownloadNodeDefaultData } from "./nodes/FileDownloadNode/types"; import { ProxyLocation } from "@/api/types"; -import { pdfParserNodeDefaultData } from "./nodes/PDFParserNode/types"; +import { + isPdfParserNode, + pdfParserNodeDefaultData, +} from "./nodes/PDFParserNode/types"; import { taskv2NodeDefaultData } from "./nodes/Taskv2Node/types"; import { urlNodeDefaultData } from "./nodes/URLNode/types"; @@ -1898,6 +1904,29 @@ function getWorkflowErrors(nodes: Array): Array { if (node.data.dataExtractionGoal.length === 0) { errors.push(`${node.data.label}: Data extraction goal is required.`); } + try { + JSON.parse(node.data.dataSchema); + } catch { + errors.push(`${node.data.label}: Data schema is not valid JSON.`); + } + }); + + const textPromptNodes = nodes.filter(isTextPromptNode); + textPromptNodes.forEach((node) => { + try { + JSON.parse(node.data.jsonSchema); + } catch { + errors.push(`${node.data.label}: Data schema is not valid JSON.`); + } + }); + + const pdfParserNodes = nodes.filter(isPdfParserNode); + pdfParserNodes.forEach((node) => { + try { + JSON.parse(node.data.jsonSchema); + } catch { + errors.push(`${node.data.label}: Data schema is not valid JSON.`); + } }); const waitNodes = nodes.filter(isWaitNode);