news 2026/9/13 19:25:56

如何用 MLflow Agent Server 把 AI 代理托管为生产 REST API

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用 MLflow Agent Server 把 AI 代理托管为生产 REST API

如何用 MLflow Agent Server 把 AI 代理托管为生产 REST API

【免费下载链接】mlflowThe open source AI engineering platform for agents, LLMs, and ML models. MLflow enables teams of all sizes to debug, evaluate, monitor, and optimize production-quality AI applications while controlling costs and managing access to models and data.项目地址: https://gitcode.com/GitHub_Trending/ml/mlflow

如果你已经用openai-agents-sdk或其他框架写好了一个 AI 代理,想把它暴露成一个可以被 HTTP 请求调用的服务,而不是只能在脚本里跑,MLflow 的 Agent Server 可以直接完成这件事。它是一个基于 FastAPI 的服务器,把代理函数注册在POST /invocations端点上,并自动处理请求/响应校验、MLflow tracing 记录,以及(可选的)流式响应。

适用前提:

  • 需要安装openai-agents-sdkmlflow>=3.0系列中的 3.6.0 及以上版本(文档给出的安装命令是'mlflow>=3.6.0');
  • 代理底层调用 OpenAI 时需要设置OPENAI_API_KEY
  • 服务端代码必须导入你的 agent 模块,@invoke注册的函数才会被服务器发现。

安装依赖并准备环境

pip install -U openai-agents 'mlflow>=3.6.0' export OPENAI_API_KEY=sk-...

OPENAI_API_KEY替换为你自己的密钥。

定义带@invoke装饰器的代理函数

创建一个agent.py,在其中定义代理,并把处理请求的函数用@invoke()标注。函数签名要使用ResponsesAgentRequest/ResponsesAgentResponse这两个类型,服务器会据此自动做输入输出校验:

from agents import Agent, Runner from mlflow.genai.agent_server import invoke, stream from mlflow.types.responses import ResponsesAgentRequest, ResponsesAgentResponse agent = Agent( name="Math Tutor", instructions="You provide help with math problems. Explain your reasoning and include examples", ) @invoke() async def non_streaming(request: ResponsesAgentRequest) -> ResponsesAgentResponse: msgs = [i.model_dump() for i in request.input] result = await Runner.run(agent, msgs) return ResponsesAgentResponse(output=[item.to_input_item() for item in result.new_items]) # 可选:再注册一个 @stream 函数即可支持流式响应

两点限制需要注意:

  • @invoke装饰器只能使用一次,重复注册会抛出ValueError
  • 只有注册了@stream函数后,请求体里的"stream": true才会生效,否则流式请求没有处理函数可用。

编写服务器入口start_server.py

# 必须导入 agent 模块,@invoke 注册的函数才能被服务器发现 import agent # noqa: F401 from mlflow.genai.agent_server import ( AgentServer, setup_mlflow_git_based_version_tracking, ) agent_server = AgentServer("ResponsesAgent") app = agent_server.app # 可选:开启基于 git 的版本跟踪, # 让每次 trace 对应到一个具体的 git commit setup_mlflow_git_based_version_tracking() def main(): # 支持多 worker 时,以 import string 的形式传入 app agent_server.run(app_import_string="start_server:app") if __name__ == "__main__": main()
  • AgentServer("ResponsesAgent")中的类型参数开启自动的输入/输出校验和流式 tracing 聚合;目前只支持"ResponsesAgent"
  • setup_mlflow_git_based_version_tracking()是可选的,它会把活跃模型名与当前 git commit 短哈希关联(本地开发时 app 名为local,部署为 Databricks App 时取DATABRICKS_APP_NAME环境变量)。
  • agent_server.run(app_import_string="start_server:app")以模块内app对象作为 import string 传给 uvicorn,这是多 worker 部署的方式。

启动服务器

python3 start_server.py --reload

--reload会在代码变更时自动重载服务器,适合开发阶段。生产环境常用的参数(来自同一启动入口的命令行参数解析):

# 传入 worker 数以支持多个并发请求(默认 1) python3 start_server.py --workers 4 # 指定端口(默认 8000) python3 start_server.py --port 8000

服务器默认监听0.0.0.0,因此局域网内或其他容器可通过主机地址访问。

验证服务是否可用

启动成功后,向/invocations端点发送一个 JSON 请求测试:

curl -X POST http://localhost:8000/invocations \ -H "Content-Type: application/json" \ -d '{ "input": [{ "role": "user", "content": "What is the 14th Fibonacci number?"}]}'

请求成功时服务器返回代理的输出(ResponsesAgentResponse结构)。如果请求体不是合法 JSON 或不满足ResponsesAgent的校验,会收到 400;代理执行抛异常时会收到 500 及错误信息。

