Telegram-KI-Rezept-Generator (aus Bildern oder Text)
Dies ist ein Automatisierungsworkflow mit 16 Nodes. Hauptsächlich werden If, Set, Telegram, Agent, TelegramTrigger und andere Nodes verwendet. Rezepte aus Kühlschrankfotos mit GPT-4 Vision und Telegram generieren
- •Telegram Bot Token
Verwendete Nodes (16)
Kategorie
{
"id": "t0pM31b82LN8h8EX",
"meta": {
"instanceId": "15d6057a37b8367f33882dd60593ee5f6cc0c59310ff1dc66b626d726083b48d",
"templateCredsSetupCompleted": true
},
"name": "AI Recipe Generator for Telegram (from Image or Text)",
"tags": [],
"nodes": [
{
"id": "if_node_001",
"name": "Eingabetyp prüfen",
"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": "KI-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-Modell",
"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": "Zutatenparser",
"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": "Zutaten formatieren",
"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": "Textzutaten abrufen",
"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": "Rezeptgenerator",
"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 Rezeptmodell",
"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": "Rezeptparser",
"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": "Antwort formatieren",
"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": "Textnachricht senden",
"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": "Notizzettel",
"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": "Notizzettel1",
"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": "Notizzettel2",
"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": "Notizzettel3",
"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
}
]
]
}
}
}Wie verwende ich diesen Workflow?
Kopieren Sie den obigen JSON-Code, erstellen Sie einen neuen Workflow in Ihrer n8n-Instanz und wählen Sie "Aus JSON importieren". Fügen Sie die Konfiguration ein und passen Sie die Anmeldedaten nach Bedarf an.
Für welche Szenarien ist dieser Workflow geeignet?
Experte
Ist es kostenpflichtig?
Dieser Workflow ist völlig kostenlos. Beachten Sie jedoch, dass Drittanbieterdienste (wie OpenAI API), die im Workflow verwendet werden, möglicherweise kostenpflichtig sind.
Verwandte Workflows
YUSUKE YAMAMOTO
@yusuke-yamamotoBusiness creator from Tokyo. Designing AI-driven automations that enhance marketing, reporting, and daily operations. I turn complex workflows into simple, elegant automations with n8n.
Diesen Workflow teilen