"use client"; import { useCallback } from "react"; import { Handle, Position, NodeProps, Node } from "@xyflow/react"; import { BaseNode } from "./BaseNode"; import { useWorkflowStore } from "@/store/workflowStore"; import { LLMGenerateNodeData, LLMProvider, LLMModelType } from "@/types"; const PROVIDERS: { value: LLMProvider; label: string }[] = [ { value: "google", label: "Google" }, { value: "openai", label: "OpenAI" }, ]; const MODELS: Record = { google: [ { value: "gemini-2.5-flash", label: "Gemini 2.5 Flash" }, { value: "gemini-3-pro-preview", label: "Gemini 3.0 Pro" }, ], openai: [ { value: "gpt-4.1-mini", label: "GPT-4.1 Mini" }, { value: "gpt-4.1-nano", label: "GPT-4.1 Nano" }, ], }; type LLMGenerateNodeType = Node; export function LLMGenerateNode({ id, data, selected }: NodeProps) { const nodeData = data; const updateNodeData = useWorkflowStore((state) => state.updateNodeData); const handleProviderChange = useCallback( (e: React.ChangeEvent) => { const newProvider = e.target.value as LLMProvider; const firstModelForProvider = MODELS[newProvider][0].value; updateNodeData(id, { provider: newProvider, model: firstModelForProvider }); }, [id, updateNodeData] ); const handleModelChange = useCallback( (e: React.ChangeEvent) => { updateNodeData(id, { model: e.target.value as LLMModelType }); }, [id, updateNodeData] ); const handleTemperatureChange = useCallback( (e: React.ChangeEvent) => { updateNodeData(id, { temperature: parseFloat(e.target.value) }); }, [id, updateNodeData] ); const handleMaxTokensChange = useCallback( (e: React.ChangeEvent) => { updateNodeData(id, { maxTokens: parseInt(e.target.value, 10) }); }, [id, updateNodeData] ); const regenerateNode = useWorkflowStore((state) => state.regenerateNode); const isRunning = useWorkflowStore((state) => state.isRunning); const handleRegenerate = useCallback(() => { regenerateNode(id); }, [id, regenerateNode]); const handleClearOutput = useCallback(() => { updateNodeData(id, { outputText: null, status: "idle", error: null }); }, [id, updateNodeData]); const availableModels = MODELS[nodeData.provider]; return ( {/* Text input */} {/* Text output */}
{/* Output preview area */}
{nodeData.status === "loading" ? (
) : nodeData.status === "error" ? ( {nodeData.error || "Failed"} ) : nodeData.outputText ? ( <>

{nodeData.outputText}

) : (
Run to generate
)}
{/* Provider selector */} {/* Model selector */} {/* Temperature and Max Tokens row */}
); }