AutomationFlowsData & Sheets › AI CV Elaborator with Google Gemini

AI CV Elaborator with Google Gemini

Original n8n title: Cv Elaborator

cv-elaborator. Uses chatTrigger, executeWorkflowTrigger, agent, lmChatGoogleGemini. Chat trigger; 18 nodes.

Chat trigger trigger★★★★☆ complexityAI-powered18 nodesChat TriggerExecute Workflow TriggerAgentGoogle Gemini ChatGoogle SheetsTool WorkflowMemory Buffer WindowNotion
Data & Sheets Trigger: Chat trigger Nodes: 18 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the Agent → Chat Trigger recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "cv-elaborator",
  "nodes": [
    {
      "parameters": {
        "public": true,
        "initialMessages": "Hi there! \ud83d\udc4b\nI will help you perfect your work experience by simply selecting options.\nDrop me a random piece of working experience to start!",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "typeVersion": 1.1,
      "position": [
        -1360,
        2560
      ],
      "id": "e20c6594-dcf8-4a41-a7db-b00060b02e24",
      "name": "When chat message received"
    },
    {
      "parameters": {
        "workflowInputs": {
          "values": [
            {
              "name": "current_story"
            },
            {
              "name": "round",
              "type": "number"
            },
            {
              "name": "action"
            },
            {
              "name": "session_id"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "typeVersion": 1.1,
      "position": [
        -1360,
        2340
      ],
      "id": "468ea360-dec7-4d39-b99f-61a7087db941",
      "name": "When Executed by Another Workflow"
    },
    {
      "parameters": {
        "options": {
          "systemMessage": "\u4f60\u662f\u9762\u8bd5\u6545\u4e8b\u5b8c\u5584\u52a9\u624b\u3002\u4f60\u7684\u5de5\u4f5c\u662f\u5e2e\u52a9\u7528\u6237\u901a\u8fc7\u9009\u62e9\u7684\u65b9\u5f0f\u5b8c\u5584\u5de5\u4f5c\u7ecf\u5386\uff0c\u800c\u4e0d\u662f\u56de\u7b54\u95ee\u9898\u3002\n\n**\u6838\u5fc3\u6d41\u7a0b**\uff1a\n1. \u5148\u8c03\u7528story_analyzer\u5de5\u5177\u5206\u6790\u5f53\u524d\u6545\u4e8b\u7684STAR\u5b8c\u6574\u5ea6\n2. \u6839\u636e\u5206\u6790\u7ed3\u679c\uff1a\n   - \u5982\u679c\u9700\u8981\u5b8c\u5584(continue)\uff1a\u57fa\u4e8e\u7f3a\u5931\u7684\u7ef4\u5ea6\uff0c\u751f\u62103\u4e2a\u5177\u4f53\u7684\u9009\u62e9\u9009\u9879\u8ba9\u7528\u6237\u9009\u62e9\n   - \u5982\u679c\u5df2\u5b8c\u6574(complete)\uff1a\u8c03\u7528story_finalizer\u5de5\u5177\u751f\u6210\u6700\u7ec8\u6545\u4e8b\n\n**\u751f\u6210\u9009\u62e9\u9009\u9879\u7684\u539f\u5219**\uff1a\n- \u626e\u6f14\u7528\u6237\u89d2\u8272\uff0c\u60f3\u8c61\u8fd9\u4e2a\u5de5\u4f5c\u7ecf\u5386\u4e2d\u6700\u53ef\u80fd\u7684\u60c5\u51b5\n- \u63d0\u4f9b3\u4e2a\u5177\u4f53\u3001\u5b9e\u9645\u7684\u9009\u62e9\u9009\u9879\n- \u9009\u9879\u8981\u80fd\u4f53\u73b0\u4e2a\u4eba\u8d21\u732e\u548c\u4e13\u4e1a\u80fd\u529b\n- \u683c\u5f0f\uff1a\u7f16\u53f7\u5217\u8868\uff0c\u8ba9\u7528\u6237\u76f4\u63a5\u9009\u62e9\u6570\u5b57\n\n**\u5f53\u6545\u4e8b\u5b8c\u6210\u65f6**\uff1a\n- \u8c03\u7528story_finalizer\u5de5\u5177\u540e\uff0c\u5fc5\u987b\u5c06\u5de5\u5177\u8fd4\u56de\u7684final_response\u5b8c\u6574\u5730\u5c55\u793a\u7ed9\u7528\u6237\n- \u4e0d\u8981\u6dfb\u52a0\u989d\u5916\u7684\u603b\u7ed3\u6216\u4fee\u6539\uff0c\u76f4\u63a5\u4f7f\u7528\u5de5\u5177\u8fd4\u56de\u7684\u683c\u5f0f\u5316\u5185\u5bb9\n\n**\u793a\u4f8b**\uff1a\n\u7528\u6237\u8bf4\"\u6211\u8d1f\u8d23\u8fc7\u9500\u552e\u63d0\u5347\u9879\u76ee\"\uff0c\u5982\u679c\u7f3a\u5c11Situation\u80cc\u666f\uff0c\u4f60\u5e94\u8be5\u63d0\u4f9b\uff1a\n1. \u56e0\u4e3a\u5b63\u5ea6\u9500\u552e\u4e0b\u6ed130%\uff0c\u516c\u53f8\u6025\u9700\u63d0\u5347\u4e1a\u7ee9\n2. \u65b0\u4ea7\u54c1\u4e0a\u7ebf\uff0c\u9700\u8981\u5236\u5b9a\u65b0\u7684\u9500\u552e\u7b56\u7565\n3. \u7ade\u4e89\u5bf9\u624b\u62a2\u5360\u5e02\u573a\uff0c\u5ba2\u6237\u6d41\u5931\u4e25\u91cd\n\n\u8bb0\u4f4f\uff1a\u4f60\u662f\u5728\u5e2e\u7528\u6237\u9009\u62e9\uff0c\u800c\u4e0d\u662f\u8ba9\u7528\u6237\u56de\u7b54\u95ee\u9898\u3002"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.8,
      "position": [
        -1080,
        2560
      ],
      "id": "d038a04d-8b1f-4df5-8690-7f1167a28f71",
      "name": "Story Enhancement Agent",
      "retryOnFail": true
    },
    {
      "parameters": {
        "modelName": "models/gemini-2.0-flash",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "typeVersion": 1,
      "position": [
        -1200,
        2800
      ],
      "id": "02e1ef3c-eb1d-414f-9bae-ec264a45383e",
      "name": "Google Gemini Chat Model",
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 1
          },
          "conditions": [
            {
              "id": "analyze-condition",
              "leftValue": "=  {{ $json.action }}",
              "rightValue": "analyze",
              "operator": {
                "type": "string",
                "operation": "contains"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "59968e13-d00f-4daf-9ab4-31517e1f419e",
      "name": "Process Switch",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        -880,
        2340
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=\u4f60\u662f\u9762\u8bd5\u4e13\u5bb6\uff0c\u4e13\u95e8\u5206\u6790\u5de5\u4f5c\u7ecf\u5386\u662f\u5426\u7b26\u5408STAR\u6846\u67b6\u8981\u6c42\u3002\n\n\u5206\u6790\u8fd9\u4e2a\u5de5\u4f5c\u7ecf\u5386\uff1a{{ $json.current_story }}\n\u5f53\u524d\u8f6e\u6b21\uff1a{{ $json.round || 1 }}\n\n\u8bf7\u8bc4\u4f30STAR\u56db\u4e2a\u7ef4\u5ea6\u7684\u5b8c\u6574\u5ea6\uff1a\n- **Situation** (\u80cc\u666f)\uff1a\u9879\u76ee/\u4efb\u52a1\u7684\u80cc\u666f\u548c\u73af\u5883\n- **Task** (\u4efb\u52a1)\uff1a\u5177\u4f53\u7684\u804c\u8d23\u548c\u76ee\u6807  \n- **Action** (\u884c\u52a8)\uff1a\u91c7\u53d6\u7684\u5177\u4f53\u884c\u52a8\u548c\u65b9\u6cd5\n- **Result** (\u7ed3\u679c)\uff1a\u91cf\u5316\u7684\u6210\u679c\u548c\u5f71\u54cd\n\n**\u5224\u65ad\u6807\u51c6**\uff1a\n- \u5982\u679c\u6545\u4e8b\u5305\u542b\u6240\u6709\u5173\u952e\u8981\u7d20\u4e14\u8db3\u591f\u8be6\u7ec6(\u6bcf\u4e2a\u7ef4\u5ea6\u90fd\u6709\u5177\u4f53\u4fe1\u606f)\uff0c\u8fd4\u56decomplete\n- \u5982\u679c\u7f3a\u5c11\u5173\u952e\u4fe1\u606f\u6216\u8fc7\u4e8e\u7b80\u5355\uff0c\u8fd4\u56decontinue\u5e76\u6307\u51fa\u6700\u9700\u8981\u8865\u5145\u7684\u7ef4\u5ea6\n\n**\u4e25\u683c\u6309\u6b64JSON\u683c\u5f0f\u56de\u590d**\uff1a\n```json\n{\"status\": \"continue\", \"missing_dimension\": \"Situation\"}\n```\n\u6216\n```json\n{\"status\": \"complete\"}\n```\n\n\u53ea\u8fd4\u56deJSON\uff0c\u4e0d\u8981\u4efb\u4f55\u89e3\u91ca\u3002",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.8,
      "position": [
        -580,
        2100
      ],
      "id": "f49e6798-544e-4084-81a9-4fcdd623b423",
      "name": "Story Analyzer Agent"
    },
    {
      "parameters": {
        "modelName": "models/gemini-2.0-flash",
        "options": {
          "temperature": 0.2
        }
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "typeVersion": 1,
      "position": [
        -600,
        2280
      ],
      "id": "bb660705-3c22-4dc7-9db3-ac9c9ae9582d",
      "name": "Analyzer Gemini Model",
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=\u57fa\u4e8e\u5b8c\u6574\u7ecf\u5386\u751f\u6210\u9762\u8bd5\u6545\u4e8b\u3002\n\n\u7ecf\u5386\u5185\u5bb9\uff1a{{ $json.current_story }}\n\n\u8bf7\u4e25\u683c\u6309\u4ee5\u4e0bJSON\u683c\u5f0f\u8f93\u51fa\uff0c\u4e0d\u8981\u4ee3\u7801\u5757\u6807\u8bb0\uff0c\u4e0d\u8981\u4efb\u4f55\u5176\u4ed6\u6587\u5b57\uff1a\n\n{\n  \"structured_story\": \"Situation: \u7b80\u6d01\u63cf\u8ff0\u9879\u76ee\u80cc\u666f\u548c\u6311\u6218\\nTask: \u660e\u786e\u8bf4\u660e\u4f60\u7684\u804c\u8d23\u548c\u76ee\u6807\\nAction: \u8be6\u7ec6\u63cf\u8ff0\u4f60\u91c7\u53d6\u7684\u5177\u4f53\u884c\u52a8\\nResult: \u91cf\u5316\u7684\u6210\u679c\u548c\u5f71\u54cd\",\n  \"narrative_story\": \"\u8fde\u8d2f\u76842-3\u5206\u949f\u53e3\u8ff0\u6545\u4e8b\uff0c\u8bed\u8a00\u81ea\u7136\u6d41\u7545\uff0c\u9002\u5408TTS\u8f6c\u6362\"\n}\n\n\u8981\u6c42\uff1a\n- \u7a81\u51fa\u4e2a\u4eba\u8d21\u732e\u548c\u4e13\u4e1a\u80fd\u529b\n- \u5305\u542b\u5177\u4f53\u6570\u636e\u548c\u91cf\u5316\u7ed3\u679c\n- structured_story\u7528\u6362\u884c\u5206\u9694\u56db\u4e2a\u90e8\u5206\n- narrative_story\u662f\u8fde\u7eed\u7684\u6bb5\u843d\u6587\u672c\n- \u76f4\u63a5\u8f93\u51faJSON\u5bf9\u8c61\uff0c\u4e0d\u8981```json\u6807\u8bb0",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.8,
      "position": [
        -580,
        2500
      ],
      "id": "80efb377-051c-4e11-a45a-5828e5cac26d",
      "name": "Story Finalizer Agent"
    },
    {
      "parameters": {
        "modelName": "models/gemini-2.0-flash",
        "options": {
          "temperature": 0.3
        }
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "typeVersion": 1,
      "position": [
        -600,
        2700
      ],
      "id": "c05d5d8d-da4d-42a5-990e-c9719bc95889",
      "name": "Finalizer Gemini Model",
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "1a_Wkw6X7zb5oBcE0jtsX4SqeIRWG8h7xOXX8Scs7cLY",
          "mode": "list",
          "cachedResultName": "interview-cases",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1a_Wkw6X7zb5oBcE0jtsX4SqeIRWG8h7xOXX8Scs7cLY/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "Sheet1",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1a_Wkw6X7zb5oBcE0jtsX4SqeIRWG8h7xOXX8Scs7cLY/edit#gid=0"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "timestamp": "={{ $now.format('yyyy-MM-dd HH:mm:ss') }}",
            "total_rounds": "={{ $('Process Switch').item.json.round }}",
            "original_input": "={{ $('Process Switch').item.json.current_story }}",
            "story_length": "={{ $('Process Switch').item.json.current_story.length }}",
            "structured_story": "={{ $json.structured_story }}",
            "narrative_story": "={{ $json.narrative_story }}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "timestamp",
              "displayName": "timestamp",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "original_input",
              "displayName": "original_input",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "structured_story",
              "displayName": "structured_story",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "narrative_story",
              "displayName": "narrative_story",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "total_rounds",
              "displayName": "total_rounds",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "story_length",
              "displayName": "story_length",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "id": "5cc38cc2-858e-41fa-938f-0bfdd1d25ed2",
      "name": "Save to Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.4,
      "position": [
        20,
        2400
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// \u6839\u636e\u5904\u7406\u7c7b\u578b\u8fd4\u56de\u76f8\u5e94\u7ed3\u679c\nconst processType = $('When Executed by Another Workflow').first().json.action;\n\nif (processType === 'analyze') {\n  // \u8fd4\u56de\u5206\u6790\u7ed3\u679c\u7ed9\u4e3bAgent\n  const analysisOutput = $('Story Analyzer Agent').first().json.output;\n  return [{ json: { analysis_result: analysisOutput } }];\n  \n} else if (processType === 'finalize') {\n  // \u683c\u5f0f\u5316\u6700\u7ec8\u6545\u4e8b\u54cd\u5e94\n  const finalStoryRaw = $('Story Finalizer Agent').first().json.output;\n  const totalRounds = $('When Executed by Another Workflow').first().json.round || 1;\n  \n  // \u89e3\u6790 JSON \u8f93\u51fa\n  let finalStory;\n  try {\n    // \u6e05\u7406\u53ef\u80fd\u7684\u4ee3\u7801\u5757\u6807\u8bb0\n    const cleanOutput = finalStoryRaw.replace(/```json\\s*/, '').replace(/```\\s*$/, '');\n    finalStory = JSON.parse(cleanOutput);\n  } catch (e) {\n    // \u5982\u679c\u89e3\u6790\u5931\u8d25\uff0c\u76f4\u63a5\u4f7f\u7528\u539f\u59cb\u8f93\u51fa\n    finalStory = {\n      structured_story: finalStoryRaw,\n      narrative_story: finalStoryRaw\n    };\n  }\n  \n  const wordCount = (finalStory.narrative_story || finalStoryRaw).length;\n  \n  const response = `\ud83c\udf89 **\u9762\u8bd5\u6545\u4e8b\u751f\u6210\u5b8c\u6210\uff01**\n\n\ud83d\udccb **\u7ed3\u6784\u5316\u6545\u4e8b\uff08STAR\u6846\u67b6\uff09**\n${finalStory.structured_story}\n\n---\n\n\ud83c\udf99\ufe0f **\u9762\u8bd5\u53e3\u8ff0\u7248\u672c**\n${finalStory.narrative_story}\n\n---\n\n\ud83d\udcca **\u5b8c\u5584\u7edf\u8ba1**\n- \u5b8c\u5584\u8f6e\u6570: ${totalRounds}\u8f6e\n- \u6545\u4e8b\u957f\u5ea6: ${wordCount}\u5b57\n\n\u2705 **\u5df2\u4fdd\u5b58\u5230\u4f60\u7684\u9762\u8bd5\u7d20\u6750\u5e93**\n\n\ud83c\udfaf **\u4f7f\u7528\u5efa\u8bae**\n1. \ud83c\udfa4 \u7ec3\u4e602-3\u5206\u949f\u6d41\u7545\u8bb2\u8ff0\n2. \ud83d\udcdd \u51c6\u5907\u53ef\u80fd\u7684\u8ffd\u95ee\n3. \ud83d\udcaa \u5f3a\u8c03\u4e2a\u4eba\u5173\u952e\u8d21\u732e`;\n  \n  return [{ json: { final_response: response } }];\n  \n} else {\n  return [{ json: { error: \"Unknown process type\" } }];\n}"
      },
      "id": "dc4d9474-2e13-4c88-aec8-9e9ee7eb14b8",
      "name": "Format Output",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        280,
        2260
      ]
    },
    {
      "parameters": {
        "description": "Analyze the current story completeness based on STAR framework. Returns status (continue/complete) and missing_dimension if needs improvement.",
        "workflowId": {
          "__rl": true,
          "value": "D5Vkzx21Y1a9ashk",
          "mode": "list",
          "cachedResultName": "cv-elaborator"
        },
        "workflowInputs": {
          "mappingMode": "defineBelow",
          "value": {
            "round": "={{ $fromAI('round', 'Current conversation round number', 'number') }}",
            "current_story": "={{ $fromAI('current_story', 'The complete story content including user input and all previous selections', 'string') }}",
            "action": "analyze",
            "session_id": "={{ $json.sessionId }}"
          },
          "matchingColumns": [
            "judge_if"
          ],
          "schema": [
            {
              "id": "current_story",
              "displayName": "current_story",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            },
            {
              "id": "round",
              "displayName": "round",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "number",
              "removed": false
            },
            {
              "id": "action",
              "displayName": "action",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            },
            {
              "id": "session_id",
              "displayName": "session_id",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "typeVersion": 2.2,
      "position": [
        -980,
        2800
      ],
      "id": "2b88c228-583e-4a15-b3dc-ab81f1099654",
      "name": "story_analyzer"
    },
    {
      "parameters": {
        "description": "Generate the final STAR story and display to user when the story is complete. Returns formatted final response ready for display.",
        "workflowId": {
          "__rl": true,
          "value": "D5Vkzx21Y1a9ashk",
          "mode": "list",
          "cachedResultName": "cv-elaborator"
        },
        "workflowInputs": {
          "mappingMode": "defineBelow",
          "value": {
            "round": "={{ $fromAI('total_rounds', 'Total number of rounds used', 'number') }}",
            "current_story": "={{ $fromAI('complete_story', 'The complete story with all user selections', 'string') }}",
            "action": "finalize",
            "session_id": "={{ $json.sessionId }}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "current_story",
              "displayName": "current_story",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            },
            {
              "id": "round",
              "displayName": "round",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "number",
              "removed": false
            },
            {
              "id": "action",
              "displayName": "action",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            },
            {
              "id": "session_id",
              "displayName": "session_id",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "typeVersion": 2.2,
      "position": [
        -840,
        2800
      ],
      "id": "3e570240-51b9-45a5-824c-c7430f0c8371",
      "name": "story_finalizer"
    },
    {
      "parameters": {
        "contextWindowLength": 30
      },
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "typeVersion": 1.3,
      "position": [
        -1080,
        2800
      ],
      "id": "91a33534-c839-417e-9682-2855074b9a0a",
      "name": "Simple Memory"
    },
    {
      "parameters": {
        "jsCode": "// \u6e05\u7406AI\u8f93\u51fa\uff0c\u79fb\u9664\u4ee3\u7801\u5757\u6807\u8bb0\nlet output = $json.output;\n\n// \u79fb\u9664```json\u6807\u8bb0\noutput = output.replace(/```json\\s*/, '').replace(/```\\s*$/, '');\n\n// \u89e3\u6790JSON\nlet parsed;\ntry {\n  parsed = JSON.parse(output);\n} catch (e) {\n  // \u5982\u679c\u89e3\u6790\u5931\u8d25\uff0c\u8fd4\u56de\u9ed8\u8ba4\u7ed3\u6784\n  parsed = {\n    structured_story: \"Story parsing failed\",\n    narrative_story: \"Story parsing failed\"\n  };\n}\n\nreturn [{\n  json: {\n    ...parsed,\n  }\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -220,
        2500
      ],
      "id": "72311da6-de7f-49a5-9d9a-4ef44e0cd30b",
      "name": "Parser"
    },
    {
      "parameters": {
        "resource": "databasePage",
        "databaseId": {
          "__rl": true,
          "value": "20e2e9a3-326a-8007-9d7d-d17611e60622",
          "mode": "list",
          "cachedResultName": "working-experience-cases",
          "cachedResultUrl": "https://www.notion.so/your-notion-page-id"
        },
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "narrative_story|rich_text",
              "textContent": "={{ $json.narrative_story }}"
            },
            {
              "key": "story_length|number",
              "numberValue": "={{ $('Process Switch').first().json.current_story.length() }}"
            },
            {
              "key": "structured_story|rich_text",
              "textContent": "={{ $json.structured_story }}"
            },
            {
              "key": "timestamp|date",
              "date": "2025-06-10T22:04:49"
            },
            {
              "key": "total_rounds|number",
              "numberValue": "={{ $('Process Switch').first().json.round }}"
            },
            {
              "key": "\u540d\u79f0|title",
              "title": "={{ $('Process Switch').first().json.current_story }}"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.notion",
      "typeVersion": 2.2,
      "position": [
        20,
        2620
      ],
      "id": "ad7a0dcb-0c92-4255-8951-4eb7315e3925",
      "name": "Notion",
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "tableId": "work_experiences",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "session_id",
              "fieldValue": "={{ $('When Executed by Another Workflow').item.json.session_id }}"
            },
            {
              "fieldId": "original_input",
              "fieldValue": "={{ $('When Executed by Another Workflow').item.json.current_story }}"
            },
            {
              "fieldId": "structured_story",
              "fieldValue": "={{ $json.structured_story }}"
            },
            {
              "fieldId": "narrative_story",
              "fieldValue": "={{ $json.narrative_story }}"
            },
            {
              "fieldId": "total_rounds",
              "fieldValue": "={{ $('When Executed by Another Workflow').item.json.round }}"
            },
            {
              "fieldId": "story_length",
              "fieldValue": "={{ $('When Executed by Another Workflow').item.json.current_story.length }}"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [
        20,
        2840
      ],
      "id": "19202e74-a8f4-48d8-aa9a-ff0965b55018",
      "name": "Supabase",
      "credentials": {
        "supabaseApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=http://localhost:8000/api/experience-completed/",
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "session_id",
              "value": "={{ $('When Executed by Another Workflow').item.json.query.session_id }}"
            },
            {
              "name": "experience_id",
              "value": "={{ $('Supabase').item.json.id }}"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        460,
        2840
      ],
      "id": "5fc0ab06-cc44-449c-91d6-1048fde7155c",
      "name": "HTTP Request"
    }
  ],
  "connections": {
    "When chat message received": {
      "main": [
        [
          {
            "node": "Story Enhancement Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When Executed by Another Workflow": {
      "main": [
        [
          {
            "node": "Process Switch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Story Enhancement Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Process Switch": {
      "main": [
        [
          {
            "node": "Story Analyzer Agent",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Story Finalizer Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Story Analyzer Agent": {
      "main": [
        [
          {
            "node": "Format Output",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyzer Gemini Model": {
      "ai_languageModel": [
        [
          {
            "node": "Story Analyzer Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Story Finalizer Agent": {
      "main": [
        [
          {
            "node": "Parser",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Finalizer Gemini Model": {
      "ai_languageModel": [
        [
          {
            "node": "Story Finalizer Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Save to Google Sheets": {
      "main": [
        [
          {
            "node": "Format Output",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "story_analyzer": {
      "ai_tool": [
        [
          {
            "node": "Story Enhancement Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "story_finalizer": {
      "ai_tool": [
        [
          {
            "node": "Story Enhancement Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory": {
      "ai_memory": [
        [
          {
            "node": "Story Enhancement Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Parser": {
      "main": [
        [
          {
            "node": "Save to Google Sheets",
            "type": "main",
            "index": 0
          },
          {
            "node": "Notion",
            "type": "main",
            "index": 0
          },
          {
            "node": "Supabase",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Notion": {
      "main": [
        []
      ]
    },
    "Supabase": {
      "main": [
        []
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "e342d49a-15ee-4951-8e26-0c486f505cc8",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "D5Vkzx21Y1a9ashk",
  "tags": [
    {
      "createdAt": "2025-05-07T19:03:39.508Z",
      "updatedAt": "2025-05-07T19:03:39.508Z",
      "id": "aMCUQslRcX5XDhov",
      "name": "Linkedin"
    }
  ]
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

cv-elaborator. Uses chatTrigger, executeWorkflowTrigger, agent, lmChatGoogleGemini. Chat trigger; 18 nodes.

Source: https://github.com/wenjiaqi8255/n8n-cv-elaborator/blob/5171cd5c0e3df20e46fc9242c2c7915aef4eab0a/cv_elaborator.json — original creator credit. Request a take-down →

More Data & Sheets workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Data & Sheets

Aggregate Http. Uses lmChatOpenAi, agent, stickyNote, memoryBufferWindow. Chat trigger; 41 nodes.

OpenAI Chat, Agent, Memory Buffer Window +6
Data & Sheets

Splitout Filter. Uses toolWorkflow, lmChatOpenAi, outputParserStructured, manualTrigger. Event-driven trigger; 38 nodes.

Tool Workflow, OpenAI Chat, Output Parser Structured +3
Data & Sheets

This enables webhooks for nearly realtime updates (every 5 seconds) from Notion Databases.

Notion, Supabase, Execute Workflow Trigger +1
Data & Sheets

This n8n workflow automates the transformation of spreadsheet data into professional charts and graphs using AI-driven analysis. Triggered via Slack, it processes uploaded files (Excel, CSV, Google Sh

Agent, Postgres, HTTP Request +8
Data & Sheets

• Multi-Layer Message Analysis - Every customer interaction passes through three specialized AI classifiers: privacy detection (identifies sensitive data and security requirements), intent recognition

OpenAI, OpenAI Chat, Tool Think +13