Workflow implementation for data schema suggestions (#1627)

This commit is contained in:
Shuchang Zheng
2025-01-23 23:36:13 +08:00
committed by GitHub
parent b42a1900e2
commit 99adf68444
5 changed files with 185 additions and 160 deletions

View File

@@ -6,12 +6,10 @@ import {
AccordionItem,
AccordionTrigger,
} from "@/components/ui/accordion";
import { Checkbox } from "@/components/ui/checkbox";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Separator } from "@/components/ui/separator";
import { Switch } from "@/components/ui/switch";
import { CodeEditor } from "@/routes/workflows/components/CodeEditor";
import { useDeleteNodeCallback } from "@/routes/workflows/hooks/useDeleteNodeCallback";
import { useNodeLabelChangeHandler } from "@/routes/workflows/hooks/useLabelChangeHandler";
import {
@@ -33,6 +31,7 @@ import { helpTooltips, placeholders } from "../../helpContent";
import { AppNode } from "..";
import { getAvailableOutputParameterKeys } from "../../workflowEditorUtils";
import { ParametersMultiSelect } from "../TaskNode/ParametersMultiSelect";
import { WorkflowDataSchemaInputGroup } from "@/components/DataSchemaInputGroup/WorkflowDataSchemaInputGroup";
function ExtractionNode({ id, data }: NodeProps<ExtractionNode>) {
const { updateNodeData } = useReactFlow();
@@ -123,44 +122,17 @@ function ExtractionNode({ id, data }: NodeProps<ExtractionNode>) {
className="nopan text-xs"
/>
</div>
<div className="space-y-2">
<div className="flex gap-4">
<div className="flex gap-2">
<Label className="text-xs text-slate-300">Data Schema</Label>
<HelpTooltip content={helpTooltips["extraction"]["dataSchema"]} />
</div>
<Checkbox
checked={inputs.dataSchema !== "null"}
onCheckedChange={(checked) => {
if (!editable) {
return;
}
handleChange(
"dataSchema",
checked
? JSON.stringify(dataSchemaExampleValue, null, 2)
: "null",
);
}}
/>
</div>
{inputs.dataSchema !== "null" && (
<div>
<CodeEditor
language="json"
value={inputs.dataSchema}
onChange={(value) => {
if (!editable) {
return;
}
handleChange("dataSchema", value);
}}
className="nowheel nopan"
fontSize={8}
/>
</div>
)}
</div>
<WorkflowDataSchemaInputGroup
value={inputs.dataSchema}
onChange={(value) => {
handleChange("dataSchema", value);
}}
exampleValue={dataSchemaExampleValue}
suggestionContext={{
data_extraction_goal: inputs.dataExtractionGoal,
current_schema: inputs.dataSchema,
}}
/>
<Separator />
<Accordion type="single" collapsible>
<AccordionItem value="advanced" className="border-b-0">

View File

@@ -1,8 +1,6 @@
import { HelpTooltip } from "@/components/HelpTooltip";
import { Checkbox } from "@/components/ui/checkbox";
import { Label } from "@/components/ui/label";
import { WorkflowBlockInput } from "@/components/WorkflowBlockInput";
import { CodeEditor } from "@/routes/workflows/components/CodeEditor";
import { useDeleteNodeCallback } from "@/routes/workflows/hooks/useDeleteNodeCallback";
import { useNodeLabelChangeHandler } from "@/routes/workflows/hooks/useLabelChangeHandler";
import { WorkflowBlockTypes } from "@/routes/workflows/types/workflowTypes";
@@ -14,6 +12,7 @@ import { NodeActionMenu } from "../NodeActionMenu";
import { dataSchemaExampleForFileExtraction } from "../types";
import { WorkflowBlockIcon } from "../WorkflowBlockIcon";
import { type PDFParserNode } from "./types";
import { WorkflowDataSchemaInputGroup } from "@/components/DataSchemaInputGroup/WorkflowDataSchemaInputGroup";
function PDFParserNode({ id, data }: NodeProps<PDFParserNode>) {
const { updateNodeData } = useReactFlow();
@@ -91,44 +90,14 @@ function PDFParserNode({ id, data }: NodeProps<PDFParserNode>) {
className="nopan text-xs"
/>
</div>
<div className="space-y-2">
<div className="flex gap-4">
<div className="flex gap-2">
<Label className="text-xs text-slate-300">Data Schema</Label>
<HelpTooltip
content={helpTooltips["pdfParser"]["jsonSchema"]}
/>
</div>
<Checkbox
checked={inputs.jsonSchema !== "null"}
onCheckedChange={(checked) => {
handleChange(
"jsonSchema",
checked
? JSON.stringify(
dataSchemaExampleForFileExtraction,
null,
2,
)
: "null",
);
}}
/>
</div>
{inputs.jsonSchema !== "null" && (
<div>
<CodeEditor
language="json"
value={inputs.jsonSchema}
onChange={(value) => {
handleChange("jsonSchema", value);
}}
className="nowheel nopan"
fontSize={8}
/>
</div>
)}
</div>
<WorkflowDataSchemaInputGroup
exampleValue={dataSchemaExampleForFileExtraction}
value={inputs.jsonSchema}
onChange={(value) => {
handleChange("jsonSchema", value);
}}
suggestionContext={{}}
/>
</div>
</div>
</div>

View File

@@ -34,6 +34,7 @@ import { dataSchemaExampleValue, errorMappingExampleValue } from "../types";
import { WorkflowBlockIcon } from "../WorkflowBlockIcon";
import { ParametersMultiSelect } from "./ParametersMultiSelect";
import type { TaskNode } from "./types";
import { WorkflowDataSchemaInputGroup } from "@/components/DataSchemaInputGroup/WorkflowDataSchemaInputGroup";
function TaskNode({ id, data }: NodeProps<TaskNode>) {
const { updateNodeData } = useReactFlow();
@@ -187,42 +188,18 @@ function TaskNode({ id, data }: NodeProps<TaskNode>) {
className="nopan text-xs"
/>
</div>
<div className="space-y-2">
<div className="flex gap-4">
<div className="flex gap-2">
<Label className="text-xs text-slate-300">
Data Schema
</Label>
<HelpTooltip
content={helpTooltips["task"]["dataSchema"]}
/>
</div>
<Checkbox
checked={inputs.dataSchema !== "null"}
onCheckedChange={(checked) => {
handleChange(
"dataSchema",
checked
? JSON.stringify(dataSchemaExampleValue, null, 2)
: "null",
);
}}
/>
</div>
{inputs.dataSchema !== "null" && (
<div>
<CodeEditor
language="json"
value={inputs.dataSchema}
onChange={(value) => {
handleChange("dataSchema", value);
}}
className="nowheel nopan"
fontSize={8}
/>
</div>
)}
</div>
<WorkflowDataSchemaInputGroup
exampleValue={dataSchemaExampleValue}
onChange={(value) => {
handleChange("dataSchema", value);
}}
value={inputs.dataSchema}
suggestionContext={{
data_extraction_goal: inputs.dataExtractionGoal,
current_schema: inputs.dataSchema,
navigation_goal: inputs.navigationGoal,
}}
/>
</div>
</AccordionContent>
</AccordionItem>

View File

@@ -1,8 +1,6 @@
import { HelpTooltip } from "@/components/HelpTooltip";
import { Checkbox } from "@/components/ui/checkbox";
import { Label } from "@/components/ui/label";
import { Separator } from "@/components/ui/separator";
import { CodeEditor } from "@/routes/workflows/components/CodeEditor";
import { useDeleteNodeCallback } from "@/routes/workflows/hooks/useDeleteNodeCallback";
import { useNodeLabelChangeHandler } from "@/routes/workflows/hooks/useLabelChangeHandler";
import { WorkflowBlockTypes } from "@/routes/workflows/types/workflowTypes";
@@ -24,6 +22,8 @@ import { ParametersMultiSelect } from "../TaskNode/ParametersMultiSelect";
import { WorkflowBlockIcon } from "../WorkflowBlockIcon";
import { type TextPromptNode } from "./types";
import { WorkflowBlockInputTextarea } from "@/components/WorkflowBlockInputTextarea";
import { WorkflowDataSchemaInputGroup } from "@/components/DataSchemaInputGroup/WorkflowDataSchemaInputGroup";
import { dataSchemaExampleValue } from "../types";
function TextPromptNode({ id, data }: NodeProps<TextPromptNode>) {
const { updateNodeData } = useReactFlow();
@@ -43,6 +43,14 @@ function TextPromptNode({ id, data }: NodeProps<TextPromptNode>) {
initialValue: data.label,
});
function handleChange(key: string, value: unknown) {
if (!editable) {
return;
}
setInputs({ ...inputs, [key]: value });
updateNodeData(id, { [key]: value });
}
return (
<div>
<Handle
@@ -92,11 +100,7 @@ function TextPromptNode({ id, data }: NodeProps<TextPromptNode>) {
isFirstInputInNode
nodeId={id}
onChange={(value) => {
if (!editable) {
return;
}
setInputs({ ...inputs, prompt: value });
updateNodeData(id, { prompt: value });
handleChange("prompt", value);
}}
value={inputs.prompt}
placeholder="What do you want to generate?"
@@ -113,43 +117,14 @@ function TextPromptNode({ id, data }: NodeProps<TextPromptNode>) {
/>
</div>
<Separator />
<div className="space-y-2">
<div className="flex gap-2">
<Label className="text-xs text-slate-300">Data Schema</Label>
<Checkbox
checked={inputs.jsonSchema !== "null"}
onCheckedChange={(checked) => {
if (!editable) {
return;
}
setInputs({
...inputs,
jsonSchema: checked ? "{}" : "null",
});
updateNodeData(id, {
jsonSchema: checked ? "{}" : "null",
});
}}
/>
</div>
{inputs.jsonSchema !== "null" && (
<div>
<CodeEditor
language="json"
value={inputs.jsonSchema}
onChange={(value) => {
if (!editable) {
return;
}
setInputs({ ...inputs, jsonSchema: value });
updateNodeData(id, { jsonSchema: value });
}}
className="nowheel nopan"
fontSize={8}
/>
</div>
)}
</div>
<WorkflowDataSchemaInputGroup
exampleValue={dataSchemaExampleValue}
value={inputs.jsonSchema}
onChange={(value) => {
handleChange("jsonSchema", value);
}}
suggestionContext={{}}
/>
</div>
</div>
);