openai-agents-python 智能体可视化指南:用 Graphviz 绘制 Agent、工具与 MCP 服务器关系图
【免费下载链接】openai-agents-pythonA lightweight, powerful framework for multi-agent workflows项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-python
本文介绍 openai-agents-python 框架内置的智能体可视化能力。通过可选的viz依赖与draw_graph函数,你可以用 Graphviz 把 Agent 及其 handoffs(任务转移)、工具(tools)和 MCP 服务器之间的连接关系自动渲染成结构化有向图,用于快速理解多智能体应用的拓扑结构。读完本文,你将掌握可视化功能的安装方式、draw_graph的完整用法、图中各节点与连线的图例含义,以及底层 DOT 生成管线的实现原理。
什么是智能体可视化
在多智能体应用中,一个入口 Agent 往往同时持有多个工具、挂载多个 MCP 服务器,并通过 handoffs 将任务转交给下游子智能体。随着规模增长,仅靠阅读代码很难直观把握"谁连接了谁"。openai-agents-python 在src/agents/extensions/visualization.py中提供了基于Graphviz的可视化扩展,能够:
- 自动发现指定 Agent 的
tools、mcp_servers与handoffs; - 递归展开 handoff 目标 Agent 及其下游资源;
- 生成带起始/结束节点的有向图(directed graph),以不同形状与颜色区分节点类型,以不同线型区分交互类型。
该扩展属于agents包的可选能力,核心入口是draw_graph函数。
安装 viz 依赖
可视化功能依赖graphviz库,需要安装可选的viz依赖组:
pip install "openai-agents[viz]"从pyproject.toml的依赖声明可以看到,该依赖组对应graphviz>=0.17:
viz = ["graphviz>=0.17"]此外,Graphviz 本身是独立于 Python 包的系统级工具。若需要将图形渲染/保存为文件,请确保运行环境中已安装 Graphviz 的 dot 可执行程序(通常由系统包管理器提供,如apt install graphviz或brew install graphviz)。
生成智能体关系图
使用draw_graph(agent)即可为指定的入口 Agent 生成可视化。该函数会创建一个有向图,其中:
- **智能体(Agent)**以黄色方框表示;
- MCP 服务器以灰色方框表示;
- **工具(Tool)**以绿色椭圆表示;
- **Handoffs(任务转移)**以从一个智能体指向另一个智能体的有向边表示。
完整示例
下面的示例来自官方文档的经典用法:构造一个"分诊(triage)智能体",它持有get_weather工具、挂载一个文件系统 MCP 服务器,并通过handoff()注册了两个子智能体(西班牙语、英语),最后调用draw_graph输出整张关系图:
import os from agents import Agent, handoff from agents.decorators import tool from agents.mcp.server import MCPServerStdio from agents.extensions.visualization import draw_graph @tool def get_weather(city: str) -> str: return f"The weather in {city} is sunny." spanish_agent = Agent( name="Spanish agent", instructions="You only speak Spanish.", ) english_agent = Agent( name="English agent", instructions="You only speak English", ) current_dir = os.path.dirname(os.path.abspath(__file__)) samples_dir = os.path.join(current_dir, "sample_files") mcp_server = MCPServerStdio( name="Filesystem Server, via npx", params={ "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", samples_dir], }, ) triage_agent = Agent( name="Triage agent", instructions="Handoff to the appropriate agent based on the language of the request.", handoffs=[handoff(spanish_agent), handoff(english_agent)], tools=[get_weather], mcp_servers=[mcp_server], ) draw_graph(triage_agent)运行后会生成一张展示Triage agent结构及其与子智能体、工具和 MCP 服务器连接关系的图形。默认情况下图形在 Jupyter/Notebook 等支持内联渲染的环境中直接展示。
递归展开规则
draw_graph()会递归展开直接放在handoffs列表中的Agent对象,以及通过handoff(agent)工厂函数注册的Handoff对象。无论哪种形式,图中都会包含每个目标的工具、MCP 服务器和下游 handoffs。
需要特别注意的是:如果使用自定义Handoff且其内部没有可恢复的目标Agent引用,则该 handoff 只会被渲染为一个具名目标节点(使用agent_name作为标签),无法展开该目标背后的资源。这一行为对应源码中的_handoff_target_agent函数——它通过Handoff._agent_ref弱引用(见src/agents/handoffs/__init__.py)尝试取回目标 Agent,取不到时返回None:
def _handoff_target_agent(handoff: Handoff) -> Agent | None: """Return the live Agent target for a ``handoff()`` object, if available.""" agent_ref = handoff._agent_ref if agent_ref is None: return None target = agent_ref() return target if isinstance(target, Agent) else None理解生成的可视化图
draw_graph生成的图形包含以下要素(与tests/test_visualization.py中断言的 DOT 输出一一对应):
| 要素 | 形状 | 颜色 | 含义 |
|---|---|---|---|
__start__节点 | 椭圆(ellipse) | 浅蓝(lightblue) | 入口点,执行起点 |
| Agent | 矩形(box) | 浅黄(lightyellow) | 智能体;子智能体使用圆角矩形(filled,rounded) |
| Tool | 椭圆(ellipse) | 浅绿(lightgreen) | 工具 |
| MCP server | 矩形(box) | 浅灰(lightgrey) | MCP 服务器 |
__end__节点 | 椭圆(ellipse) | 浅蓝(lightblue) | 执行终止点 |
| Handoff 边 | 实线箭头 | — | 智能体之间的任务转移 |
| 工具调用边 | 点线(dotted)箭头 | — | Agent 与工具之间的双向调用 |
| MCP 调用边 | 虚线(dashed)箭头 | — | Agent 与 MCP 服务器之间的双向调用 |
连线规则在_get_all_edges中定义(src/agents/extensions/visualization.py):
__start__指向入口 Agent;- Agent 与其每个工具之间生成双向点线边:
agent -> tool与tool -> agent,线宽penwidth=1.5; - Agent 与每个 MCP 服务器之间生成双向虚线边;
- Agent 与其每个 handoff 目标之间生成实线边;
- 对于没有 handoffs 的 Agent,会追加一条指向
__end__的边,表示执行在此终止。
关于 MCP 服务器渲染的版本说明
MCP 服务器节点是在较新版本的agents包中引入的,官方文档在v0.2.8版本已验证该行为。如果你的可视化图中看不到 MCP 方框,请将包升级到最新版本。仓库中的测试(如_assert_mcp_nodes、_assert_mcp_edges)明确验证了MCPServer1灰色矩形节点与 dashed 边的生成。
自定义图形显示与保存
在独立窗口中显示
默认情况下,draw_graph内联显示图形。若要在单独的窗口中打开,请调用返回值的.view()方法:
draw_graph(triage_agent).view()这是因为draw_graph返回的是graphviz.Source对象(见 draw_graph 源码),可以直接调用 Graphviz 提供的.view()、.render()等标准方法。
保存为 PNG 文件
给draw_graph传入filename参数即可将图形保存为文件:
draw_graph(triage_agent, filename="agent_graph")这会在当前工作目录生成agent_graph.png。底层实现等价于graph.render(filename, format="png", cleanup=True)——cleanup=True表示渲染完成后自动清理中间 DOT 文件,只保留最终 PNG。
深入源码:DOT 生成管线
了解底层实现有助于你在需要时扩展或调试可视化逻辑。可视化模块整体分为三层:
get_main_graph(agent):生成完整的 DOT 文本。它先声明全局图属性(splines=true平滑连线、节点字体 Arial、边宽penwidth=1.5),再拼接节点与边两段 DOT 代码,最后闭合digraph G { ... }。get_all_nodes/get_all_edges:分别递归生成节点声明与边声明。二者都接受可选的visited参数,用于预先标记已访问的 Agent 名称,跳过已展开过的子图。draw_graph:调用get_main_graph构造graphviz.Source,并根据filename决定是否渲染成 PNG。
节点 ID 的冲突处理
_GraphNodeIds类(src/agents/extensions/visualization.py)负责为每个节点分配稳定的 DOT 标识符。它用(类型, id(对象))作为内部键,防止标签相同但类型不同的节点被混淆——例如一个名为shared的 Agent、一个名为shared的工具、一个名为shared的 MCP 服务器同时出现时,每个节点都会获得唯一的 DOT ID(自动生成形如__agents_graph_tool_0__的 ID)。对应测试test_graph_keeps_different_node_types_with_the_same_name_distinct验证了 4 个同名节点拥有 4 个互不相同的 ID。
标签转义
_escape_label(源码)负责将 Agent/工具/MCP 名称安全地嵌入 Graphviz 双引号字符串:先转义反斜杠,再转义双引号,最后把\r\n、\r、\n统一替换为\n,避免名称中的特殊字符提前终止 DOT 字符串或产生畸形输出。test_names_with_quotes_and_backslashes_are_escaped与test_names_with_line_breaks_are_escaped等测试覆盖了引号、反斜杠和换行符场景。
循环引用与去重
_get_all_nodes与_get_all_edges内部通过visited_agents(以对象id为键)和visited_names双重去重:既防止同一 Agent 对象被重复展开,也避免同名 Agent 被误判为已访问。即使两个 Agent 相互 handoff(A → B → A),图也能正常生成,不会死循环——test_cycle_detection验证了循环场景下每个节点只出现一次、两条边都保留。
适用场景与延伸阅读
智能体可视化适用于以下典型场景:
- 架构评审与调试:快速确认 triage/路由 Agent 的 handoff 拓扑是否符合预期;
- 文档生成:将关系图导出为 PNG 嵌入项目文档或汇报材料;
- 规模审计:直观检查某个 Agent 是否意外携带了过多工具、MCP 服务器或下游子智能体。
想进一步理解图中元素对应的框架概念,可参考仓库中的相关文档:
- 智能体(Agent)基础:
Agent的tools、handoffs、mcp_servers等属性定义; - 任务转移(Handoffs):
handoff()工厂与Handoff对象的行为,包括agent_name、_agent_ref弱引用的语义; - 工具(Tools):
@tool装饰器与工具命名规则; - MCP 服务器:
MCPServerStdio的配置方式; - 可视化模块参考:
draw_graph、get_main_graph、get_all_nodes、get_all_edges的完整 API 说明; - 可视化测试用例:覆盖节点类型、连线样式、转义、循环检测与同名去重等全部行为。
掌握draw_graph后,你可以在任何多智能体项目中一键生成清晰的拓扑图,让 Agent、工具与 MCP 服务器的连接关系一目了然。
【免费下载链接】openai-agents-pythonA lightweight, powerful framework for multi-agent workflows项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-python
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考