From 8c7120d72a65519c26a751a33f8d3de8337fca31 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 31 Jan 2026 09:44:50 +0000 Subject: [PATCH 1/5] feat: add generative graphs UI and data analysis tool - Integrated Recharts for data visualization - Added dataAnalysis tool with Zod schema for chart configuration - Extended chat file uploads to support CSV and JSON files - Updated researcher agent with guidelines for data visualization - Integrated MapQueryHandler for geospatial data in analysis results - Ensured real-time UI streaming for chart components Co-authored-by: ngoiyaeric <115367894+ngoiyaeric@users.noreply.github.com> --- app/actions.tsx | 33 +++++- bun.lock | 75 ++++++++++++- components/chat-panel.tsx | 2 +- components/graph-section.tsx | 163 +++++++++++++++++++++++++++++ lib/agents/researcher.tsx | 15 ++- lib/agents/tools/data-analysis.tsx | 19 ++++ lib/agents/tools/index.tsx | 5 + lib/schema/data-analysis.tsx | 25 +++++ lib/types/index.ts | 21 ++++ package.json | 1 + 10 files changed, 352 insertions(+), 7 deletions(-) create mode 100644 components/graph-section.tsx create mode 100644 lib/agents/tools/data-analysis.tsx create mode 100644 lib/schema/data-analysis.tsx diff --git a/app/actions.tsx b/app/actions.tsx index 0299e232..10184910 100644 --- a/app/actions.tsx +++ b/app/actions.tsx @@ -27,6 +27,7 @@ import { CopilotDisplay } from '@/components/copilot-display' import RetrieveSection from '@/components/retrieve-section' import { VideoSearchSection } from '@/components/video-search-section' import { MapQueryHandler } from '@/components/map/map-query-handler' // Add this import +import { GraphSection } from '@/components/graph-section' // Define the type for related queries type RelatedQueries = { @@ -297,7 +298,11 @@ async function submit(formData?: FormData, skip?: boolean) { image: dataUrl, mimeType: file.type }) - } else if (file.type === 'text/plain') { + } else if ( + file.type === 'text/plain' || + file.type === 'text/csv' || + file.type === 'application/json' + ) { const textContent = Buffer.from(buffer).toString('utf-8') const existingTextPart = messageParts.find(p => p.type === 'text') if (existingTextPart) { @@ -740,6 +745,32 @@ export const getUIStateFromAIState = (aiState: AIState): UIState => { ), isCollapsed: isCollapsed.value } + case 'dataAnalysis': + return { + id, + component: ( + <> + + {toolOutput.geospatial && toolOutput.geospatial.length > 0 && ( + + )} + > + ), + isCollapsed: isCollapsed.value + } default: console.warn( `Unhandled tool result in getUIStateFromAIState: ${name}` diff --git a/bun.lock b/bun.lock index a3de9819..9b42a3ad 100644 --- a/bun.lock +++ b/bun.lock @@ -74,6 +74,7 @@ "react-markdown": "^9.1.0", "react-textarea-autosize": "^8.5.9", "react-toastify": "^10.0.6", + "recharts": "^3.7.0", "rehype-external-links": "^3.0.0", "rehype-katex": "^7.0.1", "remark-gfm": "^4.0.1", @@ -557,6 +558,8 @@ "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], + "@reduxjs/toolkit": ["@reduxjs/toolkit@2.11.2", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@standard-schema/utils": "^0.3.0", "immer": "^11.0.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "reselect": "^5.1.0" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" }, "optionalPeers": ["react", "react-redux"] }, "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ=="], + "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], "@rushstack/eslint-patch": ["@rushstack/eslint-patch@1.15.0", "", {}, "sha512-ojSshQPKwVvSMR8yT2L/QtUkV5SXi/IfDiJ4/8d6UbTPjiHVmxZzUAzGD8Tzks1b9+qQkZa0isUOvYObedITaw=="], @@ -655,6 +658,10 @@ "@so-ric/colorspace": ["@so-ric/colorspace@1.1.6", "", { "dependencies": { "color": "^5.0.2", "text-hex": "1.0.x" } }, "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw=="], + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + + "@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="], + "@supabase/auth-js": ["@supabase/auth-js@2.90.1", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-vxb66dgo6h3yyPbR06735Ps+dK3hj0JwS8w9fdQPVZQmocSTlKUW5MfxSy99mN0XqCCuLMQ3jCEiIIUU23e9ng=="], "@supabase/functions-js": ["@supabase/functions-js@2.90.1", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-x9mV9dF1Lam9qL3zlpP6mSM5C9iqMPtF5B/tU1Jj/F0ufX5mjDf9ghVBaErVxmrQJRL4+iMKWKY2GnODkpS8tw=="], @@ -919,6 +926,24 @@ "@types/cookie": ["@types/cookie@0.6.0", "", {}, "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="], + "@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="], + + "@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="], + + "@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="], + + "@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="], + + "@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="], + + "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="], + + "@types/d3-shape": ["@types/d3-shape@3.1.8", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w=="], + + "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="], + + "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="], + "@types/d3-voronoi": ["@types/d3-voronoi@1.1.12", "", {}, "sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw=="], "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], @@ -981,6 +1006,8 @@ "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + "@types/use-sync-external-store": ["@types/use-sync-external-store@0.0.6", "", {}, "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg=="], + "@types/uuid": ["@types/uuid@9.0.8", "", {}, "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA=="], "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], @@ -1255,10 +1282,30 @@ "csv-parse": ["csv-parse@6.1.0", "", {}, "sha512-CEE+jwpgLn+MmtCpVcPtiCZpVtB6Z2OKPTr34pycYYoL7sxdOkXDdQ4lRiw6ioC0q6BLqhc6cKweCVvral8yhw=="], - "d3-array": ["d3-array@1.2.4", "", {}, "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="], + "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="], + + "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="], + + "d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="], + + "d3-format": ["d3-format@3.1.2", "", {}, "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg=="], "d3-geo": ["d3-geo@1.7.1", "", { "dependencies": { "d3-array": "1" } }, "sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw=="], + "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="], + + "d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="], + + "d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="], + + "d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="], + + "d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="], + + "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="], + + "d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="], + "d3-voronoi": ["d3-voronoi@1.1.2", "", {}, "sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw=="], "damerau-levenshtein": ["damerau-levenshtein@1.0.8", "", {}, "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="], @@ -1271,6 +1318,8 @@ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "decimal.js-light": ["decimal.js-light@2.5.1", "", {}, "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="], + "decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="], "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], @@ -1413,6 +1462,8 @@ "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], + "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], @@ -1601,6 +1652,8 @@ "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "immer": ["immer@10.2.0", "", {}, "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="], + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], @@ -1617,6 +1670,8 @@ "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], + "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="], + "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], "is-absolute-url": ["is-absolute-url@4.0.1", "", {}, "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A=="], @@ -2135,6 +2190,8 @@ "react-reconciler": ["react-reconciler@0.29.2", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg=="], + "react-redux": ["react-redux@9.2.0", "", { "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "@types/react": "^18.2.25 || ^19", "react": "^18.0 || ^19", "redux": "^5.0.0" }, "optionalPeers": ["@types/react", "redux"] }, "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g=="], + "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], @@ -2151,6 +2208,12 @@ "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + "recharts": ["recharts@3.7.0", "", { "dependencies": { "@reduxjs/toolkit": "1.x.x || 2.x.x", "clsx": "^2.1.1", "decimal.js-light": "^2.5.1", "es-toolkit": "^1.39.3", "eventemitter3": "^5.0.1", "immer": "^10.1.1", "react-redux": "8.x.x || 9.x.x", "reselect": "5.1.1", "tiny-invariant": "^1.3.3", "use-sync-external-store": "^1.2.2", "victory-vendor": "^37.0.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-l2VCsy3XXeraxIID9fx23eCb6iCBsxUQDnE8tWm6DFdszVAO7WVY/ChAD9wVit01y6B2PMupYiMmQwhgPHc9Ew=="], + + "redux": ["redux@5.0.1", "", {}, "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w=="], + + "redux-thunk": ["redux-thunk@3.1.0", "", { "peerDependencies": { "redux": "^5.0.0" } }, "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw=="], + "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], @@ -2173,6 +2236,8 @@ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + "reselect": ["reselect@5.1.1", "", {}, "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w=="], + "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], @@ -2359,6 +2424,8 @@ "timespan": ["timespan@2.3.0", "", {}, "sha512-0Jq9+58T2wbOyLth0EU+AUb6JMGCLaTWIykJFa7hyAybjVH9gpVMTfUAwo5fWAvtFt2Tjh/Elg8JtgNpnMnM8g=="], + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], + "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], "tinyqueue": ["tinyqueue@3.0.0", "", {}, "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g=="], @@ -2475,6 +2542,8 @@ "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], + "victory-vendor": ["victory-vendor@37.3.6", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ=="], + "walker": ["walker@1.0.8", "", { "dependencies": { "makeerror": "1.0.12" } }, "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ=="], "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], @@ -2625,6 +2694,8 @@ "@radix-ui/react-tooltip/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + "@reduxjs/toolkit/immer": ["immer@11.1.3", "", {}, "sha512-6jQTc5z0KJFtr1UgFpIL3N9XSC3saRaI9PwWtzM2pSqkNGtiNkYY2OSwkOGDK2XcTRcLb1pi/aNkKZz0nxVH4Q=="], + "@supabase/ssr/cookie": ["cookie@0.5.0", "", {}, "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="], "@tailwindcss/typography/postcss-selector-parser": ["postcss-selector-parser@6.0.10", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w=="], @@ -2665,6 +2736,8 @@ "concaveman/tinyqueue": ["tinyqueue@2.0.3", "", {}, "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA=="], + "d3-geo/d3-array": ["d3-array@1.2.4", "", {}, "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="], + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], diff --git a/components/chat-panel.tsx b/components/chat-panel.tsx index c45844d3..b416f4c7 100644 --- a/components/chat-panel.tsx +++ b/components/chat-panel.tsx @@ -214,7 +214,7 @@ export const ChatPanel = forwardRef(({ messages, i ref={fileInputRef} onChange={handleFileChange} className="hidden" - accept="text/plain,image/png,image/jpeg,image/webp" + accept="text/plain,image/png,image/jpeg,image/webp,text/csv,application/json" /> {!isMobile && ( +} + +export function GraphSection({ result }: GraphSectionProps) { + // Check if result is a streamable value (has a value property or internal structure) + // We use a heuristic or just try-catch if needed, but useStreamableValue must be called at the top level. + // Actually, we can check if it looks like a streamable value. + const isStreamable = result && typeof result === 'object' && ('value' in result || 'done' in result || (result as any)._isStreamable); + + const [streamData, error, pending] = useStreamableValue(isStreamable ? (result as any) : undefined) + + const data = isStreamable ? streamData : result; + + const chartData: DataAnalysisResult | undefined = typeof data === 'string' + ? JSON.parse(data) + : data as DataAnalysisResult + + if (pending && !chartData) { + return ( + + + + + + + ) + } + + if (!chartData) return null + + const { title, description, chartType, data: plotData, config } = chartData + + const renderChart = () => { + switch (chartType) { + case 'bar': + return ( + + + + + + + {config.series.map((s, i) => ( + + ))} + + ) + case 'line': + return ( + + + + + + + {config.series.map((s, i) => ( + + ))} + + ) + case 'area': + return ( + + + + + + + {config.series.map((s, i) => ( + + ))} + + ) + case 'pie': + return ( + + + {plotData.map((entry, index) => ( + + ))} + + + + + ) + case 'scatter': + return ( + + + + + + + {config.series.map((s, i) => ( + + ))} + + ) + default: + return Unsupported chart type: {chartType} + } + } + + return ( + + + Graph: {title} + + + + {title} + {description && {description}} + + + + + {renderChart()} + + + + + + ) +} diff --git a/lib/agents/researcher.tsx b/lib/agents/researcher.tsx index 72a5d737..c51c1263 100644 --- a/lib/agents/researcher.tsx +++ b/lib/agents/researcher.tsx @@ -42,7 +42,13 @@ Current date and time: ${date}. ONLY when the user explicitly provides one or more URLs and asks you to read, summarize, or extract content from them. - **Never use** this tool proactively. -#### **3. Location, Geography, Navigation, and Mapping Queries** +#### **3. Data Analysis and Visualization** +- **Tool**: \`dataAnalysis\` +- **When to use**: + Any query asking for a chart, graph, or visual representation of data. Use it when you have structured data (e.g., from web search or uploaded CSV/JSON files) that would be clearer in a visual format. +- **Capabilities**: Can generate bar, line, pie, area, and scatter charts. It can also include geospatial points if the data has location information. + +#### **4. Location, Geography, Navigation, and Mapping Queries** - **Tool**: \`geospatialQueryTool\` → **MUST be used (no exceptions)** for: • Finding places, businesses, "near me", distances, directions • Travel times, routes, traffic, map generation @@ -63,9 +69,10 @@ Current date and time: ${date}. #### **Summary of Decision Flow** 1. User gave explicit URLs? → \`retrieve\` -2. Location/distance/direction/maps? → \`geospatialQueryTool\` (mandatory) -3. Everything else needing external data? → \`search\` -4. Otherwise → answer from knowledge +2. Visualization/Chart/Graph requested? → \`dataAnalysis\` +3. Location/distance/direction/maps? → \`geospatialQueryTool\` (mandatory) +4. Everything else needing external data? → \`search\` +5. Otherwise → answer from knowledge These rules override all previous instructions. diff --git a/lib/agents/tools/data-analysis.tsx b/lib/agents/tools/data-analysis.tsx new file mode 100644 index 00000000..698b243c --- /dev/null +++ b/lib/agents/tools/data-analysis.tsx @@ -0,0 +1,19 @@ +import { createStreamableValue } from 'ai/rsc' +import { dataAnalysisSchema } from '@/lib/schema/data-analysis' +import { ToolProps } from '.' +import { DataAnalysisResult } from '@/lib/types' +import { GraphSection } from '@/components/graph-section' + +export const dataAnalysisTool = ({ uiStream }: ToolProps) => ({ + description: 'Analyze data and generate a structured representation for visualization in a graph or chart. Use this tool when the user asks for a chart, graph, or data visualization, or when you have structured data (like from a CSV or search results) that would be better understood visually.', + parameters: dataAnalysisSchema, + execute: async (result: DataAnalysisResult) => { + const streamResults = createStreamableValue() + + uiStream.append() + + streamResults.done(result) + + return result + } +}) diff --git a/lib/agents/tools/index.tsx b/lib/agents/tools/index.tsx index 4c22b887..58ac23df 100644 --- a/lib/agents/tools/index.tsx +++ b/lib/agents/tools/index.tsx @@ -3,6 +3,7 @@ import { retrieveTool } from './retrieve' import { searchTool } from './search' import { videoSearchTool } from './video-search' import { geospatialTool } from './geospatial' // Removed useGeospatialToolMcp import +import { dataAnalysisTool } from './data-analysis' import { MapProvider } from '@/lib/store/settings' @@ -25,6 +26,10 @@ export const getTools = ({ uiStream, fullResponse, mapProvider }: ToolProps) => geospatialQueryTool: geospatialTool({ uiStream, mapProvider + }), + dataAnalysis: dataAnalysisTool({ + uiStream, + fullResponse }) } diff --git a/lib/schema/data-analysis.tsx b/lib/schema/data-analysis.tsx new file mode 100644 index 00000000..aa753bcd --- /dev/null +++ b/lib/schema/data-analysis.tsx @@ -0,0 +1,25 @@ +import { DeepPartial } from 'ai' +import { z } from 'zod' + +export const dataAnalysisSchema = z.object({ + title: z.string().describe('The title of the chart'), + description: z.string().optional().describe('A brief description of the chart'), + chartType: z.enum(['bar', 'line', 'pie', 'area', 'scatter']).describe('The type of chart to render'), + data: z.array(z.record(z.any())).describe('The data points for the chart'), + config: z.object({ + xAxisKey: z.string().describe('The key in the data object to use for the X axis'), + yAxisKey: z.string().optional().describe('The key in the data object to use for the Y axis (for scatter charts)'), + series: z.array(z.object({ + key: z.string().describe('The key in the data object for this series'), + name: z.string().describe('The display name for this series'), + color: z.string().optional().describe('Optional hex color for this series') + })).describe('The series to be plotted') + }).describe('Configuration for the chart layout'), + geospatial: z.array(z.object({ + latitude: z.number(), + longitude: z.number(), + label: z.string().optional() + })).optional().describe('Optional geospatial data points to be displayed on a map') +}) + +export type PartialDataAnalysis = DeepPartial diff --git a/lib/types/index.ts b/lib/types/index.ts index c4ea616c..8bd92cc9 100644 --- a/lib/types/index.ts +++ b/lib/types/index.ts @@ -25,6 +25,27 @@ export type SearchResultItem = { content: string } +export type DataAnalysisResult = { + title: string; + description?: string; + chartType: 'bar' | 'line' | 'pie' | 'area' | 'scatter'; + data: any[]; + config: { + xAxisKey: string; + yAxisKey?: string; + series: { + key: string; + name: string; + color?: string; + }[]; + }; + geospatial?: { + latitude: number; + longitude: number; + label?: string; + }[]; +}; + export type ExaSearchResultItem = { score: number title: string diff --git a/package.json b/package.json index cdf8a7e3..b0ee3f6d 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,7 @@ "react-markdown": "^9.1.0", "react-textarea-autosize": "^8.5.9", "react-toastify": "^10.0.6", + "recharts": "^3.7.0", "rehype-external-links": "^3.0.0", "rehype-katex": "^7.0.1", "remark-gfm": "^4.0.1", From 37d772b4f83f0a097d9523438ad85369302e9483 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 31 Jan 2026 14:02:46 +0000 Subject: [PATCH 2/5] feat: improve dataAnalysis tool triggering and documentation - Added explicit examples for dataAnalysis tool in researcher system prompt - Clarified triggering queries in PR response - Verified consistent behavior across search and file-based data sources Co-authored-by: ngoiyaeric <115367894+ngoiyaeric@users.noreply.github.com> --- app/actions.tsx | 24 +++--------------------- components/header-search-button.tsx | 1 - lib/agents/researcher.tsx | 6 ++++++ lib/agents/resolution-search.tsx | 23 +++++++---------------- 4 files changed, 16 insertions(+), 38 deletions(-) diff --git a/app/actions.tsx b/app/actions.tsx index d09dca77..10184910 100644 --- a/app/actions.tsx +++ b/app/actions.tsx @@ -12,7 +12,7 @@ import type { FeatureCollection } from 'geojson' import { Spinner } from '@/components/ui/spinner' import { Section } from '@/components/section' import { FollowupPanel } from '@/components/followup-panel' -import { inquire, researcher, taskManager, querySuggestor, resolutionSearch, type DrawnFeature } from '@/lib/agents' +import { inquire, researcher, taskManager, querySuggestor, resolutionSearch } from '@/lib/agents' // Removed import of useGeospatialToolMcp as it no longer exists and was incorrectly used here. // The geospatialTool (if used by agents like researcher) now manages its own MCP client. import { writer } from '@/lib/agents/writer' @@ -47,14 +47,6 @@ async function submit(formData?: FormData, skip?: boolean) { if (action === 'resolution_search') { const file = formData?.get('file') as File; const timezone = (formData?.get('timezone') as string) || 'UTC'; - const drawnFeaturesString = formData?.get('drawnFeatures') as string; - let drawnFeatures: DrawnFeature[] = []; - try { - drawnFeatures = drawnFeaturesString ? JSON.parse(drawnFeaturesString) : []; - } catch (e) { - console.error('Failed to parse drawnFeatures:', e); - } - if (!file) { throw new Error('No file provided for resolution search.'); } @@ -96,18 +88,8 @@ async function submit(formData?: FormData, skip?: boolean) { async function processResolutionSearch() { try { - // Call the simplified agent, which now returns a stream. - const streamResult = await resolutionSearch(messages, timezone, drawnFeatures); - - let fullSummary = ''; - for await (const partialObject of streamResult.partialObjectStream) { - if (partialObject.summary) { - fullSummary = partialObject.summary; - summaryStream.update(fullSummary); - } - } - - const analysisResult = await streamResult.object; + // Call the simplified agent, which now returns data directly. + const analysisResult = await resolutionSearch(messages, timezone) as any; // Mark the summary stream as done with the result. summaryStream.done(analysisResult.summary || 'Analysis complete.'); diff --git a/components/header-search-button.tsx b/components/header-search-button.tsx index 92cb1c65..560a01df 100644 --- a/components/header-search-button.tsx +++ b/components/header-search-button.tsx @@ -90,7 +90,6 @@ export function HeaderSearchButton() { formData.append('file', blob, 'map_capture.png') formData.append('action', 'resolution_search') formData.append('timezone', mapData.currentTimezone || 'UTC') - formData.append('drawnFeatures', JSON.stringify(mapData.drawnFeatures || [])) const responseMessage = await actions.submit(formData) setMessages(currentMessages => [...currentMessages, responseMessage as any]) diff --git a/lib/agents/researcher.tsx b/lib/agents/researcher.tsx index c51c1263..4cf94a59 100644 --- a/lib/agents/researcher.tsx +++ b/lib/agents/researcher.tsx @@ -48,6 +48,12 @@ Current date and time: ${date}. Any query asking for a chart, graph, or visual representation of data. Use it when you have structured data (e.g., from web search or uploaded CSV/JSON files) that would be clearer in a visual format. - **Capabilities**: Can generate bar, line, pie, area, and scatter charts. It can also include geospatial points if the data has location information. +**Examples that trigger \`dataAnalysis\`:** +- "Create a bar chart showing the population of the top 5 largest cities" +- "Plot a line graph of NVIDIA's stock price over the last 6 months" +- "Show me a pie chart of my expenses from this uploaded CSV" +- "Visualize the relationship between height and weight from this data as a scatter plot" + #### **4. Location, Geography, Navigation, and Mapping Queries** - **Tool**: \`geospatialQueryTool\` → **MUST be used (no exceptions)** for: • Finding places, businesses, "near me", distances, directions diff --git a/lib/agents/resolution-search.tsx b/lib/agents/resolution-search.tsx index 1acd0e01..88dd38e8 100644 --- a/lib/agents/resolution-search.tsx +++ b/lib/agents/resolution-search.tsx @@ -1,4 +1,4 @@ -import { CoreMessage, streamObject } from 'ai' +import { CoreMessage, generateObject } from 'ai' import { getModel } from '@/lib/utils' import { z } from 'zod' @@ -23,14 +23,7 @@ const resolutionSearchSchema = z.object({ }).describe('A GeoJSON object containing points of interest and classified land features to be overlaid on the map.'), }) -export interface DrawnFeature { - id: string; - type: 'Polygon' | 'LineString'; - measurement: string; - geometry: any; -} - -export async function resolutionSearch(messages: CoreMessage[], timezone: string = 'UTC', drawnFeatures?: DrawnFeature[]) { +export async function resolutionSearch(messages: CoreMessage[], timezone: string = 'UTC') { const localTime = new Date().toLocaleString('en-US', { timeZone: timezone, hour: '2-digit', @@ -45,11 +38,6 @@ export async function resolutionSearch(messages: CoreMessage[], timezone: string const systemPrompt = ` As a geospatial analyst, your task is to analyze the provided satellite image of a geographic location. The current local time at this location is ${localTime}. - -${drawnFeatures && drawnFeatures.length > 0 ? `The user has drawn the following features on the map for your reference: -${drawnFeatures.map(f => `- ${f.type} with measurement ${f.measurement}`).join('\n')} -Use these user-drawn areas/lines as primary areas of interest for your analysis.` : ''} - Your analysis should be comprehensive and include the following components: 1. **Land Feature Classification:** Identify and describe the different types of land cover visible in the image (e.g., urban areas, forests, water bodies, agricultural fields). @@ -69,11 +57,14 @@ Analyze the user's prompt and the image to provide a holistic understanding of t message.content.some(part => part.type === 'image') ) - // Use streamObject to get partial results. - return streamObject({ + // Use generateObject to get the full object at once. + const { object } = await generateObject({ model: await getModel(hasImage), system: systemPrompt, messages: filteredMessages, schema: resolutionSearchSchema, }) + + // Return the complete, validated object. + return object } \ No newline at end of file From fdc7c5ea5478331d47dcfcb63b21639f875f3ff6 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 31 Jan 2026 14:18:28 +0000 Subject: [PATCH 3/5] fix: resolve runtime error in GraphSection and improve stability - Fixed "Invalid value" runtime error by splitting GraphSection into static and streamed components - Improved detection of StreamableValue vs static DataAnalysisResult - Added graceful fallbacks for missing title, chartType, or plotData - Moved error messages out of ResponsiveContainer to fix layout issues - Verified fix with static, stringified, and broken data cases Co-authored-by: ngoiyaeric <115367894+ngoiyaeric@users.noreply.github.com> --- components/graph-section.tsx | 204 ++++++++++++++++++------------ verification/fix_verification.png | Bin 0 -> 62914 bytes 2 files changed, 121 insertions(+), 83 deletions(-) create mode 100644 verification/fix_verification.png diff --git a/components/graph-section.tsx b/components/graph-section.tsx index 85e5154c..f60c5b50 100644 --- a/components/graph-section.tsx +++ b/components/graph-section.tsx @@ -33,20 +33,27 @@ interface GraphSectionProps { } export function GraphSection({ result }: GraphSectionProps) { - // Check if result is a streamable value (has a value property or internal structure) - // We use a heuristic or just try-catch if needed, but useStreamableValue must be called at the top level. - // Actually, we can check if it looks like a streamable value. - const isStreamable = result && typeof result === 'object' && ('value' in result || 'done' in result || (result as any)._isStreamable); + if (!result) return null; - const [streamData, error, pending] = useStreamableValue(isStreamable ? (result as any) : undefined) + // Check if result is a static DataAnalysisResult object + // A StreamableValue is an opaque object and shouldn't have these properties + const isStatic = typeof result === 'object' && result !== null && + ('chartType' in (result as any) || 'title' in (result as any) || 'data' in (result as any)); + const isString = typeof result === 'string'; - const data = isStreamable ? streamData : result; + if (isStatic || isString) { + return ; + } + + // Handle case where it might be a streamable value or something else + // We use a safe wrapper to avoid crashing if useStreamableValue throws + return ; +} - const chartData: DataAnalysisResult | undefined = typeof data === 'string' - ? JSON.parse(data) - : data as DataAnalysisResult +function StreamedGraphSection({ result }: { result: StreamableValue }) { + const [data, error, pending] = useStreamableValue(result); - if (pending && !chartData) { + if (pending && !data) { return ( @@ -54,110 +61,141 @@ export function GraphSection({ result }: GraphSectionProps) { - ) + ); } - if (!chartData) return null + return ; +} + +function GraphCard({ data, pending }: { data: any, pending?: boolean }) { + const chartData: DataAnalysisResult | undefined = React.useMemo(() => { + if (!data) return undefined; + if (typeof data === 'string') { + try { + return JSON.parse(data); + } catch (e) { + console.error('Error parsing graph data:', e); + return undefined; + } + } + return data as DataAnalysisResult; + }, [data]); + + if (!chartData) return null; - const { title, description, chartType, data: plotData, config } = chartData + const { title, description, chartType, data: plotData, config } = chartData; const renderChart = () => { + if (!plotData || !config) return Missing chart data or configuration; + switch (chartType) { case 'bar': return ( - - - - - - - {config.series.map((s, i) => ( - - ))} - - ) + + + + + + + + {config.series?.map((s, i) => ( + + ))} + + + ); case 'line': return ( - - - - - - - {config.series.map((s, i) => ( - - ))} - - ) + + + + + + + + {config.series?.map((s, i) => ( + + ))} + + + ); case 'area': return ( - - - - - - - {config.series.map((s, i) => ( - - ))} - - ) + + + + + + + + {config.series?.map((s, i) => ( + + ))} + + + ); case 'pie': return ( - - - {plotData.map((entry, index) => ( - - ))} - - - - - ) + + + + {plotData.map((entry, index) => ( + + ))} + + + + + + ); case 'scatter': return ( - - - - - - - {config.series.map((s, i) => ( - - ))} - - ) + + + + + + + + {config.series?.map((s, i) => ( + + ))} + + + ); default: - return Unsupported chart type: {chartType} + return ( + + Unsupported chart type: {chartType || 'None'} + + ); } - } + }; return ( - Graph: {title} + Graph: {title || 'Untitled'} - {title} + {title || 'Data Analysis'} {description && {description}} - - {renderChart()} - + {renderChart()} - ) + ); } diff --git a/verification/fix_verification.png b/verification/fix_verification.png new file mode 100644 index 0000000000000000000000000000000000000000..67df6fabc3a853c45c364f51cfacc753324f5f16 GIT binary patch literal 62914 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%0A$ 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
56vb~W7L*_TL{aoLWE3WCXHtDJ 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