AI代理网关

一个基于FastAPI构建的异步AI代理网关,能够智能路由用户查询到多个本地服务并并行处理结果。

  • by AshnaXhaikh
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 AshnaXhaikh/MCP_LEARNING

使用说明

礼宾AI网关:多服务代理演示

这个项目提供了一个健壮的、异步构建的网关 FastAPI 将一个多功能AI代理(使用LangChain/MCP等系统)暴露给网页前端。该代理能够智能地将用户查询路由到多个本地专用服务器(例如,数学、天气服务器),并并发处理这些查询的结果。


📸 前端UI预览

[请在此插入聊天界面的截图,以便快速查看。]

示例Markdown语法用法:


✨ 特点

  • **异步API(/ask)**使用 FastAPI 的异步功能async def在复杂的、多步骤的代理操作过程中,保持网络服务器的响应性。
  • 代理初始化在服务器启动时优雅地初始化AI代理及其所需的多客户端进程(MCP)客户端@app.on_event("startup"))。
  • 干净关闭安全地终止底层工具服务器进程,使用 await MCP_CLIENT.ashutdown() 在服务器关闭时,以防止产生孤儿进程。
  • CORS 配置已完全配置为支持本地开发,以便前端(例如,在 localhost:5500) 与 Python 后端进行通信 (localhost:8000)。

⚙️ 架构概述

  • api_gateway.py 翻译为中文是:“API网关.py” 或者 “API接口网关.py”(具体翻译可能根据上下文有所调整,但基本意思是“API网关”或“API接口网关”加上文件扩展名.py)。在这里,通常指的是一个处理API请求的网关程序文件 作为前端应用的单一入口点。

  • **前端(HTML/JS)**向(系统/服务器)发送用户查询 /ask 终端点。

  • api_gateway.py(FastAPI):

    1. 接收查询。
    2. 将查询传递给 get_agent_response 函数(来自 client.py)。
    3. 基础的/根本的 代理 并且 MultiServerMCPClient 翻译为中文是:“多服务器MCP客户端” 并行执行所需的工具(如数学工具和天气工具)。
    4. 将最终处理后的响应返回给前端。

🚀 开始入门

先决条件

你需要 Python 3.8+ 以及以下包(假设您的代理依赖于 FastAPI/Uvicorn、Pydantic 和客户端库):

pip install fastapi uvicorn pydantic
# And any other necessary packages for your agent/client.py (e.g., langchain, etc.)

安装与设置

  1. 确保 client.py 已准备好: 确保你的 client.py 文件(其中包含 setup_agent 并且 get_agent_response) 已正确配置并在本地正常运行。

  2. 启动网关: 运行 api_gateway.py 直接文件(传输/处理):

    python api_gateway.py
    

    服务器将在 http://127.0.0.1:8000(这个网址在中文中通常不翻译,直接保留原样,因为网址是国际通用的,不需要翻译。但为了说明其含义,可以解释为:本地主机的8000端口上的一个网页地址。)您将看到确认代理初始化的消息:

    --- Initializing Concierge AI Agent System ---
    --- Agent System Ready ---
    INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
    

API 端点

终点(Endpoint) 方法(Method) 描述(Description) 负载示例(Payload Example)
/ask POST 使用AI代理处理用户查询并返回结果 {"user_input": "What is 10 + 5 and the weather in Paris?"}
/status GET 简单的健康检查,用于验证代理是否已初始化 不适用(N/A)

Python使用示例(测试API)

你可以测试一下 /ask 使用终端(或端点) requests:

import requests
import json

url = "http://127.0.0.1:8000/ask"
payload = {"user_input": "What is 20 multiplied by 5?"}

response = requests.post(url, json=payload)
print(json.dumps(response.json(), indent=4))

服务器关闭

当你停止服务器时(例如,按Ctrl+C) shutdown_event 处理程序确保MCP客户端能够干净地关闭其所有后台进程:

INFO:     Shutting down
--- Shutting down MCP Client subprocesses ---
--- MCP Client subprocesses shut down ---

注: 这种干净的关闭依赖于正确使用 await MCP_CLIENT.ashutdown(),这阻止了 AttributeError 问题。