Telegram AIレシピジェネレーター(画像またはテキストから)

上級

これは自動化ワークフローで、16個のノードを含みます。主にIf, Set, Telegram, Agent, TelegramTriggerなどのノードを使用。 GPT-4 Vision と Telegram を使用して冷蔵庫の写真からレシピを生成

前提条件
  • Telegram Bot Token

カテゴリー

-
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
  "id": "t0pM31b82LN8h8EX",
  "meta": {
    "instanceId": "15d6057a37b8367f33882dd60593ee5f6cc0c59310ff1dc66b626d726083b48d",
    "templateCredsSetupCompleted": true
  },
  "name": "AI Recipe Generator for Telegram (from Image or Text)",
  "tags": [],
  "nodes": [
    {
      "id": "if_node_001",
      "name": "入力タイプの確認",
      "type": "n8n-nodes-base.if",
      "position": [
        400,
        -16
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "condition_001",
              "operator": {
                "type": "string",
                "operation": "notExists",
                "singleValue": true
              },
              "leftValue": "={{ $json.message.text }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "ai_agent_vision_001",
      "name": "AI Vision Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        704,
        -128
      ],
      "parameters": {
        "text": "=Please analyze this food image and identify all visible ingredients. List them clearly.\n\nImage URL: {{ $json.body.events[0].message.id }}",
        "options": {
          "systemMessage": "=You are a food ingredient identification expert. Analyze food images and identify all visible ingredients accurately. Return a structured list of ingredients."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2
    },
    {
      "id": "openai_vision_model_001",
      "name": "OpenAI Vision Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        672,
        16
      ],
      "parameters": {
        "model": "openai/gpt-4-vision-preview",
        "options": {
          "temperature": 0.3
        }
      },
      "credentials": {
        "openRouterApi": {
          "id": "D1q69WNrqGh2Tmie",
          "name": "OpenRouter 使える"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "output_parser_001",
      "name": "材料パーサー",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        896,
        16
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"ingredients\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"description\": \"List of identified ingredients\"\n    }\n  },\n  \"required\": [\"ingredients\"]\n}"
      },
      "typeVersion": 1.2
    },
    {
      "id": "set_ingredients_001",
      "name": "材料のフォーマット",
      "type": "n8n-nodes-base.set",
      "position": [
        1088,
        -128
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "assignment_001",
              "name": "ingredients_text",
              "type": "string",
              "value": "={{ $json.output.ingredients.join(', ') }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "set_text_ingredients_001",
      "name": "テキスト材料の取得",
      "type": "n8n-nodes-base.set",
      "position": [
        688,
        144
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "assignment_002",
              "name": "ingredients_text",
              "type": "string",
              "value": "={{ $json.message.text }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "recipe_generator_001",
      "name": "レシピジェネレーター",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1264,
        144
      ],
      "parameters": {
        "text": "=Based on these ingredients: {{ $json.ingredients_text }}\n\nPlease suggest 3 delicious recipes that can be made with these ingredients. Consider both Japanese and international cuisine options. Text is Japanese.",
        "options": {
          "systemMessage": "You are a professional chef and recipe expert. Create detailed, easy-to-follow recipes based on available ingredients. Include both traditional Japanese dishes and international cuisine. Always provide cooking time, difficulty level, and step-by-step instructions."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2
    },
    {
      "id": "openai_recipe_model_001",
      "name": "OpenAI Recipe Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        1264,
        320
      ],
      "parameters": {
        "model": "openai/gpt-4o-mini",
        "options": {
          "temperature": 0.7
        }
      },
      "credentials": {
        "openRouterApi": {
          "id": "D1q69WNrqGh2Tmie",
          "name": "OpenRouter 使える"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "recipe_parser_001",
      "name": "レシピパーサー",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1456,
        320
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"recipes\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n            \"description\": \"Recipe name\"\n          },\n          \"cuisine\": {\n            \"type\": \"string\",\n            \"description\": \"Cuisine type (e.g., Japanese, Italian)\"\n          },\n          \"difficulty\": {\n            \"type\": \"string\",\n            \"description\": \"Difficulty level (Easy, Medium, Hard)\"\n          },\n          \"cookingTime\": {\n            \"type\": \"string\",\n            \"description\": \"Total cooking time\"\n          },\n          \"servings\": {\n            \"type\": \"number\",\n            \"description\": \"Number of servings\"\n          },\n          \"ingredients\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"description\": \"Full ingredient list with quantities\"\n          },\n          \"instructions\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"description\": \"Step-by-step cooking instructions\"\n          }\n        },\n        \"required\": [\"name\", \"cuisine\", \"difficulty\", \"cookingTime\", \"servings\", \"ingredients\", \"instructions\"]\n      },\n      \"description\": \"Array of recipe suggestions\"\n    }\n  },\n  \"required\": [\"recipes\"]\n}"
      },
      "typeVersion": 1.2
    },
    {
      "id": "format_response_001",
      "name": "レスポンスのフォーマット",
      "type": "n8n-nodes-base.set",
      "position": [
        1680,
        144
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "response_004",
              "name": "message",
              "type": "string",
              "value": "={{\n(() => {\n  return $json.output.recipes.map((r, index) => {\n    return (\n      `📖 レシピ${index + 1}:${r.name}\\n` +\n      `🌐 ジャンル:${r.cuisine}\\n` +\n      `⏱ 調理時間:${r.cookingTime}\\n` +\n      `🎚 難易度:${r.difficulty}\\n` +\n      `👥 目安人数:${r.servings}人分\\n\\n` +\n      `🛒 材料:\\n${r.ingredients.map(i => `- ${i}`).join(\"\\n\")}\\n\\n` +\n      `👣 手順:\\n${r.instructions.map((step, i) => `${i + 1}. ${step}`).join(\"\\n\")}`\n    );\n  }).join(\"\\n\\n------------------------\\n\\n\");\n})()\n}}\n"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "684b387e-b22d-47a2-8db3-5367850fa33d",
      "name": "Telegram Trigger",
      "type": "n8n-nodes-base.telegramTrigger",
      "position": [
        176,
        -16
      ],
      "webhookId": "76cdce48-d78e-40cd-b034-a0cf3ed053be",
      "parameters": {
        "updates": [
          "message"
        ],
        "additionalFields": {
          "download": true
        }
      },
      "credentials": {
        "telegramApi": {
          "id": "Ikb8BOl71y5C8wqu",
          "name": "Telegram account"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "812b9b19-c320-4a6b-a28f-7bf80a7863bd",
      "name": "テキストメッセージを送信",
      "type": "n8n-nodes-base.telegram",
      "position": [
        1872,
        144
      ],
      "webhookId": "fc292b17-c612-4a76-9ad7-c4e1f62cb6e5",
      "parameters": {
        "text": "={{ $json.message }}",
        "chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "id": "Ikb8BOl71y5C8wqu",
          "name": "Telegram account"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "a9e0f1b2-c3d4-e5f6-a7b8-c9d0e1f2a3b4",
      "name": "付箋",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        160,
        -320
      ],
      "parameters": {
        "color": 6,
        "width": 500,
        "height": 260,
        "content": "### Phase 1: User Input via Telegram\n\n-   **Telegram Trigger**: Starts the workflow when a user sends a message or image.\n\n-   **Check Input Type**: This crucial IF node checks if the message contains text. If not, it assumes an image was sent and routes the flow to the Vision AI path. This allows the workflow to handle both input types."
      },
      "typeVersion": 1
    },
    {
      "id": "b1c2d3e4-f5a6-b7c8-d9e0-f1a2b3c4d5e6",
      "name": "付箋1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        624,
        -448
      ],
      "parameters": {
        "color": 3,
        "width": 500,
        "height": 380,
        "content": "### Phase 2: Ingredient Extraction (Dual Path)\nThis section's goal is to create a standardized list of ingredients for the next phase.\n\n-   **Image Path (Top)**: The `AI Vision Agent` analyzes the photo to identify ingredients. The `Ingredient Parser` then structures this into a clean list, and `Format Ingredients` converts it to a comma-separated string.\n\n-   **Text Path (Bottom)**: The `Get Text Ingredients` node simply takes the user's text directly."
      },
      "typeVersion": 1
    },
    {
      "id": "c3d4e5f6-a7b8-c9d0-e1f2-a3b4c5d6e7f8",
      "name": "付箋2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1216,
        -192
      ],
      "parameters": {
        "color": 5,
        "width": 500,
        "height": 360,
        "content": "### Phase 3: AI Recipe Generation\n\n-   **Recipe Generator**: This is the main creative AI. It takes the standardized ingredient list (from either path) and acts as a professional chef to generate 3 detailed recipes.\n\n-   **Recipe Parser**: This is critical for reliability. It forces the AI's creative output into a structured JSON format (name, difficulty, instructions, etc.). This ensures the data is clean and predictable for the final formatting step."
      },
      "typeVersion": 1
    },
    {
      "id": "d5e6f7a8-b9c0-d1e2-f3a4-b5c6d7e8f9a0",
      "name": "付箋3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1648,
        -128
      ],
      "parameters": {
        "color": 4,
        "width": 500,
        "height": 280,
        "content": "### Phase 4: Format & Send Response\n\n-   **Format Response**: This node uses a JavaScript expression to transform the structured recipe JSON from the parser into a beautiful, emoji-rich, and easy-to-read message for the user.\n\n-   **Send a text message**: The final, formatted text is sent back to the user on Telegram."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "timezone": "Asia/Tokyo",
    "errorWorkflow": "",
    "executionOrder": "v1",
    "saveManualExecutions": true,
    "saveExecutionProgress": true,
    "saveDataErrorExecution": "all",
    "saveDataSuccessExecution": "all"
  },
  "versionId": "30c406be-b5d8-4ba8-873f-8ae990fdbcb9",
  "connections": {
    "recipe_parser_001": {
      "ai_outputParser": [
        [
          {
            "node": "recipe_generator_001",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "ai_agent_vision_001": {
      "main": [
        [
          {
            "node": "set_ingredients_001",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "format_response_001": {
      "main": [
        [
          {
            "node": "812b9b19-c320-4a6b-a28f-7bf80a7863bd",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "if_node_001": {
      "main": [
        [
          {
            "node": "ai_agent_vision_001",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "set_text_ingredients_001",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "recipe_generator_001": {
      "main": [
        [
          {
            "node": "format_response_001",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "684b387e-b22d-47a2-8db3-5367850fa33d": {
      "main": [
        [
          {
            "node": "if_node_001",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "output_parser_001": {
      "ai_outputParser": [
        [
          {
            "node": "ai_agent_vision_001",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "set_ingredients_001": {
      "main": [
        [
          {
            "node": "recipe_generator_001",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "openai_recipe_model_001": {
      "ai_languageModel": [
        [
          {
            "node": "recipe_generator_001",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "openai_vision_model_001": {
      "ai_languageModel": [
        [
          {
            "node": "ai_agent_vision_001",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "set_text_ingredients_001": {
      "main": [
        [
          {
            "node": "recipe_generator_001",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
よくある質問

このワークフローの使い方は?

上記のJSON設定コードをコピーし、n8nインスタンスで新しいワークフローを作成して「JSONからインポート」を選択、設定を貼り付けて認証情報を必要に応じて変更してください。

このワークフローはどんな場面に適していますか?

上級

有料ですか?

このワークフローは完全無料です。ただし、ワークフローで使用するサードパーティサービス(OpenAI APIなど)は別途料金が発生する場合があります。

ワークフロー情報
難易度
上級
ノード数16
カテゴリー-
ノードタイプ8
難易度説明

上級者向け、16ノード以上の複雑なワークフロー

作成者
YUSUKE YAMAMOTO

YUSUKE YAMAMOTO

@yusuke-yamamoto

Business creator from Tokyo. Designing AI-driven automations that enhance marketing, reporting, and daily operations. I turn complex workflows into simple, elegant automations with n8n.

外部リンク
n8n.ioで表示

このワークフローを共有

カテゴリー

カテゴリー: 34