{"id":55581,"date":"2026-10-08T16:06:26","date_gmt":"2026-10-08T23:06:26","guid":{"rendered":"https:\/\/www.griddb.net\/?p=55581"},"modified":"2026-10-08T16:26:44","modified_gmt":"2026-10-08T23:26:44","slug":"create-stunning-infographics-using-nano-banana-pro-in-agentic-way","status":"publish","type":"post","link":"https:\/\/www.griddb.net\/en\/blog\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\/","title":{"rendered":"Create Stunning Infographics using Nano Banana Pro in Agentic Way"},"content":{"rendered":"<h2 id=\"introduction\">Introduction<\/h2>\n<p>\nForget the old times when you had to manually create infographics. With Nano Banana Pro, you can now create stunning infographics in minutes.\n<\/p>\n<p><a href=\"https:\/\/ai.google\/tools\/nano-banana-pro\/\">Nano Banana Pro<\/a> is an advanced AI image generation and editing model developed by Google DeepMind as part of the Gemini AI family. It\u2019s essentially a professional grade tool for creating high-quality visuals\u2014like illustrations, infographics, mockups, and edited photos using natural language text prompts or reference images.<\/p>\n<p>\nIn this blog post, we will build a web application that leverages Nano Banana Pro to generate stunning infographics from any accessible content such as articles, and store the generated infographics data using GridDB as the high-performance database backend.\n<\/p>\n<h2 id=\"running-the-application\">Running the Application<\/h2>\n<p>\nTo run this application, you need to:\n<\/p>\n<ol>\n<li>Clone <a href=\"https:\/\/github.com\/junwatu\/infographic-nbp-griddb\">this repository<\/a> and run the following commands:<\/li>\n<\/ol>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">$     git clone https:\/\/github.com\/junwatu\/infographic-nbp-griddb.git\r\n$     cd infographic-nbp-griddb\/apps\r\n$     npm install\r\n    <\/code><\/pre>\n<\/div>\n<ol>\n<li>Set up the environment variables. Copy the <code>.env.example<\/code> file to <code>.env<\/code> and fill in the values:<\/li>\n<\/ol>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">$     WEB_URL=http:\/\/localhost:3000\r\n\r\n$     # GridDB Web API Configuration (Primary)\r\n$     GRIDDB_WEBAPI_URL=&quot;&quot;\r\n$     GRIDDB_USERNAME=&quot;&quot;\r\n$     GRIDDB_PASSWORD=&quot;&quot;\r\n\r\n$     # DeepSeek API key through Anthropic-compatible endpoint\r\n$     NEBIUS_API_KEY=&quot;&quot;\r\n\r\n$     # Nano Banana Pro through Fal API\r\n$     FAL_KEY=&quot;&quot;\r\n    <\/code><\/pre>\n<\/div>\n<ol>\n<li>Start the application:<\/li>\n<\/ol>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">$     npm run dev\r\n    <\/code><\/pre>\n<\/div>\n<ol>\n<li>Open <a href=\"http:\/\/localhost:3000\"><code>http:\/\/localhost:3000<\/code><\/a> in your browser and paste an article URL to generate an infographic. Please note that the article should be publicly accessible from the internet and not behind a paywall.<\/li>\n<\/ol>\n<p><a href=\"\/wp-content\/uploads\/2026\/10\/app-home-scaled.png\"><img fetchpriority=\"high\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/app-home-scaled.png\" alt=\"\" width=\"2560\" height=\"1731\" class=\"aligncenter size-full wp-image-55585\" srcset=\"\/wp-content\/uploads\/2026\/10\/app-home-scaled.png 2560w, \/wp-content\/uploads\/2026\/10\/app-home-300x203.png 300w, \/wp-content\/uploads\/2026\/10\/app-home-1024x692.png 1024w, \/wp-content\/uploads\/2026\/10\/app-home-768x519.png 768w, \/wp-content\/uploads\/2026\/10\/app-home-1536x1039.png 1536w, \/wp-content\/uploads\/2026\/10\/app-home-2048x1385.png 2048w, \/wp-content\/uploads\/2026\/10\/app-home-600x406.png 600w\" sizes=\"(max-width: 2560px) 100vw, 2560px\" \/><\/a><\/p>\n<h2 id=\"system-architecture\">System Architecture<\/h2>\n<p><a href=\"\/wp-content\/uploads\/2026\/10\/sysarc-deepseek.png\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/sysarc-deepseek.png\" alt=\"\" width=\"1344\" height=\"768\" class=\"aligncenter size-full wp-image-55595\" srcset=\"\/wp-content\/uploads\/2026\/10\/sysarc-deepseek.png 1344w, \/wp-content\/uploads\/2026\/10\/sysarc-deepseek-300x171.png 300w, \/wp-content\/uploads\/2026\/10\/sysarc-deepseek-1024x585.png 1024w, \/wp-content\/uploads\/2026\/10\/sysarc-deepseek-768x439.png 768w, \/wp-content\/uploads\/2026\/10\/sysarc-deepseek-150x85.png 150w, \/wp-content\/uploads\/2026\/10\/sysarc-deepseek-600x343.png 600w\" sizes=\"(max-width: 1344px) 100vw, 1344px\" \/><\/a><\/p>\n<p>\nA user submits an input through the browser, which is sent to a Node.js backend that contains two core components: a <strong>Content Retriever<\/strong> and a <strong>Prompt AI Agent<\/strong> (DeepSeek-V3.2). The Content Retriever enriches or contextualizes the user request (e.g., fetching references, templates, or prior data), after which the Prompt AI Agent constructs a structured prompt. The prompt, along with image metadata, is persisted to a <strong>GridDB database<\/strong>  for future retrieval. The finalized prompt is then forwarded to an external image generation AI model, <strong>Nano Banana Pro<\/strong>, which produces the image artifact and stores it in a file system. The generated image is subsequently served back to the browser, closing the loop.\n<\/p>\n<h2 id=\"technologies-used\">Technologies Used<\/h2>\n<h3 id=\"nodejs\">Node.js<\/h3>\n<p>\nThis project is built using React + Vite, which requires Node.js version 16 or higher. You can download and install Node.js from <a href=\"https:\/\/nodejs.org\/en\">nodejs.org<\/a>.\n<\/p>\n<h3 id=\"nano-banana-pro-api-key\">Nano Banana Pro API Key<\/h3>\n<p>\nYou need to create a Google API key to use the Nano Banana Pro. In this project we use <a href=\"https:\/\/fal.ai\/\">FAL<\/a> inference provider to access the Nano Banana Pro API.\n<\/p>\n<p><a href=\"\/wp-content\/uploads\/2026\/10\/fal.png\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/fal.png\" alt=\"\" width=\"2236\" height=\"866\" class=\"aligncenter size-full wp-image-55587\" srcset=\"\/wp-content\/uploads\/2026\/10\/fal.png 2236w, \/wp-content\/uploads\/2026\/10\/fal-300x116.png 300w, \/wp-content\/uploads\/2026\/10\/fal-1024x397.png 1024w, \/wp-content\/uploads\/2026\/10\/fal-768x297.png 768w, \/wp-content\/uploads\/2026\/10\/fal-1536x595.png 1536w, \/wp-content\/uploads\/2026\/10\/fal-2048x793.png 2048w, \/wp-content\/uploads\/2026\/10\/fal-600x232.png 600w\" sizes=\"(max-width: 2236px) 100vw, 2236px\" \/><\/a><\/p>\n<p>\nPlease note that using the Nano Banana Pro API requires a paid subscription plan.\n<\/p>\n<h3 id=\"deepseek-v32-api-key\">DeepSeek-V3.2 API Key<\/h3>\n<p>\nThe latest version of DeepSeek model is V3.2, which is a recently released large language model (LLM) developed by the Chinese AI company DeepSeek, specifically optimized for coding, agentic workflows, and tool-use tasks rather than just general text chat.\n<\/p>\n<p>\nTo use the DeepSeek-V3.2 API, you must obtain an API key from the <a href=\"https:\/\/platform.nebius.ai\/\">Nebius Platform<\/a>. Simply create an account and generate your key from the dashboard. Please note that an active subscription plan is required to access the API features.\n<\/p>\n<p>\n> The application uses the OpenAI Agents SDK which connects to DeepSeek-V3.2 via an OpenAI-compatible base URL. This is why the environment variable is named <code>NEBIUS_API_KEY<\/code>.\n<\/p>\n<h3 id=\"griddb\">GridDB<\/h3>\n<h4 id=\"sign-up-for-griddb-cloud-free-plan\">Sign Up for GridDB Cloud Free Plan<\/h4>\n<p>\nIf you would like to sign up for a GridDB Cloud Free instance, you can do so at the following link: <a href=\"https:\/\/form.ict-toshiba.jp\/download_form_griddb_cloud_freeplan_e\">https:\/\/form.ict-toshiba.jp\/download_form_griddb_cloud_freeplan_e<\/a>.\n<\/p>\n<p>\nAfter successfully signing up, you will receive a free instance along with the necessary details to access the GridDB Cloud Management GUI, including the <strong>GridDB Cloud Portal URL<\/strong>, <strong>Contract ID<\/strong>, <strong>Login<\/strong>, and <strong>Password<\/strong>.\n<\/p>\n<h4 id=\"griddb-webapi-url\">GridDB WebAPI URL<\/h4>\n<p>\nGo to the GridDB Cloud Portal and copy the WebAPI URL from the <strong>Clusters<\/strong> section. It should look like this:\n<\/p>\n<p><a href=\"\/wp-content\/uploads\/2026\/10\/griddb-cloud-portal-scaled.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/griddb-cloud-portal-scaled.png\" alt=\"\" width=\"2560\" height=\"1265\" class=\"aligncenter size-full wp-image-55591\" srcset=\"\/wp-content\/uploads\/2026\/10\/griddb-cloud-portal-scaled.png 2560w, \/wp-content\/uploads\/2026\/10\/griddb-cloud-portal-300x148.png 300w, \/wp-content\/uploads\/2026\/10\/griddb-cloud-portal-1024x506.png 1024w, \/wp-content\/uploads\/2026\/10\/griddb-cloud-portal-768x380.png 768w, \/wp-content\/uploads\/2026\/10\/griddb-cloud-portal-1536x759.png 1536w, \/wp-content\/uploads\/2026\/10\/griddb-cloud-portal-2048x1012.png 2048w, \/wp-content\/uploads\/2026\/10\/griddb-cloud-portal-600x297.png 600w\" sizes=\"(max-width: 2560px) 100vw, 2560px\" \/><\/a><\/p>\n<h4 id=\"griddb-username-and-password\">GridDB Username and Password<\/h4>\n<p>\nGo to the <strong>GridDB Users<\/strong> section of the GridDB Cloud portal and create or copy the username for <code>GRIDDB_USERNAME<\/code>. The password is set when the user is created for the first time. Use this as the <code>GRIDDB_PASSWORD<\/code>.\n<\/p>\n<p><a href=\"\/wp-content\/uploads\/2026\/10\/griddb-cloud-users-scaled.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/griddb-cloud-users-scaled.png\" alt=\"\" width=\"2560\" height=\"1351\" class=\"aligncenter size-full wp-image-55592\" srcset=\"\/wp-content\/uploads\/2026\/10\/griddb-cloud-users-scaled.png 2560w, \/wp-content\/uploads\/2026\/10\/griddb-cloud-users-300x158.png 300w, \/wp-content\/uploads\/2026\/10\/griddb-cloud-users-1024x540.png 1024w, \/wp-content\/uploads\/2026\/10\/griddb-cloud-users-768x405.png 768w, \/wp-content\/uploads\/2026\/10\/griddb-cloud-users-1536x810.png 1536w, \/wp-content\/uploads\/2026\/10\/griddb-cloud-users-2048x1080.png 2048w, \/wp-content\/uploads\/2026\/10\/griddb-cloud-users-600x317.png 600w\" sizes=\"(max-width: 2560px) 100vw, 2560px\" \/><\/a><\/p>\n<p>\nFor more details, to get started with GridDB Cloud, please follow this <a href=\"https:\/\/griddb.net\/en\/blog\/griddb-cloud-quick-start-guide\/\">quick start guide<\/a>.\n<\/p>\n<h4 id=\"ip-whitelist\">IP Whitelist<\/h4>\n<p>\nWhen running this project, please ensure that the IP address where the project is running is whitelisted. Failure to do so will result in a 403 status code or forbidden access.\n<\/p>\n<p>\nYou can use a website like <a href=\"https:\/\/whatismyipaddress.com\/\">What Is My IP Address<\/a> to find your public IP address.\n<\/p>\n<p>\nTo whitelist the IP, go to the GridDB Cloud Admin and navigate to the <strong>Network Access<\/strong> menu.\n<\/p>\n<p><a href=\"\/wp-content\/uploads\/2026\/10\/ip-whitelist-scaled.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/ip-whitelist-scaled.png\" alt=\"\" width=\"2560\" height=\"1095\" class=\"aligncenter size-full wp-image-55593\" srcset=\"\/wp-content\/uploads\/2026\/10\/ip-whitelist-scaled.png 2560w, \/wp-content\/uploads\/2026\/10\/ip-whitelist-300x128.png 300w, \/wp-content\/uploads\/2026\/10\/ip-whitelist-1024x438.png 1024w, \/wp-content\/uploads\/2026\/10\/ip-whitelist-768x329.png 768w, \/wp-content\/uploads\/2026\/10\/ip-whitelist-1536x657.png 1536w, \/wp-content\/uploads\/2026\/10\/ip-whitelist-2048x876.png 2048w, \/wp-content\/uploads\/2026\/10\/ip-whitelist-600x257.png 600w\" sizes=\"(max-width: 2560px) 100vw, 2560px\" \/><\/a><\/p>\n<h2 id=\"ai-agents\">AI Agents<\/h2>\n<p>\nThis application uses a <strong>multi-agent architecture<\/strong> powered by the <a href=\"https:\/\/github.com\/openai\/openai-agents-js\">OpenAI Agents SDK<\/a> with DeepSeek-V3.2 as the underlying language model. The system consists of two specialized agents that work together in a coordinated pipeline.\n<\/p>\n<h3 id=\"agent-architecture\">Agent Architecture<\/h3>\n<p><a href=\"\/wp-content\/uploads\/2026\/10\/agent-arc-scaled.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/agent-arc-scaled.png\" alt=\"\" width=\"2560\" height=\"1111\" class=\"aligncenter size-full wp-image-55583\" srcset=\"\/wp-content\/uploads\/2026\/10\/agent-arc-scaled.png 2560w, \/wp-content\/uploads\/2026\/10\/agent-arc-300x130.png 300w, \/wp-content\/uploads\/2026\/10\/agent-arc-1024x444.png 1024w, \/wp-content\/uploads\/2026\/10\/agent-arc-768x333.png 768w, \/wp-content\/uploads\/2026\/10\/agent-arc-1536x666.png 1536w, \/wp-content\/uploads\/2026\/10\/agent-arc-2048x889.png 2048w, \/wp-content\/uploads\/2026\/10\/agent-arc-600x260.png 600w\" sizes=\"(max-width: 2560px) 100vw, 2560px\" \/><\/a><\/p>\n<h3 id=\"content-fetcher-agent\">Content Fetcher Agent<\/h3>\n<p>\nThe <strong>Content Fetcher<\/strong> is a specialized agent responsible for retrieving and cleaning article content from URLs. It&#8217;s extract the main content from web pages, removing ads, navigation, and other clutter.\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-typescript\">const createContentAgent = (model: any) =&gt; {\r\n    return new Agent({\r\n        name: &quot;Content Fetcher&quot;,\r\n        instructions: &quot;You are an expert at fetching and cleaning article content from URLs.&quot;,\r\n        model,\r\n        tools: [fetchArticleTool],\r\n    });\r\n};<\/code><\/pre>\n<\/div>\n<p>\nThe <code>fetchArticleTool<\/code> internally calls the <code>fetchAndSanitize<\/code> function which:\n<\/p>\n<ol>\n<li>Fetches the HTML from the provided URL<\/li>\n<li>Parses it using JSDOM<\/li>\n<li>Extracts the main content using Readability<\/li>\n<li>Returns a simplified object containing the <code>title<\/code> and <code>textContent<\/code> to the agent.<\/li>\n<\/ol>\n<h3 id=\"infographic-orchestrator-agent\">Infographic Orchestrator Agent<\/h3>\n<p>\nThe <strong>Orchestrator<\/strong> is the manager agent that coordinates the entire infographic generation pipeline. It has access to two tools:\n<\/p>\n<ol>\n<li><strong>fetch_article<\/strong> &#8211; The Content Fetcher agent exposed as a tool<\/li>\n<li><strong>image_generator<\/strong> &#8211; Generates images using Nano Banana Pro via Fal<\/li>\n<\/ol>\n<div class=\"clipboard\">\n<pre><code class=\"language-typescript\">const createOrchestratorAgent = (model: any, contentAgent: Agent) =&gt; {\r\n    return new Agent({\r\n        name: &quot;Infographic Orchestrator&quot;,\r\n        instructions: `\r\n            You are the manager of an infographic generation pipeline.\r\n            Your goal is to take a URL, fetch the content, create a prompt, \r\n            and finally generate an image.\r\n            \r\n            Follow these steps strictly:\r\n            1. Use &#x27;fetch_article&#x27; to get the article content.\r\n            2. Generate a detailed infographic prompt based on that content.\r\n            3. Call &#x27;image_generator&#x27; with the prompt to create the final image.\r\n        `,\r\n        model,\r\n        tools: [\r\n            contentAgent.asTool({\r\n                toolName: &quot;fetch_article&quot;,\r\n                toolDescription: &quot;Fetches article content from a URL.&quot;,\r\n            }),\r\n            imageGeneratorTool,\r\n        ],\r\n    });\r\n};<\/code><\/pre>\n<\/div>\n<h3 id=\"the-pipeline-flow\">The Pipeline Flow<\/h3>\n<p>\nWhen <code>generateInfographicForUrl(url)<\/code> is called, the orchestrator executes the following pipeline:\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-typescript\">const result = await run(\r\n    orchestratorAgent,\r\n    `Follow the infographic pipeline for this article: ${url}\r\n    \r\n    Step 1: Fetch the article content.\r\n    Step 2: Generate a detailed prompt for an infographic.\r\n    Step 3: CALL the &#x27;image_generator&#x27; tool with that prompt. (MANDATORY)\r\n    \r\n    Finally, return ONLY a breakdown as JSON in this format:\r\n    {\r\n      &quot;title&quot;: &quot;Article Title&quot;,\r\n      &quot;image&quot;: &quot;The generated image URL&quot;,\r\n      &quot;article_url&quot;: &quot;${url}&quot;,\r\n      &quot;description&quot;: &quot;Short summary&quot;,\r\n      &quot;prompt&quot;: &quot;The full detailed prompt you used for &#x27;image_generator&#x27;&quot;\r\n    }`,\r\n    { maxTurns: 10 }\r\n);<\/code><\/pre>\n<\/div>\n<p>\nThe result is a structured JSON object containing:\n<\/p>\n<table class=\"markdown-table\" style=\"border-collapse: collapse; width: 100%; margin: 1em 0;\">\n<thead>\n<tr>\n<th style=\"border: 1px solid #ddd; padding: 8px; background-color: #f2f2f2; text-align: left;\">Field<\/th>\n<th style=\"border: 1px solid #ddd; padding: 8px; background-color: #f2f2f2; text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>title<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Article title<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>image<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Generated infographic URL<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>article_url<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Original article URL<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>description<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Short summary<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>prompt<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">The full prompt used for image generation<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3 id=\"prompt-engineering\">Prompt Engineering<\/h3>\n<p>\nThe key to generating high-quality infographics lies in the prompt engineering. The orchestrator agent is instructed to create a <strong>detailed infographic prompt<\/strong> based on the article content. This prompt should include:\n<\/p>\n<ul>\n<li>Key statistics and data points from the article<\/li>\n<li>Visual layout suggestions (sections, hierarchy)<\/li>\n<li>Color scheme recommendations<\/li>\n<li>Typography and iconography hints<\/li>\n<li>The main message or takeaway<\/li>\n<\/ul>\n<p>\nThe DeepSeek-V3.2 model excels at this task because it&#8217;s specifically optimized for agentic workflows and tool-use, making it ideal for following the multi-step pipeline instructions reliably.\n<\/p>\n<h2 id=\"griddb-data-layer\">GridDB Data Layer<\/h2>\n<p>\nThe application uses a layered approach for database operations, with two key files: <code>griddb-base.ts<\/code> for database configuration and <code>griddb.ts<\/code> for infographic-specific operations.\n<\/p>\n<h3 id=\"database-schema\">Database Schema<\/h3>\n<p>\nThe <code>infographic<\/code> container stores generated infographic metadata:\n<\/p>\n<table class=\"markdown-table\" style=\"border-collapse: collapse; width: 100%; margin: 1em 0;\">\n<thead>\n<tr>\n<th style=\"border: 1px solid #ddd; padding: 8px; background-color: #f2f2f2; text-align: left;\">Column<\/th>\n<th style=\"border: 1px solid #ddd; padding: 8px; background-color: #f2f2f2; text-align: left;\">Type<\/th>\n<th style=\"border: 1px solid #ddd; padding: 8px; background-color: #f2f2f2; text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>id<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">INTEGER<\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Unique record identifier (rowkey)<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>prompt<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">STRING<\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">AI prompt used for image generation<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>infographic<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">STRING<\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">URL of the generated image<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>article_url<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">STRING<\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Source article URL<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>generation_timestamp<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">TIMESTAMP<\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">When the record was created<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3 id=\"base-configuration\">Base Configuration<\/h3>\n<p>\nThe base module (<code>griddb-base.ts<\/code>) handles database initialization with retry support:\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-typescript\">export const GRIDDB_CONFIG: GridDBConfig = {\r\n    griddbWebApiUrl: process.env.GRIDDB_WEBAPI_URL || &#x27;&#x27;,\r\n    username: process.env.GRIDDB_USERNAME || &#x27;admin&#x27;,\r\n    password: process.env.GRIDDB_PASSWORD || &#x27;admin&#x27;,\r\n    timeout: 30000,\r\n    retryAttempts: 3,\r\n    retryDelay: 1000\r\n};<\/code><\/pre>\n<\/div>\n<p>\nThe module also provides <code>ensureContainer()<\/code> which automatically creates the container with the defined schema if it doesn&#8217;t exist during server startup.\n<\/p>\n<h3 id=\"crud-operations\">CRUD Operations<\/h3>\n<p>\nThe main GridDB module (<code>griddb.ts<\/code>) exposes these functions:\n<\/p>\n<table class=\"markdown-table\" style=\"border-collapse: collapse; width: 100%; margin: 1em 0;\">\n<thead>\n<tr>\n<th style=\"border: 1px solid #ddd; padding: 8px; background-color: #f2f2f2; text-align: left;\">Function<\/th>\n<th style=\"border: 1px solid #ddd; padding: 8px; background-color: #f2f2f2; text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>getInfographics(limit)<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Retrieve records ordered by timestamp (default: 100)<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>getInfographicById(id)<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Get a single record by ID<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>deleteInfographic(id)<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Remove a record by ID<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\n> Note: The <code>saveInfographic()<\/code> function is demonstrated in the <a href=\"#generate-infographic--save-to-griddb\">Generate Infographic &#038; Save to GridDB<\/a> section below.\n<\/p>\n<h2 id=\"server-side\">Server Side<\/h2>\n<h3 id=\"api-routes\">API Routes<\/h3>\n<table class=\"markdown-table\" style=\"border-collapse: collapse; width: 100%; margin: 1em 0;\">\n<thead>\n<tr>\n<th style=\"border: 1px solid #ddd; padding: 8px; background-color: #f2f2f2; text-align: left;\">Method<\/th>\n<th style=\"border: 1px solid #ddd; padding: 8px; background-color: #f2f2f2; text-align: left;\">Endpoint<\/th>\n<th style=\"border: 1px solid #ddd; padding: 8px; background-color: #f2f2f2; text-align: left;\">Description<\/th>\n<th style=\"border: 1px solid #ddd; padding: 8px; background-color: #f2f2f2; text-align: left;\">Request Body<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>GET<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>\/health<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Server health check<\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">N\/A<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>POST<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>\/generate-infographic<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Generate and save infographic from URL<\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>{ \"url\": \"string\" }<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>POST<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>\/api\/infographics<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Manually save infographic record<\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>Infographic Object<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>GET<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>\/api\/infographics<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Retrieve all infographic records<\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">N\/A<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>GET<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>\/api\/infographics\/:id<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Retrieve a specific record by ID<\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">N\/A<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>DELETE<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>\/api\/infographics\/:id<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Delete a specific record by ID<\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">N\/A<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3 id=\"generate-infographic-save-to-griddb\">Generate Infographic &#038; Save to GridDB<\/h3>\n<p>\nThere are few endpoints available for the server and the most used is <code>\/generate-infographic<\/code> route. This route is used to generate an infographic from a URL and also save the record to GridDB.\n<\/p>\n<p>\nThis route will call the <code>generateInfographicForUrl<\/code> function from the orchestrator, which is an AI agent that orchestrates the infographic generation pipeline. More on this later.\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-typescript\">const result = await generateInfographicForUrl(url);<\/code><\/pre>\n<\/div>\n<p>\nThen if the image generation is successful, the result will be saved to GridDB.\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-typescript\">try {\r\n    await saveInfographic({\r\n        id: 0, \/\/ ID is generated inside saveInfographic\r\n        prompt: result.prompt,\r\n        infographic: result.image,\r\n        article_url: result.article_url || url,\r\n        generation_timestamp: new Date().toISOString()\r\n    });\r\n} catch (dbError) {\r\n    console.error(&#x27;[Server] Failed to save to GridDB, but continuing:&#x27;, dbError);\r\n}<\/code><\/pre>\n<\/div>\n<p>\n> Please note that the infographic record is an image URL instead of the image itself.\n<\/p>\n<p>\nThe server also provide manual save endpoint <code>\/api\/infographics<\/code> to save infographic record to GridDB using POST request. This is useful for testing and debugging.\n<\/p>\n<h3 id=\"get-all-infographics\">Get All Infographics<\/h3>\n<p>\nThe <code>GET \/api\/infographics<\/code> endpoint retrieves all infographic records from GridDB by calling the <code>getInfographics()<\/code> wrapper function.\n<\/p>\n<p><a href=\"\/wp-content\/uploads\/2026\/10\/getalldata.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/getalldata.png\" alt=\"\" width=\"1524\" height=\"740\" class=\"aligncenter size-full wp-image-55588\" srcset=\"\/wp-content\/uploads\/2026\/10\/getalldata.png 1524w, \/wp-content\/uploads\/2026\/10\/getalldata-300x146.png 300w, \/wp-content\/uploads\/2026\/10\/getalldata-1024x497.png 1024w, \/wp-content\/uploads\/2026\/10\/getalldata-768x373.png 768w, \/wp-content\/uploads\/2026\/10\/getalldata-600x291.png 600w\" sizes=\"(max-width: 1524px) 100vw, 1524px\" \/><\/a><\/p>\n<p>\nTest with curl:\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">$ curl -s http:\/\/localhost:3000\/api\/infographics<\/code><\/pre>\n<\/div>\n<h3 id=\"get-infographic-by-id\">Get Infographic by ID<\/h3>\n<p>\nThe <code>GET \/api\/infographics\/:id<\/code> endpoint retrieves a specific infographic record. It includes validation for the ID parameter and proper error handling:\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-typescript\">const id = parseInt(req.params.id);\r\nif (isNaN(id)) {\r\n    return res.status(400).json({ error: &#x27;Invalid ID format&#x27; });\r\n}\r\n\r\nconst data = await getInfographicById(id);\r\nif (!data) {\r\n    return res.status(404).json({ error: &#x27;Infographic not found&#x27; });\r\n}\r\n\r\nres.json(data);<\/code><\/pre>\n<\/div>\n<p><a href=\"\/wp-content\/uploads\/2026\/10\/getdatabyid.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/getdatabyid.png\" alt=\"\" width=\"1434\" height=\"676\" class=\"aligncenter size-full wp-image-55589\" srcset=\"\/wp-content\/uploads\/2026\/10\/getdatabyid.png 1434w, \/wp-content\/uploads\/2026\/10\/getdatabyid-300x141.png 300w, \/wp-content\/uploads\/2026\/10\/getdatabyid-1024x483.png 1024w, \/wp-content\/uploads\/2026\/10\/getdatabyid-768x362.png 768w, \/wp-content\/uploads\/2026\/10\/getdatabyid-600x283.png 600w\" sizes=\"(max-width: 1434px) 100vw, 1434px\" \/><\/a><\/p>\n<p>\nTest with curl:\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">$ curl -s http:\/\/localhost:3000\/api\/infographics\/368368397<\/code><\/pre>\n<\/div>\n<h3 id=\"delete-infographic-by-id\">Delete Infographic by ID<\/h3>\n<p>\nThe <code>DELETE \/api\/infographics\/:id<\/code> endpoint removes a specific infographic record from GridDB. It follows the same ID validation pattern as the GET endpoint, then calls <code>deleteInfographic(id)<\/code> to remove the record.\n<\/p>\n<p>\nTest with curl:\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">$ curl -X DELETE http:\/\/localhost:3000\/api\/infographics\/368368397<\/code><\/pre>\n<\/div>\n<p>\n> All endpoints follow a consistent pattern: validate input, call the appropriate GridDB wrapper function, and return JSON responses with proper HTTP status codes.\n<\/p>\n<h2 id=\"client-side\">Client Side<\/h2>\n<p><a href=\"\/wp-content\/uploads\/2026\/10\/demo.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/demo.png\" alt=\"\" width=\"2558\" height=\"1958\" class=\"aligncenter size-full wp-image-55586\" srcset=\"\/wp-content\/uploads\/2026\/10\/demo.png 2558w, \/wp-content\/uploads\/2026\/10\/demo-300x230.png 300w, \/wp-content\/uploads\/2026\/10\/demo-1024x784.png 1024w, \/wp-content\/uploads\/2026\/10\/demo-768x588.png 768w, \/wp-content\/uploads\/2026\/10\/demo-1536x1176.png 1536w, \/wp-content\/uploads\/2026\/10\/demo-2048x1568.png 2048w, \/wp-content\/uploads\/2026\/10\/demo-600x459.png 600w\" sizes=\"(max-width: 2558px) 100vw, 2558px\" \/><\/a><\/p>\n<p>\nThe frontend is built with <strong>React<\/strong> and <strong>Vite<\/strong>, providing a fast and responsive user interface for generating infographics.\n<\/p>\n<h3 id=\"ui-components\">UI Components<\/h3>\n<p>\nThe application uses a set of reusable UI components located in <code>src\/components\/ui\/<\/code>:\n<\/p>\n<table class=\"markdown-table\" style=\"border-collapse: collapse; width: 100%; margin: 1em 0;\">\n<thead>\n<tr>\n<th style=\"border: 1px solid #ddd; padding: 8px; background-color: #f2f2f2; text-align: left;\">Component<\/th>\n<th style=\"border: 1px solid #ddd; padding: 8px; background-color: #f2f2f2; text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>Button<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Primary action button with loading state support<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>Card<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Container component with header, content, and footer sections<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>Input<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Text input field with icon support<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>Skeleton<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Loading placeholder for content<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3 id=\"application-flow\">Application Flow<\/h3>\n<p>\nThe main <code>App.tsx<\/code> component manages the entire user interaction flow:\n<\/p>\n<h4 id=\"1-url-input\">1. URL Input<\/h4>\n<p>\nUsers enter an article URL into the input field. The form submission triggers the <code>handleGenerate<\/code> function:\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-tsx\">const handleGenerate = async (e: React.FormEvent) =&gt; {\r\n    e.preventDefault()\r\n    setLoading(true)\r\n    \r\n    const response = await fetch(&#x27;\/generate-infographic&#x27;, {\r\n        method: &#x27;POST&#x27;,\r\n        headers: { &#x27;Content-Type&#x27;: &#x27;application\/json&#x27; },\r\n        body: JSON.stringify({ url }),\r\n    })\r\n    \r\n    const data = await response.json()\r\n    setResult(data.result)\r\n}<\/code><\/pre>\n<\/div>\n<h4 id=\"2-loading-state\">2. Loading State<\/h4>\n<p>\nWhile the infographic is being generated, a skeleton loader is displayed with an animated message:\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-tsx\">{loading &amp;&amp; (\r\n    &lt;Skeleton className=&quot;h-[400px] w-full rounded-xl&quot; \/&gt;\r\n    &lt;p className=&quot;animate-pulse&quot;&gt;Analyzing content and generating visuals...&lt;\/p&gt;\r\n)}<\/code><\/pre>\n<\/div>\n<h4 id=\"3-result-display\">3. Result Display<\/h4>\n<p>\nOnce generated, the infographic is displayed in a styled card with:\n<\/p>\n<ul>\n<li>Article title and description<\/li>\n<li>The generated infographic image<\/li>\n<li>Link to the original article<\/li>\n<li>Download button for the image<\/li>\n<\/ul>\n<div class=\"clipboard\">\n<pre><code class=\"language-tsx\">{result &amp;&amp; (\r\n    &lt;Card&gt;\r\n        &lt;CardHeader&gt;\r\n            &lt;CardTitle&gt;{result.title}&lt;\/CardTitle&gt;\r\n            &lt;CardDescription&gt;{result.description}&lt;\/CardDescription&gt;\r\n        &lt;\/CardHeader&gt;\r\n        &lt;CardContent&gt;\r\n            &lt;img src={result.image} alt={result.title} \/&gt;\r\n        &lt;\/CardContent&gt;\r\n        &lt;CardFooter&gt;\r\n            &lt;a href={result.article_url}&gt;Original Article&lt;\/a&gt;\r\n            &lt;Button&gt;Download Image&lt;\/Button&gt;\r\n        &lt;\/CardFooter&gt;\r\n    &lt;\/Card&gt;\r\n)}<\/code><\/pre>\n<\/div>\n<h4 id=\"4-error-handling\">4. Error Handling<\/h4>\n<p>\nIf an error occurs during generation, a styled error card is displayed:\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-tsx\">{error &amp;&amp; (\r\n    &lt;Card className=&quot;border-destructive bg-destructive\/10&quot;&gt;\r\n        &lt;CardTitle className=&quot;text-destructive&quot;&gt;Error&lt;\/CardTitle&gt;\r\n        &lt;CardDescription&gt;{error}&lt;\/CardDescription&gt;\r\n    &lt;\/Card&gt;\r\n)}<\/code><\/pre>\n<\/div>\n<h3 id=\"state-management\">State Management<\/h3>\n<p>\nThe application uses React&#8217;s <code>useState<\/code> hook to manage four pieces of state:\n<\/p>\n<table class=\"markdown-table\" style=\"border-collapse: collapse; width: 100%; margin: 1em 0;\">\n<thead>\n<tr>\n<th style=\"border: 1px solid #ddd; padding: 8px; background-color: #f2f2f2; text-align: left;\">State<\/th>\n<th style=\"border: 1px solid #ddd; padding: 8px; background-color: #f2f2f2; text-align: left;\">Type<\/th>\n<th style=\"border: 1px solid #ddd; padding: 8px; background-color: #f2f2f2; text-align: left;\">Purpose<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>url<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>string<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">The article URL entered by the user<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>loading<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>boolean<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Whether a generation is in progress<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>result<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>InfographicResult \\<\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">null<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">The generated infographic data<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>error<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\"><code>string \\<\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">null<\/code><\/td>\n<td style=\"border: 1px solid #ddd; padding: 8px; text-align: left;\">Error message if generation fails<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"limitations\">Limitations<\/h2>\n<p>\nThis article is a proof of concept and may have limitations, such as:\n<\/p>\n<ul>\n<li>Does not handle paywall articles.<\/li>\n<li>Doesnt handle URL malformed articles, API limit exceeded, etc.<\/li>\n<\/ul>\n<h2 id=\"references\">References<\/h2>\n<ol>\n<li><a href=\"https:\/\/ai.google\/tools\/nano-banana-pro\/\">Nano Banana Pro<\/a><\/li>\n<li><a href=\"https:\/\/docs.tokenfactory.nebius.com\/quickstart\">Nebius Documentation<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Forget the old times when you had to manually create infographics. With Nano Banana Pro, you can now create stunning infographics in minutes. Nano Banana Pro is an advanced AI image generation and editing model developed by Google DeepMind as part of the Gemini AI family. It\u2019s essentially a professional grade tool for creating [&hellip;]<\/p>\n","protected":false},"author":779,"featured_media":55582,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[121],"tags":[],"class_list":["post-55581","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Create Stunning Infographics using Nano Banana Pro in Agentic Way | GridDB: Open Source Time Series Database for IoT<\/title>\n<meta name=\"description\" content=\"Introduction Forget the old times when you had to manually create infographics. With Nano Banana Pro, you can now create stunning infographics in minutes.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.griddb.net\/en\/blog\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Create Stunning Infographics using Nano Banana Pro in Agentic Way | GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"og:description\" content=\"Introduction Forget the old times when you had to manually create infographics. With Nano Banana Pro, you can now create stunning infographics in minutes.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.griddb.net\/en\/blog\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\/\" \/>\n<meta property=\"og:site_name\" content=\"GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/griddbcommunity\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-08T23:06:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-08T23:26:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.griddb.net\/wp-content\/uploads\/2026\/10\/1454pm-scaled.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1429\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"reviewer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@GridDBCommunity\" \/>\n<meta name=\"twitter:site\" content=\"@GridDBCommunity\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"reviewer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.griddb.net\\\/en\\\/blog\\\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.griddb.net\\\/en\\\/blog\\\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\\\/\"},\"author\":{\"name\":\"reviewer\",\"@id\":\"https:\\\/\\\/www.griddb.net\\\/#\\\/schema\\\/person\\\/9796b06dbb0e63dcaaf67892e45c3df2\"},\"headline\":\"Create Stunning Infographics using Nano Banana Pro in Agentic Way\",\"datePublished\":\"2026-10-08T23:06:26+00:00\",\"dateModified\":\"2026-10-08T23:26:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.griddb.net\\\/en\\\/blog\\\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\\\/\"},\"wordCount\":1589,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.griddb.net\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.griddb.net\\\/en\\\/blog\\\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\\\/#primaryimage\"},\"thumbnailUrl\":\"\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/1454pm-scaled.jpeg\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.griddb.net\\\/en\\\/blog\\\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.griddb.net\\\/en\\\/blog\\\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\\\/\",\"url\":\"https:\\\/\\\/www.griddb.net\\\/en\\\/blog\\\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\\\/\",\"name\":\"Create Stunning Infographics using Nano Banana Pro in Agentic Way | GridDB: Open Source Time Series Database for IoT\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.griddb.net\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.griddb.net\\\/en\\\/blog\\\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.griddb.net\\\/en\\\/blog\\\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\\\/#primaryimage\"},\"thumbnailUrl\":\"\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/1454pm-scaled.jpeg\",\"datePublished\":\"2026-10-08T23:06:26+00:00\",\"dateModified\":\"2026-10-08T23:26:44+00:00\",\"description\":\"Introduction Forget the old times when you had to manually create infographics. With Nano Banana Pro, you can now create stunning infographics in minutes.\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.griddb.net\\\/en\\\/blog\\\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.griddb.net\\\/en\\\/blog\\\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\\\/#primaryimage\",\"url\":\"\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/1454pm-scaled.jpeg\",\"contentUrl\":\"\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/1454pm-scaled.jpeg\",\"width\":2560,\"height\":1429},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.griddb.net\\\/#website\",\"url\":\"https:\\\/\\\/www.griddb.net\\\/\",\"name\":\"GridDB: Open Source Time Series Database for IoT\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.griddb.net\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.griddb.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.griddb.net\\\/#organization\",\"name\":\"Fixstars\",\"url\":\"https:\\\/\\\/www.griddb.net\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.griddb.net\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.griddb.net\\\/wp-content\\\/uploads\\\/2019\\\/04\\\/fixstars_logo_web_tagline.png\",\"contentUrl\":\"https:\\\/\\\/www.griddb.net\\\/wp-content\\\/uploads\\\/2019\\\/04\\\/fixstars_logo_web_tagline.png\",\"width\":200,\"height\":83,\"caption\":\"Fixstars\"},\"image\":{\"@id\":\"https:\\\/\\\/www.griddb.net\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/griddbcommunity\\\/\",\"https:\\\/\\\/x.com\\\/GridDBCommunity\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/griddb-by-toshiba\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.griddb.net\\\/#\\\/schema\\\/person\\\/9796b06dbb0e63dcaaf67892e45c3df2\",\"name\":\"reviewer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/56c7498f718fe0de13a8d0595e73985d070bf1fb1bcd75b4f3d4de32b5c7ad46?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/56c7498f718fe0de13a8d0595e73985d070bf1fb1bcd75b4f3d4de32b5c7ad46?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/56c7498f718fe0de13a8d0595e73985d070bf1fb1bcd75b4f3d4de32b5c7ad46?s=96&d=mm&r=g\",\"caption\":\"reviewer\"},\"url\":\"https:\\\/\\\/www.griddb.net\\\/en\\\/author\\\/reviewer\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Create Stunning Infographics using Nano Banana Pro in Agentic Way | GridDB: Open Source Time Series Database for IoT","description":"Introduction Forget the old times when you had to manually create infographics. With Nano Banana Pro, you can now create stunning infographics in minutes.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.griddb.net\/en\/blog\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\/","og_locale":"en_US","og_type":"article","og_title":"Create Stunning Infographics using Nano Banana Pro in Agentic Way | GridDB: Open Source Time Series Database for IoT","og_description":"Introduction Forget the old times when you had to manually create infographics. With Nano Banana Pro, you can now create stunning infographics in minutes.","og_url":"https:\/\/www.griddb.net\/en\/blog\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\/","og_site_name":"GridDB: Open Source Time Series Database for IoT","article_publisher":"https:\/\/www.facebook.com\/griddbcommunity\/","article_published_time":"2026-10-08T23:06:26+00:00","article_modified_time":"2026-10-08T23:26:44+00:00","og_image":[{"width":2560,"height":1429,"url":"https:\/\/www.griddb.net\/wp-content\/uploads\/2026\/10\/1454pm-scaled.jpeg","type":"image\/jpeg"}],"author":"reviewer","twitter_card":"summary_large_image","twitter_creator":"@GridDBCommunity","twitter_site":"@GridDBCommunity","twitter_misc":{"Written by":"reviewer","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.griddb.net\/en\/blog\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\/#article","isPartOf":{"@id":"https:\/\/www.griddb.net\/en\/blog\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\/"},"author":{"name":"reviewer","@id":"https:\/\/www.griddb.net\/#\/schema\/person\/9796b06dbb0e63dcaaf67892e45c3df2"},"headline":"Create Stunning Infographics using Nano Banana Pro in Agentic Way","datePublished":"2026-10-08T23:06:26+00:00","dateModified":"2026-10-08T23:26:44+00:00","mainEntityOfPage":{"@id":"https:\/\/www.griddb.net\/en\/blog\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\/"},"wordCount":1589,"commentCount":0,"publisher":{"@id":"https:\/\/www.griddb.net\/#organization"},"image":{"@id":"https:\/\/www.griddb.net\/en\/blog\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2026\/10\/1454pm-scaled.jpeg","articleSection":["Blog"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.griddb.net\/en\/blog\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.griddb.net\/en\/blog\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\/","url":"https:\/\/www.griddb.net\/en\/blog\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\/","name":"Create Stunning Infographics using Nano Banana Pro in Agentic Way | GridDB: Open Source Time Series Database for IoT","isPartOf":{"@id":"https:\/\/www.griddb.net\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.griddb.net\/en\/blog\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\/#primaryimage"},"image":{"@id":"https:\/\/www.griddb.net\/en\/blog\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2026\/10\/1454pm-scaled.jpeg","datePublished":"2026-10-08T23:06:26+00:00","dateModified":"2026-10-08T23:26:44+00:00","description":"Introduction Forget the old times when you had to manually create infographics. With Nano Banana Pro, you can now create stunning infographics in minutes.","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.griddb.net\/en\/blog\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.griddb.net\/en\/blog\/create-stunning-infographics-using-nano-banana-pro-in-agentic-way\/#primaryimage","url":"\/wp-content\/uploads\/2026\/10\/1454pm-scaled.jpeg","contentUrl":"\/wp-content\/uploads\/2026\/10\/1454pm-scaled.jpeg","width":2560,"height":1429},{"@type":"WebSite","@id":"https:\/\/www.griddb.net\/#website","url":"https:\/\/www.griddb.net\/","name":"GridDB: Open Source Time Series Database for IoT","description":"","publisher":{"@id":"https:\/\/www.griddb.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.griddb.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.griddb.net\/#organization","name":"Fixstars","url":"https:\/\/www.griddb.net\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.griddb.net\/#\/schema\/logo\/image\/","url":"https:\/\/www.griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","contentUrl":"https:\/\/www.griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","width":200,"height":83,"caption":"Fixstars"},"image":{"@id":"https:\/\/www.griddb.net\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/griddbcommunity\/","https:\/\/x.com\/GridDBCommunity","https:\/\/www.linkedin.com\/company\/griddb-by-toshiba"]},{"@type":"Person","@id":"https:\/\/www.griddb.net\/#\/schema\/person\/9796b06dbb0e63dcaaf67892e45c3df2","name":"reviewer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/56c7498f718fe0de13a8d0595e73985d070bf1fb1bcd75b4f3d4de32b5c7ad46?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/56c7498f718fe0de13a8d0595e73985d070bf1fb1bcd75b4f3d4de32b5c7ad46?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/56c7498f718fe0de13a8d0595e73985d070bf1fb1bcd75b4f3d4de32b5c7ad46?s=96&d=mm&r=g","caption":"reviewer"},"url":"https:\/\/www.griddb.net\/en\/author\/reviewer\/"}]}},"_links":{"self":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts\/55581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/users\/779"}],"replies":[{"embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/comments?post=55581"}],"version-history":[{"count":1,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts\/55581\/revisions"}],"predecessor-version":[{"id":55597,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts\/55581\/revisions\/55597"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/media\/55582"}],"wp:attachment":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/media?parent=55581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/categories?post=55581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/tags?post=55581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}