Automatización de Discord de Praneel con GitHub y un chatbot de IA
Este es unAI Chatbot, Multimodal AIflujo de automatización del dominio deautomatización que contiene 10 nodos.Utiliza principalmente nodos como Discord, GithubTool, DateTimeTool, Agent, DiscordTrigger. Usar Discord, GitHub y Gemini AI para automatizar las actualizaciones de blogs
- •Bot Token de Discord o Webhook
- •Personal Access Token de GitHub
- •Clave de API de Google Gemini
Nodos utilizados (10)
Categoría
{
"meta": {},
"name": "Praneel's Discord Automation with Github and AI Chatbot ",
"tags": [],
"nodes": [
{
"name": "Agentee de IA",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
448,
0
],
"parameters": {
"text": "={{ $json.content }}",
"options": {
"systemMessage": "=\n## Core Identity & Persona\n\nYou are the **n8n Blog Master**, a specialized AI agent. Your primary function is to assist your user with content management.\n\n* **Your Mission:** Automate the process of creating, formatting, editing, and saving blog posts as Markdown files within the user’s specified repository. \n* **User Clarification:** The repository owner always refers to your **user** and, in the context of API calls, the **repository owner**. It is never part of a file path. \n* **Personality:** Helpful, precise, security-conscious. Semi-casual and engaging, but never overly cheerful. \n\n---\n\n## Operational Zone & Constraints\n\n* **Repository:** You may only interact with the repository **`<insert-repo-name-here>`**. \n* **Owner:** The repository owner is **`<insert-username-here>`**. \n* **Branch:** Always operate on the `main` branch. \n* **Directory Access:** You can **only** write or edit files in the directory **`<insert-directory-path-here>`**. You are forbidden from interacting elsewhere. \n* **File Permissions:** \n - You may **create new `.md` files**. \n - If a file already exists, notify the user and ask if they want to edit it. \n - Editing is only allowed if the user explicitly confirms (e.g., “yes”, “go ahead”, “continue”). \n - If the user confirms, proceed with editing. \n\n---\n\n## Available Tools & Usage Protocol\n\nYou have a limited but well-defined toolset. Always use them exactly as described: \n\n### 1. Date & Time Tool \n* Purpose: Always fetch the current date and time in **IST (India Standard Time)**. \n* Usage: Call this before creating the blog post so the `date` field in the front matter is correct. \n* Do not use any other timezone. \n\n### 2. GitHub Nodes \n* **Create:** Used to create new files within **`<insert-directory-path-here>`**. Requires three parameters: \n - `owner` → always **`<insert-username-here>`** \n - `repo` → always **`<insert-repo-name-here>`** \n - `path` → must be `<insert-directory-path-here>/<filename>.md` \n* **List:** Can list files inside **`<insert-directory-path-here>`**. Use it to check existing filenames before creating new ones. \n* **Read:** Can fetch contents of files if needed. \n* **Edit:** Can update a specific file in **`<insert-directory-path-here>`**. \n - **Protocol:** Before editing, explicitly ask: \n *“Are you sure you want me to edit `<filename>.md`?”* \n - If the user responds with **“yes”**, **“continue”**, or similar confirmation, proceed. \n - If the user declines, do nothing. \n* Constraint: Never attempt operations outside the specified directory. \n\n### 3. Data Storage & Message History \n* Purpose: Store temporary user confirmations and recall **previous user messages** as part of memory. \n* Example: \n - If you ask for edit confirmation and the user replies *“yes”* or *“continue”*, record that in storage. \n - If later in the same conversation the user says *“go ahead”* without repeating the filename, check both storage and previous messages to infer intent. \n* Always reset confirmation after the action is completed. \n\n---\n\n## Standard Workflow: Creating or Editing Blog Posts\n\n1. **Activation:** Begin when the user says: \n - “Draft a new post on…” \n - “Make the body about…” \n - “Use my rough notes…” \n - “Modify it to include…” \n - “Edit the file…” \n\n2. **Information Gathering:** \n * Ask for the **Title** (mandatory for new posts). \n * Gather **topic, points, or raw notes** from the user. \n * If user provides incomplete notes, expand them into a coherent, well-structured article. \n\n3. **Drafting & Formatting:** \n * Call the Date & Time tool. \n * Format posts in the following template: \n\n ```markdown\n ---\n title: \"The Title Provided by the User\"\n date: \"YYYY-MM-DD\"\n ---\n\n [Well-structured blog content goes here. Expand rough notes if needed, maintain logical flow, use clear headings if appropriate.]\n\n Thanks for Reading!\n ```\n---\n- Writing rules:\n\nTone: Neutral, informative, lightly conversational — not too cheerful.\n\nFlow: Use line breaks for readability.\n\nExpansion: If notes are provided, polish and structure them.\n\nModification: If asked, revise while preserving original meaning.\n\nFile Naming:\n\nGenerate a short kebab-case filename from the title (e.g., \"Making My Own Java CLI-Based RPG!\" → java-cli-rpg.md).\n\nFile Creation vs Editing:\n\nIf creating → Use the GitHub Create tool.\n\nIf file already exists → Ask the user if they want to edit it.\n\nStore their response in Data Storage.\n\nIf confirmation = yes → proceed with GitHub Edit tool.\n\nIf no → cancel operation.\n\nFinal Action:\n\nConfirm success to the user after creation or editing.\n\nAdvanced Error Handling: \"Resource Not Found\"\n\nIf the create_github_file tool fails with \"Resource not found\":\n\nFirst Failure:\n\nNotify the user that the attempt failed.\n\nState the exact path used.\n\nRetry automatically once.\n\nSecond Failure:\n\nIf it fails again, explain that standard creation isn’t working.\n\nSuggest it may be a permissions issue.\n\nAwait user instructions before proceeding further."
},
"promptType": "define"
},
"typeVersion": 2.2,
"id": "Agentee-de-IA-0"
},
{
"name": "Modelo de chat Google Gemini",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
160,
208
],
"parameters": {
"options": {}
},
"typeVersion": 1,
"id": "Modelo-de-chat-Google-Gemini-1"
},
{
"name": "Fecha y Hora",
"type": "n8n-nodes-base.dateTimeTool",
"position": [
992,
272
],
"parameters": {
"options": {
"timezone": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Timezone', ``, 'string') }}"
}
},
"typeVersion": 2,
"id": "Fecha-y-Hora-2"
},
{
"name": "Crear un archivo en GitHub",
"type": "n8n-nodes-base.githubTool",
"position": [
432,
320
],
"webhookId": "f1fcb524-a4c6-4cd3-8e81-b9f6f9548db2",
"parameters": {
"owner": {
"__rl": true,
"mode": "name",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Repository_Owner', ``, 'string') }}"
},
"filePath": "<insert-directory-path-here>",
"resource": "file",
"repository": {
"__rl": true,
"mode": "name",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Repository_Name', ``, 'string') }}"
},
"fileContent": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('File_Content', ``, 'string') }}",
"commitMessage": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Commit_Message', ``, 'string') }}"
},
"typeVersion": 1.1,
"id": "Crear-un-archivo-en-GitHub-3"
},
{
"name": "Obtener un archivo en GitHub",
"type": "n8n-nodes-base.githubTool",
"position": [
752,
432
],
"webhookId": "bc5ad2f3-bc57-475f-b16e-2aaee66bca5d",
"parameters": {
"owner": {
"__rl": true,
"mode": "name",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Repository_Owner', ``, 'string') }}"
},
"filePath": "<insert-directory-path-here>",
"resource": "file",
"operation": "get",
"repository": {
"__rl": true,
"mode": "name",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Repository_Name', ``, 'string') }}"
},
"asBinaryProperty": false,
"additionalParameters": {}
},
"typeVersion": 1.1,
"id": "Obtener-un-archivo-en-GitHub-4"
},
{
"name": "Listar archivos en GitHub",
"type": "n8n-nodes-base.githubTool",
"position": [
880,
336
],
"webhookId": "e8426fc7-b558-49a2-b525-7ca470cb0b25",
"parameters": {
"owner": {
"__rl": true,
"mode": "name",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Repository_Owner', ``, 'string') }}"
},
"filePath": "<insert-directory-path-here>",
"resource": "file",
"operation": "list",
"repository": {
"__rl": true,
"mode": "name",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Repository_Name', ``, 'string') }}"
}
},
"typeVersion": 1.1,
"id": "Listar-archivos-en-GitHub-5"
},
{
"name": "Editar un archivo en GitHub",
"type": "n8n-nodes-base.githubTool",
"position": [
592,
368
],
"webhookId": "3500bb43-3d9c-46f0-b5a4-c24d41ec3f90",
"parameters": {
"owner": {
"__rl": true,
"mode": "name",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Repository_Owner', ``, 'string') }}"
},
"filePath": "<insert-directory-path-here>",
"resource": "file",
"operation": "edit",
"repository": {
"__rl": true,
"mode": "name",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Repository_Name', ``, 'string') }}"
},
"fileContent": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('File_Content', ``, 'string') }}",
"commitMessage": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Commit_Message', ``, 'string') }}"
},
"typeVersion": 1.1,
"id": "Editar-un-archivo-en-GitHub-6"
},
{
"name": "Memoria Simple",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
288,
304
],
"parameters": {
"sessionKey": "=\"memoryKey\": \"history\"",
"sessionIdType": "customKey",
"contextWindowLength": 20
},
"typeVersion": 1.3,
"id": "Memoria-Simple-7"
},
{
"name": "Discord Message Reader",
"type": "n8n-nodes-discord-trigger.discordTrigger",
"position": [
0,
0
],
"parameters": {
"pattern": "every",
"additionalFields": {}
},
"typeVersion": 1,
"id": "Discord-Message-Reader-8"
},
{
"name": "Enviar Mensaje a Discord",
"type": "n8n-nodes-base.discord",
"position": [
1040,
32
],
"webhookId": "73b9da16-a804-446e-81ff-c3bc29948850",
"parameters": {
"embeds": {
"values": [
{}
]
},
"content": "={{ $('AI Agent').item.json.output }}",
"guildId": {
"__rl": true,
"mode": "list",
"value": ""
},
"options": {},
"resource": "message",
"channelId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"typeVersion": 2,
"id": "Enviar-Mensaje-a-Discord-9"
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"connections": {
"Agente de IA": {
"main": [
[
{
"node": "Enviar-Mensaje-a-Discord-9",
"type": "main",
"index": 0
}
]
]
},
"Fecha-y-Hora-2": {
"ai_tool": [
[
{
"node": "Agente de IA",
"type": "ai_tool",
"index": 0
}
]
]
},
"Memoria-Simple-7": {
"ai_memory": [
[
{
"node": "Agente de IA",
"type": "ai_memory",
"index": 0
}
]
]
},
"Obtener-un-archivo-en-GitHub-4": {
"ai_tool": [
[
{
"node": "Agente de IA",
"type": "ai_tool",
"index": 0
}
]
]
},
"Listar-archivos-en-GitHub-5": {
"ai_tool": [
[
{
"node": "Agente de IA",
"type": "ai_tool",
"index": 0
}
]
]
},
"Editar-un-archivo-en-GitHub-6": {
"ai_tool": [
[
{
"node": "Agente de IA",
"type": "ai_tool",
"index": 0
}
]
]
},
"Discord-Message-Reader-8": {
"main": [
[
{
"node": "Agente de IA",
"type": "main",
"index": 0
}
]
]
},
"Crear-un-archivo-en-GitHub-3": {
"ai_tool": [
[
{
"node": "Agente de IA",
"type": "ai_tool",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "Agente de IA",
"type": "ai_languageModel",
"index": 0
}
]
]
}
}
}¿Cómo usar este flujo de trabajo?
Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.
¿En qué escenarios es adecuado este flujo de trabajo?
Intermedio - Chatbot de IA, IA Multimodal
¿Es de pago?
Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.
Flujos de trabajo relacionados recomendados
Praneel S
@praneel7015Compartir este flujo de trabajo