<?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: Daniel Azevedo </title>
    <description>The latest articles on Forem by Daniel Azevedo  (@dazevedo).</description>
    <link>https://forem.com/dazevedo</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%2F2013012%2Fc610cda4-feca-444a-8c41-a45a57b94d96.jpg</url>
      <title>Forem: Daniel Azevedo </title>
      <link>https://forem.com/dazevedo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dazevedo"/>
    <language>en</language>
    <item>
      <title>AG-2 in Practice #8 – Deploying AG-2 Agents in Real-World Applications</title>
      <dc:creator>Daniel Azevedo </dc:creator>
      <pubDate>Mon, 26 May 2025 17:03:31 +0000</pubDate>
      <link>https://forem.com/dazevedo/ag-2-in-practice-8-deploying-ag-2-agents-in-real-world-applications-49kf</link>
      <guid>https://forem.com/dazevedo/ag-2-in-practice-8-deploying-ag-2-agents-in-real-world-applications-49kf</guid>
      <description>&lt;p&gt;Welcome back!&lt;/p&gt;

&lt;p&gt;This post is all about &lt;strong&gt;deploying your AG-2 workflows in real-world applications&lt;/strong&gt; — not just testing locally, but actually integrating agents into products, services, and pipelines.&lt;/p&gt;

&lt;p&gt;You’ll learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deployment strategies for AG-2 systems&lt;/li&gt;
&lt;li&gt;How to expose agents as APIs&lt;/li&gt;
&lt;li&gt;Scheduling agent runs (CRON-style)&lt;/li&gt;
&lt;li&gt;Tips for scaling and monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s go!&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Why Deploy AG-2?
&lt;/h2&gt;

&lt;p&gt;Once your agents are working reliably, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Offer them as &lt;strong&gt;APIs&lt;/strong&gt; or &lt;strong&gt;web services&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Integrate them into &lt;strong&gt;chatbots&lt;/strong&gt;, dashboards, or apps&lt;/li&gt;
&lt;li&gt;Automate backend tasks (reports, monitoring, classification, etc.)&lt;/li&gt;
&lt;li&gt;Add intelligent behavior to any product&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Strategy A – Expose as a REST API
&lt;/h2&gt;

&lt;p&gt;One common pattern is to &lt;strong&gt;wrap AG-2 in a FastAPI or Flask server&lt;/strong&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;ag2&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Orchestrator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Conversation&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai/gpt-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;system_message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Answer helpdesk questions.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/ask&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;conv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Conversation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reply&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvicorn main:app &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your AG-2 agent is now available via &lt;code&gt;POST /ask&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Strategy B – Scheduled Agent Jobs
&lt;/h2&gt;

&lt;p&gt;For automation tasks (e.g. daily summaries, data pulls, file analysis), use Python scheduling:&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;schedule&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_agent&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;conv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Conversation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&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="n"&gt;conv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize today&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s GitHub issues.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Save, email, or store result
&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="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;every&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;09:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;do&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_agent&lt;/span&gt;&lt;span class="p"&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;schedule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run_pending&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;time&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;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can run this on a server, Docker container, or cloud function.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Strategy C – Cloud or Serverless Hosting
&lt;/h2&gt;

