大模型应用开发--7--fastmcp示例

# mcp_server.py
from fastmcp import FastMCP

mcp = FastMCP("demo-mcp-server")


# --- Tool Example ---
# 定义工具 1: 加法
@mcp.tool()
def add(a: int, b: int) -> int:
    """Add two integers together."""
    return a + b

# 定义工具 2: 乘法
@mcp.tool()
def multiply(a: int, b: int) -> int:
    """Multiply two integers together."""
    return a * b

# 定义工具 3: 减法
@mcp.tool()
def subtract(a: int, b: int) -> int:
    """Subtract b from a."""
    return a - b

# 定义工具 4: 除法
@mcp.tool()
def divide(a: float, b: float) -> float:
    """Divide a by b."""
    if b == 0:
        raise ValueError("Cannot divide by zero")
    return a / b


# --- Prompt Example ---

@mcp.prompt
def summarize(text: str) -> str:
    """Prompt: ask the LLM to summarize a given text."""
    return (
        f"请对以下文本进行简要总结,控制在 3 句话以内:\n\n{text}"
    )


if __name__ == "__main__":
    mcp.run(transport="streamable-http", host="127.0.0.1", port=8081)

# agent_demo.py
import asyncio

import httpx
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field


class MathResult(BaseModel):
    """数学运算结果"""
    expression: str = Field(..., description="计算表达式")
    result: int = Field(..., description="计算结果")
    step: str = Field(..., description="计算步骤说明")


def _make_mcp_http_client(
    headers: dict | None  = None,
    timeout: httpx.Timeout | None = None,
    auth: httpx.Auth | None = None
):
    "避免使用代理和ssl验证客户端,必须有headers,timeout, auth这三个参数,否则会报错"
    return httpx.AsyncClient(trust_env=False, proxy=None, verify=False, timeout=100, headers=headers, auth=auth)


def mcp_client():
    # 配置 MCP 客户端 - 使用 streamable_http 传输
    # 注意:transport 参数可以设置为 "streamable_http" 或简写为 "http"
    # MultiServerMCPClient 支持四种传输协议:stdio、sse、streamable_http、websocket[reference:2]
    client = MultiServerMCPClient(
        {
            "math_server": {
                "url": "http://localhost:8081/mcp",  # MCP 服务器端点
                "transport": "streamable_http",  # 使用 streamable HTTP 传输
                "httpx_client_factory": _make_mcp_http_client
            }
        },
        tool_name_prefix=True,  # 为工具添加服务器前缀以区分来源
    )
    return client


async def creat_agent_():
    client = mcp_client()
    tools = await client.get_tools()  # 从 MCP 服务器加载工具
    print(f"Loaded {len(tools)} tools from MCP server:")
    for tool in tools:
        print(f"  - {tool.name}: {tool.description}")

    llm = ChatOpenAI(
        model="qwen2.5",
        base_url="http://xxxx/v1",
        default_headers={  # 必须设置的请求头参数
            "Authorization": "xxx",
            "Content-Type": "application/json"
        },
        http_async_client=httpx.AsyncClient(trust_env=False, proxy=None, verify=False, timeout=30),
        api_key="EMPTY",  # 必须得有,否则报错,因为vllm启动模型时,没有设置api—key,此处访问时必须设置为EMPTY
        temperature=0.7,
        extra_body={"chat_template_kwargs": {"enable_thinking": False}},  # 额外body体参数,此处表示不启用思考
    )

    # 4. 创建 ReAct Agent
    agent = create_agent(
        llm,
        tools=tools,
        response_format=MathResult  # 没起作用,不清楚为什么?
    )
    return agent


async def main():
    agent = await creat_agent_()

    query = "What is 15 plus 27?"

    # 1. 获取 Agent 响应
    response = await agent.ainvoke({"messages": [{"role": "user", "content": query}]})

    for msg in response['messages']:
        msg.pretty_print()


if __name__ == "__main__":
    asyncio.run(main())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值