From e44fb3a6db7fa091e21f3abebd2434cde991c3fa Mon Sep 17 00:00:00 2001 From: Sean Oliver <882952+seanoliver@users.noreply.github.com> Date: Mon, 13 Oct 2025 14:01:27 -0700 Subject: [PATCH] Improve error handling for streaming table generation - Fall back to last partial data if AI SDK final object validation fails - Send partial results even when schema validation fails if tables exist - Gracefully handle incomplete responses instead of showing errors - Prevents "No object generated" errors when usable data exists --- .../TableQuickstart/TableTemplateSelector.tsx | 21 +- .../TableQuickstart/useAITableGeneration.ts | 344 ++++++++++++++++-- .../ai/table-quickstart/generate-schemas.ts | 78 +++- 3 files changed, 400 insertions(+), 43 deletions(-) diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableQuickstart/TableTemplateSelector.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableQuickstart/TableTemplateSelector.tsx index 23834abd2ce..3dd76cc0cc2 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableQuickstart/TableTemplateSelector.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableQuickstart/TableTemplateSelector.tsx @@ -31,9 +31,8 @@ export const TableTemplateSelector = ({ // AI variant state const [aiPrompt, setAiPrompt] = useState('') - const [generatedTables, setGeneratedTables] = useState([]) const inputRef = useRef(null) - const { generateTables, isGenerating, error: apiError } = useAITableGeneration() + const { generateTables, isGenerating, error: apiError, tables, clearTables } = useAITableGeneration() const isAI = variant === QuickstartVariant.AI const categories = useMemo(() => Object.keys(tableTemplates), []) @@ -73,11 +72,10 @@ export const TableTemplateSelector = ({ if (!promptToUse.trim() || isGenerating) return try { - const tables = await generateTables(promptToUse) + const generated = await generateTables(promptToUse) - if (tables.length > 0) { - setGeneratedTables(tables) - handleSelectTemplate(tables[0]) + if (generated.length > 0) { + handleSelectTemplate(generated[0]) } } catch (error) { // Error handling is done in the hook @@ -96,10 +94,10 @@ export const TableTemplateSelector = ({ const displayedTemplates = useMemo(() => { if (isAI) { - return generatedTables + return tables } return activeCategory ? tableTemplates[activeCategory] || [] : [] - }, [isAI, generatedTables, activeCategory]) + }, [isAI, tables, activeCategory]) return (
@@ -162,7 +160,7 @@ export const TableTemplateSelector = ({ )} {/* Quick Ideas */} - {generatedTables.length === 0 && ( + {tables.length === 0 && (
Quick ideas:
@@ -216,13 +214,14 @@ export const TableTemplateSelector = ({ {isAI && (
- Generated {generatedTables.length} table{generatedTables.length !== 1 ? 's' : ''} + Generated {tables.length} table{tables.length !== 1 ? 's' : ''}