&lt;p&gt;For bigger projects or production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dockerize&lt;/strong&gt; your AG-2 system&lt;/li&gt;
&lt;li&gt;Deploy to &lt;strong&gt;Render&lt;/strong&gt;, &lt;strong&gt;Fly.io&lt;/strong&gt;, &lt;strong&gt;AWS Lambda&lt;/strong&gt;, &lt;strong&gt;Google Cloud Run&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Redis/DBs&lt;/strong&gt; for persistent conversations&lt;/li&gt;
&lt;li&gt;Add monitoring via &lt;strong&gt;Sentry&lt;/strong&gt;, &lt;strong&gt;Prometheus&lt;/strong&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dockerfile example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.11&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . /app&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["python", "main.py"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Tips for Stability + Monitoring
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;Conversation(log_level="DEBUG")&lt;/code&gt; during testing&lt;/li&gt;
&lt;li&gt;Store logs for later replay (&lt;code&gt;conv.save()&lt;/code&gt; or custom log handler)&lt;/li&gt;
&lt;li&gt;Monitor LLM usage/costs with OpenAI's API dashboard&lt;/li&gt;
&lt;li&gt;Implement fallbacks for timeouts, rate limits, or tool failures&lt;/li&gt;
&lt;li&gt;Keep sensitive actions behind HITL approval&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;In Lesson #9, we’ll go beyond deployment and look at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advanced agent design&lt;/strong&gt;: memory, long-term goals, modular reasoning&lt;/li&gt;
&lt;li&gt;How to avoid prompt drift or hallucinations&lt;/li&gt;
&lt;li&gt;Multi-session agents that evolve over time&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Keep coding &lt;/p&gt;

</description>
      <category>ai</category>
      <category>ag2</category>
    </item>
    <item>
      <title>AG-2 in Practice #7 – Getting Started with AG2 Studio (No-Code Agent Workflows)</title>
      <dc:creator>Daniel Azevedo </dc:creator>
      <pubDate>Mon, 26 May 2025 16:53:09 +0000</pubDate>
      <link>https://forem.com/dazevedo/ag-2-in-practice-7-getting-started-with-ag2-studio-no-code-agent-workflows-3eij</link>
      <guid>https://forem.com/dazevedo/ag-2-in-practice-7-getting-started-with-ag2-studio-no-code-agent-workflows-3eij</guid>
      <description>&lt;p&gt;Welcome back!&lt;/p&gt;

&lt;p&gt;By now, you’ve built agents, patterns, tools, and even human-in-the-loop setups — all using code. But did you know AG-2 also includes a &lt;strong&gt;visual no-code interface&lt;/strong&gt; called &lt;strong&gt;AG2 Studio&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;In this post, you’ll learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What AG2 Studio is&lt;/li&gt;
&lt;li&gt;How to install and launch it&lt;/li&gt;
&lt;li&gt;What you can build and test visually&lt;/li&gt;
&lt;li&gt;Tips for combining Studio + Python for hybrid workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s jump in!&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is AG2 Studio?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AG2 Studio&lt;/strong&gt; is a &lt;strong&gt;web-based GUI&lt;/strong&gt; (Graphical User Interface) for working with AG-2:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create and manage agents&lt;/li&gt;
&lt;li&gt;Add tools (like APIs, calculators, code runners)&lt;/li&gt;
&lt;li&gt;Build and visualize agent workflows (patterns)&lt;/li&gt;
&lt;li&gt;Run conversations live&lt;/li&gt;
&lt;li&gt;Debug step-by-step&lt;/li&gt;
&lt;li&gt;Reuse and export logic to Python&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Designers, researchers, and PMs exploring agent ideas&lt;/li&gt;
&lt;li&gt;Developers prototyping quickly&lt;/li&gt;
&lt;li&gt;Debugging workflows before scaling&lt;/li&gt;
&lt;li&gt;Teaching LLM architectures&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Install AG2 Studio
&lt;/h2&gt;

&lt;p&gt;If you haven’t already:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;ag2[studio]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then launch the Studio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ag2 studio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, it opens at &lt;code&gt;http://localhost:3000&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Explore the Interface
&lt;/h2&gt;

&lt;p&gt;You’ll find:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent Builder&lt;/strong&gt; – define system messages, LLM settings, roles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool Connector&lt;/strong&gt; – add APIs, Python functions, file access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow Editor&lt;/strong&gt; – drag-and-drop patterns or create your own&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conversation View&lt;/strong&gt; – run conversations live&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debug Panel&lt;/strong&gt; – step through interactions, inspect logs, rerun&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 3: Build a Visual Agent Pipeline
&lt;/h2&gt;

&lt;p&gt;Try recreating the flow from Lesson #3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent 1&lt;/strong&gt;: Researcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent 2&lt;/strong&gt;: Writer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flow&lt;/strong&gt;: Researcher → Writer → Human&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can drag agents into a linear flow, assign tools, and even add human approval steps right in the UI — all without writing Python.&lt;/p&gt;

&lt;p&gt;Once it works, you can export it as a &lt;code&gt;.py&lt;/code&gt; file or deploy it directly!&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Hybrid Workflows (Code + Studio)
&lt;/h2&gt;

&lt;p&gt;AG2 supports hybrid setups where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You &lt;strong&gt;prototype in Studio&lt;/strong&gt;, then export to code&lt;/li&gt;
&lt;li&gt;Or, you write patterns in code, then &lt;strong&gt;visualize in Studio&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This flexibility makes AG2 great for teams with both technical and non-technical members.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bonus: Studio Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;“Preview Mode”&lt;/strong&gt; to test LLM outputs with example prompts&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;custom tools&lt;/strong&gt; (Python/REST) from the Tool tab&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;versioning&lt;/strong&gt; to manage experiments&lt;/li&gt;
&lt;li&gt;Hit &lt;strong&gt;“Export to Code”&lt;/strong&gt; to integrate with your Python stack&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;In Lesson #8, we’ll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-world deployment&lt;/strong&gt; of AG-2 systems&lt;/li&gt;
&lt;li&gt;Connecting AG-2 to web apps, APIs, CRON jobs&lt;/li&gt;
&lt;li&gt;Securing, scaling, and monitoring agent systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep coding &lt;/p&gt;

</description>
      <category>ag2</category>
      <category>ai</category>
    </item>
    <item>
      <title>AG-2 in Practice #6 – Human-in-the-Loop (HITL) Workflows</title>
      <dc:creator>Daniel Azevedo </dc:creator>
      <pubDate>Mon, 26 May 2025 16:36:09 +0000</pubDate>
      <link>https://forem.com/dazevedo/ag-2-in-practice-6-human-in-the-loop-hitl-workflows-715</link>
      <guid>https://forem.com/dazevedo/ag-2-in-practice-6-human-in-the-loop-hitl-workflows-715</guid>
      <description>&lt;p&gt;Welcome back!&lt;/p&gt;

&lt;p&gt;In the last post, we built a custom pattern with conditional logic and tool use. But in many real-world apps, &lt;strong&gt;you don’t want to leave everything to agents&lt;/strong&gt;. You want a human to step in before critical actions — especially in tasks involving judgment, risk, or sensitive data.&lt;/p&gt;

&lt;p&gt;That’s where &lt;strong&gt;Human-in-the-Loop (HITL)&lt;/strong&gt; comes in.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why HITL?
&lt;/h2&gt;

&lt;p&gt;Human-in-the-loop is useful when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want &lt;strong&gt;approval or intervention&lt;/strong&gt; before agents execute a plan&lt;/li&gt;
&lt;li&gt;You want to &lt;strong&gt;review intermediate results&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You’re building &lt;strong&gt;co-creative&lt;/strong&gt; tools (e.g., coding assistants, design AI)&lt;/li&gt;
&lt;li&gt;You need &lt;strong&gt;accountability&lt;/strong&gt; (e.g., legal, medical, or finance use cases)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Add a Human Agent
&lt;/h2&gt;

&lt;p&gt;AG-2 allows you to include a &lt;strong&gt;human as an agent&lt;/strong&gt; in the loop. You can interact via terminal, notebook, or integrate a UI later.&lt;/p&gt;

&lt;p&gt;Here’s how to set it up:&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;ag2&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HumanAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Conversation&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key-here&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# AI Agent
&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;writer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai/gpt-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system_message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You write summaries based on user prompts.&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;# Human Reviewer
&lt;/span&gt;&lt;span class="n"&gt;human_reviewer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;HumanAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;human_reviewer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system_message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a human reviewer. Approve or suggest edits.&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: Create a Review Flow with a Human
&lt;/h2&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;ag2&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Orchestrator&lt;/span&gt;

&lt;span class="n"&gt;orchestrator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Orchestrator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;human_reviewer&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;rules&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;from&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;user&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;to&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;writer&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;from&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;writer&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;to&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;human_reviewer&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;from&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;human_reviewer&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;to&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;user&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="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;conv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Conversation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orchestrator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;orchestrator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;conv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a summary of the history of the internet.&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;Now the human will be &lt;strong&gt;prompted to review&lt;/strong&gt; the AI’s output before it’s finalized.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Try It in Terminal
&lt;/h2&gt;

&lt;p&gt;When run from your terminal, AG-2 will pause and &lt;strong&gt;ask for human input&lt;/strong&gt; at the &lt;code&gt;human_reviewer&lt;/code&gt; step:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python hitl_review.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Writer generates a summary&lt;/li&gt;
&lt;li&gt;Terminal pauses and shows output to the human&lt;/li&gt;
&lt;li&gt;You (the human) type: “Looks good, approve.”&lt;/li&gt;
&lt;li&gt;Flow ends or loops based on what you say&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 4: Add HITL to Complex Patterns
&lt;/h2&gt;

&lt;p&gt;HITL can be used &lt;strong&gt;inside custom patterns&lt;/strong&gt;, as a QA reviewer, escalation point, or fallback agent when the system gets stuck.&lt;/p&gt;

&lt;p&gt;You can mix and match AI + humans freely — even simulate multi-role humans if needed.&lt;/p&gt;




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

&lt;p&gt;In the next post, we’ll explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;AG2 Studio&lt;/strong&gt; for visual workflows&lt;/li&gt;
&lt;li&gt;Inspecting logs, replays, and debugging sessions&lt;/li&gt;
&lt;li&gt;Deploying and iterating on agent systems without writing code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep coding &lt;/p&gt;

</description>
      <category>ai</category>
      <category>ag2</category>
      <category>architecture</category>
    </item>
    <item>
      <title>AG-2 in Practice #5 – Building Custom Patterns and Integrating Tools</title>
      <dc:creator>Daniel Azevedo </dc:creator>
      <pubDate>Sun, 25 May 2025 06:37:04 +0000</pubDate>
      <link>https://forem.com/dazevedo/ag-2-in-practice-5-building-custom-patterns-and-integrating-tools-d1l</link>
      <guid>https://forem.com/dazevedo/ag-2-in-practice-5-building-custom-patterns-and-integrating-tools-d1l</guid>
      <description>&lt;p&gt;Hey again!&lt;/p&gt;

&lt;p&gt;So far, you’ve seen AG-2’s built-in patterns and multi-agent setups. Now, it’s time to level up by &lt;strong&gt;creating your own custom pattern&lt;/strong&gt; with conditional logic — plus, we’ll integrate a tool so agents can perform actions beyond chatting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Custom Patterns?
&lt;/h2&gt;

&lt;p&gt;Sometimes, you want workflows that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retry if quality checks fail&lt;/li&gt;
&lt;li&gt;Branch based on agent feedback&lt;/li&gt;
&lt;li&gt;Use tools dynamically during conversations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Custom patterns give you that &lt;strong&gt;full control&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Define a Custom Pattern with Conditional Logic
&lt;/h2&gt;

&lt;p&gt;Here’s an example pattern where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agent A writes a draft&lt;/li&gt;
&lt;li&gt;Agent B reviews it&lt;/li&gt;
&lt;li&gt;If review fails, Agent A rewrites and resubmits
&lt;/li&gt;
&lt;/ul&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;ag2&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Conversation&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key-here&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ReviewRewritePattern&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Pattern&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reviewer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reviewer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reviewer&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_retries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;max_retries&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;retries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;retries&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Step 1: Writer drafts
&lt;/span&gt;            &lt;span class="n"&gt;draft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# Step 2: Reviewer reviews
&lt;/span&gt;            &lt;span class="n"&gt;review&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reviewer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# Step 3: Check if approved
&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;approve&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;review&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;draft&lt;/span&gt;

            &lt;span class="n"&gt;retries&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
            &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&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;Rewrite based on review: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;review&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

        &lt;span class="k"&gt;return&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;Max retries reached. Last draft:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;draft&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Agents
&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;writer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai/gpt-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system_message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write clear and detailed responses.&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;reviewer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reviewer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai/gpt-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system_message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Review the text carefully and say &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;approve&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; if good, otherwise give feedback.&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;pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ReviewRewritePattern&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reviewer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;conv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Conversation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pattern&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="n"&gt;conv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Explain quantum computing in simple terms.&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: Adding a Tool to Your Agent
&lt;/h2&gt;

&lt;p&gt;Let’s add a &lt;strong&gt;simple math tool&lt;/strong&gt; that your writer agent can call to do calculations.&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;ag2&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Tool&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

&lt;span class="n"&gt;calc_tool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;calculator&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Performs addition of two integers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;calc_tool&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your writer can call &lt;code&gt;calculator&lt;/code&gt; in its reasoning.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Run the Full Workflow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python custom_pattern_tool.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Watch the interaction as the writer drafts, the reviewer approves or requests edits, and the writer uses the calculator if needed.&lt;/p&gt;




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

&lt;p&gt;In upcoming lessons, we’ll explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More complex tool integrations (APIs, databases)&lt;/li&gt;
&lt;li&gt;Human-in-the-loop workflows for final approval&lt;/li&gt;
&lt;li&gt;Debugging and monitoring agent conversations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep coding &lt;/p&gt;

</description>
      <category>ag2</category>
      <category>ai</category>
    </item>
    <item>
      <title>AG-2 in Practice #4 – Using Patterns to Structure Multi-Agent Workflows</title>
      <dc:creator>Daniel Azevedo </dc:creator>
      <pubDate>Sun, 25 May 2025 06:29:06 +0000</pubDate>
      <link>https://forem.com/dazevedo/ag-2-in-practice-4-using-patterns-to-structure-multi-agent-workflows-4oic</link>
      <guid>https://forem.com/dazevedo/ag-2-in-practice-4-using-patterns-to-structure-multi-agent-workflows-4oic</guid>
      <description>&lt;p&gt;Welcome back!&lt;/p&gt;

&lt;p&gt;By now, you've created a multi-agent system where a &lt;strong&gt;Researcher&lt;/strong&gt; passes info to a &lt;strong&gt;Writer&lt;/strong&gt;. But what if you want to &lt;strong&gt;reuse that structure&lt;/strong&gt;, or build more &lt;strong&gt;complex workflows&lt;/strong&gt; with built-in logic?&lt;/p&gt;

&lt;p&gt;That’s where &lt;strong&gt;AG-2 Patterns&lt;/strong&gt; come in.&lt;/p&gt;

&lt;p&gt;In this lesson, we’ll explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What AG-2 &lt;strong&gt;Patterns&lt;/strong&gt; are&lt;/li&gt;
&lt;li&gt;How to use a &lt;strong&gt;built-in pattern&lt;/strong&gt; (TaskWithQA)&lt;/li&gt;
&lt;li&gt;How to create your own &lt;strong&gt;custom pattern&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s go!&lt;/p&gt;




&lt;h2&gt;
  
  
  What Are Patterns?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Patterns&lt;/strong&gt; are reusable orchestration templates. Instead of manually defining &lt;code&gt;from → to&lt;/code&gt; rules between agents every time, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use pre-built flows (like “Agent + Reviewer”)&lt;/li&gt;
&lt;li&gt;Create &lt;strong&gt;modular&lt;/strong&gt;, readable code&lt;/li&gt;
&lt;li&gt;Focus on agent roles instead of plumbing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of Patterns as &lt;strong&gt;conversation blueprints&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Use a Built-in Pattern – TaskWithQA
&lt;/h2&gt;

&lt;p&gt;This pattern follows a simple structure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent A completes a task&lt;/li&gt;
&lt;li&gt;Agent B (reviewer) checks the result&lt;/li&gt;
&lt;li&gt;Optionally loops back if something needs to be redone&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let’s implement it.&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;ag2&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Conversation&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key-here&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Task agent
&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;writer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai/gpt-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system_message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a response based on the given prompt.&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;# QA agent (Reviewer)
&lt;/span&gt;&lt;span class="n"&gt;reviewer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reviewer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai/gpt-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system_message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Review the response and provide feedback if needed. If it&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s good, approve it.&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;# Use the built-in TaskWithQA pattern
&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Pattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TaskWithQA&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;qa_agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;reviewer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Create a conversation using the pattern
&lt;/span&gt;&lt;span class="n"&gt;conv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Conversation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;conv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a brief description of how photosynthesis works.&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;
  
  
  Step 2: Run It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python task_with_qa.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Writer&lt;/strong&gt; generates a description&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reviewer&lt;/strong&gt; reads and critiques (or approves)&lt;/li&gt;
&lt;li&gt;Conversation ends or loops with edits if necessary&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Simple, powerful, and &lt;strong&gt;structured&lt;/strong&gt;!&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Custom Patterns (Optional Preview)
&lt;/h2&gt;

&lt;p&gt;You can also define your &lt;strong&gt;own custom pattern&lt;/strong&gt; using Python classes, giving you full control over how agents interact — conditionally, sequentially, even with retries or external triggers.&lt;/p&gt;

&lt;p&gt;We’ll cover that in detail in the next lesson.&lt;/p&gt;




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

&lt;p&gt;In the next post, we’ll:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build a &lt;strong&gt;custom Pattern class&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Explore &lt;strong&gt;conditional logic&lt;/strong&gt;, like “if reviewer rejects, retry”&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Tools&lt;/strong&gt; + Patterns for real automation pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep coding :)&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ag2</category>
    </item>
    <item>
      <title>AG-2 in Practice #3 – Creating a Multi-Agent Workflow (Researcher + Writer)</title>
      <dc:creator>Daniel Azevedo </dc:creator>
      <pubDate>Sun, 25 May 2025 06:17:14 +0000</pubDate>
      <link>https://forem.com/dazevedo/ag-2-in-practice-3-creating-a-multi-agent-workflow-researcher-writer-54o1</link>
      <guid>https://forem.com/dazevedo/ag-2-in-practice-3-creating-a-multi-agent-workflow-researcher-writer-54o1</guid>
      <description>&lt;p&gt;Welcome back to the series!&lt;/p&gt;

