Skip to content

Commit c9c105b

Browse files
committed
Merge branch 'main' into pr/wreed4/3299
2 parents 5a3e023 + 1f3b100 commit c9c105b

File tree

5 files changed

+49
-21
lines changed

5 files changed

+49
-21
lines changed

.github/workflows/after-ci.yml

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ jobs:
4545
name: deploy-docs-preview
4646

4747
steps:
48+
- run: echo "$GITHUB_EVENT_JSON"
49+
env:
50+
GITHUB_EVENT_JSON: ${{ toJSON(github.event) }}
51+
4852
- uses: actions/checkout@v4
4953

5054
- uses: actions/setup-node@v4
@@ -57,7 +61,8 @@ jobs:
5761
enable-cache: true
5862
cache-suffix: deploy-docs-preview
5963

60-
- uses: dawidd6/action-download-artifact@v6
64+
- id: download-artifact
65+
uses: dawidd6/action-download-artifact@v6
6166
with:
6267
workflow: ci.yml
6368
name: site
@@ -69,6 +74,7 @@ jobs:
6974

7075
- uses: cloudflare/wrangler-action@v3
7176
id: deploy
77+
if: steps.download-artifact.outputs.found_artifact == 'true'
7278
with:
7379
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
7480
environment: previews
@@ -78,12 +84,9 @@ jobs:
7884
--var GIT_COMMIT_SHA:${{ github.event.workflow_run.head_sha }}
7985
--var GIT_BRANCH:${{ github.event.workflow_run.head_branch }}
8086
81-
- run: echo "$GITHUB_EVENT_JSON"
82-
env:
83-
GITHUB_EVENT_JSON: ${{ toJSON(github.event) }}
84-
8587
- name: Set preview URL
8688
run: uv run --no-project --with httpx .github/set_docs_pr_preview_url.py
89+
if: steps.deploy.outcome == 'success'
8790
env:
8891
DEPLOY_OUTPUT: ${{ steps.deploy.outputs.command-output }}
8992
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

docs/changelog.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# Upgrade Guide
22

3-
In September 2025, Pydantic AI reached V1, which means we're committed to API stability: we will not introduce changes that break your code until V2 (if we do, you can shout at us as it's definitely a mistake).
4-
Once we release V2, in April 2026 at the earliest, we'll continue to provide security fixes for V1 for another 6 months minimum, so you have time to upgrade your applications.
3+
In September 2025, Pydantic AI reached V1, which means we're committed to API stability: we will not introduce changes that break your code until V2. For more information, review our [Version Policy](version-policy.md).
54

65
## Breaking Changes
76

