{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "8884df86-b7cd-4cf7-8b71-fd21113bfc0f",
      "name": "Client Usage Log",
      "type": "n8n-nodes-base.googleSheetsTool",
      "position": [
        420,
        500
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [
            {
              "id": "date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "workflow_id",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "workflow_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "execution_id",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "execution_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "client_id",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "client_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "client_name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "client_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "input_tokens",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "input_tokens",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "output_tokens",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "output_tokens",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "total_tokens",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "total_tokens",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "input_cost",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "input_cost",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "output_cost",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "output_cost",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "total_cost",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "total_cost",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1AR5mrxz2S6PjAKVM0edNG-YVEc6zKL7aUxHxVcffnlw/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1AR5mrxz2S6PjAKVM0edNG-YVEc6zKL7aUxHxVcffnlw",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1AR5mrxz2S6PjAKVM0edNG-YVEc6zKL7aUxHxVcffnlw/edit?usp=drivesdk",
          "cachedResultName": "89. Langchain Code Node - Client Usage Log"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "1e4aca76-8b79-4780-b0c5-2cd92a41aa0e",
      "name": "Logging Attributes",
      "type": "n8n-nodes-base.set",
      "position": [
        -360,
        -120
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "22164635-7a23-47e2-9868-96899cd9d317",
              "name": "workflow_id",
              "type": "string",
              "value": "={{ $workflow.id }}"
            },
            {
              "id": "ed1cb653-b3fd-40bf-b00b-10d777f098af",
              "name": "execution_id",
              "type": "string",
              "value": "={{ $execution.id }}"
            },
            {
              "id": "3de228a1-79b9-4805-8d92-917f691411be",
              "name": "client_id",
              "type": "string",
              "value": "=12345"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "d7f37c54-5d96-47ba-b82e-0926a08137df",
      "name": "On form submission",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -920,
        -120
      ],
      "parameters": {
        "options": {},
        "formTitle": "CV Parsing Service",
        "formFields": {
          "values": [
            {
              "fieldType": "file",
              "fieldLabel": "Upload a file",
              "requiredField": true,
              "acceptFileTypes": ".pdf"
            },
            {
              "fieldType": "dropdown",
              "fieldLabel": "Acknowledgement",
              "multiselect": true,
              "fieldOptions": {
                "values": [
                  {
                    "option": "I acknowledge the use of this service will be added to my bill."
                  }
                ]
              },
              "requiredField": true
            }
          ]
        },
        "responseMode": "lastNode",
        "formDescription": "Use this form to upload CVs and we'll extract the data from them. This workflow tracks usage metrics so we can calculate the bill later on."
      },
      "typeVersion": 2.2
    },
    {
      "id": "06da0c8e-2035-45ae-a301-50021650a5f8",
      "name": "Custom LLM Subnode",
      "type": "@n8n/n8n-nodes-langchain.code",
      "position": [
        260,
        340
      ],
      "parameters": {
        "code": {
          "supplyData": {
            "code": "const { ChatOpenAI } = require(\"@langchain/openai\");\n\n// 1. Configure as required.\n// - costs are per million tokens and depends on the model.\nconst openAIApiKey = \"sk-...\";\nconst model = \"gpt-4o-mini\";\nconst input_token_cost = 0.150;\nconst output_token_cost = 0.600;\n\n// 2. do not edit below this line --\nconst tools = await this.getInputConnectionData('ai_tool', 0);\nconst googleSheetTool = tools[0];\n\nconst {\n  workflow_id,\n  execution_id,\n  client_id } = $input.first().json;\n\nconst llm = new ChatOpenAI({\n  apiKey: openAIApiKey,\n  model,\n  callbacks: [\n    {\n      handleLLMEnd: async function(output,runId,parentId) {\n        const generation = output.generations[0][0];\n        const message = generation.message;\n        const row = {\n          date: (new Date()).toGMTString(),\n          workflow_id,\n          execution_id,\n          client_id,\n          input_tokens: message.usage_metadata.input_tokens,\n          output_tokens: message.usage_metadata.output_tokens,\n          total_tokens: message.usage_metadata.total_tokens,\n          input_cost: (message.usage_metadata.input_tokens / 1_000_000) * input_token_cost,\n          output_cost: (message.usage_metadata.output_tokens / 1_000_000) * output_token_cost,\n        };\n        row.total_cost = row.input_cost + row.output_cost;\n        await googleSheetTool.func(row);\n      }\n    }\n  ]\n});\n\nreturn llm;"
          }
        },
        "inputs": {
          "input": [
            {
              "type": "ai_tool",
              "required": true
            }
          ]
        },
        "outputs": {
          "output": [
            {
              "type": "ai_languageModel"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "35993bd5-b521-4239-bf23-aed47d339f54",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        360,
        480
      ],
      "parameters": {
        "width": 200,
        "height": 280,
        "content": "\uc5c5\ub370\uc774\ud2b8 \uc6cc\ud06c\ubd81  \n\uc774\uac83\uc740 \ud1a0\ud070 \uc0ac\uc6a9\ub7c9\uacfc \ube44\uc6a9\uc744 \ucd94\uc801\ud560 \uc6cc\ud06c\ubd81\uc785\ub2c8\ub2e4."
      },
      "typeVersion": 1
    },
    {
      "id": "623ca94d-a215-416b-a9fe-62a1f96317e3",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1040,
        -280
      ],
      "parameters": {
        "color": 7,
        "width": 560,
        "height": 380,
        "content": "## 1. AI \uc11c\ube44\uc2a4\ub97c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uac8c \uc81c\uacf5\n\uc5ec\uae30\uc11c, \uc6b0\ub9ac\ub294 n8n \ud3fc\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc774\ub825\uc11c/CV PDF\uc758 \ubb38\uc11c \ucd94\ucd9c \uc11c\ube44\uc2a4\ub97c \uc81c\uacf5\ud560 \uac83\uc785\ub2c8\ub2e4. \uc0ac\uc6a9\uc790\uac00 \uac04\ub2e8\ud788 PDF\ub97c \uc5c5\ub85c\ub4dc\ud558\uba74 \uc6b0\ub9ac\ub294 \uadf8\uac83\uc744 JSON \ud615\uc2dd\uc73c\ub85c \ubc18\ud658\ud569\ub2c8\ub2e4. \uc774\uac83\uc740 \ub2e8\uc9c0 \uc2dc\uc5f0 \ubaa9\uc801\uc73c\ub85c \uac04\ub2e8\ud55c \uc608\uc81c\uc77c \ubfd0\uc785\ub2c8\ub2e4."
      },
      "typeVersion": 1
    },
    {
      "id": "ba9eb149-e77f-4bf6-8ec5-7d8d4619485d",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -460,
        -280
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 380,
        "content": "## 2. \ub85c\uadf8\uc5d0 \ubcf4\ub0bc \uc678\ubd80 \ubcc0\uc218 \uc218\uc9d1\n\uc11c\ube0c\ub178\ub4dc\uc5d0\uc11c \uc815\uc758\ud560 \uc218 \uc5c6\ub294 \uc77c\ubd80 \ubcc0\uc218\uac00 \uc788\uc9c0\ub9cc, \uc5ec\uae30\uc5d0 \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."
      },
      "typeVersion": 1
    },
    {
      "id": "63bfe329-17dd-4321-94c6-17d306ed7412",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -120,
        -280
      ],
      "parameters": {
        "color": 7,
        "width": 720,
        "height": 380,
        "content": "## 3. AI \uc11c\ube44\uc2a4 \uc81c\uacf5\n\uc6b0\ub9ac \uc11c\ube44\uc2a4\ub294 LLM(OpenAI GPT4o-mini\ub97c \uc774 \uc608\uc2dc\uc5d0\uc11c \uc0ac\uc6a9)\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc5c5\ub85c\ub4dc\ub41c PDF\uc758 \ub370\uc774\ud130\ub97c \uad6c\uc870\ud654\ub41c JSON \ud615\uc2dd\uc73c\ub85c \uc870\uc9c1\ud654\ud569\ub2c8\ub2e4. \uc774 \ubcc0\ud658\uc740 \ud6c4\uc18d \ud1b5\ud569\uc774\ub098 \ub370\uc774\ud130 \uc800\uc7a5\uc5d0 \uc720\uc6a9\ud569\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc774 \uc608\uc2dc\uc5d0\uc11c, \uc6b0\ub9ac\ub294 \uadf8\uac83\uc744 \uc0ac\uc6a9\uc790\uc5d0\uac8c \ub2e4\uc2dc \ud45c\uc2dc\ud558\ub294 \ub370 \uc0ac\uc6a9\ud560 \uac83\uc785\ub2c8\ub2e4."
      },
      "typeVersion": 1
    },
    {
      "id": "f45862e9-7f8e-46bb-900a-807fee981ed5",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -120,
        120
      ],
      "parameters": {
        "color": 7,
        "width": 720,
        "height": 440,
        "content": "## 4. \uc0ac\uc6a9\uc790 \uc815\uc758 LLM \uc11c\ube0c\ub178\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc0ac\uc6a9\ub7c9 \ubc0f \ube44\uc6a9 \ucd94\uc801\n\n[Langchain Code Node\uc5d0 \ub300\ud574 \uc790\uc138\ud788 \uc54c\uc544\ubcf4\uae30](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.code/)\n\nLangchain Code \ub178\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790 \uc815\uc758 LLM \uc11c\ube0c\ub178\ub4dc\ub97c \uc0dd\uc131\ud558\uba74, \uc815\ubcf4 \ucd94\ucd9c\uae30 \uc694\uccad\uc5d0 \ub300\ud55c \ud1a0\ud070 \uc0ac\uc6a9\ub7c9 \uba54\ud0c0\ub370\uc774\ud130\ub97c \ud3ec\ud568\ud558\ub294 \ucc44\ud305 \uc644\ub8cc \uc751\ub2f5\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\uc774\ub97c \ud1b5\ud574 \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc694\uccad\uc774 \uc0ac\uc6a9\ub2f9 \uc815\ud655\ud788 \uc5bc\ub9c8\ub098 \ube44\uc6a9\uc774 \ub4dc\ub294\uc9c0 \uacc4\uc0b0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4!\n\n\uadf8\ub7f0 \ub2e4\uc74c \uc720\uc77c\ud558\uac8c \ub0a8\uc740 \ub2e8\uacc4\ub294 \uc774 \ub370\uc774\ud130\ub97c \uc5b4\ub518\uac00\uc5d0 \uc800\uc7a5\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \ub354 \ub9ce\uc740 \uc885\uc18d\uc131\uc744 \uac00\uc838\uc624\uac70\ub098 \uc790\uaca9 \uc99d\uba85\uc744 \ud558\ub4dc\ucf54\ub529\ud558\ub294 \ub300\uc2e0, \uc11c\ube0c\ub178\ub4dc\uc5d0 \ub3c4\uad6c\ub97c \ucca8\ubd80\ud558\ub294 \ub3c5\ucc3d\uc801\uc778 \uc194\ub8e8\uc158\uc774 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\uc5ec\uae30\uc11c, \uc6b0\ub9ac\ub294 Google Sheets \ub3c4\uad6c\ub97c \uc0ac\uc6a9\ud558\uae30\ub85c \uacb0\uc815\ud558\uace0, \uc2dc\ud2b8\uc5d0 \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc0ac\uc6a9\ub7c9 \uba54\ud2b8\ub9ad\uc2a4\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \uc5ec\uae30\uc5d0\uc11c \ud655\uc778\ud558\uc138\uc694 - [Client Usage Log](https://docs.google.com/spreadsheets/d/1AR5mrxz2S6PjAKVM0edNG-YVEc6zKL7aUxHxVcffnlw/edit?usp=sharing)"
      },
      "typeVersion": 1
    },
    {
      "id": "9f5014a5-0e9a-4af0-b076-03cdc0a14ab9",
      "name": "Display JSON Document",
      "type": "n8n-nodes-base.form",
      "position": [
        360,
        -120
      ],
      "parameters": {
        "options": {
          "customCss": ".header p {\n  font-family: monospace;\n  background-color: #efefef;\n  padding: 1rem;\n  font-size: 0.8rem;\n  text-align: left;\n  max-height: 480px;\n  overflow: auto;\n  white-space: pre;\n}"
        },
        "operation": "completion",
        "completionTitle": "=Results for {{ $('On form submission').item.json['Upload a file'][0].filename }}",
        "completionMessage": "={{ JSON.stringify($json.output, null, 2) }}"
      },
      "typeVersion": 1
    },
    {
      "id": "b977f89c-1118-455f-986e-735a17eecd9b",
      "name": "Filter Last Month",
      "type": "n8n-nodes-base.filter",
      "position": [
        1120,
        -120
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "2a86f83e-b103-46fe-a8b8-15811d4138fa",
              "operator": {
                "type": "dateTime",
                "operation": "afterOrEquals"
              },
              "leftValue": "={{new Date($json.date) }}",
              "rightValue": "={{ $now.startOf('month') }}"
            },
            {
              "id": "7b4c03a3-4df9-4b5d-9f1f-660e54a1c2d1",
              "operator": {
                "type": "dateTime",
                "operation": "beforeOrEquals"
              },
              "leftValue": "={{new Date($json.date) }}",
              "rightValue": "={{ $now.endOf('month') }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "10d95dcb-d975-4b20-961e-d1fe63417878",
      "name": "Get Client Logs",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        920,
        -120
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "12345",
              "lookupColumn": "client_id"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1AR5mrxz2S6PjAKVM0edNG-YVEc6zKL7aUxHxVcffnlw/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1AR5mrxz2S6PjAKVM0edNG-YVEc6zKL7aUxHxVcffnlw",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1AR5mrxz2S6PjAKVM0edNG-YVEc6zKL7aUxHxVcffnlw/edit?usp=drivesdk",
          "cachedResultName": "89. Langchain Code Node - Client Usage Log"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "f6505545-d57c-443a-9883-2d536f3a973a",
      "name": "Calculate Totals",
      "type": "n8n-nodes-base.summarize",
      "position": [
        1320,
        -120
      ],
      "parameters": {
        "options": {},
        "fieldsToSummarize": {
          "values": [
            {
              "field": "total_cost",
              "aggregation": "sum"
            },
            {
              "field": "total_tokens",
              "aggregation": "sum"
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "1c4ae8ff-ec2b-4fd3-974f-cc766385b16b",
      "name": "Every End of Month",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        720,
        -120
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "months",
              "triggerAtHour": 18,
              "triggerAtDayOfMonth": 31
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "f321fbe6-36b1-4bd8-899b-832a8fc6217a",
      "name": "Send Invoice",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1520,
        -120
      ],
      "parameters": {
        "sendTo": "jim@example.com",
        "message": "=Hello,\nThis is an invoice for {{ $now.monthLong }} {{ $now.year }}.\n\nTotal usage: {{ $json.sum_total_tokens }} tokens\nTotal token cost: ${{ $json.sum_total_cost.toFixed(5) }}\nTax @ 20%: ${{ ($json.sum_total_cost * 0.2).toFixed(5) }}\nTotal payable: ${{ ($json.sum_total_cost * 1.2).toFixed(5) }}\n\nPayable within 14 days.\nThank you for your custom.",
        "options": {},
        "subject": "=Invoice for {{ $now.monthLong }} {{ $now.year }}",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "a7d8de78-c3b7-4687-8994-fe28387d7572",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        620,
        -280
      ],
      "parameters": {
        "color": 7,
        "width": 1100,
        "height": 380,
        "content": "## 5. \uc6d4\ub9d0\uc5d0 \uc790\ub3d9\uc73c\ub85c \uc1a1\uc7a5 \ubcf4\ub0b4\uae30 (\uc120\ud0dd\uc0ac\ud56d)\n\uc6b0\ub9ac\uc758 \ud074\ub77c\uc774\uc5b8\ud2b8 \uc0ac\uc6a9 \ub85c\uadf8\ub97c \uc0ac\uc6a9\ud558\uba74, \ud2b9\uc815 \uae30\uac04 \ub0b4\uc5d0 \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \ub85c\uadf8 \uae30\ub85d\uc744 \uc9d1\uacc4\ud558\uace0 \ud569\uacc4\ub97c \uacc4\uc0b0\ud558\ub294 \uac83\uc774 \uaf64 \uac04\ub2e8\ud569\ub2c8\ub2e4.\n\uc774\uac83\uc740 \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc815\ud655\ud55c \uccad\uad6c \uc694\uad6c\uc0ac\ud56d\uc744 \ucda9\uc871\uc2dc\ud0ac \uc218 \uc788\uac70\ub098, \uc801\uc5b4\ub3c4 \uadc0\ud558\uc758 \ud300\uc774 \uac01 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ube44\uc6a9\uc774 \uc5bc\ub9c8\ub098 \ub4dc\ub294\uc9c0 \uc774\ud574\ud558\uace0 \uadf8\uc5d0 \ub530\ub77c \uc608\uc0b0\uc744 \uc870\uc815\ud560 \uc218 \uc788\uac8c \ud569\ub2c8\ub2e4."
      },
      "typeVersion": 1
    },
    {
      "id": "169fa40d-c6e8-4315-be35-d2c73f626edf",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1500,
        -920
      ],
      "parameters": {
        "width": 440,
        "height": 1020,
        "content": "## \uc9c1\uc811 \ud574\ubcf4\uc138\uc694!\n### \uc774 n8n \ud15c\ud50c\ub9bf\uc740 Langchain \ucf54\ub4dc \ub178\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubaa8\ub4e0 LLM \ud638\ucd9c\uc5d0 \ub300\ud55c \ud1a0\ud070 \uc0ac\uc6a9\ub7c9\uacfc \ube44\uc6a9\uc744 \ucd94\uc801\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.\n\n\uc774 \ud15c\ud50c\ub9bf\uc740 \uc5ec\ub7ec \ud074\ub77c\uc774\uc5b8\ud2b8\ub098 \uace0\uac1d\uc744 \ucc98\ub9ac\ud558\uace0 \uc788\uc73c\uba70, AI \ud06c\ub808\ub527 \uc0ac\uc6a9\ub7c9\uc744 \uc800\ub834\ud558\uace0 \uc27d\uac8c \ucea1\ucc98\ud560 \ud544\uc694\uac00 \uc788\uc744 \ub54c \uc720\uc6a9\ud569\ub2c8\ub2e4.\n\n### \uc791\ub3d9 \uc6d0\ub9ac\n* \uc6b0\ub9ac\uc758 \ubaa8\uc758 AI \uc11c\ube44\uc2a4\uc5d0\uc11c, \uc774\ub825\uc11c PDF\ub97c JSON \ubb38\uc11c\ub85c \ubcc0\ud658\ud558\ub294 \ub370\uc774\ud130 \ubcc0\ud658 API\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.\n* \ud3fc \ud2b8\ub9ac\uac70\ub97c \uc0ac\uc6a9\ud558\uc5ec PDF \uc5c5\ub85c\ub4dc\ub97c \ud5c8\uc6a9\ud558\uace0, \ud30c\uc77c\uc744 Extract from File \ub178\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \uad6c\ubb38 \ubd84\uc11d\ud569\ub2c8\ub2e4.\n* Edit Fields \ub178\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub85c\uadf8\uc5d0 \ubcf4\ub0bc \ucd94\uac00 \ubcc0\uc218\ub97c \ucea1\ucc98\ud569\ub2c8\ub2e4.\n* Information Extractor \ub178\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774\ub825\uc11c \ub370\uc774\ud130\ub97c \uc8fc\uc5b4\uc9c4 JSON \uc2a4\ud0a4\ub9c8\ub85c \uad6c\uc131\ud569\ub2c8\ub2e4.\n* Information Extractor\uc5d0 \uc5f0\uacb0\ub41c LLM \uc11c\ube0c\ub178\ub4dc\ub294 Langchain Code \ub178\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc81c\uc791\ud55c \ucee4\uc2a4\ud140 \ub178\ub4dc\uc785\ub2c8\ub2e4.\n* \uc6b0\ub9ac\uc758 \ucee4\uc2a4\ud140 LLM \uc11c\ube0c\ub178\ub4dc\ub97c \ud1b5\ud574 \ub77c\uc774\ud504\uc0ac\uc774\ud074 \ud6c4\ud06c\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc0ac\uc6a9\ub7c9 \uba54\ud0c0\ub370\uc774\ud130\ub97c \ucea1\ucc98\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n* LLM \uc11c\ube0c\ub178\ub4dc\uc5d0 Google Sheet \ub3c4\uad6c\ub97c \uc5f0\uacb0\ud558\uc5ec \uc0ac\uc6a9\ub7c9 \uba54\ud0c0\ub370\uc774\ud130\ub97c Google \uc2dc\ud2b8\ub85c \ubcf4\ub0bc \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n* \ub9c8\uc9c0\ub9c9\uc73c\ub85c, Google \uc2dc\ud2b8\uc5d0\uc11c \uc9d1\uacc4\ud558\uc5ec \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ucc45\uc784\uc838\uc57c \ud560 AI \ud1a0\ud070/\ube44\uc6a9\uc744 \uc774\ud574\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.\n\n**\uc608\uc2dc \ud074\ub77c\uc774\uc5b8\ud2b8 \uc0ac\uc6a9\ub7c9 \ub85c\uadf8 \ud655\uc778** - https://docs.google.com/spreadsheets/d/1AR5mrxz2S6PjAKVM0edNG-YVEc6zKL7aUxHxVcffnlw/edit?usp=sharing\n\n### \uc0ac\uc6a9 \ubc29\ubc95\n* **\uc140\ud504-\ud638\uc2a4\ud305 n8n \uc804\uc6a9** - Langchain Code \ub178\ub4dc\ub294 \uc140\ud504-\ud638\uc2a4\ud305 \ubc84\uc804\uc758 n8n\uc5d0\uc11c\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. n8n \ud074\ub77c\uc6b0\ub4dc\uc5d0\uc11c\ub294 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n* LLM \uc11c\ube0c\ub178\ub4dc\ub294 \"AI \uc5d0\uc774\uc804\ud2b8\" \ub178\ub4dc\uac00 \uc544\ub2cc \ub178\ub4dc\uc5d0\ub9cc \uc5f0\uacb0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc989, \uae30\ubcf8 LLM \ub178\ub4dc, Information Extractor, Question & Answer Chain, Sentiment Analysis, Summarization Chain \ubc0f Text Classifier\uc785\ub2c8\ub2e4.\n\n### \ub3c4\uc6c0\uc774 \ud544\uc694\ud558\uc2e0\uac00\uc694?\n[n8n Discord](https://discord.com/invite/XPKeKXeB7d) \ub610\ub294 [\ud3ec\ub7fc](https://community.n8n.io/)\uc5d0\uc11c \ubb38\uc758\ud558\uc138\uc694!"
      },
      "typeVersion": 1
    },
    {
      "id": "922710e3-f92b-4a7f-9ff2-c3d7d55f04d5",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1040,
        -420
      ],
      "parameters": {
        "color": 3,
        "width": 280,
        "height": 120,
        "content": "\uc790\uac00 \ud638\uc2a4\ud305 n8n \uc804\uc6a9  \n\uc8fc\uc9c0\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4, \uc774 \ud15c\ud50c\ub9bf\uc740 n8n\uc758 \uc790\uac00 \ud638\uc2a4\ud305 \ubc84\uc804\uc5d0\uc11c\ub9cc \uc791\ub3d9\ud569\ub2c8\ub2e4. \ud074\ub77c\uc6b0\ub4dc \ubc84\uc804\uc5d0\uc11c\ub294 \uc791\ub3d9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4."
      },
      "typeVersion": 1
    },
    {
      "id": "56c23cb5-818f-434d-96a7-0029f6607299",
      "name": "Parse PDF Upload",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        -700,
        -120
      ],
      "parameters": {
        "options": {},
        "operation": "pdf",
        "binaryPropertyName": "Upload_a_file"
      },
      "typeVersion": 1
    },
    {
      "id": "f4cc9870-a73e-487c-a131-aca2735b2e60",
      "name": "Extract Resume Data",
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "position": [
        0,
        -120
      ],
      "parameters": {
        "text": "={{ $json.text }}",
        "options": {},
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"name\": { \"type\": \"string\" },\n    \"label\": { \"type\": \"string\" },\n    \"email\": { \"type\": \"string\" },\n    \"phone\": { \"type\": \"string\" },\n    \"url\": { \"type\": \"string\" },\n    \"summary\": { \"type\": \"string\" },\n    \"location\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"address\": { \"type\": \"string\" },\n        \"postalCode\": { \"type\": \"string\" },\n        \"city\": { \"type\": \"string\" },\n        \"countryCode\": { \"type\": \"string\" },\n        \"region\": { \"type\": \"string\" }\n      }\n    },\n    \"work\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": { \"type\": \"string\" },\n          \"location\": { \"type\": \"string\" },\n          \"description\": { \"type\": \"string\" },\n          \"position\": { \"type\": \"string\" },\n          \"url\": { \"type\": \"string\" },\n          \"startDate\": { \"type\": \"string\" },\n          \"endDate\": { \"type\": \"string\" },\n          \"summary\": { \"type\": \"string\" },\n          \"highlights\": {\n            \"type\": \"array\",\n            \"items\": { \"type\": \"string\" }\n          }\n        }\n      }\n    },\n    \"education\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"institution\": { \"type\": \"string\" },\n          \"url\": { \"type\": \"string\" },\n          \"area\": { \"type\": \"string\" },\n          \"studyType\": { \"type\": \"string\" },\n          \"startDate\": { \"type\": \"string\" },\n          \"endDate\": { \"type\": \"string\" },\n          \"score\": { \"type\": \"string\" },\n          \"courses\": {\n            \"type\": \"array\",\n            \"items\": { \"type\": \"string\" }\n          }\n        }\n      }\n    },\n    \"skills\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": { \"type\": \"string\" },\n          \"level\": { \"type\": \"string\" },\n          \"keywords\": {\n            \"type\": \"array\",\n            \"items\": { \"type\": \"string\" }\n          }\n        }\n      }\n    }\n  }\n}"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Get Client Logs": {
      "main": [
        [
          {
            "node": "Filter Last Month",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Calculate Totals": {
      "main": [
        [
          {
            "node": "Send Invoice",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Client Usage Log": {
      "ai_tool": [
        [
          {
            "node": "Custom LLM Subnode",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Parse PDF Upload": {
      "main": [
        [
          {
            "node": "Logging Attributes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Last Month": {
      "main": [
        [
          {
            "node": "Calculate Totals",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Custom LLM Subnode": {
      "ai_languageModel": [
        [
          {
            "node": "Extract Resume Data",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Every End of Month": {
      "main": [
        [
          {
            "node": "Get Client Logs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Logging Attributes": {
      "main": [
        [
          {
            "node": "Extract Resume Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On form submission": {
      "main": [
        [
          {
            "node": "Parse PDF Upload",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Resume Data": {
      "main": [
        [
          {
            "node": "Display JSON Document",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}