{
  "name": "\ud83d\uddc2\ufe0f AI \uae30\ubc18 \ud30c\uc77c \uc790\ub3d9 \uc815\ub9ac \uc2dc\uc2a4\ud15c",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes",
              "minutesInterval": 5
            }
          ]
        }
      },
      "id": "schedule-trigger-001",
      "name": "1. \ub9e4 5\ubd84\ub9c8\ub2e4 \uc2e4\ud589",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        1504,
        -752
      ],
      "notes": "\u23f0 \ub9e4 5\ubd84\ub9c8\ub2e4 \uc790\ub3d9\uc73c\ub85c \uc6cc\ud06c\ud50c\ub85c\uc6b0 \uc2e4\ud589\n\n\ubcc0\uacbd \ubc29\ubc95:\n- minutesInterval: 10 \u2192 10\ubd84\ub9c8\ub2e4\n- field: 'hours', hoursInterval: 1 \u2192 1\uc2dc\uac04\ub9c8\ub2e4"
    },
    {
      "parameters": {
        "jsCode": "// 2. Downloads \ud3f4\ub354 \uc2a4\uce94\nconst fs = require('fs');\nconst path = require('path');\n\n// \u26a0\ufe0f Docker \ud658\uacbd: '/data/test/Downloads'\n// \u26a0\ufe0f Windows \uc9c1\uc811: 'C:\\\\Users\\\\YOUR_NAME\\\\Desktop\\\\test\\\\Downloads'\nconst downloadsPath = '/data/test/Downloads';\n\ntry {\n  // \ud3f4\ub354 \ub0b4 \ud30c\uc77c \ubaa9\ub85d \uac00\uc838\uc624\uae30\n  const files = fs.readdirSync(downloadsPath);\n  \n  // \ud30c\uc77c\ub9cc \ud544\ud130\ub9c1 (\ud3f4\ub354 \uc81c\uc678)\n  const fileList = files.filter(file => {\n    const fullPath = path.join(downloadsPath, file);\n    return fs.statSync(fullPath).isFile();\n  }).map(file => {\n    const fullPath = path.join(downloadsPath, file);\n    return {\n      filename: file,\n      fullPath: fullPath,\n      size: fs.statSync(fullPath).size\n    };\n  });\n  \n  if (fileList.length === 0) {\n    return [];\n  }\n  \n  return fileList.map(file => ({ json: file }));\n  \n} catch (error) {\n  console.error('\ud3f4\ub354 \uc2a4\uce94 \uc5d0\ub7ec:', error);\n  return [{\n    json: {\n      error: error.message,\n      path: downloadsPath\n    }\n  }];\n}"
      },
      "id": "scan-folder-001",
      "name": "2. \ud3f4\ub354 \uc2a4\uce94",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1744,
        -752
      ],
      "notes": "\ud83d\udcc2 Downloads \ud3f4\ub354\uc758 \ubaa8\ub4e0 \ud30c\uc77c \ubaa9\ub85d \uac00\uc838\uc624\uae30"
    },
    {
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// 3. \ud30c\uc77c \uc815\ubcf4 \ucd94\ucd9c\nconst item = $input.item.json;\n\nconst filename = item.filename || '';\nconst fullPath = item.fullPath || '';\n\n// \ud655\uc7a5\uc790 \ucd94\ucd9c\nconst lastDot = filename.lastIndexOf('.');\nconst extension = lastDot > 0 ? filename.substring(lastDot + 1).toLowerCase() : '';\nconst nameWithoutExt = lastDot > 0 ? filename.substring(0, lastDot) : filename;\n\n// \ud30c\uc77c \ud0c0\uc785 \ubd84\ub958\nconst typeMap = {\n  // \ubb38\uc11c\n  'pdf': '\ubb38\uc11c', 'doc': '\ubb38\uc11c', 'docx': '\ubb38\uc11c', 'txt': '\ubb38\uc11c',\n  'hwp': '\ubb38\uc11c', 'xls': '\ubb38\uc11c', 'xlsx': '\ubb38\uc11c', 'ppt': '\ubb38\uc11c',\n  'pptx': '\ubb38\uc11c', 'csv': '\ubb38\uc11c',\n  // \uc774\ubbf8\uc9c0\n  'jpg': '\uc774\ubbf8\uc9c0', 'jpeg': '\uc774\ubbf8\uc9c0', 'png': '\uc774\ubbf8\uc9c0', 'gif': '\uc774\ubbf8\uc9c0',\n  'bmp': '\uc774\ubbf8\uc9c0', 'webp': '\uc774\ubbf8\uc9c0', 'svg': '\uc774\ubbf8\uc9c0', 'heic': '\uc774\ubbf8\uc9c0',\n  // \ube44\ub514\uc624\n  'mp4': '\ube44\ub514\uc624', 'mov': '\ube44\ub514\uc624', 'avi': '\ube44\ub514\uc624', 'mkv': '\ube44\ub514\uc624',\n  // \uc624\ub514\uc624\n  'mp3': '\uc624\ub514\uc624', 'wav': '\uc624\ub514\uc624', 'flac': '\uc624\ub514\uc624', 'm4a': '\uc624\ub514\uc624',\n  // \uc555\ucd95\n  'zip': '\uc555\ucd95\ud30c\uc77c', 'rar': '\uc555\ucd95\ud30c\uc77c', '7z': '\uc555\ucd95\ud30c\uc77c', 'tar': '\uc555\ucd95\ud30c\uc77c',\n  // \ucf54\ub4dc\n  'js': '\ucf54\ub4dc', 'py': '\ucf54\ub4dc', 'java': '\ucf54\ub4dc', 'html': '\ucf54\ub4dc',\n  'css': '\ucf54\ub4dc', 'json': '\ucf54\ub4dc'\n};\n\nconst fileType = typeMap[extension] || '\uae30\ud0c0';\n\nconst now = new Date();\nconst today = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;\n\nreturn {\n  json: {\n    originalPath: fullPath,\n    filename: filename,\n    nameWithoutExt: nameWithoutExt,\n    extension: extension,\n    fileType: fileType,\n    fileSize: item.size,\n    today: today,\n    processedAt: now.toISOString()\n  }\n};"
      },
      "id": "extract-info-001",
      "name": "3. \ud30c\uc77c \uc815\ubcf4 \ucd94\ucd9c",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1984,
        -752
      ],
      "notes": "\ud83d\udd0d \uac01 \ud30c\uc77c\uc758 \uc774\ub984, \ud655\uc7a5\uc790, \ud0c0\uc785 \ubd84\uc11d"
    },
    {
      "parameters": {
        "jsCode": "// 4. \uae30\uc874 \ud3f4\ub354 \ubaa9\ub85d \uc870\ud68c\nconst fs = require('fs');\nconst path = require('path');\n\n// \u26a0\ufe0f Docker \ud658\uacbd: '/data/test/Documents'\n// \u26a0\ufe0f Windows \uc9c1\uc811: 'C:\\\\Users\\\\YOUR_NAME\\\\Desktop\\\\test\\\\Documents'\nconst documentsPath = '/data/test/Documents';\n\ntry {\n  // Documents \ud3f4\ub354\uac00 \uc5c6\uc73c\uba74 \uc0dd\uc131\n  if (!fs.existsSync(documentsPath)) {\n    fs.mkdirSync(documentsPath, { recursive: true });\n  }\n  \n  // \ud558\uc704 \ud3f4\ub354 \ubaa9\ub85d \uac00\uc838\uc624\uae30\n  const items = fs.readdirSync(documentsPath);\n  const folders = items.filter(item => {\n    const fullPath = path.join(documentsPath, item);\n    return fs.statSync(fullPath).isDirectory();\n  });\n  \n  const existingFolders = folders.length > 0 ? folders : ['\ud3f4\ub354\uc5c6\uc74c'];\n  const existingFoldersStr = existingFolders.join(', ');\n  \n  // \ubaa8\ub4e0 \uc785\ub825 \uc544\uc774\ud15c\uc5d0 \ud3f4\ub354 \uc815\ubcf4 \ucd94\uac00\n  return $input.all().map(item => ({\n    json: {\n      ...item.json,\n      existingFolders: existingFolders,\n      existingFoldersStr: existingFoldersStr\n    }\n  }));\n  \n} catch (error) {\n  console.error('\ud3f4\ub354 \uc870\ud68c \uc5d0\ub7ec:', error);\n  return $input.all().map(item => ({\n    json: {\n      ...item.json,\n      existingFolders: [],\n      existingFoldersStr: '\uc870\ud68c \uc2e4\ud328',\n      folderError: error.message\n    }\n  }));\n}"
      },
      "id": "get-folders-001",
      "name": "4. \uae30\uc874 \ud3f4\ub354 \ubaa9\ub85d \uc870\ud68c",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        2224,
        -752
      ],
      "notes": "\ud83d\udcca Documents \ud3f4\ub354\uc758 \ud558\uc704 \ud3f4\ub354 \ubaa9\ub85d"
    },
    {
      "parameters": {
        "modelId": {
          "__rl": true,
          "value": "gpt-4o-mini",
          "mode": "list",
          "cachedResultName": "GPT-4O-MINI"
        },
        "messages": {
          "values": [
            {
              "content": "\ub2f9\uc2e0\uc740 \ud30c\uc77c \uc815\ub9ac \uc804\ubb38\uac00\uc785\ub2c8\ub2e4. \ud30c\uc77c\uba85\uacfc \ud655\uc7a5\uc790\ub97c \ubd84\uc11d\ud558\uc5ec \ucd5c\uc801\uc758 \uc800\uc7a5 \uc704\uce58\ub97c \uacb0\uc815\ud569\ub2c8\ub2e4.\n\n**\uc911\uc694: \ubc18\ub4dc\uc2dc \uc544\ub798 \ud615\uc2dd\uc758 \uc21c\uc218 JSON\ub9cc \ubc18\ud658\ud574.**\n**\uc808\ub300 ```json \uac19\uc740 \ucf54\ub4dc \ube14\ub85d\uc774\ub098 \uc124\uba85 \ubb38\uc7a5\uc744 \ubd99\uc774\uc9c0 \ub9c8.**\n\n## \ubd84\ub958 \uaddc\uce59\n\n### 1. \uae30\uc874 \ud3f4\ub354 \uc6b0\uc120 \uc0ac\uc6a9\n- \uae30\uc874 \ud3f4\ub354 \uc911 \uc801\ud569\ud55c \uacf3\uc774 \uc788\uc73c\uba74 \uadf8\uacf3\uc73c\ub85c \ubd84\ub958\n- \uae30\uc874 \ud3f4\ub354\uc640 \uc720\uc0ac\ud55c \uce74\ud14c\uace0\ub9ac\uba74 \uae30\uc874 \ud3f4\ub354 \uc0ac\uc6a9\n\n### 2. \uc0c8 \ud3f4\ub354 \uc81c\uc548 \uc870\uac74\n- \uae30\uc874 \ud3f4\ub354 \uc911 \uc801\ud569\ud55c \uacf3\uc774 \uc804\ud600 \uc5c6\uc744 \ub54c\ub9cc \uc0c8 \ud3f4\ub354 \uc81c\uc548\n- \uc0c8 \ud3f4\ub354\uba85\uc740 \ud55c\uad6d\uc5b4\ub85c, \uac04\uacb0\ud558\uac8c (\uc608: \uc601\uc218\uc99d, \uacc4\uc57d\uc11c, \ud504\ub85c\uc81d\ud2b8)\n\n### 3. \ud30c\uc77c\uba85 \ud0a4\uc6cc\ub4dc \uc778\uc2dd\n- invoice, receipt, \uc601\uc218\uc99d \u2192 \uc7ac\ubb34/\uc601\uc218\uc99d\n- contract, \uacc4\uc57d \u2192 \uacc4\uc57d\uc11c\n- resume, \uc774\ub825\uc11c \u2192 \ucde8\uc5c5\n- screenshot, \uc2a4\ud06c\ub9b0\uc0f7 \u2192 \uc2a4\ud06c\ub9b0\uc0f7\n- IMG_, DSC_, photo \u2192 \uc0ac\uc9c4\n\n## JSON \ud615\uc2dd\n\n{\n  \"category\": \"\ub300\ubd84\ub958\",\n  \"subcategory\": \"\uc18c\ubd84\ub958 (\uc5c6\uc73c\uba74 \ube48 \ubb38\uc790\uc5f4)\",\n  \"target_folder\": \"\ucd5c\uc885 \ud3f4\ub354 \uacbd\ub85c (\uc608: \ubb38\uc11c/\uc601\uc218\uc99d)\",\n  \"create_new_folder\": true \ub610\ub294 false,\n  \"confidence\": 0.0 ~ 1.0 \uc0ac\uc774 \uc22b\uc790,\n  \"reasoning\": \"\ud310\ub2e8 \uadfc\uac70 \ud55c \uc904 \uc124\uba85\"\n}",
              "role": "system"
            },
            {
              "content": "=\uc624\ub298 \ub0a0\uc9dc: {{ $json.today }}\n\n\ud30c\uc77c \uc815\ubcf4:\n- \ud30c\uc77c\uba85: {{ $json.filename }}\n- \ud655\uc7a5\uc790: {{ $json.extension }}\n- \uae30\ubcf8 \ud0c0\uc785: {{ $json.fileType }}\n\n\ud604\uc7ac \uc874\uc7ac\ud558\ub294 \ud558\uc704 \ud3f4\ub354:\n{{ $json.existingFoldersStr }}\n\n\uc774 \ud30c\uc77c\uc744 \uc5b4\ub514\ub85c \uc774\ub3d9\ud574\uc57c \ud560\uae4c\uc694?"
            }
          ]
        },
        "options": {
          "temperature": 0.3
        }
      },
      "id": "openai-analysis-001",
      "name": "5. OpenAI \ud30c\uc77c \ubd84\uc11d",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 1.5,
      "position": [
        2416,
        -752
      ],
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "notes": "\ud83e\udd16 AI\uac00 \ud30c\uc77c\uba85 + \ud655\uc7a5\uc790 + \uae30\uc874 \ud3f4\ub354 \ubd84\uc11d\n\n\u26a0\ufe0f OpenAI API Key \ud544\uc694"
    },
    {
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// 6. JSON \ud30c\uc2f1 \ubc0f \ud1b5\ud569\nconst fileInfo = $node['3. \ud30c\uc77c \uc815\ubcf4 \ucd94\ucd9c'].json;\n\nconst response = $json.message?.content ?? ($json.choices?.[0]?.message?.content ?? '');\n\nif (!response) {\n  return {\n    json: {\n      ...fileInfo,\n      category: '\ubd84\ub958 \uc2e4\ud328',\n      target_folder: '\uae30\ud0c0',\n      create_new_folder: false,\n      confidence: 0,\n      reasoning: 'OpenAI \uc751\ub2f5 \uc5c6\uc74c'\n    }\n  };\n}\n\ntry {\n  let jsonStr = response;\n  if (jsonStr.includes('```json')) {\n    jsonStr = jsonStr.split('```json')[1].split('```')[0];\n  } else if (jsonStr.includes('```')) {\n    jsonStr = jsonStr.split('```')[1].split('```')[0];\n  }\n  \n  const analysis = JSON.parse(jsonStr.trim());\n  \n  return {\n    json: {\n      ...fileInfo,\n      category: analysis.category || '\uae30\ud0c0',\n      subcategory: analysis.subcategory || '',\n      target_folder: analysis.target_folder || '\uae30\ud0c0',\n      create_new_folder: analysis.create_new_folder || false,\n      confidence: analysis.confidence || 0.5,\n      reasoning: analysis.reasoning || '\ubd84\uc11d \uc644\ub8cc'\n    }\n  };\n} catch (error) {\n  return {\n    json: {\n      ...fileInfo,\n      category: '\ubd84\ub958 \uc2e4\ud328',\n      target_folder: '\uae30\ud0c0',\n      create_new_folder: false,\n      confidence: 0,\n      reasoning: '\ud30c\uc2f1 \uc624\ub958: ' + error.message\n    }\n  };\n}"
      },
      "id": "json-parse-001",
      "name": "6. JSON \ud30c\uc2f1 \ubc0f \ud1b5\ud569",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        2752,
        -752
      ],
      "notes": "\ud83d\udccb OpenAI \uc751\ub2f5\uc744 \uad6c\uc870\ud654\ub41c \ub370\uc774\ud130\ub85c \ubcc0\ud658"
    },
    {
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// 7. \ud30c\uc77c \uc774\ub3d9 (fs \ubaa8\ub4c8 \uc0ac\uc6a9)\nconst fs = require('fs');\nconst path = require('path');\n\nconst item = $input.item.json;\n\nconst sourcePath = item.originalPath;\n// \u26a0\ufe0f Docker \ud658\uacbd: '/data/test/Documents'\n// \u26a0\ufe0f Windows \uc9c1\uc811: 'C:\\\\Users\\\\YOUR_NAME\\\\Desktop\\\\test\\\\Documents'\nconst baseDir = '/data/test/Documents';\nconst targetFolder = item.target_folder || '\uae30\ud0c0';\nconst targetDir = path.join(baseDir, targetFolder);\nconst targetPath = path.join(targetDir, item.filename);\n\ntry {\n  // 1. \ud3f4\ub354 \uc5c6\uc73c\uba74 \uc0dd\uc131\n  if (!fs.existsSync(targetDir)) {\n    fs.mkdirSync(targetDir, { recursive: true });\n    console.log(`\ud3f4\ub354 \uc0dd\uc131: ${targetDir}`);\n  }\n  \n  // 2. \uc6d0\ubcf8 \ud30c\uc77c \uc874\uc7ac \ud655\uc778\n  if (!fs.existsSync(sourcePath)) {\n    throw new Error(`\uc6d0\ubcf8 \ud30c\uc77c \uc5c6\uc74c: ${sourcePath}`);\n  }\n  \n  // 3. \ubaa9\uc801\uc9c0\uc5d0 \uac19\uc740 \uc774\ub984 \ud30c\uc77c \uc788\uc73c\uba74 \ub36e\uc5b4\uc4f0\uae30\n  if (fs.existsSync(targetPath)) {\n    console.log(`\uae30\uc874 \ud30c\uc77c \ub36e\uc5b4\uc4f0\uae30: ${targetPath}`);\n  }\n  \n  // 4. \ud30c\uc77c \ubcf5\uc0ac\n  fs.copyFileSync(sourcePath, targetPath);\n  console.log(`\ud30c\uc77c \ubcf5\uc0ac \uc644\ub8cc: ${sourcePath} \u2192 ${targetPath}`);\n  \n  // 5. \uc6d0\ubcf8 \ud30c\uc77c \uc0ad\uc81c\n  fs.unlinkSync(sourcePath);\n  console.log(`\uc6d0\ubcf8 \ud30c\uc77c \uc0ad\uc81c: ${sourcePath}`);\n  \n  return {\n    json: {\n      ...item,\n      moved: true,\n      newPath: targetPath,\n      folderCreated: !fs.existsSync(targetDir),\n      action: '\uc774\ub3d9 \uc644\ub8cc'\n    }\n  };\n  \n} catch (error) {\n  console.error('\ud30c\uc77c \uc774\ub3d9 \uc5d0\ub7ec:', error);\n  return {\n    json: {\n      ...item,\n      moved: false,\n      error: error.message,\n      sourcePath: sourcePath,\n      targetPath: targetPath,\n      action: '\uc774\ub3d9 \uc2e4\ud328'\n    }\n  };\n}"
      },
      "id": "move-file-001",
      "name": "7. \ud30c\uc77c \uc774\ub3d9",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        3008,
        -752
      ],
      "notes": "\ud83d\ude9a AI\uac00 \uacb0\uc815\ud55c \uc704\uce58\ub85c \ud30c\uc77c \uc774\ub3d9"
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "YOUR_GOOGLE_SHEETS_ID",
          "mode": "list",
          "cachedResultName": "\ud30c\uc77c \uc815\ub9ac \ub85c\uadf8"
        },
        "sheetName": {
          "__rl": true,
          "value": "file-log",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "timestamp": "={{ $json.processedAt }}",
            "original_path": "={{ $json.originalPath }}",
            "filename": "={{ $json.filename }}",
            "extension": "={{ $json.extension }}",
            "file_type": "={{ $json.fileType }}",
            "category": "={{ $json.category }}",
            "target_folder": "={{ $json.target_folder }}",
            "confidence": "={{ $json.confidence }}",
            "new_folder_created": "={{ $json.create_new_folder }}",
            "reasoning": "={{ $json.reasoning }}",
            "moved": "={{ $json.moved }}",
            "action": "={{ $json.action }}"
          }
        },
        "options": {}
      },
      "id": "sheets-log-001",
      "name": "8. Google Sheets \ub85c\uadf8",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        3248,
        -752
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "notes": "\ud83d\udcdd \ubaa8\ub4e0 \ud30c\uc77c \uc774\ub3d9 \uae30\ub85d\uc744 Google Sheets\uc5d0 \uc800\uc7a5\n\n\u26a0\ufe0f Google Sheets API \uc778\uc99d \ud544\uc694"
    },
    {
      "parameters": {
        "content": "## \ud83d\uddc2\ufe0f AI \uae30\ubc18 \ud30c\uc77c \uc790\ub3d9 \uc815\ub9ac \uc2dc\uc2a4\ud15c\n\n**\uc791\ub3d9 \ubc29\uc2dd:**\n1. \u23f0 Schedule Trigger \u2192 \ub9e4 5\ubd84\ub9c8\ub2e4 \uc790\ub3d9 \uc2e4\ud589\n2. \ud83d\udcc2 \ud3f4\ub354 \uc2a4\uce94 \u2192 Downloads \ud3f4\ub354\uc758 \ubaa8\ub4e0 \ud30c\uc77c \ubaa9\ub85d\n3. \ud83d\udd0d \ud30c\uc77c \uc815\ubcf4 \ucd94\ucd9c \u2192 \ud655\uc7a5\uc790, \ud0c0\uc785 \ubd84\uc11d\n4. \ud83d\udcca \uae30\uc874 \ud3f4\ub354 \uc870\ud68c \u2192 AI \ud559\uc2b5\uc6a9 \ub370\uc774\ud130\n5. \ud83e\udd16 OpenAI \ubd84\uc11d \u2192 \ucd5c\uc801 \uc704\uce58 \uacb0\uc815\n6. \ud83d\udccb JSON \ud30c\uc2f1 \u2192 \ub370\uc774\ud130 \ud1b5\ud569\n7. \ud83d\ude9a \ud30c\uc77c \uc774\ub3d9 \u2192 \uc2e4\uc81c \uc774\ub3d9 \uc218\ud589\n8. \ud83d\udcdd Google Sheets \ub85c\uadf8 \u2192 \uae30\ub85d\n\n**\u26a0\ufe0f \uc124\uc815 \ud544\uc694:**\n- OpenAI API Key\n- Google Sheets OAuth2\n- \uacbd\ub85c \uc124\uc815 (\ub178\ub4dc 2, 4, 7)\n\n**\ud83d\udcd6 \uc0c1\uc138 \uac00\uc774\ub4dc:**\nREADME.md \ucc38\uace0",
        "height": 450,
        "width": 400,
        "color": 4
      },
      "id": "note-overview-001",
      "name": "\ud83d\udcd6 \uc6cc\ud06c\ud50c\ub85c\uc6b0 \uac00\uc774\ub4dc",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        1392,
        -1200
      ]
    },
    {
      "parameters": {
        "content": "# \ud83d\ude80 Trigger",
        "height": 288,
        "width": 288,
        "color": 5
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1392,
        -896
      ],
      "typeVersion": 1,
      "id": "sticky-trigger",
      "name": "Trigger Zone"
    },
    {
      "parameters": {
        "content": "# \ud83c\udfaf Processing",
        "height": 288,
        "width": 960,
        "color": 2
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1712,
        -896
      ],
      "typeVersion": 1,
      "id": "sticky-processing",
      "name": "Processing Zone"
    },
    {
      "parameters": {
        "content": "# \ud83d\udce5 Output",
        "height": 288,
        "width": 480,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2944,
        -896
      ],
      "typeVersion": 1,
      "id": "sticky-output",
      "name": "Output Zone"
    }
  ],
  "connections": {
    "1. \ub9e4 5\ubd84\ub9c8\ub2e4 \uc2e4\ud589": {
      "main": [
        [
          {
            "node": "2. \ud3f4\ub354 \uc2a4\uce94",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2. \ud3f4\ub354 \uc2a4\uce94": {
      "main": [
        [
          {
            "node": "3. \ud30c\uc77c \uc815\ubcf4 \ucd94\ucd9c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3. \ud30c\uc77c \uc815\ubcf4 \ucd94\ucd9c": {
      "main": [
        [
          {
            "node": "4. \uae30\uc874 \ud3f4\ub354 \ubaa9\ub85d \uc870\ud68c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4. \uae30\uc874 \ud3f4\ub354 \ubaa9\ub85d \uc870\ud68c": {
      "main": [
        [
          {
            "node": "5. OpenAI \ud30c\uc77c \ubd84\uc11d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5. OpenAI \ud30c\uc77c \ubd84\uc11d": {
      "main": [
        [
          {
            "node": "6. JSON \ud30c\uc2f1 \ubc0f \ud1b5\ud569",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6. JSON \ud30c\uc2f1 \ubc0f \ud1b5\ud569": {
      "main": [
        [
          {
            "node": "7. \ud30c\uc77c \uc774\ub3d9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7. \ud30c\uc77c \uc774\ub3d9": {
      "main": [
        [
          {
            "node": "8. Google Sheets \ub85c\uadf8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "github-release-v1.0",
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": [
    "file-management",
    "ai-automation",
    "openai",
    "file-organizer"
  ]
}