agent-readings / Multi-Agent Systems
Conversation as the multi-agent runtime
The one sentence
AutoGen made 'conversation' the primary orchestration API for LLM agents. That gives developers a simple way to compose specialist agents, tool executors, human input, and dynamic group chats, but it also makes conversation history the runtime state.
Before this paper
Complex LLM applications needed different ad hoc wrappers for prompts, tool execution, human feedback, and multi-step control flow.
Single-agent loops made it awkward to separate roles such as assistant, tool executor, critic, retriever, and human proxy.
Developers needed both natural-language control and regular programmatic control over agent interactions.
The paper asks how to make multi-agent LLM applications easier to build across domains without hard-coding every workflow as a bespoke orchestrator.
Core idea
Represent each workflow participant as a conversable agent, then program the workflow through auto-reply functions, termination conditions, human-input modes, tool execution, custom reply functions, and optional group-chat speaker selection.
Define a set of agents with roles and capabilities.
Configure each agent's LLM, tool, human-input, code-execution, and reply behavior.
Initialize a conversation with a task message.
Let auto-reply and custom reply functions drive message passing.
Action grammar
send: one agent sends a message to another agent.
receive: an agent appends the incoming message to its conversation context.
generate_reply: the agent chooses an action and response from LLM inference, human input, code execution, function...
auto-reply: a reply is sent automatically unless a termination condition is satisfied.
Executable shape
Evidence
AutoGen agents are described as customizable and conversable, with capabilities backed by LLMs, human input, tools, or combinations. The built-in AssistantAgent and...
The paper defines conversation programming as first defining conversable agents with roles and capabilities, then programming their interaction behavior through...
Agents expose send, receive, and generate_reply functions. By default, an agent receiving a message invokes generate_reply and sends a reply unless a termination condition is met...
AutoGen supports natural-language control via system prompts, programming-language control via Python configuration and custom functions, transitions between the two through...
Claim map
AutoGen's core abstraction is the conversable agent, configurable with LLM, human, and tool capabilities and able to send and receive messages.
Conversation programming expresses LLM application workflows as conversation-centric computation and control flow.
AutoGen uses unified send/receive/generate_reply interfaces and auto-reply mechanisms to induce decentralized workflow execution.
Control can move between natural language and code: prompts guide LLM-backed agents, while Python configures termination, human input, tool execution, custom...
Agent infrastructure
Conversation is a message bus. AutoGen made agent orchestration look like typed roles sending messages, not one monolithic prompt.
Separate the assistant from the executor. The UserProxyAgent pattern keeps code execution and human approval outside the pure LLM role.
Natural-language control is useful for shaping behavior, but runtime invariants need programmatic controls such as max turns, termination predicates,...
Multi-agent is most defensible when roles add different capabilities: retrieval, execution, grounding, critique, or human input.
Caveats
The 2023 paper describes an early AutoGen architecture; the open-source project has since evolved.
Benchmarks and demonstrations are heterogeneous, so they should not be read as one uniform proof that multi-agent designs always win.
The framework enables code execution, which requires sandboxing and explicit trust boundaries.
Conversation control can be brittle if termination markers, speaker routing, or human-input modes are underspecified.
Run it
No PoC yet - contributions welcome. A small PoC would mock AssistantAgent and UserProxyAgent, run generated code in a sandboxed local process, and persist every send/receive/generate_reply event.