v2.4.0

pydantic/pydantic-aiv2.4.0Jul 3, 2026by dsfaccini

AI Summary

This release introduces significant enhancements to evaluation infrastructure, including `GEval` and span-based evaluators, while improving security by splitting file handling options and fixing various bugs across different providers.

Key Highlights

  • Added `GEval` evaluator and standard quality metric rubrics for `LLMJudge`.
  • Added agentic span-based evaluators (ToolCorrectness, TrajectoryMatch, etc.).
  • Split `preserve_file_data` into `allow_uploaded_files` (inbound security) and an AG-UI representation opt-in.
  • Fixed `XSearchTool` handle limit and other provider-specific bugs.
  • Cleaned up pending tasks and streams on `KeyboardInterrupt`.

New Features

  • `GEval` evaluator
  • Span-based evaluators (ToolCorrectness, TrajectoryMatch, etc.)
  • `allow_uploaded_files` security feature

Full Release Notes

<!-- Release notes generated using configuration in .github/release.yml at main -->

## What's Changed
### 🚀 Features
* Split `preserve_file_data` into `allow_uploaded_files` (inbound security) and an AG-UI representation opt-in by @DouweM in https://github.com/pydantic/pydantic-ai/pull/6232
* Add `GEval` evaluator and standard quality metric rubrics for `LLMJudge` by @dmontagu in https://github.com/pydantic/pydantic-ai/pull/5129
* Add agentic span-based evaluators (ToolCorrectness, TrajectoryMatch, ArgumentCorrectness, MaxToolCalls, MaxModelRequests) by @dmontagu in https://github.com/pydantic/pydantic-ai/pull/5130
### 🐛 Bug Fixes
* fix(xai): update `XSearchTool` handle limit by @gyx09212214-prog in https://github.com/pydantic/pydantic-ai/pull/5979
* Handle None metadata in Gradio weather agent example by @hramezani in https://github.com/pydantic/pydantic-ai/pull/6214
* fix(mistral): preserve extended usage fields from API response by @felipebridge in https://github.com/pydantic/pydantic-ai/pull/5693
* Avoid mutable default argument in `process_tool_calls` by @kratos0718 in https://github.com/pydantic/pydantic-ai/pull/6189
* feat: forward `WebSearchTool.user_location` to xAI web search by @manan-tech in https://github.com/pydantic/pydantic-ai/pull/6181
* Clean up the pending task and streams on `KeyboardInterrupt` in synchronous `run_until_complete` wrappers by @DouweM in https://github.com/pydantic/pydantic-ai/pull/6198
* fix(tool-search): drop redundant `description` from `ToolSearchMatch` by @serozhenka in https://github.com/pydantic/pydantic-ai/pull/5654
* fix(temporal): pass through genai_prices and httpx2 for workflow cost() by @syf2211 in https://github.com/pydantic/pydantic-ai/pull/6219
* fix(evals): reject non-positive `max_concurrency` by @VectorPeak in https://github.com/pydantic/pydantic-ai/pull/6228
* Lazy-start `run_stream_events()` background task on first event iteration by @DouweM in https://github.com/pydantic/pydantic-ai/pull/6234
### 📦 Dependencies
* Bump `genai-prices` to >=0.0.69 by @adtyavrdhn in https://github.com/pydantic/pydantic-ai/pull/6212

## New Contributors
* @raullenchai made their first contribution in https://github.com/pydantic/pydantic-ai/pull/5008
* @gyx09212214-prog made their first contribution in https://github.com/pydantic/pydantic-ai/pull/5979
* @felipebridge made their first contribution in https://github.com/pydantic/pydantic-ai/pull/5693
* @kratos0718 made their first contribution in https://github.com/pydantic/pydantic-ai/pull/6189
* @serozhenka made their first contribution in https://github.com/pydantic/pydantic-ai/pull/5654

**Full Changelog**: https://github.com/pydantic/pydantic-ai/compare/v2.3.0...v2.4.0