Mi Flujo de Trabajo 2
Este es unMarket Research, AI Summarizationflujo de automatización del dominio deautomatización que contiene 18 nodos.Utiliza principalmente nodos como Code, GoogleSheets, ScheduleTrigger, ScrapegraphAi. Análisis de brechas de contenido impulsado por IA, utilizando ScrapeGraphAI y planificación estratégica
- •Credenciales de API de Google Sheets
Nodos utilizados (18)
{
"id": "VhEwspDqzu7ssFVE",
"meta": {
"instanceId": "f4b0efaa33080e7774e0d9285c40c7abcd2c6f7cf1a8b901fa7106170dd4cda3",
"templateCredsSetupCompleted": true
},
"name": "My workflow 2",
"tags": [
{
"id": "DxXGubfBzRKh6L8T",
"name": "Revenue Optimization",
"createdAt": "2025-07-25T16:24:30.370Z",
"updatedAt": "2025-07-25T16:24:30.370Z"
},
{
"id": "IxkcJ2IpYIxivoHV",
"name": "Content Strategy",
"createdAt": "2025-07-25T12:57:37.677Z",
"updatedAt": "2025-07-25T12:57:37.677Z"
},
{
"id": "PAKIJ2Mm9EvRcR3u",
"name": "Trend Monitoring",
"createdAt": "2025-07-25T12:57:37.670Z",
"updatedAt": "2025-07-25T12:57:37.670Z"
},
{
"id": "YtfXmaZk44MYedPO",
"name": "Dynamic Pricing",
"createdAt": "2025-07-25T16:24:30.369Z",
"updatedAt": "2025-07-25T16:24:30.369Z"
},
{
"id": "wJ30mjhtrposO8Qt",
"name": "Simple RAG",
"createdAt": "2025-07-28T12:55:14.424Z",
"updatedAt": "2025-07-28T12:55:14.424Z"
}
],
"nodes": [
{
"id": "41f5943e-f4dd-4ceb-8fbd-ee3dd389dc00",
"name": "Activador de Análisis de Contenido Semanal",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-1888,
608
],
"parameters": {
"rule": {
"interval": [
{
"field": "weeks"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "b06d07a3-43a3-4dbb-9fdf-d56425993d08",
"name": "Rastreador de Contenido Competitivo con IA",
"type": "n8n-nodes-scrapegraphai.scrapegraphAi",
"position": [
-1392,
752
],
"parameters": {
"userPrompt": "Analyze all the content on this website and extract comprehensive information about each article. Use this schema: { \"articles\": [{ \"title\": \"Article Title\", \"url\": \"https://competitor.com/article-url\", \"publish_date\": \"2024-01-15\", \"author\": \"Author Name\", \"word_count\": \"1500\", \"main_topic\": \"Primary topic\", \"keywords\": [\"keyword1\", \"keyword2\", \"keyword3\"], \"content_type\": \"blog post\", \"categories\": [\"category1\", \"category2\"], \"meta_description\": \"Article description\", \"headings\": [\"H1 title\", \"H2 subtitle1\", \"H2 subtitle2\"], \"social_shares\": \"150\", \"engagement_metrics\": \"high\" }] }",
"websiteUrl": "https://competitor1.com/blog"
},
"typeVersion": 1
},
{
"id": "cca541bd-729a-482c-a464-1a31449d78ff",
"name": "Rastreador Secundario de Contenido Competitivo",
"type": "n8n-nodes-scrapegraphai.scrapegraphAi",
"position": [
-1392,
960
],
"parameters": {
"userPrompt": "Extract all content pieces from this competitor website including blog posts, guides, whitepapers, case studies, and resources. Return data using this format: { \"content_pieces\": [{ \"title\": \"Content Title\", \"url\": \"https://example.com/content\", \"content_format\": \"blog post\", \"topic_cluster\": \"Main topic area\", \"target_keywords\": [\"primary keyword\", \"secondary keyword\"], \"difficulty_level\": \"beginner\", \"content_length\": \"2000 words\", \"publication_date\": \"2024-02-01\", \"performance_indicators\": \"high engagement\" }] }",
"websiteUrl": "https://competitor2.com/resources"
},
"typeVersion": 1
},
{
"id": "c2f95dba-233b-4fe5-bbd7-d9718766bcd4",
"name": "Fusionador y Procesador de Datos Competitivos",
"type": "n8n-nodes-base.code",
"notes": "Merges competitor data\nand analyzes content\npatterns and trends",
"position": [
-800,
784
],
"parameters": {
"jsCode": "// Merge data from multiple competitor scrapers\nconst competitor1Data = $input.first().json;\nconst competitor2Data = $input.last().json;\n\n// Extract articles from both competitors\nconst competitor1Articles = competitor1Data.result?.articles || [];\nconst competitor2Content = competitor2Data.result?.content_pieces || [];\n\n// Normalize data structure for consistent processing\nconst normalizeContent = (content, source) => {\n return {\n title: content.title,\n url: content.url,\n publish_date: content.publish_date || content.publication_date,\n author: content.author || 'Unknown',\n word_count: parseInt(content.word_count || content.content_length) || 0,\n main_topic: content.main_topic || content.topic_cluster,\n keywords: content.keywords || content.target_keywords || [],\n content_type: content.content_type || content.content_format,\n categories: content.categories || [content.topic_cluster],\n meta_description: content.meta_description || '',\n headings: content.headings || [],\n social_shares: parseInt(content.social_shares) || 0,\n engagement_metrics: content.engagement_metrics || content.performance_indicators,\n competitor_source: source,\n analyzed_date: new Date().toISOString().split('T')[0]\n };\n};\n\n// Normalize all content\nconst allContent = [\n ...competitor1Articles.map(article => normalizeContent(article, 'competitor1')),\n ...competitor2Content.map(content => normalizeContent(content, 'competitor2'))\n];\n\n// Group content by main topics to identify clusters\nconst topicClusters = {};\nallContent.forEach(content => {\n const topic = content.main_topic?.toLowerCase() || 'uncategorized';\n if (!topicClusters[topic]) {\n topicClusters[topic] = [];\n }\n topicClusters[topic].push(content);\n});\n\n// Analyze keyword frequency across all content\nconst keywordFrequency = {};\nallContent.forEach(content => {\n content.keywords.forEach(keyword => {\n const normalizedKeyword = keyword?.toLowerCase();\n if (normalizedKeyword) {\n keywordFrequency[normalizedKeyword] = (keywordFrequency[normalizedKeyword] || 0) + 1;\n }\n });\n});\n\n// Return processed data for gap analysis\nreturn [{\n json: {\n total_content_analyzed: allContent.length,\n competitor_sources: ['competitor1', 'competitor2'],\n topic_clusters: Object.keys(topicClusters).map(topic => ({\n topic_name: topic,\n content_count: topicClusters[topic].length,\n avg_word_count: Math.round(topicClusters[topic].reduce((sum, content) => sum + content.word_count, 0) / topicClusters[topic].length),\n top_keywords: topicClusters[topic].flatMap(c => c.keywords).slice(0, 10)\n })),\n trending_keywords: Object.entries(keywordFrequency)\n .sort(([,a], [,b]) => b - a)\n .slice(0, 20)\n .map(([keyword, frequency]) => ({ keyword, frequency })),\n content_formats: [...new Set(allContent.map(c => c.content_type))],\n all_content: allContent,\n analysis_summary: {\n most_covered_topics: Object.entries(topicClusters).sort(([,a], [,b]) => b.length - a.length).slice(0, 5).map(([topic, content]) => ({ topic, count: content.length })),\n average_content_length: Math.round(allContent.reduce((sum, content) => sum + content.word_count, 0) / allContent.length),\n content_types_distribution: allContent.reduce((acc, content) => {\n acc[content.content_type] = (acc[content.content_type] || 0) + 1;\n return acc;\n }, {})\n }\n }\n}];"
},
"notesInFlow": true,
"typeVersion": 2
},
{
"id": "c83f6b26-eb8a-465d-8baf-4e5e9881a1d4",
"name": "Analizador de Nuestra Biblioteca de Contenido",
"type": "n8n-nodes-scrapegraphai.scrapegraphAi",
"position": [
-1392,
544
],
"parameters": {
"userPrompt": "Analyze our existing content library and extract detailed information about each piece. Use this schema: { \"our_content\": [{ \"title\": \"Our Article Title\", \"url\": \"https://yourbrand.com/article\", \"publish_date\": \"2024-01-10\", \"main_topic\": \"Topic area\", \"keywords\": [\"our keyword1\", \"our keyword2\"], \"content_type\": \"blog post\", \"word_count\": \"1200\", \"performance_metrics\": { \"page_views\": \"5000\", \"social_shares\": \"75\", \"engagement_rate\": \"3.2%\" }, \"target_audience\": \"beginners\", \"content_pillars\": [\"pillar1\", \"pillar2\"] }] }",
"websiteUrl": "https://yourbrand.com/blog"
},
"typeVersion": 1
},
{
"id": "25a9cdde-6fd0-4531-a973-f8a77706e0fb",
"name": "Identificador Avanzado de Brechas de Contenido",
"type": "n8n-nodes-base.code",
"notes": "Identifies content gaps\nusing advanced algorithms\nand scoring systems",
"position": [
-176,
704
],
"parameters": {
"jsCode": "// Advanced Content Gap Analysis Algorithm\nconst competitorData = $input.first().json;\nconst ourContentData = $input.last().json;\n\n// Extract our content data\nconst ourContent = ourContentData.result?.our_content || [];\nconst competitorContent = competitorData.all_content || [];\n\n// Create comprehensive topic and keyword maps\nconst ourTopics = new Set(ourContent.map(c => c.main_topic?.toLowerCase()).filter(Boolean));\nconst ourKeywords = new Set(ourContent.flatMap(c => c.keywords || []).map(k => k?.toLowerCase()).filter(Boolean));\n\nconst competitorTopics = new Set(competitorContent.map(c => c.main_topic?.toLowerCase()).filter(Boolean));\nconst competitorKeywords = new Set(competitorContent.flatMap(c => c.keywords || []).map(k => k?.toLowerCase()).filter(Boolean));\n\n// Identify content gaps\nconst topicGaps = [...competitorTopics].filter(topic => !ourTopics.has(topic));\nconst keywordGaps = [...competitorKeywords].filter(keyword => !ourKeywords.has(keyword));\n\n// Analyze competitor content performance patterns\nconst highPerformingContent = competitorContent.filter(content => {\n const socialShares = parseInt(content.social_shares) || 0;\n const wordCount = parseInt(content.word_count) || 0;\n return socialShares > 100 || wordCount > 1500 || content.engagement_metrics === 'high';\n});\n\n// Identify content format gaps\nconst ourFormats = new Set(ourContent.map(c => c.content_type).filter(Boolean));\nconst competitorFormats = new Set(competitorContent.map(c => c.content_type).filter(Boolean));\nconst formatGaps = [...competitorFormats].filter(format => !ourFormats.has(format));\n\n// Calculate content opportunity scores\nconst contentOpportunities = topicGaps.map(topic => {\n const relatedCompetitorContent = competitorContent.filter(c => c.main_topic?.toLowerCase() === topic);\n const avgWordCount = relatedCompetitorContent.reduce((sum, c) => sum + (parseInt(c.word_count) || 0), 0) / relatedCompetitorContent.length || 0;\n const totalSocialShares = relatedCompetitorContent.reduce((sum, c) => sum + (parseInt(c.social_shares) || 0), 0);\n const contentCount = relatedCompetitorContent.length;\n \n // Opportunity scoring algorithm\n let opportunityScore = 0;\n opportunityScore += Math.min(contentCount * 10, 50); // Content volume (max 50 points)\n opportunityScore += Math.min(totalSocialShares / 10, 30); // Social engagement (max 30 points)\n opportunityScore += avgWordCount > 1000 ? 20 : 10; // Content depth (10-20 points)\n \n return {\n topic,\n opportunity_score: Math.round(opportunityScore),\n competitor_content_count: contentCount,\n avg_word_count: Math.round(avgWordCount),\n total_social_engagement: totalSocialShares,\n priority: opportunityScore > 70 ? 'High' : opportunityScore > 40 ? 'Medium' : 'Low',\n suggested_content_types: [...new Set(relatedCompetitorContent.map(c => c.content_type))],\n top_keywords: relatedCompetitorContent.flatMap(c => c.keywords || []).slice(0, 5)\n };\n}).sort((a, b) => b.opportunity_score - a.opportunity_score);\n\n// Generate keyword-specific opportunities\nconst keywordOpportunities = keywordGaps.slice(0, 50).map(keyword => {\n const relatedContent = competitorContent.filter(c => \n c.keywords?.some(k => k?.toLowerCase() === keyword)\n );\n \n return {\n keyword,\n frequency: relatedContent.length,\n avg_word_count: Math.round(relatedContent.reduce((sum, c) => sum + (parseInt(c.word_count) || 0), 0) / relatedContent.length) || 0,\n content_types: [...new Set(relatedContent.map(c => c.content_type))],\n related_topics: [...new Set(relatedContent.map(c => c.main_topic))]\n };\n}).filter(opp => opp.frequency > 0).sort((a, b) => b.frequency - a.frequency);\n\nreturn [{\n json: {\n gap_analysis_summary: {\n total_topic_gaps: topicGaps.length,\n total_keyword_gaps: keywordGaps.length,\n total_format_gaps: formatGaps.length,\n high_priority_opportunities: contentOpportunities.filter(o => o.priority === 'High').length,\n analysis_date: new Date().toISOString().split('T')[0]\n },\n content_opportunities: contentOpportunities.slice(0, 20), // Top 20 opportunities\n keyword_opportunities: keywordOpportunities.slice(0, 30), // Top 30 keyword gaps\n format_gaps: formatGaps,\n competitor_insights: {\n most_successful_topics: competitorData.analysis_summary?.most_covered_topics || [],\n trending_keywords: competitorData.trending_keywords?.slice(0, 15) || [],\n content_formats: competitorData.content_formats || []\n },\n our_content_analysis: {\n total_content_pieces: ourContent.length,\n our_topics: [...ourTopics],\n our_keywords_count: ourKeywords.size,\n our_formats: [...ourFormats]\n },\n recommendations: {\n immediate_actions: contentOpportunities.filter(o => o.priority === 'High').slice(0, 5),\n content_format_expansion: formatGaps.slice(0, 3),\n keyword_targeting: keywordOpportunities.slice(0, 10)\n }\n }\n}];"
},
"notesInFlow": true,
"typeVersion": 2
},
{
"id": "a1d27f70-648f-4fb5-a02a-615cb2383837",
"name": "Mapeador de Palabras Clave SEO y Generador de Estrategias",
"type": "n8n-nodes-base.code",
"notes": "Maps keywords to content\nopportunities and builds\nSEO content strategies",
"position": [
320,
688
],
"parameters": {
"jsCode": "// Keyword Mapping and SEO Opportunity Analysis\nconst gapData = $input.all()[0].json;\n\n// Extract high-priority content opportunities\nconst contentOpportunities = gapData.content_opportunities || [];\nconst keywordOpportunities = gapData.keyword_opportunities || [];\n\n// Create detailed keyword mapping for each content opportunity\nconst keywordMappedContent = contentOpportunities.map(opportunity => {\n // Find related keyword opportunities\n const relatedKeywords = keywordOpportunities.filter(kwOpp => \n kwOpp.related_topics?.some(topic => topic?.toLowerCase().includes(opportunity.topic))\n );\n \n // Generate primary and secondary keyword recommendations\n const primaryKeywords = relatedKeywords.slice(0, 3).map(k => k.keyword);\n const secondaryKeywords = relatedKeywords.slice(3, 8).map(k => k.keyword);\n const longTailKeywords = relatedKeywords.slice(8, 15).map(k => k.keyword);\n \n // Calculate SEO difficulty and opportunity\n const avgCompetitorFrequency = relatedKeywords.reduce((sum, k) => sum + k.frequency, 0) / relatedKeywords.length || 0;\n const seoOpportunity = avgCompetitorFrequency < 5 ? 'High' : avgCompetitorFrequency < 10 ? 'Medium' : 'Low';\n \n return {\n topic: opportunity.topic,\n opportunity_score: opportunity.opportunity_score,\n priority: opportunity.priority,\n keyword_strategy: {\n primary_keywords: primaryKeywords,\n secondary_keywords: secondaryKeywords,\n long_tail_keywords: longTailKeywords,\n total_keyword_opportunities: relatedKeywords.length,\n seo_difficulty: seoOpportunity\n },\n content_specs: {\n recommended_word_count: opportunity.avg_word_count,\n suggested_formats: opportunity.suggested_content_types,\n competitor_benchmark: opportunity.competitor_content_count\n },\n search_intent_analysis: {\n informational_keywords: relatedKeywords.filter(k => \n k.keyword.includes('how') || k.keyword.includes('what') || k.keyword.includes('why')\n ).map(k => k.keyword),\n commercial_keywords: relatedKeywords.filter(k => \n k.keyword.includes('best') || k.keyword.includes('review') || k.keyword.includes('compare')\n ).map(k => k.keyword),\n transactional_keywords: relatedKeywords.filter(k => \n k.keyword.includes('buy') || k.keyword.includes('price') || k.keyword.includes('discount')\n ).map(k => k.keyword)\n }\n };\n});\n\n// Generate keyword clusters for content planning\nconst keywordClusters = {};\nkeywordOpportunities.forEach(kwOpp => {\n kwOpp.related_topics?.forEach(topic => {\n if (!keywordClusters[topic]) {\n keywordClusters[topic] = [];\n }\n keywordClusters[topic].push({\n keyword: kwOpp.keyword,\n frequency: kwOpp.frequency,\n content_types: kwOpp.content_types\n });\n });\n});\n\n// SEO content recommendations\nconst seoRecommendations = {\n high_opportunity_keywords: keywordOpportunities.filter(k => k.frequency >= 3 && k.frequency <= 8).slice(0, 15),\n content_cluster_opportunities: Object.entries(keywordClusters)\n .filter(([topic, keywords]) => keywords.length >= 3)\n .map(([topic, keywords]) => ({\n cluster_topic: topic,\n pillar_content_opportunity: true,\n supporting_keywords: keywords.slice(0, 10),\n cluster_size: keywords.length\n })),\n competitive_gaps: keywordOpportunities.filter(k => k.frequency === 1).slice(0, 10) // Low competition keywords\n};\n\nreturn [{\n json: {\n keyword_mapped_opportunities: keywordMappedContent,\n keyword_clusters: Object.entries(keywordClusters).map(([topic, keywords]) => ({\n topic,\n keywords: keywords.slice(0, 15),\n cluster_strength: keywords.length\n })),\n seo_recommendations: seoRecommendations,\n content_strategy_insights: {\n pillar_page_opportunities: keywordMappedContent.filter(c => c.keyword_strategy.total_keyword_opportunities > 10).length,\n quick_wins: keywordMappedContent.filter(c => c.keyword_strategy.seo_difficulty === 'High').length,\n competitive_battles: keywordMappedContent.filter(c => c.keyword_strategy.seo_difficulty === 'Low').length\n },\n mapping_summary: {\n total_opportunities_mapped: keywordMappedContent.length,\n total_keywords_analyzed: keywordOpportunities.length,\n clusters_identified: Object.keys(keywordClusters).length,\n mapping_date: new Date().toISOString().split('T')[0]\n }\n }\n}];"
},
"notesInFlow": true,
"typeVersion": 2
},
{
"id": "00477a64-0ebd-4c3c-8060-8c256ea6dfd9",
"name": "Planificador Estratégico de Contenido y Generador de Hoja de Ruta",
"type": "n8n-nodes-base.code",
"notes": "Creates detailed content\nplans with SEO optimization\nand strategic roadmaps",
"position": [
832,
688
],
"parameters": {
"jsCode": "// Content Planning and Editorial Strategy Generator\nconst keywordData = $input.all()[0].json;\n\n// Extract mapped opportunities\nconst keywordMappedOpportunities = keywordData.keyword_mapped_opportunities || [];\nconst keywordClusters = keywordData.keyword_clusters || [];\nconst seoRecommendations = keywordData.seo_recommendations || {};\n\n// Generate detailed content plans for each opportunity\nconst contentPlans = keywordMappedOpportunities.map((opportunity, index) => {\n // Determine content format based on keywords and competition\n const suggestedFormat = opportunity.content_specs.suggested_formats?.[0] || 'blog post';\n \n // Calculate estimated effort and resources\n const wordCount = opportunity.content_specs.recommended_word_count || 1500;\n const estimatedHours = Math.ceil(wordCount / 250) + 2; // Writing + research + editing\n \n // Generate content outline based on keywords\n const outline = {\n introduction: `Introduction to ${opportunity.topic}`,\n main_sections: opportunity.keyword_strategy.primary_keywords.map(keyword => \n `${keyword.charAt(0).toUpperCase() + keyword.slice(1)}: Comprehensive Guide`\n ),\n supporting_sections: opportunity.keyword_strategy.secondary_keywords.slice(0, 3).map(keyword => \n `Understanding ${keyword}`\n ),\n conclusion: `Key Takeaways and Next Steps for ${opportunity.topic}`\n };\n \n // SEO optimization checklist\n const seoChecklist = {\n primary_keyword_density: '1-2%',\n meta_title: `${opportunity.keyword_strategy.primary_keywords[0]} - [Brand Name]`,\n meta_description: `Learn about ${opportunity.topic}. Comprehensive guide covering ${opportunity.keyword_strategy.primary_keywords.join(', ')}.`,\n header_structure: 'H1 (primary keyword) + H2s (secondary keywords) + H3s (long-tail)',\n internal_linking: 'Link to related existing content',\n external_linking: '2-3 authoritative sources',\n image_optimization: 'Alt text with target keywords'\n };\n \n return {\n content_id: `content-plan-${index + 1}`,\n title: `${opportunity.topic.charAt(0).toUpperCase() + opportunity.topic.slice(1)}: Complete Guide`,\n topic: opportunity.topic,\n priority: opportunity.priority,\n opportunity_score: opportunity.opportunity_score,\n content_format: suggestedFormat,\n target_keywords: {\n primary: opportunity.keyword_strategy.primary_keywords,\n secondary: opportunity.keyword_strategy.secondary_keywords,\n long_tail: opportunity.keyword_strategy.long_tail_keywords\n },\n content_specifications: {\n target_word_count: wordCount,\n estimated_hours: estimatedHours,\n difficulty_level: opportunity.keyword_strategy.seo_difficulty === 'High' ? 'Medium' : 'High',\n content_type: suggestedFormat,\n target_audience: 'Primary target demographic'\n },\n content_outline: outline,\n seo_optimization: seoChecklist,\n search_intent: {\n primary_intent: opportunity.search_intent_analysis.informational_keywords.length > 0 ? 'Informational' : \n opportunity.search_intent_analysis.commercial_keywords.length > 0 ? 'Commercial' : 'Transactional',\n secondary_intents: [\n ...(opportunity.search_intent_analysis.informational_keywords.length > 0 ? ['Informational'] : []),\n ...(opportunity.search_intent_analysis.commercial_keywords.length > 0 ? ['Commercial'] : []),\n ...(opportunity.search_intent_analysis.transactional_keywords.length > 0 ? ['Transactional'] : [])\n ]\n },\n competitive_analysis: {\n competitor_content_count: opportunity.content_specs.competitor_benchmark,\n differentiation_strategy: 'Create more comprehensive, actionable content',\n unique_angle: `Focus on practical implementation and real-world examples`\n },\n success_metrics: {\n primary_kpis: ['Organic traffic growth', 'Keyword ranking improvements', 'Social shares'],\n target_rankings: 'Top 10 for primary keywords within 6 months',\n engagement_goals: 'Above industry average time on page and bounce rate'\n }\n };\n});\n\n// Generate content calendar recommendations\nconst calendarRecommendations = {\n immediate_priority: contentPlans.filter(plan => plan.priority === 'High').slice(0, 5),\n medium_term: contentPlans.filter(plan => plan.priority === 'Medium').slice(0, 8),\n long_term: contentPlans.filter(plan => plan.priority === 'Low').slice(0, 10),\n pillar_content: contentPlans.filter(plan => plan.target_keywords.primary.length > 2).slice(0, 3),\n quick_wins: contentPlans.filter(plan => plan.content_specifications.difficulty_level === 'Medium').slice(0, 5)\n};\n\n// Resource planning\nconst resourcePlanning = {\n total_content_pieces: contentPlans.length,\n estimated_total_hours: contentPlans.reduce((sum, plan) => sum + plan.content_specifications.estimated_hours, 0),\n monthly_capacity: Math.ceil(contentPlans.length / 6), // Spread over 6 months\n content_formats_needed: [...new Set(contentPlans.map(plan => plan.content_format))],\n expertise_required: [...new Set(contentPlans.map(plan => plan.topic))]\n};\n\nreturn [{\n json: {\n content_plans: contentPlans,\n calendar_recommendations: calendarRecommendations,\n resource_planning: resourcePlanning,\n strategic_insights: {\n content_cluster_opportunities: keywordClusters.filter(cluster => cluster.cluster_strength > 5).length,\n seo_quick_wins: seoRecommendations.competitive_gaps?.length || 0,\n pillar_page_potential: keywordClusters.filter(cluster => cluster.cluster_strength > 10).length\n },\n execution_roadmap: {\n month_1: calendarRecommendations.immediate_priority.slice(0, 2),\n month_2: calendarRecommendations.immediate_priority.slice(2, 5),\n month_3: calendarRecommendations.medium_term.slice(0, 3),\n months_4_6: calendarRecommendations.medium_term.slice(3, 8)\n },\n planning_summary: {\n total_opportunities: contentPlans.length,\n high_priority_count: calendarRecommendations.immediate_priority.length,\n estimated_completion_timeline: '6 months',\n planning_date: new Date().toISOString().split('T')[0]\n }\n }\n}];"
},
"notesInFlow": true,
"typeVersion": 2
},
{
"id": "c085935b-5499-4624-aaed-165975b68c00",
"name": "Google Calendario Editorial en Hojas",
"type": "n8n-nodes-base.googleSheets",
"position": [
2128,
656
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "content_id",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "content_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "title",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "topic",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "topic",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "priority",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "priority",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "opportunity_score",
"type": "number",
"display": true,
"removed": false,
"required": false,
"displayName": "opportunity_score",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "content_format",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "content_format",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "target_word_count",
"type": "number",
"display": true,
"removed": false,
"required": false,
"displayName": "target_word_count",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "estimated_hours",
"type": "number",
"display": true,
"removed": false,
"required": false,
"displayName": "estimated_hours",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "primary_keywords",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "primary_keywords",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "secondary_keywords",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "secondary_keywords",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "publication_date",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "publication_date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "research_start",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "research_start",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "writing_start",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "writing_start",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "review_date",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "review_date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "seo_difficulty",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "seo_difficulty",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "target_audience",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "target_audience",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "content_outline",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "content_outline",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "success_metrics",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "success_metrics",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "status",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "assigned_writer",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "assigned_writer",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "progress",
"type": "number",
"display": true,
"removed": false,
"required": false,
"displayName": "progress",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "notes",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "notes",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": []
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Content_Gap_Analysis"
},
"documentId": {
"__rl": true,
"mode": "url",
"value": ""
}
},
"typeVersion": 4.5
},
{
"id": "e0866646-e484-4478-a753-3d02364ba9aa",
"name": "Generador de Calendario Editorial con Cronograma",
"type": "n8n-nodes-base.code",
"notes": "Generates detailed\neditorial calendar with\nproduction timelines",
"position": [
1472,
672
],
"parameters": {
"jsCode": "// Editorial Calendar Generator with Timeline Planning\nconst contentData = $input.all()[0].json;\n\n// Extract content plans and recommendations\nconst contentPlans = contentData.content_plans || [];\nconst executionRoadmap = contentData.execution_roadmap || {};\nconst resourcePlanning = contentData.resource_planning || {};\n\n// Generate monthly editorial calendar\nconst generateEditorialCalendar = () => {\n const calendar = {};\n const currentDate = new Date();\n \n // Create 6-month calendar structure\n for (let i = 0; i < 6; i++) {\n const monthDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + i, 1);\n const monthKey = monthDate.toISOString().slice(0, 7); // YYYY-MM format\n const monthName = monthDate.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });\n \n calendar[monthKey] = {\n month_name: monthName,\n content_pieces: [],\n total_hours: 0,\n content_types: new Set(),\n priority_distribution: { High: 0, Medium: 0, Low: 0 }\n };\n }\n \n // Distribute content across months based on priority and roadmap\n const distributeContent = (content, monthOffset) => {\n const targetDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + monthOffset, 15);\n const monthKey = targetDate.toISOString().slice(0, 7);\n \n if (calendar[monthKey]) {\n // Calculate publication date (mid-month)\n const publicationDate = targetDate.toISOString().split('T')[0];\n \n // Create detailed calendar entry\n const calendarEntry = {\n content_id: content.content_id,\n title: content.title,\n topic: content.topic,\n priority: content.priority,\n content_format: content.content_format,\n estimated_hours: content.content_specifications.estimated_hours,\n target_word_count: content.content_specifications.target_word_count,\n primary_keywords: content.target_keywords.primary.join(', '),\n secondary_keywords: content.target_keywords.secondary.join(', '),\n publication_date: publicationDate,\n seo_difficulty: content.content_specifications.difficulty_level,\n opportunity_score: content.opportunity_score,\n \n // Production timeline\n research_start: new Date(targetDate.getTime() - 14 * 24 * 60 * 60 * 1000).toISOString().split('T')[0],\n writing_start: new Date(targetDate.getTime() - 10 * 24 * 60 * 60 * 1000).toISOString().split('T')[0],\n review_date: new Date(targetDate.getTime() - 3 * 24 * 60 * 60 * 1000).toISOString().split('T')[0],\n \n // Content specifications\n target_audience: content.search_intent.primary_intent,\n content_outline: Object.values(content.content_outline).join(' | '),\n success_metrics: content.success_metrics.primary_kpis.join(', '),\n \n // Status tracking\n status: 'Planned',\n assigned_writer: 'TBD',\n progress: 0,\n notes: `Gap analysis opportunity - compete with ${content.competitive_analysis.competitor_content_count} competitor pieces`\n };\n \n calendar[monthKey].content_pieces.push(calendarEntry);\n calendar[monthKey].total_hours += content.content_specifications.estimated_hours;\n calendar[monthKey].content_types.add(content.content_format);\n calendar[monthKey].priority_distribution[content.priority]++;\n }\n };\n \n // Distribute content according to roadmap\n (executionRoadmap.month_1 || []).forEach(content => distributeContent(content, 0));\n (executionRoadmap.month_2 || []).forEach(content => distributeContent(content, 1));\n (executionRoadmap.month_3 || []).forEach(content => distributeContent(content, 2));\n (executionRoadmap.months_4_6 || []).forEach((content, index) => {\n distributeContent(content, 3 + (index % 3));\n });\n \n // Convert Set to Array for content_types\n Object.keys(calendar).forEach(monthKey => {\n calendar[monthKey].content_types = [...calendar[monthKey].content_types];\n });\n \n return calendar;\n};\n\nconst editorialCalendar = generateEditorialCalendar();\n\n// Generate team workload analysis\nconst workloadAnalysis = Object.entries(editorialCalendar).map(([monthKey, monthData]) => ({\n month: monthData.month_name,\n total_content_pieces: monthData.content_pieces.length,\n total_hours: monthData.total_hours,\n avg_hours_per_piece: monthData.content_pieces.length > 0 ? Math.round(monthData.total_hours / monthData.content_pieces.length) : 0,\n content_formats: monthData.content_types,\n priority_breakdown: monthData.priority_distribution,\n capacity_status: monthData.total_hours > 160 ? 'Over Capacity' : monthData.total_hours > 120 ? 'High Load' : 'Manageable'\n}));\n\n// Create flat array for Google Sheets export\nconst calendarEntries = Object.values(editorialCalendar).flatMap(month => month.content_pieces);\n\n// Generate editorial insights and recommendations\nconst editorialInsights = {\n total_content_planned: calendarEntries.length,\n total_estimated_hours: calendarEntries.reduce((sum, entry) => sum + entry.estimated_hours, 0),\n content_format_distribution: calendarEntries.reduce((acc, entry) => {\n acc[entry.content_format] = (acc[entry.content_format] || 0) + 1;\n return acc;\n }, {}),\n priority_distribution: calendarEntries.reduce((acc, entry) => {\n acc[entry.priority] = (acc[entry.priority] || 0) + 1;\n return acc;\n }, {}),\n avg_opportunity_score: Math.round(calendarEntries.reduce((sum, entry) => sum + entry.opportunity_score, 0) / calendarEntries.length),\n peak_production_months: workloadAnalysis.filter(month => month.capacity_status !== 'Manageable').map(month => month.month)\n};\n\nreturn calendarEntries.map(entry => ({ json: entry }));"
},
"notesInFlow": true,
"typeVersion": 2
},
{
"id": "51f1fd73-4a40-4c90-9fbf-c375f2b64597",
"name": "Paso 1 - Información del Activador de Programación",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2144,
-240
],
"parameters": {
"color": 6,
"width": 575,
"height": 1474,
"content": "# Step 1: Weekly Content Analysis Trigger 📅\n\nThis trigger automatically runs the content gap analysis workflow every week to discover fresh content opportunities by analyzing competitor strategies.\n\n## Configuration Options\n- **Frequency**: Weekly execution (optimal for content research)\n- **Timing**: Schedule during business hours for immediate review\n- **Consistency**: Regular analysis ensures competitive intelligence\n\n## Best Practices\n- Weekly frequency captures emerging content trends\n- Schedule before content planning meetings\n- Monitor execution logs for any failures\n- Adjust timing based on competitor publishing patterns\n\n## Benefits\n- Continuous competitive intelligence\n- Fresh content opportunities weekly\n- Automated market research\n- Strategic content planning insights\n\n## Strategic Value\n- Identifies trending topics before competitors\n- Reveals content format opportunities\n- Uncovers keyword gaps systematically"
},
"typeVersion": 1
},
{
"id": "27c218d2-8fe7-490e-8cc6-bec3a99bc75b",
"name": "Paso 2 - Información del Rastreador Competitivo",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1568,
-240
],
"parameters": {
"color": 6,
"width": 575,
"height": 1474,
"content": "# Step 2: AI-Powered Competitor Content Scraper 🤖\n\nUtilizes ScrapeGraphAI to intelligently extract comprehensive content data from multiple competitor websites and blogs.\n\n## Scraping Capabilities\n- **Content Discovery**: Articles, guides, whitepapers, resources\n- **Metadata Extraction**: Titles, URLs, publish dates, authors\n- **Content Analysis**: Word counts, topics, keywords, categories\n- **Engagement Metrics**: Social shares, performance indicators\n\n## AI Intelligence\n- Natural language understanding of content structure\n- Smart extraction of hidden metadata\n- Topic classification and keyword identification\n- Performance metric recognition\n\n## Multi-Competitor Analysis\n- Primary competitor deep analysis\n- Secondary competitor content audit\n- Cross-competitor content comparison\n- Market trend identification\n\n## Data Quality\n- Structured output for consistent processing\n- Comprehensive content profiling\n- Publication timeline analysis"
},
"typeVersion": 1
},
{
"id": "2a428c81-c8dc-409f-a7b8-98d684130c8c",
"name": "Paso 3 - Información del Analizador de Biblioteca de Contenido",
"type": "n8n-nodes-base.stickyNote",
"position": [
-992,
-240
],
"parameters": {
"color": 6,
"width": 575,
"height": 1474,
"content": "# Step 3: Our Content Library Analyzer 📚\n\nAnalyzes your existing content library using ScrapeGraphAI to establish baseline for gap identification.\n\n## Content Audit Features\n- **Comprehensive Analysis**: All existing content pieces\n- **Performance Metrics**: Traffic, engagement, social shares\n- **Topic Mapping**: Content pillars and theme analysis\n- **Keyword Inventory**: Current keyword coverage audit\n\n## Strategic Baseline\n- Content format distribution analysis\n- Topic coverage assessment\n- Keyword gap preparation\n- Performance benchmark establishment\n\n## Quality Assessment\n- Content depth and quality metrics\n- Target audience alignment\n- SEO optimization levels\n- Engagement performance trends\n\n## Gap Preparation\n- Structured data for comparison analysis\n- Normalized content classification\n- Performance trend identification\n- Strategic positioning assessment"
},
"typeVersion": 1
},
{
"id": "6aaa72ce-810c-48d7-b86d-2475a67d9940",
"name": "Paso 4 - Información del Identificador de Brechas",
"type": "n8n-nodes-base.stickyNote",
"position": [
-416,
-240
],
"parameters": {
"color": 6,
"width": 575,
"height": 1474,
"content": "# Step 4: Advanced Content Gap Identifier 🎯\n\nEmploys sophisticated algorithms to identify high-value content opportunities through comprehensive competitive analysis.\n\n## Gap Analysis Types\n- **Topic Gaps**: Subjects competitors cover but you don't\n- **Keyword Gaps**: Search terms with opportunity potential\n- **Format Gaps**: Content types missing from your strategy\n- **Performance Gaps**: High-performing competitor content\n\n## Opportunity Scoring\n- **Content Volume** (50 points): Market demand assessment\n- **Social Engagement** (30 points): Audience interest validation\n- **Content Depth** (20 points): Quality and comprehensiveness\n\n## Priority Classification\n- **High Priority**: Score > 70 (immediate action)\n- **Medium Priority**: Score 40-70 (quarterly planning)\n- **Low Priority**: Score < 40 (long-term consideration)\n\n## Strategic Insights\n- Competitive content landscape mapping\n- Market opportunity quantification\n- Resource allocation recommendations"
},
"typeVersion": 1
},
{
"id": "9f186b0b-18fa-4389-9c23-70c0ccea56bc",
"name": "Paso 5 - Información del Mapeador de Palabras Clave",
"type": "n8n-nodes-base.stickyNote",
"position": [
160,
-240
],
"parameters": {
"color": 6,
"width": 575,
"height": 1474,
"content": "# Step 5: SEO Keyword Mapper and Strategy Builder 🔍\n\nTransforms content gaps into actionable SEO strategies with comprehensive keyword mapping and search intent analysis.\n\n## Keyword Strategy Development\n- **Primary Keywords**: High-impact target terms\n- **Secondary Keywords**: Supporting optimization terms\n- **Long-tail Keywords**: Specific, low-competition phrases\n- **Search Intent Analysis**: Informational, commercial, transactional\n\n## SEO Opportunity Assessment\n- **Competition Analysis**: Keyword difficulty scoring\n- **Search Volume Estimation**: Traffic potential evaluation\n- **Content Cluster Identification**: Pillar page opportunities\n- **Quick Win Detection**: Low-competition, high-value terms\n\n## Strategic Mapping\n- Keyword-to-content opportunity alignment\n- Content cluster and pillar page planning\n- Competitive advantage identification\n- Resource prioritization guidance\n\n## Content Strategy Integration\n- SEO-driven content planning\n- Search intent optimization\n- Competitive positioning strategy"
},
"typeVersion": 1
},
{
"id": "c8f5d487-bf1d-4123-bf30-5edaccdb99af",
"name": "Paso 6 - Información del Planificador de Contenido",
"type": "n8n-nodes-base.stickyNote",
"position": [
736,
-240
],
"parameters": {
"color": 6,
"width": 575,
"height": 1474,
"content": "# Step 6: Strategic Content Planner and Roadmap Generator 📋\n\nCreates detailed, actionable content plans with comprehensive SEO optimization and strategic execution roadmaps.\n\n## Content Plan Development\n- **Detailed Specifications**: Word count, format, timeline\n- **SEO Optimization**: Complete on-page SEO checklist\n- **Content Outlines**: Structured section planning\n- **Resource Estimation**: Time and effort calculations\n\n## Strategic Roadmap\n- **6-Month Execution Plan**: Prioritized content calendar\n- **Resource Allocation**: Team capacity and skill planning\n- **Success Metrics**: KPI definition and tracking setup\n- **Competitive Differentiation**: Unique positioning strategies\n\n## Content Quality Framework\n- Search intent optimization\n- Competitive analysis integration\n- Performance prediction modeling\n- Content cluster development\n\n## Execution Support\n- Production timeline planning\n- Team workflow optimization\n- Success measurement framework\n- Continuous improvement guidance"
},
"typeVersion": 1
},
{
"id": "ac94f7f0-1736-4a3b-a760-0fd647b489d4",
"name": "Paso 7 - Información del Calendario Editorial",
"type": "n8n-nodes-base.stickyNote",
"position": [
1312,
-240
],
"parameters": {
"color": 6,
"width": 575,
"height": 1474,
"content": "# Step 7: Editorial Calendar Generator with Timeline 📆\n\nTransforms content plans into a comprehensive editorial calendar with detailed production timelines and team coordination.\n\n## Calendar Features\n- **6-Month Planning Horizon**: Strategic long-term view\n- **Production Timelines**: Research, writing, review phases\n- **Team Coordination**: Writer assignments and deadlines\n- **Progress Tracking**: Status monitoring and milestone management\n\n## Timeline Management\n- **Research Phase**: 14 days before publication\n- **Writing Phase**: 10 days before publication\n- **Review Phase**: 3 days before publication\n- **Publication Schedule**: Mid-month optimization\n\n## Resource Planning\n- **Workload Distribution**: Balanced team capacity\n- **Skill Requirements**: Expertise mapping\n- **Capacity Analysis**: Over/under capacity identification\n- **Priority Balancing**: High/medium/low priority distribution\n\n## Team Collaboration\n- Individual task assignments\n- Deadline management\n- Progress monitoring\n- Performance tracking preparation"
},
"typeVersion": 1
},
{
"id": "e49ef381-9da4-4712-81b5-0867bc5b0b1b",
"name": "Paso 8 - Información del Almacenamiento en Hojas",
"type": "n8n-nodes-base.stickyNote",
"position": [
1888,
-240
],
"parameters": {
"color": 6,
"width": 575,
"height": 1474,
"content": "# Step 8: Google Sheets Editorial Calendar Storage 📊\n\nStores the complete editorial calendar in Google Sheets for team collaboration, tracking, and performance analysis.\n\n## Data Storage\n- **Complete Content Plans**: All identified opportunities\n- **Production Timelines**: Research, writing, review dates\n- **SEO Specifications**: Keywords, optimization checklists\n- **Team Assignments**: Writer allocation and responsibilities\n\n## Team Collaboration\n- **Real-time Updates**: Shared calendar access\n- **Progress Tracking**: Status updates and milestone completion\n- **Comment System**: Team communication and feedback\n- **Version Control**: Edit history and change tracking\n\n## Performance Analytics\n- **Content Performance Tracking**: Success metrics monitoring\n- **ROI Analysis**: Content investment return calculation\n- **Trend Analysis**: Content performance patterns\n- **Optimization Insights**: Continuous improvement data\n\n## Management Dashboard\n- Content pipeline visualization\n- Team workload monitoring\n- Deadline and milestone tracking\n- Strategic performance reporting"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "4ed2a770-33de-4fe0-b31b-de6d8ca9f073",
"connections": {
"c83f6b26-eb8a-465d-8baf-4e5e9881a1d4": {
"main": [
[
{
"node": "25a9cdde-6fd0-4531-a973-f8a77706e0fb",
"type": "main",
"index": 0
}
]
]
},
"25a9cdde-6fd0-4531-a973-f8a77706e0fb": {
"main": [
[
{
"node": "a1d27f70-648f-4fb5-a02a-615cb2383837",
"type": "main",
"index": 0
}
]
]
},
"41f5943e-f4dd-4ceb-8fbd-ee3dd389dc00": {
"main": [
[
{
"node": "b06d07a3-43a3-4dbb-9fdf-d56425993d08",
"type": "main",
"index": 0
},
{
"node": "cca541bd-729a-482c-a464-1a31449d78ff",
"type": "main",
"index": 0
},
{
"node": "c83f6b26-eb8a-465d-8baf-4e5e9881a1d4",
"type": "main",
"index": 0
}
]
]
},
"c2f95dba-233b-4fe5-bbd7-d9718766bcd4": {
"main": [
[
{
"node": "25a9cdde-6fd0-4531-a973-f8a77706e0fb",
"type": "main",
"index": 0
}
]
]
},
"cca541bd-729a-482c-a464-1a31449d78ff": {
"main": [
[
{
"node": "c2f95dba-233b-4fe5-bbd7-d9718766bcd4",
"type": "main",
"index": 0
}
]
]
},
"b06d07a3-43a3-4dbb-9fdf-d56425993d08": {
"main": [
[
{
"node": "c2f95dba-233b-4fe5-bbd7-d9718766bcd4",
"type": "main",
"index": 0
}
]
]
},
"a1d27f70-648f-4fb5-a02a-615cb2383837": {
"main": [
[
{
"node": "00477a64-0ebd-4c3c-8060-8c256ea6dfd9",
"type": "main",
"index": 0
}
]
]
},
"e0866646-e484-4478-a753-3d02364ba9aa": {
"main": [
[
{
"node": "c085935b-5499-4624-aaed-165975b68c00",
"type": "main",
"index": 0
}
]
]
},
"00477a64-0ebd-4c3c-8060-8c256ea6dfd9": {
"main": [
[
{
"node": "e0866646-e484-4478-a753-3d02364ba9aa",
"type": "main",
"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?
Avanzado - Investigación de mercado, Resumen de IA
¿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
vinci-king-01
@vinci-king-01Compartir este flujo de trabajo