diff --git a/agent/templates/cajal_scientific_paper_agent.json b/agent/templates/cajal_scientific_paper_agent.json index 3318f378dd..ccc791afd2 100644 --- a/agent/templates/cajal_scientific_paper_agent.json +++ b/agent/templates/cajal_scientific_paper_agent.json @@ -1,306 +1,308 @@ { - "id": "41", - "title": { - "en": "CAJAL scientific paper agent", - "de": "CAJAL-Agent für wissenschaftliche Arbeiten", - "zh": "CAJAL 科学论文助手" - }, - "description": { - "en": "A local-first scientific paper generation agent for RAGFlow. It is preconfigured for Agnuxo/CAJAL-4B-P2PCLAW through Ollama, retrieves knowledge-base evidence, and drafts citation-grounded LaTeX-ready academic sections.", - "de": "Ein lokal ausgerichteter Agent zur Erstellung wissenschaftlicher Arbeiten in RAGFlow. Er ist für Agnuxo/CAJAL-4B-P2PCLAW über Ollama vorkonfiguriert, ruft Evidenz aus der Wissensdatenbank ab und erstellt zitationsgestützte, LaTeX-fähige akademische Abschnitte.", - "zh": "面向 RAGFlow 的本地优先科学论文生成助手。该模板预配置 Agnuxo/CAJAL-4B-P2PCLAW(Ollama),可检索知识库证据,并生成带引用依据、适合 LaTeX 的学术章节。" - }, - "canvas_type": "Agent", - "canvas_types": [ - "Agent", - "Recommended" - ], - "dsl": { - "components": { - "Agent:NewPumasLick": { - "downstream": [ - "Message:OrangeYearsShine" - ], - "obj": { - "component_name": "Agent", - "params": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.5, - "llm_id": "agnuxo/cajal-4b-p2pclaw@Ollama", - "maxTokensEnabled": true, - "max_retries": 3, - "max_rounds": 3, - "max_tokens": 32768, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "parameter": "Precise", - "presencePenaltyEnabled": false, - "presence_penalty": 0.5, - "prompts": [ - { - "role": "user", - "content": "# Research request\n{sys.query}\n\nUse the configured knowledge base retrieval tool before drafting. If no evidence is retrieved, state that limitation clearly." - } - ], - "sys_prompt": "## Role & Task\nYou are **CAJAL**, a local-first scientific writing agent specialized in citation-grounded paper generation.\n\nUse RAGFlow retrieval results as the source of truth. Write precise academic content that can be pasted into a paper draft, technical report, or LaTeX manuscript. You are optimized for the local GGUF model `Agnuxo/CAJAL-4B-P2PCLAW` served through Ollama as `agnuxo/cajal-4b-p2pclaw`.\n\n## Operating Rules\n1. Decompose the user request into research goals, target section type, expected citation style, and missing evidence.\n2. Retrieve relevant knowledge-base passages before drafting factual claims.\n3. Ground every substantive claim in retrieved evidence. If evidence is missing, mark it as a limitation instead of inventing a citation.\n4. Prefer structured scientific writing: abstract, introduction, related work, methodology, experiments, results, limitations, and conclusion.\n5. Use LaTeX formatting for equations, symbols, algorithms, tables, and section headings when it helps the manuscript.\n6. Preserve traceability: cite source titles, document names, page numbers, or chunk identifiers when available in retrieved context.\n7. Keep language technical, concise, and reproducible. Avoid marketing language and vague generalizations.\n\n## Output Contract\nReturn one of the following, depending on the user request:\n- A complete paper section with citation markers and a short evidence map.\n- A literature review organized by themes, methods, findings, and gaps.\n- A methodology or experiment section with reproducible steps, assumptions, and limitations.\n- A LaTeX-ready abstract, introduction, or conclusion.\n\nAlways include:\n- **Draft**: the requested scientific content.\n- **Evidence used**: concise bullets mapping claims to retrieved sources.\n- **Limitations**: missing evidence, weak support, or assumptions that require verification.\n", - "temperature": 0.2, - "temperatureEnabled": true, - "tools": [ - { - "component_name": "Retrieval", - "name": "Retrieval", - "params": { - "cross_languages": [], - "description": "Retrieve papers, reports, datasets, and notes that ground CAJAL scientific writing outputs.", - "empty_response": "", - "kb_ids": [], - "retrieval_from": "dataset", - "keywords_similarity_weight": 0.7, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" + "id": "41", + "title": { + "en": "CAJAL scientific paper agent", + "de": "CAJAL-Agent für wissenschaftliche Arbeiten", + "zh": "CAJAL 科学论文助手" + }, + "description": { + "en": "A local-first scientific paper generation agent for RAGFlow. It is preconfigured for Agnuxo/CAJAL-4B-P2PCLAW through Ollama, retrieves knowledge-base evidence, and drafts citation-grounded LaTeX-ready academic sections.", + "de": "Ein lokal ausgerichteter Agent zur Erstellung wissenschaftlicher Arbeiten in RAGFlow. Er ist für Agnuxo/CAJAL-4B-P2PCLAW über Ollama vorkonfiguriert, ruft Evidenz aus der Wissensdatenbank ab und erstellt zitationsgestützte, LaTeX-fähige akademische Abschnitte.", + "zh": "面向 RAGFlow 的本地优先科学论文生成助手。该模板预配置 Agnuxo/CAJAL-4B-P2PCLAW(Ollama),可检索知识库证据,并生成带引用依据、适合 LaTeX 的学术章节。" + }, + "canvas_type": "Agent", + "canvas_types": [ + "Agent", + "Recommended" + ], + "dsl": { + "components": { + "Agent:NewPumasLick": { + "downstream": [ + "Message:OrangeYearsShine" + ], + "obj": { + "component_name": "Agent", + "params": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.5, + "llm_id": "agnuxo/cajal-4b-p2pclaw@Ollama", + "maxTokensEnabled": true, + "max_retries": 3, + "max_rounds": 3, + "max_tokens": 32768, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "parameter": "Precise", + "presencePenaltyEnabled": false, + "presence_penalty": 0.5, + "prompts": [ + { + "role": "user", + "content": "# Research request\n{sys.query}\n\nUse the configured knowledge base retrieval tool before drafting. If no evidence is retrieved, state that limitation clearly." + } + ], + "sys_prompt": "## Role & Task\nYou are **CAJAL**, a local-first scientific writing agent specialized in citation-grounded paper generation.\n\nUse RAGFlow retrieval results as the source of truth. Write precise academic content that can be pasted into a paper draft, technical report, or LaTeX manuscript. You are optimized for the local GGUF model `Agnuxo/CAJAL-4B-P2PCLAW` served through Ollama as `agnuxo/cajal-4b-p2pclaw`.\n\n## Operating Rules\n1. Decompose the user request into research goals, target section type, expected citation style, and missing evidence.\n2. Retrieve relevant knowledge-base passages before drafting factual claims.\n3. Ground every substantive claim in retrieved evidence. If evidence is missing, mark it as a limitation instead of inventing a citation.\n4. Prefer structured scientific writing: abstract, introduction, related work, methodology, experiments, results, limitations, and conclusion.\n5. Use LaTeX formatting for equations, symbols, algorithms, tables, and section headings when it helps the manuscript.\n6. Preserve traceability: cite source titles, document names, page numbers, or chunk identifiers when available in retrieved context.\n7. Keep language technical, concise, and reproducible. Avoid marketing language and vague generalizations.\n\n## Output Contract\nReturn one of the following, depending on the user request:\n- A complete paper section with citation markers and a short evidence map.\n- A literature review organized by themes, methods, findings, and gaps.\n- A methodology or experiment section with reproducible steps, assumptions, and limitations.\n- A LaTeX-ready abstract, introduction, or conclusion.\n\nAlways include:\n- **Draft**: the requested scientific content.\n- **Evidence used**: concise bullets mapping claims to retrieved sources.\n- **Limitations**: missing evidence, weak support, or assumptions that require verification.\n", + "temperature": 0.2, + "temperatureEnabled": true, + "tools": [ + { + "component_name": "Retrieval", + "name": "Retrieval", + "params": { + "cross_languages": [], + "description": "Retrieve papers, reports, datasets, and notes that ground CAJAL scientific writing outputs.", + "empty_response": "", + "kb_ids": [], + "retrieval_from": "dataset", + "keywords_similarity_weight": 0.7, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" + } + }, + "rerank_id": "", + "similarity_threshold": 0.2, + "top_k": 1024, + "top_n": 10, + "use_kg": false + }, + "id": "Retrieval:FairBoatsBurn" + } + ], + "topPEnabled": false, + "top_p": 0.75, + "user_prompt": "", + "visual_files_var": "" } - }, - "rerank_id": "", - "similarity_threshold": 0.2, - "top_k": 1024, - "top_n": 10, - "use_kg": false - } - } - ], - "topPEnabled": false, - "top_p": 0.75, - "user_prompt": "", - "visual_files_var": "" - } - }, - "upstream": [ - "begin" - ] - }, - "Message:OrangeYearsShine": { - "downstream": [], - "obj": { - "component_name": "Message", - "params": { - "content": [ - "{Agent:NewPumasLick@content}" - ] - } - }, - "upstream": [ - "Agent:NewPumasLick" - ] - }, - "begin": { - "downstream": [ - "Agent:NewPumasLick" - ], - "obj": { - "component_name": "Begin", - "params": { - "enablePrologue": true, - "inputs": {}, - "mode": "conversational", - "prologue": "Hi, I am CAJAL in RAGFlow. Add research papers or datasets to your knowledge base, then ask me to draft a citation-grounded paper section, literature review, methodology, or LaTeX-ready abstract." - } - }, - "upstream": [] - } - }, - "globals": { - "sys.conversation_turns": 0, - "sys.files": [], - "sys.query": "", - "sys.user_id": "" - }, - "graph": { - "edges": [ - { - "data": { - "isHovered": false - }, - "id": "xy-edge__beginstart-Agent:NewPumasLickend", - "source": "begin", - "sourceHandle": "start", - "target": "Agent:NewPumasLick", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:NewPumasLickstart-Message:OrangeYearsShineend", - "markerEnd": "logo", - "source": "Agent:NewPumasLick", - "sourceHandle": "start", - "style": { - "stroke": "rgba(91, 93, 106, 1)", - "strokeWidth": 1 - }, - "target": "Message:OrangeYearsShine", - "targetHandle": "end", - "type": "buttonEdge", - "zIndex": 1001 - } - ], - "nodes": [ - { - "data": { - "form": { - "enablePrologue": true, - "inputs": {}, - "mode": "conversational", - "prologue": "Hi, I am CAJAL in RAGFlow. Add research papers or datasets to your knowledge base, then ask me to draft a citation-grounded paper section, literature review, methodology, or LaTeX-ready abstract." + }, + "upstream": [ + "begin" + ] }, - "label": "Begin", - "name": "begin" - }, - "dragging": false, - "id": "begin", - "measured": { - "height": 48, - "width": 200 - }, - "position": { - "x": -9.569875358221438, - "y": 205.84018385864917 - }, - "selected": false, - "sourcePosition": "left", - "targetPosition": "right", - "type": "beginNode" - }, - { - "data": { - "form": { - "content": [ - "{Agent:NewPumasLick@content}" - ] + "Message:OrangeYearsShine": { + "downstream": [], + "obj": { + "component_name": "Message", + "params": { + "content": [ + "{Agent:NewPumasLick@content}" + ] + } + }, + "upstream": [ + "Agent:NewPumasLick" + ] }, - "label": "Message", - "name": "Scientific Draft" - }, - "dragging": false, - "id": "Message:OrangeYearsShine", - "measured": { - "height": 56, - "width": 200 - }, - "position": { - "x": 734.4061285881053, - "y": 199.9706031723009 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "messageNode" + "begin": { + "downstream": [ + "Agent:NewPumasLick" + ], + "obj": { + "component_name": "Begin", + "params": { + "enablePrologue": true, + "inputs": {}, + "mode": "conversational", + "prologue": "Hi, I am CAJAL in RAGFlow. Add research papers or datasets to your knowledge base, then ask me to draft a citation-grounded paper section, literature review, methodology, or LaTeX-ready abstract." + } + }, + "upstream": [] + } }, - { - "data": { - "form": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.5, - "llm_id": "agnuxo/cajal-4b-p2pclaw@Ollama", - "maxTokensEnabled": true, - "max_retries": 3, - "max_rounds": 3, - "max_tokens": 32768, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "parameter": "Precise", - "presencePenaltyEnabled": false, - "presence_penalty": 0.5, - "prompts": [ + "globals": { + "sys.conversation_turns": 0, + "sys.files": [], + "sys.query": "", + "sys.user_id": "" + }, + "graph": { + "edges": [ { - "role": "user", - "content": "# Research request\n{sys.query}\n\nUse the configured knowledge base retrieval tool before drafting. If no evidence is retrieved, state that limitation clearly." - } - ], - "sys_prompt": "## Role & Task\nYou are **CAJAL**, a local-first scientific writing agent specialized in citation-grounded paper generation.\n\nUse RAGFlow retrieval results as the source of truth. Write precise academic content that can be pasted into a paper draft, technical report, or LaTeX manuscript. You are optimized for the local GGUF model `Agnuxo/CAJAL-4B-P2PCLAW` served through Ollama as `agnuxo/cajal-4b-p2pclaw`.\n\n## Operating Rules\n1. Decompose the user request into research goals, target section type, expected citation style, and missing evidence.\n2. Retrieve relevant knowledge-base passages before drafting factual claims.\n3. Ground every substantive claim in retrieved evidence. If evidence is missing, mark it as a limitation instead of inventing a citation.\n4. Prefer structured scientific writing: abstract, introduction, related work, methodology, experiments, results, limitations, and conclusion.\n5. Use LaTeX formatting for equations, symbols, algorithms, tables, and section headings when it helps the manuscript.\n6. Preserve traceability: cite source titles, document names, page numbers, or chunk identifiers when available in retrieved context.\n7. Keep language technical, concise, and reproducible. Avoid marketing language and vague generalizations.\n\n## Output Contract\nReturn one of the following, depending on the user request:\n- A complete paper section with citation markers and a short evidence map.\n- A literature review organized by themes, methods, findings, and gaps.\n- A methodology or experiment section with reproducible steps, assumptions, and limitations.\n- A LaTeX-ready abstract, introduction, or conclusion.\n\nAlways include:\n- **Draft**: the requested scientific content.\n- **Evidence used**: concise bullets mapping claims to retrieved sources.\n- **Limitations**: missing evidence, weak support, or assumptions that require verification.\n", - "temperature": 0.2, - "temperatureEnabled": true, - "tools": [ - { - "component_name": "Retrieval", - "name": "Retrieval", - "params": { - "cross_languages": [], - "description": "Retrieve papers, reports, datasets, and notes that ground CAJAL scientific writing outputs.", - "empty_response": "", - "kb_ids": [], - "retrieval_from": "dataset", - "keywords_similarity_weight": 0.7, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" - } + "data": { + "isHovered": false }, - "rerank_id": "", - "similarity_threshold": 0.2, - "top_k": 1024, - "top_n": 10, - "use_kg": false - } + "id": "xy-edge__beginstart-Agent:NewPumasLickend", + "source": "begin", + "sourceHandle": "start", + "target": "Agent:NewPumasLick", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:NewPumasLickstart-Message:OrangeYearsShineend", + "markerEnd": "logo", + "source": "Agent:NewPumasLick", + "sourceHandle": "start", + "style": { + "stroke": "rgba(91, 93, 106, 1)", + "strokeWidth": 1 + }, + "target": "Message:OrangeYearsShine", + "targetHandle": "end", + "type": "buttonEdge", + "zIndex": 1001 } - ], - "topPEnabled": false, - "top_p": 0.75, - "user_prompt": "", - "visual_files_var": "" - }, - "label": "Agent", - "name": "CAJAL Writer" - }, - "dragging": false, - "id": "Agent:NewPumasLick", - "measured": { - "height": 84, - "width": 200 - }, - "position": { - "x": 347.00048227952215, - "y": 186.49109364794631 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" - } - ] + ], + "nodes": [ + { + "data": { + "form": { + "enablePrologue": true, + "inputs": {}, + "mode": "conversational", + "prologue": "Hi, I am CAJAL in RAGFlow. Add research papers or datasets to your knowledge base, then ask me to draft a citation-grounded paper section, literature review, methodology, or LaTeX-ready abstract." + }, + "label": "Begin", + "name": "begin" + }, + "dragging": false, + "id": "begin", + "measured": { + "height": 48, + "width": 200 + }, + "position": { + "x": -9.569875358221438, + "y": 205.84018385864917 + }, + "selected": false, + "sourcePosition": "left", + "targetPosition": "right", + "type": "beginNode" + }, + { + "data": { + "form": { + "content": [ + "{Agent:NewPumasLick@content}" + ] + }, + "label": "Message", + "name": "Scientific Draft" + }, + "dragging": false, + "id": "Message:OrangeYearsShine", + "measured": { + "height": 56, + "width": 200 + }, + "position": { + "x": 734.4061285881053, + "y": 199.9706031723009 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "messageNode" + }, + { + "data": { + "form": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.5, + "llm_id": "agnuxo/cajal-4b-p2pclaw@Ollama", + "maxTokensEnabled": true, + "max_retries": 3, + "max_rounds": 3, + "max_tokens": 32768, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "parameter": "Precise", + "presencePenaltyEnabled": false, + "presence_penalty": 0.5, + "prompts": [ + { + "role": "user", + "content": "# Research request\n{sys.query}\n\nUse the configured knowledge base retrieval tool before drafting. If no evidence is retrieved, state that limitation clearly." + } + ], + "sys_prompt": "## Role & Task\nYou are **CAJAL**, a local-first scientific writing agent specialized in citation-grounded paper generation.\n\nUse RAGFlow retrieval results as the source of truth. Write precise academic content that can be pasted into a paper draft, technical report, or LaTeX manuscript. You are optimized for the local GGUF model `Agnuxo/CAJAL-4B-P2PCLAW` served through Ollama as `agnuxo/cajal-4b-p2pclaw`.\n\n## Operating Rules\n1. Decompose the user request into research goals, target section type, expected citation style, and missing evidence.\n2. Retrieve relevant knowledge-base passages before drafting factual claims.\n3. Ground every substantive claim in retrieved evidence. If evidence is missing, mark it as a limitation instead of inventing a citation.\n4. Prefer structured scientific writing: abstract, introduction, related work, methodology, experiments, results, limitations, and conclusion.\n5. Use LaTeX formatting for equations, symbols, algorithms, tables, and section headings when it helps the manuscript.\n6. Preserve traceability: cite source titles, document names, page numbers, or chunk identifiers when available in retrieved context.\n7. Keep language technical, concise, and reproducible. Avoid marketing language and vague generalizations.\n\n## Output Contract\nReturn one of the following, depending on the user request:\n- A complete paper section with citation markers and a short evidence map.\n- A literature review organized by themes, methods, findings, and gaps.\n- A methodology or experiment section with reproducible steps, assumptions, and limitations.\n- A LaTeX-ready abstract, introduction, or conclusion.\n\nAlways include:\n- **Draft**: the requested scientific content.\n- **Evidence used**: concise bullets mapping claims to retrieved sources.\n- **Limitations**: missing evidence, weak support, or assumptions that require verification.\n", + "temperature": 0.2, + "temperatureEnabled": true, + "tools": [ + { + "component_name": "Retrieval", + "name": "Retrieval", + "params": { + "cross_languages": [], + "description": "Retrieve papers, reports, datasets, and notes that ground CAJAL scientific writing outputs.", + "empty_response": "", + "kb_ids": [], + "retrieval_from": "dataset", + "keywords_similarity_weight": 0.7, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" + } + }, + "rerank_id": "", + "similarity_threshold": 0.2, + "top_k": 1024, + "top_n": 10, + "use_kg": false + }, + "id": "Retrieval:GrandLionsJump" + } + ], + "topPEnabled": false, + "top_p": 0.75, + "user_prompt": "", + "visual_files_var": "" + }, + "label": "Agent", + "name": "CAJAL Writer" + }, + "dragging": false, + "id": "Agent:NewPumasLick", + "measured": { + "height": 84, + "width": 200 + }, + "position": { + "x": 347.00048227952215, + "y": 186.49109364794631 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" + } + ] + }, + "history": [], + "memory": [], + "messages": [], + "path": [], + "retrieval": [] }, - "history": [], - "memory": [], - "messages": [], - "path": [], - "retrieval": [] - }, - "avatar": "data:image/png;base64,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" -} + "avatar": "data:image/png;base64,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" +} \ No newline at end of file diff --git a/agent/templates/deep_research.json b/agent/templates/deep_research.json index 03a9b9563d..506a717c55 100644 --- a/agent/templates/deep_research.json +++ b/agent/templates/deep_research.json @@ -96,6 +96,7 @@ { "component_name": "TavilySearch", "name": "TavilySearch", + "id": "TavilySearch:FairToolsLive", "params": { "api_key": "", "days": 7, @@ -170,6 +171,7 @@ { "component_name": "TavilyExtract", "name": "TavilyExtract", + "id": "TavilyExtract:SlickYearsCough", "params": { "api_key": "" } @@ -489,6 +491,7 @@ { "component_name": "TavilySearch", "name": "TavilySearch", + "id": "TavilySearch:FairToolsLive", "params": { "api_key": "", "days": 7, @@ -578,6 +581,7 @@ { "component_name": "TavilyExtract", "name": "TavilyExtract", + "id": "TavilyExtract:SlickYearsCough", "params": { "api_key": "" } diff --git a/agent/templates/market_seo_article_writer.json b/agent/templates/market_seo_article_writer.json index fed8f8402d..d6b1dce642 100644 --- a/agent/templates/market_seo_article_writer.json +++ b/agent/templates/market_seo_article_writer.json @@ -3,102 +3,419 @@ "title": { "en": "SEO article writer", "de": "SEO-Blog-Magnetiseur", - "zh": "SEO 博客写手"}, + "zh": "SEO 博客写手" + }, "description": { "en": "This SEO article writer automatically generates a complete SEO-optimized blog article based on a simple user input. You don't need any writing experience. Just provide a topic or short request — the system will handle the rest.", "de": "SEO-Blog-Magnetiseur automatisch einen vollständigen SEO-optimierten Blogartikel basierend auf einer einfachen Benutzereingabe. Sie benötigen keine Schreiberfahrung. Geben Sie einfach ein Thema oder eine kurze Anfrage ein – das System übernimmt den Rest.", - "zh": "此 SEO 博客写手根据简单的用户输入自动生成完整的SEO博客文章。你无需任何写作经验,只需提供一个主题或简短请求,系统将处理其余部分。"}, + "zh": "此 SEO 博客写手根据简单的用户输入自动生成完整的SEO博客文章。你无需任何写作经验,只需提供一个主题或简短请求,系统将处理其余部分。" + }, "canvas_type": "Marketing", - "canvas_types": ["Marketing", "Recommended"], + "canvas_types": [ + "Marketing", + "Recommended" + ], "dsl": { - "components": { - "Agent:BetterSitesSend": { - "downstream": [ - "Agent:EagerNailsRemain" - ], - "obj": { - "component_name": "Agent", - "params": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.3, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 3, - "max_tokens": 4096, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "parameter": "Balance", - "presencePenaltyEnabled": false, - "presence_penalty": 0.2, - "prompts": [ - { - "content": "The parse and keyword agent output is {Agent:ClearRabbitsScream@content}", - "role": "user" - } - ], - "sys_prompt": "# Role\n\nYou are the **Outline_Agent**, responsible for generating a clear and SEO-optimized blog outline based on the user's parsed writing intent and keyword strategy.\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", - "temperature": 0.5, - "temperatureEnabled": true, - "tools": [ - { - "component_name": "TavilySearch", - "name": "TavilySearch", - "params": { - "api_key": "", - "days": 7, - "exclude_domains": [], - "include_answer": false, - "include_domains": [], - "include_image_descriptions": false, - "include_images": false, - "include_raw_content": true, - "max_results": 5, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" - }, - "json": { - "type": "Array", - "value": [] - } + "components": { + "Agent:BetterSitesSend": { + "downstream": [ + "Agent:EagerNailsRemain" + ], + "obj": { + "component_name": "Agent", + "params": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.3, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 3, + "max_tokens": 4096, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "parameter": "Balance", + "presencePenaltyEnabled": false, + "presence_penalty": 0.2, + "prompts": [ + { + "content": "The parse and keyword agent output is {Agent:ClearRabbitsScream@content}", + "role": "user" + } + ], + "sys_prompt": "# Role\n\nYou are the **Outline_Agent**, responsible for generating a clear and SEO-optimized blog outline based on the user's parsed writing intent and keyword strategy.\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–2 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 “Tutorial” or “How-to”, 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–5 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", + "temperature": 0.5, + "temperatureEnabled": true, + "tools": [ + { + "component_name": "TavilySearch", + "name": "TavilySearch", + "params": { + "api_key": "", + "days": 7, + "exclude_domains": [], + "include_answer": false, + "include_domains": [], + "include_image_descriptions": false, + "include_images": false, + "include_raw_content": true, + "max_results": 5, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" }, - "query": "sys.query", - "search_depth": "basic", - "topic": "general" - } - } - ], - "topPEnabled": false, - "top_p": 0.85, - "user_prompt": "", - "visual_files_var": "" - } - }, - "upstream": [ - "Agent:ClearRabbitsScream" - ] + "json": { + "type": "Array", + "value": [] + } + }, + "query": "sys.query", + "search_depth": "basic", + "topic": "general" + }, + "id": "TavilySearch:BetterSitesSend" + } + ], + "topPEnabled": false, + "top_p": 0.85, + "user_prompt": "", + "visual_files_var": "" + } }, - "Agent:ClearRabbitsScream": { - "downstream": [ - "Agent:BetterSitesSend" - ], - "obj": { - "component_name": "Agent", - "params": { + "upstream": [ + "Agent:ClearRabbitsScream" + ] + }, + "Agent:ClearRabbitsScream": { + "downstream": [ + "Agent:BetterSitesSend" + ], + "obj": { + "component_name": "Agent", + "params": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.5, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 1, + "max_tokens": 4096, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "parameter": "Precise", + "presencePenaltyEnabled": false, + "presence_penalty": 0.5, + "prompts": [ + { + "content": "The user query is {sys.query}", + "role": "user" + } + ], + "sys_prompt": "# Role\n\nYou are the **Parse_And_Keyword_Agent**, responsible for interpreting a user's blog writing request and generating a structured writing intent summary and keyword strategy for SEO-optimized content generation.\n\n# Goals\n\n1. Extract and infer the user's true writing intent, even if the input is informal or vague.\n\n2. Identify the writing type, target audience, and implied goal.\n\n3. Suggest 3–5 long-tail keywords based on the input and context.\n\n4. Output all data in a Markdown format for downstream agents.\n\n# Operating Guidelines\n\n\n- If the user's input lacks clarity, make reasonable and **conservative** assumptions based on SEO best practices.\n\n- Always choose one clear \"Writing Type\" from the list below.\n\n- Your job is not to write the blog — only to structure the brief.\n\n# Output Format\n\n```markdown\n## Writing Type\n\n[Choose one: Tutorial / Informative Guide / Marketing Content / Case Study / Opinion Piece / How-to / Comparison Article]\n\n## Target Audience\n\n[Try to be specific based on clues in the input: e.g., marketing managers, junior developers, SEO beginners]\n\n## User Intent Summary\n\n[A 1–2 sentence summary of what the user wants to achieve with the blog post]\n\n## Suggested Long-tail Keywords\n\n- keyword 1\n\n- keyword 2\n\n- keyword 3\n\n- keyword 4 (optional)\n\n- keyword 5 (optional)\n\n\n\n\n## Input Examples (and how to handle them)\n\nInput: \"I want to write about RAGFlow.\"\n→ 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→ Output: Marketing Content, Audience: product managers or tool adopters, Intent: raise awareness and interest in the product\n\n\n\nInput: \"How to get more Google traffic using AI\"\n→ Output: How-to, Audience: SEO marketers, Intent: guide readers on applying AI for SEO growth", + "temperature": 0.2, + "temperatureEnabled": true, + "tools": [], + "topPEnabled": false, + "top_p": 0.75, + "user_prompt": "", + "visual_files_var": "" + } + }, + "upstream": [ + "begin" + ] + }, + "Agent:EagerNailsRemain": { + "downstream": [ + "Agent:LovelyHeadsOwn" + ], + "obj": { + "component_name": "Agent", + "params": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.5, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 5, + "max_tokens": 4096, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "parameter": "Precise", + "presencePenaltyEnabled": false, + "presence_penalty": 0.5, + "prompts": [ + { + "content": "The parse and keyword agent output is {Agent:ClearRabbitsScream@content}\n\n\n\nThe Outline agent output is {Agent:BetterSitesSend@content}", + "role": "user" + } + ], + "sys_prompt": "# Role\n\nYou are the **Body_Agent**, responsible for generating the full content of each section of an SEO-optimized blog based on the provided outline and keyword strategy.\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 — 500-600 words, using keywords naturally.]\n\n", + "temperature": 0.2, + "temperatureEnabled": true, + "tools": [ + { + "component_name": "TavilySearch", + "name": "TavilySearch", + "params": { + "api_key": "", + "days": 7, + "exclude_domains": [], + "include_answer": false, + "include_domains": [], + "include_image_descriptions": false, + "include_images": false, + "include_raw_content": true, + "max_results": 5, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" + }, + "json": { + "type": "Array", + "value": [] + } + }, + "query": "sys.query", + "search_depth": "basic", + "topic": "general" + }, + "id": "TavilySearch:EagerNailsRemain" + } + ], + "topPEnabled": false, + "top_p": 0.75, + "user_prompt": "", + "visual_files_var": "" + } + }, + "upstream": [ + "Agent:BetterSitesSend" + ] + }, + "Agent:LovelyHeadsOwn": { + "downstream": [ + "Message:LegalBeansBet" + ], + "obj": { + "component_name": "Agent", + "params": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.5, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 5, + "max_tokens": 4096, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "parameter": "Precise", + "presencePenaltyEnabled": false, + "presence_penalty": 0.5, + "prompts": [ + { + "content": "The parse and keyword agent output is {Agent:ClearRabbitsScream@content}\n\nThe Outline agent output is {Agent:BetterSitesSend@content}\n\nThe Body agent output is {Agent:EagerNailsRemain@content}", + "role": "user" + } + ], + "sys_prompt": "# Role\n\nYou are the **Editor_Agent**, 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 — checking keyword density, structure (H1/H2/H3), and overall searchability.\n\n\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# 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\n", + "temperature": 0.2, + "temperatureEnabled": true, + "tools": [], + "topPEnabled": false, + "top_p": 0.75, + "user_prompt": "", + "visual_files_var": "" + } + }, + "upstream": [ + "Agent:EagerNailsRemain" + ] + }, + "Message:LegalBeansBet": { + "downstream": [], + "obj": { + "component_name": "Message", + "params": { + "content": [ + "{Agent:LovelyHeadsOwn@content}" + ] + } + }, + "upstream": [ + "Agent:LovelyHeadsOwn" + ] + }, + "begin": { + "downstream": [ + "Agent:ClearRabbitsScream" + ], + "obj": { + "component_name": "Begin", + "params": { + "enablePrologue": true, + "inputs": {}, + "mode": "conversational", + "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" + } + }, + "upstream": [] + } + }, + "globals": { + "sys.conversation_turns": 0, + "sys.files": [], + "sys.query": "", + "sys.user_id": "" + }, + "graph": { + "edges": [ + { + "data": { + "isHovered": false + }, + "id": "xy-edge__beginstart-Agent:ClearRabbitsScreamend", + "source": "begin", + "sourceHandle": "start", + "target": "Agent:ClearRabbitsScream", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:ClearRabbitsScreamstart-Agent:BetterSitesSendend", + "source": "Agent:ClearRabbitsScream", + "sourceHandle": "start", + "target": "Agent:BetterSitesSend", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:BetterSitesSendtool-Tool:SharpPensBurnend", + "source": "Agent:BetterSitesSend", + "sourceHandle": "tool", + "target": "Tool:SharpPensBurn", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:BetterSitesSendstart-Agent:EagerNailsRemainend", + "source": "Agent:BetterSitesSend", + "sourceHandle": "start", + "target": "Agent:EagerNailsRemain", + "targetHandle": "end" + }, + { + "id": "xy-edge__Agent:EagerNailsRemaintool-Tool:WickedDeerHealend", + "source": "Agent:EagerNailsRemain", + "sourceHandle": "tool", + "target": "Tool:WickedDeerHeal", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:EagerNailsRemainstart-Agent:LovelyHeadsOwnend", + "source": "Agent:EagerNailsRemain", + "sourceHandle": "start", + "target": "Agent:LovelyHeadsOwn", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:LovelyHeadsOwnstart-Message:LegalBeansBetend", + "source": "Agent:LovelyHeadsOwn", + "sourceHandle": "start", + "target": "Message:LegalBeansBet", + "targetHandle": "end" + } + ], + "nodes": [ + { + "data": { + "form": { + "enablePrologue": true, + "inputs": {}, + "mode": "conversational", + "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" + }, + "label": "Begin", + "name": "begin" + }, + "id": "begin", + "measured": { + "height": 48, + "width": 200 + }, + "position": { + "x": 50, + "y": 200 + }, + "selected": false, + "sourcePosition": "left", + "targetPosition": "right", + "type": "beginNode" + }, + { + "data": { + "form": { "delay_after_error": 1, "description": "", "exception_comment": "", @@ -129,7 +446,7 @@ "role": "user" } ], - "sys_prompt": "# Role\n\nYou are the **Parse_And_Keyword_Agent**, responsible for interpreting a user's blog writing request and generating a structured writing intent summary and keyword strategy for SEO-optimized content generation.\n\n# Goals\n\n1. Extract and infer the user's true writing intent, even if the input is informal or vague.\n\n2. Identify the writing type, target audience, and implied goal.\n\n3. Suggest 3\u20135 long-tail keywords based on the input and context.\n\n4. Output all data in a Markdown format for downstream agents.\n\n# Operating Guidelines\n\n\n- If the user's input lacks clarity, make reasonable and **conservative** assumptions based on SEO best practices.\n\n- Always choose one clear \"Writing Type\" from the list below.\n\n- Your job is not to write the blog \u2014 only to structure the brief.\n\n# Output Format\n\n```markdown\n## Writing Type\n\n[Choose one: Tutorial / Informative Guide / Marketing Content / Case Study / Opinion Piece / How-to / Comparison Article]\n\n## Target Audience\n\n[Try to be specific based on clues in the input: e.g., marketing managers, junior developers, SEO beginners]\n\n## User Intent Summary\n\n[A 1\u20132 sentence summary of what the user wants to achieve with the blog post]\n\n## Suggested Long-tail Keywords\n\n- keyword 1\n\n- keyword 2\n\n- keyword 3\n\n- keyword 4 (optional)\n\n- keyword 5 (optional)\n\n\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\n\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", + "sys_prompt": "# Role\n\nYou are the **Parse_And_Keyword_Agent**, responsible for interpreting a user's blog writing request and generating a structured writing intent summary and keyword strategy for SEO-optimized content generation.\n\n# Goals\n\n1. Extract and infer the user's true writing intent, even if the input is informal or vague.\n\n2. Identify the writing type, target audience, and implied goal.\n\n3. Suggest 3–5 long-tail keywords based on the input and context.\n\n4. Output all data in a Markdown format for downstream agents.\n\n# Operating Guidelines\n\n\n- If the user's input lacks clarity, make reasonable and **conservative** assumptions based on SEO best practices.\n\n- Always choose one clear \"Writing Type\" from the list below.\n\n- Your job is not to write the blog — only to structure the brief.\n\n# Output Format\n\n```markdown\n## Writing Type\n\n[Choose one: Tutorial / Informative Guide / Marketing Content / Case Study / Opinion Piece / How-to / Comparison Article]\n\n## Target Audience\n\n[Try to be specific based on clues in the input: e.g., marketing managers, junior developers, SEO beginners]\n\n## User Intent Summary\n\n[A 1–2 sentence summary of what the user wants to achieve with the blog post]\n\n## Suggested Long-tail Keywords\n\n- keyword 1\n\n- keyword 2\n\n- keyword 3\n\n- keyword 4 (optional)\n\n- keyword 5 (optional)\n\n\n\n\n## Input Examples (and how to handle them)\n\nInput: \"I want to write about RAGFlow.\"\n→ 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→ Output: Marketing Content, Audience: product managers or tool adopters, Intent: raise awareness and interest in the product\n\n\n\nInput: \"How to get more Google traffic using AI\"\n→ Output: How-to, Audience: SEO marketers, Intent: guide readers on applying AI for SEO growth", "temperature": 0.2, "temperatureEnabled": true, "tools": [], @@ -137,19 +454,142 @@ "top_p": 0.75, "user_prompt": "", "visual_files_var": "" - } + }, + "label": "Agent", + "name": "Parse And Keyword Agent" }, - "upstream": [ - "begin" - ] + "dragging": false, + "id": "Agent:ClearRabbitsScream", + "measured": { + "height": 84, + "width": 200 + }, + "position": { + "x": 344.7766966202233, + "y": 234.82202253184496 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" }, - "Agent:EagerNailsRemain": { - "downstream": [ - "Agent:LovelyHeadsOwn" - ], - "obj": { - "component_name": "Agent", - "params": { + { + "data": { + "form": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.3, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 3, + "max_tokens": 4096, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "parameter": "Balance", + "presencePenaltyEnabled": false, + "presence_penalty": 0.2, + "prompts": [ + { + "content": "The parse and keyword agent output is {Agent:ClearRabbitsScream@content}", + "role": "user" + } + ], + "sys_prompt": "# Role\n\nYou are the **Outline_Agent**, responsible for generating a clear and SEO-optimized blog outline based on the user's parsed writing intent and keyword strategy.\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–2 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 “Tutorial” or “How-to”, 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–5 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", + "temperature": 0.5, + "temperatureEnabled": true, + "tools": [ + { + "component_name": "TavilySearch", + "name": "TavilySearch", + "params": { + "api_key": "", + "days": 7, + "exclude_domains": [], + "include_answer": false, + "include_domains": [], + "include_image_descriptions": false, + "include_images": false, + "include_raw_content": true, + "max_results": 5, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" + }, + "json": { + "type": "Array", + "value": [] + } + }, + "query": "sys.query", + "search_depth": "basic", + "topic": "general" + }, + "id": "TavilySearch:BetterSitesSend" + } + ], + "topPEnabled": false, + "top_p": 0.85, + "user_prompt": "", + "visual_files_var": "" + }, + "label": "Agent", + "name": "Outline Agent" + }, + "dragging": false, + "id": "Agent:BetterSitesSend", + "measured": { + "height": 84, + "width": 200 + }, + "position": { + "x": 613.4368763415628, + "y": 164.3074269048589 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" + }, + { + "data": { + "form": { + "description": "This is an agent for a specific task.", + "user_prompt": "This is the order you need to send to the agent." + }, + "label": "Tool", + "name": "flow.tool_0" + }, + "dragging": false, + "id": "Tool:SharpPensBurn", + "measured": { + "height": 44, + "width": 200 + }, + "position": { + "x": 580.1877078861457, + "y": 287.7669662022325 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "toolNode" + }, + { + "data": { + "form": { "delay_after_error": 1, "description": "", "exception_comment": "", @@ -180,7 +620,7 @@ "role": "user" } ], - "sys_prompt": "# Role\n\nYou are the **Body_Agent**, responsible for generating the full content of each section of an SEO-optimized blog based on the provided outline and keyword strategy.\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", + "sys_prompt": "# Role\n\nYou are the **Body_Agent**, responsible for generating the full content of each section of an SEO-optimized blog based on the provided outline and keyword strategy.\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 — 500-600 words, using keywords naturally.]\n\n", "temperature": 0.2, "temperatureEnabled": true, "tools": [ @@ -210,26 +650,60 @@ "query": "sys.query", "search_depth": "basic", "topic": "general" - } + }, + "id": "TavilySearch:EagerNailsRemain" } ], "topPEnabled": false, "top_p": 0.75, "user_prompt": "", "visual_files_var": "" - } + }, + "label": "Agent", + "name": "Body Agent" }, - "upstream": [ - "Agent:BetterSitesSend" - ] + "dragging": false, + "id": "Agent:EagerNailsRemain", + "measured": { + "height": 84, + "width": 200 + }, + "position": { + "x": 889.0614605692713, + "y": 247.00973041799065 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" }, - "Agent:LovelyHeadsOwn": { - "downstream": [ - "Message:LegalBeansBet" - ], - "obj": { - "component_name": "Agent", - "params": { + { + "data": { + "form": { + "description": "This is an agent for a specific task.", + "user_prompt": "This is the order you need to send to the agent." + }, + "label": "Tool", + "name": "flow.tool_1" + }, + "dragging": false, + "id": "Tool:WickedDeerHeal", + "measured": { + "height": 44, + "width": 200 + }, + "position": { + "x": 853.2006404239659, + "y": 364.37541577229143 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "toolNode" + }, + { + "data": { + "form": { "delay_after_error": 1, "description": "", "exception_comment": "", @@ -260,7 +734,7 @@ "role": "user" } ], - "sys_prompt": "# Role\n\nYou are the **Editor_Agent**, 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# 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# 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\n", + "sys_prompt": "# Role\n\nYou are the **Editor_Agent**, 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 — checking keyword density, structure (H1/H2/H3), and overall searchability.\n\n\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# 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\n", "temperature": 0.2, "temperatureEnabled": true, "tools": [], @@ -268,655 +742,190 @@ "top_p": 0.75, "user_prompt": "", "visual_files_var": "" - } + }, + "label": "Agent", + "name": "Editor Agent" }, - "upstream": [ - "Agent:EagerNailsRemain" - ] + "dragging": false, + "id": "Agent:LovelyHeadsOwn", + "measured": { + "height": 84, + "width": 200 + }, + "position": { + "x": 1160.3332919804993, + "y": 149.50806732882472 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" }, - "Message:LegalBeansBet": { - "downstream": [], - "obj": { - "component_name": "Message", - "params": { + { + "data": { + "form": { "content": [ "{Agent:LovelyHeadsOwn@content}" ] - } + }, + "label": "Message", + "name": "Response" }, - "upstream": [ - "Agent:LovelyHeadsOwn" - ] + "dragging": false, + "id": "Message:LegalBeansBet", + "measured": { + "height": 56, + "width": 200 + }, + "position": { + "x": 1370.6665839609984, + "y": 267.0323933738015 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "messageNode" }, - "begin": { - "downstream": [ - "Agent:ClearRabbitsScream" - ], - "obj": { - "component_name": "Begin", - "params": { - "enablePrologue": true, - "inputs": {}, - "mode": "conversational", - "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" - } + { + "data": { + "form": { + "text": "This workflow automatically generates a complete SEO-optimized blog article based on a simple user input. You don’t need any writing experience. Just provide a topic or short request — the system will handle the rest.\n\nThe process includes the following key stages:\n\n1. **Understanding your topic and goals**\n2. **Designing the blog structure**\n3. **Writing high-quality content**\n\n\n" + }, + "label": "Note", + "name": "Workflow Overall Description" }, - "upstream": [] - } - }, - "globals": { - "sys.conversation_turns": 0, - "sys.files": [], - "sys.query": "", - "sys.user_id": "" - }, - "graph": { - "edges": [ - { - "data": { - "isHovered": false - }, - "id": "xy-edge__beginstart-Agent:ClearRabbitsScreamend", - "source": "begin", - "sourceHandle": "start", - "target": "Agent:ClearRabbitsScream", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:ClearRabbitsScreamstart-Agent:BetterSitesSendend", - "source": "Agent:ClearRabbitsScream", - "sourceHandle": "start", - "target": "Agent:BetterSitesSend", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:BetterSitesSendtool-Tool:SharpPensBurnend", - "source": "Agent:BetterSitesSend", - "sourceHandle": "tool", - "target": "Tool:SharpPensBurn", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:BetterSitesSendstart-Agent:EagerNailsRemainend", - "source": "Agent:BetterSitesSend", - "sourceHandle": "start", - "target": "Agent:EagerNailsRemain", - "targetHandle": "end" - }, - { - "id": "xy-edge__Agent:EagerNailsRemaintool-Tool:WickedDeerHealend", - "source": "Agent:EagerNailsRemain", - "sourceHandle": "tool", - "target": "Tool:WickedDeerHeal", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:EagerNailsRemainstart-Agent:LovelyHeadsOwnend", - "source": "Agent:EagerNailsRemain", - "sourceHandle": "start", - "target": "Agent:LovelyHeadsOwn", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:LovelyHeadsOwnstart-Message:LegalBeansBetend", - "source": "Agent:LovelyHeadsOwn", - "sourceHandle": "start", - "target": "Message:LegalBeansBet", - "targetHandle": "end" - } - ], - "nodes": [ - { - "data": { - "form": { - "enablePrologue": true, - "inputs": {}, - "mode": "conversational", - "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" - }, - "label": "Begin", - "name": "begin" - }, - "id": "begin", - "measured": { - "height": 48, - "width": 200 - }, - "position": { - "x": 50, - "y": 200 - }, - "selected": false, - "sourcePosition": "left", - "targetPosition": "right", - "type": "beginNode" - }, - { - "data": { - "form": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.5, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 1, - "max_tokens": 4096, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "parameter": "Precise", - "presencePenaltyEnabled": false, - "presence_penalty": 0.5, - "prompts": [ - { - "content": "The user query is {sys.query}", - "role": "user" - } - ], - "sys_prompt": "# Role\n\nYou are the **Parse_And_Keyword_Agent**, responsible for interpreting a user's blog writing request and generating a structured writing intent summary and keyword strategy for SEO-optimized content generation.\n\n# Goals\n\n1. Extract and infer the user's true writing intent, even if the input is informal or vague.\n\n2. Identify the writing type, target audience, and implied goal.\n\n3. Suggest 3\u20135 long-tail keywords based on the input and context.\n\n4. Output all data in a Markdown format for downstream agents.\n\n# Operating Guidelines\n\n\n- If the user's input lacks clarity, make reasonable and **conservative** assumptions based on SEO best practices.\n\n- Always choose one clear \"Writing Type\" from the list below.\n\n- Your job is not to write the blog \u2014 only to structure the brief.\n\n# Output Format\n\n```markdown\n## Writing Type\n\n[Choose one: Tutorial / Informative Guide / Marketing Content / Case Study / Opinion Piece / How-to / Comparison Article]\n\n## Target Audience\n\n[Try to be specific based on clues in the input: e.g., marketing managers, junior developers, SEO beginners]\n\n## User Intent Summary\n\n[A 1\u20132 sentence summary of what the user wants to achieve with the blog post]\n\n## Suggested Long-tail Keywords\n\n- keyword 1\n\n- keyword 2\n\n- keyword 3\n\n- keyword 4 (optional)\n\n- keyword 5 (optional)\n\n\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\n\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", - "temperature": 0.2, - "temperatureEnabled": true, - "tools": [], - "topPEnabled": false, - "top_p": 0.75, - "user_prompt": "", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Parse And Keyword Agent" - }, - "dragging": false, - "id": "Agent:ClearRabbitsScream", - "measured": { - "height": 84, - "width": 200 - }, - "position": { - "x": 344.7766966202233, - "y": 234.82202253184496 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" - }, - { - "data": { - "form": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.3, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 3, - "max_tokens": 4096, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "parameter": "Balance", - "presencePenaltyEnabled": false, - "presence_penalty": 0.2, - "prompts": [ - { - "content": "The parse and keyword agent output is {Agent:ClearRabbitsScream@content}", - "role": "user" - } - ], - "sys_prompt": "# Role\n\nYou are the **Outline_Agent**, responsible for generating a clear and SEO-optimized blog outline based on the user's parsed writing intent and keyword strategy.\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", - "temperature": 0.5, - "temperatureEnabled": true, - "tools": [ - { - "component_name": "TavilySearch", - "name": "TavilySearch", - "params": { - "api_key": "", - "days": 7, - "exclude_domains": [], - "include_answer": false, - "include_domains": [], - "include_image_descriptions": false, - "include_images": false, - "include_raw_content": true, - "max_results": 5, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" - }, - "json": { - "type": "Array", - "value": [] - } - }, - "query": "sys.query", - "search_depth": "basic", - "topic": "general" - } - } - ], - "topPEnabled": false, - "top_p": 0.85, - "user_prompt": "", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Outline Agent" - }, - "dragging": false, - "id": "Agent:BetterSitesSend", - "measured": { - "height": 84, - "width": 200 - }, - "position": { - "x": 613.4368763415628, - "y": 164.3074269048589 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" - }, - { - "data": { - "form": { - "description": "This is an agent for a specific task.", - "user_prompt": "This is the order you need to send to the agent." - }, - "label": "Tool", - "name": "flow.tool_0" - }, - "dragging": false, - "id": "Tool:SharpPensBurn", - "measured": { - "height": 44, - "width": 200 - }, - "position": { - "x": 580.1877078861457, - "y": 287.7669662022325 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "toolNode" - }, - { - "data": { - "form": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.5, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 5, - "max_tokens": 4096, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "parameter": "Precise", - "presencePenaltyEnabled": false, - "presence_penalty": 0.5, - "prompts": [ - { - "content": "The parse and keyword agent output is {Agent:ClearRabbitsScream@content}\n\n\n\nThe Outline agent output is {Agent:BetterSitesSend@content}", - "role": "user" - } - ], - "sys_prompt": "# Role\n\nYou are the **Body_Agent**, responsible for generating the full content of each section of an SEO-optimized blog based on the provided outline and keyword strategy.\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", - "temperature": 0.2, - "temperatureEnabled": true, - "tools": [ - { - "component_name": "TavilySearch", - "name": "TavilySearch", - "params": { - "api_key": "", - "days": 7, - "exclude_domains": [], - "include_answer": false, - "include_domains": [], - "include_image_descriptions": false, - "include_images": false, - "include_raw_content": true, - "max_results": 5, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" - }, - "json": { - "type": "Array", - "value": [] - } - }, - "query": "sys.query", - "search_depth": "basic", - "topic": "general" - } - } - ], - "topPEnabled": false, - "top_p": 0.75, - "user_prompt": "", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Body Agent" - }, - "dragging": false, - "id": "Agent:EagerNailsRemain", - "measured": { - "height": 84, - "width": 200 - }, - "position": { - "x": 889.0614605692713, - "y": 247.00973041799065 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" - }, - { - "data": { - "form": { - "description": "This is an agent for a specific task.", - "user_prompt": "This is the order you need to send to the agent." - }, - "label": "Tool", - "name": "flow.tool_1" - }, - "dragging": false, - "id": "Tool:WickedDeerHeal", - "measured": { - "height": 44, - "width": 200 - }, - "position": { - "x": 853.2006404239659, - "y": 364.37541577229143 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "toolNode" - }, - { - "data": { - "form": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.5, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 5, - "max_tokens": 4096, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "parameter": "Precise", - "presencePenaltyEnabled": false, - "presence_penalty": 0.5, - "prompts": [ - { - "content": "The parse and keyword agent output is {Agent:ClearRabbitsScream@content}\n\nThe Outline agent output is {Agent:BetterSitesSend@content}\n\nThe Body agent output is {Agent:EagerNailsRemain@content}", - "role": "user" - } - ], - "sys_prompt": "# Role\n\nYou are the **Editor_Agent**, 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# 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# 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\n", - "temperature": 0.2, - "temperatureEnabled": true, - "tools": [], - "topPEnabled": false, - "top_p": 0.75, - "user_prompt": "", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Editor Agent" - }, - "dragging": false, - "id": "Agent:LovelyHeadsOwn", - "measured": { - "height": 84, - "width": 200 - }, - "position": { - "x": 1160.3332919804993, - "y": 149.50806732882472 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" - }, - { - "data": { - "form": { - "content": [ - "{Agent:LovelyHeadsOwn@content}" - ] - }, - "label": "Message", - "name": "Response" - }, - "dragging": false, - "id": "Message:LegalBeansBet", - "measured": { - "height": 56, - "width": 200 - }, - "position": { - "x": 1370.6665839609984, - "y": 267.0323933738015 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "messageNode" - }, - { - "data": { - "form": { - "text": "This workflow automatically generates a complete SEO-optimized blog article based on a simple user input. You don\u2019t need any writing experience. Just provide a topic or short request \u2014 the system will handle the rest.\n\nThe process includes the following key stages:\n\n1. **Understanding your topic and goals**\n2. **Designing the blog structure**\n3. **Writing high-quality content**\n\n\n" - }, - "label": "Note", - "name": "Workflow Overall Description" - }, - "dragHandle": ".note-drag-handle", - "dragging": false, + "dragHandle": ".note-drag-handle", + "dragging": false, + "height": 205, + "id": "Note:SlimyGhostsWear", + "measured": { "height": 205, - "id": "Note:SlimyGhostsWear", - "measured": { - "height": 205, - "width": 415 - }, - "position": { - "x": -284.3143151688742, - "y": 150.47632147913419 - }, - "resizing": false, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode", "width": 415 }, - { - "data": { - "form": { - "text": "**Purpose**: \nThis agent reads the user\u2019s input and figures out what kind of blog needs to be written.\n\n**What it does**:\n- Understands the main topic you want to write about \n- Identifies who the blog is for (e.g., beginners, marketers, developers) \n- Determines the writing purpose (e.g., SEO traffic, product promotion, education) \n- Suggests 3\u20135 long-tail SEO keywords related to the topic" - }, - "label": "Note", - "name": "Parse And Keyword Agent" + "position": { + "x": -284.3143151688742, + "y": 150.47632147913419 + }, + "resizing": false, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode", + "width": 415 + }, + { + "data": { + "form": { + "text": "**Purpose**: \nThis agent reads the user’s input and figures out what kind of blog needs to be written.\n\n**What it does**:\n- Understands the main topic you want to write about \n- Identifies who the blog is for (e.g., beginners, marketers, developers) \n- Determines the writing purpose (e.g., SEO traffic, product promotion, education) \n- Suggests 3–5 long-tail SEO keywords related to the topic" }, - "dragHandle": ".note-drag-handle", - "dragging": false, + "label": "Note", + "name": "Parse And Keyword Agent" + }, + "dragHandle": ".note-drag-handle", + "dragging": false, + "height": 152, + "id": "Note:EmptyChairsShake", + "measured": { "height": 152, - "id": "Note:EmptyChairsShake", - "measured": { - "height": 152, - "width": 340 - }, - "position": { - "x": 295.04147626768133, - "y": 372.2755718118446 - }, - "resizing": false, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode", "width": 340 }, - { - "data": { - "form": { - "text": "**Purpose**: \nThis agent builds the blog structure \u2014 just like writing a table of contents before you start writing the full article.\n\n**What it does**:\n- Suggests a clear blog title that includes important keywords \n- Breaks the article into sections using H2 and H3 headings (like a professional blog layout) \n- Assigns 1\u20132 recommended keywords to each section to help with SEO \n- Follows the writing goal and target audience set in the previous step" - }, - "label": "Note", - "name": "Outline Agent" + "position": { + "x": 295.04147626768133, + "y": 372.2755718118446 + }, + "resizing": false, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode", + "width": 340 + }, + { + "data": { + "form": { + "text": "**Purpose**: \nThis agent builds the blog structure — just like writing a table of contents before you start writing the full article.\n\n**What it does**:\n- Suggests a clear blog title that includes important keywords \n- Breaks the article into sections using H2 and H3 headings (like a professional blog layout) \n- Assigns 1–2 recommended keywords to each section to help with SEO \n- Follows the writing goal and target audience set in the previous step" }, - "dragHandle": ".note-drag-handle", - "dragging": false, + "label": "Note", + "name": "Outline Agent" + }, + "dragHandle": ".note-drag-handle", + "dragging": false, + "height": 146, + "id": "Note:TallMelonsNotice", + "measured": { "height": 146, - "id": "Note:TallMelonsNotice", - "measured": { - "height": 146, - "width": 343 - }, - "position": { - "x": 598.5644991893463, - "y": 5.801054564756448 - }, - "resizing": false, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode", "width": 343 }, - { - "data": { - "form": { - "text": "**Purpose**: \nThis agent is responsible for writing the actual content of the blog \u2014 paragraph by paragraph \u2014 based on the outline created earlier.\n\n**What it does**:\n- Looks at each H2/H3 section in the outline \n- Writes 150\u2013220 words of clear, helpful, and well-structured content per section \n- Includes the suggested SEO keywords naturally (not keyword stuffing) \n- Uses real examples or facts if needed (by calling a web search tool like Tavily)" - }, - "label": "Note", - "name": "Body Agent" + "position": { + "x": 598.5644991893463, + "y": 5.801054564756448 + }, + "resizing": false, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode", + "width": 343 + }, + { + "data": { + "form": { + "text": "**Purpose**: \nThis agent is responsible for writing the actual content of the blog — paragraph by paragraph — based on the outline created earlier.\n\n**What it does**:\n- Looks at each H2/H3 section in the outline \n- Writes 150–220 words of clear, helpful, and well-structured content per section \n- Includes the suggested SEO keywords naturally (not keyword stuffing) \n- Uses real examples or facts if needed (by calling a web search tool like Tavily)" }, - "dragHandle": ".note-drag-handle", - "dragging": false, + "label": "Note", + "name": "Body Agent" + }, + "dragHandle": ".note-drag-handle", + "dragging": false, + "height": 137, + "id": "Note:RipeCougarsBuild", + "measured": { "height": 137, - "id": "Note:RipeCougarsBuild", - "measured": { - "height": 137, - "width": 319 - }, - "position": { - "x": 860.4854129814981, - "y": 427.2196835690842 - }, - "resizing": false, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode", "width": 319 }, - { - "data": { - "form": { - "text": "**Purpose**: \nThis agent reviews the entire blog draft to make sure it is smooth, professional, and SEO-friendly. It acts like a human editor before publishing.\n\n**What it does**:\n- Polishes the writing: improves sentence clarity, fixes awkward phrasing \n- Makes sure the content flows well from one section to the next \n- Double-checks keyword usage: are they present, natural, and not overused? \n- Verifies the blog structure (H1, H2, H3 headings) is correct \n- Adds two key SEO elements:\n - **Meta Title** (shows up in search results)\n - **Meta Description** (summary for Google and social sharing)" - }, - "label": "Note", - "name": "Editor Agent" + "position": { + "x": 860.4854129814981, + "y": 427.2196835690842 + }, + "resizing": false, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode", + "width": 319 + }, + { + "data": { + "form": { + "text": "**Purpose**: \nThis agent reviews the entire blog draft to make sure it is smooth, professional, and SEO-friendly. It acts like a human editor before publishing.\n\n**What it does**:\n- Polishes the writing: improves sentence clarity, fixes awkward phrasing \n- Makes sure the content flows well from one section to the next \n- Double-checks keyword usage: are they present, natural, and not overused? \n- Verifies the blog structure (H1, H2, H3 headings) is correct \n- Adds two key SEO elements:\n - **Meta Title** (shows up in search results)\n - **Meta Description** (summary for Google and social sharing)" }, - "dragHandle": ".note-drag-handle", + "label": "Note", + "name": "Editor Agent" + }, + "dragHandle": ".note-drag-handle", + "height": 146, + "id": "Note:OpenTurkeysSell", + "measured": { "height": 146, - "id": "Note:OpenTurkeysSell", - "measured": { - "height": 146, - "width": 320 - }, - "position": { - "x": 1129, - "y": -30 - }, - "resizing": false, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode", "width": 320 - } - ] - }, - "history": [], - "messages": [], - "path": [], - "retrieval": [] + }, + "position": { + "x": 1129, + "y": -30 + }, + "resizing": false, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode", + "width": 320 + } + ] }, + "history": [], + "messages": [], + "path": [], + "retrieval": [] + }, "avatar": "data:image/jpeg;base64,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" } diff --git a/agent/templates/reflective_academic_paper_generator.json b/agent/templates/reflective_academic_paper_generator.json index 055e7ff00e..0cf81559ff 100644 --- a/agent/templates/reflective_academic_paper_generator.json +++ b/agent/templates/reflective_academic_paper_generator.json @@ -3,13 +3,18 @@ "title": { "en": "Reflective academic paper generator", "de": "Schreibhilfe für Reflexionspapiere", - "zh": "学术论文生成助手"}, + "zh": "学术论文生成助手" + }, "description": { "en": "A reflective academic paper generator using local knowledge base, with advanced capabilities in task planning, reasoning, and reflective analysis. Recommended for academic research paper Q&A", "de": "Ein Berichtsgenerierungsassistent, der eine lokale Wissensdatenbank nutzt, mit erweiterten Fähigkeiten in Aufgabenplanung, Schlussfolgerung und reflektierender Analyse. Empfohlen für akademische Forschungspapier-Fragen und -Antworten.", - "zh": "一个使用本地知识库的学术论文生成助手,具备高级能力,包括任务规划、推理和反思性分析。推荐用于学术研究论文问答。"}, + "zh": "一个使用本地知识库的学术论文生成助手,具备高级能力,包括任务规划、推理和反思性分析。推荐用于学术研究论文问答。" + }, "canvas_type": "Agent", - "canvas_types": ["Agent", "Recommended"], + "canvas_types": [ + "Agent", + "Recommended" + ], "dsl": { "components": { "Agent:NewPumasLick": { @@ -49,7 +54,7 @@ "role": "user" } ], - "sys_prompt": "## Role & Task\nYou are a **\u201cKnowledge Base Retrieval Q\\&A Agent\u201d** whose goal is to break down the user\u2019s question into retrievable subtasks, and then produce a multi-source-verified, structured, and actionable research report using the internal knowledge base.\n## Execution Framework (Detailed Steps & Key Points)\n1. **Assessment & Decomposition**\n * Actions:\n * Automatically extract: main topic, subtopics, entities (people/organizations/products/technologies), time window, geographic/business scope.\n * Output as a list: N facts/data points that must be collected (*N* ranges from 5\u201320 depending on question complexity).\n2. **Query Type Determination (Rule-Based)**\n * Example rules:\n * If the question involves a single issue but requests \u201cmethod comparison/multiple explanations\u201d \u2192 use **depth-first**.\n * If the question can naturally be split into \u22653 independent sub-questions \u2192 use **breadth-first**.\n * If the question can be answered by a single fact/specification/definition \u2192 use **simple query**.\n3. **Research Plan Formulation**\n * Depth-first: define 3\u20135 perspectives (methodology/stakeholders/time dimension/technical route, etc.), assign search keywords, target document types, and output format for each perspective.\n * Breadth-first: list subtasks, prioritize them, and assign search terms.\n * Simple query: directly provide the search sentence and required fields.\n4. **Retrieval Execution**\n * After retrieval: perform coverage check (does it contain the key facts?) and quality check (source diversity, authority, latest update time).\n * If standards are not met, automatically loop: rewrite queries (synonyms/cross-domain terms) and retry \u22643 times, or flag as requiring external search.\n5. **Integration & Reasoning**\n * Build the answer using a **fact\u2013evidence\u2013reasoning** chain. For each conclusion, attach 1\u20132 strongest pieces of evidence.\n---\n## Quality Gate Checklist (Verify at Each Stage)\n* **Stage 1 (Decomposition)**:\n * [ ] Key concepts and expected outputs identified\n * [ ] Required facts/data points listed\n* **Stage 2 (Retrieval)**:\n * [ ] Meets quality standards (see above)\n * [ ] If not met: execute query iteration\n* **Stage 3 (Generation)**:\n * [ ] Each conclusion has at least one direct evidence source\n * [ ] State assumptions/uncertainties\n * [ ] Provide next-step suggestions or experiment/retrieval plans\n * [ ] Final length and depth match user expectations (comply with word count/format if specified)\n---\n## Core Principles\n1. **Strict reliance on the knowledge base**: answers must be **fully bounded** by the content retrieved from the knowledge base.\n2. **No fabrication**: do not generate, infer, or create information that is not explicitly present in the knowledge base.\n3. **Accuracy first**: prefer incompleteness over inaccurate content.\n4. **Output format**:\n * Hierarchically clear modular structure\n * Logical grouping according to the MECE principle\n * Professionally presented formatting\n * Step-by-step cognitive guidance\n * Reasonable use of headings and dividers for clarity\n * *Italicize* key parameters\n * **Bold** critical information\n5. **LaTeX formula requirements**:\n * Inline formulas: start and end with `$`\n * Block formulas: start and end with `$$`, each `$$` on its own line\n * Block formula content must comply with LaTeX math syntax\n * Verify formula correctness\n---\n## Additional Notes (Interaction & Failure Strategy)\n* If the knowledge base does not cover critical facts: explicitly inform the user (with sample wording)\n* For time-sensitive issues: enforce time filtering in the search request, and indicate the latest retrieval date in the answer.\n* Language requirement: answer in the user\u2019s preferred language\n", + "sys_prompt": "## Role & Task\nYou are a **“Knowledge Base Retrieval Q\\&A Agent”** whose goal is to break down the user’s question into retrievable subtasks, and then produce a multi-source-verified, structured, and actionable research report using the internal knowledge base.\n## Execution Framework (Detailed Steps & Key Points)\n1. **Assessment & Decomposition**\n * Actions:\n * Automatically extract: main topic, subtopics, entities (people/organizations/products/technologies), time window, geographic/business scope.\n * Output as a list: N facts/data points that must be collected (*N* ranges from 5–20 depending on question complexity).\n2. **Query Type Determination (Rule-Based)**\n * Example rules:\n * If the question involves a single issue but requests “method comparison/multiple explanations” → use **depth-first**.\n * If the question can naturally be split into ≥3 independent sub-questions → use **breadth-first**.\n * If the question can be answered by a single fact/specification/definition → use **simple query**.\n3. **Research Plan Formulation**\n * Depth-first: define 3–5 perspectives (methodology/stakeholders/time dimension/technical route, etc.), assign search keywords, target document types, and output format for each perspective.\n * Breadth-first: list subtasks, prioritize them, and assign search terms.\n * Simple query: directly provide the search sentence and required fields.\n4. **Retrieval Execution**\n * After retrieval: perform coverage check (does it contain the key facts?) and quality check (source diversity, authority, latest update time).\n * If standards are not met, automatically loop: rewrite queries (synonyms/cross-domain terms) and retry ≤3 times, or flag as requiring external search.\n5. **Integration & Reasoning**\n * Build the answer using a **fact–evidence–reasoning** chain. For each conclusion, attach 1–2 strongest pieces of evidence.\n---\n## Quality Gate Checklist (Verify at Each Stage)\n* **Stage 1 (Decomposition)**:\n * [ ] Key concepts and expected outputs identified\n * [ ] Required facts/data points listed\n* **Stage 2 (Retrieval)**:\n * [ ] Meets quality standards (see above)\n * [ ] If not met: execute query iteration\n* **Stage 3 (Generation)**:\n * [ ] Each conclusion has at least one direct evidence source\n * [ ] State assumptions/uncertainties\n * [ ] Provide next-step suggestions or experiment/retrieval plans\n * [ ] Final length and depth match user expectations (comply with word count/format if specified)\n---\n## Core Principles\n1. **Strict reliance on the knowledge base**: answers must be **fully bounded** by the content retrieved from the knowledge base.\n2. **No fabrication**: do not generate, infer, or create information that is not explicitly present in the knowledge base.\n3. **Accuracy first**: prefer incompleteness over inaccurate content.\n4. **Output format**:\n * Hierarchically clear modular structure\n * Logical grouping according to the MECE principle\n * Professionally presented formatting\n * Step-by-step cognitive guidance\n * Reasonable use of headings and dividers for clarity\n * *Italicize* key parameters\n * **Bold** critical information\n5. **LaTeX formula requirements**:\n * Inline formulas: start and end with `$`\n * Block formulas: start and end with `$$`, each `$$` on its own line\n * Block formula content must comply with LaTeX math syntax\n * Verify formula correctness\n---\n## Additional Notes (Interaction & Failure Strategy)\n* If the knowledge base does not cover critical facts: explicitly inform the user (with sample wording)\n* For time-sensitive issues: enforce time filtering in the search request, and indicate the latest retrieval date in the answer.\n* Language requirement: answer in the user’s preferred language\n", "temperature": "0.1", "temperatureEnabled": true, "tools": [ @@ -74,7 +79,8 @@ "top_k": 1024, "top_n": 8, "use_kg": false - } + }, + "id": "Retrieval:NewPumasLick" } ], "topPEnabled": false, @@ -111,7 +117,7 @@ "enablePrologue": true, "inputs": {}, "mode": "conversational", - "prologue": "\u4f60\u597d\uff01 \u6211\u662f\u4f60\u7684\u52a9\u7406\uff0c\u6709\u4ec0\u4e48\u53ef\u4ee5\u5e2e\u5230\u4f60\u7684\u5417\uff1f" + "prologue": "你好! 我是你的助理,有什么可以帮到你的吗?" } }, "upstream": [] @@ -171,7 +177,7 @@ "enablePrologue": true, "inputs": {}, "mode": "conversational", - "prologue": "\u4f60\u597d\uff01 \u6211\u662f\u4f60\u7684\u52a9\u7406\uff0c\u6709\u4ec0\u4e48\u53ef\u4ee5\u5e2e\u5230\u4f60\u7684\u5417\uff1f" + "prologue": "你好! 我是你的助理,有什么可以帮到你的吗?" }, "label": "Begin", "name": "begin" @@ -249,7 +255,7 @@ "role": "user" } ], - "sys_prompt": "## Role & Task\nYou are a **\u201cKnowledge Base Retrieval Q\\&A Agent\u201d** whose goal is to break down the user\u2019s question into retrievable subtasks, and then produce a multi-source-verified, structured, and actionable research report using the internal knowledge base.\n## Execution Framework (Detailed Steps & Key Points)\n1. **Assessment & Decomposition**\n * Actions:\n * Automatically extract: main topic, subtopics, entities (people/organizations/products/technologies), time window, geographic/business scope.\n * Output as a list: N facts/data points that must be collected (*N* ranges from 5\u201320 depending on question complexity).\n2. **Query Type Determination (Rule-Based)**\n * Example rules:\n * If the question involves a single issue but requests \u201cmethod comparison/multiple explanations\u201d \u2192 use **depth-first**.\n * If the question can naturally be split into \u22653 independent sub-questions \u2192 use **breadth-first**.\n * If the question can be answered by a single fact/specification/definition \u2192 use **simple query**.\n3. **Research Plan Formulation**\n * Depth-first: define 3\u20135 perspectives (methodology/stakeholders/time dimension/technical route, etc.), assign search keywords, target document types, and output format for each perspective.\n * Breadth-first: list subtasks, prioritize them, and assign search terms.\n * Simple query: directly provide the search sentence and required fields.\n4. **Retrieval Execution**\n * After retrieval: perform coverage check (does it contain the key facts?) and quality check (source diversity, authority, latest update time).\n * If standards are not met, automatically loop: rewrite queries (synonyms/cross-domain terms) and retry \u22643 times, or flag as requiring external search.\n5. **Integration & Reasoning**\n * Build the answer using a **fact\u2013evidence\u2013reasoning** chain. For each conclusion, attach 1\u20132 strongest pieces of evidence.\n---\n## Quality Gate Checklist (Verify at Each Stage)\n* **Stage 1 (Decomposition)**:\n * [ ] Key concepts and expected outputs identified\n * [ ] Required facts/data points listed\n* **Stage 2 (Retrieval)**:\n * [ ] Meets quality standards (see above)\n * [ ] If not met: execute query iteration\n* **Stage 3 (Generation)**:\n * [ ] Each conclusion has at least one direct evidence source\n * [ ] State assumptions/uncertainties\n * [ ] Provide next-step suggestions or experiment/retrieval plans\n * [ ] Final length and depth match user expectations (comply with word count/format if specified)\n---\n## Core Principles\n1. **Strict reliance on the knowledge base**: answers must be **fully bounded** by the content retrieved from the knowledge base.\n2. **No fabrication**: do not generate, infer, or create information that is not explicitly present in the knowledge base.\n3. **Accuracy first**: prefer incompleteness over inaccurate content.\n4. **Output format**:\n * Hierarchically clear modular structure\n * Logical grouping according to the MECE principle\n * Professionally presented formatting\n * Step-by-step cognitive guidance\n * Reasonable use of headings and dividers for clarity\n * *Italicize* key parameters\n * **Bold** critical information\n5. **LaTeX formula requirements**:\n * Inline formulas: start and end with `$`\n * Block formulas: start and end with `$$`, each `$$` on its own line\n * Block formula content must comply with LaTeX math syntax\n * Verify formula correctness\n---\n## Additional Notes (Interaction & Failure Strategy)\n* If the knowledge base does not cover critical facts: explicitly inform the user (with sample wording)\n* For time-sensitive issues: enforce time filtering in the search request, and indicate the latest retrieval date in the answer.\n* Language requirement: answer in the user\u2019s preferred language\n", + "sys_prompt": "## Role & Task\nYou are a **“Knowledge Base Retrieval Q\\&A Agent”** whose goal is to break down the user’s question into retrievable subtasks, and then produce a multi-source-verified, structured, and actionable research report using the internal knowledge base.\n## Execution Framework (Detailed Steps & Key Points)\n1. **Assessment & Decomposition**\n * Actions:\n * Automatically extract: main topic, subtopics, entities (people/organizations/products/technologies), time window, geographic/business scope.\n * Output as a list: N facts/data points that must be collected (*N* ranges from 5–20 depending on question complexity).\n2. **Query Type Determination (Rule-Based)**\n * Example rules:\n * If the question involves a single issue but requests “method comparison/multiple explanations” → use **depth-first**.\n * If the question can naturally be split into ≥3 independent sub-questions → use **breadth-first**.\n * If the question can be answered by a single fact/specification/definition → use **simple query**.\n3. **Research Plan Formulation**\n * Depth-first: define 3–5 perspectives (methodology/stakeholders/time dimension/technical route, etc.), assign search keywords, target document types, and output format for each perspective.\n * Breadth-first: list subtasks, prioritize them, and assign search terms.\n * Simple query: directly provide the search sentence and required fields.\n4. **Retrieval Execution**\n * After retrieval: perform coverage check (does it contain the key facts?) and quality check (source diversity, authority, latest update time).\n * If standards are not met, automatically loop: rewrite queries (synonyms/cross-domain terms) and retry ≤3 times, or flag as requiring external search.\n5. **Integration & Reasoning**\n * Build the answer using a **fact–evidence–reasoning** chain. For each conclusion, attach 1–2 strongest pieces of evidence.\n---\n## Quality Gate Checklist (Verify at Each Stage)\n* **Stage 1 (Decomposition)**:\n * [ ] Key concepts and expected outputs identified\n * [ ] Required facts/data points listed\n* **Stage 2 (Retrieval)**:\n * [ ] Meets quality standards (see above)\n * [ ] If not met: execute query iteration\n* **Stage 3 (Generation)**:\n * [ ] Each conclusion has at least one direct evidence source\n * [ ] State assumptions/uncertainties\n * [ ] Provide next-step suggestions or experiment/retrieval plans\n * [ ] Final length and depth match user expectations (comply with word count/format if specified)\n---\n## Core Principles\n1. **Strict reliance on the knowledge base**: answers must be **fully bounded** by the content retrieved from the knowledge base.\n2. **No fabrication**: do not generate, infer, or create information that is not explicitly present in the knowledge base.\n3. **Accuracy first**: prefer incompleteness over inaccurate content.\n4. **Output format**:\n * Hierarchically clear modular structure\n * Logical grouping according to the MECE principle\n * Professionally presented formatting\n * Step-by-step cognitive guidance\n * Reasonable use of headings and dividers for clarity\n * *Italicize* key parameters\n * **Bold** critical information\n5. **LaTeX formula requirements**:\n * Inline formulas: start and end with `$`\n * Block formulas: start and end with `$$`, each `$$` on its own line\n * Block formula content must comply with LaTeX math syntax\n * Verify formula correctness\n---\n## Additional Notes (Interaction & Failure Strategy)\n* If the knowledge base does not cover critical facts: explicitly inform the user (with sample wording)\n* For time-sensitive issues: enforce time filtering in the search request, and indicate the latest retrieval date in the answer.\n* Language requirement: answer in the user’s preferred language\n", "temperature": "0.1", "temperatureEnabled": true, "tools": [ @@ -274,7 +280,8 @@ "top_k": 1024, "top_n": 8, "use_kg": false - } + }, + "id": "Retrieval:NewPumasLick" } ], "topPEnabled": false, diff --git a/agent/templates/seo_article_writer.json b/agent/templates/seo_article_writer.json index a3aed78426..e942f07913 100644 --- a/agent/templates/seo_article_writer.json +++ b/agent/templates/seo_article_writer.json @@ -3,21 +3,402 @@ "title": { "en": "SEO article writer", "de": "SEO-Blog-Magnetiseur", - "zh": "SEO 博客写手"}, + "zh": "SEO 博客写手" + }, "description": { "en": "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.", "de": "Dies ist eine Multi-Agenten-Version des Workflows zur Erstellung von SEO-Blogs. Sie simuliert ein kleines Team von KI-„Autoren“, in dem jeder Agent eine spezielle Rolle übernimmt – genau wie in einem echten Redaktionsteam.", - "zh": "SEO 博客写手可根据简单的用户输入自动生成完整的SEO博客文章。模拟小型“作家”团队,其中每个智能体扮演一个专业角色——就像真正的编辑团队。"}, + "zh": "SEO 博客写手可根据简单的用户输入自动生成完整的SEO博客文章。模拟小型“作家”团队,其中每个智能体扮演一个专业角色——就像真正的编辑团队。" + }, "canvas_type": "Agent", "dsl": { - "components": { - "Agent:LuckyApplesGrab": { - "downstream": [ - "Message:ModernSwansThrow" - ], - "obj": { - "component_name": "Agent", - "params": { + "components": { + "Agent:LuckyApplesGrab": { + "downstream": [ + "Message:ModernSwansThrow" + ], + "obj": { + "component_name": "Agent", + "params": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.5, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 3, + "max_tokens": 4096, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "parameter": "Precise", + "presencePenaltyEnabled": false, + "presence_penalty": 0.5, + "prompts": [ + { + "content": "The user query is {sys.query}", + "role": "user" + } + ], + "sys_prompt": "# Role\n\nYou are the **Lead Agent**, responsible for initiating the multi-agent SEO blog generation process. You will receive the user’s 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` → Create the blog outline.\n\n - `Body Agent` → Write all sections based on outline.\n\n - `Editor Agent` → 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–2 relevant keywords to each section. Keep it aligned with the user’s 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–600 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→ 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→ 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→ Output: How-to, Audience: SEO marketers, Intent: guide readers on applying AI for SEO growth", + "temperature": "0.1", + "temperatureEnabled": true, + "tools": [ + { + "component_name": "Agent", + "id": "Agent:SlickSpidersTurn", + "name": "Outline Agent", + "params": { + "delay_after_error": 1, + "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", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.3, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 2, + "max_tokens": 4096, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "parameter": "Balance", + "presencePenaltyEnabled": false, + "presence_penalty": 0.2, + "prompts": [ + { + "content": "{sys.query}", + "role": "user" + } + ], + "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–2 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 “Tutorial” or “How-to”, 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–5 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", + "temperature": 0.5, + "temperatureEnabled": true, + "tools": [ + { + "component_name": "TavilySearch", + "name": "TavilySearch", + "params": { + "api_key": "", + "days": 7, + "exclude_domains": [], + "include_answer": false, + "include_domains": [], + "include_image_descriptions": false, + "include_images": false, + "include_raw_content": true, + "max_results": 5, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" + }, + "json": { + "type": "Array", + "value": [] + } + }, + "query": "sys.query", + "search_depth": "basic", + "topic": "general" + }, + "id": "TavilySearch:LuckyApplesGrab" + } + ], + "topPEnabled": false, + "top_p": 0.85, + "user_prompt": "This is the order you need to send to the agent.", + "visual_files_var": "" + } + }, + { + "component_name": "Agent", + "id": "Agent:IcyPawsRescue", + "name": "Body Agent", + "params": { + "delay_after_error": 1, + "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", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.5, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 3, + "max_tokens": 4096, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "parameter": "Precise", + "presencePenaltyEnabled": false, + "presence_penalty": 0.5, + "prompts": [ + { + "content": "{sys.query}", + "role": "user" + } + ], + "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 — 500-600 words, using keywords naturally.]\n\n", + "temperature": 0.2, + "temperatureEnabled": true, + "tools": [ + { + "component_name": "TavilySearch", + "name": "TavilySearch", + "params": { + "api_key": "", + "days": 7, + "exclude_domains": [], + "include_answer": false, + "include_domains": [], + "include_image_descriptions": false, + "include_images": false, + "include_raw_content": true, + "max_results": 5, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" + }, + "json": { + "type": "Array", + "value": [] + } + }, + "query": "sys.query", + "search_depth": "basic", + "topic": "general" + }, + "id": "TavilySearch:LuckyApplesGrab" + } + ], + "topPEnabled": false, + "top_p": 0.75, + "user_prompt": "This is the order you need to send to the agent.", + "visual_files_var": "" + } + }, + { + "component_name": "Agent", + "id": "Agent:TenderAdsAllow", + "name": "Editor Agent", + "params": { + "delay_after_error": 1, + "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", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.5, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 2, + "max_tokens": 4096, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "parameter": "Precise", + "presencePenaltyEnabled": false, + "presence_penalty": 0.5, + "prompts": [ + { + "content": "{sys.query}", + "role": "user" + } + ], + "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 — 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", + "temperature": 0.2, + "temperatureEnabled": true, + "tools": [], + "topPEnabled": false, + "top_p": 0.75, + "user_prompt": "This is the order you need to send to the agent.", + "visual_files_var": "" + } + } + ], + "topPEnabled": false, + "top_p": 0.75, + "user_prompt": "", + "visual_files_var": "" + } + }, + "upstream": [ + "begin" + ] + }, + "Message:ModernSwansThrow": { + "downstream": [], + "obj": { + "component_name": "Message", + "params": { + "content": [ + "{Agent:LuckyApplesGrab@content}" + ] + } + }, + "upstream": [ + "Agent:LuckyApplesGrab" + ] + }, + "begin": { + "downstream": [ + "Agent:LuckyApplesGrab" + ], + "obj": { + "component_name": "Begin", + "params": { + "enablePrologue": true, + "inputs": {}, + "mode": "conversational", + "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" + } + }, + "upstream": [] + } + }, + "globals": { + "sys.conversation_turns": 0, + "sys.files": [], + "sys.query": "", + "sys.user_id": "" + }, + "graph": { + "edges": [ + { + "data": { + "isHovered": false + }, + "id": "xy-edge__beginstart-Agent:LuckyApplesGrabend", + "source": "begin", + "sourceHandle": "start", + "target": "Agent:LuckyApplesGrab", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:LuckyApplesGrabstart-Message:ModernSwansThrowend", + "source": "Agent:LuckyApplesGrab", + "sourceHandle": "start", + "target": "Message:ModernSwansThrow", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:LuckyApplesGrabagentBottom-Agent:SlickSpidersTurnagentTop", + "source": "Agent:LuckyApplesGrab", + "sourceHandle": "agentBottom", + "target": "Agent:SlickSpidersTurn", + "targetHandle": "agentTop" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:LuckyApplesGrabagentBottom-Agent:IcyPawsRescueagentTop", + "source": "Agent:LuckyApplesGrab", + "sourceHandle": "agentBottom", + "target": "Agent:IcyPawsRescue", + "targetHandle": "agentTop" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:LuckyApplesGrabagentBottom-Agent:TenderAdsAllowagentTop", + "source": "Agent:LuckyApplesGrab", + "sourceHandle": "agentBottom", + "target": "Agent:TenderAdsAllow", + "targetHandle": "agentTop" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:SlickSpidersTurntool-Tool:ThreeWallsRingend", + "source": "Agent:SlickSpidersTurn", + "sourceHandle": "tool", + "target": "Tool:ThreeWallsRing", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:IcyPawsRescuetool-Tool:FloppyJokesItchend", + "source": "Agent:IcyPawsRescue", + "sourceHandle": "tool", + "target": "Tool:FloppyJokesItch", + "targetHandle": "end" + } + ], + "nodes": [ + { + "data": { + "form": { + "enablePrologue": true, + "inputs": {}, + "mode": "conversational", + "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" + }, + "label": "Begin", + "name": "begin" + }, + "dragging": false, + "id": "begin", + "measured": { + "height": 48, + "width": 200 + }, + "position": { + "x": 38.19445084117184, + "y": 183.9781832844475 + }, + "selected": false, + "sourcePosition": "left", + "targetPosition": "right", + "type": "beginNode" + }, + { + "data": { + "form": { "delay_after_error": 1, "description": "", "exception_comment": "", @@ -48,861 +429,486 @@ "role": "user" } ], - "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", + "sys_prompt": "# Role\n\nYou are the **Lead Agent**, responsible for initiating the multi-agent SEO blog generation process. You will receive the user’s 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` → Create the blog outline.\n\n - `Body Agent` → Write all sections based on outline.\n\n - `Editor Agent` → 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–2 relevant keywords to each section. Keep it aligned with the user’s 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–600 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→ 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→ 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→ Output: How-to, Audience: SEO marketers, Intent: guide readers on applying AI for SEO growth", "temperature": "0.1", "temperatureEnabled": true, - "tools": [ - { - "component_name": "Agent", - "id": "Agent:SlickSpidersTurn", - "name": "Outline Agent", - "params": { - "delay_after_error": 1, - "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", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.3, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 2, - "max_tokens": 4096, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "parameter": "Balance", - "presencePenaltyEnabled": false, - "presence_penalty": 0.2, - "prompts": [ - { - "content": "{sys.query}", - "role": "user" - } - ], - "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", - "temperature": 0.5, - "temperatureEnabled": true, - "tools": [ - { - "component_name": "TavilySearch", - "name": "TavilySearch", - "params": { - "api_key": "", - "days": 7, - "exclude_domains": [], - "include_answer": false, - "include_domains": [], - "include_image_descriptions": false, - "include_images": false, - "include_raw_content": true, - "max_results": 5, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" - }, - "json": { - "type": "Array", - "value": [] - } - }, - "query": "sys.query", - "search_depth": "basic", - "topic": "general" - } - } - ], - "topPEnabled": false, - "top_p": 0.85, - "user_prompt": "This is the order you need to send to the agent.", - "visual_files_var": "" - } - }, - { - "component_name": "Agent", - "id": "Agent:IcyPawsRescue", - "name": "Body Agent", - "params": { - "delay_after_error": 1, - "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", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.5, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 3, - "max_tokens": 4096, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "parameter": "Precise", - "presencePenaltyEnabled": false, - "presence_penalty": 0.5, - "prompts": [ - { - "content": "{sys.query}", - "role": "user" - } - ], - "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", - "temperature": 0.2, - "temperatureEnabled": true, - "tools": [ - { - "component_name": "TavilySearch", - "name": "TavilySearch", - "params": { - "api_key": "", - "days": 7, - "exclude_domains": [], - "include_answer": false, - "include_domains": [], - "include_image_descriptions": false, - "include_images": false, - "include_raw_content": true, - "max_results": 5, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" - }, - "json": { - "type": "Array", - "value": [] - } - }, - "query": "sys.query", - "search_depth": "basic", - "topic": "general" - } - } - ], - "topPEnabled": false, - "top_p": 0.75, - "user_prompt": "This is the order you need to send to the agent.", - "visual_files_var": "" - } - }, - { - "component_name": "Agent", - "id": "Agent:TenderAdsAllow", - "name": "Editor Agent", - "params": { - "delay_after_error": 1, - "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", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.5, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 2, - "max_tokens": 4096, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "parameter": "Precise", - "presencePenaltyEnabled": false, - "presence_penalty": 0.5, - "prompts": [ - { - "content": "{sys.query}", - "role": "user" - } - ], - "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", - "temperature": 0.2, - "temperatureEnabled": true, - "tools": [], - "topPEnabled": false, - "top_p": 0.75, - "user_prompt": "This is the order you need to send to the agent.", - "visual_files_var": "" - } - } - ], + "tools": [], "topPEnabled": false, "top_p": 0.75, "user_prompt": "", "visual_files_var": "" - } + }, + "label": "Agent", + "name": "Lead Agent" }, - "upstream": [ - "begin" - ] + "id": "Agent:LuckyApplesGrab", + "measured": { + "height": 84, + "width": 200 + }, + "position": { + "x": 350, + "y": 200 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" }, - "Message:ModernSwansThrow": { - "downstream": [], - "obj": { - "component_name": "Message", - "params": { + { + "data": { + "form": { "content": [ "{Agent:LuckyApplesGrab@content}" ] - } + }, + "label": "Message", + "name": "Response" }, - "upstream": [ - "Agent:LuckyApplesGrab" - ] + "dragging": false, + "id": "Message:ModernSwansThrow", + "measured": { + "height": 56, + "width": 200 + }, + "position": { + "x": 669.394830760932, + "y": 190.72421137520644 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "messageNode" }, - "begin": { - "downstream": [ - "Agent:LuckyApplesGrab" - ], - "obj": { - "component_name": "Begin", - "params": { - "enablePrologue": true, - "inputs": {}, - "mode": "conversational", - "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" - } - }, - "upstream": [] - } - }, - "globals": { - "sys.conversation_turns": 0, - "sys.files": [], - "sys.query": "", - "sys.user_id": "" - }, - "graph": { - "edges": [ - { - "data": { - "isHovered": false - }, - "id": "xy-edge__beginstart-Agent:LuckyApplesGrabend", - "source": "begin", - "sourceHandle": "start", - "target": "Agent:LuckyApplesGrab", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:LuckyApplesGrabstart-Message:ModernSwansThrowend", - "source": "Agent:LuckyApplesGrab", - "sourceHandle": "start", - "target": "Message:ModernSwansThrow", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:LuckyApplesGrabagentBottom-Agent:SlickSpidersTurnagentTop", - "source": "Agent:LuckyApplesGrab", - "sourceHandle": "agentBottom", - "target": "Agent:SlickSpidersTurn", - "targetHandle": "agentTop" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:LuckyApplesGrabagentBottom-Agent:IcyPawsRescueagentTop", - "source": "Agent:LuckyApplesGrab", - "sourceHandle": "agentBottom", - "target": "Agent:IcyPawsRescue", - "targetHandle": "agentTop" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:LuckyApplesGrabagentBottom-Agent:TenderAdsAllowagentTop", - "source": "Agent:LuckyApplesGrab", - "sourceHandle": "agentBottom", - "target": "Agent:TenderAdsAllow", - "targetHandle": "agentTop" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:SlickSpidersTurntool-Tool:ThreeWallsRingend", - "source": "Agent:SlickSpidersTurn", - "sourceHandle": "tool", - "target": "Tool:ThreeWallsRing", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:IcyPawsRescuetool-Tool:FloppyJokesItchend", - "source": "Agent:IcyPawsRescue", - "sourceHandle": "tool", - "target": "Tool:FloppyJokesItch", - "targetHandle": "end" - } - ], - "nodes": [ - { - "data": { - "form": { - "enablePrologue": true, - "inputs": {}, - "mode": "conversational", - "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" + { + "data": { + "form": { + "delay_after_error": 1, + "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", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.3, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 2, + "max_tokens": 4096, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } }, - "label": "Begin", - "name": "begin" - }, - "dragging": false, - "id": "begin", - "measured": { - "height": 48, - "width": 200 - }, - "position": { - "x": 38.19445084117184, - "y": 183.9781832844475 - }, - "selected": false, - "sourcePosition": "left", - "targetPosition": "right", - "type": "beginNode" - }, - { - "data": { - "form": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.5, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 3, - "max_tokens": 4096, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "parameter": "Precise", - "presencePenaltyEnabled": false, - "presence_penalty": 0.5, - "prompts": [ - { - "content": "The user query is {sys.query}", - "role": "user" - } - ], - "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", - "temperature": "0.1", - "temperatureEnabled": true, - "tools": [], - "topPEnabled": false, - "top_p": 0.75, - "user_prompt": "", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Lead Agent" - }, - "id": "Agent:LuckyApplesGrab", - "measured": { - "height": 84, - "width": 200 - }, - "position": { - "x": 350, - "y": 200 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" - }, - { - "data": { - "form": { - "content": [ - "{Agent:LuckyApplesGrab@content}" - ] - }, - "label": "Message", - "name": "Response" - }, - "dragging": false, - "id": "Message:ModernSwansThrow", - "measured": { - "height": 56, - "width": 200 - }, - "position": { - "x": 669.394830760932, - "y": 190.72421137520644 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "messageNode" - }, - { - "data": { - "form": { - "delay_after_error": 1, - "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", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.3, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 2, - "max_tokens": 4096, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "parameter": "Balance", - "presencePenaltyEnabled": false, - "presence_penalty": 0.2, - "prompts": [ - { - "content": "{sys.query}", - "role": "user" - } - ], - "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", - "temperature": 0.5, - "temperatureEnabled": true, - "tools": [ - { - "component_name": "TavilySearch", - "name": "TavilySearch", - "params": { - "api_key": "", - "days": 7, - "exclude_domains": [], - "include_answer": false, - "include_domains": [], - "include_image_descriptions": false, - "include_images": false, - "include_raw_content": true, - "max_results": 5, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" - }, - "json": { - "type": "Array", - "value": [] - } + "parameter": "Balance", + "presencePenaltyEnabled": false, + "presence_penalty": 0.2, + "prompts": [ + { + "content": "{sys.query}", + "role": "user" + } + ], + "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–2 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 “Tutorial” or “How-to”, 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–5 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", + "temperature": 0.5, + "temperatureEnabled": true, + "tools": [ + { + "component_name": "TavilySearch", + "name": "TavilySearch", + "params": { + "api_key": "", + "days": 7, + "exclude_domains": [], + "include_answer": false, + "include_domains": [], + "include_image_descriptions": false, + "include_images": false, + "include_raw_content": true, + "max_results": 5, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" }, - "query": "sys.query", - "search_depth": "basic", - "topic": "general" - } - } - ], - "topPEnabled": false, - "top_p": 0.85, - "user_prompt": "This is the order you need to send to the agent.", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Outline Agent" + "json": { + "type": "Array", + "value": [] + } + }, + "query": "sys.query", + "search_depth": "basic", + "topic": "general" + }, + "id": "TavilySearch:SlickSpidersTurn" + } + ], + "topPEnabled": false, + "top_p": 0.85, + "user_prompt": "This is the order you need to send to the agent.", + "visual_files_var": "" }, - "dragging": false, - "id": "Agent:SlickSpidersTurn", - "measured": { - "height": 84, - "width": 200 - }, - "position": { - "x": 100.60137004146719, - "y": 411.67654846431367 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" + "label": "Agent", + "name": "Outline Agent" }, - { - "data": { - "form": { - "delay_after_error": 1, - "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", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.5, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 3, - "max_tokens": 4096, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "parameter": "Precise", - "presencePenaltyEnabled": false, - "presence_penalty": 0.5, - "prompts": [ - { - "content": "{sys.query}", - "role": "user" - } - ], - "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", - "temperature": 0.2, - "temperatureEnabled": true, - "tools": [ - { - "component_name": "TavilySearch", - "name": "TavilySearch", - "params": { - "api_key": "", - "days": 7, - "exclude_domains": [], - "include_answer": false, - "include_domains": [], - "include_image_descriptions": false, - "include_images": false, - "include_raw_content": true, - "max_results": 5, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" - }, - "json": { - "type": "Array", - "value": [] - } + "dragging": false, + "id": "Agent:SlickSpidersTurn", + "measured": { + "height": 84, + "width": 200 + }, + "position": { + "x": 100.60137004146719, + "y": 411.67654846431367 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" + }, + { + "data": { + "form": { + "delay_after_error": 1, + "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", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.5, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 3, + "max_tokens": 4096, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "parameter": "Precise", + "presencePenaltyEnabled": false, + "presence_penalty": 0.5, + "prompts": [ + { + "content": "{sys.query}", + "role": "user" + } + ], + "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 — 500-600 words, using keywords naturally.]\n\n", + "temperature": 0.2, + "temperatureEnabled": true, + "tools": [ + { + "component_name": "TavilySearch", + "name": "TavilySearch", + "params": { + "api_key": "", + "days": 7, + "exclude_domains": [], + "include_answer": false, + "include_domains": [], + "include_image_descriptions": false, + "include_images": false, + "include_raw_content": true, + "max_results": 5, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" }, - "query": "sys.query", - "search_depth": "basic", - "topic": "general" - } - } - ], - "topPEnabled": false, - "top_p": 0.75, - "user_prompt": "This is the order you need to send to the agent.", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Body Agent" + "json": { + "type": "Array", + "value": [] + } + }, + "query": "sys.query", + "search_depth": "basic", + "topic": "general" + }, + "id": "TavilySearch:IcyPawsRescue" + } + ], + "topPEnabled": false, + "top_p": 0.75, + "user_prompt": "This is the order you need to send to the agent.", + "visual_files_var": "" }, - "dragging": false, - "id": "Agent:IcyPawsRescue", - "measured": { - "height": 84, - "width": 200 - }, - "position": { - "x": 439.3374395738501, - "y": 366.1408588516909 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" + "label": "Agent", + "name": "Body Agent" }, - { - "data": { - "form": { - "delay_after_error": 1, - "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", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.5, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 2, - "max_tokens": 4096, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "parameter": "Precise", - "presencePenaltyEnabled": false, - "presence_penalty": 0.5, - "prompts": [ - { - "content": "{sys.query}", - "role": "user" - } - ], - "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", - "temperature": 0.2, - "temperatureEnabled": true, - "tools": [], - "topPEnabled": false, - "top_p": 0.75, - "user_prompt": "This is the order you need to send to the agent.", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Editor Agent" - }, - "dragging": false, - "id": "Agent:TenderAdsAllow", - "measured": { - "height": 84, - "width": 200 - }, - "position": { - "x": 730.8513124709204, - "y": 327.351197329827 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" + "dragging": false, + "id": "Agent:IcyPawsRescue", + "measured": { + "height": 84, + "width": 200 }, - { - "data": { - "form": { - "description": "This is an agent for a specific task.", - "user_prompt": "This is the order you need to send to the agent." - }, - "label": "Tool", - "name": "flow.tool_0" - }, - "dragging": false, - "id": "Tool:ThreeWallsRing", - "measured": { - "height": 48, - "width": 200 - }, - "position": { - "x": -26.93431957115564, - "y": 531.4384641920368 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "toolNode" + "position": { + "x": 439.3374395738501, + "y": 366.1408588516909 }, - { - "data": { - "form": { - "description": "This is an agent for a specific task.", - "user_prompt": "This is the order you need to send to the agent." + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" + }, + { + "data": { + "form": { + "delay_after_error": 1, + "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", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.5, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 2, + "max_tokens": 4096, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } }, - "label": "Tool", - "name": "flow.tool_1" + "parameter": "Precise", + "presencePenaltyEnabled": false, + "presence_penalty": 0.5, + "prompts": [ + { + "content": "{sys.query}", + "role": "user" + } + ], + "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 — 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", + "temperature": 0.2, + "temperatureEnabled": true, + "tools": [], + "topPEnabled": false, + "top_p": 0.75, + "user_prompt": "This is the order you need to send to the agent.", + "visual_files_var": "" }, - "dragging": false, - "id": "Tool:FloppyJokesItch", - "measured": { - "height": 48, - "width": 200 - }, - "position": { - "x": 414.6786783453011, - "y": 499.39483076093194 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "toolNode" + "label": "Agent", + "name": "Editor Agent" }, - { - "data": { - "form": { - "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" - }, - "label": "Note", - "name": "Workflow Overall Description" + "dragging": false, + "id": "Agent:TenderAdsAllow", + "measured": { + "height": 84, + "width": 200 + }, + "position": { + "x": 730.8513124709204, + "y": 327.351197329827 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" + }, + { + "data": { + "form": { + "description": "This is an agent for a specific task.", + "user_prompt": "This is the order you need to send to the agent." }, - "dragHandle": ".note-drag-handle", - "dragging": false, + "label": "Tool", + "name": "flow.tool_0" + }, + "dragging": false, + "id": "Tool:ThreeWallsRing", + "measured": { + "height": 48, + "width": 200 + }, + "position": { + "x": -26.93431957115564, + "y": 531.4384641920368 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "toolNode" + }, + { + "data": { + "form": { + "description": "This is an agent for a specific task.", + "user_prompt": "This is the order you need to send to the agent." + }, + "label": "Tool", + "name": "flow.tool_1" + }, + "dragging": false, + "id": "Tool:FloppyJokesItch", + "measured": { + "height": 48, + "width": 200 + }, + "position": { + "x": 414.6786783453011, + "y": 499.39483076093194 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "toolNode" + }, + { + "data": { + "form": { + "text": "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.\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 → writing → editing → 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" + }, + "label": "Note", + "name": "Workflow Overall Description" + }, + "dragHandle": ".note-drag-handle", + "dragging": false, + "height": 208, + "id": "Note:ElevenVansInvent", + "measured": { "height": 208, - "id": "Note:ElevenVansInvent", - "measured": { - "height": 208, - "width": 518 - }, - "position": { - "x": -336.6586460874556, - "y": 113.43253511344867 - }, - "resizing": false, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode", "width": 518 }, - { - "data": { - "form": { - "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" - }, - "label": "Note", - "name": "Lead Agent" + "position": { + "x": -336.6586460874556, + "y": 113.43253511344867 + }, + "resizing": false, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode", + "width": 518 + }, + { + "data": { + "form": { + "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" }, - "dragHandle": ".note-drag-handle", - "dragging": false, + "label": "Note", + "name": "Lead Agent" + }, + "dragHandle": ".note-drag-handle", + "dragging": false, + "height": 146, + "id": "Note:EmptyClubsGreet", + "measured": { "height": 146, - "id": "Note:EmptyClubsGreet", - "measured": { - "height": 146, - "width": 334 - }, - "position": { - "x": 390.1408623279084, - "y": 2.6521144030202493 - }, - "resizing": false, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode", "width": 334 }, - { - "data": { - "form": { - "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" - }, - "label": "Note", - "name": "Outline Agent" + "position": { + "x": 390.1408623279084, + "y": 2.6521144030202493 + }, + "resizing": false, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode", + "width": 334 + }, + { + "data": { + "form": { + "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" }, - "dragHandle": ".note-drag-handle", - "dragging": false, + "label": "Note", + "name": "Outline Agent" + }, + "dragHandle": ".note-drag-handle", + "dragging": false, + "height": 157, + "id": "Note:CurlyTigersDouble", + "measured": { "height": 157, - "id": "Note:CurlyTigersDouble", - "measured": { - "height": 157, - "width": 394 - }, - "position": { - "x": -60.03139680691618, - "y": 595.8208080534818 - }, - "resizing": false, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode", "width": 394 }, - { - "data": { - "form": { - "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" - }, - "label": "Note", - "name": "Body Agent" + "position": { + "x": -60.03139680691618, + "y": 595.8208080534818 + }, + "resizing": false, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode", + "width": 394 + }, + { + "data": { + "form": { + "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–220 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" }, - "dragHandle": ".note-drag-handle", - "dragging": false, + "label": "Note", + "name": "Body Agent" + }, + "dragHandle": ".note-drag-handle", + "dragging": false, + "height": 164, + "id": "Note:StrongKingsCamp", + "measured": { "height": 164, - "id": "Note:StrongKingsCamp", - "measured": { - "height": 164, - "width": 408 - }, - "position": { - "x": 446.54943226110845, - "y": 590.9443887062529 - }, - "resizing": false, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode", "width": 408 }, - { - "data": { - "form": { - "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" - }, - "label": "Note", - "name": "Editor Agent" + "position": { + "x": 446.54943226110845, + "y": 590.9443887062529 + }, + "resizing": false, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode", + "width": 408 + }, + { + "data": { + "form": { + "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" }, - "dragHandle": ".note-drag-handle", - "dragging": false, + "label": "Note", + "name": "Editor Agent" + }, + "dragHandle": ".note-drag-handle", + "dragging": false, + "height": 147, + "id": "Note:OpenOttersShow", + "measured": { "height": 147, - "id": "Note:OpenOttersShow", - "measured": { - "height": 147, - "width": 357 - }, - "position": { - "x": 976.6858726228803, - "y": 422.7404806291804 - }, - "resizing": false, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode", "width": 357 - } - ] - }, - "history": [], - "messages": [], - "path": [], - "retrieval": [] + }, + "position": { + "x": 976.6858726228803, + "y": 422.7404806291804 + }, + "resizing": false, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode", + "width": 357 + } + ] }, + "history": [], + "messages": [], + "path": [], + "retrieval": [] + }, "avatar": "data:image/jpeg;base64,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" } diff --git a/agent/templates/stock_market_research_assistant.json b/agent/templates/stock_market_research_assistant.json index 42bcea9ed1..e9218a4211 100644 --- a/agent/templates/stock_market_research_assistant.json +++ b/agent/templates/stock_market_research_assistant.json @@ -12,14 +12,611 @@ }, "canvas_type": "Recommended", "dsl": { - "components": { - "Agent:ManyToesBrush": { - "downstream": [ - "Switch:FluffyCoinsSell" - ], - "obj": { - "component_name": "Agent", - "params": { + "components": { + "Agent:ManyToesBrush": { + "downstream": [ + "Switch:FluffyCoinsSell" + ], + "obj": { + "component_name": "Agent", + "params": { + "cite": true, + "delay_after_error": 1, + "description": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": "", + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 1, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "{sys.query}", + "role": "user" + } + ], + "sys_prompt": " \n\nYour responsibility is to identify and extract the stock name or abbreviation from the user's natural language query and return the corresponding unique stock code.\n\n \n\n\n\n \n\n1. Only one result is allowed: - If a stock is identified → only return the corresponding stock code; - If no stock is identified → only return “Not Found”. 2. **Do not** output any additional text, punctuation, explanation, prefixes, or line breaks. 3. The output must strictly adhere to the . \n\n\n\n\n\nOnly output the stock code (e.g., AAPL or 600519)\nOr only output “Not Found”\n\n\n\n\nUser input: “Help me check the research report of Apple” → Output: AAPL\nUser input: “How is Maotai’s financial performance” → Output: 600519\nUser input: “How is the Shanghai Composite Index doing today” → Output: Not Found\n\n\n\n - Tavily Search: Use this tool when you are unsure of the stock code. - If you are confident, you do not need to use the tool. \n\n\n\n\n\nOnly output the result, no explanations, hints, or notes allowed.\nThe output can only be the stock code or “Not Found”, otherwise, it is considered an incorrect answer.\n", + "temperature": 0.1, + "temperatureEnabled": false, + "tools": [ + { + "component_name": "TavilySearch", + "name": "TavilySearch", + "params": { + "api_key": "", + "days": 7, + "exclude_domains": [], + "include_answer": false, + "include_domains": [], + "include_image_descriptions": false, + "include_images": false, + "include_raw_content": true, + "max_results": 5, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" + }, + "json": { + "type": "Array", + "value": [] + } + }, + "query": "sys.query", + "search_depth": "basic", + "topic": "general" + }, + "id": "TavilySearch:FreeStarsCough" + } + ], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" + } + }, + "upstream": [ + "begin" + ] + }, + "Agent:SadDodosRescue": { + "downstream": [ + "Agent:SharpSlothsSlide" + ], + "obj": { + "component_name": "Agent", + "params": { + "cite": true, + "delay_after_error": 1, + "description": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": "", + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "kimi-k2-turbo-preview@Moonshot", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 1, + "max_tokens": 256, + "mcp": [ + { + "mcp_id": "30d6ef8ea8d511f0828382e3548809fa", + "tools": {} + } + ], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "user's query is {sys.query}\n\n\n{Agent:ManyToesBrush@content}\n", + "role": "user" + } + ], + "sys_prompt": " \n\nYou are the information extraction agent. You understand the user’s query and delegate tasks to investoday and the internal research report retrieval agent. \n\n \n\n\n\n 1. Based on the stock code output by the \"Extract Stock Code\" agent, call investoday's list_news to retrieve the latest authoritative research reports and views, and save all publicly available key information. \n\n2. Call the \"Internal Research Report Retrieval Agent\" and save the full text of the research report output. \n\n3. Output the content retrieved from investoday and the Internal Research Report Retrieval Agent in full. \n\n\n\n\n\nThe output must be divided into two sections:\n#1. Title: “investoday”\nDirectly output the content collected from investoday without any additional processing.\n#2. Title: \"Internal Research Report Retrieval Agent\"\nDirectly output the content provided by the Internal Research Report Retrieval Agent.\n", + "temperature": 0.1, + "temperatureEnabled": false, + "tools": [ + { + "component_name": "Agent", + "id": "Agent:MightyIdeasGlow", + "name": "Internal Research Report Retrieval Agent", + "params": { + "cite": true, + "delay_after_error": 1, + "description": "You are a senior financial content analyst who can accurately identify the companies, stock codes, industries or topics mentioned in user questions, and completely extract relevant research content from the knowledge base to ensure that data, opinions and conclusions are not lost.", + "exception_default_value": "", + "exception_goto": [], + "exception_method": "", + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "kimi-k2-turbo-preview@Moonshot", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 1, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "{sys.query}", + "role": "user" + } + ], + "sys_prompt": " \n\nRead user input → Identify the involved company/stock (supports abbreviations, full names, codes, and aliases) → Retrieve the most relevant research reports from the knowledge base → Output the full text of the research report, retaining the original format, data, chart descriptions, and risk warnings. \n\n\n\n\n\n \n\n1. Exact Match: Prioritize exact matches of company full names and stock codes. \n\n2. Content Fidelity: Fully retain the research report text stored in the knowledge base without deletion, modification, or omission of paragraphs. \n\n3. Original Data: Retain table data, dates, units, etc., in their original form. \n\n4. Complete Viewpoints: Include investment logic, financial analysis, industry comparisons, earnings forecasts, valuation methods, risk warnings, etc. \n\n5. Merging Multiple Reports: If there are multiple relevant research reports, output them in reverse chronological order. \n\n\n\n6. No Results Feedback: If no matching reports are found, output “No related research reports available in the knowledge base.”\n\n\n\n ", + "temperature": 0.1, + "temperatureEnabled": false, + "tools": [ + { + "component_name": "Retrieval", + "id": "Retrieval:BrightHoursRise", + "name": "Retrieval", + "params": { + "cross_languages": [], + "description": "A knowledge base of research reports on stock analysis by senior experts", + "empty_response": "", + "kb_ids": [ + "60c53ed89acc11f0bc1e7a2a6d0b2755" + ], + "retrieval_from": "dataset", + "keywords_similarity_weight": 0.7, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" + } + }, + "rerank_id": "", + "similarity_threshold": 0.2, + "top_k": 1024, + "top_n": 8, + "use_kg": false + } + } + ], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "This is the order you need to send to the agent.", + "visual_files_var": "" + } + } + ], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" + } + }, + "upstream": [ + "Switch:FluffyCoinsSell" + ] + }, + "Agent:SharpSlothsSlide": { + "downstream": [ + "Message:OliveLawsArgue" + ], + "obj": { + "component_name": "Agent", + "params": { + "cite": true, + "delay_after_error": 1, + "description": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": "", + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 1, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "User query questions:\n\n\n\n{sys.query}\n\n\n\nInformation Extraction Agent:\n\n{Agent:SadDodosRescue@content}", + "role": "user" + } + ], + "sys_prompt": " \n\nYou are a senior investment banking (IB) analyst with years of experience in capital market research. You excel at writing investment research reports covering publicly listed companies, industries, and macroeconomics. You possess strong financial analysis skills and industry insights, combining quantitative and qualitative analysis to provide high-value references for investment decisions. \n\n**You are able to retain and present differentiated viewpoints from various reports and sources in your research, and when discrepancies arise, you do not merge them into a single conclusion. Instead, you compare and analyze the differences.** \n\n\n \n\n\n\n\n \n\nYou will receive financial information extracted by the information extraction agent.\n\n \n\n\n\nBased on the content returned by the information extraction agent (no fabrication of data), write a professional, complete, and structured investment research report. The report must be logically rigorous, clearly organized, and use professional language, suitable for reference by fund managers, institutional investors, and other professional readers.\nWhen there are differences in analysis or forecasts between different reports or institutions, you must list and identify the sources in the report. You should not select only one viewpoint. You need to point out the differences, their possible causes, and their impact on investment judgments.\n\n\n\n\n##1. Summary\nProvide a concise overview of the company’s core business, recent performance, industry positioning, and major investment highlights.\nSummarize key conclusions in 3-5 sentences.\nHighlight any discrepancies in core conclusions and briefly describe the differing viewpoints and areas of disagreement.\n##2. Company Overview\nDescribe the company's main business, core products/services, market share, competitive advantages, and business model.\nHighlight any differences in the description of the company’s market position or competitive advantages from different sources. Present and compare these differences.\n##3. Recent Financial Performance\nSummarize key metrics from the latest financial report (e.g., revenue, net profit, gross margin, EPS).\nHighlight the drivers behind the trends and compare the differential analyses from different reports. Present this comparison in a table.\n##4. Industry Trends & Opportunities\nOverview of industry development trends, market size, and major drivers.\nIf different sources provide differing forecasts for industry growth rates, technological trends, or competitive landscape, list these and provide background information. Present this comparison in a table.\n##5. Investment Recommendation\nProvide a clear investment recommendation based on the analysis above (e.g., \"Buy/Hold/Neutral/Sell\"), presented in a table.\nInclude investment ratings or recommendations from all sources, with the source and date clearly noted.\nIf you provide a combined recommendation based on different viewpoints, clearly explain the reasoning behind this integration.\n##6. Appendix & References\nList the data sources, analysis methods, important formulas, or chart descriptions used.\nAll references must come from the information extraction agent and the company financial data table provided, or publicly noted sources.\nFor differentiated viewpoints, provide full citation information (author, institution, date) and present this in a table.\n\n\n\n\nLanguage Style: Financial, professional, precise, and analytical.\nViewpoint Retention: When there are multiple viewpoints and conclusions, all must be retained and compared. You cannot choose only one.\nCitations: When specific data or viewpoints are referenced, include the source in parentheses (e.g., Source: Morgan Stanley Research, 2024-05-07).\nFacts: All data and conclusions must come from the information extraction agent or their noted legitimate sources. No fabrication is allowed.\nReadability: Use short paragraphs and bullet points to make it easy for professional readers to grasp key information and see the differences in viewpoints.\n\n\n\n\nGenerate a complete investment research report that meets investment banking industry standards, which can be directly used for institutional investment internal reference, while faithfully retaining differentiated viewpoints from various reports and providing the corresponding analysis.\n", + "temperature": 0.1, + "temperatureEnabled": false, + "tools": [], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" + } + }, + "upstream": [ + "Agent:SadDodosRescue" + ] + }, + "CodeExec:LightSheepTrade": { + "downstream": [ + "Message:OliveLawsArgue" + ], + "obj": { + "component_name": "CodeExec", + "params": { + "arguments": { + "input_text": "YahooFinance:QuickAdsDig@report" + }, + "lang": "python", + "outputs": { + "md_table": { + "type": "String", + "value": "" + } + }, + "script": "import re\n\ndef format_number(value: str) -> str:\n \"\"\"Convert scientific notation or floating-point numbers to comma-separated numbers\"\"\"\n try:\n num = float(value)\n if num.is_integer():\n return f\"{int(num):,}\" # If it's an integer, format without decimal places\n else:\n return f\"{num:,.2f}\" # Otherwise, keep two decimal places and add commas\n except:\n return value # Return the original value if it's not a number (e.g., — or empty)\n\ndef extract_md_table_single_column(input_text: str) -> str:\n # Use English indicators directly\n indicators = [\n \"Total Assets\", \"Total Equity\", \"Tangible Book Value\", \"Total Debt\", \n \"Net Debt\", \"Cash And Cash Equivalents\", \"Working Capital\", \n \"Long Term Debt\", \"Common Stock Equity\", \"Ordinary Shares Number\"\n ]\n \n # Core indicators and their corresponding units\n unit_map = {\n \"Total Assets\": \"USD\",\n \"Total Equity\": \"USD\",\n \"Tangible Book Value\": \"USD\",\n \"Total Debt\": \"USD\",\n \"Net Debt\": \"USD\",\n \"Cash And Cash Equivalents\": \"USD\",\n \"Working Capital\": \"USD\",\n \"Long Term Debt\": \"USD\",\n \"Common Stock Equity\": \"USD\",\n \"Ordinary Shares Number\": \"Shares\"\n }\n\n lines = input_text.splitlines()\n\n # Automatically detect the date column, keeping only the first one\n date_pattern = r\"\\d{4}-\\d{2}-\\d{2}\"\n header_line = \"\"\n for line in lines:\n if re.search(date_pattern, line):\n header_line = line\n break\n\n if not header_line:\n raise ValueError(\"Date column header row not found\")\n\n dates = re.findall(date_pattern, header_line)\n first_date = dates[0] # Keep only the first date\n header = f\"| Indicator | {first_date} |\"\n divider = \"|------------------------|------------|\"\n\n rows = []\n for ind in indicators:\n unit = unit_map.get(ind, \"\")\n display_ind = f\"{ind} ({unit})\" if unit else ind\n\n found = False\n for line in lines:\n if ind in line:\n # Match numbers and possible units\n pattern = r\"(nan|[0-9\\.]+(?:[eE][+-]?\\d+)?)\"\n values = re.findall(pattern, line)\n # Replace 'nan' with '—' and format the number\n first_value = values[0].strip() if values and values[0].strip().lower() != \"nan\" else \"—\"\n first_value = format_number(first_value) if first_value != \"—\" else \"—\"\n rows.append(f\"| {display_ind} | {first_value} |\")\n found = True\n break\n if not found:\n rows.append(f\"| {display_ind} | — |\")\n\n md_table = \"\\n\".join([header, divider] + rows)\n return md_table\n\ndef main(input_text: str):\n return extract_md_table_single_column(input_text)\n" + } + }, + "upstream": [ + "YahooFinance:QuickAdsDig" + ] + }, + "Message:OliveLawsArgue": { + "downstream": [], + "obj": { + "component_name": "Message", + "params": { + "content": [ + "Company financial statements:\n\n{CodeExec:LightSheepTrade@md_table}\n\n\n{Agent:SharpSlothsSlide@content}" + ] + } + }, + "upstream": [ + "Agent:SharpSlothsSlide", + "CodeExec:LightSheepTrade" + ] + }, + "Message:TwentyBanksLeave": { + "downstream": [], + "obj": { + "component_name": "Message", + "params": { + "content": [ + "Your query is not supported." + ] + } + }, + "upstream": [ + "Switch:FluffyCoinsSell" + ] + }, + "Switch:FluffyCoinsSell": { + "downstream": [ + "YahooFinance:QuickAdsDig", + "Agent:SadDodosRescue", + "Message:TwentyBanksLeave" + ], + "obj": { + "component_name": "Switch", + "params": { + "conditions": [ + { + "items": [ + { + "cpn_id": "Agent:ManyToesBrush@content", + "operator": "not contains", + "value": "Not Found" + } + ], + "logical_operator": "and", + "to": [ + "YahooFinance:QuickAdsDig", + "Agent:SadDodosRescue" + ] + } + ], + "end_cpn_ids": [ + "Message:TwentyBanksLeave" + ] + } + }, + "upstream": [ + "Agent:ManyToesBrush" + ] + }, + "YahooFinance:QuickAdsDig": { + "downstream": [ + "CodeExec:LightSheepTrade" + ], + "obj": { + "component_name": "YahooFinance", + "params": { + "balance_sheet": true, + "cash_flow_statement": false, + "financials": false, + "history": false, + "info": false, + "news": false, + "outputs": { + "report": { + "type": "string", + "value": "" + } + }, + "stock_code": "sys.query" + } + }, + "upstream": [ + "Switch:FluffyCoinsSell" + ] + }, + "begin": { + "downstream": [ + "Agent:ManyToesBrush" + ], + "obj": { + "component_name": "Begin", + "params": { + "enablePrologue": true, + "inputs": {}, + "mode": "conversational", + "prologue": "Hi! I'm your assistant. What can I do for you?" + } + }, + "upstream": [] + } + }, + "globals": { + "sys.conversation_turns": 0, + "sys.files": [], + "sys.query": "", + "sys.user_id": "" + }, + "graph": { + "edges": [ + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:ManyToesBrushtool-Tool:AngryRabbitsPlayend", + "source": "Agent:ManyToesBrush", + "sourceHandle": "tool", + "target": "Tool:AngryRabbitsPlay", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:SadDodosRescuestart-Agent:SharpSlothsSlideend", + "source": "Agent:SadDodosRescue", + "sourceHandle": "start", + "target": "Agent:SharpSlothsSlide", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:SadDodosRescueagentBottom-Agent:MightyIdeasGlowagentTop", + "source": "Agent:SadDodosRescue", + "sourceHandle": "agentBottom", + "target": "Agent:MightyIdeasGlow", + "targetHandle": "agentTop" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:MightyIdeasGlowtool-Tool:FullIconsStopend", + "source": "Agent:MightyIdeasGlow", + "sourceHandle": "tool", + "target": "Tool:FullIconsStop", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__YahooFinance:QuickAdsDigstart-CodeExec:LightSheepTradeend", + "markerEnd": "logo", + "source": "YahooFinance:QuickAdsDig", + "sourceHandle": "start", + "style": { + "stroke": "rgba(91, 93, 106, 1)", + "strokeWidth": 1 + }, + "target": "CodeExec:LightSheepTrade", + "targetHandle": "end", + "type": "buttonEdge", + "zIndex": 1001 + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:SharpSlothsSlidestart-Message:OliveLawsArgueend", + "markerEnd": "logo", + "source": "Agent:SharpSlothsSlide", + "sourceHandle": "start", + "style": { + "stroke": "rgba(151, 154, 171, 1)", + "strokeWidth": 1 + }, + "target": "Message:OliveLawsArgue", + "targetHandle": "end", + "type": "buttonEdge", + "zIndex": 1001 + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__beginstart-Agent:ManyToesBrushend", + "markerEnd": "logo", + "source": "begin", + "sourceHandle": "start", + "style": { + "stroke": "rgba(151, 154, 171, 1)", + "strokeWidth": 1 + }, + "target": "Agent:ManyToesBrush", + "targetHandle": "end", + "type": "buttonEdge", + "zIndex": 1001 + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:ManyToesBrushstart-Switch:FluffyCoinsSellend", + "source": "Agent:ManyToesBrush", + "sourceHandle": "start", + "target": "Switch:FluffyCoinsSell", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Switch:FluffyCoinsSellCase 1-YahooFinance:QuickAdsDigend", + "markerEnd": "logo", + "source": "Switch:FluffyCoinsSell", + "sourceHandle": "Case 1", + "style": { + "stroke": "rgba(151, 154, 171, 1)", + "strokeWidth": 1 + }, + "target": "YahooFinance:QuickAdsDig", + "targetHandle": "end", + "type": "buttonEdge", + "zIndex": 1001 + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Switch:FluffyCoinsSellCase 1-Agent:SadDodosRescueend", + "markerEnd": "logo", + "source": "Switch:FluffyCoinsSell", + "sourceHandle": "Case 1", + "style": { + "stroke": "rgba(151, 154, 171, 1)", + "strokeWidth": 1 + }, + "target": "Agent:SadDodosRescue", + "targetHandle": "end", + "type": "buttonEdge", + "zIndex": 1001 + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Switch:FluffyCoinsSellend_cpn_ids-Message:TwentyBanksLeaveend", + "markerEnd": "logo", + "source": "Switch:FluffyCoinsSell", + "sourceHandle": "end_cpn_ids", + "style": { + "stroke": "rgba(151, 154, 171, 1)", + "strokeWidth": 1 + }, + "target": "Message:TwentyBanksLeave", + "targetHandle": "end", + "type": "buttonEdge", + "zIndex": 1001 + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__CodeExec:LightSheepTradestart-Message:OliveLawsArgueend", + "markerEnd": "logo", + "source": "CodeExec:LightSheepTrade", + "sourceHandle": "start", + "style": { + "stroke": "rgba(91, 93, 106, 1)", + "strokeWidth": 1 + }, + "target": "Message:OliveLawsArgue", + "targetHandle": "end", + "type": "buttonEdge", + "zIndex": 1001 + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:SadDodosRescuetool-Tool:ClearKiwisRollend", + "source": "Agent:SadDodosRescue", + "sourceHandle": "tool", + "target": "Tool:ClearKiwisRoll", + "targetHandle": "end" + } + ], + "nodes": [ + { + "data": { + "form": { + "enablePrologue": true, + "inputs": {}, + "mode": "conversational", + "prologue": "Hi! I'm your assistant. What can I do for you?" + }, + "label": "Begin", + "name": "begin" + }, + "dragging": false, + "id": "begin", + "measured": { + "height": 48, + "width": 200 + }, + "position": { + "x": -250.58492312820874, + "y": 304.13718826989873 + }, + "selected": false, + "sourcePosition": "left", + "targetPosition": "right", + "type": "beginNode" + }, + { + "data": { + "form": { "cite": true, "delay_after_error": 1, "description": "", @@ -49,7 +646,7 @@ "role": "user" } ], - "sys_prompt": " \n\nYour responsibility is to identify and extract the stock name or abbreviation from the user's natural language query and return the corresponding unique stock code.\n\n \n\n\n\n \n\n1. Only one result is allowed: - If a stock is identified \u2192 only return the corresponding stock code; - If no stock is identified \u2192 only return \u201cNot Found\u201d. 2. **Do not** output any additional text, punctuation, explanation, prefixes, or line breaks. 3. The output must strictly adhere to the . \n\n\n\n\n\nOnly output the stock code (e.g., AAPL or 600519)\nOr only output \u201cNot Found\u201d\n\n\n\n\nUser input: \u201cHelp me check the research report of Apple\u201d \u2192 Output: AAPL\nUser input: \u201cHow is Maotai\u2019s financial performance\u201d \u2192 Output: 600519\nUser input: \u201cHow is the Shanghai Composite Index doing today\u201d \u2192 Output: Not Found\n\n\n\n - Tavily Search: Use this tool when you are unsure of the stock code. - If you are confident, you do not need to use the tool. \n\n\n\n\n\nOnly output the result, no explanations, hints, or notes allowed.\nThe output can only be the stock code or \u201cNot Found\u201d, otherwise, it is considered an incorrect answer.\n", + "sys_prompt": " \n\nYour responsibility is to identify and extract the stock name or abbreviation from the user's natural language query and return the corresponding unique stock code.\n\n \n\n\n\n \n\n1. Only one result is allowed: - If a stock is identified → only return the corresponding stock code; - If no stock is identified → only return “Not Found”. 2. **Do not** output any additional text, punctuation, explanation, prefixes, or line breaks. 3. The output must strictly adhere to the . \n\n\n\n\n\nOnly output the stock code (e.g., AAPL or 600519)\nOr only output “Not Found”\n\n\n\n\nUser input: “Help me check the research report of Apple” → Output: AAPL\nUser input: “How is Maotai’s financial performance” → Output: 600519\nUser input: “How is the Shanghai Composite Index doing today” → Output: Not Found\n\n\n\n - Tavily Search: Use this tool when you are unsure of the stock code. - If you are confident, you do not need to use the tool. \n\n\n\n\n\nOnly output the result, no explanations, hints, or notes allowed.\nThe output can only be the stock code or “Not Found”, otherwise, it is considered an incorrect answer.\n", "temperature": 0.1, "temperatureEnabled": false, "tools": [ @@ -79,26 +676,120 @@ "query": "sys.query", "search_depth": "basic", "topic": "general" - } + }, + "id": "TavilySearch:TinyRiceTell" } ], "topPEnabled": false, "top_p": 0.3, "user_prompt": "", "visual_files_var": "" - } + }, + "label": "Agent", + "name": "Extract Stock Code Agent" }, - "upstream": [ - "begin" - ] + "dragging": false, + "id": "Agent:ManyToesBrush", + "measured": { + "height": 76, + "width": 200 + }, + "position": { + "x": 1.784314979916303, + "y": 285.7261182739586 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" }, - "Agent:SadDodosRescue": { - "downstream": [ - "Agent:SharpSlothsSlide" - ], - "obj": { - "component_name": "Agent", - "params": { + { + "data": { + "form": { + "description": "This is an agent for a specific task.", + "user_prompt": "This is the order you need to send to the agent." + }, + "label": "Tool", + "name": "flow.tool_0" + }, + "dragging": false, + "id": "Tool:AngryRabbitsPlay", + "measured": { + "height": 48, + "width": 200 + }, + "position": { + "x": -1.1174997064789522, + "y": 392.2709327777357 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "toolNode" + }, + { + "data": { + "form": { + "content": [ + "Your query is not supported." + ] + }, + "label": "Message", + "name": "Reply to irrelevant message node" + }, + "dragging": false, + "id": "Message:TwentyBanksLeave", + "measured": { + "height": 48, + "width": 200 + }, + "position": { + "x": 1274.991898394738, + "y": 540.2215056031129 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "messageNode" + }, + { + "data": { + "form": { + "balance_sheet": true, + "cash_flow_statement": false, + "financials": false, + "history": false, + "info": false, + "news": false, + "outputs": { + "report": { + "type": "string", + "value": "" + } + }, + "stock_code": "sys.query" + }, + "label": "YahooFinance", + "name": "YahooFinance" + }, + "dragging": false, + "id": "YahooFinance:QuickAdsDig", + "measured": { + "height": 48, + "width": 200 + }, + "position": { + "x": 676.5378050046916, + "y": 74.09222900489664 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "ragNode" + }, + { + "data": { + "form": { "cite": true, "delay_after_error": 1, "description": "", @@ -133,98 +824,69 @@ "role": "user" } ], - "sys_prompt": " \n\nYou are the information extraction agent. You understand the user\u2019s query and delegate tasks to investoday and the internal research report retrieval agent. \n\n \n\n\n\n 1. Based on the stock code output by the \"Extract Stock Code\" agent, call investoday's list_news to retrieve the latest authoritative research reports and views, and save all publicly available key information. \n\n2. Call the \"Internal Research Report Retrieval Agent\" and save the full text of the research report output. \n\n3. Output the content retrieved from investoday and the Internal Research Report Retrieval Agent in full. \n\n\n\n\n\nThe output must be divided into two sections:\n#1. Title: \u201cinvestoday\u201d\nDirectly output the content collected from investoday without any additional processing.\n#2. Title: \"Internal Research Report Retrieval Agent\"\nDirectly output the content provided by the Internal Research Report Retrieval Agent.\n", + "sys_prompt": " \n\nYou are the information extraction agent. You understand the user’s query and delegate tasks to investoday and the internal research report retrieval agent. \n\n \n\n\n\n 1. Based on the stock code output by the \"Extract Stock Code\" agent, call investoday's list_news to retrieve the latest authoritative research reports and views, and save all publicly available key information. \n\n2. Call the \"Internal Research Report Retrieval Agent\" and save the full text of the research report output. \n\n3. Output the content retrieved from investoday and the Internal Research Report Retrieval Agent in full. \n\n\n\n\n\nThe output must be divided into two sections:\n#1. Title: “investoday”\nDirectly output the content collected from investoday without any additional processing.\n#2. Title: \"Internal Research Report Retrieval Agent\"\nDirectly output the content provided by the Internal Research Report Retrieval Agent.\n", "temperature": 0.1, "temperatureEnabled": false, - "tools": [ - { - "component_name": "Agent", - "id": "Agent:MightyIdeasGlow", - "name": "Internal Research Report Retrieval Agent", - "params": { - "cite": true, - "delay_after_error": 1, - "description": "You are a senior financial content analyst who can accurately identify the companies, stock codes, industries or topics mentioned in user questions, and completely extract relevant research content from the knowledge base to ensure that data, opinions and conclusions are not lost.", - "exception_default_value": "", - "exception_goto": [], - "exception_method": "", - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "kimi-k2-turbo-preview@Moonshot", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 1, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "{sys.query}", - "role": "user" - } - ], - "sys_prompt": " \n\nRead user input \u2192 Identify the involved company/stock (supports abbreviations, full names, codes, and aliases) \u2192 Retrieve the most relevant research reports from the knowledge base \u2192 Output the full text of the research report, retaining the original format, data, chart descriptions, and risk warnings. \n\n\n\n\n\n \n\n1. Exact Match: Prioritize exact matches of company full names and stock codes. \n\n2. Content Fidelity: Fully retain the research report text stored in the knowledge base without deletion, modification, or omission of paragraphs. \n\n3. Original Data: Retain table data, dates, units, etc., in their original form. \n\n4. Complete Viewpoints: Include investment logic, financial analysis, industry comparisons, earnings forecasts, valuation methods, risk warnings, etc. \n\n5. Merging Multiple Reports: If there are multiple relevant research reports, output them in reverse chronological order. \n\n\n\n6. No Results Feedback: If no matching reports are found, output \u201cNo related research reports available in the knowledge base.\u201d\n\n\n\n ", - "temperature": 0.1, - "temperatureEnabled": false, - "tools": [ - { - "component_name": "Retrieval", - "name": "Retrieval", - "params": { - "cross_languages": [], - "description": "A knowledge base of research reports on stock analysis by senior experts", - "empty_response": "", - "kb_ids": [ - "60c53ed89acc11f0bc1e7a2a6d0b2755" - ], - "retrieval_from": "dataset", - "keywords_similarity_weight": 0.7, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" - } - }, - "rerank_id": "", - "similarity_threshold": 0.2, - "top_k": 1024, - "top_n": 8, - "use_kg": false - } - } - ], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "This is the order you need to send to the agent.", - "visual_files_var": "" - } - } - ], + "tools": [], "topPEnabled": false, "top_p": 0.3, "user_prompt": "", "visual_files_var": "" - } + }, + "label": "Agent", + "name": "Information Extraction Agent" }, - "upstream": [ - "Switch:FluffyCoinsSell" - ] + "dragging": false, + "id": "Agent:SadDodosRescue", + "measured": { + "height": 76, + "width": 200 + }, + "position": { + "x": 674.0210917308762, + "y": 154.63747017677127 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" }, - "Agent:SharpSlothsSlide": { - "downstream": [ - "Message:OliveLawsArgue" - ], - "obj": { - "component_name": "Agent", - "params": { + { + "data": { + "form": { + "arguments": { + "input_text": "YahooFinance:QuickAdsDig@report" + }, + "lang": "python", + "outputs": { + "md_table": { + "type": "String", + "value": "" + } + }, + "script": "import re\n\ndef format_number(value: str) -> str:\n \"\"\"Convert scientific notation or floating-point numbers to comma-separated numbers\"\"\"\n try:\n num = float(value)\n if num.is_integer():\n return f\"{int(num):,}\" # If it's an integer, format without decimal places\n else:\n return f\"{num:,.2f}\" # Otherwise, keep two decimal places and add commas\n except:\n return value # Return the original value if it's not a number (e.g., — or empty)\n\ndef extract_md_table_single_column(input_text: str) -> str:\n # Use English indicators directly\n indicators = [\n \"Total Assets\", \"Total Equity\", \"Tangible Book Value\", \"Total Debt\", \n \"Net Debt\", \"Cash And Cash Equivalents\", \"Working Capital\", \n \"Long Term Debt\", \"Common Stock Equity\", \"Ordinary Shares Number\"\n ]\n \n # Core indicators and their corresponding units\n unit_map = {\n \"Total Assets\": \"USD\",\n \"Total Equity\": \"USD\",\n \"Tangible Book Value\": \"USD\",\n \"Total Debt\": \"USD\",\n \"Net Debt\": \"USD\",\n \"Cash And Cash Equivalents\": \"USD\",\n \"Working Capital\": \"USD\",\n \"Long Term Debt\": \"USD\",\n \"Common Stock Equity\": \"USD\",\n \"Ordinary Shares Number\": \"Shares\"\n }\n\n lines = input_text.splitlines()\n\n # Automatically detect the date column, keeping only the first one\n date_pattern = r\"\\d{4}-\\d{2}-\\d{2}\"\n header_line = \"\"\n for line in lines:\n if re.search(date_pattern, line):\n header_line = line\n break\n\n if not header_line:\n raise ValueError(\"Date column header row not found\")\n\n dates = re.findall(date_pattern, header_line)\n first_date = dates[0] # Keep only the first date\n header = f\"| Indicator | {first_date} |\"\n divider = \"|------------------------|------------|\"\n\n rows = []\n for ind in indicators:\n unit = unit_map.get(ind, \"\")\n display_ind = f\"{ind} ({unit})\" if unit else ind\n\n found = False\n for line in lines:\n if ind in line:\n # Match numbers and possible units\n pattern = r\"(nan|[0-9\\.]+(?:[eE][+-]?\\d+)?)\"\n values = re.findall(pattern, line)\n # Replace 'nan' with '—' and format the number\n first_value = values[0].strip() if values and values[0].strip().lower() != \"nan\" else \"—\"\n first_value = format_number(first_value) if first_value != \"—\" else \"—\"\n rows.append(f\"| {display_ind} | {first_value} |\")\n found = True\n break\n if not found:\n rows.append(f\"| {display_ind} | — |\")\n\n md_table = \"\\n\".join([header, divider] + rows)\n return md_table\n\ndef main(input_text: str):\n return extract_md_table_single_column(input_text)\n" + }, + "label": "CodeExec", + "name": "Code-generated balance sheet" + }, + "dragging": false, + "id": "CodeExec:LightSheepTrade", + "measured": { + "height": 48, + "width": 200 + }, + "position": { + "x": 970.444642975358, + "y": 74.04386270784316 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "ragNode" + }, + { + "data": { + "form": { "cite": true, "delay_after_error": 1, "description": "", @@ -254,7 +916,7 @@ "role": "user" } ], - "sys_prompt": " \n\nYou are a senior investment banking (IB) analyst with years of experience in capital market research. You excel at writing investment research reports covering publicly listed companies, industries, and macroeconomics. You possess strong financial analysis skills and industry insights, combining quantitative and qualitative analysis to provide high-value references for investment decisions. \n\n**You are able to retain and present differentiated viewpoints from various reports and sources in your research, and when discrepancies arise, you do not merge them into a single conclusion. Instead, you compare and analyze the differences.** \n\n\n \n\n\n\n\n \n\nYou will receive financial information extracted by the information extraction agent.\n\n \n\n\n\nBased on the content returned by the information extraction agent (no fabrication of data), write a professional, complete, and structured investment research report. The report must be logically rigorous, clearly organized, and use professional language, suitable for reference by fund managers, institutional investors, and other professional readers.\nWhen there are differences in analysis or forecasts between different reports or institutions, you must list and identify the sources in the report. You should not select only one viewpoint. You need to point out the differences, their possible causes, and their impact on investment judgments.\n\n\n\n\n##1. Summary\nProvide a concise overview of the company\u2019s core business, recent performance, industry positioning, and major investment highlights.\nSummarize key conclusions in 3-5 sentences.\nHighlight any discrepancies in core conclusions and briefly describe the differing viewpoints and areas of disagreement.\n##2. Company Overview\nDescribe the company's main business, core products/services, market share, competitive advantages, and business model.\nHighlight any differences in the description of the company\u2019s market position or competitive advantages from different sources. Present and compare these differences.\n##3. Recent Financial Performance\nSummarize key metrics from the latest financial report (e.g., revenue, net profit, gross margin, EPS).\nHighlight the drivers behind the trends and compare the differential analyses from different reports. Present this comparison in a table.\n##4. Industry Trends & Opportunities\nOverview of industry development trends, market size, and major drivers.\nIf different sources provide differing forecasts for industry growth rates, technological trends, or competitive landscape, list these and provide background information. Present this comparison in a table.\n##5. Investment Recommendation\nProvide a clear investment recommendation based on the analysis above (e.g., \"Buy/Hold/Neutral/Sell\"), presented in a table.\nInclude investment ratings or recommendations from all sources, with the source and date clearly noted.\nIf you provide a combined recommendation based on different viewpoints, clearly explain the reasoning behind this integration.\n##6. Appendix & References\nList the data sources, analysis methods, important formulas, or chart descriptions used.\nAll references must come from the information extraction agent and the company financial data table provided, or publicly noted sources.\nFor differentiated viewpoints, provide full citation information (author, institution, date) and present this in a table.\n\n\n\n\nLanguage Style: Financial, professional, precise, and analytical.\nViewpoint Retention: When there are multiple viewpoints and conclusions, all must be retained and compared. You cannot choose only one.\nCitations: When specific data or viewpoints are referenced, include the source in parentheses (e.g., Source: Morgan Stanley Research, 2024-05-07).\nFacts: All data and conclusions must come from the information extraction agent or their noted legitimate sources. No fabrication is allowed.\nReadability: Use short paragraphs and bullet points to make it easy for professional readers to grasp key information and see the differences in viewpoints.\n\n\n\n\nGenerate a complete investment research report that meets investment banking industry standards, which can be directly used for institutional investment internal reference, while faithfully retaining differentiated viewpoints from various reports and providing the corresponding analysis.\n", + "sys_prompt": " \n\nYou are a senior investment banking (IB) analyst with years of experience in capital market research. You excel at writing investment research reports covering publicly listed companies, industries, and macroeconomics. You possess strong financial analysis skills and industry insights, combining quantitative and qualitative analysis to provide high-value references for investment decisions. \n\n**You are able to retain and present differentiated viewpoints from various reports and sources in your research, and when discrepancies arise, you do not merge them into a single conclusion. Instead, you compare and analyze the differences.** \n\n\n \n\n\n\n\n \n\nYou will receive financial information extracted by the information extraction agent.\n\n \n\n\n\nBased on the content returned by the information extraction agent (no fabrication of data), write a professional, complete, and structured investment research report. The report must be logically rigorous, clearly organized, and use professional language, suitable for reference by fund managers, institutional investors, and other professional readers.\nWhen there are differences in analysis or forecasts between different reports or institutions, you must list and identify the sources in the report. You should not select only one viewpoint. You need to point out the differences, their possible causes, and their impact on investment judgments.\n\n\n\n\n##1. Summary\nProvide a concise overview of the company’s core business, recent performance, industry positioning, and major investment highlights.\nSummarize key conclusions in 3-5 sentences.\nHighlight any discrepancies in core conclusions and briefly describe the differing viewpoints and areas of disagreement.\n##2. Company Overview\nDescribe the company's main business, core products/services, market share, competitive advantages, and business model.\nHighlight any differences in the description of the company’s market position or competitive advantages from different sources. Present and compare these differences.\n##3. Recent Financial Performance\nSummarize key metrics from the latest financial report (e.g., revenue, net profit, gross margin, EPS).\nHighlight the drivers behind the trends and compare the differential analyses from different reports. Present this comparison in a table.\n##4. Industry Trends & Opportunities\nOverview of industry development trends, market size, and major drivers.\nIf different sources provide differing forecasts for industry growth rates, technological trends, or competitive landscape, list these and provide background information. Present this comparison in a table.\n##5. Investment Recommendation\nProvide a clear investment recommendation based on the analysis above (e.g., \"Buy/Hold/Neutral/Sell\"), presented in a table.\nInclude investment ratings or recommendations from all sources, with the source and date clearly noted.\nIf you provide a combined recommendation based on different viewpoints, clearly explain the reasoning behind this integration.\n##6. Appendix & References\nList the data sources, analysis methods, important formulas, or chart descriptions used.\nAll references must come from the information extraction agent and the company financial data table provided, or publicly noted sources.\nFor differentiated viewpoints, provide full citation information (author, institution, date) and present this in a table.\n\n\n\n\nLanguage Style: Financial, professional, precise, and analytical.\nViewpoint Retention: When there are multiple viewpoints and conclusions, all must be retained and compared. You cannot choose only one.\nCitations: When specific data or viewpoints are referenced, include the source in parentheses (e.g., Source: Morgan Stanley Research, 2024-05-07).\nFacts: All data and conclusions must come from the information extraction agent or their noted legitimate sources. No fabrication is allowed.\nReadability: Use short paragraphs and bullet points to make it easy for professional readers to grasp key information and see the differences in viewpoints.\n\n\n\n\nGenerate a complete investment research report that meets investment banking industry standards, which can be directly used for institutional investment internal reference, while faithfully retaining differentiated viewpoints from various reports and providing the corresponding analysis.\n", "temperature": 0.1, "temperatureEnabled": false, "tools": [], @@ -262,74 +924,162 @@ "top_p": 0.3, "user_prompt": "", "visual_files_var": "" - } + }, + "label": "Agent", + "name": "Research report generation agent" }, - "upstream": [ - "Agent:SadDodosRescue" - ] - }, - "CodeExec:LightSheepTrade": { - "downstream": [ - "Message:OliveLawsArgue" - ], - "obj": { - "component_name": "CodeExec", - "params": { - "arguments": { - "input_text": "YahooFinance:QuickAdsDig@report" - }, - "lang": "python", - "outputs": { - "md_table": { - "type": "String", - "value": "" - } - }, - "script": "import re\n\ndef format_number(value: str) -> str:\n \"\"\"Convert scientific notation or floating-point numbers to comma-separated numbers\"\"\"\n try:\n num = float(value)\n if num.is_integer():\n return f\"{int(num):,}\" # If it's an integer, format without decimal places\n else:\n return f\"{num:,.2f}\" # Otherwise, keep two decimal places and add commas\n except:\n return value # Return the original value if it's not a number (e.g., \u2014 or empty)\n\ndef extract_md_table_single_column(input_text: str) -> str:\n # Use English indicators directly\n indicators = [\n \"Total Assets\", \"Total Equity\", \"Tangible Book Value\", \"Total Debt\", \n \"Net Debt\", \"Cash And Cash Equivalents\", \"Working Capital\", \n \"Long Term Debt\", \"Common Stock Equity\", \"Ordinary Shares Number\"\n ]\n \n # Core indicators and their corresponding units\n unit_map = {\n \"Total Assets\": \"USD\",\n \"Total Equity\": \"USD\",\n \"Tangible Book Value\": \"USD\",\n \"Total Debt\": \"USD\",\n \"Net Debt\": \"USD\",\n \"Cash And Cash Equivalents\": \"USD\",\n \"Working Capital\": \"USD\",\n \"Long Term Debt\": \"USD\",\n \"Common Stock Equity\": \"USD\",\n \"Ordinary Shares Number\": \"Shares\"\n }\n\n lines = input_text.splitlines()\n\n # Automatically detect the date column, keeping only the first one\n date_pattern = r\"\\d{4}-\\d{2}-\\d{2}\"\n header_line = \"\"\n for line in lines:\n if re.search(date_pattern, line):\n header_line = line\n break\n\n if not header_line:\n raise ValueError(\"Date column header row not found\")\n\n dates = re.findall(date_pattern, header_line)\n first_date = dates[0] # Keep only the first date\n header = f\"| Indicator | {first_date} |\"\n divider = \"|------------------------|------------|\"\n\n rows = []\n for ind in indicators:\n unit = unit_map.get(ind, \"\")\n display_ind = f\"{ind} ({unit})\" if unit else ind\n\n found = False\n for line in lines:\n if ind in line:\n # Match numbers and possible units\n pattern = r\"(nan|[0-9\\.]+(?:[eE][+-]?\\d+)?)\"\n values = re.findall(pattern, line)\n # Replace 'nan' with '\u2014' and format the number\n first_value = values[0].strip() if values and values[0].strip().lower() != \"nan\" else \"\u2014\"\n first_value = format_number(first_value) if first_value != \"\u2014\" else \"\u2014\"\n rows.append(f\"| {display_ind} | {first_value} |\")\n found = True\n break\n if not found:\n rows.append(f\"| {display_ind} | \u2014 |\")\n\n md_table = \"\\n\".join([header, divider] + rows)\n return md_table\n\ndef main(input_text: str):\n return extract_md_table_single_column(input_text)\n" - } + "id": "Agent:SharpSlothsSlide", + "measured": { + "height": 76, + "width": 200 }, - "upstream": [ - "YahooFinance:QuickAdsDig" - ] + "position": { + "x": 974.0210917308762, + "y": 154.63747017677127 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" }, - "Message:OliveLawsArgue": { - "downstream": [], - "obj": { - "component_name": "Message", - "params": { + { + "data": { + "form": { "content": [ "Company financial statements:\n\n{CodeExec:LightSheepTrade@md_table}\n\n\n{Agent:SharpSlothsSlide@content}" ] - } + }, + "label": "Message", + "name": "Reply message node" }, - "upstream": [ - "Agent:SharpSlothsSlide", - "CodeExec:LightSheepTrade" - ] - }, - "Message:TwentyBanksLeave": { - "downstream": [], - "obj": { - "component_name": "Message", - "params": { - "content": [ - "Your query is not supported." - ] - } + "dragging": false, + "id": "Message:OliveLawsArgue", + "measured": { + "height": 48, + "width": 200 }, - "upstream": [ - "Switch:FluffyCoinsSell" - ] + "position": { + "x": 1279.3354680249918, + "y": 83.53099404318621 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "messageNode" }, - "Switch:FluffyCoinsSell": { - "downstream": [ - "YahooFinance:QuickAdsDig", - "Agent:SadDodosRescue", - "Message:TwentyBanksLeave" - ], - "obj": { - "component_name": "Switch", - "params": { + { + "data": { + "form": { + "cite": true, + "delay_after_error": 1, + "description": "You are a senior financial content analyst who can accurately identify the companies, stock codes, industries or topics mentioned in user questions, and completely extract relevant research content from the knowledge base to ensure that data, opinions and conclusions are not lost.", + "exception_default_value": "", + "exception_goto": [], + "exception_method": "", + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "kimi-k2-turbo-preview@Moonshot", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 1, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "{sys.query}", + "role": "user" + } + ], + "sys_prompt": " \n\nRead user input → Identify the involved company/stock (supports abbreviations, full names, codes, and aliases) → Retrieve the most relevant research reports from the knowledge base → Output the full text of the research report, retaining the original format, data, chart descriptions, and risk warnings. \n\n\n\n\n\n \n\n1. Exact Match: Prioritize exact matches of company full names and stock codes. \n\n2. Content Fidelity: Fully retain the research report text stored in the knowledge base without deletion, modification, or omission of paragraphs. \n\n3. Original Data: Retain table data, dates, units, etc., in their original form. \n\n4. Complete Viewpoints: Include investment logic, financial analysis, industry comparisons, earnings forecasts, valuation methods, risk warnings, etc. \n\n5. Merging Multiple Reports: If there are multiple relevant research reports, output them in reverse chronological order. \n\n\n\n6. No Results Feedback: If no matching reports are found, output “No related research reports available in the knowledge base.”\n\n\n\n ", + "temperature": 0.1, + "temperatureEnabled": false, + "tools": [ + { + "component_name": "Retrieval", + "name": "Retrieval", + "params": { + "cross_languages": [], + "description": "A knowledge base of research reports on stock analysis by senior experts", + "empty_response": "", + "kb_ids": [ + "60c53ed89acc11f0bc1e7a2a6d0b2755" + ], + "retrieval_from": "dataset", + "keywords_similarity_weight": 0.7, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" + } + }, + "rerank_id": "", + "similarity_threshold": 0.2, + "top_k": 1024, + "top_n": 8, + "use_kg": false + }, + "id": "Retrieval:BrightHoursRise" + } + ], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "This is the order you need to send to the agent.", + "visual_files_var": "" + }, + "label": "Agent", + "name": "Internal Research Report Retrieval Agent" + }, + "dragging": false, + "id": "Agent:MightyIdeasGlow", + "measured": { + "height": 76, + "width": 200 + }, + "position": { + "x": 787.966928431608, + "y": 270.12089782504677 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" + }, + { + "data": { + "form": { + "description": "This is an agent for a specific task.", + "user_prompt": "This is the order you need to send to the agent." + }, + "label": "Tool", + "name": "flow.tool_1" + }, + "dragging": false, + "id": "Tool:FullIconsStop", + "measured": { + "height": 48, + "width": 200 + }, + "position": { + "x": 786.0879409003913, + "y": 373.7912225392144 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "toolNode" + }, + { + "data": { + "form": { "conditions": [ { "items": [ @@ -349,827 +1099,80 @@ "end_cpn_ids": [ "Message:TwentyBanksLeave" ] - } + }, + "label": "Switch", + "name": "Switch" }, - "upstream": [ - "Agent:ManyToesBrush" - ] + "dragging": false, + "id": "Switch:FluffyCoinsSell", + "measured": { + "height": 146, + "width": 200 + }, + "position": { + "x": 244.5649388872756, + "y": 249.25263304293162 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "switchNode" }, - "YahooFinance:QuickAdsDig": { - "downstream": [ - "CodeExec:LightSheepTrade" - ], - "obj": { - "component_name": "YahooFinance", - "params": { - "balance_sheet": true, - "cash_flow_statement": false, - "financials": false, - "history": false, - "info": false, - "news": false, - "outputs": { - "report": { - "type": "string", - "value": "" - } - }, - "stock_code": "sys.query" - } + { + "data": { + "form": { + "description": "This is an agent for a specific task.", + "user_prompt": "This is the order you need to send to the agent." + }, + "label": "Tool", + "name": "flow.tool_2" }, - "upstream": [ - "Switch:FluffyCoinsSell" - ] + "id": "Tool:ClearKiwisRoll", + "measured": { + "height": 44, + "width": 200 + }, + "position": { + "x": 592.0210917308762, + "y": 294.6374701767713 + }, + "sourcePosition": "right", + "targetPosition": "left", + "type": "toolNode" }, - "begin": { - "downstream": [ - "Agent:ManyToesBrush" - ], - "obj": { - "component_name": "Begin", - "params": { - "enablePrologue": true, - "inputs": {}, - "mode": "conversational", - "prologue": "Hi! I'm your assistant. What can I do for you?" - } + { + "data": { + "form": { + "text": "Regarding the MCP message for the Information Extraction Agent: You must manually add an MCP in MCP Servers before you can use it!" + }, + "label": "Note", + "name": "MCP Note" }, - "upstream": [] - } - }, - "globals": { - "sys.conversation_turns": 0, - "sys.files": [], - "sys.query": "", - "sys.user_id": "" - }, - "graph": { - "edges": [ - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:ManyToesBrushtool-Tool:AngryRabbitsPlayend", - "source": "Agent:ManyToesBrush", - "sourceHandle": "tool", - "target": "Tool:AngryRabbitsPlay", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:SadDodosRescuestart-Agent:SharpSlothsSlideend", - "source": "Agent:SadDodosRescue", - "sourceHandle": "start", - "target": "Agent:SharpSlothsSlide", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:SadDodosRescueagentBottom-Agent:MightyIdeasGlowagentTop", - "source": "Agent:SadDodosRescue", - "sourceHandle": "agentBottom", - "target": "Agent:MightyIdeasGlow", - "targetHandle": "agentTop" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:MightyIdeasGlowtool-Tool:FullIconsStopend", - "source": "Agent:MightyIdeasGlow", - "sourceHandle": "tool", - "target": "Tool:FullIconsStop", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__YahooFinance:QuickAdsDigstart-CodeExec:LightSheepTradeend", - "markerEnd": "logo", - "source": "YahooFinance:QuickAdsDig", - "sourceHandle": "start", - "style": { - "stroke": "rgba(91, 93, 106, 1)", - "strokeWidth": 1 - }, - "target": "CodeExec:LightSheepTrade", - "targetHandle": "end", - "type": "buttonEdge", - "zIndex": 1001 - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:SharpSlothsSlidestart-Message:OliveLawsArgueend", - "markerEnd": "logo", - "source": "Agent:SharpSlothsSlide", - "sourceHandle": "start", - "style": { - "stroke": "rgba(151, 154, 171, 1)", - "strokeWidth": 1 - }, - "target": "Message:OliveLawsArgue", - "targetHandle": "end", - "type": "buttonEdge", - "zIndex": 1001 - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__beginstart-Agent:ManyToesBrushend", - "markerEnd": "logo", - "source": "begin", - "sourceHandle": "start", - "style": { - "stroke": "rgba(151, 154, 171, 1)", - "strokeWidth": 1 - }, - "target": "Agent:ManyToesBrush", - "targetHandle": "end", - "type": "buttonEdge", - "zIndex": 1001 - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:ManyToesBrushstart-Switch:FluffyCoinsSellend", - "source": "Agent:ManyToesBrush", - "sourceHandle": "start", - "target": "Switch:FluffyCoinsSell", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Switch:FluffyCoinsSellCase 1-YahooFinance:QuickAdsDigend", - "markerEnd": "logo", - "source": "Switch:FluffyCoinsSell", - "sourceHandle": "Case 1", - "style": { - "stroke": "rgba(151, 154, 171, 1)", - "strokeWidth": 1 - }, - "target": "YahooFinance:QuickAdsDig", - "targetHandle": "end", - "type": "buttonEdge", - "zIndex": 1001 - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Switch:FluffyCoinsSellCase 1-Agent:SadDodosRescueend", - "markerEnd": "logo", - "source": "Switch:FluffyCoinsSell", - "sourceHandle": "Case 1", - "style": { - "stroke": "rgba(151, 154, 171, 1)", - "strokeWidth": 1 - }, - "target": "Agent:SadDodosRescue", - "targetHandle": "end", - "type": "buttonEdge", - "zIndex": 1001 - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Switch:FluffyCoinsSellend_cpn_ids-Message:TwentyBanksLeaveend", - "markerEnd": "logo", - "source": "Switch:FluffyCoinsSell", - "sourceHandle": "end_cpn_ids", - "style": { - "stroke": "rgba(151, 154, 171, 1)", - "strokeWidth": 1 - }, - "target": "Message:TwentyBanksLeave", - "targetHandle": "end", - "type": "buttonEdge", - "zIndex": 1001 - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__CodeExec:LightSheepTradestart-Message:OliveLawsArgueend", - "markerEnd": "logo", - "source": "CodeExec:LightSheepTrade", - "sourceHandle": "start", - "style": { - "stroke": "rgba(91, 93, 106, 1)", - "strokeWidth": 1 - }, - "target": "Message:OliveLawsArgue", - "targetHandle": "end", - "type": "buttonEdge", - "zIndex": 1001 - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:SadDodosRescuetool-Tool:ClearKiwisRollend", - "source": "Agent:SadDodosRescue", - "sourceHandle": "tool", - "target": "Tool:ClearKiwisRoll", - "targetHandle": "end" - } - ], - "nodes": [ - { - "data": { - "form": { - "enablePrologue": true, - "inputs": {}, - "mode": "conversational", - "prologue": "Hi! I'm your assistant. What can I do for you?" - }, - "label": "Begin", - "name": "begin" - }, - "dragging": false, - "id": "begin", - "measured": { - "height": 48, - "width": 200 - }, - "position": { - "x": -250.58492312820874, - "y": 304.13718826989873 - }, - "selected": false, - "sourcePosition": "left", - "targetPosition": "right", - "type": "beginNode" - }, - { - "data": { - "form": { - "cite": true, - "delay_after_error": 1, - "description": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": "", - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 1, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "{sys.query}", - "role": "user" - } - ], - "sys_prompt": " \n\nYour responsibility is to identify and extract the stock name or abbreviation from the user's natural language query and return the corresponding unique stock code.\n\n \n\n\n\n \n\n1. Only one result is allowed: - If a stock is identified \u2192 only return the corresponding stock code; - If no stock is identified \u2192 only return \u201cNot Found\u201d. 2. **Do not** output any additional text, punctuation, explanation, prefixes, or line breaks. 3. The output must strictly adhere to the . \n\n\n\n\n\nOnly output the stock code (e.g., AAPL or 600519)\nOr only output \u201cNot Found\u201d\n\n\n\n\nUser input: \u201cHelp me check the research report of Apple\u201d \u2192 Output: AAPL\nUser input: \u201cHow is Maotai\u2019s financial performance\u201d \u2192 Output: 600519\nUser input: \u201cHow is the Shanghai Composite Index doing today\u201d \u2192 Output: Not Found\n\n\n\n - Tavily Search: Use this tool when you are unsure of the stock code. - If you are confident, you do not need to use the tool. \n\n\n\n\n\nOnly output the result, no explanations, hints, or notes allowed.\nThe output can only be the stock code or \u201cNot Found\u201d, otherwise, it is considered an incorrect answer.\n", - "temperature": 0.1, - "temperatureEnabled": false, - "tools": [ - { - "component_name": "TavilySearch", - "name": "TavilySearch", - "params": { - "api_key": "", - "days": 7, - "exclude_domains": [], - "include_answer": false, - "include_domains": [], - "include_image_descriptions": false, - "include_images": false, - "include_raw_content": true, - "max_results": 5, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" - }, - "json": { - "type": "Array", - "value": [] - } - }, - "query": "sys.query", - "search_depth": "basic", - "topic": "general" - } - } - ], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Extract Stock Code Agent" - }, - "dragging": false, - "id": "Agent:ManyToesBrush", - "measured": { - "height": 76, - "width": 200 - }, - "position": { - "x": 1.784314979916303, - "y": 285.7261182739586 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" - }, - { - "data": { - "form": { - "description": "This is an agent for a specific task.", - "user_prompt": "This is the order you need to send to the agent." - }, - "label": "Tool", - "name": "flow.tool_0" - }, - "dragging": false, - "id": "Tool:AngryRabbitsPlay", - "measured": { - "height": 48, - "width": 200 - }, - "position": { - "x": -1.1174997064789522, - "y": 392.2709327777357 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "toolNode" - }, - { - "data": { - "form": { - "content": [ - "Your query is not supported." - ] - }, - "label": "Message", - "name": "Reply to irrelevant message node" - }, - "dragging": false, - "id": "Message:TwentyBanksLeave", - "measured": { - "height": 48, - "width": 200 - }, - "position": { - "x": 1274.991898394738, - "y": 540.2215056031129 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "messageNode" - }, - { - "data": { - "form": { - "balance_sheet": true, - "cash_flow_statement": false, - "financials": false, - "history": false, - "info": false, - "news": false, - "outputs": { - "report": { - "type": "string", - "value": "" - } - }, - "stock_code": "sys.query" - }, - "label": "YahooFinance", - "name": "YahooFinance" - }, - "dragging": false, - "id": "YahooFinance:QuickAdsDig", - "measured": { - "height": 48, - "width": 200 - }, - "position": { - "x": 676.5378050046916, - "y": 74.09222900489664 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "ragNode" - }, - { - "data": { - "form": { - "cite": true, - "delay_after_error": 1, - "description": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": "", - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "kimi-k2-turbo-preview@Moonshot", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 1, - "max_tokens": 256, - "mcp": [ - { - "mcp_id": "30d6ef8ea8d511f0828382e3548809fa", - "tools": {} - } - ], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "user's query is {sys.query}\n\n\n{Agent:ManyToesBrush@content}\n", - "role": "user" - } - ], - "sys_prompt": " \n\nYou are the information extraction agent. You understand the user\u2019s query and delegate tasks to investoday and the internal research report retrieval agent. \n\n \n\n\n\n 1. Based on the stock code output by the \"Extract Stock Code\" agent, call investoday's list_news to retrieve the latest authoritative research reports and views, and save all publicly available key information. \n\n2. Call the \"Internal Research Report Retrieval Agent\" and save the full text of the research report output. \n\n3. Output the content retrieved from investoday and the Internal Research Report Retrieval Agent in full. \n\n\n\n\n\nThe output must be divided into two sections:\n#1. Title: \u201cinvestoday\u201d\nDirectly output the content collected from investoday without any additional processing.\n#2. Title: \"Internal Research Report Retrieval Agent\"\nDirectly output the content provided by the Internal Research Report Retrieval Agent.\n", - "temperature": 0.1, - "temperatureEnabled": false, - "tools": [], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Information Extraction Agent" - }, - "dragging": false, - "id": "Agent:SadDodosRescue", - "measured": { - "height": 76, - "width": 200 - }, - "position": { - "x": 674.0210917308762, - "y": 154.63747017677127 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" - }, - { - "data": { - "form": { - "arguments": { - "input_text": "YahooFinance:QuickAdsDig@report" - }, - "lang": "python", - "outputs": { - "md_table": { - "type": "String", - "value": "" - } - }, - "script": "import re\n\ndef format_number(value: str) -> str:\n \"\"\"Convert scientific notation or floating-point numbers to comma-separated numbers\"\"\"\n try:\n num = float(value)\n if num.is_integer():\n return f\"{int(num):,}\" # If it's an integer, format without decimal places\n else:\n return f\"{num:,.2f}\" # Otherwise, keep two decimal places and add commas\n except:\n return value # Return the original value if it's not a number (e.g., \u2014 or empty)\n\ndef extract_md_table_single_column(input_text: str) -> str:\n # Use English indicators directly\n indicators = [\n \"Total Assets\", \"Total Equity\", \"Tangible Book Value\", \"Total Debt\", \n \"Net Debt\", \"Cash And Cash Equivalents\", \"Working Capital\", \n \"Long Term Debt\", \"Common Stock Equity\", \"Ordinary Shares Number\"\n ]\n \n # Core indicators and their corresponding units\n unit_map = {\n \"Total Assets\": \"USD\",\n \"Total Equity\": \"USD\",\n \"Tangible Book Value\": \"USD\",\n \"Total Debt\": \"USD\",\n \"Net Debt\": \"USD\",\n \"Cash And Cash Equivalents\": \"USD\",\n \"Working Capital\": \"USD\",\n \"Long Term Debt\": \"USD\",\n \"Common Stock Equity\": \"USD\",\n \"Ordinary Shares Number\": \"Shares\"\n }\n\n lines = input_text.splitlines()\n\n # Automatically detect the date column, keeping only the first one\n date_pattern = r\"\\d{4}-\\d{2}-\\d{2}\"\n header_line = \"\"\n for line in lines:\n if re.search(date_pattern, line):\n header_line = line\n break\n\n if not header_line:\n raise ValueError(\"Date column header row not found\")\n\n dates = re.findall(date_pattern, header_line)\n first_date = dates[0] # Keep only the first date\n header = f\"| Indicator | {first_date} |\"\n divider = \"|------------------------|------------|\"\n\n rows = []\n for ind in indicators:\n unit = unit_map.get(ind, \"\")\n display_ind = f\"{ind} ({unit})\" if unit else ind\n\n found = False\n for line in lines:\n if ind in line:\n # Match numbers and possible units\n pattern = r\"(nan|[0-9\\.]+(?:[eE][+-]?\\d+)?)\"\n values = re.findall(pattern, line)\n # Replace 'nan' with '\u2014' and format the number\n first_value = values[0].strip() if values and values[0].strip().lower() != \"nan\" else \"\u2014\"\n first_value = format_number(first_value) if first_value != \"\u2014\" else \"\u2014\"\n rows.append(f\"| {display_ind} | {first_value} |\")\n found = True\n break\n if not found:\n rows.append(f\"| {display_ind} | \u2014 |\")\n\n md_table = \"\\n\".join([header, divider] + rows)\n return md_table\n\ndef main(input_text: str):\n return extract_md_table_single_column(input_text)\n" - }, - "label": "CodeExec", - "name": "Code-generated balance sheet" - }, - "dragging": false, - "id": "CodeExec:LightSheepTrade", - "measured": { - "height": 48, - "width": 200 - }, - "position": { - "x": 970.444642975358, - "y": 74.04386270784316 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "ragNode" - }, - { - "data": { - "form": { - "cite": true, - "delay_after_error": 1, - "description": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": "", - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 1, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "User query questions:\n\n\n\n{sys.query}\n\n\n\nInformation Extraction Agent:\n\n{Agent:SadDodosRescue@content}", - "role": "user" - } - ], - "sys_prompt": " \n\nYou are a senior investment banking (IB) analyst with years of experience in capital market research. You excel at writing investment research reports covering publicly listed companies, industries, and macroeconomics. You possess strong financial analysis skills and industry insights, combining quantitative and qualitative analysis to provide high-value references for investment decisions. \n\n**You are able to retain and present differentiated viewpoints from various reports and sources in your research, and when discrepancies arise, you do not merge them into a single conclusion. Instead, you compare and analyze the differences.** \n\n\n \n\n\n\n\n \n\nYou will receive financial information extracted by the information extraction agent.\n\n \n\n\n\nBased on the content returned by the information extraction agent (no fabrication of data), write a professional, complete, and structured investment research report. The report must be logically rigorous, clearly organized, and use professional language, suitable for reference by fund managers, institutional investors, and other professional readers.\nWhen there are differences in analysis or forecasts between different reports or institutions, you must list and identify the sources in the report. You should not select only one viewpoint. You need to point out the differences, their possible causes, and their impact on investment judgments.\n\n\n\n\n##1. Summary\nProvide a concise overview of the company\u2019s core business, recent performance, industry positioning, and major investment highlights.\nSummarize key conclusions in 3-5 sentences.\nHighlight any discrepancies in core conclusions and briefly describe the differing viewpoints and areas of disagreement.\n##2. Company Overview\nDescribe the company's main business, core products/services, market share, competitive advantages, and business model.\nHighlight any differences in the description of the company\u2019s market position or competitive advantages from different sources. Present and compare these differences.\n##3. Recent Financial Performance\nSummarize key metrics from the latest financial report (e.g., revenue, net profit, gross margin, EPS).\nHighlight the drivers behind the trends and compare the differential analyses from different reports. Present this comparison in a table.\n##4. Industry Trends & Opportunities\nOverview of industry development trends, market size, and major drivers.\nIf different sources provide differing forecasts for industry growth rates, technological trends, or competitive landscape, list these and provide background information. Present this comparison in a table.\n##5. Investment Recommendation\nProvide a clear investment recommendation based on the analysis above (e.g., \"Buy/Hold/Neutral/Sell\"), presented in a table.\nInclude investment ratings or recommendations from all sources, with the source and date clearly noted.\nIf you provide a combined recommendation based on different viewpoints, clearly explain the reasoning behind this integration.\n##6. Appendix & References\nList the data sources, analysis methods, important formulas, or chart descriptions used.\nAll references must come from the information extraction agent and the company financial data table provided, or publicly noted sources.\nFor differentiated viewpoints, provide full citation information (author, institution, date) and present this in a table.\n\n\n\n\nLanguage Style: Financial, professional, precise, and analytical.\nViewpoint Retention: When there are multiple viewpoints and conclusions, all must be retained and compared. You cannot choose only one.\nCitations: When specific data or viewpoints are referenced, include the source in parentheses (e.g., Source: Morgan Stanley Research, 2024-05-07).\nFacts: All data and conclusions must come from the information extraction agent or their noted legitimate sources. No fabrication is allowed.\nReadability: Use short paragraphs and bullet points to make it easy for professional readers to grasp key information and see the differences in viewpoints.\n\n\n\n\nGenerate a complete investment research report that meets investment banking industry standards, which can be directly used for institutional investment internal reference, while faithfully retaining differentiated viewpoints from various reports and providing the corresponding analysis.\n", - "temperature": 0.1, - "temperatureEnabled": false, - "tools": [], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Research report generation agent" - }, - "id": "Agent:SharpSlothsSlide", - "measured": { - "height": 76, - "width": 200 - }, - "position": { - "x": 974.0210917308762, - "y": 154.63747017677127 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" - }, - { - "data": { - "form": { - "content": [ - "Company financial statements:\n\n{CodeExec:LightSheepTrade@md_table}\n\n\n{Agent:SharpSlothsSlide@content}" - ] - }, - "label": "Message", - "name": "Reply message node" - }, - "dragging": false, - "id": "Message:OliveLawsArgue", - "measured": { - "height": 48, - "width": 200 - }, - "position": { - "x": 1279.3354680249918, - "y": 83.53099404318621 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "messageNode" - }, - { - "data": { - "form": { - "cite": true, - "delay_after_error": 1, - "description": "You are a senior financial content analyst who can accurately identify the companies, stock codes, industries or topics mentioned in user questions, and completely extract relevant research content from the knowledge base to ensure that data, opinions and conclusions are not lost.", - "exception_default_value": "", - "exception_goto": [], - "exception_method": "", - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "kimi-k2-turbo-preview@Moonshot", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 1, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "{sys.query}", - "role": "user" - } - ], - "sys_prompt": " \n\nRead user input \u2192 Identify the involved company/stock (supports abbreviations, full names, codes, and aliases) \u2192 Retrieve the most relevant research reports from the knowledge base \u2192 Output the full text of the research report, retaining the original format, data, chart descriptions, and risk warnings. \n\n\n\n\n\n \n\n1. Exact Match: Prioritize exact matches of company full names and stock codes. \n\n2. Content Fidelity: Fully retain the research report text stored in the knowledge base without deletion, modification, or omission of paragraphs. \n\n3. Original Data: Retain table data, dates, units, etc., in their original form. \n\n4. Complete Viewpoints: Include investment logic, financial analysis, industry comparisons, earnings forecasts, valuation methods, risk warnings, etc. \n\n5. Merging Multiple Reports: If there are multiple relevant research reports, output them in reverse chronological order. \n\n\n\n6. No Results Feedback: If no matching reports are found, output \u201cNo related research reports available in the knowledge base.\u201d\n\n\n\n ", - "temperature": 0.1, - "temperatureEnabled": false, - "tools": [ - { - "component_name": "Retrieval", - "name": "Retrieval", - "params": { - "cross_languages": [], - "description": "A knowledge base of research reports on stock analysis by senior experts", - "empty_response": "", - "kb_ids": [ - "60c53ed89acc11f0bc1e7a2a6d0b2755" - ], - "retrieval_from": "dataset", - "keywords_similarity_weight": 0.7, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" - } - }, - "rerank_id": "", - "similarity_threshold": 0.2, - "top_k": 1024, - "top_n": 8, - "use_kg": false - } - } - ], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "This is the order you need to send to the agent.", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Internal Research Report Retrieval Agent" - }, - "dragging": false, - "id": "Agent:MightyIdeasGlow", - "measured": { - "height": 76, - "width": 200 - }, - "position": { - "x": 787.966928431608, - "y": 270.12089782504677 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" - }, - { - "data": { - "form": { - "description": "This is an agent for a specific task.", - "user_prompt": "This is the order you need to send to the agent." - }, - "label": "Tool", - "name": "flow.tool_1" - }, - "dragging": false, - "id": "Tool:FullIconsStop", - "measured": { - "height": 48, - "width": 200 - }, - "position": { - "x": 786.0879409003913, - "y": 373.7912225392144 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "toolNode" - }, - { - "data": { - "form": { - "conditions": [ - { - "items": [ - { - "cpn_id": "Agent:ManyToesBrush@content", - "operator": "not contains", - "value": "Not Found" - } - ], - "logical_operator": "and", - "to": [ - "YahooFinance:QuickAdsDig", - "Agent:SadDodosRescue" - ] - } - ], - "end_cpn_ids": [ - "Message:TwentyBanksLeave" - ] - }, - "label": "Switch", - "name": "Switch" - }, - "dragging": false, - "id": "Switch:FluffyCoinsSell", - "measured": { - "height": 146, - "width": 200 - }, - "position": { - "x": 244.5649388872756, - "y": 249.25263304293162 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "switchNode" - }, - { - "data": { - "form": { - "description": "This is an agent for a specific task.", - "user_prompt": "This is the order you need to send to the agent." - }, - "label": "Tool", - "name": "flow.tool_2" - }, - "id": "Tool:ClearKiwisRoll", - "measured": { - "height": 44, - "width": 200 - }, - "position": { - "x": 592.0210917308762, - "y": 294.6374701767713 - }, - "sourcePosition": "right", - "targetPosition": "left", - "type": "toolNode" - }, - { - "data": { - "form": { - "text": "Regarding the MCP message for the Information Extraction Agent: You must manually add an MCP in MCP Servers before you can use it!" - }, - "label": "Note", - "name": "MCP Note" - }, - "dragHandle": ".note-drag-handle", - "dragging": false, + "dragHandle": ".note-drag-handle", + "dragging": false, + "height": 185, + "id": "Note:SadWallsSniff", + "measured": { "height": 185, - "id": "Note:SadWallsSniff", - "measured": { - "height": 185, - "width": 328 - }, - "position": { - "x": 527.9711365245946, - "y": 448.2236919343899 - }, - "resizing": false, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode", "width": 328 - } - ] - }, - "history": [], - "messages": [], - "path": [], - "retrieval": [] + }, + "position": { + "x": 527.9711365245946, + "y": 448.2236919343899 + }, + "resizing": false, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode", + "width": 328 + } + ] }, - "avatar": - "data:image/png;base64,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" -} + "history": [], + "messages": [], + "path": [], + "retrieval": [] + }, + "avatar": "data:image/png;base64,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" +} \ No newline at end of file diff --git a/agent/templates/trip_planner.json b/agent/templates/trip_planner.json index 70d1ac8b2b..fe6879823b 100644 --- a/agent/templates/trip_planner.json +++ b/agent/templates/trip_planner.json @@ -1,689 +1,694 @@ - { "id": 14, "title": { - "en": "Trip planner", - "de": "Reiseplaner", - "zh": "旅行规划师"}, + "en": "Trip planner", + "de": "Reiseplaner", + "zh": "旅行规划师" + }, "description": { - "en": "This smart trip planner utilizes LLM technology to automatically generate customized travel itineraries, with optional tool integration for enhanced reliability.", - "de": "Dieser intelligente Reiseplaner nutzt LLM-Technologie zur automatischen Generierung maßgeschneiderter Reiserouten mit optionaler Tool-Integration für erhöhte Zuverlässigkeit.", - "zh": "智能旅行规划师将利用大模型自动生成定制化的旅行行程,附带可选工具集成,以增强可靠性。"}, - "canvas_type": "Consumer App", + "en": "This smart trip planner utilizes LLM technology to automatically generate customized travel itineraries, with optional tool integration for enhanced reliability.", + "de": "Dieser intelligente Reiseplaner nutzt LLM-Technologie zur automatischen Generierung maßgeschneiderter Reiserouten mit optionaler Tool-Integration für erhöhte Zuverlässigkeit.", + "zh": "智能旅行规划师将利用大模型自动生成定制化的旅行行程,附带可选工具集成,以增强可靠性。" + }, + "canvas_type": "Consumer App", "dsl": { - "components": { - "Agent:OddGuestsPump": { - "downstream": [ - "Agent:RichTermsCamp" - ], - "obj": { - "component_name": "Agent", - "params": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 5, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "User's query:\n{sys.query}", - "role": "user" - } - ], - "sys_prompt": "Role: Professional tour guide: Create detailed travel plans per user needs.​\nFirst, specify departure location, destination, and travel duration (for subsequent agents to retrieve).​\nDevelop the plan using tools to get real-time weather, holidays, attraction hours, traffic, etc. Adjust itinerary accordingly (e.g., reschedule outdoor activities on rainy days) to ensure practicality, efficiency, and alignment with user preferences.​\nFor real-time info retrieval, only output tool-returned content and pass it to subsequent agents; never rely on your own knowledge base.​\n", - "temperature": 0.1, - "temperatureEnabled": true, - "tools": [], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" - } - }, - "upstream": [ - "begin" - ] - }, - "Agent:RichTermsCamp": { - "downstream": [ - "Agent:WeakCarrotsTan" - ], - "obj": { - "component_name": "Agent", - "params": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 5, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "User's query:\n{sys.query}\n\nFirst step result:\n{Agent:OddGuestsPump@content}", - "role": "user" - } - ], - "sys_prompt": "You are a Transit & Stay Agent, collaborating with upstream planners.\n\n Use tools to retrieve real-time info for transportation (flights, trains, rentals, etc.) and accommodation (hotels, rentals, etc.) based on the itinerary. Recommend options matching dates, destinations, budgets, and preferences, adjusting for availability or conflicts to align with the overall plan.", - "temperature": 0.1, - "temperatureEnabled": true, - "tools": [ - { - "component_name": "TavilySearch", - "name": "TavilySearch", - "params": { - "api_key": "", - "days": 7, - "exclude_domains": [], - "include_answer": false, - "include_domains": [], - "include_image_descriptions": false, - "include_images": false, - "include_raw_content": true, - "max_results": 5, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" - }, - "json": { - "type": "Array", - "value": [] - } - }, - "query": "sys.query", - "search_depth": "basic", - "topic": "general" - } - }, - { - "component_name": "TavilyExtract", - "name": "TavilyExtract", - "params": { - "api_key": "" - } - } - ], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" - } - }, - "upstream": [ - "Agent:OddGuestsPump" - ] - }, - "Agent:WeakCarrotsTan": { - "downstream": [ - "Message:ThickEyesUnite" - ], - "obj": { - "component_name": "Agent", - "params": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 5, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "User's query:\n{sys.query}\n\nTravel plan:\n{Agent:OddGuestsPump@content}\n\nTransit & Stay plan:\n{Agent:RichTermsCamp@content}", - "role": "user" - } - ], - "sys_prompt": "You are a Result Generator. \nYour task is to produce accurate and reliable travel plans based on integrated information from upstream agents and tool-retrieved data. Ensure the final plan is logically structured, time-efficient, and consistent with all verified details—including clear timelines, confirmed transportation/accommodation arrangements, and practical activity adjustments . Prioritize clarity and feasibility to help users execute the plan smoothly.", - "temperature": 0.1, - "temperatureEnabled": true, - "tools": [], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" - } - }, - "upstream": [ - "Agent:RichTermsCamp" - ] - }, - "Message:ThickEyesUnite": { - "downstream": [], - "obj": { - "component_name": "Message", - "params": { - "content": [ - "{Agent:WeakCarrotsTan@content}" - ] - } - }, - "upstream": [ - "Agent:WeakCarrotsTan" - ] - }, - "begin": { - "downstream": [ - "Agent:OddGuestsPump" - ], - "obj": { - "component_name": "Begin", - "params": { - "enablePrologue": true, - "inputs": {}, - "mode": "conversational", - "prologue": "Hi! I’m here to help plan your trip. Any destination in mind?" - } - }, - "upstream": [] - } - }, - "globals": { - "sys.conversation_turns": 0, - "sys.files": [], - "sys.query": "", - "sys.user_id": "" - }, - "graph": { - "edges": [ - { - "data": { - "isHovered": false - }, - "id": "xy-edge__beginstart-Agent:OddGuestsPumpend", - "source": "begin", - "sourceHandle": "start", - "target": "Agent:OddGuestsPump", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:OddGuestsPumpstart-Agent:RichTermsCampend", - "source": "Agent:OddGuestsPump", - "sourceHandle": "start", - "target": "Agent:RichTermsCamp", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:RichTermsCampstart-Agent:WeakCarrotsTanend", - "source": "Agent:RichTermsCamp", - "sourceHandle": "start", - "target": "Agent:WeakCarrotsTan", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:WeakCarrotsTanstart-Message:ThickEyesUniteend", - "source": "Agent:WeakCarrotsTan", - "sourceHandle": "start", - "target": "Message:ThickEyesUnite", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:RichTermsCamptool-Tool:BreezyStreetsHuntend", - "source": "Agent:RichTermsCamp", - "sourceHandle": "tool", - "target": "Tool:BreezyStreetsHunt", - "targetHandle": "end" - } - ], - "nodes": [ - { - "data": { - "form": { - "enablePrologue": true, - "inputs": {}, - "mode": "conversational", - "prologue": "Hi! I’m here to help plan your trip. Any destination in mind?" - }, - "label": "Begin", - "name": "begin" - }, - "dragging": false, - "id": "begin", - "measured": { - "height": 48, - "width": 200 - }, - "position": { - "x": 333.3224354104293, - "y": -31.71751112667888 - }, - "selected": false, - "sourcePosition": "left", - "targetPosition": "right", - "type": "beginNode" - }, - { - "data": { - "form": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 5, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "User's query:\n{sys.query}", - "role": "user" - } - ], - "sys_prompt": "Role: Professional tour guide: Create detailed travel plans per user needs.​\nFirst, specify departure location, destination, and travel duration (for subsequent agents to retrieve).​\nDevelop the plan using tools to get real-time weather, holidays, attraction hours, traffic, etc. Adjust itinerary accordingly (e.g., reschedule outdoor activities on rainy days) to ensure practicality, efficiency, and alignment with user preferences.​\nFor real-time info retrieval, only output tool-returned content and pass it to subsequent agents; never rely on your own knowledge base.​\n", - "temperature": 0.1, - "temperatureEnabled": true, - "tools": [], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Travel Planning Agent" - }, - "dragging": false, - "id": "Agent:OddGuestsPump", - "measured": { - "height": 84, - "width": 200 - }, - "position": { - "x": 636.3704165924755, - "y": -48.48140762793254 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" - }, - { - "data": { - "form": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 5, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "User's query:\n{sys.query}\n\nFirst step result:\n{Agent:OddGuestsPump@content}", - "role": "user" - } - ], - "sys_prompt": "You are a Transit & Stay Agent, collaborating with upstream planners.\n\n Use tools to retrieve real-time info for transportation (flights, trains, rentals, etc.) and accommodation (hotels, rentals, etc.) based on the itinerary. Recommend options matching dates, destinations, budgets, and preferences, adjusting for availability or conflicts to align with the overall plan.", - "temperature": 0.1, - "temperatureEnabled": true, - "tools": [ - { - "component_name": "TavilySearch", - "name": "TavilySearch", - "params": { - "api_key": "", - "days": 7, - "exclude_domains": [], - "include_answer": false, - "include_domains": [], - "include_image_descriptions": false, - "include_images": false, - "include_raw_content": true, - "max_results": 5, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" - }, - "json": { - "type": "Array", - "value": [] - } - }, - "query": "sys.query", - "search_depth": "basic", - "topic": "general" - } - }, - { - "component_name": "TavilyExtract", - "name": "TavilyExtract", - "params": { - "api_key": "" - } - } - ], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Transit & Stay Agent" - }, - "id": "Agent:RichTermsCamp", - "measured": { - "height": 84, - "width": 200 - }, - "position": { - "x": 936.3704165924755, - "y": -48.48140762793254 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" - }, - { - "data": { - "form": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 5, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "User's query:\n{sys.query}\n\nTravel plan:\n{Agent:OddGuestsPump@content}\n\nTransit & Stay plan:\n{Agent:RichTermsCamp@content}", - "role": "user" - } - ], - "sys_prompt": "You are a Result Generator. \nYour task is to produce accurate and reliable travel plans based on integrated information from upstream agents and tool-retrieved data. Ensure the final plan is logically structured, time-efficient, and consistent with all verified details—including clear timelines, confirmed transportation/accommodation arrangements, and practical activity adjustments . Prioritize clarity and feasibility to help users execute the plan smoothly.", - "temperature": 0.1, - "temperatureEnabled": true, - "tools": [], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Result Generator" - }, - "dragging": false, - "id": "Agent:WeakCarrotsTan", - "measured": { - "height": 84, - "width": 200 - }, - "position": { - "x": 1236.3704165924755, - "y": -48.48140762793254 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" - }, - { - "data": { - "form": { - "content": [ - "{Agent:WeakCarrotsTan@content}" - ] - }, - "label": "Message", - "name": "Final Plan" - }, - "dragging": false, - "id": "Message:ThickEyesUnite", - "measured": { - "height": 56, - "width": 200 - }, - "position": { - "x": 1583.2969941480576, - "y": -26.582338101994175 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "messageNode" - }, - { - "data": { - "form": { - "text": "The Agent will create detailed travel plans per user needs.\n​Add a map tool(eg. amap MCP) to this Agent for more reliable results." - }, - "label": "Note", - "name": "Note: Travel Planning Agent" - }, - "dragHandle": ".note-drag-handle", - "dragging": false, - "id": "Note:GentleLlamasShake", - "measured": { - "height": 136, - "width": 244 - }, - "position": { - "x": 628.3550234247459, - "y": -226.23395345704375 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode" - }, - { - "data": { - "form": { - "text": "The Agent will use tools to retrieve real-time info for transportation and accommodation." - }, - "label": "Note", - "name": "Note: Transit & Stay Agent" - }, - "dragHandle": ".note-drag-handle", - "dragging": false, - "id": "Note:ClearLlamasTell", - "measured": { - "height": 136, - "width": 244 - }, - "position": { - "x": 942.4779236864392, - "y": -224.44816237892894 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode" - }, - { - "data": { - "form": { - "description": "This is an agent for a specific task.", - "user_prompt": "This is the order you need to send to the agent." - }, - "label": "Tool", - "name": "flow.tool_0" - }, - "id": "Tool:BreezyStreetsHunt", - "measured": { - "height": 84, - "width": 200 - }, - "position": { - "x": 854.3704165924755, - "y": 91.51859237206746 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "toolNode" - }, - { - "data": { - "form": { - "text": "The Agent will produce accurate and reliable travel plans based on integrated information from upstream agents and tool-retrieved data. " - }, - "label": "Note", - "name": "Note: Result Generator" - }, - "dragHandle": ".note-drag-handle", - "dragging": false, - "height": 169, - "id": "Note:LongToysShine", - "measured": { - "height": 169, - "width": 246 - }, - "position": { - "x": 1240.444738031005, - "y": -242.8368862758842 - }, - "resizing": false, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode", - "width": 246 - }, - { - "data": { - "form": { - "text": "This workflow functions as your smart trip planner, utilizing LLM technology to automatically generate customized travel itineraries and featuring optional tool integration for enhanced reliability.\n" - }, - "label": "Note", - "name": "Workflow Overall Description" - }, - "dragHandle": ".note-drag-handle", - "dragging": false, - "height": 183, - "id": "Note:ProudPlanesMake", - "measured": { - "height": 183, - "width": 284 - }, - "position": { - "x": 197.34345022177064, - "y": -245.57788797841573 - }, - "resizing": false, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode", - "width": 284 - } - ] - }, - "history": [], - "memory": [], - "messages": [], - "path": [], - "retrieval": [], - "task_id": "abf6ec5e6ddf11f0a28c047c16ec874f" - }, + "components": { + "Agent:OddGuestsPump": { + "downstream": [ + "Agent:RichTermsCamp" + ], + "obj": { + "component_name": "Agent", + "params": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 5, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "User's query:\n{sys.query}", + "role": "user" + } + ], + "sys_prompt": "Role: Professional tour guide: Create detailed travel plans per user needs.​\nFirst, specify departure location, destination, and travel duration (for subsequent agents to retrieve).​\nDevelop the plan using tools to get real-time weather, holidays, attraction hours, traffic, etc. Adjust itinerary accordingly (e.g., reschedule outdoor activities on rainy days) to ensure practicality, efficiency, and alignment with user preferences.​\nFor real-time info retrieval, only output tool-returned content and pass it to subsequent agents; never rely on your own knowledge base.​\n", + "temperature": 0.1, + "temperatureEnabled": true, + "tools": [], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" + } + }, + "upstream": [ + "begin" + ] + }, + "Agent:RichTermsCamp": { + "downstream": [ + "Agent:WeakCarrotsTan" + ], + "obj": { + "component_name": "Agent", + "params": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 5, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "User's query:\n{sys.query}\n\nFirst step result:\n{Agent:OddGuestsPump@content}", + "role": "user" + } + ], + "sys_prompt": "You are a Transit & Stay Agent, collaborating with upstream planners.\n\n Use tools to retrieve real-time info for transportation (flights, trains, rentals, etc.) and accommodation (hotels, rentals, etc.) based on the itinerary. Recommend options matching dates, destinations, budgets, and preferences, adjusting for availability or conflicts to align with the overall plan.", + "temperature": 0.1, + "temperatureEnabled": true, + "tools": [ + { + "component_name": "TavilySearch", + "name": "TavilySearch", + "params": { + "api_key": "", + "days": 7, + "exclude_domains": [], + "include_answer": false, + "include_domains": [], + "include_image_descriptions": false, + "include_images": false, + "include_raw_content": true, + "max_results": 5, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" + }, + "json": { + "type": "Array", + "value": [] + } + }, + "query": "sys.query", + "search_depth": "basic", + "topic": "general" + }, + "id": "TavilySearch:RichTermsCamp" + }, + { + "component_name": "TavilyExtract", + "name": "TavilyExtract", + "params": { + "api_key": "" + }, + "id": "TavilyExtract:RichTermsCamp" + } + ], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" + } + }, + "upstream": [ + "Agent:OddGuestsPump" + ] + }, + "Agent:WeakCarrotsTan": { + "downstream": [ + "Message:ThickEyesUnite" + ], + "obj": { + "component_name": "Agent", + "params": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 5, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "User's query:\n{sys.query}\n\nTravel plan:\n{Agent:OddGuestsPump@content}\n\nTransit & Stay plan:\n{Agent:RichTermsCamp@content}", + "role": "user" + } + ], + "sys_prompt": "You are a Result Generator. \nYour task is to produce accurate and reliable travel plans based on integrated information from upstream agents and tool-retrieved data. Ensure the final plan is logically structured, time-efficient, and consistent with all verified details—including clear timelines, confirmed transportation/accommodation arrangements, and practical activity adjustments . Prioritize clarity and feasibility to help users execute the plan smoothly.", + "temperature": 0.1, + "temperatureEnabled": true, + "tools": [], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" + } + }, + "upstream": [ + "Agent:RichTermsCamp" + ] + }, + "Message:ThickEyesUnite": { + "downstream": [], + "obj": { + "component_name": "Message", + "params": { + "content": [ + "{Agent:WeakCarrotsTan@content}" + ] + } + }, + "upstream": [ + "Agent:WeakCarrotsTan" + ] + }, + "begin": { + "downstream": [ + "Agent:OddGuestsPump" + ], + "obj": { + "component_name": "Begin", + "params": { + "enablePrologue": true, + "inputs": {}, + "mode": "conversational", + "prologue": "Hi! I’m here to help plan your trip. Any destination in mind?" + } + }, + "upstream": [] + } + }, + "globals": { + "sys.conversation_turns": 0, + "sys.files": [], + "sys.query": "", + "sys.user_id": "" + }, + "graph": { + "edges": [ + { + "data": { + "isHovered": false + }, + "id": "xy-edge__beginstart-Agent:OddGuestsPumpend", + "source": "begin", + "sourceHandle": "start", + "target": "Agent:OddGuestsPump", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:OddGuestsPumpstart-Agent:RichTermsCampend", + "source": "Agent:OddGuestsPump", + "sourceHandle": "start", + "target": "Agent:RichTermsCamp", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:RichTermsCampstart-Agent:WeakCarrotsTanend", + "source": "Agent:RichTermsCamp", + "sourceHandle": "start", + "target": "Agent:WeakCarrotsTan", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:WeakCarrotsTanstart-Message:ThickEyesUniteend", + "source": "Agent:WeakCarrotsTan", + "sourceHandle": "start", + "target": "Message:ThickEyesUnite", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:RichTermsCamptool-Tool:BreezyStreetsHuntend", + "source": "Agent:RichTermsCamp", + "sourceHandle": "tool", + "target": "Tool:BreezyStreetsHunt", + "targetHandle": "end" + } + ], + "nodes": [ + { + "data": { + "form": { + "enablePrologue": true, + "inputs": {}, + "mode": "conversational", + "prologue": "Hi! I’m here to help plan your trip. Any destination in mind?" + }, + "label": "Begin", + "name": "begin" + }, + "dragging": false, + "id": "begin", + "measured": { + "height": 48, + "width": 200 + }, + "position": { + "x": 333.3224354104293, + "y": -31.71751112667888 + }, + "selected": false, + "sourcePosition": "left", + "targetPosition": "right", + "type": "beginNode" + }, + { + "data": { + "form": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 5, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "User's query:\n{sys.query}", + "role": "user" + } + ], + "sys_prompt": "Role: Professional tour guide: Create detailed travel plans per user needs.​\nFirst, specify departure location, destination, and travel duration (for subsequent agents to retrieve).​\nDevelop the plan using tools to get real-time weather, holidays, attraction hours, traffic, etc. Adjust itinerary accordingly (e.g., reschedule outdoor activities on rainy days) to ensure practicality, efficiency, and alignment with user preferences.​\nFor real-time info retrieval, only output tool-returned content and pass it to subsequent agents; never rely on your own knowledge base.​\n", + "temperature": 0.1, + "temperatureEnabled": true, + "tools": [], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" + }, + "label": "Agent", + "name": "Travel Planning Agent" + }, + "dragging": false, + "id": "Agent:OddGuestsPump", + "measured": { + "height": 84, + "width": 200 + }, + "position": { + "x": 636.3704165924755, + "y": -48.48140762793254 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" + }, + { + "data": { + "form": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 5, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "User's query:\n{sys.query}\n\nFirst step result:\n{Agent:OddGuestsPump@content}", + "role": "user" + } + ], + "sys_prompt": "You are a Transit & Stay Agent, collaborating with upstream planners.\n\n Use tools to retrieve real-time info for transportation (flights, trains, rentals, etc.) and accommodation (hotels, rentals, etc.) based on the itinerary. Recommend options matching dates, destinations, budgets, and preferences, adjusting for availability or conflicts to align with the overall plan.", + "temperature": 0.1, + "temperatureEnabled": true, + "tools": [ + { + "component_name": "TavilySearch", + "name": "TavilySearch", + "params": { + "api_key": "", + "days": 7, + "exclude_domains": [], + "include_answer": false, + "include_domains": [], + "include_image_descriptions": false, + "include_images": false, + "include_raw_content": true, + "max_results": 5, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" + }, + "json": { + "type": "Array", + "value": [] + } + }, + "query": "sys.query", + "search_depth": "basic", + "topic": "general" + }, + "id": "TavilySearch:RichTermsCamp" + }, + { + "component_name": "TavilyExtract", + "name": "TavilyExtract", + "params": { + "api_key": "" + }, + "id": "TavilyExtract:RichTermsCamp" + } + ], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" + }, + "label": "Agent", + "name": "Transit & Stay Agent" + }, + "id": "Agent:RichTermsCamp", + "measured": { + "height": 84, + "width": 200 + }, + "position": { + "x": 936.3704165924755, + "y": -48.48140762793254 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" + }, + { + "data": { + "form": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 5, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "User's query:\n{sys.query}\n\nTravel plan:\n{Agent:OddGuestsPump@content}\n\nTransit & Stay plan:\n{Agent:RichTermsCamp@content}", + "role": "user" + } + ], + "sys_prompt": "You are a Result Generator. \nYour task is to produce accurate and reliable travel plans based on integrated information from upstream agents and tool-retrieved data. Ensure the final plan is logically structured, time-efficient, and consistent with all verified details—including clear timelines, confirmed transportation/accommodation arrangements, and practical activity adjustments . Prioritize clarity and feasibility to help users execute the plan smoothly.", + "temperature": 0.1, + "temperatureEnabled": true, + "tools": [], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" + }, + "label": "Agent", + "name": "Result Generator" + }, + "dragging": false, + "id": "Agent:WeakCarrotsTan", + "measured": { + "height": 84, + "width": 200 + }, + "position": { + "x": 1236.3704165924755, + "y": -48.48140762793254 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" + }, + { + "data": { + "form": { + "content": [ + "{Agent:WeakCarrotsTan@content}" + ] + }, + "label": "Message", + "name": "Final Plan" + }, + "dragging": false, + "id": "Message:ThickEyesUnite", + "measured": { + "height": 56, + "width": 200 + }, + "position": { + "x": 1583.2969941480576, + "y": -26.582338101994175 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "messageNode" + }, + { + "data": { + "form": { + "text": "The Agent will create detailed travel plans per user needs.\n​Add a map tool(eg. amap MCP) to this Agent for more reliable results." + }, + "label": "Note", + "name": "Note: Travel Planning Agent" + }, + "dragHandle": ".note-drag-handle", + "dragging": false, + "id": "Note:GentleLlamasShake", + "measured": { + "height": 136, + "width": 244 + }, + "position": { + "x": 628.3550234247459, + "y": -226.23395345704375 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode" + }, + { + "data": { + "form": { + "text": "The Agent will use tools to retrieve real-time info for transportation and accommodation." + }, + "label": "Note", + "name": "Note: Transit & Stay Agent" + }, + "dragHandle": ".note-drag-handle", + "dragging": false, + "id": "Note:ClearLlamasTell", + "measured": { + "height": 136, + "width": 244 + }, + "position": { + "x": 942.4779236864392, + "y": -224.44816237892894 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode" + }, + { + "data": { + "form": { + "description": "This is an agent for a specific task.", + "user_prompt": "This is the order you need to send to the agent." + }, + "label": "Tool", + "name": "flow.tool_0" + }, + "id": "Tool:BreezyStreetsHunt", + "measured": { + "height": 84, + "width": 200 + }, + "position": { + "x": 854.3704165924755, + "y": 91.51859237206746 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "toolNode" + }, + { + "data": { + "form": { + "text": "The Agent will produce accurate and reliable travel plans based on integrated information from upstream agents and tool-retrieved data. " + }, + "label": "Note", + "name": "Note: Result Generator" + }, + "dragHandle": ".note-drag-handle", + "dragging": false, + "height": 169, + "id": "Note:LongToysShine", + "measured": { + "height": 169, + "width": 246 + }, + "position": { + "x": 1240.444738031005, + "y": -242.8368862758842 + }, + "resizing": false, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode", + "width": 246 + }, + { + "data": { + "form": { + "text": "This workflow functions as your smart trip planner, utilizing LLM technology to automatically generate customized travel itineraries and featuring optional tool integration for enhanced reliability.\n" + }, + "label": "Note", + "name": "Workflow Overall Description" + }, + "dragHandle": ".note-drag-handle", + "dragging": false, + "height": 183, + "id": "Note:ProudPlanesMake", + "measured": { + "height": 183, + "width": 284 + }, + "position": { + "x": 197.34345022177064, + "y": -245.57788797841573 + }, + "resizing": false, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode", + "width": 284 + } + ] + }, + "history": [], + "memory": [], + "messages": [], + "path": [], + "retrieval": [], + "task_id": "abf6ec5e6ddf11f0a28c047c16ec874f" + }, "avatar": "data:image/png;base64,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" } diff --git a/agent/templates/user_interaction.json b/agent/templates/user_interaction.json index b0b6a38487..0af6de05d3 100644 --- a/agent/templates/user_interaction.json +++ b/agent/templates/user_interaction.json @@ -14,190 +14,191 @@ "dsl": { "components": { "Agent:LargeFliesMelt": { - "downstream": [ - "UserFillUp:GoldBroomsRelate" - ], - "obj": { - "component_name": "Agent", - "params": { - "cite": true, - "delay_after_error": 1, - "description": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": "", - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "qwen-turbo@Tongyi-Qianwen", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 1, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - }, - "structured": {} - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "User query:{sys.query}", - "role": "user" - } + "downstream": [ + "UserFillUp:GoldBroomsRelate" ], - "sys_prompt": "\nYou are the Planning Agent in a multi-agent RAG workflow.\nYour sole job is to design a crisp, executable Search Plan for the next agent. Do not search or answer the user’s question.\n\n\nUnderstand the user’s task and decompose it into evidence-seeking steps.\nProduce high-quality queries and retrieval settings tailored to the task type (fact lookup, multi-hop reasoning, comparison, statistics, how-to, etc.).\nIdentify missing information that would materially change the plan (≤3 concise questions).\nOptimize for source trustworthiness, diversity, and recency; define stopping criteria to avoid over-searching.\nAnswer in 150 words.\n", - "temperature": 0.1, - "temperatureEnabled": false, - "tools": [], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" - } - }, - "upstream": [ - "begin" - ] + "obj": { + "component_name": "Agent", + "params": { + "cite": true, + "delay_after_error": 1, + "description": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": "", + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "qwen-turbo@Tongyi-Qianwen", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 1, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + }, + "structured": {} + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "User query:{sys.query}", + "role": "user" + } + ], + "sys_prompt": "\nYou are the Planning Agent in a multi-agent RAG workflow.\nYour sole job is to design a crisp, executable Search Plan for the next agent. Do not search or answer the user’s question.\n\n\nUnderstand the user’s task and decompose it into evidence-seeking steps.\nProduce high-quality queries and retrieval settings tailored to the task type (fact lookup, multi-hop reasoning, comparison, statistics, how-to, etc.).\nIdentify missing information that would materially change the plan (≤3 concise questions).\nOptimize for source trustworthiness, diversity, and recency; define stopping criteria to avoid over-searching.\nAnswer in 150 words.\n", + "temperature": 0.1, + "temperatureEnabled": false, + "tools": [], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" + } + }, + "upstream": [ + "begin" + ] }, "Agent:TangyWordsType": { - "downstream": [ - "Message:FreshWallsStudy" - ], - "obj": { - "component_name": "Agent", - "params": { - "cite": true, - "delay_after_error": 1, - "description": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": "", - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "qwen-turbo@Tongyi-Qianwen", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 1, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - }, - "structured": {} - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "Search Plan: {Agent:LargeFliesMelt@content}\n\n\n\nAwait Response feedback:{UserFillUp:GoldBroomsRelate@instructions}\n", - "role": "user" - } + "downstream": [ + "Message:FreshWallsStudy" ], - "sys_prompt": "\nYou are the Search Agent.\nYour job is to execute the approved Search Plan, integrate the Await Response feedback, retrieve evidence, and produce a well-grounded answer.\n\n\nTranslate the plan + feedback into concrete searches.\nCollect diverse, trustworthy, and recent evidence meeting the plan’s evidence bar.\nSynthesize a concise answer; include citations next to claims they support.\nIf evidence is insufficient or conflicting, clearly state limitations and propose next steps.\n\n \nRetrieval: You must use Retrieval to do the search.\n \n", - "temperature": 0.1, - "temperatureEnabled": false, - "tools": [ - { - "component_name": "Retrieval", - "name": "Retrieval", + "obj": { + "component_name": "Agent", "params": { - "cross_languages": [], + "cite": true, + "delay_after_error": 1, "description": "", - "empty_response": "", - "kb_ids": [], - "retrieval_from": "dataset", - "keywords_similarity_weight": 0.7, + "exception_default_value": "", + "exception_goto": [], + "exception_method": "", + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "qwen-turbo@Tongyi-Qianwen", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 1, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, "outputs": { - "formalized_content": { - "type": "string", - "value": "" + "content": { + "type": "string", + "value": "" + }, + "structured": {} }, - "json": { - "type": "Array", - "value": [] - } - }, - "rerank_id": "", - "similarity_threshold": 0.2, - "toc_enhance": false, - "top_k": 1024, - "top_n": 8, - "use_kg": false + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "Search Plan: {Agent:LargeFliesMelt@content}\n\n\n\nAwait Response feedback:{UserFillUp:GoldBroomsRelate@instructions}\n", + "role": "user" + } + ], + "sys_prompt": "\nYou are the Search Agent.\nYour job is to execute the approved Search Plan, integrate the Await Response feedback, retrieve evidence, and produce a well-grounded answer.\n\n\nTranslate the plan + feedback into concrete searches.\nCollect diverse, trustworthy, and recent evidence meeting the plan’s evidence bar.\nSynthesize a concise answer; include citations next to claims they support.\nIf evidence is insufficient or conflicting, clearly state limitations and propose next steps.\n\n \nRetrieval: You must use Retrieval to do the search.\n \n", + "temperature": 0.1, + "temperatureEnabled": false, + "tools": [ + { + "component_name": "Retrieval", + "name": "Retrieval", + "params": { + "cross_languages": [], + "description": "", + "empty_response": "", + "kb_ids": [], + "retrieval_from": "dataset", + "keywords_similarity_weight": 0.7, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" + }, + "json": { + "type": "Array", + "value": [] + } + }, + "rerank_id": "", + "similarity_threshold": 0.2, + "toc_enhance": false, + "top_k": 1024, + "top_n": 8, + "use_kg": false + }, + "id": "Retrieval:WarmRiversMarch" + } + ], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" } - } - ], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" - } - }, - "upstream": [ - "UserFillUp:GoldBroomsRelate" - ] + }, + "upstream": [ + "UserFillUp:GoldBroomsRelate" + ] }, "Message:FreshWallsStudy": { - "downstream": [], - "obj": { - "component_name": "Message", - "params": { - "content": [ - "{Agent:TangyWordsType@content}" + "downstream": [], + "obj": { + "component_name": "Message", + "params": { + "content": [ + "{Agent:TangyWordsType@content}" + ] + } + }, + "upstream": [ + "Agent:TangyWordsType" ] - } - }, - "upstream": [ - "Agent:TangyWordsType" - ] }, "UserFillUp:GoldBroomsRelate": { - "downstream": [ - "Agent:TangyWordsType" - ], - "obj": { - "component_name": "UserFillUp", - "params": { - "enable_tips": true, - "inputs": { - "instructions": { - "name": "instructions", - "optional": false, - "options": [], - "type": "paragraph" + "downstream": [ + "Agent:TangyWordsType" + ], + "obj": { + "component_name": "UserFillUp", + "params": { + "enable_tips": true, + "inputs": { + "instructions": { + "name": "instructions", + "optional": false, + "options": [], + "type": "paragraph" + } + }, + "outputs": { + "instructions": { + "name": "instructions", + "optional": false, + "options": [], + "type": "paragraph" + } + }, + "tips": "Here is my search plan:\n{Agent:LargeFliesMelt@content}\nAre you okay with it?" } }, - "outputs": { - "instructions": { - "name": "instructions", - "optional": false, - "options": [], - "type": "paragraph" - } - }, - "tips": "Here is my search plan:\n{Agent:LargeFliesMelt@content}\nAre you okay with it?" - } - }, - "upstream": [ - "Agent:LargeFliesMelt" - ] + "upstream": [ + "Agent:LargeFliesMelt" + ] }, "begin": { - "downstream": [ - "Agent:LargeFliesMelt" - ], - "obj": { - "component_name": "Begin", - "params": {} - }, - "upstream": [] + "downstream": [ + "Agent:LargeFliesMelt" + ], + "obj": { + "component_name": "Begin", + "params": {} + }, + "upstream": [] } }, "globals": { @@ -208,308 +209,309 @@ }, "graph": { "edges": [ - { - "data": { - "isHovered": false + { + "data": { + "isHovered": false + }, + "id": "xy-edge__beginstart-Agent:LargeFliesMeltend", + "source": "begin", + "sourceHandle": "start", + "target": "Agent:LargeFliesMelt", + "targetHandle": "end" }, - "id": "xy-edge__beginstart-Agent:LargeFliesMeltend", - "source": "begin", - "sourceHandle": "start", - "target": "Agent:LargeFliesMelt", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:LargeFliesMeltstart-UserFillUp:GoldBroomsRelateend", + "source": "Agent:LargeFliesMelt", + "sourceHandle": "start", + "target": "UserFillUp:GoldBroomsRelate", + "targetHandle": "end" }, - "id": "xy-edge__Agent:LargeFliesMeltstart-UserFillUp:GoldBroomsRelateend", - "source": "Agent:LargeFliesMelt", - "sourceHandle": "start", - "target": "UserFillUp:GoldBroomsRelate", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false + { + "data": { + "isHovered": false + }, + "id": "xy-edge__UserFillUp:GoldBroomsRelatestart-Agent:TangyWordsTypeend", + "source": "UserFillUp:GoldBroomsRelate", + "sourceHandle": "start", + "target": "Agent:TangyWordsType", + "targetHandle": "end" }, - "id": "xy-edge__UserFillUp:GoldBroomsRelatestart-Agent:TangyWordsTypeend", - "source": "UserFillUp:GoldBroomsRelate", - "sourceHandle": "start", - "target": "Agent:TangyWordsType", - "targetHandle": "end" - }, - { - "id": "xy-edge__Agent:TangyWordsTypetool-Tool:NastyBatsGoend", - "source": "Agent:TangyWordsType", - "sourceHandle": "tool", - "target": "Tool:NastyBatsGo", - "targetHandle": "end" - }, - { - "id": "xy-edge__Agent:TangyWordsTypestart-Message:FreshWallsStudyend", - "source": "Agent:TangyWordsType", - "sourceHandle": "start", - "target": "Message:FreshWallsStudy", - "targetHandle": "end" - } + { + "id": "xy-edge__Agent:TangyWordsTypetool-Tool:NastyBatsGoend", + "source": "Agent:TangyWordsType", + "sourceHandle": "tool", + "target": "Tool:NastyBatsGo", + "targetHandle": "end" + }, + { + "id": "xy-edge__Agent:TangyWordsTypestart-Message:FreshWallsStudyend", + "source": "Agent:TangyWordsType", + "sourceHandle": "start", + "target": "Message:FreshWallsStudy", + "targetHandle": "end" + } ], "nodes": [ - { - "data": { - "label": "Begin", - "name": "begin" - }, - "dragging": false, - "id": "begin", - "measured": { - "height": 50, - "width": 200 - }, - "position": { - "x": 154.9008789064451, - "y": 119.51001744285344 - }, - "selected": false, - "sourcePosition": "left", - "targetPosition": "right", - "type": "beginNode" - }, - { - "data": { - "form": { - "cite": true, - "delay_after_error": 1, - "description": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": "", - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "qwen-turbo@Tongyi-Qianwen", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 1, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" + { + "data": { + "label": "Begin", + "name": "begin" }, - "structured": {} + "dragging": false, + "id": "begin", + "measured": { + "height": 50, + "width": 200 }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "User query:{sys.query}", - "role": "user" - } - ], - "sys_prompt": "\nYou are the Planning Agent in a multi-agent RAG workflow.\nYour sole job is to design a crisp, executable Search Plan for the next agent. Do not search or answer the user’s question.\n\n\nUnderstand the user’s task and decompose it into evidence-seeking steps.\nProduce high-quality queries and retrieval settings tailored to the task type (fact lookup, multi-hop reasoning, comparison, statistics, how-to, etc.).\nIdentify missing information that would materially change the plan (≤3 concise questions).\nOptimize for source trustworthiness, diversity, and recency; define stopping criteria to avoid over-searching.\nAnswer in 150 words.\n", - "temperature": 0.1, - "temperatureEnabled": false, - "tools": [], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Planning Agent" - }, - "dragging": false, - "id": "Agent:LargeFliesMelt", - "measured": { - "height": 90, - "width": 200 - }, - "position": { - "x": 443.96309330796714, - "y": 104.61370811205677 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" - }, - { - "data": { - "form": { - "enable_tips": true, - "inputs": { - "instructions": { - "name": "instructions", - "optional": false, - "options": [], - "type": "paragraph" - } + "position": { + "x": 154.9008789064451, + "y": 119.51001744285344 }, - "outputs": { - "instructions": { - "name": "instructions", - "optional": false, - "options": [], - "type": "paragraph" - } - }, - "tips": "Here is my search plan:\n{Agent:LargeFliesMelt@content}\nAre you okay with it?" + "selected": false, + "sourcePosition": "left", + "targetPosition": "right", + "type": "beginNode" }, - "label": "UserFillUp", - "name": "Await Response" - }, - "dragging": false, - "id": "UserFillUp:GoldBroomsRelate", - "measured": { - "height": 50, - "width": 200 - }, - "position": { - "x": 683.3409492927474, - "y": 116.76274137645598 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "ragNode" - }, - { - "data": { - "form": { - "cite": true, - "delay_after_error": 1, - "description": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": "", - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "qwen-turbo@Tongyi-Qianwen", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 1, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - }, - "structured": {} - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "Search Plan: {Agent:LargeFliesMelt@content}\n\n\n\nAwait Response feedback:{UserFillUp:GoldBroomsRelate@instructions}\n", - "role": "user" - } - ], - "sys_prompt": "\nYou are the Search Agent.\nYour job is to execute the approved Search Plan, integrate the Await Response feedback, retrieve evidence, and produce a well-grounded answer.\n\n\nTranslate the plan + feedback into concrete searches.\nCollect diverse, trustworthy, and recent evidence meeting the plan’s evidence bar.\nSynthesize a concise answer; include citations next to claims they support.\nIf evidence is insufficient or conflicting, clearly state limitations and propose next steps.\n\n \nRetrieval: You must use Retrieval to do the search.\n \n", - "temperature": 0.1, - "temperatureEnabled": false, - "tools": [ - { - "component_name": "Retrieval", - "name": "Retrieval", - "params": { - "cross_languages": [], - "description": "", - "empty_response": "", - "kb_ids": [], - "retrieval_from": "dataset", - "keywords_similarity_weight": 0.7, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" + { + "data": { + "form": { + "cite": true, + "delay_after_error": 1, + "description": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": "", + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "qwen-turbo@Tongyi-Qianwen", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 1, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + }, + "structured": {} }, - "json": { - "type": "Array", - "value": [] - } + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "User query:{sys.query}", + "role": "user" + } + ], + "sys_prompt": "\nYou are the Planning Agent in a multi-agent RAG workflow.\nYour sole job is to design a crisp, executable Search Plan for the next agent. Do not search or answer the user’s question.\n\n\nUnderstand the user’s task and decompose it into evidence-seeking steps.\nProduce high-quality queries and retrieval settings tailored to the task type (fact lookup, multi-hop reasoning, comparison, statistics, how-to, etc.).\nIdentify missing information that would materially change the plan (≤3 concise questions).\nOptimize for source trustworthiness, diversity, and recency; define stopping criteria to avoid over-searching.\nAnswer in 150 words.\n", + "temperature": 0.1, + "temperatureEnabled": false, + "tools": [], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" }, - "rerank_id": "", - "similarity_threshold": 0.2, - "toc_enhance": false, - "top_k": 1024, - "top_n": 8, - "use_kg": false - } - } - ], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" + "label": "Agent", + "name": "Planning Agent" + }, + "dragging": false, + "id": "Agent:LargeFliesMelt", + "measured": { + "height": 90, + "width": 200 + }, + "position": { + "x": 443.96309330796714, + "y": 104.61370811205677 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" }, - "label": "Agent", - "name": "Search Agent" + { + "data": { + "form": { + "enable_tips": true, + "inputs": { + "instructions": { + "name": "instructions", + "optional": false, + "options": [], + "type": "paragraph" + } + }, + "outputs": { + "instructions": { + "name": "instructions", + "optional": false, + "options": [], + "type": "paragraph" + } + }, + "tips": "Here is my search plan:\n{Agent:LargeFliesMelt@content}\nAre you okay with it?" + }, + "label": "UserFillUp", + "name": "Await Response" + }, + "dragging": false, + "id": "UserFillUp:GoldBroomsRelate", + "measured": { + "height": 50, + "width": 200 + }, + "position": { + "x": 683.3409492927474, + "y": 116.76274137645598 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "ragNode" }, - "dragging": false, - "id": "Agent:TangyWordsType", - "measured": { - "height": 90, - "width": 200 + { + "data": { + "form": { + "cite": true, + "delay_after_error": 1, + "description": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": "", + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "qwen-turbo@Tongyi-Qianwen", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 1, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + }, + "structured": {} + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "Search Plan: {Agent:LargeFliesMelt@content}\n\n\n\nAwait Response feedback:{UserFillUp:GoldBroomsRelate@instructions}\n", + "role": "user" + } + ], + "sys_prompt": "\nYou are the Search Agent.\nYour job is to execute the approved Search Plan, integrate the Await Response feedback, retrieve evidence, and produce a well-grounded answer.\n\n\nTranslate the plan + feedback into concrete searches.\nCollect diverse, trustworthy, and recent evidence meeting the plan’s evidence bar.\nSynthesize a concise answer; include citations next to claims they support.\nIf evidence is insufficient or conflicting, clearly state limitations and propose next steps.\n\n \nRetrieval: You must use Retrieval to do the search.\n \n", + "temperature": 0.1, + "temperatureEnabled": false, + "tools": [ + { + "component_name": "Retrieval", + "name": "Retrieval", + "params": { + "cross_languages": [], + "description": "", + "empty_response": "", + "kb_ids": [], + "retrieval_from": "dataset", + "keywords_similarity_weight": 0.7, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" + }, + "json": { + "type": "Array", + "value": [] + } + }, + "rerank_id": "", + "similarity_threshold": 0.2, + "toc_enhance": false, + "top_k": 1024, + "top_n": 8, + "use_kg": false + }, + "id": "Retrieval:BrightMoonsGlow" + } + ], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" + }, + "label": "Agent", + "name": "Search Agent" + }, + "dragging": false, + "id": "Agent:TangyWordsType", + "measured": { + "height": 90, + "width": 200 + }, + "position": { + "x": 944.6411255659472, + "y": 99.84499066368488 + }, + "selected": true, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" }, - "position": { - "x": 944.6411255659472, - "y": 99.84499066368488 + { + "data": { + "form": { + "description": "This is an agent for a specific task.", + "user_prompt": "This is the order you need to send to the agent." + }, + "label": "Tool", + "name": "flow.tool_0" + }, + "id": "Tool:NastyBatsGo", + "measured": { + "height": 50, + "width": 200 + }, + "position": { + "x": 862.6411255659472, + "y": 239.84499066368488 + }, + "sourcePosition": "right", + "targetPosition": "left", + "type": "toolNode" }, - "selected": true, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" - }, - { - "data": { - "form": { - "description": "This is an agent for a specific task.", - "user_prompt": "This is the order you need to send to the agent." - }, - "label": "Tool", - "name": "flow.tool_0" - }, - "id": "Tool:NastyBatsGo", - "measured": { - "height": 50, - "width": 200 - }, - "position": { - "x": 862.6411255659472, - "y": 239.84499066368488 - }, - "sourcePosition": "right", - "targetPosition": "left", - "type": "toolNode" - }, - { - "data": { - "form": { - "content": [ - "{Agent:TangyWordsType@content}" - ] - }, - "label": "Message", - "name": "Message" - }, - "dragging": false, - "id": "Message:FreshWallsStudy", - "measured": { - "height": 50, - "width": 200 - }, - "position": { - "x": 1216.7057997987163, - "y": 120.48541298149814 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "messageNode" - } + { + "data": { + "form": { + "content": [ + "{Agent:TangyWordsType@content}" + ] + }, + "label": "Message", + "name": "Message" + }, + "dragging": false, + "id": "Message:FreshWallsStudy", + "measured": { + "height": 50, + "width": 200 + }, + "position": { + "x": 1216.7057997987163, + "y": 120.48541298149814 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "messageNode" + } ] }, "history": [], @@ -517,7 +519,6 @@ "path": [], "retrieval": [], "variables": {} - }, - "avatar": - "data:image/png;base64,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" + }, + "avatar": "data:image/png;base64,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" } \ No newline at end of file diff --git a/agent/templates/web_search_assistant.json b/agent/templates/web_search_assistant.json index 0f939e028b..64295ba8a7 100644 --- a/agent/templates/web_search_assistant.json +++ b/agent/templates/web_search_assistant.json @@ -1,877 +1,890 @@ - { "id": 16, "title": { - "en": "WebSearch Assistant", - "de": "Websuche Assistent", - "zh": "网页搜索助手"}, + "en": "WebSearch Assistant", + "de": "Websuche Assistent", + "zh": "网页搜索助手" + }, "description": { - "en": "A chat assistant template that integrates information extracted from a knowledge base and web searches to respond to queries. Let's start by setting up your knowledge base in 'Retrieval'!", - "de": "Eine Chat-Assistenten-Vorlage, die Informationen aus einer Wissensdatenbank und Websuchen integriert, um auf Anfragen zu antworten. Beginnen wir mit der Einrichtung Ihrer Wissensdatenbank unter 'Retrieval'!", - "zh": "集成了从知识库和网络搜索中提取的信息回答用户问题。让我们从设置您的知识库开始检索!"}, - "canvas_type": "Other", + "en": "A chat assistant template that integrates information extracted from a knowledge base and web searches to respond to queries. Let's start by setting up your knowledge base in 'Retrieval'!", + "de": "Eine Chat-Assistenten-Vorlage, die Informationen aus einer Wissensdatenbank und Websuchen integriert, um auf Anfragen zu antworten. Beginnen wir mit der Einrichtung Ihrer Wissensdatenbank unter 'Retrieval'!", + "zh": "集成了从知识库和网络搜索中提取的信息回答用户问题。让我们从设置您的知识库开始检索!" + }, + "canvas_type": "Other", "dsl": { - "components": { - "Agent:SmartSchoolsCross": { - "downstream": [ - "Message:ShaggyRingsCrash" - ], - "obj": { - "component_name": "Agent", - "params": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 1, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "User's query:\n{sys.query}\n\nRefined question:\n{Agent:ThreePathsDecide@content}\n\nWeb search result:\n{Agent:WildGoatsRule@content}\n\nRetrieval result:\n{Agent:WildGoatsRule@content}", - "role": "user" - } - ], - "sys_prompt": "Role: You are an Answer Organizer.\nTask: Generate the answer based on the provided content from: User's query, Refined question, Web search result, Retrieval result.\n\nRequirements:\n - Answer should be in markdown format.\n - Answer should include all \n - Do not make thing up when there's no relevant information to user's question. \n", - "temperature": 0.1, - "temperatureEnabled": true, - "tools": [], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" - } - }, - "upstream": [ - "Agent:WildGoatsRule", - "Retrieval:WarmTimesRun" - ] - }, - "Agent:ThreePathsDecide": { - "downstream": [ - "Agent:WildGoatsRule", - "Retrieval:WarmTimesRun" - ], - "obj": { - "component_name": "Agent", - "params": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 1, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "{sys.query}", - "role": "user" - } - ], - "sys_prompt": "Role: You are a Question Refinement Agent. Rewrite ambiguous or incomplete user questions to align with knowledge base terminology using conversation history.\n\nExample:\n\nUser: What's RAGFlow?\nAssistant: RAGFlow is xxx.\n\nUser: How to deloy it?\nRefine it: How to deploy RAGFlow?", - "temperature": 0.1, - "temperatureEnabled": true, - "tools": [], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" - } - }, - "upstream": [ - "begin" - ] - }, - "Agent:WildGoatsRule": { - "downstream": [ - "Agent:SmartSchoolsCross" - ], - "obj": { - "component_name": "Agent", - "params": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 2, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "User's query:\n{sys.query}\n\nRefined question:\n{Agent:ThreePathsDecide@content}", - "role": "user" - } - ], - "sys_prompt": "Role: You are a Search-Driven Information Agent that answers questions using web search results.\n\nWorkflow:\nKeyword Extraction:\nExtract exactly 3 keywords from the user's question.\n\nKeywords must be:\n✅ Most specific nouns/proper nouns (e.g., \"iPhone 15 Pro\" not \"phone\")\n✅ Core concepts (e.g., \"quantum entanglement\" not \"science thing\")\n✅ Unbiased (no added opinions)\nNever output keywords to users\n\nSearch & Answer:\nUse search tools (TavilySearch, TavilyExtract, Google, Bing, DuckDuckGo, Wikipedia) with the 3 keywords to retrieve results.\nAnswer solely based on search findings, citing sources.\nIf results conflict, prioritize recent (.gov/.edu > forums)\n\nOutput Rules:\n✖️ Never show keywords in final answers\n✖️ Never guess if search yields no results\n✅ Always cite sources using [Source #] notation", - "temperature": 0.1, - "temperatureEnabled": true, - "tools": [ - { - "component_name": "TavilySearch", - "name": "TavilySearch", - "params": { - "api_key": "", - "days": 7, - "exclude_domains": [], - "include_answer": false, - "include_domains": [], - "include_image_descriptions": false, - "include_images": false, - "include_raw_content": true, - "max_results": 5, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" - }, - "json": { - "type": "Array", - "value": [] - } - }, - "query": "sys.query", - "search_depth": "basic", - "topic": "general" - } - }, - { - "component_name": "TavilyExtract", - "name": "TavilyExtract", - "params": { - "api_key": "" - } - }, - { - "component_name": "Google", - "name": "Google", - "params": { - "api_key": "", - "country": "us", - "language": "en" - } - }, - { - "component_name": "Bing", - "name": "Bing", - "params": { - "api_key": "YOUR_API_KEY (obtained from https://www.microsoft.com/en-us/bing/apis/bing-web-search-api)", - "channel": "Webpages", - "country": "CH", - "language": "en", - "top_n": 10 - } - }, - { - "component_name": "DuckDuckGo", - "name": "DuckDuckGo", - "params": { - "channel": "text", - "top_n": 10 - } - }, - { - "component_name": "Wikipedia", - "name": "Wikipedia", - "params": { - "language": "en", - "top_n": 10 - } - } - ], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" - } - }, - "upstream": [ - "Agent:ThreePathsDecide" - ] - }, - "Message:ShaggyRingsCrash": { - "downstream": [], - "obj": { - "component_name": "Message", - "params": { - "content": [ - "{Agent:SmartSchoolsCross@content}" - ] - } - }, - "upstream": [ - "Agent:SmartSchoolsCross" - ] - }, - "Retrieval:WarmTimesRun": { - "downstream": [ - "Agent:SmartSchoolsCross" - ], - "obj": { - "component_name": "Retrieval", - "params": { - "cross_languages": [], - "empty_response": "", - "kb_ids": [], - "retrieval_from": "dataset", - "keywords_similarity_weight": 0.7, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" - } - }, - "query": "Agent:ThreePathsDecide@content", - "rerank_id": "", - "similarity_threshold": 0.2, - "top_k": 1024, - "top_n": 8, - "use_kg": false - } - }, - "upstream": [ - "Agent:ThreePathsDecide" - ] - }, - "begin": { - "downstream": [ - "Agent:ThreePathsDecide" - ], - "obj": { - "component_name": "Begin", - "params": { - "enablePrologue": true, - "inputs": {}, - "mode": "conversational", - "prologue": "Hi! I'm your web search assistant. What do you want to search today?" - } - }, - "upstream": [] - } - }, - "globals": { - "sys.conversation_turns": 1, - "sys.files": [], - "sys.query": "你好", - "sys.user_id": "d6d98fd652f911f0a8fb047c16ec874f" - }, - "graph": { - "edges": [ - { - "data": { - "isHovered": false - }, - "id": "xy-edge__beginstart-Agent:ThreePathsDecideend", - "source": "begin", - "sourceHandle": "start", - "target": "Agent:ThreePathsDecide", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:ThreePathsDecidestart-Agent:WildGoatsRuleend", - "source": "Agent:ThreePathsDecide", - "sourceHandle": "start", - "target": "Agent:WildGoatsRule", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:ThreePathsDecidestart-Retrieval:WarmTimesRunend", - "source": "Agent:ThreePathsDecide", - "sourceHandle": "start", - "target": "Retrieval:WarmTimesRun", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:WildGoatsRulestart-Agent:SmartSchoolsCrossend", - "source": "Agent:WildGoatsRule", - "sourceHandle": "start", - "target": "Agent:SmartSchoolsCross", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:SmartSchoolsCrossstart-Message:ShaggyRingsCrashend", - "source": "Agent:SmartSchoolsCross", - "sourceHandle": "start", - "target": "Message:ShaggyRingsCrash", - "targetHandle": "end" - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Retrieval:WarmTimesRunstart-Agent:SmartSchoolsCrossend", - "markerEnd": "logo", - "source": "Retrieval:WarmTimesRun", - "sourceHandle": "start", - "style": { - "stroke": "rgba(91, 93, 106, 1)", - "strokeWidth": 1 - }, - "target": "Agent:SmartSchoolsCross", - "targetHandle": "end", - "type": "buttonEdge", - "zIndex": 1001 - }, - { - "data": { - "isHovered": false - }, - "id": "xy-edge__Agent:WildGoatsRuletool-Tool:TrueCrewsTakeend", - "source": "Agent:WildGoatsRule", - "sourceHandle": "tool", - "target": "Tool:TrueCrewsTake", - "targetHandle": "end" - } - ], - "nodes": [ - { - "data": { - "form": { - "enablePrologue": true, - "inputs": {}, - "mode": "conversational", - "prologue": "Hi! I'm your web search assistant. What do you want to search today?" - }, - "label": "Begin", - "name": "begin" - }, - "dragging": false, - "id": "begin", - "measured": { - "height": 48, - "width": 200 - }, - "position": { - "x": 32.79251060693639, - "y": 209.67921278359827 - }, - "selected": false, - "sourcePosition": "left", - "targetPosition": "right", - "type": "beginNode" - }, - { - "data": { - "form": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 1, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "{sys.query}", - "role": "user" - } - ], - "sys_prompt": "Role: You are a Question Refinement Agent. Rewrite ambiguous or incomplete user questions to align with knowledge base terminology using conversation history.\n\nExample:\n\nUser: What's RAGFlow?\nAssistant: RAGFlow is xxx.\n\nUser: How to deloy it?\nRefine it: How to deploy RAGFlow?", - "temperature": 0.1, - "temperatureEnabled": true, - "tools": [], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Refine Question" - }, - "dragging": false, - "id": "Agent:ThreePathsDecide", - "measured": { - "height": 84, - "width": 200 - }, - "position": { - "x": 309.1322126914739, - "y": 188.16985104226876 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" - }, - { - "data": { - "form": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 2, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "User's query:\n{sys.query}\n\nRefined question:\n{Agent:ThreePathsDecide@content}", - "role": "user" - } - ], - "sys_prompt": "Role: You are a Search-Driven Information Agent that answers questions using web search results.\n\nWorkflow:\nKeyword Extraction:\nExtract exactly 3 keywords from the user's question.\n\nKeywords must be:\n✅ Most specific nouns/proper nouns (e.g., \"iPhone 15 Pro\" not \"phone\")\n✅ Core concepts (e.g., \"quantum entanglement\" not \"science thing\")\n✅ Unbiased (no added opinions)\nNever output keywords to users\n\nSearch & Answer:\nUse search tools (TavilySearch, TavilyExtract, Google, Bing, DuckDuckGo, Wikipedia) with the 3 keywords to retrieve results.\nAnswer solely based on search findings, citing sources.\nIf results conflict, prioritize recent (.gov/.edu > forums)\n\nOutput Rules:\n✖️ Never show keywords in final answers\n✖️ Never guess if search yields no results\n✅ Always cite sources using [Source #] notation", - "temperature": 0.1, - "temperatureEnabled": true, - "tools": [ - { - "component_name": "TavilySearch", - "name": "TavilySearch", - "params": { - "api_key": "", - "days": 7, - "exclude_domains": [], - "include_answer": false, - "include_domains": [], - "include_image_descriptions": false, - "include_images": false, - "include_raw_content": true, - "max_results": 5, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" - }, - "json": { - "type": "Array", - "value": [] - } - }, - "query": "sys.query", - "search_depth": "basic", - "topic": "general" - } - }, - { - "component_name": "TavilyExtract", - "name": "TavilyExtract", - "params": { - "api_key": "" - } - }, - { - "component_name": "Google", - "name": "Google", - "params": { - "api_key": "", - "country": "us", - "language": "en" - } - }, - { - "component_name": "Bing", - "name": "Bing", - "params": { - "api_key": "YOUR_API_KEY (obtained from https://www.microsoft.com/en-us/bing/apis/bing-web-search-api)", - "channel": "Webpages", - "country": "CH", - "language": "en", - "top_n": 10 - } - }, - { - "component_name": "DuckDuckGo", - "name": "DuckDuckGo", - "params": { - "channel": "text", - "top_n": 10 - } - }, - { - "component_name": "Wikipedia", - "name": "Wikipedia", - "params": { - "language": "en", - "top_n": 10 - } - } - ], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Search Agent" - }, - "dragging": false, - "id": "Agent:WildGoatsRule", - "measured": { - "height": 84, - "width": 200 - }, - "position": { - "x": 678.5892767651895, - "y": 2.074237779456759 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" - }, - { - "data": { - "form": { - "cross_languages": [], - "empty_response": "", - "kb_ids": [], - "retrieval_from": "dataset", - "keywords_similarity_weight": 0.7, - "outputs": { - "formalized_content": { - "type": "string", - "value": "" - } - }, - "query": "Agent:ThreePathsDecide@content", - "rerank_id": "", - "similarity_threshold": 0.2, - "top_k": 1024, - "top_n": 8, - "use_kg": false - }, - "label": "Retrieval", - "name": "Retrieval from knowledge bases " - }, - "dragging": false, - "id": "Retrieval:WarmTimesRun", - "measured": { - "height": 56, - "width": 200 - }, - "position": { - "x": 689.0595178434597, - "y": 499.2340890704343 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "retrievalNode" - }, - { - "data": { - "form": { - "delay_after_error": 1, - "description": "", - "exception_comment": "", - "exception_default_value": "", - "exception_goto": [], - "exception_method": null, - "frequencyPenaltyEnabled": false, - "frequency_penalty": 0.7, - "llm_id": "", - "maxTokensEnabled": false, - "max_retries": 3, - "max_rounds": 1, - "max_tokens": 256, - "mcp": [], - "message_history_window_size": 12, - "outputs": { - "content": { - "type": "string", - "value": "" - } - }, - "presencePenaltyEnabled": false, - "presence_penalty": 0.4, - "prompts": [ - { - "content": "User's query:\n{sys.query}\n\nRefined question:\n{Agent:ThreePathsDecide@content}\n\nWeb search result:\n{Agent:WildGoatsRule@content}\n\nRetrieval result:\n{Agent:WildGoatsRule@content}", - "role": "user" - } - ], - "sys_prompt": "Role: You are an Answer Organizer.\nTask: Generate the answer based on the provided content from: User's query, Refined question, Web search result, Retrieval result.\n\nRequirements:\n - Answer should be in markdown format.\n - Answer should include all \n - Do not make thing up when there's no relevant information to user's question. \n", - "temperature": 0.1, - "temperatureEnabled": true, - "tools": [], - "topPEnabled": false, - "top_p": 0.3, - "user_prompt": "", - "visual_files_var": "" - }, - "label": "Agent", - "name": "Answer Organizer" - }, - "dragging": false, - "id": "Agent:SmartSchoolsCross", - "measured": { - "height": 84, - "width": 200 - }, - "position": { - "x": 1134.5321493898284, - "y": 221.46972754101765 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "agentNode" - }, - { - "data": { - "form": { - "content": [ - "{Agent:SmartSchoolsCross@content}" - ] - }, - "label": "Message", - "name": "Answer" - }, - "dragging": false, - "id": "Message:ShaggyRingsCrash", - "measured": { - "height": 56, - "width": 200 - }, - "position": { - "x": 1437.758553651028, - "y": 235.45081267288185 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "messageNode" - }, - { - "data": { - "form": { - "text": "This Agent rewrites your question for better search & retrieval results." - }, - "label": "Note", - "name": "Note: Refine Question" - }, - "dragHandle": ".note-drag-handle", - "id": "Note:BetterCupsBow", - "measured": { - "height": 136, - "width": 244 - }, - "position": { - "x": 270, - "y": 390 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode" - }, - { - "data": { - "form": { - "text": "This Agent answers questions using web search results." - }, - "label": "Note", - "name": "Note: Search Agent" - }, - "dragHandle": ".note-drag-handle", - "dragging": false, - "id": "Note:OddGoatsBeg", - "measured": { - "height": 136, - "width": 244 - }, - "position": { - "x": 689.3401860180043, - "y": -204.46057070562227 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode" - }, - { - "data": { - "form": { - "text": "This Agents generates the answer based on the provided content from: User's query, Refined question, Web search result, Retrieval result." - }, - "label": "Note", - "name": "Note: Answer Organizer" - }, - "dragHandle": ".note-drag-handle", - "dragging": false, - "height": 188, - "id": "Note:SlowBottlesHope", - "measured": { - "height": 188, - "width": 251 - }, - "position": { - "x": 1152.1929528629184, - "y": 375.08305219772546 - }, - "resizing": false, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode", - "width": 251 - }, - { - "data": { - "form": { - "description": "This is an agent for a specific task.", - "user_prompt": "This is the order you need to send to the agent." - }, - "label": "Tool", - "name": "flow.tool_0" - }, - "dragging": false, - "id": "Tool:TrueCrewsTake", - "measured": { - "height": 228, - "width": 200 - }, - "position": { - "x": 642.9703031510875, - "y": 144.80253344921545 - }, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "toolNode" - }, - { - "data": { - "form": { - "text": "This is a chat assistant template that integrates information extracted from a knowledge base and web searches to respond to queries. Let's start by setting up your knowledge base in 'Retrieval'!" - }, - "label": "Note", - "name": "Workflow Overall Description" - }, - "dragHandle": ".note-drag-handle", - "dragging": false, - "height": 163, - "id": "Note:BumpySteaksPump", - "measured": { - "height": 163, - "width": 389 - }, - "position": { - "x": -36.59148337976953, - "y": 1.488564577528809 - }, - "resizing": false, - "selected": false, - "sourcePosition": "right", - "targetPosition": "left", - "type": "noteNode", - "width": 389 - } - ] - }, - "history": [ - [ - "user", - "你好" - ] - ], - "memory": [], - "messages": [], - "path": [ - "begin", - "Agent:ThreePathsDecide" - ], - "retrieval": [ - { - "chunks": [], - "doc_aggs": [] - }, - { - "chunks": {}, - "doc_aggs": {} - } - ], - "task_id": "183442fc6dd811f091b1047c16ec874f" - }, + "components": { + "Agent:SmartSchoolsCross": { + "downstream": [ + "Message:ShaggyRingsCrash" + ], + "obj": { + "component_name": "Agent", + "params": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 1, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "User's query:\n{sys.query}\n\nRefined question:\n{Agent:ThreePathsDecide@content}\n\nWeb search result:\n{Agent:WildGoatsRule@content}\n\nRetrieval result:\n{Agent:WildGoatsRule@content}", + "role": "user" + } + ], + "sys_prompt": "Role: You are an Answer Organizer.\nTask: Generate the answer based on the provided content from: User's query, Refined question, Web search result, Retrieval result.\n\nRequirements:\n - Answer should be in markdown format.\n - Answer should include all \n - Do not make thing up when there's no relevant information to user's question. \n", + "temperature": 0.1, + "temperatureEnabled": true, + "tools": [], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" + } + }, + "upstream": [ + "Agent:WildGoatsRule", + "Retrieval:WarmTimesRun" + ] + }, + "Agent:ThreePathsDecide": { + "downstream": [ + "Agent:WildGoatsRule", + "Retrieval:WarmTimesRun" + ], + "obj": { + "component_name": "Agent", + "params": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 1, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "{sys.query}", + "role": "user" + } + ], + "sys_prompt": "Role: You are a Question Refinement Agent. Rewrite ambiguous or incomplete user questions to align with knowledge base terminology using conversation history.\n\nExample:\n\nUser: What's RAGFlow?\nAssistant: RAGFlow is xxx.\n\nUser: How to deloy it?\nRefine it: How to deploy RAGFlow?", + "temperature": 0.1, + "temperatureEnabled": true, + "tools": [], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" + } + }, + "upstream": [ + "begin" + ] + }, + "Agent:WildGoatsRule": { + "downstream": [ + "Agent:SmartSchoolsCross" + ], + "obj": { + "component_name": "Agent", + "params": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 2, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "User's query:\n{sys.query}\n\nRefined question:\n{Agent:ThreePathsDecide@content}", + "role": "user" + } + ], + "sys_prompt": "Role: You are a Search-Driven Information Agent that answers questions using web search results.\n\nWorkflow:\nKeyword Extraction:\nExtract exactly 3 keywords from the user's question.\n\nKeywords must be:\n✅ Most specific nouns/proper nouns (e.g., \"iPhone 15 Pro\" not \"phone\")\n✅ Core concepts (e.g., \"quantum entanglement\" not \"science thing\")\n✅ Unbiased (no added opinions)\nNever output keywords to users\n\nSearch & Answer:\nUse search tools (TavilySearch, TavilyExtract, Google, Bing, DuckDuckGo, Wikipedia) with the 3 keywords to retrieve results.\nAnswer solely based on search findings, citing sources.\nIf results conflict, prioritize recent (.gov/.edu > forums)\n\nOutput Rules:\n✖️ Never show keywords in final answers\n✖️ Never guess if search yields no results\n✅ Always cite sources using [Source #] notation", + "temperature": 0.1, + "temperatureEnabled": true, + "tools": [ + { + "component_name": "TavilySearch", + "name": "TavilySearch", + "params": { + "api_key": "", + "days": 7, + "exclude_domains": [], + "include_answer": false, + "include_domains": [], + "include_image_descriptions": false, + "include_images": false, + "include_raw_content": true, + "max_results": 5, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" + }, + "json": { + "type": "Array", + "value": [] + } + }, + "query": "sys.query", + "search_depth": "basic", + "topic": "general" + }, + "id": "TavilySearch:SafeBeansFall" + }, + { + "component_name": "TavilyExtract", + "name": "TavilyExtract", + "params": { + "api_key": "" + }, + "id": "TavilyExtract:LoudWindsBurn" + }, + { + "component_name": "Google", + "name": "Google", + "params": { + "api_key": "", + "country": "us", + "language": "en" + }, + "id": "Google:QuickCloudsDream" + }, + { + "component_name": "Bing", + "name": "Bing", + "params": { + "api_key": "YOUR_API_KEY (obtained from https://www.microsoft.com/en-us/bing/apis/bing-web-search-api)", + "channel": "Webpages", + "country": "CH", + "language": "en", + "top_n": 10 + }, + "id": "Bing:WiseHawksFly" + }, + { + "component_name": "DuckDuckGo", + "name": "DuckDuckGo", + "params": { + "channel": "text", + "top_n": 10 + }, + "id": "DuckDuckGo:CalmHorsesSing" + }, + { + "component_name": "Wikipedia", + "name": "Wikipedia", + "params": { + "language": "en", + "top_n": 10 + }, + "id": "Wikipedia:SharpFoxesSing" + } + ], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" + } + }, + "upstream": [ + "Agent:ThreePathsDecide" + ] + }, + "Message:ShaggyRingsCrash": { + "downstream": [], + "obj": { + "component_name": "Message", + "params": { + "content": [ + "{Agent:SmartSchoolsCross@content}" + ] + } + }, + "upstream": [ + "Agent:SmartSchoolsCross" + ] + }, + "Retrieval:WarmTimesRun": { + "downstream": [ + "Agent:SmartSchoolsCross" + ], + "obj": { + "component_name": "Retrieval", + "params": { + "cross_languages": [], + "empty_response": "", + "kb_ids": [], + "retrieval_from": "dataset", + "keywords_similarity_weight": 0.7, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" + } + }, + "query": "Agent:ThreePathsDecide@content", + "rerank_id": "", + "similarity_threshold": 0.2, + "top_k": 1024, + "top_n": 8, + "use_kg": false + } + }, + "upstream": [ + "Agent:ThreePathsDecide" + ] + }, + "begin": { + "downstream": [ + "Agent:ThreePathsDecide" + ], + "obj": { + "component_name": "Begin", + "params": { + "enablePrologue": true, + "inputs": {}, + "mode": "conversational", + "prologue": "Hi! I'm your web search assistant. What do you want to search today?" + } + }, + "upstream": [] + } + }, + "globals": { + "sys.conversation_turns": 1, + "sys.files": [], + "sys.query": "你好", + "sys.user_id": "d6d98fd652f911f0a8fb047c16ec874f" + }, + "graph": { + "edges": [ + { + "data": { + "isHovered": false + }, + "id": "xy-edge__beginstart-Agent:ThreePathsDecideend", + "source": "begin", + "sourceHandle": "start", + "target": "Agent:ThreePathsDecide", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:ThreePathsDecidestart-Agent:WildGoatsRuleend", + "source": "Agent:ThreePathsDecide", + "sourceHandle": "start", + "target": "Agent:WildGoatsRule", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:ThreePathsDecidestart-Retrieval:WarmTimesRunend", + "source": "Agent:ThreePathsDecide", + "sourceHandle": "start", + "target": "Retrieval:WarmTimesRun", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:WildGoatsRulestart-Agent:SmartSchoolsCrossend", + "source": "Agent:WildGoatsRule", + "sourceHandle": "start", + "target": "Agent:SmartSchoolsCross", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:SmartSchoolsCrossstart-Message:ShaggyRingsCrashend", + "source": "Agent:SmartSchoolsCross", + "sourceHandle": "start", + "target": "Message:ShaggyRingsCrash", + "targetHandle": "end" + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Retrieval:WarmTimesRunstart-Agent:SmartSchoolsCrossend", + "markerEnd": "logo", + "source": "Retrieval:WarmTimesRun", + "sourceHandle": "start", + "style": { + "stroke": "rgba(91, 93, 106, 1)", + "strokeWidth": 1 + }, + "target": "Agent:SmartSchoolsCross", + "targetHandle": "end", + "type": "buttonEdge", + "zIndex": 1001 + }, + { + "data": { + "isHovered": false + }, + "id": "xy-edge__Agent:WildGoatsRuletool-Tool:TrueCrewsTakeend", + "source": "Agent:WildGoatsRule", + "sourceHandle": "tool", + "target": "Tool:TrueCrewsTake", + "targetHandle": "end" + } + ], + "nodes": [ + { + "data": { + "form": { + "enablePrologue": true, + "inputs": {}, + "mode": "conversational", + "prologue": "Hi! I'm your web search assistant. What do you want to search today?" + }, + "label": "Begin", + "name": "begin" + }, + "dragging": false, + "id": "begin", + "measured": { + "height": 48, + "width": 200 + }, + "position": { + "x": 32.79251060693639, + "y": 209.67921278359827 + }, + "selected": false, + "sourcePosition": "left", + "targetPosition": "right", + "type": "beginNode" + }, + { + "data": { + "form": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 1, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "{sys.query}", + "role": "user" + } + ], + "sys_prompt": "Role: You are a Question Refinement Agent. Rewrite ambiguous or incomplete user questions to align with knowledge base terminology using conversation history.\n\nExample:\n\nUser: What's RAGFlow?\nAssistant: RAGFlow is xxx.\n\nUser: How to deloy it?\nRefine it: How to deploy RAGFlow?", + "temperature": 0.1, + "temperatureEnabled": true, + "tools": [], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" + }, + "label": "Agent", + "name": "Refine Question" + }, + "dragging": false, + "id": "Agent:ThreePathsDecide", + "measured": { + "height": 84, + "width": 200 + }, + "position": { + "x": 309.1322126914739, + "y": 188.16985104226876 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" + }, + { + "data": { + "form": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 2, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "User's query:\n{sys.query}\n\nRefined question:\n{Agent:ThreePathsDecide@content}", + "role": "user" + } + ], + "sys_prompt": "Role: You are a Search-Driven Information Agent that answers questions using web search results.\n\nWorkflow:\nKeyword Extraction:\nExtract exactly 3 keywords from the user's question.\n\nKeywords must be:\n✅ Most specific nouns/proper nouns (e.g., \"iPhone 15 Pro\" not \"phone\")\n✅ Core concepts (e.g., \"quantum entanglement\" not \"science thing\")\n✅ Unbiased (no added opinions)\nNever output keywords to users\n\nSearch & Answer:\nUse search tools (TavilySearch, TavilyExtract, Google, Bing, DuckDuckGo, Wikipedia) with the 3 keywords to retrieve results.\nAnswer solely based on search findings, citing sources.\nIf results conflict, prioritize recent (.gov/.edu > forums)\n\nOutput Rules:\n✖️ Never show keywords in final answers\n✖️ Never guess if search yields no results\n✅ Always cite sources using [Source #] notation", + "temperature": 0.1, + "temperatureEnabled": true, + "tools": [ + { + "component_name": "TavilySearch", + "name": "TavilySearch", + "params": { + "api_key": "", + "days": 7, + "exclude_domains": [], + "include_answer": false, + "include_domains": [], + "include_image_descriptions": false, + "include_images": false, + "include_raw_content": true, + "max_results": 5, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" + }, + "json": { + "type": "Array", + "value": [] + } + }, + "query": "sys.query", + "search_depth": "basic", + "topic": "general" + }, + "id": "TavilySearch:WildSheepMarch" + }, + { + "component_name": "TavilyExtract", + "name": "TavilyExtract", + "params": { + "api_key": "" + }, + "id": "TavilyExtract:GreatToolsSmile" + }, + { + "component_name": "Google", + "name": "Google", + "params": { + "api_key": "", + "country": "us", + "language": "en" + }, + "id": "Google:SafeSongsRead" + }, + { + "component_name": "Bing", + "name": "Bing", + "params": { + "api_key": "YOUR_API_KEY (obtained from https://www.microsoft.com/en-us/bing/apis/bing-web-search-api)", + "channel": "Webpages", + "country": "CH", + "language": "en", + "top_n": 10 + }, + "id": "Bing:SharpMoonsSpin" + }, + { + "component_name": "DuckDuckGo", + "name": "DuckDuckGo", + "params": { + "channel": "text", + "top_n": 10 + }, + "id": "DuckDuckGo:WideDeerHunt" + }, + { + "component_name": "Wikipedia", + "name": "Wikipedia", + "params": { + "language": "en", + "top_n": 10 + }, + "id": "Wikipedia:CoolYearsTell" + } + ], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" + }, + "label": "Agent", + "name": "Search Agent" + }, + "dragging": false, + "id": "Agent:WildGoatsRule", + "measured": { + "height": 84, + "width": 200 + }, + "position": { + "x": 678.5892767651895, + "y": 2.074237779456759 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" + }, + { + "data": { + "form": { + "cross_languages": [], + "empty_response": "", + "kb_ids": [], + "retrieval_from": "dataset", + "keywords_similarity_weight": 0.7, + "outputs": { + "formalized_content": { + "type": "string", + "value": "" + } + }, + "query": "Agent:ThreePathsDecide@content", + "rerank_id": "", + "similarity_threshold": 0.2, + "top_k": 1024, + "top_n": 8, + "use_kg": false + }, + "label": "Retrieval", + "name": "Retrieval from knowledge bases " + }, + "dragging": false, + "id": "Retrieval:WarmTimesRun", + "measured": { + "height": 56, + "width": 200 + }, + "position": { + "x": 689.0595178434597, + "y": 499.2340890704343 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "retrievalNode" + }, + { + "data": { + "form": { + "delay_after_error": 1, + "description": "", + "exception_comment": "", + "exception_default_value": "", + "exception_goto": [], + "exception_method": null, + "frequencyPenaltyEnabled": false, + "frequency_penalty": 0.7, + "llm_id": "", + "maxTokensEnabled": false, + "max_retries": 3, + "max_rounds": 1, + "max_tokens": 256, + "mcp": [], + "message_history_window_size": 12, + "outputs": { + "content": { + "type": "string", + "value": "" + } + }, + "presencePenaltyEnabled": false, + "presence_penalty": 0.4, + "prompts": [ + { + "content": "User's query:\n{sys.query}\n\nRefined question:\n{Agent:ThreePathsDecide@content}\n\nWeb search result:\n{Agent:WildGoatsRule@content}\n\nRetrieval result:\n{Agent:WildGoatsRule@content}", + "role": "user" + } + ], + "sys_prompt": "Role: You are an Answer Organizer.\nTask: Generate the answer based on the provided content from: User's query, Refined question, Web search result, Retrieval result.\n\nRequirements:\n - Answer should be in markdown format.\n - Answer should include all \n - Do not make thing up when there's no relevant information to user's question. \n", + "temperature": 0.1, + "temperatureEnabled": true, + "tools": [], + "topPEnabled": false, + "top_p": 0.3, + "user_prompt": "", + "visual_files_var": "" + }, + "label": "Agent", + "name": "Answer Organizer" + }, + "dragging": false, + "id": "Agent:SmartSchoolsCross", + "measured": { + "height": 84, + "width": 200 + }, + "position": { + "x": 1134.5321493898284, + "y": 221.46972754101765 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "agentNode" + }, + { + "data": { + "form": { + "content": [ + "{Agent:SmartSchoolsCross@content}" + ] + }, + "label": "Message", + "name": "Answer" + }, + "dragging": false, + "id": "Message:ShaggyRingsCrash", + "measured": { + "height": 56, + "width": 200 + }, + "position": { + "x": 1437.758553651028, + "y": 235.45081267288185 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "messageNode" + }, + { + "data": { + "form": { + "text": "This Agent rewrites your question for better search & retrieval results." + }, + "label": "Note", + "name": "Note: Refine Question" + }, + "dragHandle": ".note-drag-handle", + "id": "Note:BetterCupsBow", + "measured": { + "height": 136, + "width": 244 + }, + "position": { + "x": 270, + "y": 390 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode" + }, + { + "data": { + "form": { + "text": "This Agent answers questions using web search results." + }, + "label": "Note", + "name": "Note: Search Agent" + }, + "dragHandle": ".note-drag-handle", + "dragging": false, + "id": "Note:OddGoatsBeg", + "measured": { + "height": 136, + "width": 244 + }, + "position": { + "x": 689.3401860180043, + "y": -204.46057070562227 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode" + }, + { + "data": { + "form": { + "text": "This Agents generates the answer based on the provided content from: User's query, Refined question, Web search result, Retrieval result." + }, + "label": "Note", + "name": "Note: Answer Organizer" + }, + "dragHandle": ".note-drag-handle", + "dragging": false, + "height": 188, + "id": "Note:SlowBottlesHope", + "measured": { + "height": 188, + "width": 251 + }, + "position": { + "x": 1152.1929528629184, + "y": 375.08305219772546 + }, + "resizing": false, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode", + "width": 251 + }, + { + "data": { + "form": { + "description": "This is an agent for a specific task.", + "user_prompt": "This is the order you need to send to the agent." + }, + "label": "Tool", + "name": "flow.tool_0" + }, + "dragging": false, + "id": "Tool:TrueCrewsTake", + "measured": { + "height": 228, + "width": 200 + }, + "position": { + "x": 642.9703031510875, + "y": 144.80253344921545 + }, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "toolNode" + }, + { + "data": { + "form": { + "text": "This is a chat assistant template that integrates information extracted from a knowledge base and web searches to respond to queries. Let's start by setting up your knowledge base in 'Retrieval'!" + }, + "label": "Note", + "name": "Workflow Overall Description" + }, + "dragHandle": ".note-drag-handle", + "dragging": false, + "height": 163, + "id": "Note:BumpySteaksPump", + "measured": { + "height": 163, + "width": 389 + }, + "position": { + "x": -36.59148337976953, + "y": 1.488564577528809 + }, + "resizing": false, + "selected": false, + "sourcePosition": "right", + "targetPosition": "left", + "type": "noteNode", + "width": 389 + } + ] + }, + "history": [ + [ + "user", + "你好" + ] + ], + "memory": [], + "messages": [], + "path": [ + "begin", + "Agent:ThreePathsDecide" + ], + "retrieval": [ + { + "chunks": [], + "doc_aggs": [] + }, + { + "chunks": {}, + "doc_aggs": {} + } + ], + "task_id": "183442fc6dd811f091b1047c16ec874f" + }, "avatar": "data:image/png;base64,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" -} +} \ No newline at end of file diff --git a/agent/templates/your_starter_dataset_chatbot.json b/agent/templates/your_starter_dataset_chatbot.json index 66c9054a65..0c82e7e0fd 100644 --- a/agent/templates/your_starter_dataset_chatbot.json +++ b/agent/templates/your_starter_dataset_chatbot.json @@ -74,7 +74,8 @@ "top_k": 1024, "top_n": 8, "use_kg": false - } + }, + "id": "Retrieval:WarmOwlsCough" } ], "topPEnabled": false, @@ -226,7 +227,8 @@ "top_k": 1024, "top_n": 8, "use_kg": false - } + }, + "id": "Retrieval:WarmWeeksRead" } ], "topPEnabled": false, diff --git a/web/src/components/llm-setting-items/next.tsx b/web/src/components/llm-setting-items/next.tsx index 60dd0d7c48..8ae7058fc5 100644 --- a/web/src/components/llm-setting-items/next.tsx +++ b/web/src/components/llm-setting-items/next.tsx @@ -4,7 +4,7 @@ import { } from '@/constants/knowledge'; import { useTranslate } from '@/hooks/common-hooks'; import { camelCase, isEqual } from 'lodash'; -import React, { useCallback } from 'react'; +import { useCallback } from 'react'; import { useFormContext } from 'react-hook-form'; import { z } from 'zod'; import { Collapse } from '../collapse'; @@ -92,13 +92,6 @@ export function LlmSettingFieldItems({ const form = useFormContext(); const { t } = useTranslate('chat'); - const CollapseComponent = showCollapse ? Collapse : React.Fragment; - const collapseProps = showCollapse - ? { - title: t('modelSetting'), - } - : {}; - const getFieldWithPrefix = useCallback( (name: string) => { return prefix ? `${prefix}.${name}` : name; @@ -149,6 +142,141 @@ export function LlmSettingFieldItems({ } }; + const settingFields = ( +
+ ( + + {t('freedom')} + + + + + + )} + /> + {showFields.some((item) => item === 'temperature') && ( + { + checkParameterIsEqual(); + }} + > + )} + {showFields.some((item) => item === 'top_p') && ( + { + checkParameterIsEqual(); + }} + > + )} + {showFields.some((item) => item === 'presence_penalty') && ( + { + checkParameterIsEqual(); + }} + > + )} + {showFields.some((item) => item === 'frequency_penalty') && ( + { + checkParameterIsEqual(); + }} + > + )} + {showFields.some((item) => item === 'max_tokens') && ( + { + checkParameterIsEqual(); + }} + > + )} + {showFields.some((item) => item === 'thinking') && ( + ( + + + {t('thinking')} + + + + + + + )} + /> + )} +
+ ); + return (
- -
- ( - - {t('freedom')} - - - - - - )} - /> - {showFields.some((item) => item === 'temperature') && ( - { - checkParameterIsEqual(); - }} - > - )} - {showFields.some((item) => item === 'top_p') && ( - { - checkParameterIsEqual(); - }} - > - )} - {showFields.some((item) => item === 'presence_penalty') && ( - { - checkParameterIsEqual(); - }} - > - )} - {showFields.some((item) => item === 'frequency_penalty') && ( - { - checkParameterIsEqual(); - }} - > - )} - {showFields.some((item) => item === 'max_tokens') && ( - { - checkParameterIsEqual(); - }} - > - )} - {showFields.some((item) => item === 'thinking') && ( - ( - - - {t('thinking')} - - - - - - - )} - /> - )} -
-
+ {showCollapse ? ( + {settingFields} + ) : ( + settingFields + )}
); } diff --git a/web/src/components/model-tree-select.tsx b/web/src/components/model-tree-select.tsx index f0395abc92..aeb93b29f7 100644 --- a/web/src/components/model-tree-select.tsx +++ b/web/src/components/model-tree-select.tsx @@ -10,7 +10,7 @@ import { import { useFetchAllAddedModels } from '@/hooks/use-llm-request'; import { IAddedModel } from '@/interfaces/database/llm'; import { buildModelValue, getRealModelName } from '@/utils/llm-util'; -import { useCallback, useMemo } from 'react'; +import { forwardRef, useCallback, useMemo } from 'react'; import { useFormContext } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { TreeSelect, TreeSelectNode } from './tree-select'; @@ -116,19 +116,25 @@ export interface ModelTreeSelectProps { ownerTenantId?: string; } -export function ModelTreeSelect({ - modelTypes = ModelTypeMap.llm_id, - value, - onChange, - disabled, - placeholder, - showSearch = true, - allowClear = false, - className, - renderSelected, - testId, - ownerTenantId, -}: ModelTreeSelectProps) { +export const ModelTreeSelect = forwardRef< + HTMLButtonElement, + ModelTreeSelectProps +>(function ModelTreeSelect( + { + modelTypes = ModelTypeMap.llm_id, + value, + onChange, + disabled, + placeholder, + showSearch = true, + allowClear = false, + className, + renderSelected, + testId, + ownerTenantId, + }, + ref, +) { const { data: allAddedModels } = useFetchAllAddedModels( undefined, ownerTenantId, @@ -185,6 +191,7 @@ export function ModelTreeSelect({ return ( ); -} +}); export interface ModelTreeSelectFormFieldProps extends ModelTreeSelectProps { name?: string; diff --git a/web/src/components/tree-select.tsx b/web/src/components/tree-select.tsx index ed228499fc..c194ed0f4c 100644 --- a/web/src/components/tree-select.tsx +++ b/web/src/components/tree-select.tsx @@ -5,7 +5,7 @@ import { } from '@/components/ui/popover'; import { cn } from '@/lib/utils'; import { ChevronDown, ChevronRight, Search, X } from 'lucide-react'; -import { useCallback, useEffect, useMemo, useState } from 'react'; +import { forwardRef, useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; export interface TreeSelectNode { @@ -31,239 +31,247 @@ interface TreeSelectProps { testId?: string; } -export function TreeSelect({ - data, - value, - onChange, - placeholder, - disabled, - allowClear, - showSearch, - className, - defaultExpandAll, - renderSelected, - testId, -}: TreeSelectProps) { - const [open, setOpen] = useState(false); - const [searchTerm, setSearchTerm] = useState(''); - const [expandedIds, setExpandedIds] = useState>(new Set()); - const { t } = useTranslation(); - - useEffect(() => { - if (!defaultExpandAll) return; - const ids = new Set(); - const walk = (nodes: TreeSelectNode[]) => { - for (const node of nodes) { - if (node.children?.length) { - ids.add(node.id); - walk(node.children); - } - } - }; - walk(data); - setExpandedIds(ids); - }, [data, defaultExpandAll]); - - const selectedNode = useMemo(() => { - const find = (nodes: TreeSelectNode[]): TreeSelectNode | undefined => { - for (const node of nodes) { - if (node.id === value && value) return node; - if (node.children) { - const found = find(node.children); - if (found) return found; - } - } - }; - return find(data); - }, [data, value]); - - const isLeaf = useCallback( - (node: TreeSelectNode) => !node.children?.length, - [], - ); - - const handleToggle = useCallback((id: string) => { - setExpandedIds((prev) => { - const next = new Set(prev); - if (next.has(id)) { - next.delete(id); - } else { - next.add(id); - } - return next; - }); - }, []); - - const handleSelect = useCallback( - (node: TreeSelectNode) => { - if (node.disabled) return; - if (isLeaf(node)) { - onChange?.(node.id); - setOpen(false); - setSearchTerm(''); - } else { - handleToggle(node.id); - } +export const TreeSelect = forwardRef( + function TreeSelect( + { + data, + value, + onChange, + placeholder, + disabled, + allowClear, + showSearch, + className, + defaultExpandAll, + renderSelected, + testId, }, - [isLeaf, onChange, handleToggle], - ); + ref, + ) { + const [open, setOpen] = useState(false); + const [searchTerm, setSearchTerm] = useState(''); + const [expandedIds, setExpandedIds] = useState>(new Set()); + const { t } = useTranslation(); - const handleClear = useCallback( - (e: React.MouseEvent) => { - e.stopPropagation(); - onChange?.(''); - }, - [onChange], - ); - - const filterTree = useCallback( - (nodes: TreeSelectNode[], term: string): TreeSelectNode[] => { - if (!term) return nodes; - return nodes.reduce((acc, node) => { - const titleMatch = node.title - .toLowerCase() - .includes(term.toLowerCase()); - const filteredChildren = node.children - ? filterTree(node.children, term) - : undefined; - if (titleMatch || filteredChildren?.length) { - acc.push({ ...node, children: filteredChildren ?? node.children }); + useEffect(() => { + if (!defaultExpandAll) return; + const ids = new Set(); + const walk = (nodes: TreeSelectNode[]) => { + for (const node of nodes) { + if (node.children?.length) { + ids.add(node.id); + walk(node.children); + } } - return acc; - }, []); - }, - [], - ); + }; + walk(data); + setExpandedIds(ids); + }, [data, defaultExpandAll]); - const filteredData = useMemo( - () => filterTree(data, searchTerm), - [data, searchTerm, filterTree], - ); - - const visibleExpandedIds = useMemo(() => { - if (!searchTerm) return expandedIds; - const ids = new Set(); - const walk = (nodes: TreeSelectNode[]) => { - for (const node of nodes) { - if (node.children?.length) { - ids.add(node.id); - walk(node.children); + const selectedNode = useMemo(() => { + const find = (nodes: TreeSelectNode[]): TreeSelectNode | undefined => { + for (const node of nodes) { + if (node.id === value && value) return node; + if (node.children) { + const found = find(node.children); + if (found) return found; + } } - } - }; - walk(filteredData); - return ids; - }, [searchTerm, expandedIds, filteredData]); + }; + return find(data); + }, [data, value]); - const renderTree = useCallback( - (nodes: TreeSelectNode[], level = 0): React.ReactNode => { - return nodes.map((node) => { - const leaf = isLeaf(node); - const expanded = visibleExpandedIds.has(node.id); - const selected = value === node.id; + const isLeaf = useCallback( + (node: TreeSelectNode) => !node.children?.length, + [], + ); - return ( -
-
handleSelect(node)} - > - - {!leaf && ( - <> - {expanded ? ( - - ) : ( - - )} - - )} - - {node.label ?? node.title} -
- {!leaf && expanded && node.children && ( -
{renderTree(node.children, level + 1)}
- )} -
- ); + const handleToggle = useCallback((id: string) => { + setExpandedIds((prev) => { + const next = new Set(prev); + if (next.has(id)) { + next.delete(id); + } else { + next.add(id); + } + return next; }); - }, - [isLeaf, visibleExpandedIds, value, handleSelect], - ); + }, []); - return ( - - - - - - {showSearch && ( -
- - setSearchTerm(e.target.value)} - /> -
- )} -
e.stopPropagation()} + > + + {renderSelected + ? renderSelected(selectedNode) + : selectedNode?.title || + placeholder || + t('common.pleaseSelect')} + +
+ {allowClear && value ? ( + + ) : ( + + )} +
+ + + - {filteredData.length > 0 ? ( - renderTree(filteredData) - ) : ( -
- {t('common.noData')} + {showSearch && ( +
+ + setSearchTerm(e.target.value)} + />
)} -
-
- - ); -} +
e.stopPropagation()} + > + {filteredData.length > 0 ? ( + renderTree(filteredData) + ) : ( +
+ {t('common.noData')} +
+ )} +
+ + + ); + }, +); diff --git a/web/src/pages/agent/canvas/node/tool-node.tsx b/web/src/pages/agent/canvas/node/tool-node.tsx index 6b014dc2f5..ec612a5dc6 100644 --- a/web/src/pages/agent/canvas/node/tool-node.tsx +++ b/web/src/pages/agent/canvas/node/tool-node.tsx @@ -54,13 +54,13 @@ function InnerToolNode({ /> - {(x) => { + {(x, idx) => { if (Reflect.has(x, 'mcp_id')) { const mcp = x as unknown as IAgentForm['mcp'][number]; return ( { if (mcp.mcp_id === Operator.Code) { e.preventDefault(); @@ -79,7 +79,7 @@ function InnerToolNode({ return ( { if (tool.component_name === Operator.Code) { e.preventDefault(); diff --git a/web/src/pages/agent/form/agent-form/agent-tools.tsx b/web/src/pages/agent/form/agent-form/agent-tools.tsx index 239e54b185..8074f3807a 100644 --- a/web/src/pages/agent/form/agent-form/agent-tools.tsx +++ b/web/src/pages/agent/form/agent-form/agent-tools.tsx @@ -39,25 +39,21 @@ export function ToolCard({ isNodeTool = true, ...props }: ToolCardProps) { - const element = useMemo(() => { - return ( - - {children} - - ); - }, [children, className, isNodeTool, props]); - if (children === Operator.Code) { return ( - {element} + + + {children} + +

It doesn't have any config.

@@ -65,7 +61,18 @@ export function ToolCard({ ); } - return element; + return ( + + {children} + + ); } type ActionButtonProps = { @@ -131,22 +138,22 @@ export function AgentTools() {
{t('flow.tools')}
    - {tools.map(({ id, component_name, name }) => ( - + {tools.map(({ id, component_name, name }, idx) => ( +
    {component_name === Operator.Retrieval ? name : component_name}
    ))} - {mcpIds.map((id) => ( - + {mcpIds.map((id, idx) => ( + {findMcpById(id)?.name}