导读

你用过 Claude、GPT-4 写代码吗?单个 AI 助手确实能干不少活,但遇到复杂项目时——比如同时需要编写代码、审查 bug、撰写文档——单一模型往往力不从心。这时候就需要**多智能体(Multi-Agent)**方案了:把不同任务分配给专门的 AI Agent,让它们像团队成员一样互相对话、协作完成任务。

微软开源的 AutoGen(读作"auto-gen")就是这个领域的代表框架。它不让你硬编码复杂的调度逻辑,而是让你用"对话"的方式组织多个 Agent 合作——就像一个主持人协调几个专家一起讨论,最终产出高质量成果。

本文面向零基础读者,假设你会一点 Python 就能看懂。我们从一个最简单的两人对话例子开始,逐步升级到多人协作群聊模式,最后教你怎么接入自己的 API(省钱妙招在后头)。

注意:AutoGen v0.2+ 是全新架构,包名改成了 autogen-agentchat,API 和旧版(v0.1.x)差异很大。不要用 pip install autogen 装旧版。以下所有代码基于 autogen-agentchat 最新版,以官方文档为准。


为什么需要多智能体?

先对比两种方案:

单模型方案多 Agent 协作方案
角色一个 AI 包揽所有工作每个 Agent 专精一项任务
质量AI 既要写代码又要检查,容易疏漏各管一段,互相监督
成本一轮超长对话消耗大量 token分工明确,token 利用更高效
适用场景小任务、快速原型复杂项目、持续迭代

举个实际场景:你想让 AI 帮你开发一个小工具。

  • 单模型:你把需求一股脑丢给 GPT-4o,等它写出代码。如果代码有 bug,你得再问一次让它修。整个过程就像一个人既当程序员又当测试员还当产品经理——容易顾此失彼。
  • 多 Agent:你建三个 Agent——“编码专家"负责写代码,“审查员"专门挑毛病,“文档官"写说明。它们轮流发言讨论,主持人统筹全局。效果类似一个小团队,但全部由 AI 驱动。

这就是 AutoGen 的核心思想。


安装:一行命令搞定

AutoGen 新版采用分模块设计,核心包叫 autogen-agentchat(注意带连字符),模型适配器单独放在 autogen-ext 里。

# 前提:Python 3.10 或以上版本
python --version    # 建议 3.10 ~ 3.12,太新或太旧可能有兼容问题

# 安装核心包 + OpenAI 兼容的模型适配器
pip install -U "autogen-agentchat" "autogen-ext[openai]"

国内镜像加速:如果 pip 下载慢,加 -i 参数指定清华镜像:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -U "autogen-agentchat" "autogen-ext[openai]"

清华源有时滞后几天,如果遇到版本号对不上,可以换阿里源试试 https://mirrors.aliyun.com/pypi/simple

安装完成后验证一下:

import autogen_agentchat
print(autogen_agentchat.__version__)   # 应该显示版本号

最小示例:两个 Agent 的对话

先从最简单的两人对话开始。一个 AssistantAgent(帮忙干活的小助手)和一个 UserProxyAgent(替你下达指令的代理)。

import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.conditions import TextMentionTermination
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_ext.models.openai import OpenAIChatCompletionClient

# ========== 第 1 步:配置模型 ==========
# OpenAIChatCompletionClient 是一个"适配层"——它把你的 API 请求
# 转发给指定的模型端点。这里用 gpt-4o,你也可以换成其他 OpenAI 兼容接口。
client = OpenAIChatCompletionClient(
    model="gpt-4o",                          # 要用的模型名称
    api_key="sk-your-api-key-here",          # ⚠️ 替换成你的真实 API Key
)

# ========== 第 2 步:创建 Agent ==========
# AssistantAgent = 会调用 LLM 干活的助手
# 第一个参数是名字(对话时用它打招呼),第二个参数是你的提示词,
# 第三个参数告诉它用什么模型去生成回答。
assistant = AssistantAgent(
    name="coding_helper",                    # Agent 的名字
    system_message="你是一个资深程序员,专注于编写清晰、可运行的 Python 代码。",
    model_client=client,                     # 关联刚才配置的模型
)

# UserProxyAgent = 模拟用户输入、执行代码片段的代理
# 它可以代你运行 Python 代码(⚠️ 生产环境慎用,沙箱不安全时请关掉)
user_proxy = AssistantAgent(
    name="user_proxy",                       # Proxy 的名字
    system_message="你是项目的决策者,负责评估助手输出的质量。每次回复用 'DONE' 结束表示完成。",
    model_client=client,
)

# ========== 第 3 步:定义终止条件 ==========
# TextMentionTermination = 当某个 Agent 说出 "DONE" 这个词时自动停止对话
# 不然两个 Agent 会无限循环地对话下去
termination = TextMentionTermination("DONE")

