<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Nomadev</title>
    <description>The latest articles on Forem by Nomadev (@thenomadevel).</description>
    <link>https://forem.com/thenomadevel</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F746775%2F31f80a29-e4d4-475b-9cd6-557690ca7e01.jpg</url>
      <title>Forem: Nomadev</title>
      <link>https://forem.com/thenomadevel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/thenomadevel"/>
    <language>en</language>
    <item>
      <title>Everything you need to know about AI this week</title>
      <dc:creator>Nomadev</dc:creator>
      <pubDate>Sat, 04 Oct 2025 20:40:45 +0000</pubDate>
      <link>https://forem.com/thenomadevel/everything-you-need-to-know-about-ai-this-week-4akl</link>
      <guid>https://forem.com/thenomadevel/everything-you-need-to-know-about-ai-this-week-4akl</guid>
      <description>&lt;p&gt;Hey there, &lt;a href="https://x.com/thenomadevel" rel="noopener noreferrer"&gt;Nomadev&lt;/a&gt; here! If you're reading this, you're probably as excited about AI as I am. Every week brings something new, with fresh models, smarter agents, and ideas that push the limits of what we can build.&lt;/p&gt;

&lt;p&gt;So I thought I’d make it easier for you to stay in the loop.&lt;br&gt;
Here’s a quick roundup of everything that happened in AI this week, covering updates from OpenAI, Anthropic, Nvidia, IBM, and more.&lt;/p&gt;

&lt;p&gt;Whether you’re a developer, a researcher, or just an AI enthusiast who loves seeing how fast this space moves, this is your quick catch-up. Let’s dive in! 🚀&lt;/p&gt;
&lt;h3&gt;
  
  
  1. &lt;a href="https://x.com/OpenAI/status/1973075422058623274" rel="noopener noreferrer"&gt;OpenAI Sora 2&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0cugpnwo3dctzlfrjvcz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0cugpnwo3dctzlfrjvcz.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sora 2 is OpenAI’s next big leap in video generation, turning simple text prompts into high-fidelity, cinematic visuals.&lt;br&gt;&lt;br&gt;
Whether you want to create storyboards, concept videos, or just explore visual storytelling with AI, Sora 2 makes it feel effortless.&lt;br&gt;&lt;br&gt;
This isn't just an upgrade, it's a preview of how creative workflows will change.&lt;/p&gt;

&lt;p&gt;Here’s how Sora 2 makes things magical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Realistic Motion&lt;/strong&gt;: Smooth, consistent movement across scenes with fewer artifacts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scene Coherence&lt;/strong&gt;: Objects and subjects stay consistent throughout the generated video.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camera Control&lt;/strong&gt;: Prompts can influence angle, zoom, and transitions for more directed storytelling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better Prompts = Better Results&lt;/strong&gt;: Try describing mood, lighting, and movement for high-quality outputs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built for Creators&lt;/strong&gt;: Ideal for product ads, mood boards, music videos, and explainer visuals.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OpenAI is gradually rolling it out to trusted partners.&lt;br&gt;&lt;br&gt;
In the meantime, follow the latest updates from &lt;a href="https://x.com/OpenAI/status/1973075422058623274" rel="noopener noreferrer"&gt;OpenAI on X&lt;/a&gt; and start crafting prompts of your own.&lt;/p&gt;

&lt;p&gt;Sora 2 isn't just a video tool, it's your creative assistant on turbo mode.&lt;/p&gt;


&lt;h3&gt;
  
  
  2. &lt;a href="https://x.com/Alibaba_Qwen/status/1974289216113947039" rel="noopener noreferrer"&gt;Qwen3-VL-30B-A3B Instruct &amp;amp; Thinking&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fektoosfpoqrv42zv6awa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fektoosfpoqrv42zv6awa.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alibaba’s Qwen team launched Qwen3-VL-30B-A3B Instruct &amp;amp; Thinking, a new generation of large vision-language models.&lt;br&gt;&lt;br&gt;
With just 3B active parameters, it delivers powerhouse performance while staying lightweight and efficient.&lt;br&gt;&lt;br&gt;
This release brings all the capabilities of Qwen3-VL in a smaller but sharper package.&lt;/p&gt;

&lt;p&gt;Here’s why Qwen3-VL-30B-A3B stands out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Big performance, small footprint&lt;/strong&gt;: 3B active parameters rival GPT‑5 Mini and Claude 4 Sonnet on many benchmarks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wide skill range&lt;/strong&gt;: STEM problem solving, VQA, OCR, Video understanding, and Agent tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistent wins&lt;/strong&gt;: Outperforms bigger models across multiple evaluation benchmarks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;All-in-one model&lt;/strong&gt;: Instruct and “Thinking” variants available for different reasoning tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimized for developers&lt;/strong&gt;: A more accessible, high-quality open model for experimentation and deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Qwen3-VL-30B-A3B isn't just another model release, it's a serious competitor bringing high-end performance into a smaller footprint.&lt;br&gt;&lt;br&gt;
Follow their updates on &lt;a href="https://x.com/Alibaba_Qwen/status/1974289216113947039" rel="noopener noreferrer"&gt;Qwen's official X account&lt;/a&gt; to stay ahead.&lt;/p&gt;


&lt;h3&gt;
  
  
  3. &lt;a href="https://x.com/AntLingAGI/status/1972711364876697612" rel="noopener noreferrer"&gt;AntLing Ring-1T: 1 Trillion Open-Source Thinking Model&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkdhhebalx0g1olinungz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkdhhebalx0g1olinungz.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AntLingAGI just launched Ring-1T, the &lt;strong&gt;first open-source model with 1 trillion parameters&lt;/strong&gt; focused on deep thinking and reasoning tasks.&lt;br&gt;&lt;br&gt;
Early benchmarks show strong results across math, logic, and natural language problems, with impressive performance on high-difficulty benchmarks.&lt;/p&gt;

&lt;p&gt;Here’s why Ring-1T is a big deal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1 Trillion Parameters&lt;/strong&gt;: One of the largest open-source models ever released.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strong benchmarks&lt;/strong&gt;: Scored 92.6 on AIME25, 84.5 on HMMT25, and 94.7 on CF (Competition Format) tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IMO-level math&lt;/strong&gt;: Solved IMO25 Q3 in one shot, and showed progress on Q1, Q2, Q4, and Q5.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open and evolving&lt;/strong&gt;: Still improving, and already competitive with top models like GPT-5 Thinking and DeepSeek Terminus.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Designed for thinkers&lt;/strong&gt;: Built for reasoning-heavy tasks like coding competitions, math olympiads, and logic-based prompts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're exploring reasoning agents or want to go beyond general chat models, Ring-1T is worth a test run.  &lt;/p&gt;


&lt;h3&gt;
  
  
  4. &lt;a href="https://x.com/claudeai/status/1972706807345725773" rel="noopener noreferrer"&gt;Claude Sonnet 4.5: Best Model for Agentic Coding&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb4bjjeu9tua8m7u7pexb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb4bjjeu9tua8m7u7pexb.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anthropic launched Claude Sonnet 4.5, their &lt;strong&gt;strongest model yet&lt;/strong&gt; for building agentic systems and reasoning with computers.&lt;br&gt;&lt;br&gt;
It’s designed specifically to help developers create smarter agents, solve logic-heavy tasks, and write more reliable code.&lt;/p&gt;

&lt;p&gt;Here’s what makes Claude Sonnet 4.5 stand out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Top-tier agentic coding&lt;/strong&gt;: Scored 77.2% on SWE-Bench (code reasoning) and 82.0% when allowed to use external tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Big jump in logic tasks&lt;/strong&gt;: Terminal-Bench, high school math, and graduate-level reasoning scores have all improved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool-use ready&lt;/strong&gt;: Claude Sonnet 4.5 shows strong performance in l2-bench, which measures how well agents use tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best at math and reasoning&lt;/strong&gt;: Scored 100% on AIME 2025, 83.4% on GPAQ, and leads in multilingual Q&amp;amp;A tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built for real-world agents&lt;/strong&gt;: Especially good at using computers, coding agents, and handling complex toolchains.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building serious AI agents or systems that interact with files, tools, or structured data, Claude Sonnet 4.5 is worth a deep dive.&lt;br&gt;&lt;br&gt;
Check out &lt;a href="https://x.com/claudeai/status/1972706807345725773" rel="noopener noreferrer"&gt;Anthropic's official post&lt;/a&gt; for more benchmarks.&lt;/p&gt;


&lt;h3&gt;
  
  
  5. &lt;a href="https://x.com/Zai_org/status/1973034639708344767" rel="noopener noreferrer"&gt;GLM-4.6: Agentic, Reasoning, and Coding Powerhouse&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmum3floi1dsnaftafkh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmum3floi1dsnaftafkh.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Zhipu AI introduced GLM‑4.6, a flagship model built for real-world coding, reasoning, and long-context understanding.&lt;br&gt;&lt;br&gt;
It’s designed for developers building advanced agentic systems, and performs especially well in tasks that require tool use, search, and logic.&lt;/p&gt;

&lt;p&gt;Why GLM‑4.6 is worth a look:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent-ready&lt;/strong&gt;: Optimized for agentic workflows, coding, and task planning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handles long context&lt;/strong&gt;: Supports input lengths of up to 200,000 tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competitive benchmarks&lt;/strong&gt;: Scores on AIME 25, GPQA, HLE, and Terminal-Bench match or exceed Claude Sonnet 4.5 and DeepSeek.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strong in reasoning and tools&lt;/strong&gt;: Excels in long reasoning chains, tool use tasks, and multistep problem solving.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built for devs&lt;/strong&gt;: Targeted toward real coding and automation use cases, not just chatbot-style interaction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can follow updates and access the API from &lt;a href="https://x.com/Zai_org/status/1973034639708344767" rel="noopener noreferrer"&gt;Zhipu's official post&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
GLM‑4.6 is shaping up to be one of the most versatile open models in the agent ecosystem.&lt;/p&gt;


&lt;h3&gt;
  
  
  6. Coral v1: Launch and Monetize AI Agents
&lt;/h3&gt;

&lt;p&gt;

&lt;iframe class="tweet-embed" id="tweet-1973071657821675594-847" src="https://platform.twitter.com/embed/Tweet.html?id=1973071657821675594"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1973071657821675594-847');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1973071657821675594&amp;amp;theme=dark"
  }





&lt;/p&gt;

&lt;p&gt;Coral Protocol launched v1, unlocking a full-stack system to &lt;strong&gt;orchestrate, monetize, and deploy AI agents&lt;/strong&gt; at scale.&lt;br&gt;&lt;br&gt;
It aims to power the “agent economy” by letting anyone turn AI agents into reusable and monetizable software units.&lt;/p&gt;

&lt;p&gt;Here’s how Coral v1 makes it happen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No lock-in&lt;/strong&gt;: Reuse AI agents built with any framework or language.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Launch-ready&lt;/strong&gt;: Deploy agents without having to build infrastructure from scratch.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open marketplace&lt;/strong&gt;: Publish agents for others to use, collaborate, or buy.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in monetization&lt;/strong&gt;: Sell or license your agents and earn from contributions.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built for scale&lt;/strong&gt;: Perfect for solo devs and startups looking to ship quickly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're working on AI products and want to plug into a growing ecosystem, Coral v1 might be the missing link.&lt;/p&gt;


&lt;h3&gt;
  
  
  7. &lt;a href="https://x.com/NotebookLM/status/1973892897163653429" rel="noopener noreferrer"&gt;NotebookLM: Customizable Chat Experience&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpjvhxmgx83f8ynd3njyo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpjvhxmgx83f8ynd3njyo.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NotebookLM introduced a new personalization layer for its chat interface, letting users &lt;strong&gt;tailor the conversation flow&lt;/strong&gt; to better fit their learning and working styles.&lt;br&gt;&lt;br&gt;
Whether you're using it as a study guide or an assistant, it now adapts more deeply to your preferences.&lt;/p&gt;

&lt;p&gt;Here’s what’s new in NotebookLM:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Custom response length&lt;/strong&gt;: Choose how short or long the answers should be.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adjustable conversation style&lt;/strong&gt;: Toggle between concise, explanatory, or question-driven replies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning Guide mode&lt;/strong&gt;: A new style that tests and reinforces your understanding of the material.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Focus on depth&lt;/strong&gt;: Designed to go beyond summarization and promote deeper reasoning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Great for students and researchers&lt;/strong&gt;: Ideal for learning workflows or guided comprehension.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can explore the updates from &lt;a href="https://x.com/NotebookLM/status/1973892897163653429" rel="noopener noreferrer"&gt;NotebookLM's announcement here&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
This update brings NotebookLM closer to becoming a personalized tutor in your pocket.&lt;/p&gt;


&lt;h3&gt;
  
  
  8. &lt;a href="https://x.com/perplexity_ai/status/1973795224960032857" rel="noopener noreferrer"&gt;Comet by Perplexity: Now Available Globally&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;

&lt;iframe class="tweet-embed" id="tweet-1973795224960032857-745" src="https://platform.twitter.com/embed/Tweet.html?id=1973795224960032857"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1973795224960032857-745');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1973795224960032857&amp;amp;theme=dark"
  }





&lt;/p&gt;

&lt;p&gt;Comet, Perplexity’s personal AI assistant, is now officially available to everyone worldwide.&lt;br&gt;&lt;br&gt;
After spending 84 days in waitlist mode, millions of users have joined to explore a new way of using the internet.&lt;/p&gt;

&lt;p&gt;Here’s what Comet brings to the table:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Personal AI assistant&lt;/strong&gt;: Designed to help you search, think, and learn faster online.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conversational search&lt;/strong&gt;: Combines real-time information retrieval with chat-style interaction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Waitlist is over&lt;/strong&gt;: No more invites needed. Anyone can try it out right now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Focus on usability&lt;/strong&gt;: Built for everyday internet users who want smarter answers, faster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-enhanced browsing&lt;/strong&gt;: Think of it as a more intelligent search engine that talks back.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can watch the official announcement and explore Comet from &lt;a href="https://x.com/perplexity_ai/status/1973795224960032857" rel="noopener noreferrer"&gt;Perplexity's post&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
Whether you're researching or just curious, Comet gives you a fresh way to browse.&lt;/p&gt;


&lt;h3&gt;
  
  
  9. DeepSeek-V3.2-Exp: Faster, Smarter, Cheaper
&lt;/h3&gt;

&lt;p&gt;

&lt;iframe class="tweet-embed" id="tweet-1972604768309871061-543" src="https://platform.twitter.com/embed/Tweet.html?id=1972604768309871061"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1972604768309871061-543');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1972604768309871061&amp;amp;theme=dark"
  }





&lt;/p&gt;

&lt;p&gt;DeepSeek released V3.2-Exp, their latest &lt;strong&gt;experimental model&lt;/strong&gt; built on the V3.1-Terminus architecture.&lt;br&gt;&lt;br&gt;
It introduces &lt;strong&gt;DeepSeek Sparse Attention (DSA)&lt;/strong&gt;, enabling faster inference and training, especially for long-context processing.&lt;/p&gt;

&lt;p&gt;Here’s what’s new:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sparse Attention mechanism&lt;/strong&gt;: Improves speed and efficiency on large inputs.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live across platforms&lt;/strong&gt;: Available now via App, Web, and API.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;50%+ cheaper&lt;/strong&gt;: Major price cuts for API usage.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Focused on real-world use&lt;/strong&gt;: Great for apps needing fast and scalable model calls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're optimizing cost, speed, and context length in your LLM workflows, DeepSeek-V3.2-Exp is worth exploring.&lt;/p&gt;


&lt;h3&gt;
  
  
  10. Granite 4.0 by IBM: Lightweight Models for Local Use
&lt;/h3&gt;

&lt;p&gt;

&lt;iframe class="tweet-embed" id="tweet-1973784183492485277-155" src="https://platform.twitter.com/embed/Tweet.html?id=1973784183492485277"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1973784183492485277-155');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1973784183492485277&amp;amp;theme=dark"
  }





&lt;/p&gt;

&lt;p&gt;IBM just released &lt;strong&gt;Granite 4.0&lt;/strong&gt;, a new series of small language models built for agentic tasks, RAG, and document analysis.&lt;br&gt;&lt;br&gt;
What’s most exciting is the &lt;strong&gt;Micro (3.4B)&lt;/strong&gt; variant that runs &lt;strong&gt;entirely in your browser using WebGPU&lt;/strong&gt;, with no server needed.&lt;/p&gt;

&lt;p&gt;Why Granite 4.0 matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Runs locally&lt;/strong&gt;: The Micro model can run 100% on-device in your browser with &lt;code&gt;Transformers.js&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy-friendly&lt;/strong&gt;: No data is sent to a server, and it can work offline after loading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast and efficient&lt;/strong&gt;: Designed for quick in-browser inference and lightweight deployments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Great for edge cases&lt;/strong&gt;: Perfect for building low-latency, privacy-sensitive apps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're looking for compact models that work offline, Granite 4.0 opens up exciting new possibilities.&lt;/p&gt;


&lt;h3&gt;
  
  
  11. Nano Banana by Google DeepMind: Production-Ready Image Model
&lt;/h3&gt;

&lt;p&gt;

&lt;iframe class="tweet-embed" id="tweet-1973781293977735435-473" src="https://platform.twitter.com/embed/Tweet.html?id=1973781293977735435"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1973781293977735435-473');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1973781293977735435&amp;amp;theme=dark"
  }





&lt;/p&gt;

&lt;p&gt;Google DeepMind released a full guide for using &lt;strong&gt;Nano Banana&lt;/strong&gt;, a production-ready image generation model that’s part of the Gemini 2.5 Flash stack.&lt;br&gt;&lt;br&gt;
It’s designed for developers who need dynamic image outputs with more control and flexibility.&lt;/p&gt;

&lt;p&gt;Why Nano Banana stands out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image-only mode&lt;/strong&gt;: Generate just visuals without extra text or padding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creative freedom&lt;/strong&gt;: Specify aspect ratios and fine-tune composition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built for scale&lt;/strong&gt;: Suitable for production environments, not just demos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini-compatible&lt;/strong&gt;: Works seamlessly within Google’s Gemini AI ecosystem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building visually dynamic apps or want to embed reliable image generation into your product flow, Nano Banana is worth checking out.&lt;/p&gt;


&lt;h3&gt;
  
  
  12. Unlock the Full Potential of Your Mac with Spec
&lt;/h3&gt;

&lt;p&gt;

&lt;iframe class="tweet-embed" id="tweet-1973753629367836979-824" src="https://platform.twitter.com/embed/Tweet.html?id=1973753629367836979"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1973753629367836979-824');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1973753629367836979&amp;amp;theme=dark"
  }





&lt;/p&gt;

&lt;p&gt;Spec brings AI memory and smart automation to your Mac.&lt;br&gt;&lt;br&gt;
It proactively drafts replies, summarizes documents, and helps you stay organized across all your tools — before you even ask.&lt;/p&gt;

&lt;p&gt;Why Spec feels like a brain for your Mac:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cross-app memory&lt;/strong&gt;: Connects knowledge across iMessage, Slack, email, and calendar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No more context switching&lt;/strong&gt;: Everything feels unified and accessible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Helpful before you ask&lt;/strong&gt;: Anticipates needs and assists proactively.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boosts productivity&lt;/strong&gt;: Great for people juggling comms, docs, and deadlines.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your daily workflow lives across multiple apps, Spec might be the assistant you didn't know you needed.&lt;/p&gt;


&lt;h3&gt;
  
  
  13. Composer: The First AI Agent for Document Processing
&lt;/h3&gt;

&lt;p&gt;

&lt;iframe class="tweet-embed" id="tweet-1973039396539465904-512" src="https://platform.twitter.com/embed/Tweet.html?id=1973039396539465904"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1973039396539465904-512');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1973039396539465904&amp;amp;theme=dark"
  }





&lt;/p&gt;

&lt;p&gt;Composer is built to tackle one of the most common but painful workflows — document processing.&lt;br&gt;&lt;br&gt;
It promises &lt;strong&gt;production-grade accuracy in under 10 minutes&lt;/strong&gt; with no complex setup.&lt;/p&gt;

&lt;p&gt;Here’s why Composer is exciting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;99% accuracy&lt;/strong&gt;: Some early users reported near-perfect results on schema-heavy docs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minutes, not hours&lt;/strong&gt;: Gets up and running in under 10 minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built for scale&lt;/strong&gt;: Designed for teams that process lots of structured documents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic optimization&lt;/strong&gt;: Learns and adapts to recurring document types and formats.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're in finance, HR, legal, or ops — Composer could be your new best friend.&lt;/p&gt;


&lt;h3&gt;
  
  
  14. C1 by Thesys: Generative UI for LLMs
