@gensx/react
Version:
React hooks and components for GenSX AI workflows.
1 lines • 24.1 kB
Source Map (JSON)
{"version":3,"file":"use-gensx.cjs","sources":["@gensx/react/../../../../src/hooks/use-gensx.ts"],"sourcesContent":["import type {\n InferToolParams,\n JsonValue,\n ToolBox,\n ToolImplementations,\n WorkflowMessage,\n} from \"@gensx/core\";\n\nimport {\n startTransition,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nexport interface WorkflowRunConfig<TInputs = unknown> {\n inputs: TInputs;\n org?: string;\n project?: string;\n environment?: string;\n}\n\nexport interface WorkflowConfig {\n baseUrl: string;\n headers?: Record<string, string>;\n}\n\nexport interface UseWorkflowConfig<\n TOutput = unknown,\n TToolBox extends ToolBox = ToolBox,\n> {\n /**\n * All workflow configuration in one place\n */\n config: WorkflowConfig;\n\n /**\n * External tools that can be called from the workflow\n */\n tools?: ToolImplementations<TToolBox>;\n\n /**\n * Callback fired when workflow starts\n */\n onStart?: (message: string) => void;\n\n /**\n * Callback fired when workflow completes\n */\n onComplete?: (output: TOutput | null) => void;\n\n /**\n * Callback fired on error\n */\n onError?: (error: string) => void;\n\n /**\n * Callback fired for any event\n */\n onEvent?: (event: WorkflowMessage) => void;\n\n /**\n * Optional transformer to convert accumulated string content to TOutput\n * If not provided, attempts automatic string/JSON parsing\n */\n outputTransformer?: (accumulatedContent: string) => TOutput;\n}\n\nexport interface UseWorkflowResult<TInputs = unknown, TOutput = unknown> {\n /** Whether the workflow is currently in progress */\n inProgress: boolean;\n\n /** Any error that occurred */\n error: string | null;\n\n /** The final output (accumulated from stream) */\n output: TOutput | null;\n\n /** All workflow message events received */\n execution: WorkflowMessage[];\n\n /** Run workflow in streaming mode */\n run: (config: WorkflowRunConfig<TInputs>) => Promise<void>;\n\n /** Run workflow in streaming mode */\n start: (config: WorkflowRunConfig<TInputs>) => Promise<void>;\n\n /** Stop the current workflow */\n stop: () => void;\n\n /** Clear all workflow state */\n clear: () => void;\n}\n\n/**\n * Hook for interacting with GenSX workflows via your API endpoint\n *\n * @example\n * ```tsx\n * const workflow = useWorkflow({\n * config: {\n * baseUrl: '/api/gensx',\n * },\n * onEvent: (event) => console.log('Event:', event)\n * });\n *\n * // Run the workflow\n * await workflow.run({ inputs: { userMessage: 'Hello' } });\n *\n * // Stream strongly-typed objects\n * const currentProgress = useObject<ProgressEvent>(workflow.execution, 'progress');\n *\n * // Process events as they come in\n * const allSteps = useEvents<StepEvent>(workflow.execution, 'step-completed', (step) => {\n * console.log('Step completed:', step);\n * });\n *\n * // Clear workflow state\n * workflow.clear();\n * ```\n */\nexport function useWorkflow<\n TInputs = unknown,\n TOutput = unknown,\n TToolBox extends ToolBox = ToolBox,\n>(\n options: UseWorkflowConfig<TOutput, TToolBox>,\n): UseWorkflowResult<TInputs, TOutput> {\n const {\n config,\n tools,\n onStart,\n onComplete,\n onError,\n onEvent,\n outputTransformer,\n } = options;\n\n const { baseUrl, headers = {} } = config;\n\n // State\n const [inProgress, setInProgress] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [output, setOutput] = useState<TOutput | null>(null);\n const [events, setEvents] = useState<WorkflowMessage[]>([]);\n\n // Refs\n const abortControllerRef = useRef<AbortController | null>(null);\n const outputRef = useRef<TOutput | null>(null);\n const accumulatedStringRef = useRef<string>(\"\");\n const executionId = useRef<string | null>(null);\n\n // Process a single WorkflowMessage event\n const processEvent = useCallback(\n (event: WorkflowMessage) => {\n // Batch all state updates for this event to prevent race conditions\n startTransition(async () => {\n // Add event to events array\n setEvents((prev) => [...prev, event]);\n\n // Fire the onEvent callback for all events\n onEvent?.(event);\n\n // Handle specific event types and fire callbacks\n switch (event.type) {\n case \"start\":\n executionId.current = event.workflowExecutionId ?? null;\n setInProgress(true);\n onStart?.(event.workflowName);\n break;\n\n case \"data\":\n // Handle streaming content from \"data\" events\n const content =\n typeof event.data === \"string\"\n ? event.data\n : JSON.stringify(event.data);\n\n // Accumulate content outside of state setter to avoid race conditions\n accumulatedStringRef.current += content;\n const currentAccumulatedString = accumulatedStringRef.current;\n\n // Process output transformation outside of state setter\n let newOutput: TOutput | null = null;\n try {\n // Use custom transformer if provided\n if (outputTransformer) {\n newOutput = outputTransformer(currentAccumulatedString);\n } else if (currentAccumulatedString === \"\") {\n newOutput = null as TOutput;\n } else {\n // Try to parse as JSON for complex types\n try {\n newOutput = JSON.parse(currentAccumulatedString) as TOutput;\n } catch {\n // If JSON parsing fails, return as string (for string output types)\n newOutput = currentAccumulatedString as TOutput;\n }\n }\n } catch (error) {\n console.warn(\"Output transformation failed:\", error);\n // Fallback to accumulated string\n newOutput = currentAccumulatedString as TOutput;\n }\n\n // Update refs and state with the processed output\n outputRef.current = newOutput;\n setOutput(newOutput);\n break;\n\n case \"event\":\n // Handle simple workflow events\n if (event.label === \"workflow-start\") {\n setInProgress(true);\n } else if (event.label === \"workflow-end\") {\n setInProgress(false);\n }\n break;\n\n case \"end\":\n setInProgress(false);\n onComplete?.(outputRef.current);\n break;\n\n case \"error\":\n setError(event.error);\n setInProgress(false);\n onError?.(event.error);\n break;\n\n case \"external-tool\":\n if (!executionId.current) {\n console.error(\n \"[GenSX] Cannot resolve tool call, execution ID is not set.\",\n );\n break;\n }\n const toolImpl = tools?.[event.toolName as keyof typeof tools];\n // Handle external tool calls from workflow\n if (toolImpl) {\n const result = await toolImpl.execute(\n event.params as unknown as InferToolParams<\n TToolBox,\n typeof event.toolName\n >,\n );\n\n // Send this to the API\n const response = await fetch(\n `${baseUrl}/workflowExecutions/${executionId.current}/fulfill/${event.nodeId}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify(result),\n },\n );\n\n if (!response.ok) {\n throw new Error(\n `Failed to resume workflow: ${response.status} ${response.statusText}`,\n );\n }\n\n break;\n }\n console.warn(\n \"[GenSX] Tool implementation not found:\",\n event.toolName,\n );\n\n // If there is no tool implementation, return a well-known object as the result so the workflow can continue\n const response = await fetch(\n `${baseUrl}/workflowExecutions/${executionId.current}/fulfill/${event.nodeId}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify({\n __gensxMissingToolImplementation: true,\n toolName: event.toolName,\n }),\n },\n );\n if (!response.ok) {\n throw new Error(\n `Failed to resume workflow: ${response.status} ${response.statusText}`,\n );\n }\n break;\n }\n });\n },\n [\n onStart,\n onComplete,\n onError,\n onEvent,\n outputTransformer,\n tools,\n executionId,\n ],\n );\n\n // Parse streaming response\n const parseStream = useCallback(\n async (response: Response): Promise<void> => {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\"; // Keep incomplete line in buffer\n\n for (const line of lines) {\n if (!line.trim()) continue;\n\n try {\n const event = JSON.parse(line.trim()) as WorkflowMessage;\n processEvent(event);\n } catch (_e) {\n console.warn(\"Failed to parse event:\", line);\n }\n }\n }\n\n // Process any remaining buffer\n if (buffer.trim()) {\n try {\n const event = JSON.parse(buffer) as WorkflowMessage;\n processEvent(event);\n } catch (_e) {\n console.warn(\"Failed to parse final event:\", buffer);\n }\n }\n } finally {\n reader.releaseLock();\n }\n },\n [processEvent],\n );\n\n // Clear state\n const clear = useCallback(() => {\n setInProgress(false);\n setError(null);\n setOutput(null);\n setEvents([]);\n outputRef.current = null;\n accumulatedStringRef.current = \"\";\n }, []);\n\n // Stop current workflow\n const stop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n setInProgress(false);\n }, []);\n\n // Build request payload - just pass inputs since API route handles workflow config\n const buildPayload = useCallback((runConfig: WorkflowRunConfig<TInputs>) => {\n return {\n ...runConfig.inputs,\n };\n }, []);\n\n // Run workflow in streaming mode\n const start = useCallback(\n async (runConfig: WorkflowRunConfig<TInputs>) => {\n // Reset state\n clear();\n setInProgress(true);\n\n // Create abort controller\n abortControllerRef.current = new AbortController();\n\n try {\n const response = await fetch(`${baseUrl}/start`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify(buildPayload(runConfig)),\n signal: abortControllerRef.current.signal,\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to run workflow: ${response.status} ${response.statusText}`,\n );\n }\n\n const { executionId: newExecutionId } = (await response.json()) as {\n executionId: string;\n };\n executionId.current = newExecutionId;\n\n // Connect to progress events\n const progressResponse = await fetch(\n `${baseUrl}/workflowExecutions/${executionId.current}/progress`,\n {\n method: \"POST\",\n },\n );\n\n // Parse the stream\n await parseStream(progressResponse);\n\n // onComplete is already called in processEvent when 'end' event is received\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"Unknown error\";\n setError(errorMessage);\n throw err;\n } finally {\n setInProgress(false);\n abortControllerRef.current = null;\n }\n },\n [baseUrl, headers, clear, parseStream, buildPayload],\n );\n\n // Run workflow in streaming mode\n const run = useCallback(\n async (runConfig: WorkflowRunConfig<TInputs>) => {\n // Reset state\n clear();\n setInProgress(true);\n\n // Create abort controller\n abortControllerRef.current = new AbortController();\n\n try {\n const response = await fetch(baseUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify(buildPayload(runConfig)),\n signal: abortControllerRef.current.signal,\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to run workflow: ${response.status} ${response.statusText}`,\n );\n }\n\n // Parse the stream\n await parseStream(response);\n\n // onComplete is already called in processEvent when 'end' event is received\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"Unknown error\";\n setError(errorMessage);\n throw err;\n } finally {\n setInProgress(false);\n abortControllerRef.current = null;\n }\n },\n [baseUrl, headers, clear, parseStream, buildPayload],\n );\n\n return {\n inProgress,\n error,\n output,\n execution: events,\n run,\n start,\n stop,\n clear,\n };\n}\n\n// New hook to get all events by label from WorkflowMessage events\nexport function useEvents<T extends Record<string, JsonValue>>(\n events: WorkflowMessage[],\n label: string,\n onEvent?: (event: T) => void,\n): T[] {\n const eventList = useMemo(() => {\n const list: T[] = [];\n\n for (const event of events) {\n if (event.type === \"event\" && event.label === label) {\n list.push(event.data as T);\n }\n }\n\n return list;\n }, [events, label]);\n\n // Track the last processed event index to prevent duplicate notifications\n const lastProcessedIndexRef = useRef(-1);\n\n // Call onEvent callback for new events only\n useEffect(() => {\n if (onEvent && eventList.length > 0) {\n // Only process events that haven't been processed yet\n for (\n let i = lastProcessedIndexRef.current + 1;\n i < eventList.length;\n i++\n ) {\n onEvent(eventList[i]);\n }\n // Update the last processed index\n lastProcessedIndexRef.current = eventList.length - 1;\n }\n }, [eventList, onEvent]);\n\n return eventList;\n}\n"],"names":["useState","useRef","useCallback","startTransition","useMemo","useEffect"],"mappings":"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"}