| name | ag2-quickstart |
| description | Build a minimal AG2 beta `Agent` end to end — pick a model provider, set a prompt, call `agent.ask()`, then continue the conversation with `reply.ask()` (multi-turn). Use when the user is starting a new AG2 beta project, has no working `Agent` yet, or needs the multi-turn chaining pattern. Covers `OpenAIConfig`, `AnthropicConfig`, `GeminiConfig`, `OllamaConfig` etc., and env-var fallback for API keys. |
| license | Apache-2.0 |
Quickstart: build your first AG2 beta Agent
When to use
- The user is starting from a blank file and wants a working AG2 beta agent.
- The user is unsure which provider config to use.
- The user wants to chain follow-up turns without losing conversation context.
- A larger task needs the basic Agent setup as its skeleton — start here, then layer the relevant feature skill on top.
Prerequisites
Install the right provider extra and have a key for it. Each *Config requires its provider SDK — without the matching extra you'll see ImportError: ... requires optional dependencies. Install with pip install "ag2[<provider>]".
| Provider | Install | Env var | Config class |
|---|
| OpenAI | pip install "ag2[openai]" | OPENAI_API_KEY | OpenAIConfig, OpenAIResponsesConfig |
| Anthropic | pip install "ag2[anthropic]" | ANTHROPIC_API_KEY | AnthropicConfig |
| Gemini (API key) | pip install "ag2[gemini]" | GEMINI_API_KEY (or GOOGLE_API_KEY) | GeminiConfig |
| Vertex AI (Gemini) | pip install "ag2[gemini]" | service-account / ADC | VertexAIConfig |
| Ollama (local) | pip install "ag2[ollama]" | — | OllamaConfig |
| DashScope (Qwen) | pip install "ag2[dashscope]" | DASHSCOPE_API_KEY | DashScopeConfig |
Load env vars from a project-root .env with python-dotenv so scripts pick up keys without exporting them in your shell:
from dotenv import load_dotenv
load_dotenv()
Quick sanity-check before debugging weird import errors — make sure you're running against the ag2 you think:
python -c "import sys, autogen; print(sys.executable); print('ag2', autogen.__version__)"
60-second recipe
import asyncio
from autogen.beta import Agent
from autogen.beta.config import OpenAIConfig
async def main() -> None:
agent = Agent(
"assistant",
prompt="You are a helpful assistant. Reply in one sentence.",
config=OpenAIConfig(model="gpt-4o-mini"),
)
reply = await agent.ask("What is the capital of France?")
print(reply.body)
reply = await reply.ask("And of Germany?")
print(reply.body)
asyncio.run(main())
Agent.ask(...) starts a new turn and returns an AgentReply. AgentReply.ask(...) continues the same conversation, preserving its context and history. The reply text is in reply.body; for typed output see the ag2-structured-output skill (reply.content()).
Picking a provider
Each provider has its own config class in autogen.beta.config. All accept model=, optional api_key=, and (where supported) streaming=True. Streaming is recommended — AG2 beta is async- and streaming-first.
from autogen.beta.config import OpenAIConfig
from autogen.beta.config import OpenAIResponsesConfig
from autogen.beta.config import AnthropicConfig
from autogen.beta.config import GeminiConfig
from autogen.beta.config import VertexAIConfig
from autogen.beta.config import OllamaConfig
from autogen.beta.config import DashScopeConfig
config = AnthropicConfig(model="claude-sonnet-4-6", streaming=True)
If api_key= is omitted, the config reads the standard env var — OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY (or GOOGLE_API_KEY), etc.
For OpenAI-compatible endpoints (vLLM, LM Studio, Together, NVIDIA NIM, etc.) use OpenAIConfig with base_url= set:
config = OpenAIConfig(
model="qwen-3",
base_url="http://localhost:8000/v1",
api_key="NotRequired",
)
Multi-turn — chain reply.ask()
agent = Agent("planner", prompt="...", config=config)
reply = await agent.ask("Plan a 5-day Japan trip in late April.")
reply = await reply.ask("Budget is $2500 per person, two travellers.")
reply = await reply.ask("Prefer trains. Day-by-day itinerary.")
print(reply.body)
reply.ask() keeps the prior turns in scope so the LLM remembers the constraints. Calling agent.ask(...) again instead would start a fresh conversation. See assets/multi_turn.py for the full travel-planner example.
Reusing model configs
Configs are immutable. Use .copy(...) to fork one with overrides:
base = OpenAIConfig(model="gpt-5")
hot = base.copy(temperature=0.8)
cheap = base.copy(model="gpt-5-mini")
You can also override the model per ask — useful when the user brings their own API key per request:
agent = Agent("assistant", prompt="Help.")
reply = await agent.ask("Hello!", config=OpenAIConfig(model="gpt-5", api_key="sk-..."))
The per-ask config completely replaces the agent's config for that turn.
Going deeper
- Working starter (single-turn):
assets/hello_agent.py (mirrors code_examples/01).
- Multi-turn starter:
assets/multi_turn.py (mirrors code_examples/03).
- Full provider reference, including
VertexAIConfig auth, extra_body, custom httpx client, env-var fallback table: website/docs/beta/model_configuration.mdx.
- Agent communication API surface (events, observing, HITL):
website/docs/beta/agents.mdx.
- Static, dynamic, per-turn prompts:
website/docs/beta/system_prompts.mdx.
Common pitfalls
- Forgetting to
await — every method on Agent / AgentReply is async. Wrap in asyncio.run(main()) for scripts.
- Calling
agent.ask() twice expecting context to carry — it doesn't; use reply.ask() instead.
- Hardcoding API keys — prefer env-var fallback (
OPENAI_API_KEY, etc.) so configs commit cleanly.
- Skipping
streaming=True — AG2 beta is streaming-first; you'll get a worse user experience without it on supported providers.
- Per-ask
config= is total override, not a partial merge — be deliberate about which knobs you set.