Skip to content

Conversation

@sarth6
Copy link
Contributor

@sarth6 sarth6 commented Nov 14, 2025

Closes #2971

  • Allows users to use the WebFetchTool builtin tool for Anthropic/Google models, which uses the (Claude WebFetch tool / Google URL Context tool) under-the-hood
  • Deprecates Pydantic AI UrlContextTool (which was Google-only) as users should now use WebFetchTool instead
  • Includes the Anthropic BetaWebFetchToolResultBlockParam Content (web fetch url / retrieved_at / source data / etc) in the Pydantic AI BuiltinToolReturnPart that arrives in the agent message history, so that Pydantic AI users have access to the full web fetch tool return object
  • Allows users to supply various tool config params to the Pydantic AI WebFetchTool that get passed to the Claude WebFetch tool under-the-hood; these params are not supported by Google's UrlContextToolDict unfortunately
  • Adds WebFetchTool BuiltinToolReturnPart support for the Google model, which includes the URL Context Metadata: https://ai.google.dev/gemini-api/docs/url-context#contextual-response

@sarth6
Copy link
Contributor Author

sarth6 commented Nov 14, 2025

@DouweM would you prefer if we renamed UrlContextTool to WebFetchTool and left UrlContextTool in a google-only deprecated state?

@sarth6 sarth6 marked this pull request as ready for review November 18, 2025 05:37
@sarth6 sarth6 changed the title Add UrlContextTool support for Anthropic models Add WebFetchTool builtin tool support Nov 18, 2025
@sarth6 sarth6 requested a review from DouweM November 19, 2025 00:39
@sarth6
Copy link
Contributor Author

sarth6 commented Nov 19, 2025

@DouweM I ended up adding the Anthropic WebFetch params to our new builtin tool, but looks like Google's URL Context Tool doesn't support any of them as far as I could see from their docs, as the UrlContextToolDict schema is empty

https://ai.google.dev/gemini-api/docs/url-context#contextual-response

| Provider | Supported | Notes |
|----------|-----------|-------|
| Anthropic || Full feature support. Uses Anthropic's [Web Fetch Tool](https://docs.claude.com/en/docs/agents-and-tools/tool-use/web-fetch-tool) internally to retrieve URL contents. |
| Google || No [`BuiltinToolCallPart`][pydantic_ai.messages.BuiltinToolCallPart] or [`BuiltinToolReturnPart`][pydantic_ai.messages.BuiltinToolReturnPart] is currently generated; please submit an issue if you need this. Using built-in tools and function tools (including [output tools](output.md#tool-output)) at the same time is not supported; to use structured output, use [`PromptedOutput`](output.md#prompted-output) instead. |
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While we're at it, would you be up for fixing "No [BuiltinToolCallPart][pydantic_ai.messages.BuiltinToolCallPart] or [BuiltinToolReturnPart][pydantic_ai.messages.BuiltinToolReturnPart] is currently generated"?

Per https://ai.google.dev/gemini-api/docs/url-context#contextual-response the data is available, and I see the same in the test_google_model_url_context_tool cassette, so you should be able to get it to transform into parts nicely without even needing to regenerate the cassette (although I suppose we'd ideally want a streaming test + cassette as well).

It may be better to do that in a future PR (not necessarily you), unless you feel like doing it now :)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added! Will work on a streaming test and re-request review once that's done



# Remove UrlContextTool from _BUILTIN_TOOL_TYPES and restore WebFetchTool
# This ensures the discriminated union only includes WebFetchTool
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would that cause issues with old payloads that are being deserialized now? Or old code that is now giving a deprecation warning but hasn't actually been updated yet? Would be worth testing in test_builtin_tools.

Copy link
Contributor Author

@sarth6 sarth6 Nov 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I updated the way it works to just deserialize to the deprecated UrlContextTool, that should ensure that this isn't a breaking change, and I added tests to verify that "url_context" kind payloads to deserialize to UrlContextTool, which in turn operates and is treated as a WebFetchTool by Pydantic AI (isinstance(url_context_tool, WebFetchTool) is True)

@sarth6 sarth6 requested a review from DouweM November 22, 2025 01:50
@DouweM DouweM changed the title Add WebFetchTool builtin tool support Add Anthropic built-in WebFetchTool support Nov 25, 2025
@DouweM DouweM enabled auto-merge (squash) November 25, 2025 23:06
@DouweM
Copy link
Collaborator

DouweM commented Nov 25, 2025

@sarth6 Thanks Sarth, great Work!

@DouweM DouweM merged commit 50489c5 into pydantic:main Nov 25, 2025
29 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support Anthropic Web Fetch built-in tool

2 participants