&lt;p&gt;So far, we’ve learned what AG-2 is and created a basic single-agent app. Now we’re moving to the fun part: &lt;strong&gt;collaboration between agents&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this post, we’ll build a &lt;strong&gt;simple multi-agent pipeline&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Researcher agent&lt;/strong&gt; that finds information&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Writer agent&lt;/strong&gt; that turns that info into a summary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This will show you how to chain agents, pass messages between them, and use AG-2's orchestration features.&lt;/p&gt;




&lt;h2&gt;
  
  
  What We’re Building
&lt;/h2&gt;

&lt;p&gt;We’ll simulate this conversation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You: “Write a summary about climate change.”&lt;br&gt;
Researcher: “Climate change refers to long-term shifts…”&lt;br&gt;
Writer: “Sure! Here's a concise summary of that…”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 1: Install or Update AG-2 (if needed)
&lt;/h2&gt;

&lt;p&gt;Make sure you're using the latest AG-2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; ag2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: Define Two Agents
&lt;/h2&gt;

&lt;p&gt;Create a file called &lt;code&gt;multi_agent_pipeline.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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;ag2&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Orchestrator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Conversation&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key-here&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Researcher agent
&lt;/span&gt;&lt;span class="n"&gt;researcher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;researcher&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai/gpt-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system_message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a helpful researcher. Given a topic, find relevant and accurate information.&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;# Writer agent
&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;writer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai/gpt-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system_message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a professional writer. Based on research findings, write clear summaries.&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 3: Orchestrate the Conversation
&lt;/h2&gt;