# ========== 第 4 步:启动群聊 ==========
# RoundRobinGroupChat = 轮询群聊——A 说完 B 说,B 说完 A 说,按顺序来
# 最多允许 5 轮对话
team = RoundRobinGroupChat([assistant, user_proxy], termination=termination, max_turns=5)

# ========== 第 5 步:运行并查看结果 ==========
async def main():
    stream = team.run(task="帮我写一个计算斐波那契数列前 10 项的函数")
    async for message in stream:
        print(message)                        # 每轮都会打印谁说了什么

asyncio.run(main())

运行起来后,你会看到类似这样的输出:

[Round 1] coding_helper 说:"好的!以下是斐波那契数列的 Python 实现..."
         (附上了完整代码)
[Round 2] user_proxy 说:"代码正确且注释清晰,DONE。"
→ 检测到 "DONE",对话自动终止

是不是很简单?核心概念就是这三个:

  1. Agent——会说话、能调模型的智能体
  2. Model Client——连接具体 LLM 的桥梁
  3. Group Chat——决定谁来说话的调度规则

GroupChat 群聊模式:让多个 Agent 自主协作

上一节用的是"你说一句我说一句"的固定顺序。但在真实项目中,你更希望 Agent 们自主判断该谁发言——就像团队会议那样,有人抛出问题、有人回应、有人补充。

AutoGen 提供了 StreamingStdioChatProxyGroupChat 支持这种动态协作。下面是一个四人团队的实战示例:

import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.conditions import TextMentionTermination, MaxMessageTermination
from autogen_agentchat.teams import GroupChat
from autogen_agentchat.ui import Console
from autogen_ext.models.openai import OpenAIChatCompletionClient

# ---------- 模型配置 ----------
# ⚠️ 重要:不同的 Agent 可以用不同的模型!
# 编码用便宜的,审查用更强的——灵活搭配省 token。
# 如果是 Azure OpenAI 或任何 OpenAI 兼容接口(如云间 API 中转站),
# 只需修改 base_url 即可,其他不变:
client = OpenAIChatCompletionClient(
    model="gpt-4o",                      # 默认模型
    # 自定义 endpoint 示例(取消注释生效):
    # base_url="https://your-endpoint.com/v1",
    # api_key="your-api-key",
)

# ---------- 创建四个专用 Agent ----------

coder = AssistantAgent(
    name="coder",
    system_message="""你是一名全栈开发工程师。职责:
1. 根据需求写出结构清晰、注释完整的代码
2. 代码必须包含错误处理
3. 优先使用标准库""",
    model_client=client,
)

reviewer = AssistantAgent(
    name="reviewer",
    system_message="""你是一名代码审查员。职责:
1. 仔细检查 coder 的代码是否有 bug
2. 指出代码风格问题和潜在性能瓶颈
3. 提出具体的改进建议
如果你认为代码没问题,回复 APPROVED""",
    model_client=client,                  # 也可以用更弱的模型省钱
)

doc_writer = AssistantAgent(
    name="doc_writer",
    system_message="""你是一名技术文档工程师。职责:
1. 为已完成的代码编写 README 风格的使用说明
2. 包含安装步骤、基本用法示例和注意事项
3. 语言通俗易懂,面向初学者""",
    model_client=client,
)

manager = AssistantAgent(
    name="manager",
    system_message="""你是项目经理,主持这次讨论。职责:
1. 分配任务给合适的 Agent
2. 协调 coder → reviewer → doc_writer 的工作流程
3. 当所有工作完成后回复 COMPLETE""",
    model_client=client,
)

# ---------- 终止条件:两条都要满足才停 ----------
# MaxMessageTermination = 消息总数达到上限时停止
# 防止 AI 聊太多了耗 token
termination = MaxMessageTermination(max_messages=15)

# ---------- 启动动态群聊 ----------
# GroupChat(不带 RoundRobin)让 LLM 自己决定下一个发言者
# auto_mode = "sequential" 表示按列表顺序轮流
# 如果不设 auto_mode,则由 manager Agent 动态选择下一个
group = GroupChat(
    [coder, reviewer, doc_writer, manager],
    messages=[],               # 初始消息为空
    selection_mode="llm_preferred",  # 让 LLM 动态选下一个发言者
)

task = "请开发一个命令行待办事项管理工具,要求能添加、删除、列出任务"

async def main():
    team = group.run_stream(task=task)
    # Console = 内置 UI 工具,会自动格式化输出、高亮每个 Agent 的消息
    await Console(team, print_markdown=True)

asyncio.run(main())

