liurenchaxin/litellm/testmcp_local.py

107 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import asyncio
import sys
from openai import AsyncOpenAI
from openai.types.chat import ChatCompletionUserMessageParam
from mcp import ClientSession
from mcp.client.sse import sse_client
from litellm.experimental_mcp_client.tools import (
transform_mcp_tool_to_openai_tool,
transform_openai_tool_call_request_to_mcp_tool_call_request,
)
async def main():
print("开始测试本地MCP连接...")
try:
# Initialize clients
print("初始化OpenAI客户端...")
client = AsyncOpenAI(api_key="sk-1234", base_url="http://localhost:4000")
print("OpenAI客户端初始化完成")
# Point MCP client to local LiteLLM Proxy
print("准备连接本地MCP服务器...")
# 添加超时处理
try:
async with asyncio.timeout(10): # 10秒超时
print("正在建立SSE连接...")
async with sse_client("http://localhost:4000/mcp/") as (read, write):
print("SSE连接建立成功初始化会话...")
async with ClientSession(read, write) as session:
print("正在初始化MCP会话...")
await session.initialize()
print("MCP会话初始化成功")
# 1. List MCP tools on LiteLLM Proxy
print("获取MCP工具列表...")
mcp_tools = await session.list_tools()
print(f"找到 {len(mcp_tools.tools)} 个MCP工具:")
for tool in mcp_tools.tools:
print(f" - {tool.name}: {tool.description}")
if not mcp_tools.tools:
print("没有找到可用的MCP工具")
return
# Create message
messages = [
ChatCompletionUserMessageParam(
content="列出所有可用的数据库", role="user"
)
]
# 2. Convert MCP tools to OpenAI tools
print("转换MCP工具为OpenAI格式...")
openai_tools = [
transform_mcp_tool_to_openai_tool(tool) for tool in mcp_tools.tools
]
print(f"转换完成,共 {len(openai_tools)} 个工具")
# 3. Call LLM with tools
print("调用LLM...")
response = await client.chat.completions.create(
model="gemini/gemini-2.5-flash",
messages=messages,
tools=openai_tools,
tool_choice="auto",
)
print("LLM响应完成")
# 4. Handle tool call
if response.choices[0].message.tool_calls:
print("LLM请求调用工具...")
tool_call = response.choices[0].message.tool_calls[0]
print(f"工具调用: {tool_call.function.name}")
print(f"参数: {tool_call.function.arguments}")
# 5. Convert to MCP format and execute
mcp_call = transform_openai_tool_call_request_to_mcp_tool_call_request(
openai_tool=tool_call.model_dump()
)
print(f"执行MCP工具调用: {mcp_call.name}")
result = await session.call_tool(
name=mcp_call.name, arguments=mcp_call.arguments
)
print("工具调用结果:")
print(result)
else:
print("LLM没有请求调用工具")
print(f"LLM回复: {response.choices[0].message.content}")
except asyncio.TimeoutError:
print("连接超时可能是本地服务器没有启动或MCP功能未配置")
return
except Exception as e:
print(f"发生错误: {type(e).__name__}: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
print("启动本地MCP调试测试...")
asyncio.run(main())
print("测试完成")