You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

generate_SEO_blog.json 67KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902
  1. {
  2. "id": 8,
  3. "title": "Generate SEO Blog",
  4. "description": "This is a multi-agent version of the SEO blog generation workflow. It simulates a small team of AI “writers”, where each agent plays a specialized role — just like a real editorial team.",
  5. "canvas_type": "Agent",
  6. "dsl": {
  7. "components": {
  8. "Agent:LuckyApplesGrab": {
  9. "downstream": [
  10. "Message:ModernSwansThrow"
  11. ],
  12. "obj": {
  13. "component_name": "Agent",
  14. "params": {
  15. "delay_after_error": 1,
  16. "description": "",
  17. "exception_comment": "",
  18. "exception_default_value": "",
  19. "exception_goto": [],
  20. "exception_method": null,
  21. "frequencyPenaltyEnabled": false,
  22. "frequency_penalty": 0.5,
  23. "llm_id": "deepseek-chat@DeepSeek",
  24. "maxTokensEnabled": false,
  25. "max_retries": 3,
  26. "max_rounds": 3,
  27. "max_tokens": 4096,
  28. "mcp": [],
  29. "message_history_window_size": 12,
  30. "outputs": {
  31. "content": {
  32. "type": "string",
  33. "value": ""
  34. }
  35. },
  36. "parameter": "Precise",
  37. "presencePenaltyEnabled": false,
  38. "presence_penalty": 0.5,
  39. "prompts": [
  40. {
  41. "content": "The user query is {sys.query}",
  42. "role": "user"
  43. }
  44. ],
  45. "sys_prompt": "# Role\n\nYou are the **Lead Agent**, responsible for initiating the multi-agent SEO blog generation process. You will receive the user\u2019s topic and blog goal, interpret the intent, and coordinate the downstream writing agents.\n\n# Goals\n\n1. Parse the user's initial input.\n\n2. Generate a high-level blog intent summary and writing plan.\n\n3. Provide clear instructions to the following Sub_Agents:\n\n - `Outline Agent` \u2192 Create the blog outline.\n\n - `Body Agent` \u2192 Write all sections based on outline.\n\n - `Editor Agent` \u2192 Polish and finalize the blog post.\n\n4. Merge outputs into a complete, readable blog draft in Markdown format.\n\n# Input\n\nYou will receive:\n\n- Blog topic\n\n- Target audience\n\n- Blog goal (e.g., SEO, education, product marketing)\n\n# Output Format\n\n```markdown\n\n## Parsed Writing Plan\n\n- **Topic**: [Extracted from user input]\n\n- **Audience**: [Summarized from user input]\n\n- **Intent**: [Inferred goal and style]\n\n- **Blog Type**: [e.g., Tutorial / Informative Guide / Marketing Content]\n\n- **Long-tail Keywords**: \n\n - keyword 1\n\n - keyword 2\n\n - keyword 3\n\n - ...\n\n## Instructions for Outline Agent\n\nPlease generate a structured outline including H2 and H3 headings. Assign 1\u20132 relevant keywords to each section. Keep it aligned with the user\u2019s intent and audience level.\n\n## Instructions for Body Agent\n\nWrite the full content based on the outline. Each section should be concise (500\u2013600 words), informative, and optimized for SEO. Use `Tavily Search` only when additional examples or context are needed.\n\n## Instructions for Editor Agent\n\nReview and refine the combined content. Improve transitions, ensure keyword integration, and add a meta title + meta description. Maintain Markdown formatting.\n\n\n## Guides\n\n- Do not generate blog content directly.\n\n- Focus on correct intent recognition and instruction generation.\n\n- Keep communication to downstream agents simple, scoped, and accurate.\n\n\n## Input Examples (and how to handle them)\n\nInput: \"I want to write about RAGFlow.\"\n\u2192 Output: Informative Guide, Audience: AI developers, Intent: explain what RAGFlow is and its use cases\n\nInput: \"Need a blog to promote our prompt design tool.\"\n\u2192 Output: Marketing Content, Audience: product managers or tool adopters, Intent: raise awareness and interest in the product\n\nInput: \"How to get more Google traffic using AI\"\n\u2192 Output: How-to, Audience: SEO marketers, Intent: guide readers on applying AI for SEO growth",
  46. "temperature": "0.1",
  47. "temperatureEnabled": true,
  48. "tools": [
  49. {
  50. "component_name": "Agent",
  51. "id": "Agent:SlickSpidersTurn",
  52. "name": "Outline Agent",
  53. "params": {
  54. "delay_after_error": 1,
  55. "description": "Generates a clear and SEO-friendly blog outline using H2/H3 headings based on the topic, audience, and intent provided by the lead agent. Each section includes suggested keywords for optimized downstream writing.\n",
  56. "exception_comment": "",
  57. "exception_default_value": "",
  58. "exception_goto": [],
  59. "exception_method": null,
  60. "frequencyPenaltyEnabled": false,
  61. "frequency_penalty": 0.3,
  62. "llm_id": "deepseek-chat@DeepSeek",
  63. "maxTokensEnabled": false,
  64. "max_retries": 3,
  65. "max_rounds": 2,
  66. "max_tokens": 4096,
  67. "mcp": [],
  68. "message_history_window_size": 12,
  69. "outputs": {
  70. "content": {
  71. "type": "string",
  72. "value": ""
  73. }
  74. },
  75. "parameter": "Balance",
  76. "presencePenaltyEnabled": false,
  77. "presence_penalty": 0.2,
  78. "prompts": [
  79. {
  80. "content": "{sys.query}",
  81. "role": "user"
  82. }
  83. ],
  84. "sys_prompt": "# Role\n\nYou are the **Outline Agent**, a sub-agent in a multi-agent SEO blog writing system. You operate under the instruction of the `Lead Agent`, and your sole responsibility is to create a clear, well-structured, and SEO-optimized blog outline.\n\n# Tool Access:\n\n- You have access to a search tool called `Tavily Search`.\n\n- If you are unsure how to structure a section, you may call this tool to search for related blog outlines or content from Google.\n\n- Do not overuse it. Your job is to extract **structure**, not to write paragraphs.\n\n\n# Goals\n\n1. Create a well-structured outline with appropriate H2 and H3 headings.\n\n2. Ensure logical flow from introduction to conclusion.\n\n3. Assign 1\u20132 suggested long-tail keywords to each major section for SEO alignment.\n\n4. Make the structure suitable for downstream paragraph writing.\n\n\n\n\n#Note\n\n- Use concise, scannable section titles.\n\n- Do not write full paragraphs.\n\n- Prioritize clarity, logical progression, and SEO alignment.\n\n\n\n- If the blog type is \u201cTutorial\u201d or \u201cHow-to\u201d, include step-based sections.\n\n\n# Input\n\nYou will receive:\n\n- Writing Type (e.g., Tutorial, Informative Guide)\n\n- Target Audience\n\n- User Intent Summary\n\n- 3\u20135 long-tail keywords\n\n\nUse this information to design a structure that both informs readers and maximizes search engine visibility.\n\n# Output Format\n\n```markdown\n\n## Blog Title (suggested)\n\n[Give a short, SEO-friendly title suggestion]\n\n## Outline\n\n### Introduction\n\n- Purpose of the article\n\n- Brief context\n\n- **Suggested keywords**: [keyword1, keyword2]\n\n### H2: [Section Title 1]\n\n- [Short description of what this section will cover]\n\n- **Suggested keywords**: [keyword1, keyword2]\n\n### H2: [Section Title 2]\n\n- [Short description of what this section will cover]\n\n- **Suggested keywords**: [keyword1, keyword2]\n\n### H2: [Section Title 3]\n\n- [Optional H3 Subsection Title A]\n\n - [Explanation of sub-point]\n\n- [Optional H3 Subsection Title B]\n\n - [Explanation of sub-point]\n\n- **Suggested keywords**: [keyword1]\n\n### Conclusion\n\n- Recap key takeaways\n\n- Optional CTA (Call to Action)\n\n- **Suggested keywords**: [keyword3]\n\n",
  85. "temperature": 0.5,
  86. "temperatureEnabled": true,
  87. "tools": [
  88. {
  89. "component_name": "TavilySearch",
  90. "name": "TavilySearch",
  91. "params": {
  92. "api_key": "",
  93. "days": 7,
  94. "exclude_domains": [],
  95. "include_answer": false,
  96. "include_domains": [],
  97. "include_image_descriptions": false,
  98. "include_images": false,
  99. "include_raw_content": true,
  100. "max_results": 5,
  101. "outputs": {
  102. "formalized_content": {
  103. "type": "string",
  104. "value": ""
  105. },
  106. "json": {
  107. "type": "Array<Object>",
  108. "value": []
  109. }
  110. },
  111. "query": "sys.query",
  112. "search_depth": "basic",
  113. "topic": "general"
  114. }
  115. }
  116. ],
  117. "topPEnabled": false,
  118. "top_p": 0.85,
  119. "user_prompt": "This is the order you need to send to the agent.",
  120. "visual_files_var": ""
  121. }
  122. },
  123. {
  124. "component_name": "Agent",
  125. "id": "Agent:IcyPawsRescue",
  126. "name": "Body Agent",
  127. "params": {
  128. "delay_after_error": 1,
  129. "description": "Writes the full blog content section-by-section following the outline structure. It integrates target keywords naturally and uses Tavily Search only when additional facts or examples are needed.\n",
  130. "exception_comment": "",
  131. "exception_default_value": "",
  132. "exception_goto": [],
  133. "exception_method": null,
  134. "frequencyPenaltyEnabled": false,
  135. "frequency_penalty": 0.5,
  136. "llm_id": "deepseek-chat@DeepSeek",
  137. "maxTokensEnabled": false,
  138. "max_retries": 3,
  139. "max_rounds": 3,
  140. "max_tokens": 4096,
  141. "mcp": [],
  142. "message_history_window_size": 12,
  143. "outputs": {
  144. "content": {
  145. "type": "string",
  146. "value": ""
  147. }
  148. },
  149. "parameter": "Precise",
  150. "presencePenaltyEnabled": false,
  151. "presence_penalty": 0.5,
  152. "prompts": [
  153. {
  154. "content": "{sys.query}",
  155. "role": "user"
  156. }
  157. ],
  158. "sys_prompt": "# Role\n\nYou are the **Body Agent**, a sub-agent in a multi-agent SEO blog writing system. You operate under the instruction of the `Lead Agent`, and your job is to write the full blog content based on the outline created by the `OutlineWriter_Agent`.\n\n\n\n# Tool Access:\n\nYou can use the `Tavily Search` tool to retrieve relevant content, statistics, or examples to support each section you're writing.\n\nUse it **only** when the provided outline lacks enough information, or if the section requires factual grounding.\n\nAlways cite the original link or indicate source where possible.\n\n\n# Goals\n\n1. Write each section (based on H2/H3 structure) as a complete and natural blog paragraph.\n\n2. Integrate the suggested long-tail keywords naturally into each section.\n\n3. When appropriate, use the `Tavily Search` tool to enrich your writing with relevant facts, examples, or quotes.\n\n4. Ensure each section is clear, engaging, and informative, suitable for both human readers and search engines.\n\n\n# Style Guidelines\n\n- Write in a tone appropriate to the audience. Be explanatory, not promotional, unless it's a marketing blog.\n\n- Avoid generic filler content. Prioritize clarity, structure, and value.\n\n- Ensure SEO keywords are embedded seamlessly, not forcefully.\n\n\n\n- Maintain writing rhythm. Vary sentence lengths. Use transitions between ideas.\n\n\n# Input\n\n\nYou will receive:\n\n- Blog title\n\n- Structured outline (including section titles, keywords, and descriptions)\n\n- Target audience\n\n- Blog type and user intent\n\nYou must **follow the outline strictly**. Write content **section-by-section**, based on the structure.\n\n\n# Output Format\n\n```markdown\n\n## H2: [Section Title]\n\n[Your generated content for this section \u2014 500-600 words, using keywords naturally.]\n\n",
  159. "temperature": 0.2,
  160. "temperatureEnabled": true,
  161. "tools": [
  162. {
  163. "component_name": "TavilySearch",
  164. "name": "TavilySearch",
  165. "params": {
  166. "api_key": "",
  167. "days": 7,
  168. "exclude_domains": [],
  169. "include_answer": false,
  170. "include_domains": [],
  171. "include_image_descriptions": false,
  172. "include_images": false,
  173. "include_raw_content": true,
  174. "max_results": 5,
  175. "outputs": {
  176. "formalized_content": {
  177. "type": "string",
  178. "value": ""
  179. },
  180. "json": {
  181. "type": "Array<Object>",
  182. "value": []
  183. }
  184. },
  185. "query": "sys.query",
  186. "search_depth": "basic",
  187. "topic": "general"
  188. }
  189. }
  190. ],
  191. "topPEnabled": false,
  192. "top_p": 0.75,
  193. "user_prompt": "This is the order you need to send to the agent.",
  194. "visual_files_var": ""
  195. }
  196. },
  197. {
  198. "component_name": "Agent",
  199. "id": "Agent:TenderAdsAllow",
  200. "name": "Editor Agent",
  201. "params": {
  202. "delay_after_error": 1,
  203. "description": "Polishes and finalizes the entire blog post. Enhances clarity, checks keyword usage, improves flow, and generates a meta title and description for SEO. Operates after all sections are completed.\n\n",
  204. "exception_comment": "",
  205. "exception_default_value": "",
  206. "exception_goto": [],
  207. "exception_method": null,
  208. "frequencyPenaltyEnabled": false,
  209. "frequency_penalty": 0.5,
  210. "llm_id": "deepseek-chat@DeepSeek",
  211. "maxTokensEnabled": false,
  212. "max_retries": 3,
  213. "max_rounds": 2,
  214. "max_tokens": 4096,
  215. "mcp": [],
  216. "message_history_window_size": 12,
  217. "outputs": {
  218. "content": {
  219. "type": "string",
  220. "value": ""
  221. }
  222. },
  223. "parameter": "Precise",
  224. "presencePenaltyEnabled": false,
  225. "presence_penalty": 0.5,
  226. "prompts": [
  227. {
  228. "content": "{sys.query}",
  229. "role": "user"
  230. }
  231. ],
  232. "sys_prompt": "# Role\n\nYou are the **Editor Agent**, the final agent in a multi-agent SEO blog writing workflow. You are responsible for finalizing the blog post for both human readability and SEO effectiveness.\n\n# Goals\n\n1. Polish the entire blog content for clarity, coherence, and style.\n\n2. Improve transitions between sections, ensure logical flow.\n\n3. Verify that keywords are used appropriately and effectively.\n\n4. Conduct a lightweight SEO audit \u2014 checking keyword density, structure (H1/H2/H3), and overall searchability.\n\n\n\n## Integration Responsibilities\n\n- Maintain alignment with Lead Agent's original intent and audience\n\n- Preserve the structure and keyword strategy from Outline Agent\n\n- Enhance and polish Body Agent's content without altering core information\n\n# Style Guidelines\n\n- Be precise. Avoid bloated or vague language.\n\n- Maintain an informative and engaging tone, suitable to the target audience.\n\n- Do not remove keywords unless absolutely necessary for clarity.\n\n- Ensure paragraph flow and section continuity.\n\n\n\n# Input\n\nYou will receive:\n\n- Full blog content, written section-by-section\n\n- Original outline with suggested keywords\n\n- Target audience and writing type\n\n# Output Format\n\n```markdown\n\n[The revised, fully polished blog post content goes here.]\n",
  233. "temperature": 0.2,
  234. "temperatureEnabled": true,
  235. "tools": [],
  236. "topPEnabled": false,
  237. "top_p": 0.75,
  238. "user_prompt": "This is the order you need to send to the agent.",
  239. "visual_files_var": ""
  240. }
  241. }
  242. ],
  243. "topPEnabled": false,
  244. "top_p": 0.75,
  245. "user_prompt": "",
  246. "visual_files_var": ""
  247. }
  248. },
  249. "upstream": [
  250. "begin"
  251. ]
  252. },
  253. "Message:ModernSwansThrow": {
  254. "downstream": [],
  255. "obj": {
  256. "component_name": "Message",
  257. "params": {
  258. "content": [
  259. "{Agent:LuckyApplesGrab@content}"
  260. ]
  261. }
  262. },
  263. "upstream": [
  264. "Agent:LuckyApplesGrab"
  265. ]
  266. },
  267. "begin": {
  268. "downstream": [
  269. "Agent:LuckyApplesGrab"
  270. ],
  271. "obj": {
  272. "component_name": "Begin",
  273. "params": {
  274. "enablePrologue": true,
  275. "inputs": {},
  276. "mode": "conversational",
  277. "prologue": "Hi! I'm your SEO blog assistant.\n\nTo get started, please tell me:\n1. What topic you want the blog to cover\n2. Who is the target audience\n3. What you hope to achieve with this blog (e.g., SEO traffic, teaching beginners, promoting a product)\n"
  278. }
  279. },
  280. "upstream": []
  281. }
  282. },
  283. "globals": {
  284. "sys.conversation_turns": 0,
  285. "sys.files": [],
  286. "sys.query": "",
  287. "sys.user_id": ""
  288. },
  289. "graph": {
  290. "edges": [
  291. {
  292. "data": {
  293. "isHovered": false
  294. },
  295. "id": "xy-edge__beginstart-Agent:LuckyApplesGrabend",
  296. "source": "begin",
  297. "sourceHandle": "start",
  298. "target": "Agent:LuckyApplesGrab",
  299. "targetHandle": "end"
  300. },
  301. {
  302. "data": {
  303. "isHovered": false
  304. },
  305. "id": "xy-edge__Agent:LuckyApplesGrabstart-Message:ModernSwansThrowend",
  306. "source": "Agent:LuckyApplesGrab",
  307. "sourceHandle": "start",
  308. "target": "Message:ModernSwansThrow",
  309. "targetHandle": "end"
  310. },
  311. {
  312. "data": {
  313. "isHovered": false
  314. },
  315. "id": "xy-edge__Agent:LuckyApplesGrabagentBottom-Agent:SlickSpidersTurnagentTop",
  316. "source": "Agent:LuckyApplesGrab",
  317. "sourceHandle": "agentBottom",
  318. "target": "Agent:SlickSpidersTurn",
  319. "targetHandle": "agentTop"
  320. },
  321. {
  322. "data": {
  323. "isHovered": false
  324. },
  325. "id": "xy-edge__Agent:LuckyApplesGrabagentBottom-Agent:IcyPawsRescueagentTop",
  326. "source": "Agent:LuckyApplesGrab",
  327. "sourceHandle": "agentBottom",
  328. "target": "Agent:IcyPawsRescue",
  329. "targetHandle": "agentTop"
  330. },
  331. {
  332. "data": {
  333. "isHovered": false
  334. },
  335. "id": "xy-edge__Agent:LuckyApplesGrabagentBottom-Agent:TenderAdsAllowagentTop",
  336. "source": "Agent:LuckyApplesGrab",
  337. "sourceHandle": "agentBottom",
  338. "target": "Agent:TenderAdsAllow",
  339. "targetHandle": "agentTop"
  340. },
  341. {
  342. "data": {
  343. "isHovered": false
  344. },
  345. "id": "xy-edge__Agent:SlickSpidersTurntool-Tool:ThreeWallsRingend",
  346. "source": "Agent:SlickSpidersTurn",
  347. "sourceHandle": "tool",
  348. "target": "Tool:ThreeWallsRing",
  349. "targetHandle": "end"
  350. },
  351. {
  352. "data": {
  353. "isHovered": false
  354. },
  355. "id": "xy-edge__Agent:IcyPawsRescuetool-Tool:FloppyJokesItchend",
  356. "source": "Agent:IcyPawsRescue",
  357. "sourceHandle": "tool",
  358. "target": "Tool:FloppyJokesItch",
  359. "targetHandle": "end"
  360. }
  361. ],
  362. "nodes": [
  363. {
  364. "data": {
  365. "form": {
  366. "enablePrologue": true,
  367. "inputs": {},
  368. "mode": "conversational",
  369. "prologue": "Hi! I'm your SEO blog assistant.\n\nTo get started, please tell me:\n1. What topic you want the blog to cover\n2. Who is the target audience\n3. What you hope to achieve with this blog (e.g., SEO traffic, teaching beginners, promoting a product)\n"
  370. },
  371. "label": "Begin",
  372. "name": "begin"
  373. },
  374. "dragging": false,
  375. "id": "begin",
  376. "measured": {
  377. "height": 48,
  378. "width": 200
  379. },
  380. "position": {
  381. "x": 38.19445084117184,
  382. "y": 183.9781832844475
  383. },
  384. "selected": false,
  385. "sourcePosition": "left",
  386. "targetPosition": "right",
  387. "type": "beginNode"
  388. },
  389. {
  390. "data": {
  391. "form": {
  392. "delay_after_error": 1,
  393. "description": "",
  394. "exception_comment": "",
  395. "exception_default_value": "",
  396. "exception_goto": [],
  397. "exception_method": null,
  398. "frequencyPenaltyEnabled": false,
  399. "frequency_penalty": 0.5,
  400. "llm_id": "deepseek-chat@DeepSeek",
  401. "maxTokensEnabled": false,
  402. "max_retries": 3,
  403. "max_rounds": 3,
  404. "max_tokens": 4096,
  405. "mcp": [],
  406. "message_history_window_size": 12,
  407. "outputs": {
  408. "content": {
  409. "type": "string",
  410. "value": ""
  411. }
  412. },
  413. "parameter": "Precise",
  414. "presencePenaltyEnabled": false,
  415. "presence_penalty": 0.5,
  416. "prompts": [
  417. {
  418. "content": "The user query is {sys.query}",
  419. "role": "user"
  420. }
  421. ],
  422. "sys_prompt": "# Role\n\nYou are the **Lead Agent**, responsible for initiating the multi-agent SEO blog generation process. You will receive the user\u2019s topic and blog goal, interpret the intent, and coordinate the downstream writing agents.\n\n# Goals\n\n1. Parse the user's initial input.\n\n2. Generate a high-level blog intent summary and writing plan.\n\n3. Provide clear instructions to the following Sub_Agents:\n\n - `Outline Agent` \u2192 Create the blog outline.\n\n - `Body Agent` \u2192 Write all sections based on outline.\n\n - `Editor Agent` \u2192 Polish and finalize the blog post.\n\n4. Merge outputs into a complete, readable blog draft in Markdown format.\n\n# Input\n\nYou will receive:\n\n- Blog topic\n\n- Target audience\n\n- Blog goal (e.g., SEO, education, product marketing)\n\n# Output Format\n\n```markdown\n\n## Parsed Writing Plan\n\n- **Topic**: [Extracted from user input]\n\n- **Audience**: [Summarized from user input]\n\n- **Intent**: [Inferred goal and style]\n\n- **Blog Type**: [e.g., Tutorial / Informative Guide / Marketing Content]\n\n- **Long-tail Keywords**: \n\n - keyword 1\n\n - keyword 2\n\n - keyword 3\n\n - ...\n\n## Instructions for Outline Agent\n\nPlease generate a structured outline including H2 and H3 headings. Assign 1\u20132 relevant keywords to each section. Keep it aligned with the user\u2019s intent and audience level.\n\n## Instructions for Body Agent\n\nWrite the full content based on the outline. Each section should be concise (500\u2013600 words), informative, and optimized for SEO. Use `Tavily Search` only when additional examples or context are needed.\n\n## Instructions for Editor Agent\n\nReview and refine the combined content. Improve transitions, ensure keyword integration, and add a meta title + meta description. Maintain Markdown formatting.\n\n\n## Guides\n\n- Do not generate blog content directly.\n\n- Focus on correct intent recognition and instruction generation.\n\n- Keep communication to downstream agents simple, scoped, and accurate.\n\n\n## Input Examples (and how to handle them)\n\nInput: \"I want to write about RAGFlow.\"\n\u2192 Output: Informative Guide, Audience: AI developers, Intent: explain what RAGFlow is and its use cases\n\nInput: \"Need a blog to promote our prompt design tool.\"\n\u2192 Output: Marketing Content, Audience: product managers or tool adopters, Intent: raise awareness and interest in the product\n\nInput: \"How to get more Google traffic using AI\"\n\u2192 Output: How-to, Audience: SEO marketers, Intent: guide readers on applying AI for SEO growth",
  423. "temperature": "0.1",
  424. "temperatureEnabled": true,
  425. "tools": [],
  426. "topPEnabled": false,
  427. "top_p": 0.75,
  428. "user_prompt": "",
  429. "visual_files_var": ""
  430. },
  431. "label": "Agent",
  432. "name": "Lead Agent"
  433. },
  434. "id": "Agent:LuckyApplesGrab",
  435. "measured": {
  436. "height": 84,
  437. "width": 200
  438. },
  439. "position": {
  440. "x": 350,
  441. "y": 200
  442. },
  443. "selected": false,
  444. "sourcePosition": "right",
  445. "targetPosition": "left",
  446. "type": "agentNode"
  447. },
  448. {
  449. "data": {
  450. "form": {
  451. "content": [
  452. "{Agent:LuckyApplesGrab@content}"
  453. ]
  454. },
  455. "label": "Message",
  456. "name": "Response"
  457. },
  458. "dragging": false,
  459. "id": "Message:ModernSwansThrow",
  460. "measured": {
  461. "height": 56,
  462. "width": 200
  463. },
  464. "position": {
  465. "x": 669.394830760932,
  466. "y": 190.72421137520644
  467. },
  468. "selected": false,
  469. "sourcePosition": "right",
  470. "targetPosition": "left",
  471. "type": "messageNode"
  472. },
  473. {
  474. "data": {
  475. "form": {
  476. "delay_after_error": 1,
  477. "description": "Generates a clear and SEO-friendly blog outline using H2/H3 headings based on the topic, audience, and intent provided by the lead agent. Each section includes suggested keywords for optimized downstream writing.\n",
  478. "exception_comment": "",
  479. "exception_default_value": "",
  480. "exception_goto": [],
  481. "exception_method": null,
  482. "frequencyPenaltyEnabled": false,
  483. "frequency_penalty": 0.3,
  484. "llm_id": "deepseek-chat@DeepSeek",
  485. "maxTokensEnabled": false,
  486. "max_retries": 3,
  487. "max_rounds": 2,
  488. "max_tokens": 4096,
  489. "mcp": [],
  490. "message_history_window_size": 12,
  491. "outputs": {
  492. "content": {
  493. "type": "string",
  494. "value": ""
  495. }
  496. },
  497. "parameter": "Balance",
  498. "presencePenaltyEnabled": false,
  499. "presence_penalty": 0.2,
  500. "prompts": [
  501. {
  502. "content": "{sys.query}",
  503. "role": "user"
  504. }
  505. ],
  506. "sys_prompt": "# Role\n\nYou are the **Outline Agent**, a sub-agent in a multi-agent SEO blog writing system. You operate under the instruction of the `Lead Agent`, and your sole responsibility is to create a clear, well-structured, and SEO-optimized blog outline.\n\n# Tool Access:\n\n- You have access to a search tool called `Tavily Search`.\n\n- If you are unsure how to structure a section, you may call this tool to search for related blog outlines or content from Google.\n\n- Do not overuse it. Your job is to extract **structure**, not to write paragraphs.\n\n\n# Goals\n\n1. Create a well-structured outline with appropriate H2 and H3 headings.\n\n2. Ensure logical flow from introduction to conclusion.\n\n3. Assign 1\u20132 suggested long-tail keywords to each major section for SEO alignment.\n\n4. Make the structure suitable for downstream paragraph writing.\n\n\n\n\n#Note\n\n- Use concise, scannable section titles.\n\n- Do not write full paragraphs.\n\n- Prioritize clarity, logical progression, and SEO alignment.\n\n\n\n- If the blog type is \u201cTutorial\u201d or \u201cHow-to\u201d, include step-based sections.\n\n\n# Input\n\nYou will receive:\n\n- Writing Type (e.g., Tutorial, Informative Guide)\n\n- Target Audience\n\n- User Intent Summary\n\n- 3\u20135 long-tail keywords\n\n\nUse this information to design a structure that both informs readers and maximizes search engine visibility.\n\n# Output Format\n\n```markdown\n\n## Blog Title (suggested)\n\n[Give a short, SEO-friendly title suggestion]\n\n## Outline\n\n### Introduction\n\n- Purpose of the article\n\n- Brief context\n\n- **Suggested keywords**: [keyword1, keyword2]\n\n### H2: [Section Title 1]\n\n- [Short description of what this section will cover]\n\n- **Suggested keywords**: [keyword1, keyword2]\n\n### H2: [Section Title 2]\n\n- [Short description of what this section will cover]\n\n- **Suggested keywords**: [keyword1, keyword2]\n\n### H2: [Section Title 3]\n\n- [Optional H3 Subsection Title A]\n\n - [Explanation of sub-point]\n\n- [Optional H3 Subsection Title B]\n\n - [Explanation of sub-point]\n\n- **Suggested keywords**: [keyword1]\n\n### Conclusion\n\n- Recap key takeaways\n\n- Optional CTA (Call to Action)\n\n- **Suggested keywords**: [keyword3]\n\n",
  507. "temperature": 0.5,
  508. "temperatureEnabled": true,
  509. "tools": [
  510. {
  511. "component_name": "TavilySearch",
  512. "name": "TavilySearch",
  513. "params": {
  514. "api_key": "",
  515. "days": 7,
  516. "exclude_domains": [],
  517. "include_answer": false,
  518. "include_domains": [],
  519. "include_image_descriptions": false,
  520. "include_images": false,
  521. "include_raw_content": true,
  522. "max_results": 5,
  523. "outputs": {
  524. "formalized_content": {
  525. "type": "string",
  526. "value": ""
  527. },
  528. "json": {
  529. "type": "Array<Object>",
  530. "value": []
  531. }
  532. },
  533. "query": "sys.query",
  534. "search_depth": "basic",
  535. "topic": "general"
  536. }
  537. }
  538. ],
  539. "topPEnabled": false,
  540. "top_p": 0.85,
  541. "user_prompt": "This is the order you need to send to the agent.",
  542. "visual_files_var": ""
  543. },
  544. "label": "Agent",
  545. "name": "Outline Agent"
  546. },
  547. "dragging": false,
  548. "id": "Agent:SlickSpidersTurn",
  549. "measured": {
  550. "height": 84,
  551. "width": 200
  552. },
  553. "position": {
  554. "x": 100.60137004146719,
  555. "y": 411.67654846431367
  556. },
  557. "selected": false,
  558. "sourcePosition": "right",
  559. "targetPosition": "left",
  560. "type": "agentNode"
  561. },
  562. {
  563. "data": {
  564. "form": {
  565. "delay_after_error": 1,
  566. "description": "Writes the full blog content section-by-section following the outline structure. It integrates target keywords naturally and uses Tavily Search only when additional facts or examples are needed.\n",
  567. "exception_comment": "",
  568. "exception_default_value": "",
  569. "exception_goto": [],
  570. "exception_method": null,
  571. "frequencyPenaltyEnabled": false,
  572. "frequency_penalty": 0.5,
  573. "llm_id": "deepseek-chat@DeepSeek",
  574. "maxTokensEnabled": false,
  575. "max_retries": 3,
  576. "max_rounds": 3,
  577. "max_tokens": 4096,
  578. "mcp": [],
  579. "message_history_window_size": 12,
  580. "outputs": {
  581. "content": {
  582. "type": "string",
  583. "value": ""
  584. }
  585. },
  586. "parameter": "Precise",
  587. "presencePenaltyEnabled": false,
  588. "presence_penalty": 0.5,
  589. "prompts": [
  590. {
  591. "content": "{sys.query}",
  592. "role": "user"
  593. }
  594. ],
  595. "sys_prompt": "# Role\n\nYou are the **Body Agent**, a sub-agent in a multi-agent SEO blog writing system. You operate under the instruction of the `Lead Agent`, and your job is to write the full blog content based on the outline created by the `OutlineWriter_Agent`.\n\n\n\n# Tool Access:\n\nYou can use the `Tavily Search` tool to retrieve relevant content, statistics, or examples to support each section you're writing.\n\nUse it **only** when the provided outline lacks enough information, or if the section requires factual grounding.\n\nAlways cite the original link or indicate source where possible.\n\n\n# Goals\n\n1. Write each section (based on H2/H3 structure) as a complete and natural blog paragraph.\n\n2. Integrate the suggested long-tail keywords naturally into each section.\n\n3. When appropriate, use the `Tavily Search` tool to enrich your writing with relevant facts, examples, or quotes.\n\n4. Ensure each section is clear, engaging, and informative, suitable for both human readers and search engines.\n\n\n# Style Guidelines\n\n- Write in a tone appropriate to the audience. Be explanatory, not promotional, unless it's a marketing blog.\n\n- Avoid generic filler content. Prioritize clarity, structure, and value.\n\n- Ensure SEO keywords are embedded seamlessly, not forcefully.\n\n\n\n- Maintain writing rhythm. Vary sentence lengths. Use transitions between ideas.\n\n\n# Input\n\n\nYou will receive:\n\n- Blog title\n\n- Structured outline (including section titles, keywords, and descriptions)\n\n- Target audience\n\n- Blog type and user intent\n\nYou must **follow the outline strictly**. Write content **section-by-section**, based on the structure.\n\n\n# Output Format\n\n```markdown\n\n## H2: [Section Title]\n\n[Your generated content for this section \u2014 500-600 words, using keywords naturally.]\n\n",
  596. "temperature": 0.2,
  597. "temperatureEnabled": true,
  598. "tools": [
  599. {
  600. "component_name": "TavilySearch",
  601. "name": "TavilySearch",
  602. "params": {
  603. "api_key": "",
  604. "days": 7,
  605. "exclude_domains": [],
  606. "include_answer": false,
  607. "include_domains": [],
  608. "include_image_descriptions": false,
  609. "include_images": false,
  610. "include_raw_content": true,
  611. "max_results": 5,
  612. "outputs": {
  613. "formalized_content": {
  614. "type": "string",
  615. "value": ""
  616. },
  617. "json": {
  618. "type": "Array<Object>",
  619. "value": []
  620. }
  621. },
  622. "query": "sys.query",
  623. "search_depth": "basic",
  624. "topic": "general"
  625. }
  626. }
  627. ],
  628. "topPEnabled": false,
  629. "top_p": 0.75,
  630. "user_prompt": "This is the order you need to send to the agent.",
  631. "visual_files_var": ""
  632. },
  633. "label": "Agent",
  634. "name": "Body Agent"
  635. },
  636. "dragging": false,
  637. "id": "Agent:IcyPawsRescue",
  638. "measured": {
  639. "height": 84,
  640. "width": 200
  641. },
  642. "position": {
  643. "x": 439.3374395738501,
  644. "y": 366.1408588516909
  645. },
  646. "selected": false,
  647. "sourcePosition": "right",
  648. "targetPosition": "left",
  649. "type": "agentNode"
  650. },
  651. {
  652. "data": {
  653. "form": {
  654. "delay_after_error": 1,
  655. "description": "Polishes and finalizes the entire blog post. Enhances clarity, checks keyword usage, improves flow, and generates a meta title and description for SEO. Operates after all sections are completed.\n\n",
  656. "exception_comment": "",
  657. "exception_default_value": "",
  658. "exception_goto": [],
  659. "exception_method": null,
  660. "frequencyPenaltyEnabled": false,
  661. "frequency_penalty": 0.5,
  662. "llm_id": "deepseek-chat@DeepSeek",
  663. "maxTokensEnabled": false,
  664. "max_retries": 3,
  665. "max_rounds": 2,
  666. "max_tokens": 4096,
  667. "mcp": [],
  668. "message_history_window_size": 12,
  669. "outputs": {
  670. "content": {
  671. "type": "string",
  672. "value": ""
  673. }
  674. },
  675. "parameter": "Precise",
  676. "presencePenaltyEnabled": false,
  677. "presence_penalty": 0.5,
  678. "prompts": [
  679. {
  680. "content": "{sys.query}",
  681. "role": "user"
  682. }
  683. ],
  684. "sys_prompt": "# Role\n\nYou are the **Editor Agent**, the final agent in a multi-agent SEO blog writing workflow. You are responsible for finalizing the blog post for both human readability and SEO effectiveness.\n\n# Goals\n\n1. Polish the entire blog content for clarity, coherence, and style.\n\n2. Improve transitions between sections, ensure logical flow.\n\n3. Verify that keywords are used appropriately and effectively.\n\n4. Conduct a lightweight SEO audit \u2014 checking keyword density, structure (H1/H2/H3), and overall searchability.\n\n\n\n## Integration Responsibilities\n\n- Maintain alignment with Lead Agent's original intent and audience\n\n- Preserve the structure and keyword strategy from Outline Agent\n\n- Enhance and polish Body Agent's content without altering core information\n\n# Style Guidelines\n\n- Be precise. Avoid bloated or vague language.\n\n- Maintain an informative and engaging tone, suitable to the target audience.\n\n- Do not remove keywords unless absolutely necessary for clarity.\n\n- Ensure paragraph flow and section continuity.\n\n\n\n# Input\n\nYou will receive:\n\n- Full blog content, written section-by-section\n\n- Original outline with suggested keywords\n\n- Target audience and writing type\n\n# Output Format\n\n```markdown\n\n[The revised, fully polished blog post content goes here.]\n",
  685. "temperature": 0.2,
  686. "temperatureEnabled": true,
  687. "tools": [],
  688. "topPEnabled": false,
  689. "top_p": 0.75,
  690. "user_prompt": "This is the order you need to send to the agent.",
  691. "visual_files_var": ""
  692. },
  693. "label": "Agent",
  694. "name": "Editor Agent"
  695. },
  696. "dragging": false,
  697. "id": "Agent:TenderAdsAllow",
  698. "measured": {
  699. "height": 84,
  700. "width": 200
  701. },
  702. "position": {
  703. "x": 730.8513124709204,
  704. "y": 327.351197329827
  705. },
  706. "selected": false,
  707. "sourcePosition": "right",
  708. "targetPosition": "left",
  709. "type": "agentNode"
  710. },
  711. {
  712. "data": {
  713. "form": {
  714. "description": "This is an agent for a specific task.",
  715. "user_prompt": "This is the order you need to send to the agent."
  716. },
  717. "label": "Tool",
  718. "name": "flow.tool_0"
  719. },
  720. "dragging": false,
  721. "id": "Tool:ThreeWallsRing",
  722. "measured": {
  723. "height": 48,
  724. "width": 200
  725. },
  726. "position": {
  727. "x": -26.93431957115564,
  728. "y": 531.4384641920368
  729. },
  730. "selected": false,
  731. "sourcePosition": "right",
  732. "targetPosition": "left",
  733. "type": "toolNode"
  734. },
  735. {
  736. "data": {
  737. "form": {
  738. "description": "This is an agent for a specific task.",
  739. "user_prompt": "This is the order you need to send to the agent."
  740. },
  741. "label": "Tool",
  742. "name": "flow.tool_1"
  743. },
  744. "dragging": false,
  745. "id": "Tool:FloppyJokesItch",
  746. "measured": {
  747. "height": 48,
  748. "width": 200
  749. },
  750. "position": {
  751. "x": 414.6786783453011,
  752. "y": 499.39483076093194
  753. },
  754. "selected": false,
  755. "sourcePosition": "right",
  756. "targetPosition": "left",
  757. "type": "toolNode"
  758. },
  759. {
  760. "data": {
  761. "form": {
  762. "text": "This is a multi-agent version of the SEO blog generation workflow. It simulates a small team of AI \u201cwriters\u201d, where each agent plays a specialized role \u2014 just like a real editorial team.\n\nInstead of one AI doing everything in order, this version uses a **Lead Agent** to assign tasks to different sub-agents, who then write and edit the blog in parallel. The Lead Agent manages everything and produces the final output.\n\n### Why use multi-agent format?\n\n- Better control over each stage of writing \n- Easier to reuse agents across tasks \n- More human-like workflow (planning \u2192 writing \u2192 editing \u2192 publishing) \n- Easier to scale and customize for advanced users\n\n### Flow Summary:\n\n1. `LeadWriter_Agent` takes your input and creates a plan\n2. It sends that plan to:\n - `OutlineWriter_Agent`: build blog structure\n - `BodyWriter_Agent`: write full content\n - `FinalEditor_Agent`: polish and finalize\n3. `LeadWriter_Agent` collects all results and outputs the final blog post\n"
  763. },
  764. "label": "Note",
  765. "name": "Workflow Overall Description"
  766. },
  767. "dragHandle": ".note-drag-handle",
  768. "dragging": false,
  769. "height": 208,
  770. "id": "Note:ElevenVansInvent",
  771. "measured": {
  772. "height": 208,
  773. "width": 518
  774. },
  775. "position": {
  776. "x": -336.6586460874556,
  777. "y": 113.43253511344867
  778. },
  779. "resizing": false,
  780. "selected": false,
  781. "sourcePosition": "right",
  782. "targetPosition": "left",
  783. "type": "noteNode",
  784. "width": 518
  785. },
  786. {
  787. "data": {
  788. "form": {
  789. "text": "**Purpose**: \nThis is the central agent that controls the entire writing process.\n\n**What it does**:\n- Reads your blog topic and intent\n- Generates a clear writing plan (topic, audience, goal, keywords)\n- Sends instructions to all sub-agents\n- Waits for their responses and checks quality\n- If any section is missing or weak, it can request a rewrite\n- Finally, it assembles all parts into a complete blog and sends it back to you\n"
  790. },
  791. "label": "Note",
  792. "name": "Lead Agent"
  793. },
  794. "dragHandle": ".note-drag-handle",
  795. "dragging": false,
  796. "height": 146,
  797. "id": "Note:EmptyClubsGreet",
  798. "measured": {
  799. "height": 146,
  800. "width": 334
  801. },
  802. "position": {
  803. "x": 390.1408623279084,
  804. "y": 2.6521144030202493
  805. },
  806. "resizing": false,
  807. "selected": false,
  808. "sourcePosition": "right",
  809. "targetPosition": "left",
  810. "type": "noteNode",
  811. "width": 334
  812. },
  813. {
  814. "data": {
  815. "form": {
  816. "text": "**Purpose**: \nThis agent is responsible for building the blog's structure. It creates an outline that shows what the article will cover and how it's organized.\n\n**What it does**:\n- Suggests a blog title that matches the topic and keywords \n- Breaks the article into sections using H2 and H3 headers \n- Adds a short description of what each section should include \n- Assigns SEO keywords to each section for better search visibility \n- Uses search data (via Tavily Search) to find how similar blogs are structured"
  817. },
  818. "label": "Note",
  819. "name": "Outline Agent"
  820. },
  821. "dragHandle": ".note-drag-handle",
  822. "dragging": false,
  823. "height": 157,
  824. "id": "Note:CurlyTigersDouble",
  825. "measured": {
  826. "height": 157,
  827. "width": 394
  828. },
  829. "position": {
  830. "x": -60.03139680691618,
  831. "y": 595.8208080534818
  832. },
  833. "resizing": false,
  834. "selected": false,
  835. "sourcePosition": "right",
  836. "targetPosition": "left",
  837. "type": "noteNode",
  838. "width": 394
  839. },
  840. {
  841. "data": {
  842. "form": {
  843. "text": "**Purpose**: \nThis agent is in charge of writing the full blog content, section by section, based on the outline it receives.\n\n**What it does**:\n- Takes each section heading from the outline (H2 / H3)\n- Writes a complete paragraph (150\u2013220 words) under each section\n- Naturally includes the keywords provided for that section\n- Uses the Tavily Search tool to add real-world examples, definitions, or facts if needed\n- Makes sure each section is clear, useful, and easy to read\n"
  844. },
  845. "label": "Note",
  846. "name": "Body Agent"
  847. },
  848. "dragHandle": ".note-drag-handle",
  849. "dragging": false,
  850. "height": 164,
  851. "id": "Note:StrongKingsCamp",
  852. "measured": {
  853. "height": 164,
  854. "width": 408
  855. },
  856. "position": {
  857. "x": 446.54943226110845,
  858. "y": 590.9443887062529
  859. },
  860. "resizing": false,
  861. "selected": false,
  862. "sourcePosition": "right",
  863. "targetPosition": "left",
  864. "type": "noteNode",
  865. "width": 408
  866. },
  867. {
  868. "data": {
  869. "form": {
  870. "text": "**Purpose**: \nThis agent reviews, polishes, and finalizes the blog post written by the BodyWriter_Agent. It ensures everything is clean, smooth, and SEO-compliant.\n\n**What it does**:\n- Improves grammar, sentence flow, and transitions \n- Makes sure the content reads naturally and professionally \n- Checks whether keywords are present and well integrated (but not overused) \n- Verifies that the structure follows the correct H1/H2/H3 format \n"
  871. },
  872. "label": "Note",
  873. "name": "Editor Agent"
  874. },
  875. "dragHandle": ".note-drag-handle",
  876. "dragging": false,
  877. "height": 147,
  878. "id": "Note:OpenOttersShow",
  879. "measured": {
  880. "height": 147,
  881. "width": 357
  882. },
  883. "position": {
  884. "x": 976.6858726228803,
  885. "y": 422.7404806291804
  886. },
  887. "resizing": false,
  888. "selected": false,
  889. "sourcePosition": "right",
  890. "targetPosition": "left",
  891. "type": "noteNode",
  892. "width": 357
  893. }
  894. ]
  895. },
  896. "history": [],
  897. "messages": [],
  898. "path": [],
  899. "retrieval": []
  900. },
  901. "avatar": "data:image/jpeg;base64,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"
  902. }