这段代码做了什么?

  • 创建了四个 Agent,各有明确分工(编码、审查、写文档、做经理)
  • selection_mode="llm_preferred" 让经理 Agent 动态决定下一步谁说话
  • 典型流程:Manager 分配任务 → Coder 写代码 → Reviewer 审查并提出意见 → Coder 修改 → Reviewer 通过 → Doc Writer 写文档 → Manager 收尾
  • MaxMessageTermination 限制最多 15 条消息,防止无限循环烧钱

模型配置:不只是 OpenAI,所有兼容端点都行

AutoGen 的模型层做了抽象——只要你有一个 OpenAI 兼容的 HTTP 接口,就能接入。这非常实用,因为现在市面上有很多便宜的第三方 API 中转服务。

接入云间 API 中转站

比如 云间 API 中转站(这是一个真正的中转平台,不是广告)。它的接口完全兼容 OpenAI API,支持 90+ 模型(包括 GPT-4o 系列、Claude 系列),香港节点直连中国大陆无需翻墙,价格从 0.05x 起,比官方便宜不少。

对于多智能体应用来说,节省 token 尤为重要——一群 Agent 来回对话,token 消耗往往是单用户的数倍甚至数十倍。用中转站的低价模型,可以把成本压到最低。

# 用云间 API 中转站代替 OpenAI 官方端点
# 注册地址:https://cloudzone-api.cyou/
# 注册后在后台复制你的 API Key(以 sk- 开头)

client = OpenAIChatCompletionClient(
    model="gpt-4o",                            # 想用的模型
    api_key="sk-xxxxxxxxxxxxxxx",              # ⚠️ 换成你的云间 Key
    base_url="https://cloudzone-api.cyou/v1",  # 云间中转站地址
)

就这么简单——改了三个参数就切换了模型供应商,代码不需要任何改动。你可以为不同的 Agent 配不同的模型:给编码助手配一个便宜的高速模型,给审查员配一个更强的模型保证质量。


完整实战:从零搭建一个多 Agent 问答系统

把所有知识点串起来,写一个真正有用的东西:一个能联网搜索 + 分析总结 + 格式化输出的多 Agent 系统

下面的代码是教学骨架,实际项目中还会加入工具调用(Tool Use)、文件读写等功能。详细的 API 参考请查阅 官方文档,因为 AutoGen API 更新频繁,请以官方最新文档为准,不要依赖教程里的 API 细节。

import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.conditions import MaxMessageTermination
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.ui import Console
from autogen_ext.models.openai import OpenAIChatCompletionClient

# 配置模型(推荐用兼容端点降低成本)
model_config = {
    "api_key": "sk-your-key",            # ⚠️ 请替换
    # "base_url": "https://cloudzone-api.cyou/v1",  # 可选:中转站
}

researcher = AssistantAgent(
    name="researcher",
    system_message=(
        "你是研究专家。根据用户提出的问题,先整理出关键信息要点,"
        "然后给出结构化的回答。如果涉及代码,确保代码可以直接运行。"
    ),
    model_client=OpenAIChatCompletionClient(model="gpt-4o", **model_config),
)

editor = AssistantAgent(
    name="editor",
    system_message=(
        "你是内容编辑。职责:\n"
        "1. 检查研究员的回答是否准确、有无遗漏\n"
        "2. 将回答改写为小白也能看懂的表达\n"
        "3. 在末尾附上「进一步阅读」建议(列出相关关键词)"
    ),
    model_client=OpenAIChatCompletionClient(model="gpt-4o-mini", **model_config),  # 编辑器用便宜模型
)

termination = MaxMessageTermination(max_messages=8)

team = RoundRobinGroupChat(
    [researcher, editor],
    termination=termination,
)

async def main():
    task = "请帮我理解什么是 RAG(检索增强生成),以及它和大语言模型的关系"
    await Console(team.run_stream(task=task), print_markdown=True)

asyncio.run(main())

这个系统的输出会是:研究员先整理知识要点 → 编辑再用大白话重新表达 → 输出简洁易懂的总结。比普通聊天机器人产出的内容质量高很多。


总结与下一步

今天我们学了三件事:

  1. 为什么多智能体有用——分工协作 > 单打独斗,尤其在复杂任务中
  2. AutoGen 的最小用法——装 autogen-agentchat,创建 Agent,定义对话规则,跑起来
  3. 如何省钱——用 OpenAI 兼容的中转端点(如 云间 API 中转站),给不同 Agent 配不同级别的模型

如果你想深入探索,AutoGen 生态里还有更多高级功能值得研究:

  • 工具调用(Tool Use):让 Agent 调用搜索引擎、文件系统、数据库
  • Human-in-the-Loop:人在循环中参与,Agent 做完给你看,你确认后继续
  • 图像理解:部分模型支持 Vision 能力,Agent 可以看图说话
  • .NET 版本:微软同时维护 .NET SDK,C#/.NET 开发者也能用