docs/version-policy.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
## Version Policy
2+
3+
We will not intentionally make breaking changes in minor releases of V1. V2 will be released in April 2026 at the earliest, 6 months after the release of V1 in September 2025.
4+
5+
Once we release V2, we'll continue to provide security fixes for V1 for another 6 months minimum, so you have time to upgrade your applications.
6+
7+
Functionality marked as deprecated will not be removed until V2.
8+
9+
Of course, some apparently safe changes and bug fixes will inevitably break some users' code — obligatory link to [xkcd](https://xkcd.com/1172/).
10+
11+
The following changes will **NOT** be considered breaking changes, and may occur in minor releases:
12+
13+
* Bug fixes that may result in existing code breaking, provided that such code was relying on undocumented features/constructs/assumptions.
14+
* Adding new [message parts][pydantic_ai.messages], [stream events][pydantic_ai.messages.AgentStreamEvent], or optional fields on existing message (part) and event types. Always code defensively when consuming message parts or event streams, and use the [`ModelMessagesTypeAdapter`][pydantic_ai.messages.ModelMessagesTypeAdapter] to (de)serialize message histories.
15+
* Changing OpenTelemetry span attributes. Because different [observability platforms](logfire.md#using-opentelemetry) support different versions of the [OpenTelemetry Semantic Conventions for Generative AI systems](https://opentelemetry.io/docs/specs/semconv/gen-ai/), Pydantic AI lets you configure the [instrumentation version](logfire.md#configuring-data-format), but the default version may change in a minor release. Span attributes for [Pydantic Evals](evals.md) may also change as we iterate on Evals support in [Pydantic Logfire](https://logfire.pydantic.dev/docs/guides/web-ui/evals/).
16+
* Changing how `__repr__` behaves, even of public classes.
17+
18+
In all cases we will aim to minimize churn and do so only when justified by the increase of quality of Pydantic AI for users.
19+
20+
## Beta Features
21+
22+
At Pydantic, we like to move quickly and innovate! To that end, minor releases may introduce beta features (indicated by a `beta` module) that are active works in progress. While in its beta phase, a feature's API and behaviors may not be stable, and it's very possible that changes made to the feature will not be backward-compatible. We aim to move beta features out of beta within a few months after initial release, once users have had a chance to provide feedback and test the feature in production.
23+
24+
## Support for Python versions
25+
26+
Pydantic will drop support for a Python version when the following conditions are met:
27+
28+
* The Python version has reached its [expected end of life](https://devguide.python.org/versions/).
29+
* less than 5% of downloads of the most recent minor release are using that version.

mkdocs.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ nav:
1414
- install.md
1515
- help.md
1616
- troubleshooting.md
17-
- changelog.md
1817

1918
- Documentation:
2019
- Core Concepts:
@@ -191,6 +190,8 @@ nav:
191190

192191
- Project:
193192
- contributing.md
193+
- changelog.md
194+
- version-policy.md
194195

195196
extra:
196197
# hide the "Made with Material for MkDocs" message
@@ -333,7 +334,6 @@ plugins:
333334
- install.md
334335
- help.md
335336
- troubleshooting.md
336-
- changelog.md
337337
Concepts documentation:
338338
- a2a.md
339339
- ag-ui.md
@@ -365,11 +365,15 @@ plugins:
365365
- durable_execution/*.md
366366
MCP:
367367
- mcp/*.md
368+
UI Event Streams:
369+
- ui/*.md
368370
Optional:
369371
- testing.md
370372
- cli.md
371373
- logfire.md
372374
- contributing.md
375+
- changelog.md
376+
- version-policy.md
373377
Examples:
374378
- examples/*.md
375379

pydantic_ai_slim/pydantic_ai/models/google.py

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -471,11 +471,9 @@ def _process_response(self, response: GenerateContentResponse) -> ModelResponse:
471471
raise UnexpectedModelBehavior(
472472
f'Content filter {raw_finish_reason.value!r} triggered', response.model_dump_json()
473473
)
474-
else:
475-
raise UnexpectedModelBehavior(
476-
'Content field missing from Gemini response', response.model_dump_json()
477-
) # pragma: no cover
478-
parts = candidate.content.parts or []
474+
parts = [] # pragma: no cover
475+
else:
476+
parts = candidate.content.parts or []
479477

480478
usage = _metadata_as_usage(response)
481479
return _process_response_from_parts(
@@ -649,17 +647,12 @@ async def _get_event_iterator(self) -> AsyncIterator[ModelResponseStreamEvent]:
649647
# )
650648

651649
if candidate.content is None or candidate.content.parts is None:
652-
if self.finish_reason == 'stop': # pragma: no cover
653-
# Normal completion - skip this chunk
654-
continue
655-
elif self.finish_reason == 'content_filter' and raw_finish_reason: # pragma: no cover
650+
if self.finish_reason == 'content_filter' and raw_finish_reason: # pragma: no cover
656651
raise UnexpectedModelBehavior(
657652
f'Content filter {raw_finish_reason.value!r} triggered', chunk.model_dump_json()
658653
)
659654
else: # pragma: no cover
660-
raise UnexpectedModelBehavior(
661-
'Content field missing from streaming Gemini response', chunk.model_dump_json()
662-
)
655+
continue
663656

664657
parts = candidate.content.parts
665658
if not parts:

0 commit comments

Comments
 (0)