除了/invocations,服务器还暴露了以下端点,可用于健康检查和部署监控:

  • GET /health:返回{"status": "healthy"}
  • GET /agent/info:返回 app 名、use_case: "agent"、mlflow 版本,ResponsesAgent 类型下还包含agent_api: "responses"
  • POST /responses:与/invocations同源的端点,用于兼容 OpenAI 客户端的client.responses.create(...)调用方式。

如果注册了@stream函数,可以在请求体中加入"stream": true发送流式请求,响应以data: <json>分块推送,并以data: [DONE]结束:

curl -X POST http://localhost:8000/invocations \ -H "Content-Type: application/json" \ -d '{ "input": [{ "role": "user", "content": "What is the 14th Fibonacci number?"}], "stream": true }'

查看自动记录的 Traces

Agent Server 会自动为每次调用创建 MLflow trace(请求作为输入、响应作为输出写入对应 span)。测试你的代理后,打开 MLflow UI,点击 "Traces" 标签页即可看到这些调用记录。若开启了setup_mlflow_git_based_version_tracking(),trace 会关联到对应的 git commit 版本,方便回溯是哪个代码版本产生了某次调用。

可选:用mlflow.genai.evaluate评估代理

测试通过后,可以用同一套@invoke注册的函数做离线评估,而不用真正启动服务器。创建一个eval_agent.py

import asyncio import mlflow # 导入 agent 模块,@invoke 注册的函数才能被找到 from agent import agent # noqa: F401 from mlflow.genai.agent_server import get_invoke_function from mlflow.genai.scorers import RelevanceToQuery, Safety from mlflow.types.responses import ResponsesAgentRequest, ResponsesAgentResponse eval_dataset = [ { "inputs": { "request": {"input": [{"role": "user", "content": "What's the 15th Fibonacci number"}]} }, "expected_response": "The 15th Fibonacci number is 610.", } ] def sync_invoke_fn(request: dict) -> ResponsesAgentResponse: # 获取通过 @invoke 装饰器注册的函数 invoke_fn = get_invoke_function() return asyncio.run(invoke_fn(ResponsesAgentRequest(**request))) mlflow.genai.evaluate( data=eval_dataset, predict_fn=sync_invoke_fn, scorers=[RelevanceToQuery(), Safety()], )

运行python3 eval_agent.py,控制台会输出评估结果和 MLflow run 信息;在 MLflow UI 的实验页面可以找到对应的 run,点击 run 名称查看聚合的指标和元数据。

限制说明

  • 服务器类型目前仅支持"ResponsesAgent";不传agent_type时不做输入/输出校验,也不做流式 tracing 聚合。
  • @invoke@stream各只能注册一个函数。
  • --reload依赖热重载,适合开发;生产部署应使用--workers控制并发。
  • AgentServer还支持enable_chat_proxy=True参数,把未匹配的请求代理到CHAT_APP_PORT(默认 3000)端口上的 chat 应用,只放行//favicon.ico/ping/assets/*/api/*/chat/*等路径以防 SSRF,这是搭配前端聊天应用部署时的可选项,不是本场景必需步骤。

完整示例与参数说明可对照仓库中的 Agent Server 文档,端点与命令行参数的实现见 server.py。

【免费下载链接】mlflowThe open source AI engineering platform for agents, LLMs, and ML models. MLflow enables teams of all sizes to debug, evaluate, monitor, and optimize production-quality AI applications while controlling costs and managing access to models and data.项目地址: https://gitcode.com/GitHub_Trending/ml/mlflow

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 19:22:30

IS-95 CDMA基带链路全栈仿真:Simulink+S-Function可调试实现

简介&#xff1a;本资源是一个基于MATLAB Simulink构建的CDMA&#xff08;码分多址&#xff09;通信系统仿真工程包&#xff0c;面向通信工程专业本科生、研究生及无线通信入门学习者&#xff0c;用于深入理解CDMA核心机制——如扩频调制、多用户干扰建模、Rake接收、多径衰落信…

作者头像 李华
网站建设 2026/9/13 19:22:20

EC2302电容触摸芯片PCB设计要点与灵敏度调试实战指南

EC2302是一颗非常典型的单通道电容触摸感应芯片&#xff0c;常用于小家电、智能面板、灯具、玩具这类对成本敏感又需要可靠触摸响应的产品里。它的调试难点往往不在芯片本身&#xff0c;而在PCB设计——同样的固件和寄存器配置&#xff0c;板子画得不好&#xff0c;触摸灵敏度飘…

作者头像 李华
网站建设 2026/9/13 19:21:13

Boost.Asio+Qt4+Python2在电力SCADA嵌入式系统中的工程实践

简介&#xff1a;这是一套面向工业自动化与电力监控领域的SCADA系统通信管理机完整源码&#xff0c;适用于嵌入式Linux通信管理机及大型服务器部署场景&#xff0c;主要解决多协议数据采集、跨平台通信调度与Web端可视化集成等核心问题。资源共768个文件&#xff0c;涵盖395个h…

作者头像 李华