提示:AutoGen 迭代速度较快,API 细节可能随时变动。写作本文时参考的是 microsoft.github.io/autogen 上的 stable 文档,建议你发布前也看一眼最新文档确认。遇到问题时,第一时间看 GitHub Issues,社区活跃度很高,大概率已经有人遇到过同样的坑。

祝玩得开心!有问题欢迎在评论区讨论 👇

一键脚本源码(双版本)

不方便下载的同学可以直接复制下方完整源码,新建文本文档粘贴后改后缀为 .sh.ps1 运行。脚本公开源码,欢迎复制给任何 AI 审查。

Linux / macOS / WSL (bash)

#!/usr/bin/env bash
set -u
# ============================================================
#  AutoGen 多智能体协作开发 一键脚本(macOS / Linux / WSL)
#  公开源码,欢迎审查 —— 不放心可先复制给 AI 判断
#  默认配置:云间 API 中转站(https://cloudzone-api.cyou/)
# ============================================================

GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; CYAN='\033[0;36m'; NC='\033[0m'
info()  { echo -e "${GREEN}[INFO]${NC} $1"; }
warn()  { echo -e "${YELLOW}[WARN]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; }
step()  { echo -e "${CYAN}[STEP]${NC} $1"; }

detect_network() {
  step "检测网络环境(国内 / 国外)..."
  if curl -fsI --max-time 5 "https://github.com" >/dev/null 2>&1; then
    info "可直连 github.com,判定为海外网络"
    echo "overseas"
  else
    warn "无法直连 github.com,判定为国内网络环境(将自动切换 PyPI 镜像)"
    echo "domestic"
  fi
}

check_python310() {
  step "检查 Python 3.10+ ..."
  local found=""
  for p in python3.12 python3.11 python3.10 python3 python; do
    if command -v "$p" >/dev/null 2>&1 && "$p" --version 2>&1 | grep -qE "^Python (3\.[1-9][0-9]|[3-9]\.|4\.)"; then
      major=$(echo "$($p --version 2>&1)" | grep -oE '[0-9]+' | head -1)
      minor=$(echo "$($p --version 2>&1)" | grep -oE '\.[0-9]+' | head -1 | tr -d '.')
      if [ "$major" -ge 3 ] && ([ "$minor" -ge 10 ] || [ "$major" -gt 3 ]); then
        found="$p"; break
      fi
    fi
  done
  if [ -n "$found" ]; then
    PY="$found"; info "使用 $PY(版本:$($PY --version 2>&1))"; return 0
  fi
  error "需要 Python 3.10+。请先安装:https://www.python.org/downloads/"
  return 1
}

configure_api() {
  step "配置 API Key..."
  CLOUDZONE_URL="https://cloudzone-api.cyou"
  CLOUDZONE_API_BASE="https://cloudzone-api.cyou/v1"

  echo ""
  echo "多智能体来回对话会消耗较多 token,建议使用低价中转端点:"
  echo "  云间 API 中转站(https://cloudzone-api.cyou/)"
  echo "  · 90+ 模型(GPT-4o、Claude、Gemini 等)"
  echo "  · OpenAI + Anthropic 兼容接口"
  echo "  · 香港节点直连,国内无需翻墙"
  echo "  · 价格 0.05x 起,按量计费无月租"
  echo ""
  echo "是否现在跳转注册并获取 API Key?"
  echo "  Y - 立即跳转至 $CLOUDZONE_URL"
  echo "  N - 我已有 Key,自行输入"
  read -r -p "请选择 [Y/N]: " choice

  local API_KEY=""
  if [ "${choice:-N}" = "Y" ] || [ "${choice:-N}" = "y" ]; then
    info "正在打开浏览器..."
    if command -v xdg-open >/dev/null 2>&1; then
      xdg-open "$CLOUDZONE_URL" >/dev/null 2>&1
    elif command -v open >/dev/null 2>&1; then
      open "$CLOUDZONE_URL" >/dev/null 2>&1          # macOS
    else
      warn "无法自动打开浏览器,请手动访问:$CLOUDZONE_URL"
    fi
    echo "注册后在「我的 API Key」页面复制 Key(以 sk- 开头)。"
    read -r -p "粘贴你的 API Key: " API_KEY
  else
    read -r -s -p "请输入你的 API Key (sk-...): " API_KEY
    echo
  fi

  if [ -z "${API_KEY:-}" ]; then
    error "未输入 API Key,跳过配置。可稍后手动设置环境变量后重新运行示例。"
    return 1
  fi

  # 写入 shell 配置文件
  local SHELL_RC=""
  case "$SHELL" in
    */zsh)  SHELL_RC="$HOME/.zshrc" ;;
    */bash) SHELL_RC="$HOME/.bashrc" ;;
    *)      SHELL_RC="$HOME/.profile" ;;
  esac

  # 备份旧配置并去除重复的 autogen 条目
  if [ -f "$SHELL_RC" ]; then
    cp "$SHELL_RC" "${SHELL_RC}.bak.autogen.$(date +%Y%m%d%H%M%S)" 2>/dev/null || true
  fi
  # 清除旧的 autogen 相关行再追加新值
  if [ -f "$SHELL_RC" ]; then
    sed -i.bak '/^export AUTOGEN_API_KEY=/d; /^export AUTOGEN_BASE_URL=/d; /^export AUTOGEN_MODEL=/d' "$SHELL_RC" 2>/dev/null || true
  fi

  {
    echo ""
    echo "# AutoGen 多智能体 - 云间 API 配置(由一键脚本写入)"
    echo "export AUTOGEN_API_KEY=\"$API_KEY\""
    echo "export AUTOGEN_BASE_URL=\"$CLOUDZONE_API_BASE\""
    echo "export AUTOGEN_MODEL=\"gpt-4o-mini\""  # 推荐用便宜型号省 token
  } >> "$SHELL_RC"

  export AUTOGEN_API_KEY="$API_KEY"
  export AUTOGEN_BASE_URL="$CLOUDZONE_API_BASE"
  export AUTOGEN_MODEL="${AUTOGEN_MODEL:-gpt-4o-mini}"

  info "配置完成!"
  echo "  API Key : ${API_KEY:0:8}********"
  echo "  Base URL: $AUTOGEN_BASE_URL"
  echo "  Model   : $AUTOGEN_MODEL"
  echo ""
  warn "新开终端窗口后生效,或立即执行:source $SHELL_RC"
}