&lt;p&gt;Now we’ll define the flow between 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="c1"&gt;# Define orchestrator logic
&lt;/span&gt;&lt;span class="n"&gt;orchestrator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Orchestrator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;researcher&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;rules&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;from&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;user&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;to&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;researcher&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;from&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;researcher&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;to&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;writer&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;from&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;writer&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;to&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;user&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="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Start the conversation
&lt;/span&gt;&lt;span class="n"&gt;conv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Conversation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orchestrator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;orchestrator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;conv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Please write a short summary about climate change.&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 defines a simple &lt;strong&gt;linear message flow&lt;/strong&gt; from the user to Researcher → Writer → back to user.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Run It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python multi_agent_pipeline.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;User:&lt;/strong&gt; Please write a short summary about climate change.&lt;br&gt;
&lt;strong&gt;Researcher:&lt;/strong&gt; Climate change refers to...&lt;br&gt;
&lt;strong&gt;Writer:&lt;/strong&gt; Sure! Here's a summary: ...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Success! You just built a &lt;strong&gt;multi-agent reasoning chain&lt;/strong&gt;.&lt;/p&gt;




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

&lt;p&gt;In the next post, we’ll:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explore &lt;strong&gt;Patterns&lt;/strong&gt; in AG-2 (like debate, delegation, human review)&lt;/li&gt;
&lt;li&gt;Add &lt;strong&gt;tool use&lt;/strong&gt; in multi-agent chains&lt;/li&gt;
&lt;li&gt;Start designing more &lt;strong&gt;dynamic workflows&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Keep coding &lt;/p&gt;

</description>
      <category>ag2</category>
      <category>ai</category>
      <category>genai</category>
      <category>autogen</category>
    </item>
    <item>
      <title>AG-2 in Practice #2 – Setting Up AG-2 and Creating Your First Agent</title>
      <dc:creator>Daniel Azevedo </dc:creator>
      <pubDate>Sun, 25 May 2025 06:09:08 +0000</pubDate>
      <link>https://forem.com/dazevedo/ag-2-in-practice-2-setting-up-ag-2-and-creating-your-first-agent-1e0a</link>
      <guid>https://forem.com/dazevedo/ag-2-in-practice-2-setting-up-ag-2-and-creating-your-first-agent-1e0a</guid>
      <description>&lt;p&gt;Welcome back!&lt;/p&gt;

&lt;p&gt;In the first post of this series, we explored what AG-2 is and how it works under the hood. Now it’s time to get hands-on: we’re going to &lt;strong&gt;install AG-2 locally&lt;/strong&gt; and build your &lt;strong&gt;first functional agent&lt;/strong&gt; — a small but powerful assistant that can answer questions using a tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Prerequisites
&lt;/h2&gt;

