Générateur de recettes IA pour Telegram (à partir d'images ou de texte)

Avancé

Ceci est uncontenant 16 nœuds.Utilise principalement des nœuds comme If, Set, Telegram, Agent, TelegramTrigger. Utiliser GPT-4 Vision et Telegram pour générer des recettes à partir de photos de réfrigérateur

Prérequis
  • Token Bot Telegram

Catégorie

-
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "id": "t0pM31b82LN8h8EX",
  "meta": {
    "instanceId": "15d6057a37b8367f33882dd60593ee5f6cc0c59310ff1dc66b626d726083b48d",
    "templateCredsSetupCompleted": true
  },
  "name": "AI Recipe Generator for Telegram (from Image or Text)",
  "tags": [],
  "nodes": [
    {
      "id": "if_node_001",
      "name": "Vérifier le type d'entrée",
      "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": "Agent vision IA",
      "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": "Analyseur d'ingrédients",
      "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": "Formater les ingrédients",
      "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": "Obtenir les ingrédients texte",
      "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": "Générateur de recettes",
      "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": "Analyseur de recette",
      "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": "Formater la réponse",
      "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": "Envoyer un message texte",
      "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": "Note adhésive",
      "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": "Note adhésive1",
      "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": "Note adhésive2",
      "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": "Note adhésive3",
      "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
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Avancé

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Avancé
Nombre de nœuds16
Catégorie-
Types de nœuds8
Description de la difficulté

Adapté aux utilisateurs avancés, avec des workflows complexes contenant 16+ nœuds

Auteur
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.

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34