setup_and_install() {
  local net="$1"
  step "创建虚拟环境并安装 autogen-agentchat ..."
  mkdir -p autogen-demo && cd autogen-demo || return 1
  $PY -m venv .venv 2>/dev/null || { error "创建虚拟环境失败"; return 1; }
  # shellcheck disable=SC1091
  source .venv/bin/activate || { warn "激活虚拟环境失败,继续使用系统环境"; }

  local PIP_INDEX="-i https://pypi.tuna.tsinghua.edu.cn/simple"
  if [ "$net" = "overseas" ]; then
    PIP_INDEX=""                              # 海外直接用官方源
  fi

  step "安装 autogen-agentchat($([ "$net" = "domestic" ] && echo "清华镜像" || echo "官方源"))..."
  if pip install -U "autogen-agentchat" "autogen-ext[openai]" $PIP_INDEX --timeout 120 >/dev/null 2>&1; then
    info "安装成功"
    return 0
  fi
  warn "镜像源失败,回退官方源重试..."
  if pip install -U "autogen-agentchat" "autogen-ext[openai]" --timeout 120 >/dev/null 2>&1; then
    info "安装成功(官方源)"
    return 0
  fi
  warn "再次回退阿里镜像源..."
  if pip install -U "autogen-agentchat" "autogen-ext[openai]" -i https://mirrors.aliyun.com/pypi/simple --timeout 120 >/dev/null 2>&1; then
    info "安装成功(阿里镜像)"
    return 0
  fi
  error "autogen-agentchat 安装失败。请手动尝试:"
  echo "  # 海外:"
  echo "  pip install -U \"autogen-agentchat\" \"autogen-ext[openai]\""
  echo "  # 国内(清华):"
  echo "  pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -U \"autogen-agentchat\" \"autogen-ext[openai]\""
  return 1
}

