DEV Community

Cover image for AG-2 in Practice #5 – Building Custom Patterns and Integrating Tools
Daniel Azevedo
Daniel Azevedo

Posted on

AG-2 in Practice #5 – Building Custom Patterns and Integrating Tools

Hey again!

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


Why Custom Patterns?

Sometimes, you want workflows that:

  • Retry if quality checks fail
  • Branch based on agent feedback
  • Use tools dynamically during conversations

Custom patterns give you that full control.


Step 1: Define a Custom Pattern with Conditional Logic

Here’s an example pattern where:

  • Agent A writes a draft
  • Agent B reviews it
  • If review fails, Agent A rewrites and resubmits
from ag2 import Agent, Pattern, Conversation
import os

os.environ["OPENAI_API_KEY"] = "your-api-key-here"

class ReviewRewritePattern(Pattern):
    def __init__(self, writer, reviewer, max_retries=2):
        super().__init__()
        self.writer = writer
        self.reviewer = reviewer
        self.max_retries = max_retries

    def run(self, prompt):
        retries = 0
        while retries <= self.max_retries:
            # Step 1: Writer drafts
            draft = self.writer.chat(prompt)

            # Step 2: Reviewer reviews
            review = self.reviewer.chat(draft)

            # Step 3: Check if approved
            if "approve" in review.lower():
                return draft

            retries += 1
            prompt = f"Rewrite based on review: {review}"

        return f"Max retries reached. Last draft:\n{draft}"

# Agents
writer = Agent(
    name="writer",
    llm="openai/gpt-4",
    system_message="Write clear and detailed responses.",
)

reviewer = Agent(
    name="reviewer",
    llm="openai/gpt-4",
    system_message="Review the text carefully and say 'approve' if good, otherwise give feedback.",
)

pattern = ReviewRewritePattern(writer, reviewer)
conv = Conversation(pattern=pattern)
result = conv.send("Explain quantum computing in simple terms.")
print(result)
Enter fullscreen mode Exit fullscreen mode

Step 2: Adding a Tool to Your Agent

Let’s add a simple math tool that your writer agent can call to do calculations.

from ag2 import Tool

def calculator(a: int, b: int) -> int:
    return a + b

calc_tool = Tool(
    name="calculator",
    description="Performs addition of two integers",
    func=calculator,
)

writer.tools = [calc_tool]
Enter fullscreen mode Exit fullscreen mode

Now your writer can call calculator in its reasoning.


Step 3: Run the Full Workflow

python custom_pattern_tool.py
Enter fullscreen mode Exit fullscreen mode

Watch the interaction as the writer drafts, the reviewer approves or requests edits, and the writer uses the calculator if needed.


What’s Next?

In upcoming lessons, we’ll explore:

  • More complex tool integrations (APIs, databases)
  • Human-in-the-loop workflows for final approval
  • Debugging and monitoring agent conversations

Keep coding

Top comments (0)