&lt;/h3&gt;

&lt;p&gt;

&lt;iframe class="tweet-embed" id="tweet-1972924633499554246-577" src="https://platform.twitter.com/embed/Tweet.html?id=1972924633499554246"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1972924633499554246-577');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1972924633499554246&amp;amp;theme=dark"
  }





&lt;/p&gt;

&lt;p&gt;C1 is a powerful new API that lets LLMs respond with &lt;strong&gt;rich interactive UIs&lt;/strong&gt;, not just plain text.&lt;br&gt;&lt;br&gt;
Created by Thesys, it aims to change how AI interfaces work — moving beyond chat into charts, forms, and cards.&lt;/p&gt;

&lt;p&gt;What makes C1 different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interactive responses&lt;/strong&gt;: LLMs can now return UI components like charts or inputs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Great for apps&lt;/strong&gt;: Useful in dashboards, admin panels, education tools, and assistants.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plug-and-play&lt;/strong&gt;: Easily integrates with existing LLM pipelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Launch perks&lt;/strong&gt;: They offered up to 5M tokens free on Product Hunt.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've been dreaming of "ChatGPT meets Notion-style UI," this API brings it closer to reality.&lt;/p&gt;


&lt;h3&gt;
  
  
  15. CrewAI Launches AMP: The OS for AI Agents
&lt;/h3&gt;

&lt;p&gt;

&lt;iframe class="tweet-embed" id="tweet-1974174579863261540-584" src="https://platform.twitter.com/embed/Tweet.html?id=1974174579863261540"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1974174579863261540-584');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1974174579863261540&amp;amp;theme=dark"
  }





&lt;/p&gt;

&lt;p&gt;CrewAI just launched &lt;strong&gt;AMP&lt;/strong&gt;, their Agent Management Platform, designed to be the &lt;strong&gt;operating system for AI agents in production&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
It’s already seeing major adoption with Fortune 500 companies and public use cases.&lt;/p&gt;

&lt;p&gt;What AMP brings to the table:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent OS&lt;/strong&gt;: Centralized interface to deploy, monitor, and manage AI agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Massive scale&lt;/strong&gt;: 100K+ executions in 15 days, 30+ live use cases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise-ready&lt;/strong&gt;: Used by large corporations and public companies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow visualizer&lt;/strong&gt;: Clean UI to build complex agent pipelines visually.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re scaling agentic systems and want production-level observability and orchestration, AMP is built for you.&lt;/p&gt;
&lt;h3&gt;
  
  
  15. CrewAI Launches AMP: The OS for AI Agents
&lt;/h3&gt;

&lt;p&gt;

&lt;iframe class="tweet-embed" id="tweet-1974174579863261540-440" src="https://platform.twitter.com/embed/Tweet.html?id=1974174579863261540"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1974174579863261540-440');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1974174579863261540&amp;amp;theme=dark"
  }





&lt;/p&gt;

&lt;p&gt;CrewAI just launched &lt;strong&gt;AMP&lt;/strong&gt;, their Agent Management Platform, designed to be the &lt;strong&gt;operating system for AI agents in production&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
It’s already seeing major adoption with Fortune 500 companies and public use cases.&lt;/p&gt;

&lt;p&gt;What AMP brings to the table:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent OS&lt;/strong&gt;: Centralized interface to deploy, monitor, and manage AI agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Massive scale&lt;/strong&gt;: 100K+ executions in 15 days, 30+ live use cases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise-ready&lt;/strong&gt;: Used by large corporations and public companies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow visualizer&lt;/strong&gt;: Clean UI to build complex agent pipelines visually.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re scaling agentic systems and want production-level observability and orchestration, AMP is built for you.&lt;/p&gt;




&lt;p&gt;That’s it for this week’s AI updates.&lt;/p&gt;

&lt;p&gt;If you found something useful in here, feel free to drop a message or tag me on X. I’ll be doing this every week, so you can always come back for a quick catch-up.&lt;/p&gt;

&lt;p&gt;Follow &lt;a href="https://x.com/thenomadevel" rel="noopener noreferrer"&gt;@thenomadevel&lt;/a&gt; on X for the full thread and more updates like this.&lt;/p&gt;

&lt;p&gt;See you next week.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>What Building a Hybrid Browser Toolkit Taught Us About the Web</title>
      <dc:creator>Nomadev</dc:creator>
      <pubDate>Wed, 01 Oct 2025 19:10:57 +0000</pubDate>
      <link>https://forem.com/camelai/what-building-a-hybrid-browser-toolkit-taught-us-about-the-web-2omo</link>
      <guid>https://forem.com/camelai/what-building-a-hybrid-browser-toolkit-taught-us-about-the-web-2omo</guid>
      <description>&lt;p&gt;If you’ve ever tried browser automation, you know the drill:&lt;br&gt;
You spin up Selenium, Playwright, or Puppeteer, point it at a page, and suddenly you’re wrestling with flaky selectors, weird screenshots, or the dreaded “element not found” even though it’s right there.&lt;/p&gt;

&lt;p&gt;I’ve been there. It feels like teaching a robot to surf the web by giving it a pair of oven mitts. Sure, it clicks and scrolls, but half the time it’s guessing.&lt;/p&gt;

&lt;p&gt;At CAMEL-AI, we ran into this wall too. Our original Camel BrowserToolkit was a first attempt at solving it. It did the basics — take screenshots, inject custom IDs, and click things. But it was… let’s say, not elegant. It worked more like asking an AI to click on pictures instead of actually understanding the page.&lt;/p&gt;

&lt;p&gt;That got us thinking:&lt;br&gt;
What if the toolkit could “see” the page like a human and understand the structure like a dev?&lt;/p&gt;
&lt;h2&gt;
  
  
  From Monolith to Hybrid
&lt;/h2&gt;

&lt;p&gt;The big shift came when we re-architected things. Instead of one heavy Python process, we now have a Hybrid setup using Python and TypeScript.&lt;/p&gt;

&lt;p&gt;Python is still your scripting layer. That means you can write automation in a language most of us are comfortable with.&lt;br&gt;
TypeScript is the engine under the hood. It runs Playwright natively, handles async operations, and talks directly to the browser.&lt;/p&gt;

&lt;p&gt;The two communicate over WebSockets. So Python gives high-level commands, while TypeScript executes them efficiently.&lt;/p&gt;
&lt;h2&gt;
  
  
  Introducing the CAMEL Hybrid Browser Toolkit
&lt;/h2&gt;

&lt;p&gt;Enter the &lt;strong&gt;Hybrid Browser Toolkit&lt;/strong&gt;. We've rebuilt the toolkit from the ground up as a TypeScript–Python hybrid. In this new design, TypeScript (running on Node.js) handles the browser directly via Playwright's fast native APIs, and Python remains your friendly front-end interface.&lt;/p&gt;

&lt;p&gt;What does that buy you? Faster performance, access to all the latest Playwright features (like the new &lt;code&gt;_snapshotForAI&lt;/code&gt;), and true async event-driven power – without sacrificing the ease of Python scripting.&lt;/p&gt;

&lt;p&gt;The result is a layered architecture: your Python code talks to a TypeScript server over WebSockets. The TypeScript layer manages browser instances, DOM queries, screenshots, etc., all in the same high-performance JavaScript environment. Python just sends commands and gets structured results.&lt;/p&gt;

&lt;p&gt;This split means lower latency and better concurrency. As one example, Node's Playwright doesn't spawn a fresh process for every browser window like the Python version did, so it can manage many tabs with far less CPU and memory overhead.&lt;/p&gt;

&lt;p&gt;In short, Python becomes the brain giving high-level instructions, and TypeScript is the muscle doing the work efficiently.&lt;/p&gt;
&lt;h2&gt;
  
  
  What's Different Under the Hood
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F51cc44tjyrsao5rcc8we.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F51cc44tjyrsao5rcc8we.png" alt=" " width="800" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the legacy toolkit, every action that needed to find or click an element typically involved injecting a random ID into the page via a script, then querying it. That worked, but it felt hacky.&lt;/p&gt;

&lt;p&gt;In the hybrid toolkit, we leverage standard accessibility (ARIA) selectors and Playwright's new tools. Now you can do things like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[aria-label="Submit"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByRole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Submit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;snapshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_snapshotForAI&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// snapshot now has structured data on all elements and their ARIA roles&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Playwright's &lt;code&gt;_snapshotForAI()&lt;/code&gt; (an internal API) lets us get a rich DOM snapshot: every interactive element, its role (like button, link, textbox), labels, etc. We assign each element a ref ID and use those for all interactions. This replaces the old random-ID trick with a semantic mapping.&lt;/p&gt;

&lt;p&gt;It also means the same snapshot data fuels both text mode and the visual "set-of-marks" screenshots.&lt;/p&gt;

&lt;h3&gt;
  
  
  Set-of-Marks Screenshots
&lt;/h3&gt;

&lt;p&gt;Speaking of screenshots, the new toolkit's SoM (Set-of-Marks) screenshots are crisp and clever. We inject a small script into the page that outlines every clickable element with a little numbered marker (their ref ID).&lt;/p&gt;

