Skip to content

Migrating from AutoGen

Direct comparisons showing AutoGen patterns and LionAGI equivalents.

Two-Agent Conversation

AutoGen:

from autogen import ConversableAgent, LLMConfig

llm_config = LLMConfig(api_type="openai", model="gpt-4o-mini")

assistant = ConversableAgent(
    name="assistant",
    system_message="You are a helpful assistant.",
    llm_config=llm_config,
)

human = ConversableAgent(name="human", human_input_mode="ALWAYS")
human.initiate_chat(assistant, message="Hello! What's 2 + 2?")

LionAGI:

from lionagi import Branch, iModel

assistant = Branch(
    chat_model=iModel(provider="openai", model="gpt-4o-mini"),
    system="You are a helpful assistant."
)

response = await assistant.communicate("Hello! What's 2 + 2?")

Multi-Agent GroupChat

AutoGen:

from autogen import AssistantAgent, GroupChat, GroupChatManager

coder = AssistantAgent(name="Coder", llm_config=config_list)
reviewer = AssistantAgent(name="Reviewer", llm_config=config_list)

groupchat = GroupChat(agents=[coder, reviewer], messages=[], max_round=5)
manager = GroupChatManager(groupchat=groupchat, llm_config=config_list)

user.initiate_chat(manager, message="Generate a Python function")

LionAGI:

from lionagi import Session, Builder

session = Session()
builder = Builder()

coder = builder.add_operation(
    "communicate", 
    chat_model=iModel(provider="openai", model="gpt-4o-mini"),
    instruction="Generate a Python function"
)

reviewer = builder.add_operation(
    "communicate",
    depends_on=[coder],
    chat_model=iModel(provider="openai", model="gpt-4o-mini"), 
    instruction="Review the generated code"
)

result = await session.flow(builder.get_graph())

Tool Integration

AutoGen:

from autogen import ConversableAgent, register_function
from datetime import datetime

def get_weekday(date_string: str) -> str:
    date = datetime.strptime(date_string, "%Y-%m-%d")
    return date.strftime("%A")

date_agent = ConversableAgent(name="date_agent", llm_config=llm_config)
executor = ConversableAgent(name="executor", human_input_mode="NEVER")

register_function(get_weekday, caller=date_agent, executor=executor)
result = executor.initiate_chat(date_agent, message="What day was March 25, 1995?")

LionAGI:

from lionagi import Branch
from datetime import datetime

def get_weekday(date_string: str) -> str:
    date = datetime.strptime(date_string, "%Y-%m-%d")
    return date.strftime("%A")

date_branch = Branch(
    chat_model=iModel(provider="openai", model="gpt-4o-mini"),
    tools=[get_weekday]  # Direct function passing
)

result = await date_branch.ReAct(
    instruct={"instruction": "What day was March 25, 1995?"},
    max_extensions=2
)

Parallel Research Workflow

AutoGen:

# Sequential GroupChat approach
agents = [researcher1, researcher2, analyst]
groupchat = GroupChat(agents=agents, max_round=10)
manager = GroupChatManager(groupchat=groupchat)
result = user.initiate_chat(manager, message="Research AI trends")

LionAGI:

from lionagi import Session, Builder
import asyncio

session = Session()
builder = Builder()

# Parallel research
research_nodes = []
for i, topic in enumerate(["transformers", "multimodal", "reasoning"]):
    node = builder.add_operation(
        "communicate",
        instruction=f"Research {topic} developments in 2024"
    )
    research_nodes.append(node)

# Synthesis
synthesis = builder.add_operation(
    "communicate",
    depends_on=research_nodes,
    instruction="Synthesize research findings into comprehensive report"
)

result = await session.flow(builder.get_graph())

State Management

AutoGen:

def state_transition(last_speaker, groupchat):
    messages = groupchat.messages
    if last_speaker is architect:
        return implementer
    elif last_speaker is implementer:
        return tester
    return architect

groupchat = GroupChat(
    agents=[architect, implementer, tester],
    speaker_selection_method=state_transition
)

LionAGI:

# Explicit dependencies handle state transitions
architect_node = builder.add_operation("communicate", instruction="Design system")
impl_node = builder.add_operation("communicate", depends_on=[architect_node], instruction="Implement design")  
test_node = builder.add_operation("communicate", depends_on=[impl_node], instruction="Test implementation")

await session.flow(builder.get_graph())

Enterprise Advantages

AutoGen's "Too Auto" Problem: AutoGen makes autonomous decisions that lack enterprise controls

LionAGI's Enterprise Features:

# Explicit control over agent behavior
session = Session()
builder = Builder()

# Predictable execution paths
architect_node = builder.add_operation("communicate", instruction="Design system")
review_node = builder.add_operation("communicate", depends_on=[architect_node], instruction="Review design")

# Built-in cost tracking
result = await session.flow(builder.get_graph())
from lionagi.protocols.messages.assistant_response import AssistantResponse

# Built-in cost tracking
costs = 0
def get_context(node_id):
    nonlocal costs
    graph = builder.get_graph()
    node = graph.internal_nodes[node_id]
    branch = session.get_branch(node.branch_id, None)
    if branch and len(branch.messages) > 0:
        if isinstance(msg := branch.messages[-1], AssistantResponse):
            costs += msg.model_response.get("total_cost_usd") or 0

# Track costs across workflow  
for node in [architect_node, review_node]:
    get_context(node)

# Detailed audit trail
for node_id, node in builder.get_graph().internal_nodes.items():
    branch = session.get_branch(node.branch_id, None)
    print(f"Node {node_id}: {len(branch.messages)} messages")

Enterprise Requirements:

Predictable Costs: Built-in usage tracking vs AutoGen's unknown spending
Deterministic Flow: Explicit dependencies vs AutoGen's autonomous decisions
Audit Compliance: Full execution logs vs AutoGen's black-box conversations
Error Recovery: Granular failure handling vs AutoGen's all-or-nothing
Resource Control: Bounded execution vs AutoGen's unlimited autonomy

Key Migration Points

  • Conversation → Graph: AutoGen's linear conversations become explicit dependency graphs
  • Agents → Branches: ConversableAgent functionality maps to Branch instances
  • GroupChat → Builder: Multi-agent coordination uses Builder pattern with dependencies
  • Speaker Selection → Dependencies: State transitions become explicit depends_on relationships
  • Initiate Chat → Session Flow: Conversation starts become graph execution
  • Autonomous → Controlled: Replace AutoGen's unpredictable autonomy with enterprise controls