Skip to content

Commit 7b83106

Browse files
committed
Fix
1 parent 749c71d commit 7b83106

File tree

4 files changed

+26
-24
lines changed

4 files changed

+26
-24
lines changed

docs/graph.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ stateDiagram-v2
352352
Feedback --> [*]
353353
```
354354

355-
```python {title="genai_email_feedback.py" py="3.10" test="skip"}
355+
```python {title="genai_email_feedback.py" py="3.10"}
356356
from __future__ import annotations as _annotations
357357

358358
from dataclasses import dataclass, field

docs/models/google.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ To use Vertex AI, you may need to set up [application default credentials](https
5858

5959
If you have the [`gcloud` CLI](https://cloud.google.com/sdk/gcloud) installed and configured, you can use:
6060

61-
```python {test="skip"}
61+
```python
6262
from pydantic_ai import Agent
6363
from pydantic_ai.models.google import GoogleModel
6464
from pydantic_ai.providers.google import GoogleProvider

pydantic_ai_slim/pydantic_ai/mcp.py

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ async def call_tool(
141141
except McpError as e:
142142
raise exceptions.ModelRetry(e.error.message)
143143

144-
content = [self._map_tool_result_part(part) for part in result.content]
144+
content = [await self._map_tool_result_part(part) for part in result.content]
145145

146146
if result.isError:
147147
text = '\n'.join(str(part) for part in content)
@@ -207,7 +207,7 @@ async def _sampling_callback(
207207
model=self.sampling_model.model_name,
208208
)
209209

210-
def _map_tool_result_part(
210+
async def _map_tool_result_part(
211211
self, part: mcp_types.ContentBlock
212212
) -> str | messages.BinaryContent | dict[str, Any] | list[Any]:
213213
# See https://github.com/jlowin/fastmcp/blob/main/docs/servers/tools.mdx#return-values
@@ -230,30 +230,26 @@ def _map_tool_result_part(
230230
) # pragma: no cover
231231
elif isinstance(part, mcp_types.EmbeddedResource):
232232
resource = part.resource
233-
if isinstance(resource, mcp_types.TextResourceContents):
234-
return resource.text
235-
elif isinstance(resource, mcp_types.BlobResourceContents):
236-
return messages.BinaryContent(
237-
data=base64.b64decode(resource.blob),
238-
media_type=resource.mimeType or 'application/octet-stream',
239-
)
240-
else:
241-
assert_never(resource)
233+
return self._get_content(resource)
242234
elif isinstance(part, mcp_types.ResourceLink):
243-
resource_result: mcp_types.ReadResourceResult = anyio.run(lambda: self._client.read_resource(part.uri))
244-
content = resource_result.contents[0]
245-
if isinstance(content, mcp_types.TextResourceContents):
246-
return content.text
247-
elif isinstance(content, mcp_types.BlobResourceContents):
248-
return messages.BinaryContent(
249-
data=base64.b64decode(content.blob), media_type=content.mimeType or 'application/octet-stream'
250-
)
251-
else:
252-
assert_never(content)
235+
resource_result: mcp_types.ReadResourceResult = await self._client.read_resource(part.uri)
236+
return [self._get_content(resource) for resource in resource_result.contents]
253237

254238
else:
255239
assert_never(part)
256240

241+
def _get_content(
242+
self, resource: mcp_types.TextResourceContents | mcp_types.BlobResourceContents
243+
) -> str | messages.BinaryContent:
244+
if isinstance(resource, mcp_types.TextResourceContents):
245+
return resource.text
246+
elif isinstance(resource, mcp_types.BlobResourceContents):
247+
return messages.BinaryContent(
248+
data=base64.b64decode(resource.blob), media_type=resource.mimeType or 'application/octet-stream'
249+
)
250+
else:
251+
assert_never(resource)
252+
257253

258254
@dataclass
259255
class MCPServerStdio(MCPServer):

tests/mcp_server.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,13 @@
55
from mcp.server.fastmcp import Context, FastMCP, Image
66
from mcp.server.session import ServerSessionT
77
from mcp.shared.context import LifespanContextT, RequestT
8-
from mcp.types import BlobResourceContents, EmbeddedResource, SamplingMessage, TextContent, TextResourceContents
8+
from mcp.types import (
9+
BlobResourceContents,
10+
EmbeddedResource,
11+
SamplingMessage,
12+
TextContent,
13+
TextResourceContents,
14+
)
915
from pydantic import AnyUrl
1016

1117
mcp = FastMCP('PydanticAI MCP Server')

0 commit comments

Comments
 (0)