import { useCallback, useRef } from 'react'; import ReactFlow, { Background, Controls, MiniMap, ReactFlowProvider, Panel, useReactFlow } from 'reactflow'; import 'reactflow/dist/style.css'; import useFlowStore from './store/flowStore'; import LLMNode from './components/nodes/LLMNode'; import Sidebar from './components/Sidebar'; import { Plus } from 'lucide-react'; const nodeTypes = { llmNode: LLMNode, }; function Flow() { const { nodes, edges, onNodesChange, onEdgesChange, onConnect, addNode, setSelectedNode } = useFlowStore(); const reactFlowWrapper = useRef(null); const { project } = useReactFlow(); const handleAddNode = () => { const id = `node_${Date.now()}`; addNode({ id, type: 'llmNode', position: { x: Math.random() * 400, y: Math.random() * 400 }, data: { label: 'New Question', model: 'gpt-4o', temperature: 0.7, systemPrompt: '', userPrompt: '', mergeStrategy: 'smart', messages: [], traces: [], outgoingTraces: [], forkedTraces: [], response: '', status: 'idle', inputs: 1 }, }); }; const onNodeClick = (_: any, node: any) => { setSelectedNode(node.id); }; const onPaneClick = () => { setSelectedNode(null); }; const onPaneContextMenu = (event: React.MouseEvent) => { event.preventDefault(); const bounds = reactFlowWrapper.current?.getBoundingClientRect(); if (!bounds) return; const position = project({ x: event.clientX - bounds.left, y: event.clientY - bounds.top }); const id = `node_${Date.now()}`; addNode({ id, type: 'llmNode', position, data: { label: 'New Question', model: 'gpt-4o', temperature: 0.7, systemPrompt: '', userPrompt: '', mergeStrategy: 'smart', messages: [], traces: [], outgoingTraces: [], forkedTraces: [], response: '', status: 'idle', inputs: 1 }, }); }; return (
); } export default function App() { return ( ); }