{
  "id": "jVI0RwYxGpONwzYU",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Generate Local Date Itineraries with Google Places, AI, and Slack Sharing",
  "tags": [],
  "nodes": [
    {
      "id": "6630f4ed-c7e1-4f96-90e3-ba09ad5fb82d",
      "name": "Run Workflow Manually",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -2160,
        848
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "f9a75e8b-d993-4de0-8fa3-c9325d54aedd",
      "name": "Note: Set Parameters",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2032,
        576
      ],
      "parameters": {
        "color": 7,
        "width": 288,
        "height": 192,
        "content": "## Node: Set Parameters\nConfigure the starting point and constraints.\n- `startLat`, `startLng`, `radius`, `timeLimitMin`\n- Optional: `placeType`, `language`, `minRating`.\n**Tip:** Keep API keys in **Credentials**, not here."
      },
      "typeVersion": 1
    },
    {
      "id": "18fc0230-da4f-4554-bdc3-f0ec6306d66d",
      "name": "Note: Get Nearby Spots",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1840,
        1040
      ],
      "parameters": {
        "color": 7,
        "width": 288,
        "height": 192,
        "content": "## Node: Get Nearby Spots\nCall **Google Places Nearby Search**.\n- Endpoint: `/maps/api/place/nearbysearch/json`\n- Use a **Google credential** (no inline `key=`).\n- You can change `type` (default `cafe`) and `radius`."
      },
      "typeVersion": 1
    },
    {
      "id": "3011df46-a5d8-4f24-b3f7-30a7cd57e28f",
      "name": "Note: Select Top 3 Spots",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1616,
        544
      ],
      "parameters": {
        "color": 7,
        "width": 288,
        "height": 192,
        "content": "## Node: Select Top 3 Spots\nRank and filter places.\n- Sort by rating (desc), optionally by reviews.\n- Keep top 3; drop duplicates/unrated.\n- Keep total time within `timeLimitMin` (walking)."
      },
      "typeVersion": 1
    },
    {
      "id": "087b797c-7901-4c10-9e9b-cea34aac0b17",
      "name": "Note: Create Google Maps Link",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1296,
        1168
      ],
      "parameters": {
        "color": 7,
        "width": 288,
        "height": 192,
        "content": "## Node: Create Google Maps Link\nBuild a **walking route URL** for Google Maps.\n- origin \u2192 waypoints (top spots) \u2192 destination\n- Embed as: `\ud83d\uddfa\ufe0f <https://\u2026|View the route on Google Maps>`"
      },
      "typeVersion": 1
    },
    {
      "id": "a60fc744-b76c-48e1-bf1c-5b949c24c7b7",
      "name": "Note: Merge Chat + Map",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1008,
        1008
      ],
      "parameters": {
        "color": 7,
        "width": 288,
        "height": 192,
        "content": "## Node: Merge Chat + Map\nCombine the itinerary text with the route link.\n- Ensures the Slack message contains both contents."
      },
      "typeVersion": 1
    },
    {
      "id": "ca58d64e-9656-4d9f-a4e9-ee2dc6e190a3",
      "name": "Note: Slack Output",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        416,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 288,
        "height": 192,
        "content": "## Node: Slack Output\nPost to Slack.\n- Set the channel (e.g., `#general`).\n- Enable `mrkdwn`, disable link/media unfurling.\n- Message = itinerary text(s) + route link."
      },
      "typeVersion": 1
    },
    {
      "id": "5509f466-b357-41b0-8a5e-0f1121f4fd56",
      "name": "Note: OpenRouter Chat Model",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1280,
        368
      ],
      "parameters": {
        "color": 7,
        "width": 288,
        "height": 192,
        "content": "## Node: OpenRouter Chat Model\nLanguage model used by **Thinking Date Plan**.\n- Set your **OpenRouter credential**.\n- Keep prompts lightweight; avoid secrets in text."
      },
      "typeVersion": 1
    },
    {
      "id": "75a671f0-ef1d-4027-a069-e2b5249f0a32",
      "name": "Note: Thinking Date Plan",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1280,
        112
      ],
      "parameters": {
        "color": 7,
        "width": 288,
        "height": 192,
        "content": "## Node: Thinking Date Plan\nGenerate a friendly itinerary in Markdown with an LLM.\n- Include: order, stay time, one-line tip.\n- Output should be Japanese; Markdown only.\n- No Google Maps URL here (added later)."
      },
      "typeVersion": 1
    },
    {
      "id": "5dc8fa19-8d00-4f4e-9b3e-2bf1d54e2430",
      "name": "Note: Run Workflow Manually",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2272,
        1008
      ],
      "parameters": {
        "color": 7,
        "width": 288,
        "height": 192,
        "content": "## Node: Run Workflow Manually\nTest the workflow with a manual trigger first.\n- Good for validation and screenshots.\n- You can later replace it with **Schedule** or **Webhook**."
      },
      "typeVersion": 1
    },
    {
      "id": "f84ce2b7-d8f9-4946-9a63-d2faaab0cc27",
      "name": "Note: Format Message for Slack",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -208,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 288,
        "height": 208,
        "content": "## Node: Format Message for Slack\nPrepare a clean JSON structure for Slack.\n- Keep `text` (EN) / `text_ja` (JA) and `mapsUrl`.\n- Use concise, readable Markdown."
      },
      "typeVersion": 1
    },
    {
      "id": "c4c1a586-a48d-46c0-9705-b5927142932e",
      "name": "Note: Translate Plan (EN \u2194 JA)",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        32,
        1056
      ],
      "parameters": {
        "color": 7,
        "width": 288,
        "height": 192,
        "content": "## Node: Translate Plan (EN \u2194 JA)\nTranslate with **DeepL**.\n- Target: `EN-US` (you can change locale).\n- Credential required; keep **mrkdwn** rendering in mind."
      },
      "typeVersion": 1
    },
    {
      "id": "ba7edab9-f196-4fdf-a80d-fcb4b03511c0",
      "name": "Set Parameters1",
      "type": "n8n-nodes-base.set",
      "position": [
        -1936,
        848
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "startLat",
              "value": "35.7073"
            },
            {
              "name": "startLng",
              "value": "139.6656"
            },
            {
              "name": "radius",
              "value": "2000"
            },
            {
              "name": "timeLimitMin",
              "value": "120"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "c799de6c-ac35-4b6e-90ea-c39d74dae838",
      "name": "Get Nearby Spots1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1712,
        848
      ],
      "parameters": {
        "url": "https://maps.googleapis.com/maps/api/place/nearbysearch/json",
        "options": {},
        "queryParametersUi": {
          "parameter": [
            {
              "name": "location",
              "value": "=35.7073,139.6656"
            },
            {
              "name": "radius",
              "value": "=2000"
            },
            {
              "name": "type",
              "value": "`cafe"
            },
            {
              "name": "language",
              "value": "ja"
            },
            {
              "name": "key",
              "value": "="
            },
            {}
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "6d19cd88-2da3-44de-9d44-8bec779adee7",
      "name": "Select Top 3 Spots1",
      "type": "n8n-nodes-base.function",
      "position": [
        -1488,
        848
      ],
      "parameters": {
        "functionCode": "const results = $json.results || [];\nconst sorted = results\n  .map(r => ({ name: r.name, address: r.vicinity, rating: r.rating || 0, place_id: r.place_id }))\n  .sort((a,b) => b.rating - a.rating)\n  .slice(0,3);\nreturn [{ spots: sorted }];"
      },
      "typeVersion": 1
    },
    {
      "id": "11767a3b-3396-4c0b-b195-b77e69ee5c0b",
      "name": "Merge Chat + Map1",
      "type": "n8n-nodes-base.merge",
      "position": [
        -912,
        848
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combinationMode": "multiplex"
      },
      "typeVersion": 2
    },
    {
      "id": "06c7cd4a-2c3f-4f0a-bc74-6cf2f5d16c7a",
      "name": "Slack Output1",
      "type": "n8n-nodes-base.slack",
      "position": [
        336,
        848
      ],
      "parameters": {
        "text": "==\ud83d\udcd8 *\u4eca\u65e5\u306e\u30c7\u30fc\u30c8\u30d7\u30e9\u30f3\u63d0\u6848\u3067\u3059\uff1a*\n\n\ud83c\uddef\ud83c\uddf5 *\u65e5\u672c\u8a9e\u30d7\u30e9\u30f3:*\n{{$('Format Message for Slack').item.json.text_ja}}\n\n---\n\n\ud83c\udf10 *English version:*\n{{$json.text}}\n\n{{$('Format Message for Slack').item.json.mapsUrl}}\n\nWeather:\n{{ $('AI Weather Emoji Generator').item.json.text }}",
        "channel": "#general",
        "attachments": [],
        "otherOptions": {
          "mrkdwn": true,
          "unfurl_links": false,
          "unfurl_media": false
        },
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "e165a610-9c00-40e0-967e-07edd24abe49",
      "name": "Sticky Note17",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2784,
        448
      ],
      "parameters": {
        "width": 384,
        "height": 1504,
        "content": "## \ud83e\udde9 What this template does\n\nThis workflow builds a 120-minute local date course around your starting point by querying Google Places for nearby spots, selecting the top candidates, fetching real-time weather data, letting an AI generate a matching emoji, and drafting a friendly itinerary summary with an LLM in both English and Japanese.\nIt then posts the full bilingual plan with a walking route link and weather emoji to Slack.\n\n## \ud83d\udc65 Who it\u2019s for\n\nMakers and teams who want a plug-and-play bilingual local itinerary generator with weather awareness \u2014 no custom code required.\n\n## \u2699\ufe0f How it works\n\nTrigger \u2013 Manual (or schedule/webhook).\n\nDiscovery \u2013 Google Places nearby search within a configurable radius.\n\nSelection \u2013 Rank by rating and pick the top 3.\n\nWeather \u2013 Fetch current weather (via OpenWeatherMap).\n\nEmoji \u2013 Use an AI model to match the weather with an emoji \ud83c\udf24\ufe0f.\n\nPlanning \u2013 An LLM writes the itinerary in Markdown (JP + EN).\n\nRoute \u2013 Compose a Google Maps walking route URL.\n\nShare \u2013 Post the bilingual itinerary, route link, and weather emoji to Slack.\n\n## \ud83e\uddf0 Requirements\n\nn8n (Cloud or self-hosted)\n\nGoogle Maps Platform (Places API)\n\nOpenWeatherMap API key\n\nSlack Bot (chat:write)\n\nLLM provider (e.g., OpenRouter or DeepL for translation)\n\n## \ud83d\ude80 Setup (quick)\n\nOpen Set \u2192 Fields: Config and fill in coords/radius/time limit.\n\nConnect Credentials for Google, OpenWeatherMap, Slack, and your LLM.\n\nTest the workflow and confirm the bilingual plan + weather emoji appear in Slack.\n\n## \ud83d\udee0 Customize\n\nAdjust ranking filters (type, min rating).\n\nModify translation settings (target language or tone).\n\nChange output layout (side-by-side vs separated).\n\nTune emoji logic or travel mode.\n\nAdd error handling, retries, or logging for production use."
      },
      "typeVersion": 1
    },
    {
      "id": "97a1ba3e-9bfb-484d-b27f-b3a851f00e85",
      "name": "Translate Plan (EN \u2194 JA)1",
      "type": "n8n-nodes-base.deepL",
      "position": [
        112,
        848
      ],
      "parameters": {
        "text": "={{ $json.text }}",
        "translateTo": "EN-US",
        "additionalFields": {}
      },
      "credentials": {
        "deepLApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "862eb4aa-3ec0-4a11-a65b-bcdd6ecff1a8",
      "name": "Thinking Date Plan1",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        -1264,
        592
      ],
      "parameters": {
        "text": "=\u4ee5\u4e0b\u306e3\u3064\u306e\u30b9\u30dd\u30c3\u30c8\u3092\u3082\u3068\u306b120\u5206\u4ee5\u5185\u306e\u30c7\u30fc\u30c8\u30d7\u30e9\u30f3\u3092\u4f5c\u3063\u3066\u304f\u3060\u3055\u3044\u3002\n\u51fa\u529b\u306b\u306fGoogle\u30de\u30c3\u30d7\u306eURL\u306f\u542b\u3081\u305a\u3001Markdown\u5f62\u5f0f\u3067\u30b3\u30fc\u30b9\u5185\u5bb9\u3060\u3051\u3092\u66f8\u3044\u3066\u304f\u3060\u3055\u3044\n\n\u30b9\u30dd\u30c3\u30c8\u60c5\u5831:\n1. {{$json.spots[0].name}}\uff08\u4f4f\u6240\uff1a{{$json.spots[0].address}}\uff0f\u8a55\u4fa1\uff1a{{$json.spots[0].rating}}\uff09\n2. {{$json.spots[1].name}}\uff08\u4f4f\u6240\uff1a{{$json.spots[1].address}}\uff0f\u8a55\u4fa1\uff1a{{$json.spots[1].rating}}\uff09\n3. {{$json.spots[2].name}}\uff08\u4f4f\u6240\uff1a{{$json.spots[2].address}}\uff0f\u8a55\u4fa1\uff1a{{$json.spots[2].rating}}\uff09\n",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "\u3042\u306a\u305f\u306f\u6771\u4eac\u306e\u30c7\u30fc\u30c8\u30b3\u30f3\u30b7\u30a7\u30eb\u30b8\u30e5\u3067\u3059\u3002\u30e6\u30fc\u30b6\u30fc\u304c\u8a2a\u308c\u308b\u30b9\u30dd\u30c3\u30c8\u60c5\u5831\u3092\u3082\u3068\u306b\u3001120\u5206\u4ee5\u5185\u3067\u697d\u3057\u3081\u308b\u30c7\u30fc\u30c8\u30b3\u30fc\u30b9\u3092\u63d0\u6848\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u884c\u304d\u9806\u30fb\u6ede\u5728\u6642\u9593\u30fb\u4e00\u8a00\u30b3\u30e1\u30f3\u30c8\u3092\u542b\u3081\u3001\u3084\u3055\u3057\u3044\u65e5\u672c\u8a9e\u3067Markdown\u5f62\u5f0f\u3067\u51fa\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002"
            },
            {
              "type": "HumanMessagePromptTemplate",
              "message": "\u4ee5\u4e0b\u306e\u30b9\u30dd\u30c3\u30c8\u60c5\u5831\u3092\u3082\u3068\u306b\u3001120\u5206\u4ee5\u5185\u3067\u7121\u7406\u306a\u304f\u56de\u308c\u308b\u9806\u5e8f\u306e\u30c7\u30fc\u30c8\u30d7\u30e9\u30f3\u3092\u4f5c\u3063\u3066\u304f\u3060\u3055\u3044\u3002{{JSON.stringify($json.spots, null, 2)}}"
            }
          ]
        },
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "2b87cd1c-3c95-4eb5-ad53-eb69c2e5441a",
      "name": "OpenRouter Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        -1200,
        816
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "96bb07b3-4297-4bf6-a2ea-2ca4bf2abf58",
      "name": "OpenRouter Chat Model2",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        -400,
        1072
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "348a72b1-2474-4ef6-8934-bb63e7fe982d",
      "name": "AI Weather Emoji Generator",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        -464,
        848
      ],
      "parameters": {
        "text": "=Given the following weather description, output one emoji that best represents the weather condition.\n\nWeather description: {{$json.weather[0].description}}\n\nExamples:\n- clear sky \u2192 \u2600\ufe0f\n- few clouds \u2192 \ud83c\udf24\ufe0f\n- overcast clouds \u2192 \u2601\ufe0f\n- light rain \u2192 \ud83c\udf26\ufe0f\n- heavy rain \u2192 \ud83c\udf27\ufe0f\n- thunderstorm \u2192 \u26c8\ufe0f\n- snow \u2192 \u2744\ufe0f\n- mist or fog \u2192 \ud83c\udf2b\ufe0f\n- haze \u2192 \ud83c\udf01\n- wind \u2192 \ud83d\udca8\n\nRespond with only one emoji, no explanation or text.",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "\u3042\u306a\u305f\u306f\u6771\u4eac\u306e\u30c7\u30fc\u30c8\u30b3\u30f3\u30b7\u30a7\u30eb\u30b8\u30e5\u3067\u3059\u3002\u30e6\u30fc\u30b6\u30fc\u304c\u8a2a\u308c\u308b\u30b9\u30dd\u30c3\u30c8\u60c5\u5831\u3092\u3082\u3068\u306b\u3001120\u5206\u4ee5\u5185\u3067\u697d\u3057\u3081\u308b\u30c7\u30fc\u30c8\u30b3\u30fc\u30b9\u3092\u63d0\u6848\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u884c\u304d\u9806\u30fb\u6ede\u5728\u6642\u9593\u30fb\u4e00\u8a00\u30b3\u30e1\u30f3\u30c8\u3092\u542b\u3081\u3001\u3084\u3055\u3057\u3044\u65e5\u672c\u8a9e\u3067Markdown\u5f62\u5f0f\u3067\u51fa\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002"
            },
            {
              "type": "HumanMessagePromptTemplate",
              "message": "\u4ee5\u4e0b\u306e\u30b9\u30dd\u30c3\u30c8\u60c5\u5831\u3092\u3082\u3068\u306b\u3001120\u5206\u4ee5\u5185\u3067\u7121\u7406\u306a\u304f\u56de\u308c\u308b\u9806\u5e8f\u306e\u30c7\u30fc\u30c8\u30d7\u30e9\u30f3\u3092\u4f5c\u3063\u3066\u304f\u3060\u3055\u3044\u3002{{JSON.stringify($json.spots, null, 2)}}"
            }
          ]
        },
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "6b309f6e-1d95-42fd-a0be-b6ea9a9ef8c4",
      "name": "Get Current Weather",
      "type": "n8n-nodes-base.openWeatherMap",
      "position": [
        -688,
        848
      ],
      "parameters": {
        "latitude": "={{ $('Get Nearby Spots1').item.json.results[0].geometry.viewport.northeast.lat }}",
        "longitude": "={{ $('Get Nearby Spots1').item.json.results[0].geometry.viewport.northeast.lng }}",
        "locationSelection": "coordinates"
      },
      "credentials": {
        "openWeatherMapApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "b0522365-69cb-4b2d-b865-253a38d1b6a8",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -800,
        560
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 256,
        "content": "## Get Current Weather\n\ud83c\udf26\ufe0f Fetch current weather data from OpenWeatherMap.\n\n- Input: Coordinates (lat, lon)\n- Output: JSON (weather[0].main, weather[0].description, weather[0].icon)\n- Used for: Emoji generation and Slack summary\n\n\ud83d\udca1Tip: Use Metric format for \u00b0C output."
      },
      "typeVersion": 1
    },
    {
      "id": "3ad9d0b8-4961-4b47-a6f4-03cdf1d21e64",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -480,
        1248
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 304,
        "content": "## AI Weather Emoji Generator\n\n\ud83e\udd16 Convert weather text into a matching emoji.\n\n- Input: weather[0].main or description\n- Model: OpenRouter Chat (gpt-4o / gpt-4o-mini)\n- Output: Emoji representing the current weather\n\nExample:\n\"Clear\" \u2192 \u2600\ufe0f\n\"Rain\" \u2192 \ud83c\udf27\ufe0f\n\"Snow\" \u2192 \u2744\ufe0f\n\"Thunderstorm\" \u2192 \u26c8\ufe0f"
      },
      "typeVersion": 1
    },
    {
      "id": "2309d554-5378-48a2-a443-83c36a2491c1",
      "name": "Create Google Maps Link",
      "type": "n8n-nodes-base.function",
      "position": [
        -1200,
        992
      ],
      "parameters": {
        "functionCode": "const spots = $json.spots || [];\nif (!spots.length) return { mapsUrl: 'No spots found', mrkdwn: true };\n\nconst formatSpot = (s) => {\n  const name = s.name || '';\n  const address = s.address || '';\n  \n  if (!address.includes('\u4e2d\u91ce\u533a') && !address.includes('\u6749\u4e26\u533a') && !address.includes('\u6771\u4eac\u90fd')) {\n    return `\u6771\u4eac\u90fd\u4e2d\u91ce\u533a ${name}`;\n  }\n  return `${name} ${address}`;\n};\n\nconst waypoints = spots.slice(0, -1).map(s => formatSpot(s)).join('|');\nconst origin = '\u4e2d\u91ce\u99c5 \u6771\u4eac\u90fd\u4e2d\u91ce\u533a';\nconst destination = formatSpot(spots[spots.length - 1]);\n\nconst url = encodeURI(\n  `https://www.google.com/maps/dir/?api=1&origin=${origin}&destination=${destination}&travelmode=walking&waypoints=${waypoints}`\n);\n\n// \ud83d\udc47 text \u2192 mapsUrl \u306b\u5909\u66f4\uff01\nreturn {\n  mapsUrl: `\ud83d\uddfa\ufe0f <${url}|View the route on Google Maps>`,\n  mrkdwn: true\n};"
      },
      "typeVersion": 1
    },
    {
      "id": "198c0819-c27d-4bcb-9226-927cd16c28a0",
      "name": "Format Message for Slack",
      "type": "n8n-nodes-base.code",
      "position": [
        -112,
        848
      ],
      "parameters": {
        "jsCode": "return {\n  text_ja: $('Merge Chat + Map1').first().json.text,\n  text: $('Merge Chat + Map1').first().json.text,\n  mapsUrl: $('Merge Chat + Map1').first().json.mapsUrl,\n};"
      },
      "typeVersion": 2
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "6295df07-4c6b-47e9-95ad-014b0c73e87e",
  "connections": {
    "Set Parameters1": {
      "main": [
        [
          {
            "node": "Get Nearby Spots1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Nearby Spots1": {
      "main": [
        [
          {
            "node": "Select Top 3 Spots1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Chat + Map1": {
      "main": [
        [
          {
            "node": "Get Current Weather",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Current Weather": {
      "main": [
        [
          {
            "node": "AI Weather Emoji Generator",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Select Top 3 Spots1": {
      "main": [
        [
          {
            "node": "Create Google Maps Link",
            "type": "main",
            "index": 0
          },
          {
            "node": "Thinking Date Plan1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Thinking Date Plan1": {
      "main": [
        [
          {
            "node": "Merge Chat + Map1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Run Workflow Manually": {
      "main": [
        [
          {
            "node": "Set Parameters1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Thinking Date Plan1",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model2": {
      "ai_languageModel": [
        [
          {
            "node": "AI Weather Emoji Generator",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Create Google Maps Link": {
      "main": [
        [
          {
            "node": "Merge Chat + Map1",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Format Message for Slack": {
      "main": [
        [
          {
            "node": "Translate Plan (EN \u2194 JA)1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Weather Emoji Generator": {
      "main": [
        [
          {
            "node": "Format Message for Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Translate Plan (EN \u2194 JA)1": {
      "main": [
        [
          {
            "node": "Slack Output1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}