{"id":52193,"date":"2025-07-25T00:00:00","date_gmt":"2025-07-25T07:00:00","guid":{"rendered":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/blog\/building-resume-creator-with-multi-agent-ai\/"},"modified":"2025-07-25T00:00:00","modified_gmt":"2025-07-25T07:00:00","slug":"building-resume-creator-with-multi-agent-ai","status":"publish","type":"post","link":"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/","title":{"rendered":"Building Resume Creator with Multi-agent AI"},"content":{"rendered":"<p>In this blog, we will build an AI-powered resume-creation system that automates the tedious and time-consuming tasks involved in manual resume creation. By leveraging multi-agent AI systems, we will streamline the process of information gathering, and content writing to produce resumes with minimal human intervention.<\/p>\n<h2>Limitations of Manual Resume Processing<\/h2>\n<h3>Inefficient Information Gathering<\/h3>\n<p>The manual process of collecting and organizing information is time-consuming and requires significant effort.<\/p>\n<h3>Inconsistent Formatting<\/h3>\n<p>Manual resume creation often leads to formatting inconsistencies. The process requires manual adjustments to maintain professional formatting standards, which can be error-prone and time-consuming.<\/p>\n<h3>Content Writing and Rewriting Challenges<\/h3>\n<p>The manual process requires significant effort in crafting and editing content. Writing compelling and well-structured content by hand is labor-intensive, requiring multiple revisions and edits.<\/p>\n<h2>Automating Resume Creation using AI<\/h2>\n<p>Creating a resume manually involves several steps:<\/p>\n<ol>\n<li><strong>Information Gathering<\/strong>: Collecting and organizing your personal details, job history, skills, and education.<\/li>\n<li><strong>Formatting<\/strong>: Ensuring the resume looks attractive and professional, often without clear guidelines.<\/li>\n<li><strong>Content Writing<\/strong>: Crafting and refining content to make it concise, compelling, and relevant.<\/li>\n<li><strong>Proofreading and Editing<\/strong>: Checking for errors and polishing the resume to a professional standard.<\/li>\n<\/ol>\n<p>With the AI system, we can automate these steps using multi-agent systems. Each agent performs a specific task, such as extracting information, generating content, or formatting the resume. By coordinating these agents, we can create a fully automated resume creation system.<\/p>\n<h2>Running the Resume Creator<\/h2>\n<p>Before we dive into the technical details, you can run the resume creator system by following these steps:<\/p>\n<p>1) Clone the repository:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">git clone https:\/\/github.com\/junwatu\/resume-creator-multi-agent-ai.git<\/code><\/pre>\n<\/div>\n<p>2) Install the dependencies:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">cd resume-creator-multi-agent-ai\ncd apps\nnpm install<\/code><\/pre>\n<\/div>\n<p>3) Create a <code>.env<\/code> file in the <code>apps<\/code> directory and add the following environment variables:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">OPENAI_API_KEY=api-key-here\nGRIDDB_WEBAPI_URL=\nGRIDDB_USERNAME=\nGRIDDB_PASSWORD=\nVITE_APP_BASE_URL=http:\/\/localhost\nVITE_PORT=3000<\/code><\/pre>\n<\/div>\n<p>Please refer to the <a href=\"#prerequisites\">Prerequisites<\/a> section for more details on obtaining the OpenAI API key and GridDB credentials.<\/p>\n<p>4) Start the server:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">npm run start<\/code><\/pre>\n<\/div>\n<p>5) Open your browser and go to <code>http:\/\/localhost:3000<\/code> to access the resume creator system.<\/p>\n<h2>How it Works?<\/h2>\n<p>In this blog, we automate the <strong>information gathering<\/strong> and <strong>content writing<\/strong> for the resume, tasks that are usually manual and time-consuming.<\/p>\n<p>This system diagram illustrates the resume creation process discussed in this blog, showcasing the collaboration between two main AI agents:<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/07\/ai-agents-diagram.webp\"><img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/07\/ai-agents-diagram.webp\" alt=\"\" width=\"2544\" height=\"1349\" class=\"aligncenter size-full wp-image-32167\" srcset=\"\/wp-content\/uploads\/2025\/07\/ai-agents-diagram.webp 2544w, \/wp-content\/uploads\/2025\/07\/ai-agents-diagram-300x159.webp 300w, \/wp-content\/uploads\/2025\/07\/ai-agents-diagram-1024x543.webp 1024w, \/wp-content\/uploads\/2025\/07\/ai-agents-diagram-768x407.webp 768w, \/wp-content\/uploads\/2025\/07\/ai-agents-diagram-1536x814.webp 1536w, \/wp-content\/uploads\/2025\/07\/ai-agents-diagram-2048x1086.webp 2048w, \/wp-content\/uploads\/2025\/07\/ai-agents-diagram-600x318.webp 600w\" sizes=\"(max-width: 2544px) 100vw, 2544px\" \/><\/a><\/p>\n<p>Here&#8217;s a brief description:<\/p>\n<ul>\n<li>\n<p>The system starts with <strong>User Input<\/strong> and requires an environment setup that includes <strong>Team Initialization<\/strong> and <strong>OpenAI API Key<\/strong>.<\/p>\n<\/li>\n<li>\n<p>Two AI agents work together:<\/p>\n<ul>\n<li><strong>Profile Analyst (Agent AI 1)<\/strong>: Handles data extraction from user input, breaking down information into categories like <strong>Name<\/strong>, <strong>Experience<\/strong>, <strong>Skills<\/strong>, <strong>Education<\/strong>, and <strong>Job History<\/strong>.<\/li>\n<li><strong>Resume Writer (Agent AI 2)<\/strong>: Takes structured information and handles the writing aspect.<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>The workflow follows these key steps:<\/p>\n<ul>\n<li><strong>Data Extraction<\/strong>: Organizes raw user input into structured categories. This is the information-gathering step.<\/li>\n<li><strong>Structured Information<\/strong>: Stores the organized data into the GridDB Cloud database.<\/li>\n<li><strong>Resume Crafting<\/strong>: Combines the structured data with writing capabilities. This is the content writing step.<\/li>\n<li><strong>Create Resume<\/strong>: Generates the content.<\/li>\n<li><strong>Final Resume<\/strong>: Produces the completed document.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Prerequisites<\/h2>\n<h3>KaibanJS<\/h3>\n<p><a href=\"https:\/\/www.kaibanjs.com\/\">KaibanJS<\/a> is the JavaScript framework for building multi-agent AI systems. We will use it to build our resume creation system.<\/p>\n<h3>OpenAI<\/h3>\n<p>We will use the <a href=\"https:\/\/platform.openai.com\/docs\/models#o1\"><code>o1-mini<\/code><\/a> model from OpenAI. It is a smaller version of the <code>o1<\/code> model, suitable for tasks that require complex reasoning and understanding.<\/p>\n<p>Create a project, an API key, and enable the <code>o1-mini<\/code> model in the <a href=\"https:\/\/platform.openai.com\/\">OpenAI platform<\/a>. Make sure to save the API key in the <code>.env<\/code> file.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">OPENAI_API_KEY=api-key-here<\/code><\/pre>\n<\/div>\n<h3>GridDB Cloud<\/h3>\n<p>The GridDB Cloud offers a free plan tier and is officially available worldwide. This database will store the structured information extracted by the <strong>Profile Analyst<\/strong> agent and also the final resume generated by the <strong>Resume Writer<\/strong> agent.<\/p>\n<p>You need these GridDB environment variables in the <code>.env<\/code> file:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">GRIDDB_WEBAPI_URL=\nGRIDDB_USERNAME=\nGRIDDB_PASSWORD=<\/code><\/pre>\n<\/div>\n<p>Check the below section on how to get these values.<\/p>\n<h4>Sign Up for GridDB Cloud Free Plan<\/h4>\n<p>If you would like to sign up for a GridDB Cloud Free instance, you can do so in 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>.<\/p>\n<p>After 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>.<\/p>\n<h4>GridDB WebAPI URL<\/h4>\n<p>Go to the GridDB Cloud Portal and copy the WebAPI URL from the <strong>Clusters<\/strong> section. It should look like this:<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/07\/griddb-cloud-portal-scaled.webp\"><img decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/07\/griddb-cloud-portal-scaled.webp\" alt=\"\" width=\"2560\" height=\"1265\" class=\"aligncenter size-full wp-image-32166\" srcset=\"\/wp-content\/uploads\/2025\/07\/griddb-cloud-portal-scaled.webp 2560w, \/wp-content\/uploads\/2025\/07\/griddb-cloud-portal-300x148.webp 300w, \/wp-content\/uploads\/2025\/07\/griddb-cloud-portal-1024x506.webp 1024w, \/wp-content\/uploads\/2025\/07\/griddb-cloud-portal-768x380.webp 768w, \/wp-content\/uploads\/2025\/07\/griddb-cloud-portal-1536x759.webp 1536w, \/wp-content\/uploads\/2025\/07\/griddb-cloud-portal-2048x1012.webp 2048w, \/wp-content\/uploads\/2025\/07\/griddb-cloud-portal-600x297.webp 600w\" sizes=\"(max-width: 2560px) 100vw, 2560px\" \/><\/a><\/p>\n<h4>GridDB Username and Password<\/h4>\n<p>Go 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>.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/07\/griddb-cloud-users-scaled.webp\"><img decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/07\/griddb-cloud-users-scaled.webp\" alt=\"\" width=\"2560\" height=\"1351\" class=\"aligncenter size-full wp-image-32165\" srcset=\"\/wp-content\/uploads\/2025\/07\/griddb-cloud-users-scaled.webp 2560w, \/wp-content\/uploads\/2025\/07\/griddb-cloud-users-300x158.webp 300w, \/wp-content\/uploads\/2025\/07\/griddb-cloud-users-1024x540.webp 1024w, \/wp-content\/uploads\/2025\/07\/griddb-cloud-users-768x405.webp 768w, \/wp-content\/uploads\/2025\/07\/griddb-cloud-users-1536x810.webp 1536w, \/wp-content\/uploads\/2025\/07\/griddb-cloud-users-2048x1080.webp 2048w, \/wp-content\/uploads\/2025\/07\/griddb-cloud-users-600x317.webp 600w\" sizes=\"(max-width: 2560px) 100vw, 2560px\" \/><\/a><\/p>\n<p>For 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>.<\/p>\n<h4>IP Whitelist<\/h4>\n<p>When 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.<\/p>\n<p>You can use a website like <a href=\"https:\/\/whatismyipaddress.com\/\">What Is My IP Address<\/a> to find your public IP address.<\/p>\n<p>To whitelist the IP, go to the GridDB Cloud Admin and navigate to the <strong>Network Access<\/strong> menu.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/07\/ip-whitelist-scaled.webp\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/07\/ip-whitelist-scaled.webp\" alt=\"\" width=\"2560\" height=\"1095\" class=\"aligncenter size-full wp-image-32164\" srcset=\"\/wp-content\/uploads\/2025\/07\/ip-whitelist-scaled.webp 2560w, \/wp-content\/uploads\/2025\/07\/ip-whitelist-300x128.webp 300w, \/wp-content\/uploads\/2025\/07\/ip-whitelist-1024x438.webp 1024w, \/wp-content\/uploads\/2025\/07\/ip-whitelist-768x329.webp 768w, \/wp-content\/uploads\/2025\/07\/ip-whitelist-1536x657.webp 1536w, \/wp-content\/uploads\/2025\/07\/ip-whitelist-2048x876.webp 2048w, \/wp-content\/uploads\/2025\/07\/ip-whitelist-600x257.webp 600w\" sizes=\"(max-width: 2560px) 100vw, 2560px\" \/><\/a><\/p>\n<h3>Node.js<\/h3>\n<p>We will use Node.js LTS v22.12.0 to build a server that handles the communication between the user interface, AI agents, and OpenAI API and store data in the GridDB Cloud database.<\/p>\n<h3>React<\/h3>\n<p>We will use React to build the user interface for the resume creation system. Where the user can input their details and generate a resume with a click of a button.<\/p>\n<h2>Building the Resume Creation System<\/h2>\n<h3>Node.js Server<\/h3>\n<p>We will use Node.js to build the server that handles the communication between the user interface, AI agents, and OpenAI API. The server will also store the structured information in the GridDB Cloud database.<\/p>\n<p>This table provides an overview of the API routes defined in the <code>server.js<\/code> code, including HTTP methods, endpoints, descriptions, and any parameters.<\/p>\n<table>\n<thead>\n<tr>\n<th>HTTP Method<\/th>\n<th>Endpoint<\/th>\n<th>Description<\/th>\n<th>Parameters<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>POST<\/td>\n<td><code>\/api\/resumes<\/code><\/td>\n<td>Creates a new resume. Calls the <code>generateResume<\/code> function to generate content, saves to the database, and returns the response.<\/td>\n<td><strong>Body<\/strong>: <code>{ content: string }<\/code><\/td>\n<\/tr>\n<tr>\n<td>GET<\/td>\n<td><code>\/api\/resumes<\/code><\/td>\n<td>Fetches all resumes stored in the database.<\/td>\n<td>None<\/td>\n<\/tr>\n<tr>\n<td>GET<\/td>\n<td><code>\/api\/resumes\/:id<\/code><\/td>\n<td>Fetches a specific resume by its ID.<\/td>\n<td><strong>Path<\/strong>: <code>id<\/code> (Resume ID)<\/td>\n<\/tr>\n<tr>\n<td>DELETE<\/td>\n<td><code>\/api\/resumes\/:id<\/code><\/td>\n<td>Deletes a specific resume by its ID.<\/td>\n<td><strong>Path<\/strong>: <code>id<\/code> (Resume ID)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The main route code for the resume creation is as follows:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">app.post('\/api\/resumes', async (req, res) => {\n try {\n  const resumeData = req.body || {};\n  const result = await generateResume(resumeData.content || undefined);\n  console.log(result);\n\n  const resume = {\n   id: generateRandomID(),\n   rawContent: resumeData.content,\n   formattedContent: result.result,\n   status: result.status,\n   createdAt: new Date().toISOString(),\n   information: JSON.stringify(result.stats),\n }\n\n  \/\/ Save resume to database\n  const dbResponse = await dbClient.insertData({ data: resume });\n\n  if (result.status === 'success') {\n   const all = {\n    message: 'Resume created successfully',\n    data: result.result,\n    stats: result.stats,\n    dbStatus: dbResponse\n }\n   res.status(201).json(all);\n } else {\n   res.status(400).json({\n    message: 'Failed to generate resume',\n    error: result.error\n });\n }\n } catch (error) {\n  res.status(500).json({\n   error: 'Server error while creating resume',\n   details: error.message\n });\n }\n});<\/code><\/pre>\n<\/div>\n<p>When the user submits their data, the server calls the <code>generateResume<\/code> function to generate the resume content. The result is then saved to the GridDB Cloud database, and the resume content is returned as a response.<\/p>\n<h3>Multi-agent AI<\/h3>\n<p>We will use KaibanJS to build the multi-agent AI system for the resume creation process. You can find the agent code in the <code>team.kban.js<\/code> file and this system consists of two main agents:<\/p>\n<h4>Profile Analyst (Agent AI 1)<\/h4>\n<p>The <strong>Profile Analyst<\/strong> agent is responsible for extracting structured information from the user input. It categorizes the input into fields such as <strong>Name<\/strong>, <strong>Experience<\/strong>, <strong>Skills<\/strong>, <strong>Education<\/strong>, and <strong>Job History<\/strong>. The effectiveness of these fields depends on the quality and diversity of the submitted data.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">const profileAnalyst = new Agent({\n  name: 'Carla Smith',\n  role: 'Profile Analyst',\n  goal: 'Extract structured information from conversational user input.',\n  background: 'Data Processor',\n  tools: []  \/\/ Tools are omitted for now\n});<\/code><\/pre>\n<\/div>\n<p>This profile agent will use this task code to extract user data:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">const processingTask = new Task({\n  description: `Extract relevant details such as name, \n experience, skills, and job history from the user's 'aboutMe' input. \n aboutMe: {aboutMe}`,\n  expectedOutput: 'Structured data ready to be used for a resume creation.',\n  agent: profileAnalyst\n});<\/code><\/pre>\n<\/div>\n<p>The <code>expectedOutput<\/code> is the structured data that will be used by the <strong>Resume Writer<\/strong> agent to generate the resume content.<\/p>\n<p>The <code>description<\/code> and <code>expectedOutput<\/code> mimic the prompts if were interact with ChatGPT. However, in this case, this is done by the <strong>Profile Analyst<\/strong> agent.<\/p>\n<h4>Resume Writer (Agent AI 2)<\/h4>\n<p>The <strong>Resume Writer<\/strong> agent is responsible for crafting the resume content based on the structured information provided by the <strong>Profile Analyst<\/strong> agent. It generates well-structured, compelling content that effectively showcases the user&#8217;s qualifications and achievements.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">const resumeWriter = new Agent({\n  name: 'Alex Morra',\n  role: 'Resume Writer',\n  goal: `Craft compelling, well-structured resumes \n that effectively showcase job seekers qualifications and achievements.`,\n  background: `Extensive experience in recruiting, \n copywriting, and human resources, enabling \n effective resume design that stands out to employers.`,\n  tools: []\n});<\/code><\/pre>\n<\/div>\n<p>This resume agent will use this task code to generate the resume content:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">const resumeCreationTask = new Task({\n  description: `Utilize the structured data to create \n a detailed and attractive resume. \n Enrich the resume content by inferring additional details from the provided information.\n Include sections such as a personal summary, detailed work experience, skills, and educational background.`,\n  expectedOutput: `A professionally formatted resume in raw markdown format, ready for submission to potential employers`,\n  agent: resumeWriter\n});<\/code><\/pre>\n<\/div>\n<p>The result of this task is markdown-formatted resume content that can be easily converted into a PDF or other formats and it&#8217;s easy to process by the user interface.<\/p>\n<h3>Save Data to GridDB Cloud Database<\/h3>\n<p>The GridDB Cloud database stores the structured information extracted by the <strong>Profile Analyst<\/strong> agent and the final resume generated by the <strong>Resume Writer<\/strong> agent.<\/p>\n<p>This is the schema data used to store the resume information in the GridDB Cloud database:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">{\n  \"id\": \"string\",\n  \"rawContent\": \"string\",\n  \"formattedContent\": \"string\",\n  \"status\": \"string\",\n  \"createdAt\": \"string\",\n  \"information\": \"string\"\n}<\/code><\/pre>\n<\/div>\n<table>\n<thead>\n<tr>\n<th>Field<\/th>\n<th>Type<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>id<\/code><\/td>\n<td>string<\/td>\n<td>A unique identifier for each resume.<\/td>\n<\/tr>\n<tr>\n<td><code>rawContent<\/code><\/td>\n<td>string<\/td>\n<td>The original user input for the resume.<\/td>\n<\/tr>\n<tr>\n<td><code>formattedContent<\/code><\/td>\n<td>string<\/td>\n<td>The final formatted resume content.<\/td>\n<\/tr>\n<tr>\n<td><code>status<\/code><\/td>\n<td>string<\/td>\n<td>Indicates the success or failure of the resume generation process.<\/td>\n<\/tr>\n<tr>\n<td><code>createdAt<\/code><\/td>\n<td>string<\/td>\n<td>The timestamp of when the resume was created.<\/td>\n<\/tr>\n<tr>\n<td><code>information<\/code><\/td>\n<td>string<\/td>\n<td>The OpenAI token information.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>GridDB Cloud provides a <a href=\"https:\/\/www.toshiba-sol.co.jp\/pro\/griddbcloud\/docs-en\/v2_5\/reference_web_api_html\/GridDB_Web_API_Reference.html\">RESTful API<\/a> that allows us to interact with the database. We will use this API to store and retrieve the resume information.<\/p>\n<p>The <code>griddb-client.js<\/code> file contains the code to interact with the GridDB Cloud database. It includes functions to insert, retrieve, and delete resume data.<\/p>\n<p>To insert new data, you can use the endpoint <code>\/containers\/${containerName}\/rows<\/code>. This endpoint allows you to add a new row of data to the database:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">async function insertData({\n        data,\n        containerName = 'resumes'\n    }) {\n\n        console.log(data);\n        try {\n            const timestamp = data.createdAt instanceof Date\n                ? data.createdAt.toISOString()\n                : data.createdAt;\n\n            const row = [\n                parseInt(data.id),           \/\/ INTEGER\n                data.rawContent,             \/\/ STRING\n                data.formattedContent,       \/\/ STRING\n                data.status,                 \/\/ STRING\n                timestamp,                   \/\/ TIMESTAMP (ISO format)\n                data.information             \/\/ STRING\n            ];\n\n            const path = `\/containers\/${containerName}\/rows`;\n\n            return await makeRequest(path, [row], 'PUT');\n        } catch (error) {\n            throw new Error(`Failed to insert data: ${error.message}`);\n        }\n    }<\/code><\/pre>\n<\/div>\n<p>GridDB also supports SQL-like queries to interact with the database. Here&#8217;s an example of an SQL query to retrieve all resumes from the database:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sql\">SELECT * FROM resumes;<\/code><\/pre>\n<\/div>\n<p>and to retrieve a specific resume by its ID:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sql\">SELECT * FROM resumes WHERE id = 'resume-id';<\/code><\/pre>\n<\/div>\n<p>Let&#8217;s take an example how to insert data into the GridDB Cloud database:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">const sql = \"insert into resumes (id, rawContent, formattedContent, status, createdAt, information) values(3, 'raw contenct here', ' formatted content here', 'success', TIMESTAMP('2025-01-02'), '{tokens: 300}')\";\n\nconst response = await fetch(`${process.env.GRIDDB_WEBAPI_URL}'\/sql\/dml\/update'`, {\n   method: 'POST',\n   headers: {\n    'Content-Type': 'application\/json',\n    'Authorization': `Basic ${authToken}`,\n   },\n   body: JSON.stringify(payload),\n  });\n\n  const responseText = await response.text();<\/code><\/pre>\n<\/div>\n<p>The code above inserts the resume data into the GridDB Cloud database using the <code>\/sql\/dml\/update<\/code> endpoint and the SQL query.<\/p>\n<p>All these data operations will be handled by the Node.js server and exposed as API endpoints for the user interface to interact with.<\/p>\n<h3>User Interface<\/h3>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/07\/resume-creator.webp\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/07\/resume-creator.webp\" alt=\"\" width=\"2066\" height=\"1470\" class=\"aligncenter size-full wp-image-32162\" srcset=\"\/wp-content\/uploads\/2025\/07\/resume-creator.webp 2066w, \/wp-content\/uploads\/2025\/07\/resume-creator-300x213.webp 300w, \/wp-content\/uploads\/2025\/07\/resume-creator-1024x729.webp 1024w, \/wp-content\/uploads\/2025\/07\/resume-creator-768x546.webp 768w, \/wp-content\/uploads\/2025\/07\/resume-creator-1536x1093.webp 1536w, \/wp-content\/uploads\/2025\/07\/resume-creator-2048x1457.webp 2048w, \/wp-content\/uploads\/2025\/07\/resume-creator-600x427.webp 600w\" sizes=\"(max-width: 2066px) 100vw, 2066px\" \/><\/a><\/p>\n<p>The <code>ResumeCreator<\/code> component is built using React and allows users to input their details in a text and generate a resume with the click of a button. The user interface is designed to be simple.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">import { useState } from 'react';\nimport { Card, CardContent } from '@\/components\/ui\/card';\nimport { Button } from '@\/components\/ui\/button';\nimport { Textarea } from '@\/components\/ui\/textarea';\nimport { Alert, AlertDescription } from '@\/components\/ui\/alert';\nimport { ResumeMarkdownRenderer } from '.\/ResumeMarkdownRenderer.tsx';\n\nconst ResumeCreator = () => {\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitStatus, setSubmitStatus] = useState<'success' | 'error' | null>(null);\n const [resumeText, setResumeText] = useState(\"default resume text\");\n const [markdownContent, setMarkdownContent] = useState<string | null>(null);\n\n const BASE_URL = import.meta.env.VITE_APP_BASE_URL + ':' + import.meta.env.VITE_PORT;\n\n const handleSubmit = async () => {\n  setIsSubmitting(true);\n  setSubmitStatus(null);\n\n  try {\n   const response = await fetch(`${BASE_URL}\/api\/resumes`, {\n    method: 'POST',\n    headers: {\n     'Content-Type': 'application\/json',\n },\n    body: JSON.stringify({ content: resumeText }),\n });\n\n   if (!response.ok) {\n    throw new Error('Failed to create resume');\n }\n\n   const aiResume = await response.json();\n   setMarkdownContent(aiResume.data);\n   setSubmitStatus('success');\n } catch (error) {\n   console.error('Error creating resume:', error);\n   setSubmitStatus('error');\n } finally {\n   setIsSubmitting(false);\n   setTimeout(() => setSubmitStatus(null), 5000);\n }\n };\n\n return (\n  &lt;div className=\"max-w-4xl mx-auto p-8 space-y-6\"&gt;\n   &lt;h1 className=\"text-3xl font-bold text-center\"&gt;\n Resume Creator\n    &lt;div className=\"w-40 h-1 bg-green-500 mx-auto mt-1\"&gt;&lt;\/div&gt;\n   &lt;\/h1&gt;\n\n   {submitStatus && (\n    &lt;Alert className={submitStatus === 'success' ? 'bg-green-50' : 'bg-red-50'}&gt;\n     &lt;AlertDescription&gt;\n      {submitStatus === 'success'\n       ? 'Resume created successfully!'\n       : 'Failed to create resume. Please try again.'}\n     &lt;\/AlertDescription&gt;\n    &lt;\/Alert&gt;\n   )}\n\n   {markdownContent ? (\n    &lt;ResumeMarkdownRenderer markdown={markdownContent} \/&gt;\n   ) : (\n     &lt;div className=\"space-y-6\"&gt;\n      &lt;h2 className=\"text-2xl font-semibold\"&gt;About Me&lt;\/h2&gt;\n\n      &lt;Card className=\"border-2\"&gt;\n       &lt;CardContent className=\"p-6\"&gt;\n        &lt;p className=\"text-sm text-gray-600 mb-4\"&gt;\n Enter your professional experience, skills, and education. Our AI will help format this\n into a polished resume.\n        &lt;\/p&gt;\n        &lt;Textarea\n         value={resumeText}\n         onChange={(e: React.ChangeEvent&lt;HTMLTextAreaElement&gt;) =&gt; setResumeText(e.target.value)}\n         className=\"min-h-[400px] font-mono\"\n         placeholder=\"Enter your resume content here...\"\n        \/&gt;\n       &lt;\/CardContent&gt;\n      &lt;\/Card&gt;\n\n      &lt;div className=\"flex justify-center\"&gt;\n       &lt;Button\n        onClick={handleSubmit}\n        disabled={isSubmitting}\n        className=\"bg-green-500 hover:bg-green-600 text-white px-8 py-2 rounded-md\"\n       &gt;\n        {isSubmitting ? 'Creating...' : 'Create Resume'}\n       &lt;\/Button&gt;\n      &lt;\/div&gt;\n     &lt;\/div&gt;\n   )}\n  &lt;\/div&gt;\n );\n};\n\nexport default ResumeCreator;<\/code><\/pre>\n<\/div>\n<p>The core functionality of the <code>ResumeCreator<\/code> component is to create a user resume using AI and render the result. It uses <code>useState<\/code> to manage input (<code>resumeText<\/code>), generated markdown (<code>markdownContent<\/code>), submission status (<code>submitStatus<\/code>), and submission progress (<code>isSubmitting<\/code>). The <code>handleSubmit<\/code> function sends a POST request to the <code>\/api\/resumes<\/code> route at the backend (<code>${BASE_URL}\/api\/resumes<\/code>), passing the user&#8217;s input, and updates the state based on the API&#8217;s response. Read <a href=\"#nodejs-server\">here<\/a> for the Node.js API routes.<\/p>\n<p>The UI includes a text area for input, a submit button to trigger the API call, and a markdown renderer <code>ResumeMarkdownRenderer<\/code> component to display the AI-generated resume. Alerts notify the user of the submission status while loading states to ensure a smooth experience.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/07\/resume-formatted-scaled.webp\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/07\/resume-formatted-scaled.webp\" alt=\"\" width=\"2560\" height=\"1558\" class=\"aligncenter size-full wp-image-32160\" srcset=\"\/wp-content\/uploads\/2025\/07\/resume-formatted-scaled.webp 2560w, \/wp-content\/uploads\/2025\/07\/resume-formatted-300x183.webp 300w, \/wp-content\/uploads\/2025\/07\/resume-formatted-1024x623.webp 1024w, \/wp-content\/uploads\/2025\/07\/resume-formatted-768x467.webp 768w, \/wp-content\/uploads\/2025\/07\/resume-formatted-1536x935.webp 1536w, \/wp-content\/uploads\/2025\/07\/resume-formatted-2048x1246.webp 2048w, \/wp-content\/uploads\/2025\/07\/resume-formatted-600x365.webp 600w\" sizes=\"(max-width: 2560px) 100vw, 2560px\" \/><\/a><\/p>\n<h2>Further Improvements<\/h2>\n<ul>\n<li><strong>Enhanced Data Extraction<\/strong>: Improve the <strong>Profile Analyst<\/strong> agent&#8217;s ability to extract and categorize information more accurately and efficiently.<\/li>\n<li><strong>Advanced Content Generation<\/strong>: Enhance the <strong>Resume Writer<\/strong> agent&#8217;s content generation capabilities to produce more compelling and personalized resumes.<\/li>\n<li><strong>User Interface Enhancements<\/strong>: Add more features to the user interface, such as resume templates, customization options, and real-time editing.<\/li>\n<\/ul>\n<h2>Conclusion<\/h2>\n<p>In this blog, we have built an AI-powered resume-creation system that automates the tedious and time-consuming tasks involved in manual resume creation. By leveraging multi-agent AI systems, we have streamlined the process of information gathering and content writing to produce resumes with minimal human intervention.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this blog, we will build an AI-powered resume-creation system that automates the tedious and time-consuming tasks involved in manual resume creation. By leveraging multi-agent AI systems, we will streamline the process of information gathering, and content writing to produce resumes with minimal human intervention. Limitations of Manual Resume Processing Inefficient Information Gathering The manual [&hellip;]<\/p>\n","protected":false},"author":41,"featured_media":52194,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[121],"tags":[],"class_list":["post-52193","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 v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Building Resume Creator with Multi-agent AI | GridDB: Open Source Time Series Database for IoT<\/title>\n<meta name=\"description\" content=\"In this blog, we will build an AI-powered resume-creation system that automates the tedious and time-consuming tasks involved in manual resume creation.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building Resume Creator with Multi-agent AI | GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"og:description\" content=\"In this blog, we will build an AI-powered resume-creation system that automates the tedious and time-consuming tasks involved in manual resume creation.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/\" \/>\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=\"2025-07-25T07:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/12\/joao-ferrao-4YzrcDNcRVg-unsplash.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1800\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"griddb-admin\" \/>\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=\"griddb-admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/\"},\"author\":{\"name\":\"griddb-admin\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233\"},\"headline\":\"Building Resume Creator with Multi-agent AI\",\"datePublished\":\"2025-07-25T07:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/\"},\"wordCount\":1770,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2025\/12\/joao-ferrao-4YzrcDNcRVg-unsplash.webp\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/\",\"url\":\"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/\",\"name\":\"Building Resume Creator with Multi-agent AI | GridDB: Open Source Time Series Database for IoT\",\"isPartOf\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2025\/12\/joao-ferrao-4YzrcDNcRVg-unsplash.webp\",\"datePublished\":\"2025-07-25T07:00:00+00:00\",\"description\":\"In this blog, we will build an AI-powered resume-creation system that automates the tedious and time-consuming tasks involved in manual resume creation.\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/#primaryimage\",\"url\":\"\/wp-content\/uploads\/2025\/12\/joao-ferrao-4YzrcDNcRVg-unsplash.webp\",\"contentUrl\":\"\/wp-content\/uploads\/2025\/12\/joao-ferrao-4YzrcDNcRVg-unsplash.webp\",\"width\":2400,\"height\":1800},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#website\",\"url\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/\",\"name\":\"GridDB: Open Source Time Series Database for IoT\",\"description\":\"GridDB is an open source time-series database with the performance of NoSQL and convenience of SQL\",\"publisher\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#organization\",\"name\":\"Fixstars\",\"url\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png\",\"contentUrl\":\"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png\",\"width\":200,\"height\":83,\"caption\":\"Fixstars\"},\"image\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/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:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233\",\"name\":\"griddb-admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g\",\"caption\":\"griddb-admin\"},\"url\":\"https:\/\/griddb.net\/en\/author\/griddb-admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building Resume Creator with Multi-agent AI | GridDB: Open Source Time Series Database for IoT","description":"In this blog, we will build an AI-powered resume-creation system that automates the tedious and time-consuming tasks involved in manual resume creation.","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:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/","og_locale":"en_US","og_type":"article","og_title":"Building Resume Creator with Multi-agent AI | GridDB: Open Source Time Series Database for IoT","og_description":"In this blog, we will build an AI-powered resume-creation system that automates the tedious and time-consuming tasks involved in manual resume creation.","og_url":"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/","og_site_name":"GridDB: Open Source Time Series Database for IoT","article_publisher":"https:\/\/www.facebook.com\/griddbcommunity\/","article_published_time":"2025-07-25T07:00:00+00:00","og_image":[{"width":2400,"height":1800,"url":"https:\/\/griddb.net\/wp-content\/uploads\/2025\/12\/joao-ferrao-4YzrcDNcRVg-unsplash.webp","type":"image\/webp"}],"author":"griddb-admin","twitter_card":"summary_large_image","twitter_creator":"@GridDBCommunity","twitter_site":"@GridDBCommunity","twitter_misc":{"Written by":"griddb-admin","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/#article","isPartOf":{"@id":"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/"},"author":{"name":"griddb-admin","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233"},"headline":"Building Resume Creator with Multi-agent AI","datePublished":"2025-07-25T07:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/"},"wordCount":1770,"commentCount":0,"publisher":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#organization"},"image":{"@id":"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2025\/12\/joao-ferrao-4YzrcDNcRVg-unsplash.webp","articleSection":["Blog"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/","url":"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/","name":"Building Resume Creator with Multi-agent AI | GridDB: Open Source Time Series Database for IoT","isPartOf":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/#primaryimage"},"image":{"@id":"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2025\/12\/joao-ferrao-4YzrcDNcRVg-unsplash.webp","datePublished":"2025-07-25T07:00:00+00:00","description":"In this blog, we will build an AI-powered resume-creation system that automates the tedious and time-consuming tasks involved in manual resume creation.","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb.net\/en\/blog\/building-resume-creator-with-multi-agent-ai\/#primaryimage","url":"\/wp-content\/uploads\/2025\/12\/joao-ferrao-4YzrcDNcRVg-unsplash.webp","contentUrl":"\/wp-content\/uploads\/2025\/12\/joao-ferrao-4YzrcDNcRVg-unsplash.webp","width":2400,"height":1800},{"@type":"WebSite","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#website","url":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/","name":"GridDB: Open Source Time Series Database for IoT","description":"GridDB is an open source time-series database with the performance of NoSQL and convenience of SQL","publisher":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#organization","name":"Fixstars","url":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/logo\/image\/","url":"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","contentUrl":"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","width":200,"height":83,"caption":"Fixstars"},"image":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/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:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233","name":"griddb-admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g","caption":"griddb-admin"},"url":"https:\/\/griddb.net\/en\/author\/griddb-admin\/"}]}},"_links":{"self":[{"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/posts\/52193","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/comments?post=52193"}],"version-history":[{"count":0,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/posts\/52193\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/media\/52194"}],"wp:attachment":[{"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/media?parent=52193"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/categories?post=52193"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/tags?post=52193"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}