&lt;p&gt;To follow along, you’ll need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.10+&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Basic terminal/command line knowledge&lt;/li&gt;
&lt;li&gt;An OpenAI API key (for using LLMs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Optional (but recommended):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A virtual environment (e.g., &lt;code&gt;venv&lt;/code&gt;, &lt;code&gt;conda&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 2: Installing AG-2
&lt;/h2&gt;

&lt;p&gt;Let’s get AG-2 up and running. In your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;ag2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, if you prefer to use the latest development version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/ag2ai/ag2.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once installed, you can verify it works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ag2 &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 3: Setting Up Your First Agent
&lt;/h2&gt;

&lt;p&gt;Now let’s create a simple question-answering agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Create a Python file
&lt;/h3&gt;

&lt;p&gt;Create a file called &lt;code&gt;basic_agent.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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;ag2&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Orchestrator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Conversation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Tool&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="c1"&gt;# Set your OpenAI API key
&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPENAI_API_KEY&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key-here&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Define a basic agent
&lt;/span&gt;&lt;span class="n"&gt;qa_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qa_agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openai/gpt-4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system_message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a helpful assistant that answers questions clearly.&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;# Start a conversation
&lt;/span&gt;&lt;span class="n"&gt;conv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Conversation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;qa_agent&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;conv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What is the capital of France?&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;
  
  
  2. Run your agent
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python basic_agent.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see an answer like:&lt;br&gt;
&lt;strong&gt;"The capital of France is Paris."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Congrats — you just ran your first AG-2 agent!&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 4: Adding a Tool
&lt;/h2&gt;

&lt;p&gt;Let’s make your agent smarter by giving it a tool.&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;ag2&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Tool&lt;/span&gt;

&lt;span class="c1"&gt;# Create a simple calculator tool
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_numbers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

&lt;span class="n"&gt;calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;calculator&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Adds two numbers.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;add_numbers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Attach the tool to the agent
&lt;/span&gt;&lt;span class="n"&gt;qa_agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# New conversation
&lt;/span&gt;&lt;span class="n"&gt;conv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Conversation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;qa_agent&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;conv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What is 3 + 4?&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;Now, the agent can use the calculator tool instead of relying only on LLM guesswork!&lt;/p&gt;




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

&lt;p&gt;In the next post, we’ll:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create &lt;strong&gt;multiple agents&lt;/strong&gt; with different roles&lt;/li&gt;
&lt;li&gt;Make them &lt;strong&gt;collaborate&lt;/strong&gt; in a workflow (e.g., researcher + writer + reviewer)&lt;/li&gt;
&lt;li&gt;Explore &lt;strong&gt;patterns&lt;/strong&gt; for multi-agent orchestration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep coding &lt;/p&gt;

</description>
      <category>ai</category>
      <category>gpt3</category>
      <category>ag2</category>
    </item>
    <item>
      <title>AG-2 in Practice #1 – What is AG-2 and How Does It Work?</title>
      <dc:creator>Daniel Azevedo </dc:creator>
      <pubDate>Sun, 25 May 2025 06:01:08 +0000</pubDate>
      <link>https://forem.com/dazevedo/ag-2-in-practice-1-what-is-ag-2-formerly-autogen-and-how-does-it-work-ag9</link>
      <guid>https://forem.com/dazevedo/ag-2-in-practice-1-what-is-ag-2-formerly-autogen-and-how-does-it-work-ag9</guid>
      <description>&lt;p&gt;Hey everyone!&lt;/p&gt;

&lt;p&gt;I’m starting a new blog series for anyone who wants to learn how to use &lt;strong&gt;AG-2&lt;/strong&gt;, the successor to OpenAI’s AutoGen, in real-world scenarios. AG-2 is a big leap forward for building smarter, more collaborative, and truly autonomous AI agents.&lt;/p&gt;

&lt;p&gt;In this first post, we’ll break down &lt;strong&gt;what AG-2 is&lt;/strong&gt;, &lt;strong&gt;how it works under the hood&lt;/strong&gt;, and &lt;strong&gt;why you should care if you’re working with LLMs and intelligent automation&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is AG-2?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AG-2&lt;/strong&gt; (&lt;a href="https://ag2.ai" rel="noopener noreferrer"&gt;https://ag2.ai&lt;/a&gt;) is an open-source framework for building and orchestrating multi-agent systems powered by LLMs (large language models), with or without human interaction.&lt;/p&gt;

&lt;p&gt;It lets you create &lt;strong&gt;specialized agents&lt;/strong&gt; that can talk to each other, collaborate, access external tools (like APIs, scripts, or databases), and make decisions in a coordinated way — all with &lt;strong&gt;fine-grained control&lt;/strong&gt; over their behavior and interaction logic.&lt;/p&gt;

&lt;p&gt;AG-2 evolved from OpenAI’s AutoGen project, but it’s now a more robust, modular, and independently maintained framework focused on &lt;strong&gt;productivity, transparency, and real-world experimentation&lt;/strong&gt; with agent-based AI.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s New Compared to AutoGen?
&lt;/h2&gt;

&lt;p&gt;AG-2 brings a number of key improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More &lt;strong&gt;modular and scalable architecture&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;More &lt;strong&gt;transparent and customizable orchestration&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Full support for &lt;strong&gt;external tools and APIs&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A new visual interface: &lt;strong&gt;AG2 Studio&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Built-in support for &lt;strong&gt;human-in-the-loop workflows&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Use AG-2?
&lt;/h2&gt;

&lt;p&gt;If you're exploring applied AI, here’s why AG-2 stands out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build complex reasoning pipelines&lt;/strong&gt; using specialized agents&lt;/li&gt;
&lt;li&gt;Create &lt;strong&gt;autonomous assistants&lt;/strong&gt; that use tools and services&lt;/li&gt;
&lt;li&gt;Simulate &lt;strong&gt;debates, collaborations, or multi-step reviews&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Integrate different LLMs and roles into a single coherent system&lt;/li&gt;
&lt;li&gt;Develop AI systems that are &lt;strong&gt;observable, explainable, and controllable&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How Does AG-2 Work?
&lt;/h2&gt;

&lt;p&gt;AG-2 is based on four core components. Let’s break them down:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Agents&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;These are the “characters” in your system. Each agent has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A configured LLM&lt;/li&gt;
&lt;li&gt;A specific identity or role (e.g., “writer,” “reviewer,” “researcher”)&lt;/li&gt;
&lt;li&gt;Customizable behavior (via prompts, templates, or code)&lt;/li&gt;
&lt;li&gt;Optional access to external tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You might have one agent writing text, another fact-checking, and a third validating output — all collaborating in one workflow.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;Orchestrators&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This is the brain of the system. The orchestrator handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who talks to whom&lt;/li&gt;
&lt;li&gt;When agents should act&lt;/li&gt;
&lt;li&gt;How to manage loops, exceptions, and termination&lt;/li&gt;
&lt;li&gt;What to do in case of errors or unexpected replies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it like a “director” guiding the cast of agents through the script.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Patterns&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;These are ready-made interaction templates, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linear pipelines with human review&lt;/li&gt;
&lt;li&gt;Expert debates&lt;/li&gt;
&lt;li&gt;Task delegation with quality checks&lt;/li&gt;
&lt;li&gt;Collaborative problem-solving&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can use built-in patterns or create your own for full control over agent workflows.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. &lt;strong&gt;Tools&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Tools are external functions agents can call, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Running Python code&lt;/li&gt;
&lt;li&gt;Making HTTP requests&lt;/li&gt;
&lt;li&gt;Querying knowledge bases or local files&lt;/li&gt;
&lt;li&gt;Accessing structured databases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These work similarly to ChatGPT plugins, allowing agents to interact with the outside world securely and reliably.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is AG2 Studio?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AG2 Studio&lt;/strong&gt; is a visual interface for creating, testing, and deploying agents — no heavy coding required.&lt;/p&gt;

&lt;p&gt;With Studio, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure agents and define their behavior&lt;/li&gt;
&lt;li&gt;Connect agents to tools and interaction patterns&lt;/li&gt;
&lt;li&gt;Run real-time tests and view live sessions&lt;/li&gt;
&lt;li&gt;Replay past logs and debug flows&lt;/li&gt;
&lt;li&gt;Deploy your agent systems easily&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Great for teams and fast prototyping.&lt;/p&gt;




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

&lt;p&gt;In the upcoming posts, I’ll walk you through:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Installing and running AG-2 locally&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Creating your first agent with a simple tool&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Building a multi-agent workflow to solve a real task&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you’re into &lt;strong&gt;practical AI&lt;/strong&gt;, &lt;strong&gt;automation&lt;/strong&gt;, or just curious about the future of &lt;strong&gt;language-based intelligent agents&lt;/strong&gt;, this series is for you.&lt;/p&gt;

&lt;p&gt;Keep coding &lt;/p&gt;

</description>
      <category>gpt3</category>
      <category>ag2</category>
      <category>ai</category>
      <category>autogen</category>
    </item>
    <item>
      <title>The Mediator Pattern: Simplifying Communication in Complex Systems</title>
      <dc:creator>Daniel Azevedo </dc:creator>
      <pubDate>Wed, 22 Jan 2025 14:46:12 +0000</pubDate>
      <link>https://forem.com/dazevedo/the-mediator-pattern-simplifying-communication-in-complex-systems-23bc</link>
      <guid>https://forem.com/dazevedo/the-mediator-pattern-simplifying-communication-in-complex-systems-23bc</guid>
      <description>&lt;p&gt;Hi devs,&lt;/p&gt;

&lt;p&gt;When working with complex systems, managing the communication between multiple components can quickly become a tangled mess. This is where the &lt;strong&gt;Mediator Pattern&lt;/strong&gt; comes in—a design pattern that centralizes communication, making your code cleaner, more maintainable, and easier to scale.  &lt;/p&gt;

&lt;p&gt;In this post, we’ll explore what the Mediator Pattern is, its benefits, and how to implement it, complete with an example in C#.  &lt;/p&gt;




&lt;h2&gt;
  
  
  What Is the Mediator Pattern?
&lt;/h2&gt;

&lt;p&gt;The Mediator Pattern is a behavioral design pattern that encapsulates communication between objects, promoting loose coupling. Instead of components directly referencing each other, they communicate through a mediator, which acts as a central hub.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Key Principles:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decoupling&lt;/strong&gt;: Objects no longer need to reference or depend on one another.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Centralized Control&lt;/strong&gt;: The mediator manages and coordinates communication.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplified Collaboration&lt;/strong&gt;: Components focus on their core responsibilities without worrying about how to communicate with others.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Benefits of the Mediator Pattern
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Coupling&lt;/strong&gt;: Components no longer depend on the implementation details of others.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved Maintainability&lt;/strong&gt;: Changes to one component are less likely to ripple through the system.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced Readability&lt;/strong&gt;: A clear, centralized communication flow makes your code easier to understand.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Adding new components becomes simpler since they only need to interact with the mediator.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  When to Use the Mediator Pattern
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Complex Communication&lt;/strong&gt;: When multiple objects need to interact in intricate ways.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event-Driven Systems&lt;/strong&gt;: When events need to be routed and handled dynamically.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decoupling Requirements&lt;/strong&gt;: When you want to reduce dependencies between components.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Implementing the Mediator Pattern in C#
&lt;/h2&gt;

&lt;p&gt;Let’s build an example: a &lt;strong&gt;Chat Room&lt;/strong&gt; where users send messages to one another. The &lt;strong&gt;Mediator&lt;/strong&gt; will act as the central hub for communication.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Define the Mediator Interface
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IChatMediator&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;SendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;RegisterUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Implement the Mediator
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ChatMediator&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IChatMediator&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_users&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;  

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;RegisterUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="n"&gt;_users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;SendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_users&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
        &lt;span class="p"&gt;{&lt;/span&gt;  
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
            &lt;span class="p"&gt;{&lt;/span&gt;  
                &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Receive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
            &lt;span class="p"&gt;}&lt;/span&gt;  
        &lt;span class="p"&gt;}&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Create the User Class
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="n"&gt;IChatMediator&lt;/span&gt; &lt;span class="n"&gt;Mediator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nf"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IChatMediator&lt;/span&gt; &lt;span class="n"&gt;mediator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="n"&gt;Mediator&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mediator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
        &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Receive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Implement a Concrete User
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ConcreteUser&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ConcreteUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IChatMediator&lt;/span&gt; &lt;span class="n"&gt;mediator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mediator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&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;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; sends: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
        &lt;span class="n"&gt;Mediator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Receive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; receives: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Use the Mediator in Action
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="n"&gt;IChatMediator&lt;/span&gt; &lt;span class="n"&gt;chatMediator&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ChatMediator&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  

        &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ConcreteUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chatMediator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
        &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ConcreteUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chatMediator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Bob"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
        &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user3&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ConcreteUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chatMediator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Charlie"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  

        &lt;span class="n"&gt;chatMediator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RegisterUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
        &lt;span class="n"&gt;chatMediator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RegisterUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
        &lt;span class="n"&gt;chatMediator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RegisterUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  

        &lt;span class="n"&gt;user1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hi everyone!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
        &lt;span class="n"&gt;user2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello Alice!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Output:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Alice sends: Hi everyone!  
Bob receives: Hi everyone!  
Charlie receives: Hi everyone!  
Bob sends: Hello Alice!  
Alice receives: Hello Alice!  
Charlie receives: Hello Alice!  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why Use the Mediator Pattern in Real-Life Applications?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Messaging Systems&lt;/strong&gt;: Like the example above, mediators are often used to manage communication between users in chat applications.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI Coordination&lt;/strong&gt;: Simplify the interactions between UI components in desktop or web applications.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microservices&lt;/strong&gt;: Implement centralized message routing and orchestration.
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;The Mediator Pattern is an essential tool for managing complex interactions while maintaining simplicity and scalability. It helps reduce dependencies, improve maintainability, and provide a cleaner, more modular architecture.  &lt;/p&gt;

&lt;p&gt;Keep Coding :)&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Azure Event Grid: Simplifying Event-Driven Architectures</title>
      <dc:creator>Daniel Azevedo </dc:creator>
      <pubDate>Wed, 18 Dec 2024 21:44:55 +0000</pubDate>
      <link>https://forem.com/dazevedo/azure-event-grid-simplifying-event-driven-architectures-318l</link>
      <guid>https://forem.com/dazevedo/azure-event-grid-simplifying-event-driven-architectures-318l</guid>
      <description>&lt;p&gt;Hi devs&lt;/p&gt;

&lt;p&gt;As applications grow increasingly complex, modern systems demand real-time communication and seamless integration across various services. This is where &lt;strong&gt;Azure Event Grid&lt;/strong&gt; comes into play, offering a robust event-driven architecture to simplify communication and automate workflows between your services.  &lt;/p&gt;

&lt;p&gt;Let’s dive into what Azure Event Grid is, why you should consider it, and how to get started.  &lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Azure Event Grid?
&lt;/h2&gt;

&lt;p&gt;Azure Event Grid is a fully managed event routing service that enables you to build event-driven architectures easily. It allows you to connect sources of events (publishers) with event handlers (subscribers) using a publish-subscribe model.  &lt;/p&gt;

&lt;p&gt;With Event Grid, you can:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React to events in real time.
&lt;/li&gt;
&lt;li&gt;Decouple services for better scalability and maintainability.
&lt;/li&gt;
&lt;li&gt;Ensure reliable delivery of events across your system.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Event Delivery&lt;/strong&gt;: Events are delivered to subscribers as soon as they are published.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serverless Integration&lt;/strong&gt;: Event Grid works seamlessly with Azure services like Azure Functions, Logic Apps, and more.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Highly Scalable&lt;/strong&gt;: Handles millions of events per second while maintaining low latency.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Event Sources&lt;/strong&gt;: Apart from Azure services, you can create custom event sources for your own applications.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Built-in features like authentication, authorization, and encryption ensure your data is secure.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Common Use Cases
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Serverless Workflows&lt;/strong&gt;: Automatically trigger Azure Functions or Logic Apps in response to events.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application Monitoring&lt;/strong&gt;: React to events like resource creation or deletion in real time.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation&lt;/strong&gt;: Automate repetitive tasks, such as scaling resources or sending notifications.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decoupling Services&lt;/strong&gt;: Use Event Grid as a mediator to decouple your microservices, improving scalability and maintainability.
&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;Azure Event Grid operates on a &lt;strong&gt;publish-subscribe model&lt;/strong&gt;:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Event Sources&lt;/strong&gt;: These are the publishers. For example, Azure services like Storage, Resource Groups, or custom applications can send events to Event Grid.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event Handlers&lt;/strong&gt;: These are the subscribers. They act on the events, such as Azure Functions or Webhooks.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event Schema&lt;/strong&gt;: Event Grid uses a structured schema to ensure consistency and simplicity.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Setting Up Azure Event Grid
&lt;/h2&gt;

&lt;p&gt;Let’s walk through an example of setting up Azure Event Grid to trigger an Azure Function whenever a blob is uploaded to Azure Storage.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create an Azure Storage Account
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to the Azure Portal.
&lt;/li&gt;
&lt;li&gt;Create a new &lt;strong&gt;Storage Account&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Upload a file to a container within the storage account.
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: Create an Azure Function
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In the Azure Portal, create a new &lt;strong&gt;Function App&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Choose the &lt;strong&gt;Azure Blob Storage Trigger&lt;/strong&gt; template.
&lt;/li&gt;
&lt;li&gt;Write your function logic to process the uploaded blob. For example:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FunctionName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"BlobTriggerFunction"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;  
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;  
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;BlobTrigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"samples-workitems/{name}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Connection&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"AzureWebJobsStorage"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="n"&gt;Stream&lt;/span&gt; &lt;span class="n"&gt;blobStream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ILogger&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Blob name: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; \nSize: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;blobStream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; Bytes"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Create an Event Grid Subscription
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;strong&gt;Event Grid&lt;/strong&gt; section in the Azure Portal.
&lt;/li&gt;
&lt;li&gt;Create a new subscription:

&lt;ul&gt;
&lt;li&gt;Select your storage account as the event source.
&lt;/li&gt;
&lt;li&gt;Choose your Azure Function as the event handler.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 4: Test the Setup
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Upload a new blob to your storage account.
&lt;/li&gt;
&lt;li&gt;The Azure Function should be triggered automatically, logging details of the uploaded blob.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Advantages of Using Event Grid
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Processing&lt;/strong&gt;: Events are delivered instantly, ensuring low latency.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplified Architecture&lt;/strong&gt;: Event Grid decouples components, making your architecture more modular and maintainable.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seamless Integration&lt;/strong&gt;: Easily integrates with Azure services and third-party tools.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost-Effective&lt;/strong&gt;: Pay only for the events you consume, with no upfront infrastructure costs.
&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;Azure Event Grid is a powerful tool for building scalable, event-driven systems. Whether you’re automating workflows, integrating services, or enhancing real-time communication, Event Grid simplifies the process and ensures reliability.  &lt;/p&gt;

</description>
      <category>azure</category>
      <category>eventdriven</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Understanding WebSockets: Real-Time Communication Made Simple</title>
      <dc:creator>Daniel Azevedo </dc:creator>
      <pubDate>Sun, 08 Dec 2024 12:16:21 +0000</pubDate>
      <link>https://forem.com/dazevedo/understanding-websockets-real-time-communication-made-simple-2f7p</link>
      <guid>https://forem.com/dazevedo/understanding-websockets-real-time-communication-made-simple-2f7p</guid>
      <description>&lt;p&gt;Hi devs,&lt;/p&gt;

&lt;p&gt;In an age where real-time updates are critical for applications like chat platforms, live dashboards, and online games, &lt;strong&gt;WebSockets&lt;/strong&gt; have emerged as a powerful tool for seamless communication between clients and servers. Let’s dive into what WebSockets are, why they’re essential, and how you can use them in your applications.  &lt;/p&gt;




&lt;h3&gt;
  
  
  What Are WebSockets?
&lt;/h3&gt;

&lt;p&gt;WebSockets are a communication protocol that provides &lt;strong&gt;full-duplex&lt;/strong&gt; (two-way) communication between a client and a server over a single, long-lived connection. Unlike traditional HTTP requests, where the client initiates the communication and waits for a response, WebSockets enable both the server and client to send and receive data independently.  &lt;/p&gt;

&lt;p&gt;Introduced as part of the &lt;strong&gt;HTML5 standard&lt;/strong&gt;, WebSockets significantly reduce latency and overhead, making them ideal for real-time applications.  &lt;/p&gt;




&lt;h3&gt;
  
  
  How Do WebSockets Work?
&lt;/h3&gt;

&lt;p&gt;Here’s a quick rundown of how WebSockets function:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Handshake&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
A WebSocket connection starts with an HTTP handshake. The client sends an upgrade request to the server, asking to switch to the WebSocket protocol.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Persistent Connection&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Once the handshake is complete, the connection stays open, allowing both the client and server to send messages without needing to establish new connections.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Two-Way Communication&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Both parties can send data at any time, making communication more efficient and responsive compared to traditional polling methods.  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Why Use WebSockets?
&lt;/h3&gt;

&lt;p&gt;WebSockets are ideal for applications where real-time data exchange is crucial. Here are some of the key benefits:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Low Latency&lt;/strong&gt;: No need for repeated HTTP requests.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Efficient Resource Usage&lt;/strong&gt;: Reduces server load and bandwidth usage.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two-Way Communication&lt;/strong&gt;: Both client and server can push updates.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Handle a large number of connections efficiently.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Common Use Cases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chat Applications&lt;/strong&gt;: Instant message delivery.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Dashboards&lt;/strong&gt;: Real-time stock prices, analytics, or performance metrics.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collaborative Tools&lt;/strong&gt;: Shared whiteboards or document editing.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Online Gaming&lt;/strong&gt;: Multiplayer interactions with minimal lag.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Implementing WebSockets in Your Application
&lt;/h3&gt;

&lt;p&gt;Let’s build a simple chat application using WebSockets in &lt;strong&gt;Node.js&lt;/strong&gt; for the server and basic HTML/JavaScript for the client.  &lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1: Set Up the Server
&lt;/h4&gt;

&lt;p&gt;First, install the WebSocket package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;ws  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a &lt;code&gt;server.js&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;WebSocket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ws&lt;/span&gt;&lt;span class="dl"&gt;'&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;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;  

&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;connection&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="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Client connected&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  

    &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&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="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Received: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
        &lt;span class="c1"&gt;// Broadcast the message to all connected clients  &lt;/span&gt;
        &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clients&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readyState&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OPEN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
                &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
            &lt;span class="p"&gt;}&lt;/span&gt;  
        &lt;span class="p"&gt;});&lt;/span&gt;  
    &lt;span class="p"&gt;});&lt;/span&gt;  

    &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;close&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Client disconnected&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 2: Create the Client