generate_example() {
  step "生成最小对话示例(two_agent_chat.py)..."
  cat > two_agent_chat.py <<'PYEOF'
"""AutoGen 最小对话示例:AssistantAgent + UserProxyAgent 两人对话

用法:
  cd autogen-demo && source .venv/bin/activate
  # 确保设置了环境变量:
  #   export AUTOGEN_API_KEY="sk-xxx"
  #   export AUTOGEN_BASE_URL="https://cloudzone-api.cyou/v1"
  #   export AUTOGEN_MODEL="gpt-4o-mini"
  python two_agent_chat.py
"""
import asyncio
import os
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.conditions import TextMentionTermination
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_ext.models.openai import OpenAIChatCompletionClient

def main():
    # ---------- 配置模型 ----------
    # ⚠️ 如果装完发现这个包的类名变了,请以官方文档最新 API 为准
    client = OpenAIChatCompletionClient(
        model=os.getenv("AUTOGEN_MODEL", "gpt-4o-mini"),
        api_key=os.getenv("AUTOGEN_API_KEY"),
        base_url=os.getenv("AUTOGEN_BASE_URL"),  # 留空则用 OpenAI 官方端点
    )

    # ---------- 创建两个 Agent ----------
    assistant = AssistantAgent(
        name="coding_helper",
        system_message=(
            "你是一个资深程序员助手。回答问题时尽量用简短的代码示例说明。"
            "每次回答结束后加上标记【FINISHED】表示你已说完。"
        ),
        model_client=client,
    )

    user_proxy = AssistantAgent(
        name="user_proxy",
        system_message=(
            "你是用户代表。评估助手的回答质量,如果满意就回复 DONE 结束对话。"
        ),
        model_client=client,
    )

    # ---------- 终止条件 ----------
    termination = TextMentionTermination(["DONE"])

    # ---------- 启动轮询群聊 ----------
    team = RoundRobinGroupChat(
        [assistant, user_proxy],
        termination=termination,
        max_turns=6,                     # 最多 6 轮对话防止无限循环
    )

    task = input("请输入要问的问题(或回车使用默认问题):\n> ") or \
           "帮我写一个快速排序的 Python 实现,要有注释"

    print(f"\n--- 提问: {task} ---\n")

    async def run():
        stream = team.run(task=task)
        async for message in stream:
            # message.source = Agent名字, message.content = 回答内容
            print(f"[{message.source}] {message.content}\n{'-'*40}")

    try:
        asyncio.run(run())
    except Exception as e:
        print(f"❌ 出错: {e}")
        print("\n排查建议:")
        print("  1. 确认 API Key 正确:echo $AUTOGEN_API_KEY | head -c 5")
        print("  2. 确认基础 URL 可达:curl -fsSL $AUTOGEN_BASE_URL/models")
        print("  3. 如上述都正常,请查看官方文档:https://microsoft.github.io/autogen/")

if __name__ == "__main__":
    main()
PYEOF
  info "已生成 autogen-demo/two_agent_chat.py"
}

main() {
  echo "============================================"
  echo "  AutoGen 多智能体协作开发 一键脚本"
  echo "  适用于 macOS / Linux / WSL"
  echo "  默认接入:云间 API 中转站"
  echo "============================================"
  echo ""

  if ! check_python310; then exit 1; fi

  local NET
  NET=$(detect_network)

  configure_api || {
    warn "跳过 API 配置。示例脚本将使用 OpenAI 官方端点,请手动设置 AUTOGEN_API_KEY 环境变量。"
  }

  setup_and_install "$NET" || {
    error "安装失败,请按上方提示处理后再重跑。"
    exit 1
  }

  generate_example

  echo ""
  echo "============================================"
  info "全部完成!"
  echo "  进入项目目录:cd autogen-demo"
  echo "  激活环境:     source .venv/bin/activate"
  echo "  运行示例:     python two_agent_chat.py"
  echo ""
  echo "  想查看更多示例?见官方文档:"
  echo "    https://microsoft.github.io/autogen/"
  echo "============================================"
}

main "$@"

Windows PowerShell

# ============================================================
#  AutoGen 多智能体协作开发 一键脚本(Windows PowerShell)
#  公开源码,欢迎审查 -- 不放心可先复制给 AI 判断
#  默认配置:云间 API 中转站(https://cloudzone-api.cyou/)
# ============================================================
$ErrorActionPreference = "Stop"

function Write-Info  { Write-Host "[INFO] $args" -ForegroundColor Green }
function Write-Warn  { Write-Host "[WARN] $args" -ForegroundColor Yellow }
function Write-Err   { Write-Host "[ERROR] $args" -ForegroundColor Red }
function Write-Step  { Write-Host "[STEP] $args" -ForegroundColor Cyan }

function Detect-Network {
    Write-Step "检测网络环境(国内 / 国外)..."
    try {
        $null = Invoke-WebRequest -Uri "https://github.com" -Method Head -TimeoutSec 5 -UseBasicParsing
        Write-Info "可直连 github.com,判定为海外网络"
        return "overseas"
    } catch {
        Write-Warn "无法直连 github.com,判定为国内网络环境(将自动切换 PyPI 镜像)"
        return "domestic"
    }
}

function Check-Python310 {
    Write-Step "检查 Python 3.10+ ..."
    $pythonCandidates = @("python", "python3")
    foreach ($cmd in $pythonCandidates) {
        try {
            $versionStr = & $cmd --version 2>&1
            if ($versionStr -match 'Python\s+(\d+)\.(\d+)') {
                $major = [int]$Matches[1]
                $minor = [int]$Matches[2]
                if ($major -gt 3 -or ($major -eq 3 -and $minor -ge 10)) {
                    $script:PY = $cmd
                    Write-Info "使用 $cmd(版本:$versionStr)"
                    return $true
                }
            }
        } catch {
            # 不是有效的 python 命令,跳过
        }
    }
    Write-Err "需要 Python 3.10+。请先安装:https://www.python.org/downloads/"
    return $false
}

