iMessage 음식 사진 영양 분석(GPT-4 시각 및 기억 저장)
고급
이것은Personal Productivity, AI Chatbot분야의자동화 워크플로우로, 19개의 노드를 포함합니다.주로 If, Code, Webhook, Aggregate, HttpRequest 등의 노드를 사용하며. iMessage 식사 사진 영양 분석(GPT-4 시각적 및 기억 저장)
사전 요구사항
- •HTTP Webhook 엔드포인트(n8n이 자동으로 생성)
- •대상 API의 인증 정보가 필요할 수 있음
- •OpenAI API Key
- •PostgreSQL 데이터베이스 연결 정보
사용된 노드 (19)
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"meta": {
"instanceId": "9fe2e2e308ee9fa575b11a458a16465194c029a4f53a09a925eb0b5fa7b5761a",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "22f351db-4581-450b-a260-b50962f4f35a",
"name": "스티커 메모",
"type": "n8n-nodes-base.stickyNote",
"position": [
1220,
0
],
"parameters": {
"width": 880,
"height": 1000,
"content": "## Using the n8n HTTP Request Node to Send a Blooio.com Message\n\nFollow these steps to configure your existing HTTP Request node in n8n so you can send SMS or email via the Blooio.com API.\n\n---\n\n### 1. Open Your HTTP Request Node\n\n- In your workflow, click on the HTTP Request node you’ve already added (e.g. **Send Message**).\n\n---\n\n### 2. Set Up the Request\n\n| Field | Value |\n|-----------------------|----------------------------------------------------|\n| **Request Method** | `POST` |\n| **URL** | `https://api.blooio.com/send-message` |\n| **Response Format** | `JSON` |\n| **Body Content Type** | `JSON (application/json)` |\n\n---\n\n### 3. Add Required Headers\n\nAdd three headers exactly as shown:\n\n```text\nAccept: application/json\nAuthorization: Bearer YOUR_API_TOKEN\nContent-Type: application/json"
},
"typeVersion": 1
},
{
"id": "334e086c-872b-4a75-8a33-aaec66ec3f02",
"name": "메시지 전송",
"type": "n8n-nodes-base.httpRequest",
"position": [
1280,
780
],
"parameters": {
"url": "https://api.blooio.com/send-message",
"method": "POST",
"options": {},
"sendBody": true,
"sendHeaders": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "identifier",
"value": "={{ $('Receive Message (From Blooio)').item.json.body.message.sender }}"
},
{
"name": "message",
"value": "={{ $json.output }}"
}
]
},
"genericAuthType": "httpBearerAuth",
"headerParameters": {
"parameters": [
{
"name": "accept",
"value": "application/json"
}
]
}
},
"credentials": {
"httpBearerAuth": {
"id": "WxjvtozS2uLOEBkw",
"name": "Blooio Bearer Auth account"
}
},
"typeVersion": 4.2
},
{
"id": "d4df3023-17d3-44f1-bafd-1a70a370f98f",
"name": "스티커 메모1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2000,
980
],
"parameters": {
"color": 3,
"width": 780,
"height": 360,
"content": "## Message Read Webhook:\n```\n{\n \"type\": \"updated-message\",\n \"message\": {\n \"messageId\": \"218BCBB7-92E5-455B-AF47-380DB39ACD16\",\n \"content\": \"Test\",\n \"sender\": \"+11111111111\",\n \"selfMessage\": true,\n \"sentAt\": 1750755023004,\n \"technology\": \"iMessage\",\n \"delivered\": true,\n \"deliveredAt\": 1750755023334,\n \"readAt\": 1750755049887,\n \"attachments\": [],\n \"conversation\": null\n }\n}\n```"
},
"typeVersion": 1
},
{
"id": "9330aeee-82ed-4549-9927-c7802a809cd9",
"name": "스티커 메모2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2000,
380
],
"parameters": {
"color": 6,
"width": 780,
"height": 580,
"content": "## Message Received Webhook:\n```\n{\n \"type\": \"new-message\",\n \"message\": {\n \"messageId\": \"B525F710-521F-4D39-8C8F-A44BB737A3B6\",\n \"content\": \"Attached the csv file for you\",\n \"sender\": \"+11111111111\",\n \"selfMessage\": false,\n \"sentAt\": 1750757604774,\n \"technology\": \"iMessage\",\n \"delivered\": true,\n \"deliveredAt\": null,\n \"readAt\": null,\n \"attachments\": [\n {\n \"id\": \"F933522B-8DC1-47DB-9274-7508B16D15BF\",\n \"filename\": \"high_volume_b2b_laser_cnc_products.csv\",\n \"mimeType\": \"text/csv\",\n \"url\": \"https://bucket.blooio.com/custom-webhook-attachments/-xxxx.csv\",\n \"size\": 1962,\n \"expiresAt\": \"2025-07-24T09:33:26.934Z\",\n \"expiresAtUnix\": 1753349606934\n }\n ],\n \"conversation\": {\n \"id\": \"iMessage;-;+11111111111\",\n \"recipient\": \"+11111111111\",\n \"name\": null\n }\n }\n}\n```"
},
"typeVersion": 1
},
{
"id": "b7a92947-9617-4639-8c1a-b80242bb3571",
"name": "AI 에이전트",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-160,
780
],
"parameters": {
"text": "=User message: {{ $('Receive Message (From Blooio)').item.json.body.message.content }}",
"options": {
"systemMessage": "<identity>\nYou are a world-class AI Nutrition Analyst trained to estimate nutrition from food photos using visual analysis, expert knowledge, and common food portion assumptions.\n</identity>\n\n<mission>\nYour task is to analyze a single food photo and provide a complete nutritional summary, without asking the user for any additional information. You must visually identify all items, estimate portion sizes, and calculate total calories and nutrients. Your response should be accurate, clear, and formatted as a friendly iMessage-style explanation — no JSON, no technical markup.\n\n</mission>\n\n<analysis_protocol>\n1. **Identify** all foods and beverages in the image.\n2. **Estimate** portion sizes using visual cues and standard serving sizes.\n3. **Calculate** total:\n - Calories\n - Protein\n - Carbs\n - Fat\n - Fiber\n - Sugar\n - Sodium\n4. **Score**:\n - Confidence Score (0.0 to 1.0): How sure you are based on image clarity, food visibility, and assumptions.\n - Health Score (0 to 10): Nutritional quality based on processing, balance, and content.\n\n</analysis_protocol>\n\n<response_format>\nRespond in a conversational tone. Start by describing the identified meal. Then list the estimated nutrition facts in simple bullet points. Finally, include:\n- A health rating from 0–10.\n- A confidence rating from 0.0–1.0.\n- A short, friendly rationale for your estimate and assumptions.\n\n⚠️ Do NOT ask the user for input or confirmation.\n⚠️ Do NOT include JSON, markdown, or structured code output.\n⚠️ Speak as if you're texting back a friend with a nutrition summary.\n\nGive the user a day report so far, a week report so far and a month report so far.</response_format>\n\n<error_handling>\nIf the image is unclear or does not show food, reply kindly to get the user to upload a different image or images.\n</error_handling>",
"passthroughBinaryImages": true
},
"promptType": "define"
},
"typeVersion": 1.9
},
{
"id": "79696185-e706-4c36-83c1-8f7294f5ec8b",
"name": "OpenAI 채팅 모델",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-160,
960
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini",
"cachedResultName": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "JrqIdyKAvwxNgaEM",
"name": "Tay - SLUG"
}
},
"typeVersion": 1.2
},
{
"id": "cc4c91c1-aacc-4a43-a530-5f902cb4274f",
"name": "Postgres 채팅 메모리",
"type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
"position": [
-160,
1120
],
"parameters": {
"tableName": "n8n_calorie_tracker",
"sessionKey": "={{ $('Receive Message (From Blooio)').item.json.body.message.conversation.id }}",
"sessionIdType": "customKey",
"contextWindowLength": 200
},
"credentials": {
"postgres": {
"id": "asiZOOtRYUAuWsWd",
"name": "Neon"
}
},
"typeVersion": 1.3
},
{
"id": "3860f4f4-1af7-4951-a52c-3d7c7f07cb9a",
"name": "메시지 수신 (Blooio에서)",
"type": "n8n-nodes-base.webhook",
"position": [
-1440,
760
],
"webhookId": "00dbce9f-70b6-4e2d-9da4-ba8747f95e5b",
"parameters": {
"path": "receive-event",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2
},
{
"id": "40a29005-81ce-4fea-9572-230d27a79894",
"name": "HTTP 요청",
"type": "n8n-nodes-base.httpRequest",
"position": [
400,
400
],
"parameters": {
"url": "={{ $json.url }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "7b06c8a8-c330-45bc-a3a1-5dd1353b8603",
"name": "이미지가 있으면 다운로드",
"type": "n8n-nodes-base.if",
"position": [
-700,
760
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "551f9536-48c3-4757-a58b-35ee1ef81a80",
"operator": {
"type": "array",
"operation": "lengthGt",
"rightType": "number"
},
"leftValue": "={{ $('Receive Message (From Blooio)').item.json.body.message.attachments }}",
"rightValue": 0
}
]
}
},
"typeVersion": 2.2
},
{
"id": "e3bb4c52-b673-4d97-b9b5-e980349366ec",
"name": "항목 순환 처리",
"type": "n8n-nodes-base.splitInBatches",
"position": [
40,
380
],
"parameters": {
"options": {
"reset": false
}
},
"typeVersion": 3
},
{
"id": "f14e056e-2756-4ed9-8233-61fb4a86ee62",
"name": "코드",
"type": "n8n-nodes-base.code",
"position": [
-280,
380
],
"parameters": {
"jsCode": "let output = [];\n\nfor (const item of $input.first().json.body.message.attachments) {\n output.push({\n json: {\n url: item.url\n }\n });\n}\n\nreturn output;"
},
"typeVersion": 2
},
{
"id": "4bd4284d-fafe-4aca-976e-c822a8170823",
"name": "AI 에이전트1",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
600,
780
],
"parameters": {
"text": "={{ $json.data.toJsonString() }}",
"options": {
"systemMessage": "Summarize these messages and give the user a report that will be send in an iMessage. Do not say \"here's the summary\" or anything like that. Just respond with the summary by itself."
},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "274b2815-92bf-4a8a-bcd6-98fdb977dfa0",
"name": "집계",
"type": "n8n-nodes-base.aggregate",
"position": [
260,
780
],
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData"
},
"typeVersion": 1
},
{
"id": "ddc20f94-42a0-4227-ad11-afb0feb34db5",
"name": "OpenAI 채팅 모델1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
620,
940
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "JrqIdyKAvwxNgaEM",
"name": "Tay - SLUG"
}
},
"typeVersion": 1.2
},
{
"id": "21264d57-60f5-4594-b450-07662078b23e",
"name": "자신에게 응답하지 않음",
"type": "n8n-nodes-base.if",
"position": [
-960,
760
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "cecd3adf-a9e5-41d3-87ae-4a9699bd641b",
"operator": {
"type": "boolean",
"operation": "false",
"singleValue": true
},
"leftValue": "={{ $json.body.message.selfMessage }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "a098d03a-a4af-4b9a-aac2-5f5b57fd30e0",
"name": "스티커 메모3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-360,
260
],
"parameters": {
"color": 4,
"width": 980,
"height": 400,
"content": "## Image downloader \n"
},
"typeVersion": 1
},
{
"id": "4a009bbd-4457-4bc9-8a03-9de40736f931",
"name": "스티커 메모4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2000,
-700
],
"parameters": {
"width": 760,
"height": 1040,
"content": "## 🚀 Start Here: Blooio Nutrition Tracker Setup\n\nWelcome! Before this n8n workflow can analyze meal photos and send nutrition summaries via SMS or iMessage, follow these steps to get set up:\n\n---\n\n### ✅ Step 1: Get Your Blooio API Token\n1. Visit [https://blooio.com](https://blooio.com)\n2. Sign up for a dedicated instance\n3. Navigate to **Settings → API Keys**\n4. Generate a new token and **copy** it.\n\n> 🔐 Keep it safe! You’ll paste it in the HTTP Request node where it says `YOUR_API_TOKEN`.\n\n---\n\n### ✅ Step 2: Connect Blooio to This Workflow\nIn the **Send Message** node:\n- Replace the value of the `Authorization` header with:\n\n\n### ✅ Step 3: Test the Webhook\nSend an iMessage with a meal photo or description to your Blooio-connected number.\n\nThis will:\n- Trigger the `Receive Message (From Blooio)` webhook\n- Analyze the meal using AI\n- Return a nutrition breakdown with daily/weekly/monthly stats\n\n---\n\n### 📷 What You Can Send\n- Meal photos (ideal!)\n- Text descriptions of meals\n- Multiple items in one image\n\nEnjoy tracking your nutrition effortlessly! 🥦📊📩"
},
"typeVersion": 1
},
{
"id": "eb88206b-19c3-41cb-a409-2b924c780852",
"name": "스티커 메모5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1220,
-700
],
"parameters": {
"width": 680,
"height": 1040,
"content": "\n"
},
"typeVersion": 1
}
],
"pinData": {
"Receive Message (From Blooio)": [
{
"body": {
"type": "new-message",
"message": {
"readAt": null,
"sender": "+11111111111",
"sentAt": 1751234680604,
"content": "And a Diet Coke",
"delivered": true,
"messageId": "6409C11D-9C0B-404B-B2E3-052DA7C14D07",
"technology": "iMessage",
"attachments": [
{
"id": "E843680B-8F00-460C-A0AA-34B1B1DD9624",
"url": "https://bucket.blooio.com/custom-webhook-attachments/R3ZJISuC-t9CssQNM3i2J.jpeg",
"size": 979912,
"filename": "Pasta.jpeg",
"mimeType": "image/jpeg",
"expiresAt": "2025-07-29T22:04:42.432Z",
"expiresAtUnix": 1753826682432
}
],
"deliveredAt": null,
"selfMessage": false,
"conversation": {
"id": "iMessage;-;+11111111111",
"name": null,
"recipient": "+11111111111"
}
}
},
"query": {},
"params": {},
"headers": {
"host": "workflows.xx.com",
"cf-ray": "9578b8a804fa2f17-LAX",
"cdn-loop": "cloudflare; loops=1; subreqs=1",
"cf-ew-via": "15",
"cf-worker": "blooio.com",
"cf-visitor": "{\"scheme\":\"https\"}",
"cf-ipcountry": "US",
"content-type": "application/json",
"content-length": "622",
"accept-encoding": "gzip, br",
"x-forwarded-for": "162.158.91.171",
"cf-connecting-ip": "2a06:98c0:3600::103",
"x-forwarded-host": "workflows.xx.com",
"x-forwarded-proto": "https"
},
"webhookUrl": "https://workflows.xx.com/webhook/receive-event",
"executionMode": "production"
}
]
},
"connections": {
"f14e056e-2756-4ed9-8233-61fb4a86ee62": {
"main": [
[
{
"node": "e3bb4c52-b673-4d97-b9b5-e980349366ec",
"type": "main",
"index": 0
}
]
]
},
"b7a92947-9617-4639-8c1a-b80242bb3571": {
"main": [
[
{
"node": "274b2815-92bf-4a8a-bcd6-98fdb977dfa0",
"type": "main",
"index": 0
}
]
]
},
"4bd4284d-fafe-4aca-976e-c822a8170823": {
"main": [
[
{
"node": "334e086c-872b-4a75-8a33-aaec66ec3f02",
"type": "main",
"index": 0
}
]
]
},
"274b2815-92bf-4a8a-bcd6-98fdb977dfa0": {
"main": [
[
{
"node": "4bd4284d-fafe-4aca-976e-c822a8170823",
"type": "main",
"index": 0
}
]
]
},
"40a29005-81ce-4fea-9572-230d27a79894": {
"main": [
[
{
"node": "e3bb4c52-b673-4d97-b9b5-e980349366ec",
"type": "main",
"index": 0
}
]
]
},
"e3bb4c52-b673-4d97-b9b5-e980349366ec": {
"main": [
[
{
"node": "b7a92947-9617-4639-8c1a-b80242bb3571",
"type": "main",
"index": 0
}
],
[
{
"node": "40a29005-81ce-4fea-9572-230d27a79894",
"type": "main",
"index": 0
}
]
]
},
"79696185-e706-4c36-83c1-8f7294f5ec8b": {
"ai_languageModel": [
[
{
"node": "b7a92947-9617-4639-8c1a-b80242bb3571",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"ddc20f94-42a0-4227-ad11-afb0feb34db5": {
"ai_languageModel": [
[
{
"node": "4bd4284d-fafe-4aca-976e-c822a8170823",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"cc4c91c1-aacc-4a43-a530-5f902cb4274f": {
"ai_memory": [
[
{
"node": "b7a92947-9617-4639-8c1a-b80242bb3571",
"type": "ai_memory",
"index": 0
}
]
]
},
"21264d57-60f5-4594-b450-07662078b23e": {
"main": [
[
{
"node": "7b06c8a8-c330-45bc-a3a1-5dd1353b8603",
"type": "main",
"index": 0
}
]
]
},
"7b06c8a8-c330-45bc-a3a1-5dd1353b8603": {
"main": [
[
{
"node": "f14e056e-2756-4ed9-8233-61fb4a86ee62",
"type": "main",
"index": 0
}
],
[
{
"node": "b7a92947-9617-4639-8c1a-b80242bb3571",
"type": "main",
"index": 0
}
]
]
},
"3860f4f4-1af7-4951-a52c-3d7c7f07cb9a": {
"main": [
[
{
"node": "21264d57-60f5-4594-b450-07662078b23e",
"type": "main",
"index": 0
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 개인 생산성, AI 챗봇
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
타로 카드 점
GPT 및 Blooio 기반 iMessage 타로 점괘 시스템
If
Code
Webhook
+
If
Code
Webhook
19 노드David Harvey
기타
시각화 참조 라이브러리에서 n8n 노드를 탐색
可视化 참조 라이브러리에서 n8n 노드를 탐색
If
Ftp
Set
+
If
Ftp
Set
113 노드I versus AI
기타
반려동물 가게 4
🐶 펫 샵 예약 AI 대리자
If
Set
Code
+
If
Set
Code
187 노드Bruno Dias
인공지능
[템플릿] AI 반려동물 가게 v8
🐶 AI 펫 샵 어시스턴트 - GPT-4o, Google 캘린더 및 WhatsApp/Instagram/Facebook 통합
If
N8n
Set
+
If
N8n
Set
244 노드Amanda Benks
영업
AI 대리인 레스토랑 [템플릿]
🤖 WhatsApp, 인스타그램, 메신저의 AI 레스토랑 도우미
If
N8n
Set
+
If
N8n
Set
239 노드Amanda Benks
기타
배달 햄버거점 MVP
🤖 레스토랑과 배달 자동화의 AI 드라이브 WhatsApp 도우미
If
Set
Code
+
If
Set
Code
152 노드Bruno Dias