&lt;p&gt;This isn't just a dumb screenshot – it knows about element overlap and tries not to mark hidden elements. If a button has an icon and text, it merges them into one mark. It even picks good positions for labels so they don't scribble over each other. (This injection-based approach in the browser is more reliable than our old memory-only screenshots.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Enhanced Stealth Mode
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9btju8x2a4jzcb9etyz2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9btju8x2a4jzcb9etyz2.png" alt=" " width="800" height="957"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We've also beefed up stealth mode. By default, Playwright can be detected by many sites (indeed, "stock" Playwright is often blocked by modern anti-bot measures.&lt;/p&gt;

&lt;p&gt;The new toolkit launches browsers with a full suite of anti-detection flags, customizable user agents, headers, etc. You can tweak a &lt;code&gt;StealthConfig&lt;/code&gt; object to set exactly which flags or headers to use. And we maintain this even across persistent contexts or CDP connections.&lt;/p&gt;

&lt;p&gt;The bottom line: you get a much more human-like browser fingerprint without extra work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Memory-Efficient Screenshots
&lt;/h3&gt;

&lt;p&gt;Other small but nice improvements include how we handle screenshots and images. In the old toolkit, screenshots were held entirely in memory and passed around as objects. Now we save screenshots to disk and only pass around file paths.&lt;/p&gt;

&lt;p&gt;This keeps memory usage low, especially when you take many screenshots in a run. The agent can still request the image (and even run vision-based analysis on it), but the heavy data lives on disk.&lt;/p&gt;

&lt;h3&gt;
  
  
  Smarter Form Filling
&lt;/h3&gt;

&lt;p&gt;We also made form-filling smarter. You can now send multiple inputs in one command, and the toolkit will try to find the right input fields (even if you accidentally point at a container).&lt;/p&gt;

&lt;p&gt;It watches for dropdowns appearing after you type and will return just the new options (a "diff" snapshot), so you don't get overwhelmed by the whole page again. If something goes wrong, the tool tries simple recovery steps too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features at a Glance
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Multi-Mode Operation:&lt;/strong&gt; The toolkit has three modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Text Mode:&lt;/strong&gt; DOM-based automation, returning textual snapshots of element lists.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Mode:&lt;/strong&gt; Screenshot-based, with interactive elements highlighted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid Mode:&lt;/strong&gt; Smart switching between text and visual as needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;TypeScript Core:&lt;/strong&gt; All browser work is done in a Node.js/TypeScript server. That means native Playwright calls (no bridging) and full async/await support. We get TypeScript's compile-time checks and the latest APIs instantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better Element Handling:&lt;/strong&gt; Use real ARIA selectors and Playwright locators instead of injected IDs. E.g. click by aria-label or role. Plus, &lt;code&gt;_snapshotForAI&lt;/code&gt; returns structured data with semantic roles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instant Snapshots:&lt;/strong&gt; Every action (click/type/etc.) that changes the page returns an updated snapshot by default, so you see the new state immediately in text mode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advanced Screenshot (SoM):&lt;/strong&gt; Annotated screenshots with numbered marks for each element. Optionally, an AI can analyze the image (like "find all sign-up buttons").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intelligent Typing:&lt;/strong&gt; Typing into fields automatically detects dropdowns (autocomplete) and only returns the new suggestions (diff snapshot). If you point to a container, it will find the actual input inside and type there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Powerful Stealth:&lt;/strong&gt; Multiple Chrome flags, custom user agent/headers, persistent context, etc., to reduce bot detection. (After all, many sites try to fingerprint automation. &lt;br&gt;
&lt;strong&gt;Flexible Connections:&lt;/strong&gt; You can launch a fresh browser via Playwright, attach to an existing Chrome/Edge via CDP (Chrome DevTools Protocol), or even hook into an AI agent via the Model Context Protocol (MCP).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tool Registry:&lt;/strong&gt; The toolkit neatly separates "tools" (actions) from the core. Screenshots go to files, not memory, so you can handle them in custom agents or pipelines without huge overhead.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try It: Session &amp;amp; Navigation Tools
&lt;/h2&gt;

&lt;p&gt;Let's see some examples. First, create a toolkit instance and open the browser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;camel.toolkits&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;HybridBrowserToolkit&lt;/span&gt;

&lt;span class="c1"&gt;# Launch a real browser (non-headless for debugging)
&lt;/span&gt;&lt;span class="n"&gt;toolkit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;HybridBrowserToolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;headless&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_open&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;    &lt;span class="c1"&gt;# "Browser opened."
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tabs: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;total_tabs&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, Active: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;current_tab&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Initial Snapshot:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;snapshot&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your first call must be &lt;code&gt;browser_open()&lt;/code&gt;. That spins up Chromium/Chrome/Edge and returns a snapshot of whatever the default page is (typically about:blank or your start URL). You'll get something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Result: Browser opened.
Tabs: 1, Active tab index: 0
Initial Snapshot:
- link "Get Started" [ref=1]
- link "Documentation" [ref=2]
- link "GitHub" [ref=3]
- ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now navigation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Open a new tab and navigate to example.com
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_visit_page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Visiting example.com: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Snapshot:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;snapshot&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tabs now: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;total_tabs&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, Active: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;current_tab&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Go back and forward
&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_back&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;      &lt;span class="c1"&gt;# go back in history
&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_forward&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;   &lt;span class="c1"&gt;# then forward again
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;browser_visit_page(url)&lt;/code&gt; opens the URL in a new tab and switches to it. Each call makes a new tab.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;browser_back()&lt;/code&gt; and &lt;code&gt;browser_forward()&lt;/code&gt; move in the history of the current tab. They both return the updated page snapshot and tab info.&lt;/p&gt;

&lt;p&gt;For example, after visiting a couple of pages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_visit_page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_visit_page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/about&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_back&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Back: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, now at &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;snapshot&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Page Inspection Tools
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1zq5bvnp03nllzhcmvb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1zq5bvnp03nllzhcmvb.png" alt=" " width="800" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To see what's on the page without doing anything, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_get_page_snapshot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This returns a textual list of all interactive elements in the current tab (links, buttons, inputs, etc.), each with a &lt;code&gt;[ref=id]&lt;/code&gt;. By default it lists the full page, but you can initialize with &lt;code&gt;viewport_limit=True&lt;/code&gt; to only see elements visible on screen. E.g.:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- link "Home" [ref=1]
- button "Sign In" [ref=2]
- textbox "Search..." [ref=3]
- link "Products" [ref=4]
- ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a visual view, try:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_get_som_screenshot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="c1"&gt;# e.g. "Screenshot captured with 12 interactive elements (saved to: ./screenshots/page123_som.png)"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This takes a screenshot of the page and marks every element. You can also ask the toolkit to analyze it with an AI, e.g.:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_get_som_screenshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;read_image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;instruction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Find all buttons for submitting forms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="c1"&gt;# e.g. "Screenshot captured... Agent analysis: Found 3 form buttons: [ref=5], [ref=9], [ref=12]"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Behind the scenes, it saved an image file and ran an agent (if requested) to look at it. The raw image path is in &lt;code&gt;result['screenshotPath']&lt;/code&gt; if you need it.&lt;/p&gt;

&lt;p&gt;To inspect tabs, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tab_info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_get_tab_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Total tabs: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tab_info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;total_tabs&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tab&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tab_info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tabs&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; (current)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;is_current&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;- &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; @ &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see each tab's ID, title, and URL. This is handy to pick a tab to switch to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Switch to tab by ID (the 'id' field from tab_info)
&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_switch_tab&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tab_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;some_tab_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Interaction Tools
&lt;/h2&gt;

&lt;p&gt;Now for real interactions:&lt;/p&gt;

&lt;h3&gt;
  
  
  Click an Element
&lt;/h3&gt;

&lt;p&gt;Click an element by its ref:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;   &lt;span class="c1"&gt;# e.g. "Clicked on button 'Submit'"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the click opened a new tab, result will include &lt;code&gt;newTabId&lt;/code&gt;, and &lt;code&gt;current_tab&lt;/code&gt;/&lt;code&gt;total_tabs&lt;/code&gt; will update accordingly. You can then &lt;code&gt;browser_switch_tab&lt;/code&gt; to it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Type into Input Fields
&lt;/h3&gt;

&lt;p&gt;Type into an input:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Single input
&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello world&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the element with ref=3 triggers an autocomplete dropdown, the toolkit will detect it. Instead of returning the full page again, it gives you &lt;code&gt;result['diffSnapshot']&lt;/code&gt; containing just the new options (this is the "intelligent dropdown detection"). For example, typing "San" might return:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- option "San Francisco" [ref=23]
- option "San Diego" [ref=24]
- option "San Antonio" [ref=25]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you can click one of those by ref. If you have multiple fields to fill, just pass a list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;inputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ref&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;John&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ref&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;4&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Doe&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ref&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;5&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;john.doe@example.com&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;details&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# shows success/failure per field
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Select Dropdowns
&lt;/h3&gt;

&lt;p&gt;Select (for &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; dropdowns):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;country-select&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You must provide the option's value attribute, not visible text. (If needed, you can &lt;code&gt;browser_get_page_snapshot()&lt;/code&gt; first to see element refs.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Enter Key
&lt;/h3&gt;

&lt;p&gt;Enter key (submit form etc.):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_enter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This simulates pressing Enter in the currently focused field. It's handy after typing search terms.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scroll
&lt;/h3&gt;

&lt;p&gt;Scroll the page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_scroll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;down&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use "up" or "down", with optional pixel amount. It returns the new snapshot. You can loop scrolls to load more content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_scroll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;down&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;snapshot&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;  &lt;span class="c1"&gt;# no new content
&lt;/span&gt;    &lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;snapshot&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mouse Control
&lt;/h3&gt;

&lt;p&gt;Mouse control by coordinates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_mouse_control&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;click&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;350.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_mouse_control&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dblclick&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;123.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;456.7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_mouse_control&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;right_click&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful for canvas or image-map interactions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Drag and Drop
&lt;/h3&gt;

&lt;p&gt;Mouse drag-and-drop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_mouse_drag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;from_ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;item-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to_ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;trash-bin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drag the element with ref="item-5" onto ref="trash-bin". Handy for reordering or file moves in web UIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Press Keys
&lt;/h3&gt;

&lt;p&gt;Press keys/combinations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_press_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tab&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_press_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Control+a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# select all
&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_press_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alt+Left&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;   &lt;span class="c1"&gt;# back in history
&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_press_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;F5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;         &lt;span class="c1"&gt;# refresh
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Send any key or combo. The toolkit uses Playwright's key syntax.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tab Management
&lt;/h2&gt;

&lt;p&gt;Working with multiple tabs is easy:&lt;/p&gt;

&lt;h3&gt;
  
  
  Switch Tab
&lt;/h3&gt;

&lt;p&gt;Switch tab by ID (from &lt;code&gt;browser_get_tab_info&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_switch_tab&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tab_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;some_tab_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This activates that tab and returns its snapshot.&lt;/p&gt;

&lt;h3&gt;
  
  
  Close Tab
&lt;/h3&gt;

&lt;p&gt;Close a tab:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_close_tab&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tab_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;some_tab_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After closing, it returns info on the remaining tabs.&lt;/p&gt;

&lt;p&gt;You can, for instance, close all but the first tab by iterating through them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tab_info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_get_tab_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tab&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tab_info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tabs&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;is_current&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_close_tab&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tab_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Console Commands
&lt;/h3&gt;

&lt;p&gt;Console commands: You can execute arbitrary JS on the page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_console_exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;return window.location.href&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Current URL:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And view console logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;logs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_console_view&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;console_messages&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;] &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Advanced &amp;amp; Utility
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Wait for Manual Step
&lt;/h3&gt;

&lt;p&gt;Wait for manual step: Sometimes you need a human (e.g. to solve a CAPTCHA). Use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_wait_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeout_sec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User resumed, snapshot after:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;snapshot&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Wait timed out.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pauses execution and shows the last snapshot. When the user presses Enter (or timeout), it returns control.&lt;/p&gt;

&lt;h3&gt;
  
  
  Combine It All
&lt;/h3&gt;

&lt;p&gt;Combine it all: Here's a mini example putting a few tools together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;toolkit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;HybridBrowserToolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;headless&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_open&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_visit_page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Look for a product link and click it
&lt;/span&gt;    &lt;span class="n"&gt;snap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_get_page_snapshot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;# Suppose ref=7 is "Products"
&lt;/span&gt;    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;7&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Now add to cart and checkout
&lt;/span&gt;    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;add-to-cart&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;checkout&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Fill checkout form
&lt;/span&gt;    &lt;span class="n"&gt;inputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ref&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ref&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;alice@example.com&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ref&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;address&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1 Developer Way&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shipping&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;standard&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_console_exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;return document.querySelector(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;form&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;).checkValidity()&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;place-order&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was just a taste. The Hybrid Browser Toolkit provides all the basic navigation and interaction tools you'd expect, plus some powerful extras (like smart screenshots and AI-assisted analysis) to help you automate complex tasks smoothly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operating Modes: Text vs. Visual vs. Hybrid
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Text Mode&lt;/strong&gt; is the default: every action returns a text snapshot. It's lightweight and great for pure data tasks (like scraping or filling forms). Each element is listed with a &lt;code&gt;[ref=ID]&lt;/code&gt; and a label. If you initialize with &lt;code&gt;full_visual_mode=True&lt;/code&gt;, then actions don't auto-return snapshots (fast mode); you can still call &lt;code&gt;browser_get_page_snapshot()&lt;/code&gt; manually when you need it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visual Mode&lt;/strong&gt; uses screenshots. The &lt;code&gt;browser_get_som_screenshot()&lt;/code&gt; tool we saw is the core of this mode. It's ideal for verifying layouts, catching visual glitches, or when a human needs to see something. You'll often toggle visual mode on when you need to confirm that a button is visible, or to show the agent exactly what's on screen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hybrid Mode&lt;/strong&gt; is smart: it uses text mode by default, but seamlessly takes and interprets screenshots when needed (or as requested). For example, you might click through forms in text mode, then do one final screenshot with AI analysis to "spot check" the result.&lt;/p&gt;

&lt;p&gt;A good rule of thumb:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;Text Mode&lt;/strong&gt; for most automation (fast, headless, easy parsing).&lt;/li&gt;
&lt;li&gt;Switch to &lt;strong&gt;Visual Mode&lt;/strong&gt; when you need the UI context (e.g. for CAPTCHAs, complex UIs, or human verification).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combine Both&lt;/strong&gt; as needed. E.g., click by refs in text mode, then verify with a screenshot.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Connection Modes: Playwright vs CDP vs MCP
&lt;/h2&gt;

&lt;p&gt;Finally, how do we connect to the browser?&lt;/p&gt;

&lt;h3&gt;
  
  
  Standard Playwright (default)
&lt;/h3&gt;

&lt;p&gt;The toolkit launches and manages its own browser instance. Just &lt;code&gt;HybridBrowserToolkit()&lt;/code&gt; and call &lt;code&gt;browser_open()&lt;/code&gt;. You can set &lt;code&gt;headless=True/False&lt;/code&gt;, &lt;code&gt;user_data_dir&lt;/code&gt; for persistence, timeouts, etc. Use this when you just want an isolated browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  Chrome DevTools Protocol (CDP)
&lt;/h3&gt;

&lt;p&gt;This lets you attach to an already running browser (Chrome/Edge/Chromium) that was started with &lt;code&gt;--remote-debugging-port&lt;/code&gt;. For example, start Chrome manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;google-chrome &lt;span class="nt"&gt;--remote-debugging-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9222 &lt;span class="nt"&gt;--user-data-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/chrome-profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then in Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;http://localhost:9222/json/version&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;webSocketDebuggerUrl&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;toolkit_cdp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;HybridBrowserToolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cdp_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# No need to call browser_open(); it's already running
&lt;/span&gt;&lt;span class="n"&gt;tab_info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;toolkit_cdp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browser_get_tab_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Connected to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tab_info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;total_tabs&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; tabs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CDP is the same protocol Chrome DevTools uses to talk to the browser &lt;a href="https://chromedevtools.github.io" rel="noopener noreferrer"&gt;chromedevtools.github.io&lt;/a&gt;, so any browser with debugging enabled can be controlled. You can even set &lt;code&gt;cdp_keep_current_page=True&lt;/code&gt; to make the toolkit use the current page instead of opening a new one.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP (Model Context Protocol)
&lt;/h3&gt;

&lt;p&gt;This is for connecting the toolkit to an AI assistant (like Claude via LLMs) so the AI can call these browser tools as if they were native functions. Here's how to set it up:&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;1. Install the MCP Server&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/camel-ai/browser_agent.git
&lt;span class="nb"&gt;cd &lt;/span&gt;browser_agent
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;2. Configure Claude Desktop&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Add to your Claude configuration file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;macOS&lt;/strong&gt;: &lt;code&gt;~/Library/Application Support/Claude/claude_desktop_config.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;%APPDATA%\Claude\claude_desktop_config.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"hybrid-browser"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-m"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hybrid_browser_mcp.server"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2c2ksxayol6zt4klfv15.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2c2ksxayol6zt4klfv15.png" alt=" " width="800" height="639"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;3. Restart Claude Desktop&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fei6ln5wuog081xji0npb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fei6ln5wuog081xji0npb.png" alt=" " width="800" height="641"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After adding the configuration, completely restart Claude Desktop. The browser tools will appear when you click the 🔌 icon in the chat interface.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Available Browser Tools&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Once connected, you'll have access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Navigation&lt;/strong&gt;: &lt;code&gt;browser_open&lt;/code&gt;, &lt;code&gt;browser_visit_page&lt;/code&gt;, &lt;code&gt;browser_back&lt;/code&gt;, &lt;code&gt;browser_forward&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interaction&lt;/strong&gt;: &lt;code&gt;browser_click&lt;/code&gt;, &lt;code&gt;browser_type&lt;/code&gt;, &lt;code&gt;browser_select&lt;/code&gt;, &lt;code&gt;browser_scroll&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screenshots&lt;/strong&gt;: &lt;code&gt;browser_get_som_screenshot&lt;/code&gt; (captures page with clickable elements marked)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tab Management&lt;/strong&gt;: &lt;code&gt;browser_switch_tab&lt;/code&gt;, &lt;code&gt;browser_close_tab&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced&lt;/strong&gt;: &lt;code&gt;browser_console_exec&lt;/code&gt;, &lt;code&gt;browser_mouse_control&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Basic Usage Example&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Claude can now control browsers with simple commands:
&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;browser_open&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;browser_visit_page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;browser_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AI automation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;browser_click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;submit-button&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;browser_get_som_screenshot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;browser_close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Customization&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Modify browser behavior in &lt;code&gt;browser_agent/config.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;BROWSER_CONFIG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;headless&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;# Show browser window
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stealth&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;# Avoid bot detection
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enabled_tools&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[...]&lt;/span&gt; &lt;span class="c1"&gt;# Specify which tools to enable
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;In summary, the Hybrid Browser Toolkit is a major upgrade over the old screenshot-only BrowserToolkit. We still give you a friendly Python API to work with, but under the hood we're speaking the browser's native language via TypeScript.&lt;/p&gt;

&lt;p&gt;That means faster, more reliable interactions and access to shiny new features like Playwright's accessibility snapshots. Whether you need lightning-fast DOM scraping or human-like visual checks (or both!), this toolkit handles it.&lt;/p&gt;

&lt;p&gt;It also plays well with modern workflows. Want to connect to an existing Chrome? No problem (thanks to CDP). Want your AI agent to browse the web? Check out MCP integration.&lt;/p&gt;

&lt;p&gt;From practical navigation (click, type, scroll) to advanced tricks (Set-of-Marks screenshots, smart autocomplete typing, multi-tab management), everything's here.&lt;/p&gt;

&lt;p&gt;Give it a spin, and let us know what you build with it. Welcome to the new era of browser automation with CAMEL's Hybrid Browser Toolkit – it's like taking off those gloves and driving with all the precision you wanted, at full speed.&lt;/p&gt;

&lt;p&gt;Happy automating!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>javascript</category>
      <category>automation</category>
    </item>
    <item>
      <title>We hired AI to do Growth Engineering and here’s what happened</title>
      <dc:creator>Nomadev</dc:creator>
      <pubDate>Wed, 17 Sep 2025 10:16:00 +0000</pubDate>
      <link>https://forem.com/camelai/we-hired-ai-to-do-growth-engineering-and-heres-what-happened-4ad0</link>
      <guid>https://forem.com/camelai/we-hired-ai-to-do-growth-engineering-and-heres-what-happened-4ad0</guid>
      <description>&lt;p&gt;In open source projects, time is precious. Maintainers juggle bug fixes, feature requests, community support, and documentation, all while trying to keep code secure and releases organized. One repetitive but crucial task is &lt;strong&gt;reviewing pull requests and preparing release updates&lt;/strong&gt;. It's necessary, but it eats up hours that could be spent innovating.&lt;/p&gt;

&lt;p&gt;In our work at &lt;a href="https://www.camel-ai.org/" rel="noopener noreferrer"&gt;CAMEL-AI&lt;/a&gt;, open-source contributions move fast. Every week, our team spends time reviewing pull requests, highlighting key changes, and preparing release notes. It’s important work, but also repetitive — hours get lost in scanning PRs, checking impact, and formatting updates.&lt;/p&gt;

&lt;p&gt;This time, instead of doing it manually, we asked ourselves: what if a multi-agent system could take over this process?&lt;/p&gt;

&lt;p&gt;That’s when we decided to try it with Eigent and a custom MCP server for GitHub. The idea was simple: let AI agents handle the weekly workflow, from fetching PRs to summarizing them and even drafting release-ready notes and short posts.&lt;/p&gt;

&lt;p&gt;What if automation could handle the grunt work for you? That's where Eigent step in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F20axnnnosg6htpsxqpkh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F20axnnnosg6htpsxqpkh.png" alt=" " width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.eigent.ai/" rel="noopener noreferrer"&gt;Eigent&lt;/a&gt;&lt;/strong&gt; is the world's first &lt;strong&gt;Multi-agent Workforce&lt;/strong&gt; desktop application, empowering you to build, manage, and deploy a custom AI workforce that can turn your most complex workflows into automated tasks. It's a &lt;strong&gt;modular, multi-agent system&lt;/strong&gt; that can break down complex tasks and handle them through specialized agents working in coordination.&lt;/p&gt;

&lt;p&gt;Eigent's &lt;strong&gt;multi-agent coordination platform&lt;/strong&gt; boosts productivity by turning your workflows into automated tasks. Built on the open-source CAMEL framework, it brings parallel execution, customization, and privacy to your AI automation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What can Eigent do for you?&lt;/strong&gt; For first-time readers, consider Eigent as a flexible agentic assistant. You can create different "workers" (AI agents) with domain-specific skills (e.g. coding, documentation, DevOps) and have them collaborate on tasks. Some examples of technical workflows Eigent can simplify include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub automation with AI agents:&lt;/strong&gt; Reviewing code changes, summarizing pull requests, triaging issues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Release note generation:&lt;/strong&gt; Automatically compiling highlights of what's new in each release.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation and code analysis:&lt;/strong&gt; Extracting key points from docs or codebases, suggesting improvements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-source workflows:&lt;/strong&gt; Keeping track of project activity, generating reports for contributors, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this guide, we'll show you &lt;strong&gt;how to configure a custom GitHub MCP server inside Eigent&lt;/strong&gt; and set up an agent workflow that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Fetches new pull requests from a repo&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extracts and analyzes PR data&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Formats the highlights into release-ready notes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generates a short social post (e.g. for Twitter/X)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's dive into the step-by-step guide!&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Open Eigent and Navigate to MCP &amp;amp; Tools Settings
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F39pmrfvrvei10w05gkcw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F39pmrfvrvei10w05gkcw.gif" alt=" " width="1024" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you have Eigent running, begin by opening the &lt;strong&gt;Settings&lt;/strong&gt; panel. In the Settings, find and click on the &lt;strong&gt;"MCP &amp;amp; Tools"&lt;/strong&gt; section. This is where you can configure external tools and servers for your AI agents. We'll use this area to add a new custom MCP server for GitHub tasks.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Eigent's Settings interface. Navigate to the **MCP &amp;amp; Tools&lt;/em&gt;* tab to configure external AI tools and servers.*&lt;/p&gt;

&lt;p&gt;In the &lt;em&gt;MCP &amp;amp; Tools&lt;/em&gt; tab, you'll see a list of available tools and any configured MCP servers. By default, Eigent might include some basic tools (e.g. web search, code execution). To add our own, look for an &lt;strong&gt;"Add MCP Server"&lt;/strong&gt; button (usually a &lt;strong&gt;+&lt;/strong&gt; or a labeled button) and click it. This will open a dialog where you can input a JSON configuration for the new server.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: Add a Custom MCP Server via JSON Configuration
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuh4bf1hnw0ck18idk2i1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuh4bf1hnw0ck18idk2i1.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eigent allows advanced users to add custom agent servers by providing a JSON config. In the &lt;strong&gt;Add MCP Server&lt;/strong&gt; dialog that opened, you'll see a text area to paste JSON. We're going to add a &lt;strong&gt;sequential-thinking&lt;/strong&gt; MCP server - this is a general-purpose AI reasoning engine that can coordinate tasks (perfect for breaking down complex prompts). We will also tie it into GitHub by providing the GitHub integration toolset and our credentials.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Adding a new MCP server via JSON configuration. Paste in the JSON definition for the **sequential-thinking&lt;/em&gt;* server.*&lt;/p&gt;

&lt;p&gt;The JSON defines how Eigent should launch the external agent server. For our use case, we'll use Node's &lt;strong&gt;&lt;code&gt;npx&lt;/code&gt;&lt;/strong&gt; to run the &lt;strong&gt;Sequential Thinking&lt;/strong&gt; server package, and include the official GitHub MCP tool. Below is the JSON structure to use (as provided by Eigent's docs and examples):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sequential-thinking"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-sequential-thinking"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Configure the GitHub MCP Server Settings (Include Your PAT)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8fvbac8wej56ng4m6qqz.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8fvbac8wej56ng4m6qqz.gif" alt=" " width="720" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before finalizing the MCP server setup, include your &lt;strong&gt;GitHub Personal Access Token (PAT)&lt;/strong&gt; in the configuration. This token will allow the agent to authenticate with the GitHub API and fetch repository data. You should generate a PAT from your GitHub account (with at least read access to repos; for public repos a classic token with default public scopes is sufficient). In the JSON, we'll add an environment variable for the token and specify the GitHub toolset.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Configuring the GitHub MCP server by adding environment variables. Provide your **GitHub PAT&lt;/em&gt;* in the JSON config so the agent can access the GitHub API.*&lt;/p&gt;

&lt;p&gt;To integrate the GitHub tools, modify the JSON as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add the GitHub MCP server container to the arguments.&lt;/li&gt;
&lt;li&gt;Set the environment variable for your token.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, you can extend the &lt;strong&gt;&lt;code&gt;"args"&lt;/code&gt;&lt;/strong&gt; array to include the GitHub server image and use the &lt;strong&gt;&lt;code&gt;"env"&lt;/code&gt;&lt;/strong&gt; field for the token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sequential-thinking"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-sequential-thinking"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"ghcr.io/github/github-mcp-server"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"GITHUB_PERSONAL_ACCESS_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ghp_yourGitHubTokenHere"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this configuration, we pass the official &lt;strong&gt;GitHub MCP server&lt;/strong&gt; (hosted at &lt;a href="http://ghcr.io/github/github-mcp-server" rel="noopener noreferrer"&gt;ghcr.io/github/github-mcp-server&lt;/a&gt; as an argument to the sequential thinking agent. The sequential agent will spin up the GitHub toolset internally. We also set &lt;code&gt;GITHUB_PERSONAL_ACCESS_TOKEN&lt;/code&gt; in the environment so the agent can authenticate to GitHub. &lt;em&gt;(Make sure to replace *&lt;/em&gt;"ghp_yourGitHubTokenHere"** with your actual PAT.)*&lt;/p&gt;

&lt;p&gt;Once the JSON is ready, click &lt;strong&gt;Install&lt;/strong&gt; or &lt;strong&gt;Add&lt;/strong&gt; to save the MCP server. Eigent will download and initialize the server in the background. After a moment, you should see the new server listed in your MCP tools, indicating a successful installation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Add a GitHub-Focused Worker (Agent) Using the New MCP Server
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fio64czclz7a3uw60i2op.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fio64czclz7a3uw60i2op.gif" alt=" " width="720" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that the MCP server is configured, we need to create a Worker that uses this server. In Eigent, a "Worker" is essentially an AI agent persona that can carry out tasks using a specified toolset or MCP server. Navigate back to the main &lt;strong&gt;Workforce&lt;/strong&gt; or &lt;strong&gt;Agents&lt;/strong&gt; screen (often the home screen showing your AI workers). Look for an &lt;strong&gt;"Add Worker"&lt;/strong&gt; or &lt;strong&gt;"+"&lt;/strong&gt; button to create a new agent.&lt;/p&gt;

&lt;p&gt;When the &lt;strong&gt;Add Worker&lt;/strong&gt; dialog appears, enter a name and description for your new agent. For example, name it &lt;strong&gt;"GitHub MCP"&lt;/strong&gt; and describe it as "Helps around GitHub Tasks". Most importantly, assign the &lt;strong&gt;Agent Tool&lt;/strong&gt; to the MCP server we just added (it might appear in a dropdown as "sequential-thinking" or whatever name you gave it). This ensures your new worker will utilize the GitHub-enabled sequential thinking agent.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Creating a new Worker agent for GitHub tasks. Give it a name (e.g. "GitHub PR Reviewer") and select the **GitHub MCP&lt;/em&gt;* server as the agent's tool.*&lt;/p&gt;

&lt;p&gt;After filling in the details and selecting the correct MCP server, save the worker. You should now see a new agent in your AI workforce list. This agent is essentially your &lt;strong&gt;GitHub automation assistant&lt;/strong&gt;, equipped with the ability to reason through tasks and interact with GitHub data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Prompt the Agent to Summarize Pull Requests
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshzloyxfaii0wnvr5tyy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshzloyxfaii0wnvr5tyy.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the GitHub-enabled agent up and running, it's time to put it to work. Open a chat or command interface with your new worker (in Eigent, clicking the worker might open a chat panel where you can give it instructions). We'll provide a task prompt asking the agent to review pull requests from a repository and summarize them.&lt;/p&gt;

&lt;p&gt;As an example, try a detailed prompt like this one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Review all the 30 latest pull requests from the repo &lt;a href="https://github.com/camel-ai/camel" rel="noopener noreferrer"&gt;https://github.com/camel-ai/camel&lt;/a&gt;. Select the top 5 by impact (lines changed, files touched, or discussion depth). For each selected PR, generate a release-ready update in this format: ✨ Feature: &amp;lt;catchy one-liner summary&amp;gt; 💡 Why it matters: &amp;lt;short bullet-point explanation&amp;gt; 🙏 Thanks @&amp;lt;GitHubAuthor&amp;gt;...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Entering a prompt for the GitHub agent to review recent PRs and produce summaries. This complex instruction asks the AI to fetch the latest 30 PRs, pick the most impactful ones, and format a brief release note for each.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In the chat, paste or type in the prompt (as shown above) and hit send. This instructs the agent to automate a common open-source workflow: analyzing recent pull requests in the &lt;strong&gt;camel-ai/camel&lt;/strong&gt; repo and preparing a synopsis of important changes. You can customize the repository URL or criteria as needed - for instance, use your own project's repo link. The key is that our agent now has the tools (via MCP) to fetch GitHub data and the reasoning ability to summarize it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Watch Eigent Automatically Break Down the Task and Fetch Data
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0dfw49zliobuqvg5s6ld.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0dfw49zliobuqvg5s6ld.png" alt=" " width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you send the prompt, &lt;strong&gt;Eigent's multi-agent engine kicks in&lt;/strong&gt;. The request is fairly complex, but Eigent will handle it by dividing the work into manageable subtasks. Behind the scenes, the Sequential Thinking MCP server interprets the instruction and decides on a plan. It may do something like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fetch the list of the latest 30 PRs from the specified repository (using the GitHub MCP tool).&lt;/li&gt;
&lt;li&gt;Analyze each PR's metadata (lines changed, files, comments) to determine "impact".&lt;/li&gt;
&lt;li&gt;Pick the top 5 PRs based on the criteria.&lt;/li&gt;
&lt;li&gt;For each of those PRs, compose a summary in the requested format (✨ Feature, 💡 Why it matters, 🙏 Thanks...).&lt;/li&gt;
&lt;li&gt;Possibly also prepare a condensed version for X (Twitter) if requested, or any additional subtasks inferred.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Eigent actually &lt;strong&gt;displays the subtask breakdown&lt;/strong&gt; in the interface, so you can see the agent's thought process. It might list steps it's taking, which makes it transparent and debug-friendly. For example, the agent may explicitly show a step to retrieve PR data and then a step to filter them by impact. This showcases Eigent's dynamic task planning: &lt;em&gt;"Eigent dynamically breaks down tasks and activates multiple agents to work in parallel, automating complex tasks much faster than traditional single-agent workflows"&lt;/em&gt; &lt;a href="https://docs.eigent.ai/get_started/welcome#:~:text=Eigent%20dynamically%20breaks%20down%20tasks,step%20scenarios%20with%20ease" rel="noopener noreferrer"&gt;Eigent Docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The GitHub agent (powered by the &lt;a href="https://github.com/github/github-mcp-server" rel="noopener noreferrer"&gt;MCP server&lt;/a&gt;) fetching repository data. Here the agent executed a subtask to retrieve PR details via the GitHub API, returning JSON data almost instantly.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In our case, the first subtask is to call GitHub and get details of the latest 30 PRs. The agent, using the GitHub MCP, does this in seconds and obtains a JSON array of PR info (IDs, titles, authors, lines changed, etc.). Next, the agent evaluates which PRs have the largest impact. Another subtask might involve sorting or filtering the list by those metrics. Once the top 5 PRs are identified, the agent generates the summary for each.&lt;/p&gt;

&lt;p&gt;Finally, the agent produces the &lt;strong&gt;output&lt;/strong&gt;: a neatly formatted set of release-ready updates for the top 5 PRs. The result is typically presented in the chat as Markdown text (since we asked for a release update format). Each update might look like:&lt;/p&gt;

&lt;p&gt;✨ &lt;strong&gt;Feature:&lt;/strong&gt; Added comprehensive model table and requirements badges to docs&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provides quick, up-to-date model info right in the documentation&lt;/li&gt;
&lt;li&gt;Helps users assess at a glance what's available and what's required&lt;/li&gt;
&lt;li&gt;Elevates project transparency and onboarding experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🙏 Thanks @wendongfan for this integration&lt;/p&gt;

&lt;p&gt;PR link: &lt;a href="https://github.com/camel-ai/camel/pull/1341" rel="noopener noreferrer"&gt;https://github.com/camel-ai/camel/pull/1343&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(The above are illustrative examples.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You would see five such entries corresponding to the top PRs. The agent might also provide a shorter "X-posting" version (e.g. a tweet-worthy one-liner) if that was part of the prompt. The outcome is that you have, in a few moments, a draft of changelog/release notes highlights, complete with acknowledgments to contributors.&lt;/p&gt;

&lt;h3&gt;
  
  
  Empowering OSS Workflows with Agentic Automation
&lt;/h3&gt;

&lt;p&gt;In this tutorial, we configured Eigent to automate an open-source maintenance task—summarizing GitHub pull requests—using an AI agent. We introduced a custom &lt;strong&gt;&lt;a href="https://github.com/github/github-mcp-server" rel="noopener noreferrer"&gt;GitHub MCP server&lt;/a&gt;&lt;/strong&gt; into Eigent, created a dedicated worker, and successfully generated release note snippets from live repository data. The process demonstrates the power of &lt;strong&gt;agentic automation for OSS contributors&lt;/strong&gt;: instead of manually combing through PRs, maintainers can rely on AI agents to do the heavy lifting. By leveraging Eigent's &lt;strong&gt;MCP integration&lt;/strong&gt; and multi-agent coordination, even complex workflows (like triaging dozens of PRs) can be handled efficiently by AI, freeing you to focus on higher-level decisions.&lt;/p&gt;

&lt;p&gt;Eigent makes it approachable for both developers and non-developers to harness multi-agent AI. With a few simple steps, you can &lt;strong&gt;configure MCP for open-source workflows&lt;/strong&gt; and let your personalized AI workforce assist you. This was just one example—&lt;strong&gt;Eigent&lt;/strong&gt; can be tailored to many scenarios, from writing summaries and managing issues to testing code or updating documentation. As the platform evolves, the possibilities for GitHub automation with AI agents will only grow.&lt;/p&gt;

&lt;p&gt;Give Eigent a try in your own projects, and enjoy the productivity boost of having an AI-powered team on your side! The future of open-source collaboration might just be a mix of human passion and tireless AI assistants working together. 🚀&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy automating!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agentaichallenge</category>
      <category>powerfuldevs</category>
      <category>beginners</category>
    </item>
    <item>
      <title>A Guide to Building a Fully Local AI Workforce for FREE</title>
      <dc:creator>Nomadev</dc:creator>
      <pubDate>Wed, 03 Sep 2025 09:19:03 +0000</pubDate>
      <link>https://forem.com/thenomadevel/a-guide-to-building-a-fully-local-ai-workforce-for-free-50g8</link>
      <guid>https://forem.com/thenomadevel/a-guide-to-building-a-fully-local-ai-workforce-for-free-50g8</guid>
      <description>&lt;p&gt;If you're looking to deploy powerful AI tools, you've likely faced a key challenge: how to unlock their full potential without compromising the security of your sensitive data.&lt;/p&gt;

&lt;p&gt;Most platforms push everything to the cloud, which feels convenient at first but quickly raises red flags when you're dealing with customer records, financial data, or internal IP. You want the power of multi-agent systems, but you also want privacy, control, and the ability to run everything on your own machine.&lt;/p&gt;

&lt;p&gt;That's where &lt;strong&gt;Eigent&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Eigent?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.eigent.ai/" rel="noopener noreferrer"&gt;Eigent&lt;/a&gt; is a local-first multi-agent desktop application. Instead of sending your data to external servers, it runs everything on your computer. You get full visibility into what's happening and the confidence that your files, credentials, and logs stay with you.&lt;/p&gt;

&lt;p&gt;Think of it as building your own AI workforce. You can spin up different agents, each with their own skills: a search agent that combs the web, a developer agent that runs code, a document agent that writes and edits files, and even multimodal agents that handle images and audio. Eigent coordinates them for you so they can tackle tasks in parallel, hand things off when needed, and deliver polished results.&lt;/p&gt;

&lt;p&gt;In this guide we're going to show you exactly how to set it up locally. By the end you'll have Eigent running on your desktop with agents ready to work together on your terms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before getting started, make sure you have the following in place:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js (v18 or newer) and npm:&lt;/strong&gt; Eigent is a Node/Electron application. Install Node.js (18–22 is recommended) if you haven't already. &lt;em&gt;Tip:&lt;/em&gt; You can download Node from the official site or use a version manager.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory and Hardware:&lt;/strong&gt; At least &lt;strong&gt;8 GB of RAM&lt;/strong&gt; is recommended for smooth performance. Eigent can run entirely on CPU if you're connecting to external APIs (like OpenAI or Anthropic). If you want to run &lt;strong&gt;large models locally&lt;/strong&gt; on your machine, having a capable &lt;strong&gt;GPU&lt;/strong&gt; (e.g. an NVIDIA RTX card) will make a big difference in speed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operating System:&lt;/strong&gt; Eigent supports local deployment on major OSes (Windows, macOS). The steps below are OS-agnostic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker:&lt;/strong&gt; Install Docker if you haven't already, and make sure docker is running.(&lt;a href="https://docs.docker.com/get-docker/" rel="noopener noreferrer"&gt;Docker Installation Guide&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Clone the Repo &amp;amp; Start the PostgreSQL Backend
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhb8vgok58euv8pome1l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxhb8vgok58euv8pome1l.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First, clone the Eigent repo and install its dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/eigent-ai/eigent.git
&lt;span class="nb"&gt;cd &lt;/span&gt;eigent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will give you the full source code on your machine. Next, switch into the &lt;strong&gt;server&lt;/strong&gt; directory and launch Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;server
&lt;span class="c"&gt;# Copy .env.example to .env (or create .env according to .env.example)&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command uses the provided &lt;strong&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/strong&gt; to spin up two containers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;PostgreSQL database&lt;/strong&gt; (the Eigent data store)&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Eigent API server&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both run locally on your machine (e.g. &lt;strong&gt;&lt;code&gt;localhost:3001&lt;/code&gt;&lt;/strong&gt; for the API). The screenshot above shows Docker pulling the images and starting the &lt;strong&gt;&lt;code&gt;eigent_postgres&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;eigent_api&lt;/code&gt;&lt;/strong&gt; containers.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Docker Compose brings up the Postgres database and API server locally.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;By default, Docker will create a volume for PostgreSQL, so all database files are stored on your disk (not in memory).&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Verify Local Data Storage
&lt;/h2&gt;

&lt;p&gt;At this point, &lt;strong&gt;everything is running locally&lt;/strong&gt;. The PostgreSQL container (&lt;strong&gt;&lt;code&gt;eigent_postgres&lt;/code&gt;&lt;/strong&gt;) holds the database. You can double-check by listing your Docker containers or using a tool like &lt;strong&gt;&lt;code&gt;psql&lt;/code&gt;&lt;/strong&gt; inside the container. Everything Eigent does (agent messages, user data, task logs, etc.) will be written to that local Postgres instance. No data is sent anywhere outside your machine.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;All Eigent data is stored in the local Dockerized PostgreSQL database.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This ensures privacy by design. As stated in the docs, a key advantage of self-hosting is data privacy – you keep &lt;em&gt;sensitive data within your own infrastructure&lt;/em&gt;. In fact, when you use this setup, no workspace or login information ever leaves your local network. Eigent is fully local by default, so you can audit and trust that your data stays put.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Modify &lt;code&gt;.env.development&lt;/code&gt; for Local Proxy
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9n16si2umrx93w3zvol6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9n16si2umrx93w3zvol6.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, we need to tell the front-end to use the local back-end instead of any cloud service. In the project root (&lt;strong&gt;&lt;code&gt;eigent/.env.development&lt;/code&gt;&lt;/strong&gt;), enable the local proxy settings. Open &lt;strong&gt;&lt;code&gt;.env.development&lt;/code&gt;&lt;/strong&gt; in a text editor and make sure it contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VITE_BASE_URL=/api
VITE_PROXY_URL=http://localhost:3001
VITE_USE_LOCAL_PROXY=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By setting &lt;strong&gt;&lt;code&gt;VITE_USE_LOCAL_PROXY=true&lt;/code&gt;&lt;/strong&gt; and pointing &lt;strong&gt;&lt;code&gt;VITE_PROXY_URL&lt;/code&gt;&lt;/strong&gt; to &lt;strong&gt;&lt;code&gt;http://localhost:3001&lt;/code&gt;&lt;/strong&gt;, you configure the front-end to send all API calls to your local Docker backend. The screenshot below shows the relevant lines in the &lt;strong&gt;&lt;code&gt;.env.development&lt;/code&gt;&lt;/strong&gt; file:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Edit *&lt;/em&gt;&lt;code&gt;.env.development&lt;/code&gt;&lt;strong&gt;: set **&lt;code&gt;VITE_PROXY_URL&lt;/code&gt;&lt;/strong&gt; to &lt;strong&gt;&lt;code&gt;http://localhost:3001&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;VITE_USE_LOCAL_PROXY=true&lt;/code&gt;&lt;/strong&gt; to enable local mode.*&lt;/p&gt;

&lt;p&gt;Make sure to remove any leading &lt;strong&gt;&lt;code&gt;#&lt;/code&gt;&lt;/strong&gt; or comment markers on those lines so they take effect. With this configuration, the front-end app will proxy requests to your local server rather than the external demo API.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Run the Frontend App
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdd42ixs59xrtycgn4elk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdd42ixs59xrtycgn4elk.png" alt=" " width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now go back to the repo root and install the JavaScript dependencies, then start the development server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ..
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will launch the Eigent front-end locally. By default it runs on &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;. With the &lt;strong&gt;&lt;code&gt;.env&lt;/code&gt;&lt;/strong&gt; changes, the front-end will contact the API at &lt;strong&gt;&lt;code&gt;http://localhost:3001&lt;/code&gt;&lt;/strong&gt; – all within your machine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eigent@&lt;span class="k"&gt;*&lt;/span&gt; dev
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; vite

  VITE vX.X.X  ready &lt;span class="k"&gt;in &lt;/span&gt;Y ms

  ➜  Local:   http://localhost:3000/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No special cloud credentials are needed here – it's just a normal Node development build.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Access the Eigent UI Locally
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifzaow95oyvgxbpn8pqu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifzaow95oyvgxbpn8pqu.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Eigent's login screen, served locally. Although sign-in is required, this instance is self-hosted and no external service is involved.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Rest assured, this login is purely for the local app – your credentials and data are saved in the local Postgres database you started, not some cloud server. In other words, even though the UI presents an OAuth-style login, &lt;strong&gt;all authentication and user data lives on your machine&lt;/strong&gt;. The documentation emphasizes this local-first setup: "Your data stays on your own device, addressing privacy and security concerns". Once logged in, you'll reach the main dashboard where you can create custom agents, define workflows, and configure tools.&lt;/p&gt;

&lt;p&gt;For example, the tools/settings page lets you enable or disable built-in integrations (web search, Google docs, Slack, etc.), and the model selection screen (shown below) lets you pick or configure your preferred LLM. Everything from here on – agent messages, tool outputs, knowledge bases – will remain in your PostgreSQL database and local filesystem unless you explicitly export it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvllaxjms2s6ehfjdjyjv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvllaxjms2s6ehfjdjyjv.png" alt=" " width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Eigent UI lets you configure integrated tools (Slack, web search, etc.) on your local instance.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Choose which models or APIs to use for agents in the local Eigent setup.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; when running in local mode, users need to set up their own API keys or endpoints for models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch the Full Tutorial
&lt;/h2&gt;

&lt;p&gt;Prefer a visual guide? We've recorded a step-by-step walkthrough that takes you through the entire process, from spinning up Docker to logging into Eigent locally.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Di3LtslB2a4" rel="noopener noreferrer"&gt;YouTube Tutorial: Local Eigent Setup&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;And that's it, you've just spun up your very own &lt;strong&gt;Eigent AI workforce, fully local and self-hosted.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No cloud lock-in, no data leakage, just agents running on your terms.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/eigent-ai/eigent" rel="noopener noreferrer"&gt;&lt;strong&gt;Clone the repo and build it yourself&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you run into issues, have feature requests, or just want to share what you're building, we'd love to hear from you.&lt;/p&gt;

&lt;p&gt;Join the conversation on our &lt;a href="https://discord.com/invite/CNcNpquyDc" rel="noopener noreferrer"&gt;&lt;strong&gt;Discord community&lt;/strong&gt;&lt;/a&gt;, the team and other builders hang out there to answer questions, swap ideas, and collaborate on new workflows.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>ai</category>
    </item>
    <item>
      <title>How Not to Be Replaced by AI (A Developer’s Guide)</title>
      <dc:creator>Nomadev</dc:creator>
      <pubDate>Thu, 31 Jul 2025 18:51:51 +0000</pubDate>
      <link>https://forem.com/thenomadevel/how-not-to-be-replaced-by-ai-a-developers-guide-4cpg</link>
      <guid>https://forem.com/thenomadevel/how-not-to-be-replaced-by-ai-a-developers-guide-4cpg</guid>
      <description>&lt;p&gt;Hello there, fellow developers! It's &lt;a href="https://x.com/thenomadevel" rel="noopener noreferrer"&gt;Nomadev&lt;/a&gt; here, and today we're diving into a topic on every coder’s mind: how not to get replaced by AI. With AI tools getting smarter by the day, you might be seeing scary headlines about tech giants replacing coders with AI. In fact, roughly half of people are worried they’ll lose their job to AI. But take a deep breath – the reality is more nuanced. AI is changing our jobs, not outright deleting them&lt;/p&gt;

&lt;p&gt;The key is learning to thrive alongside these new tools instead of being outpaced by them. So buckle up, and let’s explore some strategies (not too hard) to future-proof your dev career in the age of AI. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;AI is advancing in leaps and bounds, but smart developers can ride the wave by focusing on what makes us uniquely human.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Embrace AI as Your Coding Sidekick
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftde2dp0ayidt6ze1b70x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftde2dp0ayidt6ze1b70x.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rather than fearing AI, treat it as your sidekick. The best developers use new tools to their advantage – and AI is no exception. Think of coding AIs (like &lt;a href="https://cursor.com/" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt;, &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt;, &lt;a href="https://chatgpt.com/codex" rel="noopener noreferrer"&gt;Codex&lt;/a&gt;, or &lt;a href="https://www.anthropic.com/claude-code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt; as power-ups that automate the boring stuff and boost your productivity.&lt;/p&gt;

&lt;p&gt;This frees you up to focus on the interesting parts of development. As one expert put it, AI is a valuable collaborator that can handle routine work, allowing you to focus on more complex problem-solving and creative aspects of coding.&lt;/p&gt;

&lt;p&gt;In practice, this means you should &lt;strong&gt;leverage AI tools in your workflow&lt;/strong&gt;. Don’t be the developer who says “I don’t need Copilot” while everyone else speeds ahead using it. In fact, &lt;strong&gt;60% of engineering leaders are already rolling out AI coding assistants to their teams&lt;/strong&gt; – it’s becoming the new normal. So, play around with these tools: use them to generate a first draft of a function, or to get ideas for solving a bug, or to automate writing documentation. By collaborating with AI, you can code faster and smarter. The saying in tech circles is &lt;strong&gt;“AI won’t replace developers&lt;/strong&gt;, but developers &lt;strong&gt;who use AI&lt;/strong&gt; will replace those who don’t.” So hop on the bandwagon and make AI your ally.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Be a Problem Solver, Not a Code Monkey
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiqtah3ldp2rx8ww6mscw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiqtah3ldp2rx8ww6mscw.jpg" alt=" " width="736" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If your coding routine is just blindly following specs or copy-pasting Stack Overflow answers, that’s exactly the kind of work AI can do. Basic “code monkey” tasks – implementing straightforward CRUD apps or boilerplate heavy lifting – are &lt;strong&gt;ripe for automation&lt;/strong&gt;. In contrast, the developers who survive and thrive will be the ones doing what AI &lt;strong&gt;can’t&lt;/strong&gt; do well: truly solving problems. As one discussion noted, “AI will replace software engineers who only copy-paste, but not those who find solutions to problems or understand design.”&lt;br&gt;
In other words, focus on being the creative problem-solver and critical thinker on your team, not just the person who turns coffee into code by rote.&lt;/p&gt;

&lt;p&gt;What does this mean in practice? It means honing your skills in &lt;strong&gt;system design&lt;/strong&gt;, &lt;strong&gt;architecture&lt;/strong&gt;, and &lt;strong&gt;debugging complex issues&lt;/strong&gt;. AI is great at generating code from prompts, but it has no real understanding of why that code should exist. It doesn’t grasp high-level design principles or the nuances of your specific product and users&lt;br&gt;
&lt;strong&gt;Human brains excel at dealing with ambiguity, inventing new approaches, and making judgment calls&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Pro tip: If you often find yourself waiting for someone to tell you exactly what to do, flip the script. Start taking initiative in defining how to solve a task. The more you practice this, the more you transition from “the one being instructed” (replaceable) to “&lt;strong&gt;the one giving instructions&lt;/strong&gt;” (invaluable).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In short, be the developer who solves problems, not just the one who writes whatever code they’re told to write. That mindset shift will make you much harder to replace.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Double Down on Your Human Skills (Creativity, Context and Communication)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvpmbaxj8jmvu4w77laf9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvpmbaxj8jmvu4w77laf9.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI might be superhuman in cranking out code or analyzing data, but it’s still artificial. There are core “human” skills that give you an edge. One is &lt;strong&gt;creativity&lt;/strong&gt;. Sure, generative AI can mix and mash patterns from its training data, but it’s not truly inventing something new the way a human can.&lt;/p&gt;

&lt;p&gt;As a developer, you can come up with creative solutions, innovative algorithms, or clever workarounds that aren’t obvious from past data. Cultivate that creativity by experimenting with new technologies, doing hackathon projects, or simply practicing thinking outside the box in your implementations. &lt;/p&gt;

&lt;p&gt;Another human advantage is &lt;strong&gt;contextual understanding&lt;/strong&gt;. You as a developer understand your project’s purpose, your users’ needs, and your company’s goals. AI doesn’t grasp the “big picture” or the why behind the code. Use that to your benefit: involve yourself in product discussions, user feedback, and domain knowledge. If you know why a feature matters and how users will interact with it, you can design and tweak it in ways an AI-generated solution wouldn’t foresee. Being able to align technology with real-world needs – essentially translating business requirements into tech – makes you incredibly valuable. &lt;/p&gt;

&lt;p&gt;Don’t forget &lt;strong&gt;communication and teamwork&lt;/strong&gt; skills, either. Coding is often a team sport. Explaining your ideas, listening to others, and collaborating effectively are things no AI can do with human nuance. For example, discussing trade-offs with a product manager or doing a code review that sensitively educates a junior colleague – those require human empathy and communication. In the future, as routine coding gets more automated, skills like communication, mentorship, and leadership will likely become even more important, not less. Developers who can connect with people (whether teammates or users) will always be in demand. &lt;/p&gt;

&lt;p&gt;AI can even paint by numbers, but true creativity and innovation are still uniquely human traits. Focus on design and ideas that go beyond the data an AI was trained on. &lt;/p&gt;

&lt;p&gt;In summary, &lt;strong&gt;sharpen the human elements of your craft.&lt;/strong&gt; Creativity, context, and communication – these are your moat against automation.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Never Stop Learning and Adapting
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbdvf2976hotxre2lpmd4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbdvf2976hotxre2lpmd4.gif" alt=" " width="220" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The tech world moves fast, and AI is only accelerating that pace. To avoid obsolescence, adopt a &lt;strong&gt;lifelong learning mindset.&lt;/strong&gt; That means continuously updating your skills, learning new languages or frameworks when needed, and crucially, &lt;strong&gt;learning about AI itself.&lt;/strong&gt; The good news is that AI can actually help you learn faster (hello, AI tutors and interactive docs!). But it won’t matter if you don’t take the initiative. &lt;/p&gt;

&lt;p&gt;A clear real-world sign: companies like Amazon have literally warned their developers to &lt;strong&gt;“upskill now”&lt;/strong&gt; because AI is advancing fast. In other words, standing still is not an option. Make a habit of staying up-to-date on industry trends – read blogs, try out new tools, maybe take an online course on machine learning or prompt engineering. Even if AI automates some parts of coding, entirely new roles and opportunities will emerge for those who understand it. By riding the wave of automation and picking up the skills that become more valuable, you ensure you’re surfing ahead of the break, not getting wiped out.&lt;/p&gt;

&lt;p&gt;Importantly, &lt;strong&gt;keep your fundamentals strong&lt;/strong&gt; as well. One instructor noted that programmers still need solid fundamental knowledge to effectively use AI and understand its output&lt;br&gt;
This means you shouldn’t skip learning algorithms, data structures, or how to debug and test thoroughly – these give you the intuition to catch AI’s mistakes and improve on its suggestions. In fact, a savvy developer uses AI to generate a solution, then uses their human skills to refine and correct it. That synergy can produce better results than either a human or AI alone. &lt;/p&gt;

&lt;p&gt;Finally, be &lt;strong&gt;adaptable&lt;/strong&gt; in your career. The projects and tech stacks you work on in five years might look very different from today’s. And that’s okay – if you’re adaptable. Be open to new roles that might emerge. Maybe in the future “AI facilitator” or “prompt engineer” becomes a common part of dev teams, or maybe you find yourself integrating AI APIs into every app. The more you roll with these changes and pick up new capabilities, the more indispensable you become. As one set of experts concluded, staying ahead by continuously learning and being willing to incorporate AI tools into your workflow makes you versatile and ready for whatever the industry throws your way.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Conclusion: Team Human + AI for the Win
&lt;/h2&gt;

&lt;p&gt;At the end of the day, the future of programming isn’t AI vs. developers – it’s AI with developers. The most likely scenario is that AI becomes a powerful tool in the developer’s toolbox, handling chunks of code and tedious tasks, while humans provide direction, creativity, and critical oversight. We’re already seeing that dynamic: AI frees developers to tackle more creative and complex work, essentially leveling up the kind of problems we focus on Development roles will evolve (you might write fewer lines of trivial code and spend more time orchestrating AI or fine-tuning architecture), but human developers will remain necessary. &lt;/p&gt;

&lt;p&gt;So, don’t panic about being replaced. Instead, evolve with the technology. Keep coding, keep learning, and find your unique value in this new landscape. The fact that you’re reading this shows you care about your growth – and that mindset is your biggest asset. Embrace AI, sharpen your human strengths, and you’ll do just fine. In fact, you’ll do better than fine - you’ll be leading the charge in whatever the future of software development looks like. &lt;/p&gt;

&lt;p&gt;Last but not least, remember that the journey is more fun with community. Stay curious, keep experimenting, and never hesitate to seek out knowledge (or share it). And yes, one great way to stay updated with the latest AI and dev insights is to follow &lt;a href="https://x.com/thenomadevel" rel="noopener noreferrer"&gt;@thenomadevel&lt;/a&gt; – I’ll be right there learning and sharing alongside you. 😉 &lt;/p&gt;

&lt;p&gt;Until next time, happy coding and keep rocking that uniquely human creativity! You’ve got this. 🙌&lt;/p&gt;

&lt;h2&gt;
  
  
  Let’s Connect and Build Together
&lt;/h2&gt;

&lt;p&gt;Here’s how we can collaborate:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open to DevRel partnerships to help brands grow through educational content.
&lt;/li&gt;
&lt;li&gt;Have an AI MVP idea or need consultancy services for AI-based applications and research projects? Let’s make it happen!
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9dn31r00hemkraqq4lfq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9dn31r00hemkraqq4lfq.png" alt=" " width="800" height="862"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📧 &lt;strong&gt;Drop a mail at&lt;/strong&gt;: &lt;a href="//mailto:thenomadevel@gmail.com"&gt;thenomadevel@gmail.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>beginners</category>
      <category>python</category>
    </item>
    <item>
      <title>How I Got an AI Agent to Read and Reply on WhatsApp Automatically</title>
      <dc:creator>Nomadev</dc:creator>
      <pubDate>Tue, 27 May 2025 06:38:37 +0000</pubDate>
      <link>https://forem.com/thenomadevel/how-i-got-an-ai-agent-to-read-and-reply-on-whatsapp-automatically-am1</link>
      <guid>https://forem.com/thenomadevel/how-i-got-an-ai-agent-to-read-and-reply-on-whatsapp-automatically-am1</guid>
      <description>&lt;p&gt;Hey! If you're into building smart, real-time AI that feels like magic but runs on clean logic — you're in the right place. I'm &lt;a href="https://x.com/thenomadevel" rel="noopener noreferrer"&gt;Nomadev&lt;/a&gt;, and in this guide, we’re connecting an AI agent to WhatsApp so it can actually read, reply, and even reason using OWL and MCP.&lt;/p&gt;

&lt;p&gt;So we went ahead and built one using &lt;a href="https://docs.camel-ai.org/" rel="noopener noreferrer"&gt;CAMEL-AI’s&lt;/a&gt; &lt;a href="https://github.com/camel-ai/owl" rel="noopener noreferrer"&gt;OWL&lt;/a&gt; multi-agent framework and a WhatsApp MCP server. In this post, I’ll walk you through exactly how to do it, what tools are involved, and how everything fits together.&lt;/p&gt;

&lt;p&gt;By the end, you’ll have a real-time WhatsApp assistant that can read messages, understand context, use tools (like search) and respond intelligently.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkquj51twk8bwpbnywyp5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkquj51twk8bwpbnywyp5.gif" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What We’re Building (and Why It’s Cool)
&lt;/h2&gt;

&lt;p&gt;Imagine sending a message to WhatsApp like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What’s the weather in Tokyo this weekend?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And your AI assistant replies a few seconds later like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Looks like 23°C and mostly sunny. Pack those shades.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No need to open a browser or app — your agent handled it in the background.&lt;/p&gt;

&lt;p&gt;We’re making that possible by plugging OWL into WhatsApp using a Model Context Protocol (MCP) server.&lt;/p&gt;

&lt;p&gt;Let’s break down how it all works.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s This MCP Thing?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://modelcontextprotocol.io/introduction" rel="noopener noreferrer"&gt;Model Context Protocol (MCP)&lt;/a&gt; is like a universal translator for LLMs.&lt;br&gt;
Instead of hardcoding how an AI talks to every app or service, MCP gives us a clean way to plug tools (like WhatsApp) into AI systems with zero mess.&lt;/p&gt;

&lt;p&gt;Here’s how the pieces play together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP Server →&lt;/strong&gt; Adapts a tool (like WhatsApp) into a format AI can understand&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Client →&lt;/strong&gt; Lives on the AI side and sends/receives data to/from the server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Host →&lt;/strong&gt; Runs the whole show (in our case, that’s OWL)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📞 Think of it like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OWL is the person making the call (MCP host)&lt;/li&gt;
&lt;li&gt;The phone they use is the MCP client&lt;/li&gt;
&lt;li&gt;The friend on the other end (WhatsApp tool) is the MCP server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You now have a modular, secure, and elegant way to let AI interact with apps like WhatsApp.&lt;/p&gt;


&lt;h2&gt;
  
  
  A Quick Look at OWL (Optimized Workforce Learning)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff34y6lykuw7dpvprr6y5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff34y6lykuw7dpvprr6y5.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OWL is CAMEL-AI’s framework for building multi-agent systems that think and collaborate.&lt;br&gt;
Instead of one lonely agent trying to do everything, OWL lets agents role-play and delegate.&lt;/p&gt;

&lt;p&gt;In our case:&lt;/p&gt;

&lt;p&gt;One agent plays the user to orchestrate the query user asked&lt;/p&gt;

&lt;p&gt;Another agent plays the assistant that helps with tool calling and aligns with the user agent&lt;/p&gt;

&lt;p&gt;And thanks to real-time messaging support, it feels natural. The assistant keeps context, remembers past replies, and actually gets what you’re trying to say (even across multiple messages).&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠️ Let’s Build: WhatsApp AI Assistant with OWL
&lt;/h2&gt;

&lt;p&gt;✅ Prereqs&lt;br&gt;
Before we dive in, here’s what you’ll need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go (for running the WhatsApp bridge)&lt;/li&gt;
&lt;li&gt; Python 3.10+&lt;/li&gt;
&lt;li&gt; OpenAI API Key (or any LLM setup that OWL supports)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🔧 Step 1: Clone the Code
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# OWL framework (multi-agent brain)
[git clone https://github.com/camel-ai/owl.git](git clone https://github.com/camel-ai/owl.git)

# WhatsApp MCP integration (the WhatsApp bridge)
[git clone https://github.com/lharries/whatsapp-mcp.git](git clone https://github.com/lharries/whatsapp-mcp.git)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The OWL repo includes the full WhatsApp demo under &lt;a href="https://github.com/camel-ai/owl/tree/main/community_usecase/Whatsapp-MCP" rel="noopener noreferrer"&gt;community_usecase/Whatsapp-MCP&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  🔁 Step 2: Fire Up the WhatsApp Bridge
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd whatsapp-mcp/whatsapp-bridge
go mod download
go run main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You’ll see a QR code pop up.&lt;br&gt;
Scan it using your WhatsApp (just like WhatsApp Web) to link your account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Keep this bridge running in a separate terminal. It’s your live connection to WhatsApp.&lt;/p&gt;
&lt;h3&gt;
  
  
  🧩 Step 3: Configure MCP
&lt;/h3&gt;

&lt;p&gt;Create a file called &lt;code&gt;mcp_config_whatsapp.json&lt;/code&gt; like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "mcpServers": {
    "whatsapp": {
      "command": "&amp;lt;PATH_TO_UVICORN&amp;gt;",
      "args": [
        "&amp;lt;PATH_TO_WHATSAPP_MCP_SERVER_MAIN.py&amp;gt;",
        "--connect_serial_host",
        "--only_one"
      ]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lets OWL know how to launch and connect to the WhatsApp server.&lt;br&gt;
Just swap in the actual file paths where needed.&lt;/p&gt;
&lt;h3&gt;
  
  
  🧠Step 4: Launch the OWL Agent
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd owl
python community_usecase/Whatsapp-MCP/app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Starts OWL’s multi-agent brain&lt;/li&gt;
&lt;li&gt;Launches the WhatsApp MCP server via Uvicorn&lt;/li&gt;
&lt;li&gt;Connects everything together&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now try messaging your WhatsApp account (from another phone or friend).&lt;br&gt;
Your AI agent will reply — in real-time — directly inside WhatsApp. No extra apps or dashboards.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Uw708nIwMqU"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  🧪 Behind the Scenes
&lt;/h3&gt;

&lt;p&gt;Under the hood, this is what’s happening:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Message arrives in WhatsApp&lt;/li&gt;
&lt;li&gt;WhatsApp MCP server receives it&lt;/li&gt;
&lt;li&gt;OWL’s assistant agent reads it via MCP&lt;/li&gt;
&lt;li&gt;Agent reasons about the best reply&lt;/li&gt;
&lt;li&gt;The reply gets sent back through the server&lt;/li&gt;
&lt;li&gt;You see it in WhatsApp&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🧵 Bonus: The Python Behind It
&lt;/h3&gt;

&lt;p&gt;Want to peek inside the code that powers this?&lt;br&gt;
We’ve got role construction, tool config, and async orchestration — all wrapped in one OWL script.&lt;/p&gt;

&lt;p&gt;(You can find the full script inside the OWL repo → &lt;a href="https://github.com/camel-ai/owl/blob/main/community_usecase/Whatsapp-MCP/app.py" rel="noopener noreferrer"&gt;community_usecase/Whatsapp-MCP/app.py&lt;/a&gt;)&lt;/p&gt;




&lt;h3&gt;
  
  
  Pro Tips &amp;amp; Troubleshooting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bridge not scanning?&lt;/strong&gt; Run it again to get a fresh QR code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No reply showing?&lt;/strong&gt; Check that the Python and Go processes are both running&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrong path in config?&lt;/strong&gt; Triple-check your main.py and Uvicorn paths&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent feels slow?&lt;/strong&gt; First message might take a few seconds to process&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 Final Thoughts
&lt;/h3&gt;

&lt;p&gt;This isn’t just a hacky integration — it’s a modular system.&lt;br&gt;
You can swap out WhatsApp for Slack, Gmail, Notion, or any other MCP server and keep the same AI logic in OWL.&lt;/p&gt;

&lt;p&gt;Today it's WhatsApp. Tomorrow?&lt;br&gt;
Your agent could be trading stocks, controlling IoT devices, or managing your entire workflow.&lt;/p&gt;

&lt;p&gt;Want to dive deeper into MCP servers and discover other integrations?&lt;br&gt;
🔗 checkout this blog: &lt;a href="https://dev.to/thenomadevel/7-mcp-sites-every-ai-dev-should-bookmark-2gno"&gt;7 MCP Sites Every AI Dev Should Bookmark&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🧘‍♂️ Wrap-Up
&lt;/h3&gt;

&lt;p&gt;So if you’ve ever wanted an AI that can manage your WhatsApp like a helpful teammate (while you stay focused or just vibe to some lo-fi), now you know how to build it.&lt;/p&gt;

&lt;p&gt;Catch you soon with more agent tricks, smart setups, and relaxed dev energy.&lt;/p&gt;

&lt;p&gt;—&lt;a href="https://x.com/thenomadevel" rel="noopener noreferrer"&gt; Nomadev&lt;/a&gt;&lt;br&gt;
Follow me on X for more AI experiments and automation builds 🚀&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>python</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>So I Hooked My AI Agent Up with Notion. Here's What Happened.</title>
      <dc:creator>Nomadev</dc:creator>
      <pubDate>Fri, 23 May 2025 13:46:23 +0000</pubDate>
      <link>https://forem.com/thenomadevel/so-i-hooked-my-ai-agent-up-with-notion-heres-what-happened-21oi</link>
      <guid>https://forem.com/thenomadevel/so-i-hooked-my-ai-agent-up-with-notion-heres-what-happened-21oi</guid>
      <description>&lt;p&gt;Hey there, I’m &lt;a href="https://x.com/thenomadevel" rel="noopener noreferrer"&gt;Nomadev&lt;/a&gt; and today we’re doing something futuristic and cozy: getting your AI agent to update Notion for you. Yup, hands in your pockets, favorite lo-fi track on, and let’s automate like a boss.&lt;/p&gt;

&lt;p&gt;With &lt;a href="https://www.camel-ai.org/" rel="noopener noreferrer"&gt;CAMEL-AI’s&lt;/a&gt; general purpose agent(open-source) and Notion’s Model Context Protocol (MCP) server, your agent can now read from and write to your Notion workspace, all in a single prompt.&lt;/p&gt;

&lt;p&gt;Let’s walk through how to make it happen. By the end, your OWL agent will be searching for Notion pages and updating them based on your prompts&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqv37leudgbg1few1dbs9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqv37leudgbg1few1dbs9.jpg" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s CAMEL-AI, OWL, and MCP?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;CAMEL-AI&lt;/strong&gt; is the first multi-agent framework, it helps build multi-agent systems that work together smartly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/camel-ai/owl" rel="noopener noreferrer"&gt;OWL (Optimized Workforce Learning)&lt;/a&gt;&lt;/strong&gt; is one of the best general purpose open-source agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP&lt;/strong&gt; is the bridge a protocol that lets your agent talk to external tools (like &lt;a href="https://www.notion.com/" rel="noopener noreferrer"&gt;Notion&lt;/a&gt;) securely.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Prep Notion for Your Agent
&lt;/h2&gt;

&lt;p&gt;Before we code, let’s give our agent some polite access to your Notion workspace.&lt;/p&gt;

&lt;p&gt;🔹 Create a Notion Integration&lt;br&gt;
Go to Notion → Settings &amp;amp; Members → Integrations → “+ New Integration”&lt;br&gt;
Name it something cool like MyMCP Bot, set it to Internal, and save.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5oyvzoiy8a9pkh5qm9hr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5oyvzoiy8a9pkh5qm9hr.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔹 Scope It Down (Safety First)&lt;br&gt;
Only enable “Read content” to keep things chill and privacy-safe. You can enable editing later once you’re confident.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F46kwp78u15rd7vp01gxz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F46kwp78u15rd7vp01gxz.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔹 Copy the Token (Keep it Safe)&lt;br&gt;
This is your API key. It starts with secret_ or ntn_. Guard it like your Netflix password.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frwzo6n1h0bfc61cxh3ec.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frwzo6n1h0bfc61cxh3ec.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔹 Share a Page with It&lt;br&gt;
Pick the page (e.g., “Travel Itinerary”) and connect the integration to it. That’s how you let your agent in.&lt;/p&gt;
&lt;h2&gt;
  
  
  🛠️ Step 2: Hook CAMEL’s MCPToolkit to Notion
&lt;/h2&gt;

&lt;p&gt;Now let’s tell CAMEL where our Notion MCP server lives. Create a json file let's call it mcp_config.json:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "mcpServers": {
    "notionApi": {
      "command": "npx",
      "args": ["-y", "@notionhq/notion-mcp-server"],
      "env": {
        "OPENAPI_MCP_HEADERS": "{\"Authorization\": \"Bearer ntn_****\", \"Notion-Version\": \"2022-06-28\" }"
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;In Python:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from camel.toolkits import MCPToolkit
from owl.utils.enhanced_role_playing import OwlRolePlaying, arun_society

mcp_toolkit = MCPToolkit(config_path="mcp_config.json")
await mcp_toolkit.connect()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just like that, your OWL agent is now equipped to use Notion like a pro assistant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Build an OWL Agent That Updates Notion
&lt;/h2&gt;

&lt;p&gt;Here’s the vibe: you give the OWL agent a task (like "Add 10 European travel destinations to a Notion page"), and the agent figures out what tools to use and when.&lt;/p&gt;

&lt;p&gt;No micromanaging. Just chill orchestration.&lt;/p&gt;

&lt;p&gt;Here’s a snippet to get that going:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;default_task = """
Find the page titled 'Travel Itinerary'
Add a list of Top 10 travel destinations in Europe, their descriptions, and best time to visit.
"""

tools = [*mcp_toolkit.get_tools()]
society = await construct_society(default_task, tools)
await execute_notion_task(society)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Behind the scenes, CAMEL’s OWL orchestrator handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Finding the page&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Appending the list&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reasoning and retrying if anything fails&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All from that single natural language prompt. Pretty slick, right?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎬 Want to See It in Action?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Watch how OWL agents update Notion pages like pros — no extra hustle:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/O1Po_n9M3DY"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Try it out here: &lt;a href="https://github.com/camel-ai/owl/tree/main/community_usecase/Notion-MCP" rel="noopener noreferrer"&gt;GitHub Community Use Case&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Future Use Cases (Yes, It Gets Cooler)
&lt;/h3&gt;

&lt;p&gt;Now that your agent can read/write Notion, here’s what’s possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summarize and log meetings in Notion.&lt;/li&gt;
&lt;li&gt;Cross-reference docs from across tools.&lt;/li&gt;
&lt;li&gt;Update your weekly planner with new tasks.&lt;/li&gt;
&lt;li&gt;Build your own AI that reads docs + writes notes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best part? It’s all under your control. Minimal permissions. Clear logs. Agent tools only run when they’re allowed.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧘‍♂️ Wrap-Up
&lt;/h3&gt;

&lt;p&gt;We just gave our OWL agent the power to talk to Notion securely using MCP and made it do useful stuff autonomously.&lt;/p&gt;

&lt;p&gt;It’s not just automation. It’s intelligent, role-based, LLM-orchestrated chill-tech.&lt;/p&gt;

&lt;p&gt;So if you’ve ever dreamed of an AI assistant that updates your Notion pages while you sip your iced coffee, now you know how to build it.&lt;/p&gt;

&lt;p&gt;Catch you soon with more tech, tools, and chill!&lt;/p&gt;

&lt;p&gt;— &lt;a href="https://x.com/thenomadevel" rel="noopener noreferrer"&gt;Nomadev&lt;/a&gt;&lt;br&gt;
Follow me on X for more agent hacks and cozy AI builds 🚀&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>beginners</category>
      <category>opensource</category>
    </item>
    <item>
      <title>7 MCP Sites Every AI Dev Should Bookmark</title>
      <dc:creator>Nomadev</dc:creator>
      <pubDate>Thu, 15 May 2025 04:35:19 +0000</pubDate>
      <link>https://forem.com/thenomadevel/7-mcp-sites-every-ai-dev-should-bookmark-2gno</link>
      <guid>https://forem.com/thenomadevel/7-mcp-sites-every-ai-dev-should-bookmark-2gno</guid>
      <description>&lt;p&gt;Hey everyone, it’s &lt;a href="https://x.com/thenomadevel" rel="noopener noreferrer"&gt;Nomadev&lt;/a&gt; here with a brand-new roundup! 🚀 &lt;/p&gt;

&lt;p&gt;If you caught my last post on &lt;a href="https://dev.to/thenomadevel/a2a-vs-mcp-connecting-ai-agents-and-tools-4a8"&gt;A2A vs MCP: Connecting AI Agents and Tools&lt;/a&gt;, you know I’m a bit biased toward MCP. Today, I’m super excited to share &lt;strong&gt;7 Must-Know MCP Hubs Every AI Developer Should Explore&lt;/strong&gt;, these are the go-to spots I use to level up my agents with new tools. &lt;/p&gt;

&lt;p&gt;Alright, so let's dive in without any more waiting. 🔥&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2w44q3pag6fk7bsdyh25.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2w44q3pag6fk7bsdyh25.gif" alt="Image description" width="1000" height="500"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1. &lt;a href="https://smithery.ai/" rel="noopener noreferrer"&gt;Smithery&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbng4hh6f7fbndjwtj1k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbng4hh6f7fbndjwtj1k.png" alt="Image description" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Discovery meets power with Smithery. This registry puts thousands of MCP servers at your fingertips, including web scrapers, database connectors and desktop automation so you can instantly bolt new capabilities onto your AI agents. Want to fetch live data or execute code without breaking a sweat? Smithery makes it happen in just a few clicks.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. &lt;a href="https://mcpservers.org/" rel="noopener noreferrer"&gt;Awesome MCP Servers  &lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslbnq5pc2g4evto6q9m8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslbnq5pc2g4evto6q9m8.png" alt="Image description" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Awesome MCP Servers is a community-curated treasure trove of open-source MCP endpoints, covering everything from web scraping and Git integrations to cloud storage and database tools. &lt;br&gt;
They even added a dedicated Remote Servers section, so you can plug into high-quality hosted MCP services like Sentry, Intercom, and PayPal without running anything locally.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. &lt;a href="https://www.aci.dev/" rel="noopener noreferrer"&gt;ACI.dev&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7m0ldfisnuqeso2cofr2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7m0ldfisnuqeso2cofr2.png" alt="Image description" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This platform connects your AI agents to 500+ pre-built integrations—from Gmail and Notion to Slack and HubSpot—through a single, unified MCP server. Built-in multi-tenant authentication and granular permissions mean you can spin up production-ready workflows without juggling OAuth tokens or custom security layers. &lt;/p&gt;

&lt;p&gt;Need to let end users authorize agents or manage secrets securely? ACI.dev handles the heavy lifting so you can focus on building smarter agents.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. &lt;a href="https://mcp.camel-ai.org/" rel="noopener noreferrer"&gt;MCP Hub by CAMEL-AI&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fog0rc4grx8d8hxfxvpww.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fog0rc4grx8d8hxfxvpww.png" alt="Image description" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Discovery meets customization with the CAMEL-AI MCP Hub. This official directory lets you explore and compare first-party and community-driven MCP servers such as web browsers, database adapters, video summarizers and secure code sandboxes. &lt;/p&gt;

&lt;p&gt;Need an Astra DB adapter you can install with a single npm command or a Cloudflare Workers toolkit to deploy at the edge? The CAMEL-AI MCP Hub provides ready-to-use configurations and examples so you can plug powerful tools straight into your agents without reinventing the wheel.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. &lt;a href="https://www.pulsemcp.com/" rel="noopener noreferrer"&gt;PulseMCP&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fld8694c09tao4o8d84oy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fld8694c09tao4o8d84oy.png" alt="Image description" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This hub keeps you up to date on everything MCP — from a searchable directory of 4,300+ servers and 250+ clients to real-world use-case spotlights and weekly ecosystem news. Want to discover the latest error-tracking integrations, browse vetted VS Code plugins, or see how others are automating workflows? PulseMCP curates it all in one place and updates daily so you never miss a beat.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Klavis AI
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetqv0cldpim54luuedjz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetqv0cldpim54luuedjz.png" alt="Image description" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This API-first service lets you spin up production-grade MCP servers—everything from web search and video processing to report generation—with a single REST call. Provision and manage your servers programmatically, handle millions of interactions with built-in monitoring, and offload the heavy lifting of hosting and scaling. KlavisAI makes it seamless to plug powerful, managed MCP capabilities into your agents in minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. &lt;a href="https://mcp.composio.dev/" rel="noopener noreferrer"&gt;Composio &lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwix32012lh5sx80cfh4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwix32012lh5sx80cfh4.png" alt="Image description" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Orchestration meets simplicity with Composio. This platform brings 100+ managed MCP servers under one roof, complete with built-in authentication and seamless scaling. Connect your agents to Gmail, GitHub, Notion, Slack, and more in a few clicks, then drag, drop, and chain actions to build end-to-end workflows—no custom glue code or token juggling required. Composio lets you automate complex processes with a few lines of JSON.&lt;/p&gt;




&lt;p&gt;And that’s a wrap on my top 7 MCP hubs! These platforms cover everything from discovery to enterprise orchestration—and trust me, you can’t afford to miss them if you’re serious about MCP features.&lt;/p&gt;

&lt;p&gt;🔥 &lt;strong&gt;Try them out&lt;/strong&gt;, plug them into your agents, and let me know which one becomes your favorite! Drop your thoughts or any other hubs I might’ve missed in the comments below.&lt;/p&gt;

&lt;p&gt;Until next time, keep experimenting and build something awesome! 💪&lt;/p&gt;

&lt;p&gt;— &lt;a href="https://x.com/thenomadevel" rel="noopener noreferrer"&gt;Nomadev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>javascript</category>
      <category>ai</category>
      <category>beginners</category>
    </item>
    <item>
      <title>A2A vs MCP: Connecting AI Agents and Tools</title>
      <dc:creator>Nomadev</dc:creator>
      <pubDate>Sun, 11 May 2025 11:35:59 +0000</pubDate>
      <link>https://forem.com/thenomadevel/a2a-vs-mcp-connecting-ai-agents-and-tools-4a8</link>
      <guid>https://forem.com/thenomadevel/a2a-vs-mcp-connecting-ai-agents-and-tools-4a8</guid>
      <description>&lt;p&gt;The AI ecosystem is buzzing with new standards for how models, tools, and agents interconnect. Two big newcomers are Google’s A2A (Agent-to-Agent) protocol and &lt;a href="https://www.anthropic.com/news/model-context-protocol" rel="noopener noreferrer"&gt;Anthropic’s&lt;/a&gt; MCP (Model Context Protocol). At a high level, A2A sets out to standardize how complete AI agents talk and collaborate, while MCP standardizes how a language model hooks up to tools and data sources. &lt;/p&gt;

&lt;p&gt;In practice, the two have different goals and architectures but can actually complement each other (and even overlap) in building agent-based systems. Let’s dive into what each protocol is, how they’re designed, and why both matter for the future of AI products.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is A2A (Agent-to-Agent)?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvaw9hz4iqu6kmpnwupg9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvaw9hz4iqu6kmpnwupg9.png" alt="Image description" width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/google/A2A" rel="noopener noreferrer"&gt;A2A&lt;/a&gt; is Google’s open spec for agents to talk to each other. In this vision, each agent is a self-contained AI service (an LLM plus any tools or functions it uses), and A2A defines a standard communication framework for those agents. In practice, A2A uses a client–server style architecture where one agent can discover and delegate tasks to another, exchanging messages and “artifacts” as the work progresses. &lt;/p&gt;

&lt;p&gt;Each agent publishes an agent card (a JSON profile listing its capabilities and endpoints) so others can find it. Under the hood A2A uses HTTP/HTTPS with JSON-RPC calls for structured requests and Server-Sent Events (or WebSockets) for streaming replies, all packaged in JSON. &lt;/p&gt;

&lt;p&gt;In short, A2A lets AI agents (say, a “travel planner” bot) talk to other specialized agents (e.g. “flight-booking agent”, “hotel-finder agent”) in a consistent way. The protocol even handles task hand-offs, progress updates, error handling, and follow-up questions. In the words of Google’s documentation, “A2A is a standardized communication framework that enables AI agents to interact with each other in a consistent, predictable way”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key components of A2A include:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxczp88n8evd0id2mu0f7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxczp88n8evd0id2mu0f7.png" alt="Image description" width="800" height="664"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Agent Cards:&lt;/strong&gt; JSON profiles advertising what an agent can do (its name, provider, endpoint, and capabilities)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tasks and Messages:&lt;/strong&gt; A “task” is a job handed off to an agent; it has lifecycle states (submitted, running, input-required, completed, etc.) and carries message envelopes and artifacts&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Client–Server Model:&lt;/strong&gt; Agents act as clients or servers dynamically. One agent (client) may assign tasks to another (server), but roles can shift as agents collaborate&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Supported Patterns:&lt;/strong&gt; A2A handles asynchronous or long-running tasks (streaming partial results), multimodal payloads, clarifications, and standardized error formats&lt;/p&gt;

&lt;p&gt;In short, A2A is about agent-to-agent collaboration. It answers questions like “How does Agent A discover Agent B and ask it to do something on my behalf?” For example, &lt;a href="https://developers.googleblog.com/en/a2a-a-new-era-of-agent-interoperability/" rel="noopener noreferrer"&gt;Google’s own blog&lt;/a&gt; shows a workflow where an HR assistant agent finds candidate-sourcing and scheduling agents, asks clarifying questions, and merges the results into one solution for the user&lt;/p&gt;

&lt;p&gt;This makes possible complex, multi-agent solutions (like planning a multi-city trip or automating a finance workflow) by reusing specialized agents as building blocks.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is MCP (Model Context Protocol)?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgqqqx0z91853yvkqknt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgqqqx0z91853yvkqknt.png" alt="Image description" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In contrast,&lt;a href="//modelcontextprotocol.io"&gt; MCP (Model Context Protocol)&lt;/a&gt; is designed to connect an LLM-based application to data, APIs, and tools in a standardized way. Think of MCP as a “USB-C port” for AI: just as USB-C provides a common plug for many devices, MCP provides a common interface for LLMs to access external knowledge and functionality&lt;/p&gt;

&lt;p&gt;In MCP, there are MCP hosts or clients (like a chat app or IDE that has an AI assistant) and MCP servers (small services that expose particular data sources or APIs). A typical setup: an AI host (e.g. a chatbot using Claude or GPT) has one or more MCP client components that each maintain a 1:1 connection to an MCP server. Those servers each grant the model access to a specific resource. For example, an MCP server might wrap Google Drive, Slack history, a database, or a web API. When the AI model needs context (e.g. “show me my last five emails”), the host asks the relevant MCP client, which sends a JSON-RPC request to the server. &lt;/p&gt;

&lt;p&gt;The server returns the data, which the AI can then use in its reasoning or response. Anthropic describes MCP as “an open standard that enables developers to build secure, two-way connections between their data sources and AI-powered tools”&lt;/p&gt;

&lt;p&gt;The MCP architecture is simple: applications that want data act as MCP clients, while each data source implements an MCP server. The protocol uses JSON-RPC 2.0 messages for all calls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key elements include:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4jvfvtfgtehefdefz2oz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4jvfvtfgtehefdefz2oz.png" alt="Image description" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP Clients/Hosts:&lt;/strong&gt; These live inside the AI application (e.g. Claude Desktop, a chatbot, or an IDE extension). They initiate connections and send requests for data or actions via MCP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP Servers:&lt;/strong&gt; Lightweight servers (often open-source) that expose a particular capability or dataset. Each server declares a schema: what prompts or tool uses it supports. There are already MCP servers for things like Google Drive, Slack, GitHub, databases, even custom code run via Puppeteer&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local vs Remote Sources:&lt;/strong&gt; MCP servers can access local resources (your files, databases, local services) securely, as well as remote APIs over the Internet&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capability Negotiation:&lt;/strong&gt; On connecting, the client and server exchange metadata. The server tells the client what prompts, actions, or tools it can provide (like a function signature)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session State:&lt;/strong&gt; MCP maintains a session so the server can remember previous exchanges. It focuses on exchanging context and coordination between client and server&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Differences
&lt;/h2&gt;

&lt;p&gt;In practice, MCP lets any AI app plug into arbitrary data easily. Anthropic notes that MCP “provides a universal, open standard for connecting AI systems with data sources, replacing fragmented integrations with a single protocol”&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;A2A (Agent-to-Agent)&lt;/th&gt;
&lt;th&gt;MCP (Model Context Protocol)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Focus &amp;amp; Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Treats each system as a full agent (LLM + tools). Defines how agents discover one another, delegate tasks, and collaborate on multi-agent workflows.&lt;/td&gt;
&lt;td&gt;Assumes one side is an LLM application (host) and the other a data/tool provider (server). Standardizes how a model communicates with external tools and data sources.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mesh client–server among agents. Agents publish “agent cards” (JSON profiles) and call each other’s APIs via JSON-RPC or REST. Emphasizes task lifecycle, streaming, and peer discovery.&lt;/td&gt;
&lt;td&gt;Hub-and-spoke: the AI host (hub) connects to multiple MCP servers (spokes). No peer discovery—clients know which server to call based on context. Uses JSON-RPC 2.0 over HTTP (or stdio).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Flow&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data moves between agents as part of delegated tasks (e.g. Agent A asks Agent B to perform work and return a result).&lt;/td&gt;
&lt;td&gt;Data flows between a model and a static resource (e.g. “get this document” or “query that database”).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Standards &amp;amp; Tech&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JSON, HTTP/HTTPS, JSON-RPC, Server-Sent Events for streaming, agent cards, artifacts, built-in enterprise-grade auth (OAuth, OIDC, API keys).&lt;/td&gt;
&lt;td&gt;JSON, HTTP/HTTPS or stdio, JSON-RPC 2.0. Early versions used simple API keys; newer implementations adopt OAuth 2.0/DCR for stronger security.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Intended Use&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;“Cross-vendor discovery” on the public internet—agents from different organizations working together (“Who can do X for me?”).&lt;/td&gt;
&lt;td&gt;Reliable connection of your AI application to internal or SaaS data (“I need data X—connect me to the server that has it”).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Overlap &amp;amp; Complementarity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Handles high-level agent orchestration. In practice, A2A agents often rely on MCP servers for tool/data access and may register themselves as MCP “resources” for discovery.&lt;/td&gt;
&lt;td&gt;Handles low-level model-to-tool wiring. Complements A2A by feeding agents the context and capabilities they need during multi-agent workflows. Can run inside A2A task payloads for seamless integration.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;It supports asynchronous workflows and partial results, which is crucial for long tasks. By standardizing discovery and capabilities, A2A greatly simplifies multi-agent architectures – think of it as a common rail that diverse agents can tap into.&lt;/p&gt;

&lt;h2&gt;
  
  
  Strengths and Challenges
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhrmk0kmrk7xw2v3dl8ex.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhrmk0kmrk7xw2v3dl8ex.png" alt="Image description" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A2A Strengths:&lt;/strong&gt; It enables modular agent networks. Agents from different vendors can interoperate if they speak A2A. It has enterprise-grade features out of the box (OAuth/OIDC auth, streaming, error semantics) for building real applications&lt;/p&gt;

&lt;p&gt;It supports asynchronous workflows and partial results, which is crucial for long tasks. By standardizing discovery and capabilities, A2A greatly simplifies multi-agent architectures – think of it as a common rail that diverse agents can tap into.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A2A Challenges:&lt;/strong&gt; It’s new and still evolving. Every agent must implement the protocol correctly (card publishing, message handling, etc.), and network security between agents becomes important. Discovery at scale can be tricky (e.g. public versus private agent directories). There are also open questions about governance: who runs the index of agents, who certifies them, etc. And while A2A includes security mechanisms, real-world deployments will need careful design of “authorization boundaries” – deciding which agents can talk to which&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP Strengths:&lt;/strong&gt; It fills a huge gap: AI apps typically need to talk to data, and MCP makes that pluggable. It reduces duplication by providing pre-built connectors. Once an ecosystem of servers grows, any model can switch data sources without rewriting prompts. It also natively handles conversational state and context sharing, so data requests can be grounded in ongoing interactions&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP Challenges:&lt;/strong&gt; Early on, MCP had weak security defaults (simple API keys, wide OAuth scopes), raising concerns about prompt injection and over-privileged access. &lt;/p&gt;

&lt;p&gt;Anthropic and others are addressing these (OAuth, fine-grained tokens, etc.), but it remains an area of scrutiny. MCP also isn’t built for agent discovery or orchestration – it won’t solve how you find an agent, just how you fetch data. Some vendors point out that MCP by itself doesn’t handle long-running multi-agent workflows or arbitration of tasks&lt;/p&gt;

&lt;h2&gt;
  
  
  Adoption and “Protocol Wars”
&lt;/h2&gt;

&lt;p&gt;I’ve been watching the rise of A2A and MCP with great interest.It feels a bit like being back in the early days of the web, when everyone was debating HTTP vs. FTP. On the A2A side, Google scored a big win out of the gate: over &lt;strong&gt;50 tech partners&lt;/strong&gt; (think MongoDB, Atlassian, SAP, PayPal, Cohere) have already published sample multi-agent demos with LangGraph and Intuitive AI. It’s powerful to imagine an enterprise where every AI microservice HR, finance, analytics just “speaks A2A” out of the box for task automation.&lt;/p&gt;

&lt;p&gt;Meanwhile, MCP isn’t far behind. I genuinely believe &lt;strong&gt;MCP has a bright future&lt;/strong&gt;, its promise of plugging any LLM into any data source (Slack, Google Drive, Postgres) with a single JSON-RPC call is irresistible. Microsoft’s Copilot Studio support is a strong signal that the industry wants those standardized connectors.&lt;/p&gt;

&lt;p&gt;But these aren’t the only players. IBM and the BeeAI project are championing &lt;strong&gt;ACP (Agent Communication Protocol)&lt;/strong&gt;, focusing on RESTful agent messaging and fine-grained permissions. With A2A, MCP, ACP and likely more on the horizon, it’s natural to wonder if we’re headed for a “protocol war.” Will one standard win, or will we settle into a hybrid world? Personally, I’m betting on &lt;strong&gt;complementarity&lt;/strong&gt;: each protocol shines in its own layer, and smart teams will weave them together rather than pick just one.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Future: Convergence or Coexistence?
&lt;/h2&gt;

&lt;p&gt;Looking forward, I see two equally exciting paths:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Convergence&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Imagine A2A agents exposing their skills as MCP servers, and MCP gaining richer task semantics borrowed from A2A (or ACP). We’d end up with a unified “agent + tool” fabric where discovery, delegation, and data access all happen through a single, battle-tested API surface.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Coexistence &amp;amp; Specialization&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
More likely in the near term: MCP becomes the go-to for model-to-tool wiring, while A2A (and ACP) dominate agent orchestration. Your next AI product whether it’s a team-building assistant or a finance-reporting bot will probably implement &lt;strong&gt;MCP internally&lt;/strong&gt; to tap into documents and databases, and &lt;strong&gt;A2A externally&lt;/strong&gt; to collaborate with other agents.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For anyone building AI today, here’s my takeaway: &lt;strong&gt;learn both&lt;/strong&gt;. Mastering MCP means your model can instantly plug into a rich ecosystem of data and tools. Embracing A2A ensures your agents can discover, delegate, and scale across organizational boundaries. Together, they’ll be as fundamental to tomorrow’s AI stacks as REST and gRPC are to today’s.&lt;/p&gt;

&lt;p&gt;If you love exploring the latest in tech and open source as much as I do, come say hi to me, Nomadev, on Twitter. Let’s exchange ideas, share insights, and keep the hustle spirit alive! 🚀  &lt;/p&gt;

&lt;p&gt;I’m also part of the &lt;a href="https://www.camel-ai.org/" rel="noopener noreferrer"&gt;CAMEL-AI&lt;/a&gt;, and we’ve been hard at work integrating some really killer MCP features into our platform. 🤖 Stay tuned we’ll be officially announcing them next week. Happy coding!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsvffvfcmcwwmw9wdsffo.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsvffvfcmcwwmw9wdsffo.jpeg" alt="Image description" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.com/thenomadevel" rel="noopener noreferrer"&gt;Catch up with Nomadev on X!&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>The New Era of Automation: How OWL, CRAB, and MCP Are Bridging the Last Mile</title>
      <dc:creator>Nomadev</dc:creator>
      <pubDate>Mon, 14 Apr 2025 20:34:23 +0000</pubDate>
      <link>https://forem.com/camelai/the-new-era-of-automation-how-owl-crab-and-mcp-are-bridging-the-last-mile-231a</link>
      <guid>https://forem.com/camelai/the-new-era-of-automation-how-owl-crab-and-mcp-are-bridging-the-last-mile-231a</guid>
      <description>&lt;p&gt;The field of autonomous agents is experiencing a renaissance. These AI systems—designed to reason, interact with tools, and complete complex tasks—are making rapid and tangible progress. From cutting-edge research frameworks to powerful platforms enabling agents to manage incredibly intricate workflows. These systems are no longer just promising demos, they’re beginning to reshape how we think about digital labor and automation.&lt;/p&gt;

&lt;p&gt;A key enabler of this progress is the &lt;strong&gt;Model Context Protocol&lt;/strong&gt; (MCP), introduced by &lt;strong&gt;Anthropic&lt;/strong&gt;. MCP serves as a new standard for connecting AI assistants to the systems where data lives—including content repositories, business tools, and development environments. It has quickly gained traction, especially with Cursor and Windsurf's integration. OpenAI recently announced their support for MCP in their agent SDK, marking a significant step for the ecosystem. We have also integrated it into the CAMEL framework to embrace the MCP ecosystem.&lt;/p&gt;

&lt;p&gt;Despite these advancements, agents still face a fundamental limitation: they &lt;strong&gt;struggle with long-term decision-making and adaptation&lt;/strong&gt;. While they can execute well-scoped tasks, they falter on multi-step objectives that require learning, revising plans, or reacting to change. Current agents follow instructions but don’t truly evolve through experience.&lt;/p&gt;

&lt;p&gt;This gap stems from the static nature of internet training data. Language models learn from passive text, not from interaction. To gain real autonomy, agents must operate and evolve within &lt;strong&gt;environments&lt;/strong&gt;—digital or physical spaces where they can &lt;strong&gt;perceive, act, and learn from experience.&lt;/strong&gt; Only through this feedback loop can agents begin to improve through trial and error.&lt;/p&gt;

&lt;p&gt;To address this “last mile” challenge in agent automation, we introduce &lt;strong&gt;OWL&lt;/strong&gt; and &lt;strong&gt;CRAB&lt;/strong&gt;, two agent automations projects and &lt;strong&gt;MCP&lt;/strong&gt; integration that are designed specifically for interactive environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  OWL: Optimized Workforce Learning
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/camel-ai/owl" rel="noopener noreferrer"&gt;OWL (Optimized Workforce Learning)&lt;/a&gt;, built on top of the CAMEL-AI Framework, is our recently released project for real-world task automation. OWL has shown promise in task automation, achieving an impressive average score of 58.18 on the GAIA benchmark—ranking #1 among open-source submissions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff34y6lykuw7dpvprr6y5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff34y6lykuw7dpvprr6y5.png" alt="Image description" width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://camel-ai.github.io/camel_asset/owl_gemini%202.5.mp4" rel="noopener noreferrer"&gt;Watch the video&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How OWL Works
&lt;/h2&gt;

&lt;p&gt;OWL is a multi-agent system for automating digital tasks through the use of a browser, terminal, code execution, function calls, and MCP tools. The project has integrated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Browser Automation:&lt;/strong&gt; Sophisticated browser interaction capabilities using the Playwright framework, allowing for scrolling, clicking, input handling, downloading, navigation, and more.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Online Search Capabilities:&lt;/strong&gt; Support for multiple search engines (including Google, DuckDuckGo, Baidu, Bocha, Wikipedia) enabling real-time information retrieval and knowledge acquisition.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Code Execution:&lt;/strong&gt; Ability to write and execute Python code using an interpreter, enabling programmatic solutions to complex problems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Document Parsing:&lt;/strong&gt; Advanced extraction of content from various document formats (Word, Excel, PDF, PowerPoint), with conversion to text or Markdown format.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multimodal Processing:&lt;/strong&gt; Robust handling of internet or local videos, images, and audio data through specialized toolkits (ImageAnalysisToolkit, VideoAnalysisToolkit, AudioAnalysisToolkit).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Extensive Toolkit Integration:&lt;/strong&gt; Access to a comprehensive set of built-in toolkits including ArxivToolkit, GitHubToolkit, GoogleMapsToolkit, and many more specialized tools built in the CAMEL framework.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core of OWL’s functionality is built on the CAMEL framework’s RolePlaying module, which creates unique initial settings for different agents through predefined prompts. This system primarily utilizes two main agents:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. UserAgent:&lt;/strong&gt; Responsible for breaking down tasks and providing instructions&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. AssistantAgent:&lt;/strong&gt; Executes instructions using various pre-configured tools or tool agents&lt;/p&gt;

&lt;p&gt;This architecture enables OWL to handle complex workflows through dynamic agent interactions, making it particularly effective for task automation across diverse domains.&lt;/p&gt;

&lt;p&gt;Furthermore, OWL employs a multi-agent system with context isolation for handling long-horizon tasks. Specialized sub-agents maintain isolated context windows for their domain (e.g., WebAgent keeps browser interaction history separate from main agent context).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41nxnwfj755cfx10v8u0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41nxnwfj755cfx10v8u0.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  OWL with MCP Integration
&lt;/h2&gt;

&lt;p&gt;MCP has emerged as the “USB interface” of the LLM field, becoming a universal solution for addressing AI information silos, with its ecosystem growing daily. OWL supports the MCP protocol to call MCP servers within its ecosystem, achieving more standardized and efficient tool invocation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl9kwbrxb9khfnesqwdj9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl9kwbrxb9khfnesqwdj9.png" alt="Image description" width="800" height="557"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Here’s a step-by-step guide to implementing MCP with OWL:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Setting Up MCP Servers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First, install the required MCP servers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Install MCP Playwright Server
npm install -g @executeautomation/playwright-mcp-server
npx playwright install-deps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Configure MCP Servers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a configuration file named &lt;code&gt;mcp_servers_config.json&lt;/code&gt; with the following structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": ["-y", "@executeautomation/playwright-mcp-server"]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Implementation in OWL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here’s how to integrate OWL with MCP in your code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import asyncio
import sys

from camel.models import ModelFactory
from camel.toolkits import MCPToolkit
from camel.types import ModelPlatformType, ModelType
from camel.societies import RolePlaying
from camel.logger import set_log_level

from owl.utils.enhanced_role_playing import arun_society

set_log_level(level="DEBUG")

async def main():
    # Initialize MCP toolkit and connect
    mcp_toolkit = MCPToolkit(config_path="mcp_servers_config.json")

    try:
        await mcp_toolkit.connect()

        # Get task from command line or use default
        task = sys.argv[1] if len(sys.argv) &amp;gt; 1 else (
            "Using a web browser, search Google Scholar for Andrew Ng's academic profile. Create a comprehensive report that includes: (1) his main research directions in AI and machine learning, (2) at least five of his most influential published papers with citation counts, (3) his affiliated institutions throughout his career, and (4) a summary of his impact on the field."
        )

        # Setup model
        model = ModelFactory.create(
            model_platform=ModelPlatformType.OPENAI,
            model_type=ModelType.GPT_4O,
        )

        # Create and run society
        society = RolePlaying(
            task_prompt=task,
            user_role_name="user",
            user_agent_kwargs={"model": model},
            assistant_role_name="assistant",
            assistant_agent_kwargs={
                "model": model,
                "tools": mcp_toolkit.get_tools(),
            },
        )

        answer, chat_history, token_count = await arun_society(society)
        print(f"\033[94mAnswer: {answer}\033[0m")

    finally:
        try:
            await mcp_toolkit.disconnect()
        except Exception:
            print("Disconnect failed")


if __name__ == "__main__":
    asyncio.run(main())
‍
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example Use Case
&lt;/h3&gt;

&lt;p&gt;Consider this task: “Using a web browser, search Google Scholar for Andrew Ng's academic profile. Create a comprehensive report that includes: (1) his main research directions in AI and machine learning, (2) at least five of his most influential published papers with citation counts, (3) his affiliated institutions throughout his career, and (4) a summary of his impact on the field.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The OWL framework with MCP can handle this by:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Utilizing autonomous agents to decompose and tackle different aspects of the task&lt;/li&gt;
&lt;li&gt;Leveraging the Playwright MCP Server to navigate academic websites and extract paper information&lt;/li&gt;
&lt;li&gt;Coordinating the agents through OWL’s role-playing mechanisms to complete the task&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Benefits of OWL + MCP Integration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Standardized Tool Access:&lt;/strong&gt; MCP offers a unified interface for interacting with tools and data sources.&lt;br&gt;
&lt;strong&gt;2. Ecosystem Expansion:&lt;/strong&gt; New MCP servers can be seamlessly integrated to enhance OWL’s capabilities.&lt;br&gt;
&lt;strong&gt;3. Security:&lt;/strong&gt; MCP’s architecture safeguards sensitive data through its robust design.&lt;br&gt;
&lt;strong&gt;4. Flexibility:&lt;/strong&gt; Users can easily switch between any AI models that support the MCP standard.&lt;br&gt;
&lt;strong&gt;5. Efficiency:&lt;/strong&gt; Development time for complex multi-agent systems is significantly reduced.&lt;br&gt;
‍&lt;/p&gt;

&lt;h2&gt;
  
  
  OWL’s Future Directions
&lt;/h2&gt;

&lt;p&gt;OWL’s development roadmap focuses on enhancing its capabilities in several key areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Expanding Tool Integration:&lt;/strong&gt; Incorporating more specialized toolkits to address domain-specific challenges&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improving Multi-Agent Coordination with RL:&lt;/strong&gt; Incorporating environmental feedback to train the multi-agent systems with reinforcement learning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strengthening Reasoning Capabilities:&lt;/strong&gt; Developing more sophisticated planning and decision-making mechanisms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Broadening Environment Compatibility:&lt;/strong&gt; Ensuring seamless operation across different computing environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The recent integration of MCPToolkit, FileWriteToolkit, and TerminalToolkit represents significant progress toward these goals, enhancing OWL agents with MCP tool calling, file writing capabilities, and terminal command execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  CRAB: Cross-environment Agent Benchmark
&lt;/h2&gt;

&lt;p&gt;CRAB stands for &lt;strong&gt;CR&lt;/strong&gt;oss-environment &lt;strong&gt;A&lt;/strong&gt;gent &lt;strong&gt;B&lt;/strong&gt;enchmark, is the first agent framework that supports cross-device task execution. This project aims to build a benchmark that enables agents to perform tasks across multiple environments. For instance, within the CRAB framework, an agent can read a message on a smartphone and then operate a PC based on the message content.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crab.camel-ai.org/static/videos/demo3_calendar_to_vim.mp4" rel="noopener noreferrer"&gt;Crab Demo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is an “Environment” in CRAB?
&lt;/h2&gt;

&lt;p&gt;The term &lt;em&gt;environment&lt;/em&gt; is crucial in CRAB. In the example above, there are two environments: an Ubuntu PC and an Android smartphone. In fact, an environment can be any device, application, or even a more complex multi-device system—as long as it has a well-defined action space and observation space.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Cross-Environment Matters
&lt;/h2&gt;

&lt;p&gt;Cross-environment capability is a crucial consideration in our framework, enabling agents to interact simultaneously with multiple devices or applications. This involves coordinating across environments, leveraging information between them, and passing messages. Much like humans who naturally navigate diverse environments—each with different action/observation spaces and logic, to solve complex problems, this capability is vital. However, it stands in contrast to most existing agent benchmarks, which are typically limited to interactions within a single device or application.&lt;/p&gt;

&lt;p&gt;CRAB introduces the first cross-environment agent benchmark, &lt;strong&gt;CRAB Benchmark v0&lt;/strong&gt;, which includes 120 tasks spanning more than 20 applications on Ubuntu desktops and Android smartphones. We believe that scaling agent environments is a key step toward building capable and practical agents.&lt;/p&gt;

&lt;p&gt;The cross-environment capability unlocks tremendous potential for real-world applications. One exciting possibility is applying CRAB to IoT scenarios—imagine controlling all your devices through a single intelligent agent assistant. In industries such as networking and cloud computing, managing a large number of heterogeneous devices is a constant challenge. Our cross-environment paradigm offers a promising path forward in these domains.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy0wu12mljzss9hwm4gnv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy0wu12mljzss9hwm4gnv.png" alt="Image description" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Next: CRAB’s Updating Directions
&lt;/h2&gt;

&lt;p&gt;We are actively improving CRAB and planning several key upgrades in the upcoming version:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Usability&lt;/strong&gt;: Simplifying configuration and improving code readability. Introducing MCP (Model Connector Protocol) for seamless integration with any model or framework.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensibility&lt;/strong&gt;: Adopting a modular design that makes it easy to add new environments or virtual device implementations. We’ll also introduce a plugin system to support easy customization of existing modules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robustness&lt;/strong&gt;: Our current VM implementations rely on QEMU/KVM and the Google Android Emulator, which are not very stable and Linux-dependent. We plan to switch to more stable and convenient alternatives like Docker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation&lt;/strong&gt;: Reducing the amount of manual labor needed to conduct experiments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’ll be integrating more components into our official &lt;a href="https://github.com/camel-ai/crab" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Popular Benchmarks: OSWorld, WebArena, and more&lt;/li&gt;
&lt;li&gt;New Environments: Windows, macOS, iOS, web browsers, specific applications, OpenAI Gymnasium, etc.&lt;/li&gt;
&lt;li&gt;Visual Prompt Tools: OmniParser, Ferret-UI, Grounding DINO, etc.&lt;/li&gt;
&lt;li&gt;Advanced GUI models: OpenAI Operator, Claude Computer Using, etc.&lt;/li&gt;
&lt;li&gt;Multi-Agent Systems: Frameworks like CAMEL and OWL, protocols like MCP&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  OWL + CRAB: A Unified Agent Operating System
&lt;/h2&gt;

&lt;p&gt;The integration of OWL and CRAB creates a potent ecosystem for developing, testing, and scaling agents.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;OWL can execute complex, multi-step digital tasks using its sophisticated reasoning and toolkits within a defined environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CRAB can provide and manage the diverse, interconnected environments (like PCs, smartphones, specific apps) where these tasks unfold, enabling agents to operate across previously siloed systems.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Complementary Capabilities&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;OWL&lt;/strong&gt; and &lt;strong&gt;CRAB&lt;/strong&gt; complement each other in several important ways:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Development and Evaluation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OWL provides the framework for building sophisticated multi-agent systems.&lt;/li&gt;
&lt;li&gt;CRAB offers standardized methods for evaluating their performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Task Automation and Environment Adaptation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OWL is good at automating complex tasks.&lt;/li&gt;
&lt;li&gt;CRAB ensures these capabilities work consistently across different environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Tool Integration and Benchmark Standardization&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OWL’s extensive toolkit integration is balanced by CRAB’s rigorous benchmarking approach&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Generation Potential
&lt;/h3&gt;

&lt;p&gt;Combining these projects enables the generation of high-quality training data. Once established, the environments can be used to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create Diverse Scenarios:&lt;/strong&gt; Generate a wide range of task scenarios across different environments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Capture Agent Interactions:&lt;/strong&gt; Record how agents navigate these scenarios, including both successful and unsuccessful approaches.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Develop Improvement Metrics:&lt;/strong&gt; Analyze interaction data to uncover patterns and strategies that correlate with better performance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Train New Agent Models:&lt;/strong&gt; Use the synthetic data and identified success signatures to guide the training process through RLHF, targeted fine-tuning, and supervised learning.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This data generation capability creates a &lt;strong&gt;virtuous cycle&lt;/strong&gt; where agent performance continuously improves through iterative testing and refinement.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Critical Role of Environment in Agent Scaling
&lt;/h2&gt;

&lt;p&gt;CAMEL-AI has identified environment as one of the three key dimensions in the scaling laws of agents—alongside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the number of agents&lt;/li&gt;
&lt;li&gt;memory capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This highlights how crucial &lt;strong&gt;environment design&lt;/strong&gt; is to advancing agent technology.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Environments Matter for Agent Scaling
&lt;/h3&gt;

&lt;p&gt;Environments provide the context in which agents operate and learn. They define:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Action Space: What agents can do and how they interact with the world&lt;/li&gt;
&lt;li&gt;The Observation Space: What information agents can perceive&lt;/li&gt;
&lt;li&gt;The Reward Structure: How agent behaviors are reinforced&lt;/li&gt;
&lt;li&gt;The Task Complexity: The range of challenges agents must overcome&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As environments become more diverse and complex, they drive the development of more sophisticated agent capabilities. This creates a &lt;strong&gt;scaling effect&lt;/strong&gt;—better environments lead to better agents, which in turn can handle more complex environments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cross-Environment Challenges
&lt;/h3&gt;

&lt;p&gt;The ability to operate across different environments represents a significant leap in agent capabilities. It requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Abstraction Skills: Understanding common principles that apply across environments&lt;/li&gt;
&lt;li&gt;Adaptation Mechanisms: Adjusting strategies based on environment-specific constraints&lt;/li&gt;
&lt;li&gt;Transfer Learning: Applying knowledge gained in one environment to another&lt;/li&gt;
&lt;li&gt;Meta-Learning: Learning how to learn in new environments quickly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CRAB’s focus on &lt;strong&gt;cross-environment benchmarking&lt;/strong&gt; directly addresses these challenges, providing a structured way to measure and improve these critical capabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Environment-Driven Intelligence
&lt;/h3&gt;

&lt;p&gt;CAMEL-AI’s hypothesis on the &lt;strong&gt;scaling laws of agents&lt;/strong&gt; emphasizes that &lt;strong&gt;intelligence emerges from the interplay between agents and their environments.&lt;/strong&gt; This aligns with Marvin Minsky’s Society of Mind concept—suggesting that intelligence is not monolithic, but emerges from diverse interactions. Environments serve as crucial testing grounds, stretching and refining agent capabilities. By developing increasingly complex environments, we drive the creation of more sophisticated agents—mirroring how &lt;strong&gt;human intelligence&lt;/strong&gt; evolved through natural and social interactions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future Directions in Environment Design
&lt;/h2&gt;

&lt;p&gt;As agent technology advances, environment design will likely focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increased Realism: Mimicking real-world complexity&lt;/li&gt;
&lt;li&gt;Dynamic Adaptation: Evolving in response to agent capabilities&lt;/li&gt;
&lt;li&gt;Multi-Agent Ecosystems: Encouraging rich agent-to-agent interactions&lt;/li&gt;
&lt;li&gt;Cross-Modal Integration: Combining sensory and interaction modalities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The combination of OWL's advanced agent capabilities and CRAB's rigorous environment specifications offers an ideal platform for exploring these frontiers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The integration of &lt;strong&gt;OWL, CRAB,&lt;/strong&gt; and &lt;strong&gt;MCP&lt;/strong&gt; represents a significant step forward in solving the &lt;em&gt;“last mile”&lt;/em&gt; challenge of agent automation.&lt;/p&gt;

&lt;p&gt;By creating environments where agents can learn from experience, operate across platforms, and leverage standardized tool interfaces, we’re building the foundation for truly autonomous systems. As these projects continue to evolve, they promise to unlock new possibilities for AI agents—from more effective task automation to cross-environment coordination and continuous improvement through interaction. &lt;strong&gt;The future of agent technology lies not just in better models, but in better environments&lt;/strong&gt;—environments that allow those models to learn, adapt, and grow through experience.&lt;/p&gt;

&lt;p&gt;‍Join us in exploring this frontier of AI research and development—where the boundaries between environments dissolve, and agents gain the power to navigate our complex digital world with increasing autonomy and effectiveness. &lt;strong&gt;Ready to join? Click the &lt;a href="https://www.camel-ai.org/collaboration-questionnaire" rel="noopener noreferrer"&gt;link&lt;/a&gt; or paste it into your browser to apply now.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The combination of OWL and CRAB provides an ideal platform for exploring these directions, with OWL's sophisticated agent capabilities complemented by CRAB's rigorous environment specifications.&lt;/p&gt;

&lt;p&gt;OWL GitHub: &lt;a href="https://github.com/camel-ai/owl" rel="noopener noreferrer"&gt;https://github.com/camel-ai/owl&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CRAB GitHub: &lt;a href="https://github.com/camel-ai/crab" rel="noopener noreferrer"&gt;https://github.com/camel-ai/crab&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>🐉 Loong: Synthesize Long CoTs at Scale through Verifiers</title>
      <dc:creator>Nomadev</dc:creator>
      <pubDate>Wed, 09 Apr 2025 18:07:51 +0000</pubDate>
      <link>https://forem.com/camelai/loong-synthesize-long-cots-at-scale-through-verifiers-27b4</link>
      <guid>https://forem.com/camelai/loong-synthesize-long-cots-at-scale-through-verifiers-27b4</guid>
      <description>&lt;p&gt;Recent Large Reasoning Models such as DeepSeek-R1 have demonstrated that general reasoning capabilities of LLMs greatly improve when base models undergo post-training with Reinforcement Learning (RL) with a verifiable reward. Mathematics and programming have particularly benefited from this approach, as these domains can be verified quite easily—allowing accurate interpretation of LLM responses and effective comparison to the ground truth on a semantic level. This idea that ease of verification is crucial to improving domain-specific capabilities has become widely accepted in the research community.&lt;/p&gt;

&lt;p&gt;Another critical prerequisite which is often overlooked is the abundance of &lt;strong&gt;high-quality datasets&lt;/strong&gt;, featuring questions paired with verified correct answers in the domains of Math and Coding. These curated datasets provided the necessary signal for models to learn to construct coherent &lt;strong&gt;Chains-of-Thought&lt;/strong&gt; (CoTs) leading reliably to correct answers.&lt;/p&gt;

&lt;p&gt;However, many other domains also require reliable reasoning—such as logic, graph theory, physics, and finance. These domains lack comparable datasets, and human-supervised data production at scale is prohibitively expensive. Without abundant correct answers to learn from, models cannot easily acquire domain-specific reasoning patterns. This raises a crucial question:  &lt;em&gt;Can similar reasoning performance be achieved in domains beyond math and programming?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this blog, we introduce Project &lt;strong&gt;Loong&lt;/strong&gt; - focusing on scaling up &lt;strong&gt;synthetic data generation&lt;/strong&gt; with &lt;strong&gt;verifiers&lt;/strong&gt; for a &lt;strong&gt;broad range&lt;/strong&gt; of domains. We believe that &lt;strong&gt;synthetic data generation&lt;/strong&gt; is essential—not only for addressing gaps in data-scarce domains, but also for enhancing reasoning capabilities in areas like math and programming by expanding dataset availability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing the Verification Gap in Synthetic Data for RL
&lt;/h2&gt;

&lt;p&gt;Naturally, a natural gap exists between synthetic questions and their answers, as the correctness of synthetic answers isn't inherently guaranteed. To close this gap entirely, one would need human supervision which is prohibitively expensive. We try to close this gap as much as possible without involving a human in the loop.&lt;/p&gt;

&lt;p&gt;To do this, we developed a multi-agent system that generates synthetic questions and corresponding answers from a seed dataset. These synthetic questions are then posed to the agent we want to train, and we employ various domain-specific verifiers to compare the agent's responses against the synthetic answers to check for semantic equivalence.&lt;/p&gt;

&lt;p&gt;One of our main ideas is grounded in a simple hypothesis: an LLM equipped with a code interpreter can solve questions significantly more reliably compared to one relying solely on its own chain-of-thought reasoning in natural language.&lt;/p&gt;

&lt;p&gt;This makes intuitive sense, as many fields beyond computer science—such as physics, neurophysiology, economics, and computational biology—frequently rely on code-based solutions to solve problems in their own domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Loong Environment
&lt;/h2&gt;

&lt;p&gt;Since we are mostly interested in doing RL, we have structured all components into a unified Gym-like &lt;strong&gt;environment&lt;/strong&gt;, providing a clear interface for RL experimentation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8hec7m1u449xnutfwbqw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8hec7m1u449xnutfwbqw.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our environments compromises three main components:&lt;/p&gt;

&lt;h3&gt;
  
  
  Seed Dataset
&lt;/h3&gt;

&lt;p&gt;We begin by manually collecting domain-specific datasets consisting of questions and ground truth answers. Each question in the seed dataset is ensured to be solvable using code. If available, we also record the code that leads to the ground truth. The purpose of the seed dataset is not to be a large -scale dataset to use directly for training, but as a means to bootstrap the synthetic data generation process by seeding the generative process of the LLM.&lt;/p&gt;

&lt;p&gt;Dataset Overview&lt;/p&gt;

&lt;p&gt;The repository currently includes a total of &lt;strong&gt;3,551 questions&lt;/strong&gt; spanning &lt;strong&gt;8 diverse domains&lt;/strong&gt; (and growing):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Math:&lt;/strong&gt; 1,615 questions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Physics:&lt;/strong&gt; 434 questions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Computational Biology:&lt;/strong&gt; 304 questions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finance:&lt;/strong&gt; 320 questions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graph &amp;amp; Discrete Math:&lt;/strong&gt; 179 questions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logic:&lt;/strong&gt; 110 questions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mathematical Programming:&lt;/strong&gt; 68 questions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security &amp;amp; Safety:&lt;/strong&gt; 521 questions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Synthetic Data Generator
&lt;/h3&gt;

&lt;p&gt;Our Synthetic Data Generator can be seen as a blackbox, that is seeded by a seed dataset, and generates an arbitrary number of synthetic questions and synthetic answers to those questions based on the seed dataset. The environment makes no further assumptions about the inner workings of the generator. This means that any algorithm can be used under the hood for creating synthetic data. We currently support few-shot prompting over the seed data, as well as a mutli-agent system, where we use &lt;a href="https://arxiv.org/abs/2212.10560" rel="noopener noreferrer"&gt;self-instruct&lt;/a&gt;, &lt;a href="https://arxiv.org/abs/2304.12244" rel="noopener noreferrer"&gt;evol-instruct&lt;/a&gt; or &lt;a href="https://github.com/camel-ai/camel/tree/master/camel/datagen" rel="noopener noreferrer"&gt;other data generation pipelines&lt;/a&gt; for generating questions and a solver agent for the synthetic answers.&lt;/p&gt;

&lt;p&gt;It is important to stress, that we do not expect these synthetic answers to always be correct. While we assume that we will obtain more correct solutions than with a naive CoT due to the code execution providing accurate computations, we are well aware that a lot of synthetic answers will still be wrong.&lt;/p&gt;

&lt;p&gt;However, this is not a problem since we don’t learn from this raw synthetic data. We will further filter it in the next step and only learn from this filtered synthetic data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verifier
&lt;/h3&gt;

&lt;p&gt;While the Synthetic Data Generator produces ample synthetic data, it's essential to filter out incorrect solutions before using them for training. To do this effectively, we validate synthetic answers using two independent approaches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Deriving one solution directly through the Synthetic Data Generator’s code execution.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Independently generating another solution via natural-language Chain-of-Thought (CoT) reasoning.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If these independent solutions agree, it's highly likely that the answer is correct. Although rare, there's still a possibility of false positives (both approaches incorrectly agreeing). However, given the fundamentally different methods involved, we believe this will not occur often enough to be detrimental to model training.&lt;/p&gt;

&lt;p&gt;Each environment also includes a &lt;strong&gt;verifier&lt;/strong&gt; that semantically compares the LLM response with the synthetic answer, ensuring they are effectively equivalent. This verification step is crucial for accurately filtering semantic equivalences, significantly reducing false negatives (cases where semantically correct answers would otherwise be wrongly rejected).&lt;/p&gt;

&lt;p&gt;The CoT-generating agent is the model we ultimately aim to train. During RL training, this agent receives positive rewards only when its final CoT-generated answer is semantically confirmed by the verifier to match the synthetic answer, thus ensuring it learns exclusively from likely-correct synthetic data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A code snippet to get started with the Loong Environment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The code snippet below shows a simplified version of how to use the Loong environment. Implementation details that are not conducive to improving the understanding on a cursory level have been omitted. For a detailed explanation on how to use the single step environment, please refer to this &lt;a href="https://github.com/camel-ai/loong/blob/main/cookbooks/env_with_generator.ipynb" rel="noopener noreferrer"&gt;cookbook.&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from camel.environments import SingleStepEnv
from camel.datasets import FewShotGenerator, StaticDataset
from camel.verifiers import PythonVerifier
from camel.agents import ChatAgent
from datasets import load_dataset

# Load and initialize a seed dataset
dataset = load_dataset("camel-ai/loong", split="graph_discrete_math")
seed_dataset = StaticDataset(dataset)

# Set up the verifier
verifier = PythonVerifier(required_packages=["numpy", "networkx"])

# Define a model backend to use for the generator
model = ...

# Set up synthetic data generation
generator = FewShotGenerator(seed_dataset=seed_dataset, verifier=verifier, model=model)

# Initialize the Loong environment
env = SingleStepEnv(generator, verifier)

# Define the agent that shall interact with the environment
agent = ChatAgent()

# Example environment interaction
obs = await env.reset()
agent_response = agent.step(obs.question)  # a step for the agent
next_obs, reward, done, info = await env.step(agent_response)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Contribute to Project Loong 🐉
&lt;/h2&gt;

&lt;p&gt;Researchers and developers can use the Loong environment to generate synthetic data across a variety of domains. We have already collected seed datasets for a few domains, including Mathematics, Graph Theory, Mathematical Programming and Logic. The seed data, as well as cookbooks can be found on &lt;a href="https://github.com/camel-ai/loong" rel="noopener noreferrer"&gt;Github&lt;/a&gt;. Additionally, we encourage you to collect your own seed datasets and leverage Loong to generate synthetic data for your domain.We have have unified and uploaded all the seed dataset we collected to HuggingFace:&lt;a href="https://huggingface.co/datasets/camel-ai/loong" rel="noopener noreferrer"&gt;check here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Additionally, we encourage you to collect your own seed datasets and leverage Loong to generate synthetic data for your domain.&lt;/p&gt;

&lt;p&gt;We are currently working on using the environment that we built to do post-training on top of LLMs of different sizes to see whether we can see an improvement in the general as well as domain-specific reasoning capabilities. We are still experimenting with different reward setups, focusing mainly on accuracy rewards, following the approach of DeepSeek. More details, as well as our results will be released in our upcoming preprint paper.&lt;/p&gt;

&lt;p&gt;At CAMEL, we believe that environments are a vital component for improving domain-specific agent reasoning. If a problem can be framed clearly within an environment, agents have the potential to master it autonomously.&lt;/p&gt;

&lt;p&gt;With Loong, we aim to address a key challenge in synthetic data generation: &lt;strong&gt;ensuring data quality through verifiability.&lt;/strong&gt; Our goal with Loong is to make it easier to build reliable reasoning datasets in domains where curated data is scarce.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We invite researchers and developers to contribute seed datasets, verifiers, and ideas to help improve and extend our project. &lt;em&gt;Ready to join? Click the &lt;a href="https://www.camel-ai.org/collaboration-questionnaire" rel="noopener noreferrer"&gt;link&lt;/a&gt; or paste it into your browser to apply now.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Scaling Environments for Agents</title>
      <dc:creator>Nomadev</dc:creator>
      <pubDate>Mon, 07 Apr 2025 12:13:04 +0000</pubDate>
      <link>https://forem.com/camelai/scaling-environments-for-agents-h0h</link>
      <guid>https://forem.com/camelai/scaling-environments-for-agents-h0h</guid>
      <description>&lt;p&gt;At &lt;a href="//CAMEL-AI.org"&gt;CAMEL-AI.org&lt;/a&gt;, we are committed to pushing the boundaries of artificial intelligence through multi-agent systems. This blog post restates our mission, discusses current limitations and trends of AI agents, and outlines our initiative to build environments for the data-driven future of AI agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.camel-ai.org/launchweek-environments#Initiative" rel="noopener noreferrer"&gt;Mission: Finding the Scaling Laws of Agents&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzk0tjscao7bw1hasmrz2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzk0tjscao7bw1hasmrz2.jpg" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our mission has always been clear and unwavering: to uncover the scaling laws of agents and build the foundational infrastructure for multi-agent systems that can drive the future of artificial intelligence. From the beginning, we have been committed to exploring how agents scale in complexity, environments, and evolution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dimensions of Scaling Laws of Agents
&lt;/h3&gt;

&lt;p&gt;We focus on three key dimensions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Number of Agents:&lt;/strong&gt; How do agents behave when scaled to large numbers? What emergent abilities arise from their interactions? We aim to study these phenomena and uncover patterns that reveal new capabilities as agent systems grow in scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Environments:&lt;/strong&gt; How do we create environments designed to enable agents to learn complex reasoning, long-term decision-making, adaptive behavior, and allow agents to acquire new knowledge or skills through interaction? Our focus is on developing environments that simulate real-world complexity while providing reward signals that effectively drive agent learning and evolution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Evolution:&lt;/strong&gt; How can agents evolve through interactions within their environment? We are building reinforcement learning environments and memory systems for agents to create agents that can generalize across tasks, adapt to new challenges, and continuously improve through experience.&lt;/p&gt;

&lt;p&gt;In this blog, we are focusing on the importance of scaling environments. Environments are not just containers for agent activity; they are essentially the missing data for agents that cannot be acquired simply by scraping the internet. Environments provide the dynamic, interactive contexts necessary for agents to learn adaptive behaviors and develop long-term decision-making capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Rise of End-to-End Reinforcement Learning for LLM Agents
&lt;/h2&gt;

&lt;p&gt;The initial approach to making AI agents functional relied heavily on prompt engineering by crafting specific instructions to guide LLM agents. This involved techniques like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Role-Based Prompts: Instructing agents to follow predefined roles or personas to simulate specific behavior.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Few-Shot Prompting: Providing examples within prompts to teach agents how to use tools or perform complex reasoning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Output Formatting: Using tricks to ensure models generate structured outputs, such as JSON responses.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While these techniques are effective in prototyping agent systems, they come with significant limitations that hindered robustness, adaptability, and scalability. Prompt-based agents often fail when encountering complex or unforeseen scenarios. Their rigid behavior patterns make them ill-suited for tasks requiring dynamic decision-making. Prompts can unintentionally introduce biases or lead to hallucinated outputs, especially when interacting with tools or external components. Crafting effective prompts for increasingly complex tasks requires significant expertise, time, and trial-and-error, making it difficult to scale across diverse applications.&lt;/p&gt;

&lt;p&gt;These challenges underscore the need for a paradigm shift—moving away from reliance on pure prompt engineering toward end-to-end reinforcement learning for LLM agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Prompt Engineering to End-to-End Autonomy
&lt;/h2&gt;

&lt;p&gt;End-to-end RL for LLM agents has been considered a promising direction for addressing the shortcomings of prompt engineering. These agents are trained holistically on tasks, rather than relying on manually crafted prompts for every scenario.&lt;/p&gt;

&lt;p&gt;Recent advancements in RL for LLM agents have emerged from leading research labs and startups. Notable examples include OpenAI's Operator and Deep Research, xAI's Grok 3, and DeepSeek's R1. OpenAI's Operator combines GPT-4o's vision capabilities with reinforcement learning, allowing it to interpret screenshots and interact with GUIs effectively and perform web-based tasks such as ordering groceries, booking reservations, and creating memes without requiring custom API integrations. OpenAI's Deep Research leverages reinforcement learning to autonomously navigate complex browsing and reasoning tasks across diverse domains. Trained with end-to-end reinforcement learning, it plans and executes multi-step trajectories, backtracking and adapting to real-time information as necessary. xAI's Grok 3 trained on the Colossus supercluster with ten times the computational power of previous models, Grok 3 (Think) was trained using reinforcement learning to refine its chain-of-thought reasoning. It refines its problem-solving strategies by thinking for seconds to minutes, correcting errors, exploring alternatives, and delivering accurate answers across various tasks, including mathematics, coding, and world knowledge. DeepSeek's R1 series models utilize RL to develop advanced reasoning capabilities. Initially, DeepSeek-R1-Zero demonstrated that complex reasoning behaviors, such as extended chain-of-thought and self-correction, could emerge purely through RL without supervised fine-tuning. Building upon this foundation, DeepSeek-R1 incorporates a small "cold-start" dataset alongside iterative RL and supervised fine-tuning to enhance output coherence and user-friendliness while maintaining state-of-the-art reasoning performance.&lt;/p&gt;

&lt;p&gt;As the field continues to evolve, we foresee an increasing number of vertical agent startups incorporating reinforcement learning to train LLM agents to tackle specific industry challenges. For instance, a recent post from the Cursor team, creators of an AI-powered code editor, indicates that Cursor AI is working on building RL models in real-world coding environments to automate coding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Environment is the Missing “Data” for Agents
&lt;/h2&gt;

&lt;p&gt;We are excited about the future of RL for LLM agents, as AI already matches human capabilities in many tasks. RL offers a promising path to achieving superhuman intelligence, and we may witness more "Lee Sedol moments," like AlphaGo’s historic victory, in the area of LLM agents across different domains. However, its full potential remains unrealized because the critical “data” for effective agent training is missing: realistic, standardized environments. While internet data may offer vast amounts of information, it lacks the interactive, adaptive, and diverse settings required for an agent to learn long-term decision-making through trial and error. Agents trained solely on static internet data struggle to understand temporal dynamics and complex cause-and-effect relationships in the real world.&lt;/p&gt;

&lt;p&gt;Equally challenging is the design of robust reward functions. Without carefully crafted reward signals, it becomes difficult to train agents to exhibit desired behaviors. Developing dedicated verifiers to assess LLM responses can be instrumental in defining reward functions that ensure reward signals remain reliable and aligned with long-term objectives.&lt;/p&gt;

&lt;p&gt;At &lt;a href="http://camel-ai.org/" rel="noopener noreferrer"&gt;CAMEL-AI.org&lt;/a&gt;, we believe that overcoming the challenges of reinforcement learning for LLM agents requires a community-driven approach. Our open-source framework is designed to facilitate global collaboration among researchers and developers, enabling the creation of scalable environments and robust reward mechanisms. Thanks to our contributors, we already have the foundational building blocks in place, including &lt;a href="https://github.com/camel-ai/camel/tree/master/camel/environments" rel="noopener noreferrer"&gt;environments&lt;/a&gt;, &lt;a href="https://github.com/camel-ai/camel/tree/master/camel/verifiers" rel="noopener noreferrer"&gt;verifiers&lt;/a&gt;, &lt;a href="https://github.com/camel-ai/camel/tree/master/camel/datagen" rel="noopener noreferrer"&gt;data generation pipelines&lt;/a&gt;, and &lt;a href="https://github.com/camel-ai/camel/tree/master/camel/toolkits" rel="noopener noreferrer"&gt;toolkits&lt;/a&gt; that are essential for further development.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fill out this &lt;a href="https://www.camel-ai.org/launchweek-environments" rel="noopener noreferrer"&gt;form&lt;/a&gt; and join us in shaping a future where reinforcement learning reaches its full potential&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://www.camel-ai.org/launchweek-environments#Initiative" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqtz9ylvzjv414o0q28uk.png" alt="Image description" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>openai</category>
      <category>computerscience</category>
    </item>
  </channel>
</rss>