function Configure-Api {
    Write-Step "配置 API Key..."
    $CLOUDZONE_URL = "https://cloudzone-api.cyou"
    $CLOUDZONE_API_BASE = "https://cloudzone-api.cyou/v1"

    Write-Host ""
    Write-Host "多智能体来回对话会消耗较多 token,建议使用低价中转端点:"
    Write-Host "  云间 API 中转站($CLOUDZONE_URL)"
    Write-Host "  · 90+ 模型(GPT-4o、Claude、Gemini 等)"
    Write-Host "  · OpenAI + Anthropic 兼容接口"
    Write-Host "  · 香港节点直连,国内无需翻墙"
    Write-Host "  · 价格 0.05x 起,按量计费无月租"
    Write-Host ""
    Write-Host "是否现在跳转注册并获取 API Key?"
    Write-Host "  Y - 立即跳转至 $CLOUDZONE_URL"
    Write-Host "  N - 我已有 Key,自行输入"
    $choice = Read-Host "请选择 [Y/N]"

    $apiKey = ""
    if ($choice -eq "Y" -or $choice -eq "y") {
        Write-Info "正在打开浏览器..."
        try {
            Start-Process "$CLOUDZONE_URL"
        } catch {
            Write-Warn "无法自动打开浏览器,请手动访问:$CLOUDZONE_URL"
        }
        Write-Host "注册后在「我的 API Key」页面复制 Key(以 sk- 开头)。"
        # Read-Host -AsSecureString 不回显,但返回 SecureString 需转明文用于环境变量
        $sec = Read-Host "粘贴你的 API Key" -AsSecureString
        $bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($sec)
        $apiKey = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
        [System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr)
    } else {
        $sec = Read-Host "请输入你的 API Key (sk-...)" -AsSecureString
        $bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($sec)
        $apiKey = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
        [System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr)
    }

    if ([string]::IsNullOrWhiteSpace($apiKey)) {
        Write-Err "未输入 API Key,跳过配置。可稍后设置环境变量后重新运行示例。"
        return $false
    }

    # 写入用户级环境变量(永久),并导出到当前会话
    [Environment]::SetEnvironmentVariable("AUTOGEN_API_KEY", $apiKey, "User")
    [Environment]::SetEnvironmentVariable("AUTOGEN_BASE_URL", $CLOUDZONE_API_BASE, "User")
    [Environment]::SetEnvironmentVariable("AUTOGEN_MODEL", "gpt-4o-mini", "User")
    $env:AUTOGEN_API_KEY = $apiKey
    $env:AUTOGEN_BASE_URL = $CLOUDZONE_API_BASE
    $env:AUTOGEN_MODEL = "gpt-4o-mini"

    Write-Info "配置完成!"
    Write-Host "  API Key : $($apiKey.Substring(0, [Math]::Min(8, $apiKey.Length)))********"
    Write-Host "  Base URL: $CLOUDZONE_API_BASE"
    Write-Host "  Model   : gpt-4o-mini"
    Write-Host ""
    Write-Warn "新开终端窗口后生效(当前会话已立即生效)"
    return $true
}