&lt;/h4&gt;

&lt;p&gt;Create an &lt;code&gt;index.html&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;  
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;  
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;  
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;  
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;  
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;WebSocket Chat&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;  
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;  
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;  
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;WebSocket Chat&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;  
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Type your message..."&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;  
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"send"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Send&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;  
    &lt;span class="nt"&gt;&amp;lt;ul&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"chat"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;  

    &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;  
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;socket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ws://localhost:8080&lt;/span&gt;&lt;span class="dl"&gt;'&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;chat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;chat&lt;/span&gt;&lt;span class="dl"&gt;'&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;messageInput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;'&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;sendButton&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;send&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  

        &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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;li&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;li&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
            &lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
            &lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
        &lt;span class="p"&gt;};&lt;/span&gt;  

        &lt;span class="nx"&gt;sendButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onclick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;messageInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
            &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
            &lt;span class="nx"&gt;messageInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&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="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;  
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;  
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 3: Run the Application
&lt;/h4&gt;

&lt;p&gt;Start the server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node server.js  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open the &lt;code&gt;index.html&lt;/code&gt; file in a browser, and you have a fully functioning WebSocket-powered chat app!  &lt;/p&gt;




&lt;h3&gt;
  
  
  Challenges of Using WebSockets
&lt;/h3&gt;

