{"id":204,"date":"2025-12-30T15:42:12","date_gmt":"2025-12-30T07:42:12","guid":{"rendered":"https:\/\/connectword.dpdns.org\/?p=204"},"modified":"2025-12-30T15:42:12","modified_gmt":"2025-12-30T07:42:12","slug":"how-to-build-a-robust-multi-agent-pipeline-using-camel-with-planning-web-augmented-reasoning-critique-and-persistent-memory","status":"publish","type":"post","link":"https:\/\/connectword.dpdns.org\/?p=204","title":{"rendered":"How to Build a Robust Multi-Agent Pipeline Using CAMEL with Planning, Web-Augmented Reasoning, Critique, and Persistent Memory"},"content":{"rendered":"<p>In this tutorial, we build an advanced, end-to-end multi-agent research workflow using the <a href=\"https:\/\/github.com\/camel-ai\/camel\"><strong>CAMEL<\/strong><\/a> framework. We design a coordinated society of agents, Planner, Researcher, Writer, Critic, and Finalizer, that collaboratively transform a high-level topic into a polished, evidence-grounded research brief. We securely integrate the OpenAI API, orchestrate agent interactions programmatically, and add lightweight persistent memory to retain knowledge across runs. By structuring the system around clear roles, JSON-based contracts, and iterative refinement, we demonstrate how CAMEL can be used to construct reliable, controllable, and scalable agentic pipelines. Check out the\u00a0<strong><a href=\"https:\/\/github.com\/Marktechpost\/AI-Tutorial-Codes-Included\/blob\/main\/AI%20Agents%20Codes\/camel_multi_agent_research_pipeline_Marktechpost.ipynb\" target=\"_blank\" rel=\"noreferrer noopener\">FULL CODES here<\/a><\/strong>.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\" no-line-numbers\"><code class=\" no-wrap language-php\">!pip -q install \"camel-ai[all]\" \"python-dotenv\" \"rich\"\n\n\nimport os\nimport json\nimport time\nfrom typing import Dict, Any\nfrom rich import print as rprint\n\n\ndef load_openai_key() -&gt; str:\n   key = None\n   try:\n       from google.colab import userdata\n       key = userdata.get(\"OPENAI_API_KEY\")\n   except Exception:\n       key = None\n   if not key:\n       import getpass\n       key = getpass.getpass(\"Enter OPENAI_API_KEY (hidden): \").strip()\n   if not key:\n       raise ValueError(\"OPENAI_API_KEY is required.\")\n   return key\n\n\nos.environ[\"OPENAI_API_KEY\"] = load_openai_key()<\/code><\/pre>\n<\/div>\n<\/div>\n<p>We set up the execution environment and securely load the OpenAI API key using Colab secrets or a hidden prompt. We ensure the runtime is ready by installing dependencies and configuring authentication so the workflow can run safely without exposing credentials. Check out the\u00a0<strong><a href=\"https:\/\/github.com\/Marktechpost\/AI-Tutorial-Codes-Included\/blob\/main\/AI%20Agents%20Codes\/camel_multi_agent_research_pipeline_Marktechpost.ipynb\" target=\"_blank\" rel=\"noreferrer noopener\">FULL CODES here<\/a><\/strong>.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\" no-line-numbers\"><code class=\" no-wrap language-php\">from camel.models import ModelFactory\nfrom camel.types import ModelPlatformType, ModelType\nfrom camel.agents import ChatAgent\nfrom camel.toolkits import SearchToolkit\n\n\nMODEL_CFG = {\"temperature\": 0.2}\n\n\nmodel = ModelFactory.create(\n   model_platform=ModelPlatformType.OPENAI,\n   model_type=ModelType.GPT_4O,\n   model_config_dict=MODEL_CFG,\n)\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p>We initialize the CAMEL model configuration and create a shared language model instance using the ModelFactory abstraction. We standardize model behavior across all agents to ensure consistent, reproducible reasoning throughout the multi-agent pipeline. Check out the\u00a0<strong><a href=\"https:\/\/github.com\/Marktechpost\/AI-Tutorial-Codes-Included\/blob\/main\/AI%20Agents%20Codes\/camel_multi_agent_research_pipeline_Marktechpost.ipynb\" target=\"_blank\" rel=\"noreferrer noopener\">FULL CODES here<\/a><\/strong>.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\" no-line-numbers\"><code class=\" no-wrap language-php\">MEM_PATH = \"camel_memory.json\"\n\n\ndef mem_load() -&gt; Dict[str, Any]:\n   if not os.path.exists(MEM_PATH):\n       return {\"runs\": []}\n   with open(MEM_PATH, \"r\", encoding=\"utf-8\") as f:\n       return json.load(f)\n\n\ndef mem_save(mem: Dict[str, Any]) -&gt; None:\n   with open(MEM_PATH, \"w\", encoding=\"utf-8\") as f:\n       json.dump(mem, f, ensure_ascii=False, indent=2)\n\n\ndef mem_add_run(topic: str, artifacts: Dict[str, str]) -&gt; None:\n   mem = mem_load()\n   mem[\"runs\"].append({\"ts\": int(time.time()), \"topic\": topic, \"artifacts\": artifacts})\n   mem_save(mem)\n\n\ndef mem_last_summaries(n: int = 3) -&gt; str:\n   mem = mem_load()\n   runs = mem.get(\"runs\", [])[-n:]\n   if not runs:\n       return \"No past runs.\"\n   return \"n\".join([f\"{i+1}. topic={r['topic']} | ts={r['ts']}\" for i, r in enumerate(runs)])<\/code><\/pre>\n<\/div>\n<\/div>\n<p>We implement a lightweight persistent memory layer backed by a JSON file. We store artifacts from each run and retrieve summaries of previous executions, allowing us to introduce continuity and historical context across sessions. Check out the\u00a0<strong><a href=\"https:\/\/github.com\/Marktechpost\/AI-Tutorial-Codes-Included\/blob\/main\/AI%20Agents%20Codes\/camel_multi_agent_research_pipeline_Marktechpost.ipynb\" target=\"_blank\" rel=\"noreferrer noopener\">FULL CODES here<\/a><\/strong>.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\" no-line-numbers\"><code class=\" no-wrap language-php\">def make_agent(role: str, goal: str, extra_rules: str = \"\") -&gt; ChatAgent:\n   system = (\n       f\"You are {role}.n\"\n       f\"Goal: {goal}n\"\n       f\"{extra_rules}n\"\n       \"Output must be crisp, structured, and directly usable by the next agent.\"\n   )\n   return ChatAgent(model=model, system_message=system)\n\n\nplanner = make_agent(\n   \"Planner\",\n   \"Create a compact plan and research questions with acceptance criteria.\",\n   \"Return JSON with keys: plan, questions, acceptance_criteria.\"\n)\n\n\nresearcher = make_agent(\n   \"Researcher\",\n   \"Answer questions using web search results.\",\n   \"Return JSON with keys: findings, sources, open_questions.\"\n)\n\n\nwriter = make_agent(\n   \"Writer\",\n   \"Draft a structured research brief.\",\n   \"Return Markdown only.\"\n)\n\n\ncritic = make_agent(\n   \"Critic\",\n   \"Identify weaknesses and suggest fixes.\",\n   \"Return JSON with keys: issues, fixes, rewrite_instructions.\"\n)\n\n\nfinalizer = make_agent(\n   \"Finalizer\",\n   \"Produce the final improved brief.\",\n   \"Return Markdown only.\"\n)\n\n\nsearch_tool = SearchToolkit().search_duckduckgo\nresearcher = ChatAgent(\n   model=model,\n   system_message=researcher.system_message,\n   tools=[search_tool],\n)\n<\/code><\/pre>\n<\/div>\n<\/div>\n<p>We define the core agent roles and their responsibilities within the workflow. We construct specialized agents with clear goals and output contracts, and we enhance the Researcher by attaching a web search tool for evidence-grounded responses. Check out the\u00a0<strong><a href=\"https:\/\/github.com\/Marktechpost\/AI-Tutorial-Codes-Included\/blob\/main\/AI%20Agents%20Codes\/camel_multi_agent_research_pipeline_Marktechpost.ipynb\" target=\"_blank\" rel=\"noreferrer noopener\">FULL CODES here<\/a><\/strong>.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\" no-line-numbers\"><code class=\" no-wrap language-php\">def step_json(agent: ChatAgent, prompt: str) -&gt; Dict[str, Any]:\n   res = agent.step(prompt)\n   txt = res.msgs[0].content.strip()\n   try:\n       return json.loads(txt)\n   except Exception:\n       return {\"raw\": txt}\n\n\ndef step_text(agent: ChatAgent, prompt: str) -&gt; str:\n   res = agent.step(prompt)\n   return res.msgs[0].content<\/code><\/pre>\n<\/div>\n<\/div>\n<p>We abstract interaction patterns with agents into helper functions that enforce structured JSON or free-text outputs. We simplify orchestration by handling parsing and fallback logic centrally, making the pipeline more robust to formatting variability. Check out the\u00a0<strong><a href=\"https:\/\/github.com\/Marktechpost\/AI-Tutorial-Codes-Included\/blob\/main\/AI%20Agents%20Codes\/camel_multi_agent_research_pipeline_Marktechpost.ipynb\" target=\"_blank\" rel=\"noreferrer noopener\">FULL CODES here<\/a><\/strong>.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\" no-line-numbers\"><code class=\" no-wrap language-php\">def run_workflow(topic: str) -&gt; Dict[str, str]:\n   rprint(mem_last_summaries(3))\n\n\n   plan = step_json(\n       planner,\n       f\"Topic: {topic}nCreate a tight plan and research questions.\"\n   )\n\n\n   research = step_json(\n       researcher,\n       f\"Research the topic using web search.n{json.dumps(plan)}\"\n   )\n\n\n   draft = step_text(\n       writer,\n       f\"Write a research brief using:n{json.dumps(research)}\"\n   )\n\n\n   critique = step_json(\n       critic,\n       f\"Critique the draft:n{draft}\"\n   )\n\n\n   final = step_text(\n       finalizer,\n       f\"Rewrite using critique:n{json.dumps(critique)}nDraft:n{draft}\"\n   )\n\n\n   artifacts = {\n       \"plan_json\": json.dumps(plan, indent=2),\n       \"research_json\": json.dumps(research, indent=2),\n       \"draft_md\": draft,\n       \"critique_json\": json.dumps(critique, indent=2),\n       \"final_md\": final,\n   }\n\n\n   mem_add_run(topic, artifacts)\n   return artifacts\n\n\nTOPIC = \"Agentic multi-agent research workflow with quality control\"\nartifacts = run_workflow(TOPIC)\nprint(artifacts[\"final_md\"])<\/code><\/pre>\n<\/div>\n<\/div>\n<p>We orchestrate the complete multi-agent workflow from planning to finalization. We sequentially pass artifacts between agents, apply critique-driven refinement, persist results to memory, and produce a finalized research brief ready for downstream use.<\/p>\n<p>In conclusion, we implemented a practical CAMEL-based multi-agent system that mirrors real-world research and review workflows. We showed how clearly defined agent roles, tool-augmented reasoning, and critique-driven refinement lead to higher-quality outputs while reducing hallucinations and structural weaknesses. We also established a foundation for extensibility by persisting artifacts and enabling reuse across sessions. This approach allows us to move beyond single-prompt interactions and toward robust agentic systems that can be adapted for research, analysis, reporting, and decision-support tasks at scale.<\/p>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<p>Check out the\u00a0<strong><a href=\"https:\/\/github.com\/Marktechpost\/AI-Tutorial-Codes-Included\/blob\/main\/AI%20Agents%20Codes\/camel_multi_agent_research_pipeline_Marktechpost.ipynb\" target=\"_blank\" rel=\"noreferrer noopener\">FULL CODES here<\/a><\/strong>.\u00a0Also,\u00a0feel free to follow us on\u00a0<strong><a href=\"https:\/\/x.com\/intent\/follow?screen_name=marktechpost\" target=\"_blank\" rel=\"noreferrer noopener\"><mark>Twitter<\/mark><\/a><\/strong>\u00a0and don\u2019t forget to join our\u00a0<strong><a href=\"https:\/\/www.reddit.com\/r\/machinelearningnews\/\" target=\"_blank\" rel=\"noreferrer noopener\">100k+ ML SubReddit<\/a><\/strong>\u00a0and Subscribe to\u00a0<strong><a href=\"https:\/\/www.aidevsignals.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">our Newsletter<\/a><\/strong>. Wait! are you on telegram?\u00a0<strong><a href=\"https:\/\/t.me\/machinelearningresearchnews\" target=\"_blank\" rel=\"noreferrer noopener\">now you can join us on telegram as well.<\/a><\/strong><\/p>\n<p>The post <a href=\"https:\/\/www.marktechpost.com\/2025\/12\/29\/how-to-build-a-robust-multi-agent-pipeline-using-camel-with-planning-web-augmented-reasoning-critique-and-persistent-memory\/\">How to Build a Robust Multi-Agent Pipeline Using CAMEL with Planning, Web-Augmented Reasoning, Critique, and Persistent Memory<\/a> appeared first on <a href=\"https:\/\/www.marktechpost.com\/\">MarkTechPost<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>In this tutorial, we build an &hellip;<\/p>\n","protected":false},"author":1,"featured_media":29,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-204","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=\/wp\/v2\/posts\/204","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=204"}],"version-history":[{"count":0,"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=\/wp\/v2\/posts\/204\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=\/wp\/v2\/media\/29"}],"wp:attachment":[{"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=204"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=204"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=204"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}