chore: upgrade Pipecat to 1.13.0 and adapt MCP 2.x
This commit is contained in:
@@ -10,13 +10,13 @@ from __future__ import annotations
|
||||
import hashlib
|
||||
import json
|
||||
from contextlib import asynccontextmanager
|
||||
from datetime import timedelta
|
||||
from typing import Any, AsyncIterator
|
||||
|
||||
import httpx
|
||||
import httpx2 as httpx
|
||||
from mcp import ClientSession
|
||||
from mcp.client.sse import sse_client
|
||||
from mcp.client.streamable_http import streamable_http_client
|
||||
from mcp.types import PaginatedRequestParams
|
||||
|
||||
from models import RuntimeMcpServer
|
||||
|
||||
@@ -59,7 +59,7 @@ class McpToolClient:
|
||||
server.url,
|
||||
http_client=http_client,
|
||||
) as streams:
|
||||
read_stream, write_stream, _ = streams
|
||||
read_stream, write_stream = streams
|
||||
yield read_stream, write_stream
|
||||
return
|
||||
|
||||
@@ -88,7 +88,7 @@ class McpToolClient:
|
||||
async with ClientSession(
|
||||
read_stream,
|
||||
write_stream,
|
||||
read_timeout_seconds=timedelta(seconds=timeout),
|
||||
read_timeout_seconds=timeout,
|
||||
) as session:
|
||||
await session.initialize()
|
||||
yield session
|
||||
@@ -105,9 +105,11 @@ class McpToolClient:
|
||||
async with self._session(server) as session:
|
||||
cursor: str | None = None
|
||||
while True:
|
||||
result = await session.list_tools(cursor=cursor)
|
||||
result = await session.list_tools(
|
||||
params=PaginatedRequestParams(cursor=cursor) if cursor else None,
|
||||
)
|
||||
for tool in result.tools:
|
||||
input_schema = dict(tool.inputSchema or {})
|
||||
input_schema = dict(tool.input_schema or {})
|
||||
discovered.append(
|
||||
{
|
||||
"name": tool.name,
|
||||
@@ -116,7 +118,7 @@ class McpToolClient:
|
||||
"schema_hash": schema_hash(input_schema),
|
||||
}
|
||||
)
|
||||
cursor = result.nextCursor
|
||||
cursor = result.next_cursor
|
||||
if not cursor:
|
||||
break
|
||||
return discovered
|
||||
@@ -132,14 +134,14 @@ class McpToolClient:
|
||||
result = await session.call_tool(
|
||||
remote_tool_name,
|
||||
arguments=arguments,
|
||||
read_timeout_seconds=timedelta(seconds=server.timeout_seconds),
|
||||
read_timeout_seconds=server.timeout_seconds,
|
||||
)
|
||||
|
||||
data = self._normalize_result(result)
|
||||
encoded = json.dumps(data, ensure_ascii=False, default=str).encode("utf-8")
|
||||
if len(encoded) > MAX_MCP_RESULT_BYTES:
|
||||
raise McpClientError("MCP 工具响应超过 1 MB 限制")
|
||||
if bool(result.isError):
|
||||
if bool(result.is_error):
|
||||
message = data.get("text") or "MCP 工具返回执行错误"
|
||||
raise McpClientError(str(message)[:2048])
|
||||
return data
|
||||
@@ -171,6 +173,6 @@ class McpToolClient:
|
||||
|
||||
return {
|
||||
"text": "\n".join(text_parts),
|
||||
"structuredContent": result.structuredContent,
|
||||
"structuredContent": result.structured_content,
|
||||
"content": content,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user