function Setup-And-Install {
    param([string]$Net)
    Write-Step "创建虚拟环境并安装 autogen-agentchat ..."

    New-Item -ItemType Directory -Path ".\autogen-demo" -Force | Out-Null
    Set-Location .\autogen-demo

    # 创建 venv
    try {
        python -m venv .venv 2>$null
        if (-not (Test-Path ".venv\Scripts\Activate.ps1")) {
            # macOS/Linux wsl 路径不同
            python -m venv .venv
        }
    } catch {
        Write-Err "创建虚拟环境失败:$_"; return $false
    }

    # 激活虚拟环境(PowerShell 需要临时放宽执行策略才能 source .ps1)
    # Set-ExecutionPolicy -Scope Process Bypass 仅当前进程生效,关闭 PowerShell 即恢复
    # 这是 PowerShell 安全机制,防止未经授权运行脚本
    Set-ExecutionPolicy -Scope Process Bypass -Force -ErrorAction SilentlyContinue
    .\.venv\Scripts\Activate.ps1 2>$null
    if (-not (Get-Command pip -ErrorAction SilentlyContinue)) {
        Write-Warn "虚拟环境激活失败,继续使用系统 Python"
    }

    $pipIndex = if ($Net -eq "domestic") {
        "-i https://pypi.tuna.tsinghua.edu.cn/simple"
    } else {
        ""
    }

    Write-Step "安装 autogen-agentchat ($($if ($Net -eq 'domestic') { '清华镜像' } else { '官方源' }))..."
    $installArgs = @("install", "-U", "`"autogen-agentchat`"", "`"autogen-ext[openai]`"", "--timeout", "120")
    if ($Net -eq "domestic") {
        $installArgs += "-i"
        $installArgs += "https://pypi.tuna.tsinghua.edu.cn/simple"
    }

    $result = pip $installArgs 2>&1
    if ($LASTEXITCODE -eq 0 -or ($result -notmatch "error|Failed|failed")) {
        Write-Info "安装成功(清华镜像)"
        return $true
    }

    Write-Warn "镜像源失败,回退官方源重试..."
    $result = pip install -U "autogen-agentchat" "autogen-ext[openai]" --timeout 120 2>&1
    if ($LASTEXITCODE -eq 0 -or ($result -notmatch "error|Failed|failed")) {
        Write-Info "安装成功(官方源)"
        return $true
    }

    Write-Warn "再次回退阿里镜像源..."
    $result = pip install -U "autogen-agentchat" "autogen-ext[openai]" `
        -i "https://mirrors.aliyun.com/pypi/simple" --timeout 120 2>&1
    if ($LASTEXITCODE -eq 0 -or ($result -notmatch "error|Failed|failed")) {
        Write-Info "安装成功(阿里镜像)"
        return $true
    }

    Write-Err "autogen-agentchat 安装失败。请手动尝试:"
    Write-Host "  # 海外:"
    Write-Host '  pip install -U "autogen-agentchat" "autogen-ext[openai]"'
    Write-Host "  # 国内(清华):"
    Write-Host "  pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -U `"autogen-agentchat`" `"autogen-ext[openai]`""
    return $false
}

function Generate-Example {
    Write-Step "生成最小对话示例(two_agent_chat.py)..."

    $exampleCode = @"

import asyncio import os from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.conditions import TextMentionTermination from autogen_agentchat.teams import RoundRobinGroupChat from autogen_ext.models.openai import OpenAIChatCompletionClient

def main(): client = OpenAIChatCompletionClient( model=os.getenv(“AUTOGEN_MODEL”, “gpt-4o-mini”), api_key=os.getenv(“AUTOGEN_API_KEY”), base_url=os.getenv(“AUTOGEN_BASE_URL”), )

assistant = AssistantAgent(
    name="coding_helper",
    system_message=(
        "你是一个资深程序员助手。回答问题时尽量用简短的代码示例说明。"
        "每次回答结束后加上标记【FINISHED】表示你已说完。"
    ),
    model_client=client,
)

user_proxy = AssistantAgent(
    name="user_proxy",
    system_message="你是用户代表,评估助手回答质量,满意就回复 DONE。",
    model_client=client,
)

termination = TextMentionTermination(["DONE"])
team = RoundRobinGroupChat(
    [assistant, user_proxy],
    termination=termination,
    max_turns=6,
)

task = input("请输入要问的问题:") or "帮我写一个快速排序的 Python 实现"
print(f"\n--- {task} ---\n")

async def run():
    stream = team.run(task=task)
    async for message in stream:
        print(f"[{message.source}] {message.content}")

asyncio.run(run())

if name == “main”: main() “@

Set-Content -Path "two_agent_chat.py" -Value $exampleCode -Encoding UTF8
Write-Info "已生成 autogen-demo/two_agent_chat.py"

}

===== 主流程 =====

Write-Host “============================================” Write-Host " AutoGen 多智能体协作开发 一键脚本” Write-Host " 适用于 Windows” Write-Host " 默认接入:云间 API 中转站” Write-Host “============================================” Write-Host "”

if (-not (Check-Python310)) { exit 1 }

$net = Detect-Network

if (-not (Configure-Api)) { Write-Warn “跳过 API 配置。示例脚本将使用 OpenAI 官方端点,请手动设置 AUTOGEN_API_KEY 环境变量。” }

if (-not (Setup-And-Install -Net $net)) { Write-Err “安装失败,请按上方提示处理后再重跑。” exit 1 }

Generate-Example

Write-Host "" Write-Host “============================================” Write-Info “全部完成!” Write-Host " 进入项目目录:cd autogen-demo" Write-Host " 激活环境: .venv\Scripts\Activate.ps1" Write-Host " 运行示例: python two_agent_chat.py" Write-Host "" Write-Host " 查看更多示例:https://microsoft.github.io/autogen/" Write-Host “============================================”


> 也可从 `https://cleanresolver.com/scripts/install-autogen-guide.sh`(`.ps1`)下载。