&lt;p&gt;While WebSockets are powerful, they come with some challenges:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Managing a large number of concurrent WebSocket connections can strain resources.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Ensure you’re using &lt;strong&gt;WSS&lt;/strong&gt; (WebSocket Secure) in production to encrypt communication.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallback Mechanisms&lt;/strong&gt;: Some environments might not support WebSockets. Consider alternatives like Server-Sent Events (SSE) as a fallback.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;WebSockets are a game-changer for real-time communication in web applications. By enabling low-latency, two-way communication, they open the door to a wide range of interactive and dynamic features.  &lt;/p&gt;

&lt;p&gt;Have you used WebSockets in your projects? Share your thoughts or experiences in the comments below!  &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>architecture</category>
      <category>csharp</category>
    </item>
    <item>
      <title>What is SignalR? A Real-Time Communication Framework for .NET</title>
      <dc:creator>Daniel Azevedo </dc:creator>
      <pubDate>Sun, 08 Dec 2024 12:04:39 +0000</pubDate>
      <link>https://forem.com/dazevedo/what-is-signalr-a-real-time-communication-framework-for-net-29h0</link>
      <guid>https://forem.com/dazevedo/what-is-signalr-a-real-time-communication-framework-for-net-29h0</guid>
      <description>&lt;p&gt;Hi devs&lt;br&gt;
