{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "gmail-trigger-001",
      "name": "Gmail Trigger",
      "type": "n8n-nodes-base.gmailTrigger",
      "position": [
        560,
        400
      ],
      "parameters": {
        "simple": false,
        "filters": {
          "q": "-from:me"
        },
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        }
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "drive-download-001",
      "name": "Google Drive - Download Profile",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        760,
        260
      ],
      "parameters": {
        "fileId": "YOUR_PROFILE_DOC_FILE_ID",
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "gmail-thread-001",
      "name": "Gmail - Fetch Thread",
      "type": "n8n-nodes-base.gmail",
      "position": [
        760,
        540
      ],
      "parameters": {
        "threadId": "={{ $json.threadId }}",
        "operation": "getAll"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "profile-loader-001",
      "name": "Profile Document Loader",
      "type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
      "position": [
        980,
        260
      ],
      "parameters": {
        "options": {
          "metadata": {
            "metadataValues": [
              {
                "name": "type",
                "value": "user_profile"
              }
            ]
          }
        },
        "jsonData": "={{ $json.content }}",
        "jsonMode": "expressionData"
      },
      "typeVersion": 1
    },
    {
      "id": "thread-loader-001",
      "name": "Thread Document Loader",
      "type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
      "position": [
        980,
        540
      ],
      "parameters": {
        "options": {
          "metadata": {
            "metadataValues": [
              {
                "name": "type",
                "value": "email_thread"
              }
            ]
          }
        },
        "jsonData": "={{ JSON.stringify($json.messages) }}",
        "jsonMode": "expressionData"
      },
      "typeVersion": 1
    },
    {
      "id": "profile-splitter-001",
      "name": "Profile Text Splitter",
      "type": "@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter",
      "position": [
        1200,
        260
      ],
      "parameters": {
        "chunkSize": 1000,
        "chunkOverlap": 100
      },
      "typeVersion": 1
    },
    {
      "id": "thread-splitter-001",
      "name": "Thread Text Splitter",
      "type": "@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter",
      "position": [
        1200,
        540
      ],
      "parameters": {
        "chunkSize": 2000,
        "chunkOverlap": 200
      },
      "typeVersion": 1
    },
    {
      "id": "openai-embeddings-001",
      "name": "OpenAI Embeddings",
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "position": [
        1420,
        400
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "vector-store-001",
      "name": "Simple Vector Store",
      "type": "@n8n/n8n-nodes-langchain.vectorStoreInMemory",
      "position": [
        1640,
        400
      ],
      "parameters": {
        "mode": "insert",
        "memoryKey": "email_context_{{ $('Gmail Trigger').item.json.threadId }}"
      },
      "typeVersion": 1
    },
    {
      "id": "prepare-context-001",
      "name": "Prepare Agent Context",
      "type": "n8n-nodes-base.set",
      "position": [
        1860,
        400
      ],
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "context-text",
              "name": "text",
              "type": "string",
              "value": "=Please analyze this incoming email and generate an appropriate reply based on the user profile and email thread context.\n\nIncoming Email Subject: {{ $('Gmail Trigger').item.json.subject }}\nIncoming Email From: {{ $('Gmail Trigger').item.json.headers.from }}\nIncoming Email Body: {{ $('Gmail Trigger').item.json.textAsHtml }}\n\nInstructions:\n1. If this appears to be a newsletter, automated notification, or spam, respond with exactly 'NO_REPLY_NEEDED'\n2. If this requires a response, generate a professional and contextual reply\n3. Use the knowledge from the vector store to inform your response\n4. Keep responses concise but helpful"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "openai-chat-001",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        2080,
        580
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {
          "temperature": 0.3
        }
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "simple-memory-001",
      "name": "Simple Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        2180,
        580
      ],
      "parameters": {
        "sessionKey": "=email_{{ $('Gmail Trigger').item.json.threadId }}",
        "maxTokenLimit": 4000,
        "sessionIdType": "customKey"
      },
      "typeVersion": 1.3
    },
    {
      "id": "vector-retriever-001",
      "name": "Vector Store Retriever",
      "type": "@n8n/n8n-nodes-langchain.vectorStoreInMemory",
      "position": [
        2280,
        580
      ],
      "parameters": {
        "mode": "retrieve-as-tool",
        "limit": 5,
        "toolName": "email_context",
        "memoryKey": "email_context_{{ $('Gmail Trigger').item.json.threadId }}",
        "toolDescription": "Retrieve context about the user profile and email thread history"
      },
      "typeVersion": 1
    },
    {
      "id": "email-agent-001",
      "name": "Email Reply Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2080,
        400
      ],
      "parameters": {
        "text": "={{ $json.text }}",
        "options": {
          "systemMessage": "You are an intelligent email assistant. Your job is to analyze incoming emails and generate appropriate responses based on:\n\n1. User profile information (from vector store)\n2. Email thread context (from vector store)\n3. The specific incoming email content\n\nGuidelines:\n- For newsletters, promotions, automated messages: respond with exactly 'NO_REPLY_NEEDED'\n- For legitimate emails requiring responses: generate professional, contextual replies\n- Keep responses concise but helpful\n- Use the user's communication style from their profile\n- Reference relevant context from previous emails when appropriate\n- Always be polite and professional"
        },
        "promptType": "define"
      },
      "typeVersion": 1.9
    },
    {
      "id": "check-response-001",
      "name": "Check If Reply Needed",
      "type": "n8n-nodes-base.if",
      "position": [
        2400,
        400
      ],
      "parameters": {
        "conditions": {
          "combinator": "and",
          "conditions": [
            {
              "operator": {
                "type": "notContainsText"
              },
              "leftValue": "={{ $json.output }}",
              "rightValue": "NO_REPLY_NEEDED"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "create-draft-001",
      "name": "Gmail - Create Draft",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2680,
        400
      ],
      "parameters": {
        "message": "={{ $json.output.replace(/\\n/g, \"<br />\\n\") }}",
        "options": {
          "sendTo": "={{ $('Gmail Trigger').item.json.headers.from }}",
          "threadId": "={{ $('Gmail Trigger').item.json.threadId }}"
        },
        "subject": "=Re: {{ $('Gmail Trigger').item.json.subject }}",
        "resource": "draft",
        "emailType": "html"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "error-handler-001",
      "name": "Error Handler",
      "type": "n8n-nodes-base.code",
      "position": [
        2400,
        600
      ],
      "parameters": {
        "jsCode": "// Log error details for debugging\nconst errorData = {\n  timestamp: new Date().toISOString(),\n  error: $input.all(),\n  workflow: 'Gmail Auto Reply',\n  threadId: $('Gmail Trigger').item?.json?.threadId || 'unknown'\n};\n\nconsole.log('Workflow Error:', JSON.stringify(errorData, null, 2));\n\nreturn [{ json: errorData }];"
      },
      "typeVersion": 2
    },
    {
      "id": "sticky-note-001",
      "name": "Workflow Instructions",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        200,
        200
      ],
      "parameters": {
        "color": 5,
        "width": 300,
        "height": 400,
        "content": "# Gmail Auto-Reply with AI\n\n## Setup Required:\n1. **Gmail OAuth2** credentials\n2. **Google Drive OAuth2** credentials  \n3. **OpenAI API** credentials\n4. **Profile Document**: Update YOUR_PROFILE_DOC_FILE_ID\n\n## How it works:\n1. Monitors Gmail for new emails\n2. Downloads user profile from Google Drive\n3. Fetches email thread context\n4. Creates vector embeddings for context\n5. Uses AI agent to generate appropriate replies\n6. Creates draft if reply is needed\n\n## Features:\n- Smart filtering (ignores newsletters/spam)\n- Context-aware responses\n- Memory of conversation history\n- Professional tone matching"
      },
      "typeVersion": 1
    }
  ],
  "active": true,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "3",
  "connections": {
    "Gmail Trigger": {
      "main": [
        [
          {
            "node": "Google Drive - Download Profile",
            "type": "main",
            "index": 0
          },
          {
            "node": "Gmail - Fetch Thread",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory": {
      "ai_memory": [
        [
          {
            "node": "Email Reply Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Email Reply Agent": {
      "main": [
        [
          {
            "node": "Check If Reply Needed",
            "type": "main",
            "index": 0
          }
        ]
      ],
      "error": [
        [
          {
            "node": "Error Handler",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Email Reply Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Embeddings": {
      "ai_embedding": [
        [
          {
            "node": "Simple Vector Store",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "Simple Vector Store": {
      "main": [
        [
          {
            "node": "Prepare Agent Context",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gmail - Create Draft": {
      "error": [
        [
          {
            "node": "Error Handler",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gmail - Fetch Thread": {
      "main": [
        [
          {
            "node": "Thread Document Loader",
            "type": "main",
            "index": 0
          }
        ]
      ],
      "error": [
        [
          {
            "node": "Error Handler",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Thread Text Splitter": {
      "ai_textSplitter": [
        [
          {
            "node": "Thread Document Loader",
            "type": "ai_textSplitter",
            "index": 0
          }
        ]
      ]
    },
    "Check If Reply Needed": {
      "main": [
        [
          {
            "node": "Gmail - Create Draft",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Agent Context": {
      "main": [
        [
          {
            "node": "Email Reply Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Profile Text Splitter": {
      "ai_textSplitter": [
        [
          {
            "node": "Profile Document Loader",
            "type": "ai_textSplitter",
            "index": 0
          }
        ]
      ]
    },
    "Thread Document Loader": {
      "ai_document": [
        [
          {
            "node": "Simple Vector Store",
            "type": "ai_document",
            "index": 0
          }
        ]
      ]
    },
    "Vector Store Retriever": {
      "ai_tool": [
        [
          {
            "node": "Email Reply Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Profile Document Loader": {
      "ai_document": [
        [
          {
            "node": "Simple Vector Store",
            "type": "ai_document",
            "index": 0
          }
        ]
      ]
    },
    "Google Drive - Download Profile": {
      "main": [
        [
          {
            "node": "Profile Document Loader",
            "type": "main",
            "index": 0
          }
        ]
      ],
      "error": [
        [
          {
            "node": "Error Handler",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}