Python: Bump package versions for 1.18.0 release - #8222
Conversation
Bump agent-framework-core for two patch-level fixes and bump the root agent-framework package to keep its exact core pin aligned. No beta cohort bump was applied, and no non-core dependency floors required updates. Copilot-Session: 97b63d4b-c53a-4754-9ebc-020d9018cbce
Rebuild the release from the full python-1.17.0..upstream/main range after the original tag selector matched prerelease tags and left the compare base empty. Record all 75 Python PR commits, bump only packages with shipping changes, use minor or patch semver according to their public changes, stamp changed prerelease packages 260910 without a beta cohort bump, and raise core floors only for AG-UI and the vector connectors that require new 1.18.0 APIs. Copilot-Session: 97b63d4b-c53a-4754-9ebc-020d9018cbce
There was a problem hiding this comment.
🟡 Changes recommended
Breaking changelog scopes conflict with the SemVer bumps selected for several released packages.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Prepares the Python 1.18.0 release across independently versioned distributions.
Changes:
- Adds the 1.18.0 changelog and comparison links.
- Bumps 25 distributions and five Core dependency floors.
- Synchronizes root and Lab lockfiles.
File summaries
| File | Description |
|---|---|
python/CHANGELOG.md |
Adds 1.18.0 release notes. |
python/pyproject.toml |
Bumps root and Core pin. |
python/uv.lock |
Synchronizes workspace versions. |
python/packages/a2a/pyproject.toml |
Bumps beta version. |
python/packages/ag-ui/pyproject.toml |
Bumps minor version and Core floor. |
python/packages/anthropic/pyproject.toml |
Bumps beta version. |
python/packages/azure-ai-search/pyproject.toml |
Bumps beta version and Core floor. |
python/packages/azure-cosmos/pyproject.toml |
Bumps beta version. |
python/packages/bedrock/pyproject.toml |
Bumps beta version. |
python/packages/chatkit/pyproject.toml |
Bumps beta version. |
python/packages/claude/pyproject.toml |
Bumps beta version. |
python/packages/copilotstudio/pyproject.toml |
Bumps beta version. |
python/packages/core/pyproject.toml |
Bumps Core to 1.18.0. |
python/packages/declarative/pyproject.toml |
Applies patch bump. |
python/packages/devui/pyproject.toml |
Bumps beta version. |
python/packages/foundry/pyproject.toml |
Applies minor bump. |
python/packages/foundry_hosting/pyproject.toml |
Bumps beta version. |
python/packages/gemini/pyproject.toml |
Bumps beta version. |
python/packages/github_copilot/pyproject.toml |
Applies breaking major bump. |
python/packages/hyperlight/pyproject.toml |
Bumps beta version. |
python/packages/lab/pyproject.toml |
Bumps beta version. |
python/packages/lab/uv.lock |
Synchronizes Lab version. |
python/packages/mem0/pyproject.toml |
Bumps beta version. |
python/packages/openai/pyproject.toml |
Applies patch bump. |
python/packages/postgres/pyproject.toml |
Bumps alpha version and Core floor. |
python/packages/purview/pyproject.toml |
Bumps beta version. |
python/packages/qdrant/pyproject.toml |
Bumps alpha version and Core floor. |
python/packages/redis/pyproject.toml |
Bumps beta version and Core floor. |
Review details
- Files reviewed: 26/28 changed files
- Comments generated: 1
- Review effort level: Balanced
💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.
There was a problem hiding this comment.
MAF Automated Review — Iteration 1
Result: No findings
Scope: full PR (2 commit(s)): 53d7f403b99c, 953ff357924e
Model: gpt-5.6-sol-fast
Overview
This release preparation coherently updates the selected package versions, root/Core coupling, dependency floors for packages that consume new Core APIs, and both lockfiles. The root lock validates, package coverage matches the new changelog section, and no runtime or shared-resource behavior changes in this PR. The remaining candidates were either compatible with the documented strict floor policy or pre-existing outside the authoritative review range, so no publishable defect was established.
Reviewed the supplied pull-request change set across correctness, security/reliability, architecture, and failure behavior.
No publishable findings remained after source verification for this scope.
…ride signature and rich content Addresses all four open review threads on microsoft#8078. **Back-compat (`_chat_client.py:1`).** `seen_function_call_output_ids` is off `_parse_chunk_from_openai` entirely and travels in the parse `options` mapping under a private key, so the signature is byte-identical to the one released `agent-framework-foundry` wheels override. All four Foundry changes this PR made to accommodate the parameter are reverted. Re-derived the analysis as asked, because the dependency state moved: Foundry's floor rose from `agent-framework-openai>=1.10.0,<2` to `>=1.14.2,<2` in microsoft#8222. That does not close the break -- `agent-framework-foundry` 1.13.0 still overrides the method with the old signature, and `>=1.14.2,<2` still admits a later 1.14.x carrying this change -- so the signature still cannot grow. Two tests pin it: one structural on the parameter list, one behavioural through a subclass that forwards only the four arguments it knows about. **Rich content (`_chat_client.py:2715`).** List-shaped `output` now maps to canonical `Content` items instead of being flattened: text parts to text, image and file URLs to `from_uri` with the media type inferred, `file_id` to `from_hosted_file`, inline base64 to `from_data`. A hosted reference is kept addressable rather than stringified, since only the issuing provider can resolve it and text would destroy that. Parts are read field-by-field because transports and test doubles deliver mappings as well as SDK models, which the previous behaviour handled. **Duplicate serialization (`_chat_client.py:365`).** `_plain_function_call_output` is deleted rather than relocated. The degrade path reuses the existing `_serialize_provider_payload` and `_stringify_mcp_output`, and the mapper now lives beside them in the class instead of being a fourth mechanism. **`Any` (`_chat_client.py:369`).** Concrete SDK types throughout, including a named `ResponseFunctionCallOutputPart` union. Typing them is what surfaced the `Package Checks` CI failure: `call_id` became `Optional[str]` in the SDK bump, so the validated id is threaded from `_pairable_function_call_output_call_id` rather than re-derived where it cannot be narrowed. One behaviour change to weigh: for an output with no text parts, the flat `result` is now empty because `from_function_result` derives it from text items. A consumer reading only `result` and not `items` previously saw JSON there. Each part mapping is wrapped so a content factory rejecting provider data degrades that part to JSON instead of raising out of a streaming parse and failing the request; the old flattening path could not realistically raise.
…sults reach transports (microsoft#8078) * Python: parse Responses function_call_output so hosted tool results reach transports A hosted tool that executes server-side -- for example a Foundry Toolbox dispatching through its generic `call_tool` wrapper -- returns its result as a standalone `function_call_output` Responses item rather than on the originating call item. None of the three parse dispatch sites handled that item type, so it fell through to the `Unparsed ...` debug log and was discarded. No `Content.from_function_result` was produced, and AG-UI consequently emitted TOOL_CALL_END with no matching TOOL_CALL_RESULT, falling back to treating the call as declaration-only. The model still received the real output, so only the client lost the structured result. Add a `function_call_output` branch to all three sites -- the non-streaming `_parse_response_from_openai` and both streaming `response.output_item.added` / `.done` handlers -- sharing one `_parse_function_call_output_content` helper so the lists cannot drift again. `output` is a string or a list of input-content parts, so it is normalized through the existing `_stringify_mcp_output` rather than JSON-encoding provider models. The streaming handlers emit from whichever event first carries a populated `output` and record the item id in a per-request set, so the other event cannot produce a second result. Keyed on the item id rather than `call_id`, which the function-calling loop contract says must not be assumed unique forever. Reviewed against docs/specs/004-python-function-calling-loop.md, which covers provider serialization of function calls and results: no result is orphaned or duplicated, and the streaming and non-streaming paths agree. Fixes microsoft#8068 * Python: forward the function_call_output seen-id set through Foundry parse overrides `RawFoundryChatClient` and `RawFoundryAgentChatClient` override `_parse_chunk_from_openai` to intercept oauth_consent items and then delegate to `RawOpenAIChatClient`. Both had the pre-change signature, so once the base started passing `seen_function_call_output_ids` every Foundry streaming call raised `TypeError: _parse_chunk_from_openai() got an unexpected keyword argument`. Accept and forward the new parameter in both overrides, and update the two delegation assertions that pin the forwarded argument list. Caught against a live Foundry Responses endpoint; `poe test -P foundry` also reproduces it, but that package is not in the validation command list in docs/specs/004-python-function-calling-loop.md even though it subclasses the OpenAI Responses client. * Python: do not emit an unpairable function_call_output result Review follow-up. `Content.from_function_result` does not validate `call_id`, so a `function_call_output` item carrying a blank one produced an orphaned result: transports drop it (`_emit_tool_result` returns early on a falsy `call_id`) and the outbound serializer would re-send it as an unpairable `function_call_output` input item on the next turn. These items are synthesized by the hosting layer, so a blank `call_id` is a realistic host-side defect rather than a theoretical one, and the function-calling loop contract requires that no result becomes orphaned. Extract the emission gate into `_function_call_output_has_result` so the populated-output and pairable-call_id checks are shared by all three dispatch sites instead of being repeated at each one. * Python: keep function_call_output parsing safe on the declared openai SDK floor Address review on two counts. `name` is not on `ResponseFunctionToolCallOutputItem` in openai 2.25.0, the declared floor -- that version ships only call_id/id/output/status/type. Reading it as an attribute raised `AttributeError` out of the shared parse helper, which all three dispatch sites call, so on any supported SDK below the release that added the field the whole response parse failed rather than merely dropping the result. Read it with `getattr`. The other attributes touched here (type/status/id/call_id/output) are all present on the floor, and the two module helpers already used `getattr`. `output` may also be a list of input-content parts. Passing those provider models straight to `_stringify_mcp_output` fell through to `json.dumps(..., default=str)` and embedded a Python repr in the result text sent back to the model -- e.g. `"ResponseInputImage(detail='auto', ...)"`. Dump each part first so text extraction still works and non-text parts serialize as readable JSON. Both paths are now regression-tested, including a stub item shaped like the 2.25.0 field set. * Python: rework function_call_output parsing to keep the released override signature and rich content Addresses all four open review threads on microsoft#8078. **Back-compat (`_chat_client.py:1`).** `seen_function_call_output_ids` is off `_parse_chunk_from_openai` entirely and travels in the parse `options` mapping under a private key, so the signature is byte-identical to the one released `agent-framework-foundry` wheels override. All four Foundry changes this PR made to accommodate the parameter are reverted. Re-derived the analysis as asked, because the dependency state moved: Foundry's floor rose from `agent-framework-openai>=1.10.0,<2` to `>=1.14.2,<2` in microsoft#8222. That does not close the break -- `agent-framework-foundry` 1.13.0 still overrides the method with the old signature, and `>=1.14.2,<2` still admits a later 1.14.x carrying this change -- so the signature still cannot grow. Two tests pin it: one structural on the parameter list, one behavioural through a subclass that forwards only the four arguments it knows about. **Rich content (`_chat_client.py:2715`).** List-shaped `output` now maps to canonical `Content` items instead of being flattened: text parts to text, image and file URLs to `from_uri` with the media type inferred, `file_id` to `from_hosted_file`, inline base64 to `from_data`. A hosted reference is kept addressable rather than stringified, since only the issuing provider can resolve it and text would destroy that. Parts are read field-by-field because transports and test doubles deliver mappings as well as SDK models, which the previous behaviour handled. **Duplicate serialization (`_chat_client.py:365`).** `_plain_function_call_output` is deleted rather than relocated. The degrade path reuses the existing `_serialize_provider_payload` and `_stringify_mcp_output`, and the mapper now lives beside them in the class instead of being a fourth mechanism. **`Any` (`_chat_client.py:369`).** Concrete SDK types throughout, including a named `ResponseFunctionCallOutputPart` union. Typing them is what surfaced the `Package Checks` CI failure: `call_id` became `Optional[str]` in the SDK bump, so the validated id is threaded from `_pairable_function_call_output_call_id` rather than re-derived where it cannot be narrowed. One behaviour change to weigh: for an output with no text parts, the flat `result` is now empty because `from_function_result` derives it from text items. A consumer reading only `result` and not `items` previously saw JSON there. Each part mapping is wrapped so a content factory rejecting provider data degrades that part to JSON instead of raising out of a streaming parse and failing the request; the old flattening path could not realistically raise. * Python: defer in-progress hosted function results Keep streaming placeholders from consuming the final output's deduplication ID. Cover completed empty results and the parser-to-AG-UI text-only boundary, and clarify that frontend attachment display is outside the parser's scope. --------- Co-authored-by: Eduard van Valkenburg <eavanvalkenburg@users.noreply.github.com> Co-authored-by: eavanvalkenburg <github@vanvalkenburg.eu>
Motivation & Context
Prepare the next Python package release from the changes merged since
python-1.17.0. This publishes new vector-store capabilities, workflow and tool-loop enhancements, FIDES security improvements, provider updates, and accumulated fixes across the independently versioned Python distributions.Description & Review Guide
1.18.0CHANGELOG section covering 75 Python PRs; bumps 25 changed distributions according to their lifecycle stages; updates the root package's exact Core pin; raises the Core dependency floor for AG-UI and the Azure AI Search, PostgreSQL, Qdrant, and Redis vector connectors; and refreshes the root and Lab lockfile package versions.1.18.0; AG-UI moves to1.3.0; Foundry moves to1.13.0; GitHub Copilot moves to2.0.0for its stable breaking default change; Declarative and OpenAI receive patch releases; and changed alpha/beta packages receive the260910Pacific date stamp.Related Issue
N/A - scheduled Python release preparation.
Contribution Checklist
breaking changelabel (or add "[BREAKING]" to the title prefix, before or after any language prefix) - a workflow keeps the label and title prefix in sync automatically.