In today’s digital world, where instant feedback and real-time updates are essential, developers need tools that enable seamless two-way communication between clients and servers. &lt;strong&gt;SignalR&lt;/strong&gt;, a library in the ASP.NET ecosystem, simplifies this process by providing a robust framework for real-time web functionality.  &lt;/p&gt;


&lt;h3&gt;
  
  
  What is SignalR?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;SignalR&lt;/strong&gt; is an open-source library for &lt;strong&gt;ASP.NET Core&lt;/strong&gt; that facilitates real-time communication between servers and clients. With SignalR, developers can add real-time web functionality to applications, allowing servers to push updates to clients instantly.  &lt;/p&gt;

&lt;p&gt;This means no more constant polling or refreshing for updates — clients can receive new data as soon as it’s available.  &lt;/p&gt;


&lt;h3&gt;
  
  
  How Does SignalR Work?
&lt;/h3&gt;

&lt;p&gt;SignalR abstracts the complexities of establishing and managing real-time connections by supporting multiple transport protocols, including:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;WebSockets&lt;/strong&gt;: The most efficient option, providing a full-duplex communication channel.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server-Sent Events (SSE)&lt;/strong&gt;: Sends updates from server to client.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long Polling&lt;/strong&gt;: A fallback mechanism for older browsers.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;SignalR automatically chooses the best available transport method based on the client and server capabilities.  &lt;/p&gt;


&lt;h3&gt;
  
  
  Key Features of SignalR
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Two-Way Communication&lt;/strong&gt;: Enables real-time interactions between client and server.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Fallback&lt;/strong&gt;: Chooses the best transport mechanism for compatibility.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Supports horizontal scaling with &lt;strong&gt;Redis&lt;/strong&gt;, &lt;strong&gt;Azure SignalR Service&lt;/strong&gt;, or other backplanes.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Groups&lt;/strong&gt;: Organize and send messages to subsets of connected clients.
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Use Cases for SignalR
&lt;/h3&gt;

&lt;p&gt;SignalR shines in applications where real-time communication is crucial. Here are some common use cases:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Live Chat Applications&lt;/strong&gt;: Enable users to exchange messages instantly.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Dashboards&lt;/strong&gt;: Update metrics, stock prices, or performance data without page reloads.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collaboration Tools&lt;/strong&gt;: Synchronize shared documents or whiteboards.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Online Games&lt;/strong&gt;: Provide seamless player interactions and updates.
&lt;/li&gt;
&lt;/ol&gt;


&lt;h3&gt;
  
  
  SignalR in Action: A Simple Example
&lt;/h3&gt;

&lt;p&gt;Let’s build a basic chat application to see SignalR in action.  &lt;/p&gt;
&lt;h4&gt;
  
  
  Step 1: Install SignalR in Your ASP.NET Core Project
&lt;/h4&gt;

&lt;p&gt;Add the SignalR package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add package Microsoft.AspNetCore.SignalR  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 2: Create a Hub
&lt;/h4&gt;

&lt;p&gt;A hub is the core communication pipeline where clients and servers interact.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.AspNetCore.SignalR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ChatHub&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Hub&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;SendMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;message&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;Clients&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;All&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SendAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ReceiveMessage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
    &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 3: Configure SignalR in Startup
&lt;/h4&gt;

&lt;p&gt;Set up SignalR in your &lt;code&gt;Startup.cs&lt;/code&gt; or &lt;code&gt;Program.cs&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseEndpoints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoints&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="n"&gt;endpoints&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MapHub&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ChatHub&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"/chatHub"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
&lt;span class="p"&gt;});&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 4: Create the Client-Side Script
&lt;/h4&gt;

&lt;p&gt;Use JavaScript to connect to the hub and send/receive messages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;signalR&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;HubConnectionBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/chatHub&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="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  

&lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ReceiveMessage&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="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;messages&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;li&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/li&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="p"&gt;});&lt;/span&gt;  

&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sendButton&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&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="o"&gt;=&amp;gt;&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;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;userInput&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&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;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;messageInput&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
    &lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SendMessage&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;  
&lt;span class="p"&gt;});&lt;/span&gt;  

&lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 5: Run the Application
&lt;/h4&gt;

&lt;p&gt;Navigate to your application, and start chatting in real time!  &lt;/p&gt;




&lt;h3&gt;
  
  
  Scaling SignalR
&lt;/h3&gt;

&lt;p&gt;SignalR supports scaling to handle multiple servers and thousands of connections using backplanes like:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Redis&lt;/strong&gt;: For on-premises solutions.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure SignalR Service&lt;/strong&gt;: A managed service for scaling SignalR apps without additional infrastructure.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Why Use SignalR?
&lt;/h3&gt;

&lt;p&gt;SignalR simplifies building real-time applications without worrying about the complexities of transport protocols or connection management. Whether it’s a chat app, live dashboard, or multiplayer game, SignalR provides the tools to create seamless, interactive experiences.  &lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Real-time communication is no longer a luxury; it’s a necessity for modern applications. With SignalR, .NET developers can leverage a powerful, scalable framework to meet this demand.  &lt;/p&gt;

&lt;p&gt;Have you used SignalR in your projects? Share your experiences or challenges in the comments below!  &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>core</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
