vLLM 接入 AutoGen:把多智能体框架对接到本地 OpenAI 兼容推理后端
【免费下载链接】vllmA high-throughput and memory-efficient inference and serving engine for LLMs项目地址: https://gitcode.com/GitHub_Trending/vl/vllm
本文介绍如何把微软的多智能体框架 AutoGen 接入 vLLM 服务:先部署一个 OpenAI 兼容的 vLLM 推理服务,再用 AutoGen 的OpenAIChatCompletionClient以流式方式调用本地模型,并深入解析 vLLM 侧/v1/chat/completions路由、SSE 流式响应与 API Key 鉴权的源码实现。读完后你将能够独立完成“本地 vLLM 推理 + AutoGen 智能体应用”的完整部署与调用链路。
一、AutoGen 与 vLLM 的对接思路
AutoGen 是微软开源的多智能体(multi-agent)AI 应用框架,用于构建可以自主行动或与人协作的智能体应用。vLLM 则提供高吞吐、内存高效的 LLM 推理与 serving 引擎。两者对接的核心桥梁是 vLLM 的OpenAI 兼容 API:
- vLLM 服务通过
vllm serve启动后,对外暴露与 OpenAI Chat Completions 接口一致的 HTTP 端点; - AutoGen 通过其扩展包中的
OpenAIChatCompletionClient连接该端点,只需将base_url指向本地 vLLM 服务即可; - 因此无需改动 AutoGen 应用代码,就能把原本指向远端 OpenAI 的调用切换到本地自托管模型。
vLLM 仓库中对应的文档页为 AutoGen 集成文档,本文在其基础上结合 vLLM 源码对调用链路做纵深展开。
二、环境准备
在开始部署前,先准备 vLLM 与 AutoGen 的 Python 环境(文档中注明 AutoGen 要求Python 3.10 或更高版本):
pip install vllm # Install AgentChat and OpenAI client from Extensions # AutoGen requires Python 3.10 or later. pip install -U "autogen-agentchat" "autogen-ext[openai]"两条安装命令分别对应两类依赖:
vllm:服务端推理引擎,提供vllm serve命令与 OpenAI 兼容的 HTTP API;autogen-agentchat:AutoGen 的 AgentChat 高层智能体 API(本文示例直接使用其底层的模型客户端);autogen-ext[openai]:AutoGen 扩展包中的 OpenAI 模型客户端实现,OpenAIChatCompletionClient即来自该包。只要服务端行为符合 OpenAI Chat Completions 协议,base_url指向 vLLM 即可复用。
三、启动 vLLM 的 OpenAI 兼容服务
第一步是启动一个支持 Chat Completion 的 vLLM 服务,例如:
vllm serve mistralai/Mistral-7B-Instruct-v0.23.1 vLLM 侧的/v1/chat/completions端点
从源码看,AutoGen 最终请求的端点由 chat_completion 路由 注册:
@router.post( "/v1/chat/completions", dependencies=[Depends(validate_json_request)], ... ) @with_cancellation @load_aware_call async def create_chat_completion(request: ChatCompletionRequest, raw_request: Request): ...该处理器根据请求返回两种形态的响应(见 api_router.py):
- 非流式:直接返回
ChatCompletionResponse的 JSON; - 流式(
stream: true):返回StreamingResponse,媒体类型为text/event-stream,即标准 SSE(Server-Sent Events)。
流式响应在 OpenAIServingChat 中以逐条yield生成:每个增量 token 包装为一帧data: {json}\n\n,流结束时以data: [DONE]\n\n作为终止标记。这正是 OpenAI 客户端库(包括 AutoGen 的OpenAIChatCompletionClient)所依赖的协议格式。
3.2 为什么示例中api_key="EMPTY"就能通过
文档示例里客户端传入api_key="EMPTY",这背后有明确的源码依据:
- vLLM 的 CLI 入口 vllm/entrypoints/cli/openai.py 中,
api_key参数若未显式给出,则回退到环境变量OPENAI_API_KEY,其默认值就是"EMPTY"; - 鉴权由纯 ASGI 中间件 AuthenticationMiddleware 实现:它检查
Authorization: Bearer <token>头,并将 token 的 SHA-256 摘要与配置中的 API Key 做secrets.compare_digest安全比较; - 关键在于中间件的注册逻辑 register.py:仅当从
--api-key参数或VLLM_API_KEY环境变量中解析出非空token 时才会启用鉴权。默认启动方式下没有配置任何 API Key,中间件不生效,因此客户端携带什么 key(哪怕是"EMPTY")都能访问; - 若你在启动时配置了
--api-key或VLLM_API_KEY,则GUARDED_PREFIX(/v1、/v2、/inference、/cohere)前缀下的所有请求都必须携带匹配的 Bearer token,否则返回 401(见 authenticate.py)。此时 AutoGen 客户端的api_key字段必须改为与之一致的真实密钥。
3.3 服务端口与 base_url 约定
vllm serve默认监听8000端口。客户端连接地址遵循 OpenAI SDK 的惯例:base_url以/v1结尾,客户端会在其后追加具体路径(如/chat/completions)。单机本地调用时形如http://127.0.0.1:8000/v1;跨机器部署时替换为 vLLM 所在主机 IP 与端口即可。
四、用 AutoGen 流式调用 vLLM
下面是文档给出的完整调用示例,通过OpenAIChatCompletionClient创建消息流并逐帧打印:
import asyncio from autogen_core.models import UserMessage from autogen_ext.models.openai import OpenAIChatCompletionClient from autogen_core.models import ModelFamily async def main() -> None: # Create a model client model_client = OpenAIChatCompletionClient( model="mistralai/Mistral-7B-Instruct-v0.2", base_url="http://{your-vllm-host-ip}:{your-vllm-host-port}/v1", api_key="EMPTY", model_info={ "vision": False, "function_calling": False, "json_output": False, "family": ModelFamily.MISTRAL, "structured_output": True, }, ) messages = [UserMessage(content="Write a very short story about a dragon.", source="user")] # Create a stream. stream = model_client.create_stream(messages=messages) # Iterate over the stream and print the responses. print("Streamed responses:") async for response in stream: if isinstance(response, str): # A partial response is a string. print(response, flush=True, end="") else: # The last response is a CreateResult object with the complete message. print("\n\n------------\n") print("The complete response:", flush=True) print(response.content, flush=True) # Close the client when done. await model_client.close() asyncio.run(main())使用时把{your-vllm-host-ip}和{your-vllm-host-port}替换为实际服务地址,例如http://127.0.0.1:8000/v1。
4.1 关键参数逐项解析
model:与vllm serve启动时使用的模型标识保持一致(本例为mistralai/Mistral-7B-Instruct-v0.2)。vLLM 会对请求中的模型名做校验,不匹配会收到错误响应。
model_info:这是 AutoGen 侧对模型能力边界的声明,会直接影响 AutoGen 后续的智能体行为(例如是否尝试发送图片、是否注入函数调用指令)。本例各字段含义:
"vision": False:该模型不支持视觉输入,AutoGen 不会尝试构造多模态消息;"function_calling": False:不使用模型原生函数调用协议;"json_output": False:不启用响应式 JSON 输出模式;"family": ModelFamily.MISTRAL:声明模型家族,AutoGen 会据此适配提示词与消息模板;"structured_output": True:允许 AutoGen 在该模型上使用结构化输出的高级特性(vLLM 的 Chat Completions 接口支持guided_json等约束解码参数)。
api_key:如 3.2 节所述,默认无鉴权的本地服务传任意占位值(约定俗成为"EMPTY")即可;生产环境配置了密钥时请传入真实值。
4.2 流式响应的语义
create_stream返回一个异步迭代器,其元素类型遵循 AutoGen 的约定:
- 中间帧为
str:每一帧对应 vLLM 侧一帧 SSEdata: {...}中增量 token 文本,可直接逐字打印,实现“打字机”效果; - 末帧为
CreateResult对象:包含完整消息内容(response.content)等元数据。这与 vLLM 服务端流以data: [DONE]\n\n结束的行为相对应(见 serving.py):客户端解析到 DONE 标记后把累积结果封装为CreateResult交付给迭代器。
注意示例末尾的await model_client.close():模型客户端持有 HTTP 连接资源,任务结束时显式关闭是良好的卫生习惯。
五、从单点调用到多智能体应用
本文示例演示的是最底层的模型客户端调用,它也是 AutoGen 上层 AgentChat 能力的基石。基于同一model_client,你还可以:
- 把该客户端传给 AgentChat 的智能体类型,构建“用户 ↔ 助手”对话代理或代理间协作(handoff/group chat)应用;
- 更换
vllm serve启动的模型后,同步修改model与model_info(例如启用工具调用能力时置"function_calling": True); - 对并发压测场景,vLLM 服务端的连续批处理(continuous batching)天然支持多请求并发,多个 AutoGen 智能体可以同时共享同一 vLLM 端点。
以上扩展均基于 OpenAI 兼容接口这一层,不依赖 AutoGen 特定版本细节;具体 API 签名请以你安装的autogen-ext版本的参考文档为准。
六、小结
| 环节 | 命令 / 代码 | 依据 |
|---|---|---|
| 安装依赖 | pip install vllm+pip install -U "autogen-agentchat" "autogen-ext[openai]"(Python ≥ 3.10) | autogen.md |
| 启动服务 | vllm serve mistralai/Mistral-7B-Instruct-v0.2 | 同上 |
| 服务端点 | POST /v1/chat/completions,支持 SSE 流式 | api_router.py |
| 流式结束标记 | data: [DONE]\n\n | serving.py |
| 鉴权行为 | 默认未配置 API Key 时不启用鉴权,api_key="EMPTY"可用 | authenticate.py、register.py |
| 客户端调用 | OpenAIChatCompletionClient(base_url=".../v1", ...)流式迭代 | autogen.md |
vLLM 通过 OpenAI 兼容 API 成为 AutoGen 的本地推理后端后,多智能体应用的模型层即可完全私有化部署:协议对齐(路由、SSE、DONE 标记)、鉴权语义(Bearer token 中间件)都有清晰的源码实现可查,遇到问题时可按上表快速定位到服务端或客户端一侧。
延伸阅读(仓库内路径)
- 集成文档:docs/deployment/frameworks/autogen.md
- OpenAI 兼容 API 实现:vllm/entrypoints/openai/
- 同目录下的其他框架集成文档可参考 docs/deployment/frameworks/
【免费下载链接】vllmA high-throughput and memory-efficient inference and serving engine for LLMs项目地址: https://gitcode.com/GitHub_Trending/vl/vllm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考