Edit

Python 2026 Significant Changes Guide

This document lists all significant changes in Python releases since the start of 2026, including breaking changes and important enhancements that may affect your code. Each change is marked as:

  • 🔴 Breaking — Requires code changes to upgrade
  • 🟡 Enhancement — New capability or improvement; existing code continues to work

This document tracks significant Python changes across all 2026 releases, so please refer to it when upgrading between versions to ensure you don't miss any important changes. For detailed upgrade instructions on specific topics (e.g., options migration), refer to the linked upgrade guides or the linked PR's.


python-1.8.0 (June 4, 2026)

Release Notes: python-1.8.0

🔴 github-copilot-sdk upgraded to v1.0.0 with breaking API changes

PR: #6292

PR #6292 upgrades agent-framework-github-copilot from github-copilot-sdk 1.0.0b2 to the stable 1.0.0 release, adapting to all breaking API changes introduced in the GA version.

  • SubprocessConfig removed — use RuntimeConnection.for_stdio(path=...) + keyword arguments on CopilotClient (connection, log_level, base_directory).
  • Import paths moved — copilot.generated.session_events → copilot.session_events.
  • Settings renamed — copilot_home → base_directory; the environment variable is now GITHUB_COPILOT_BASE_DIRECTORY (was GITHUB_COPILOT_COPILOT_HOME).
  • Permission handlers — use concrete decision types instead of PermissionRequestResult(kind=...). The built-in PermissionHandler.approve_all replaces manual approve patterns.
  • Default deny handler — now returns PermissionDecisionUserNotAvailable() (matching SDK fallback behavior).
  • Permission handler type — now supports both sync and async callbacks (Callable[..., PermissionRequestResult | Awaitable[PermissionRequestResult]]).

Before:

from copilot import CopilotClient, SubprocessConfig
from copilot.generated.session_events import PermissionRequest
from copilot.session import PermissionRequestResult

# Client construction
client = CopilotClient(SubprocessConfig(cli_path="/path/to/cli", log_level="debug", copilot_home="/custom/home"))

# Permission handler
def approve_shell(request: PermissionRequest, context: dict[str, str]) -> PermissionRequestResult:
    if request.kind == "shell":
        return PermissionRequestResult(kind="approved")
    return PermissionRequestResult(kind="denied-interactively-by-user")

# Agent
agent = GitHubCopilotAgent(default_options={"copilot_home": "/custom/home", "on_permission_request": approve_shell})

After:

from copilot import CopilotClient, RuntimeConnection
from copilot.generated.rpc import PermissionDecisionDeniedInteractivelyByUser, PermissionDecisionUserNotAvailable
from copilot.session import PermissionHandler, PermissionRequestResult
from copilot.session_events import PermissionRequest

# Client construction
client = CopilotClient(connection=RuntimeConnection.for_stdio(path="/path/to/cli"), log_level="debug", base_directory="/custom/home")

# Permission handler — use concrete decision types or PermissionHandler.approve_all
def approve_shell(request: PermissionRequest, context: dict[str, str]) -> PermissionRequestResult:
    if request.kind == "shell":
        return PermissionHandler.approve_all(request, context)
    return PermissionDecisionUserNotAvailable()

# Agent
agent = GitHubCopilotAgent(default_options={"base_directory": "/custom/home", "on_permission_request": approve_shell})

🟡 Progressive tool exposure via FunctionInvocationContext

PR: #6233

Adds support for progressively exposing tools during a run using FunctionInvocationContext. Tools can now be dynamically added or removed based on prior tool results within the same agent run.

For full documentation including patterns, caveats, and tool-ordering examples, see Controlling tool availability.


🟡 MCP-based skills discovery (McpSkillsSource)

PR: #6169

Adds McpSkillsSource to agent-framework-core, enabling skill discovery and loading via MCP servers.


🟡 Bedrock native structured output support via Converse API

PR: #6052

agent-framework-bedrock now implements native structured output support through the AWS Bedrock Converse API, allowing response_format to work with Bedrock models.


🟡 Foundry Adaptive Evals integration (rubric-generation)

PR: #6101

Adds Foundry Adaptive Evals integration to agent-framework-foundry for automated rubric generation in evaluation workflows.


🟡 Mistral AI embedding client package

PR: #5480

New agent-framework-mistral package providing a Mistral AI embedding client.


🟡 agent-framework-declarative promoted to release candidate

PR: #6256

The agent-framework-declarative package is promoted from beta to release candidate stage.


python-1.7.0 (May 28, 2026)

Release Notes: python-1.7.0

🔴 Declarative: Python-only actions removed and alias kinds renamed to C# canonical names

PR: #6126

PR #6126 removes Python-only declarative actions and renames alias kinds to match the C# canonical names for cross-language consistency.

  • Python-only declarative action types that had no C# equivalent are removed.
  • Action alias kinds are now aligned with C# naming conventions; update existing declarative YAML/JSON files accordingly.

🟡 HarnessAgent and background-agents harness provider

PRs: #6041, #6069

Adds HarnessAgent to agent-framework-core, enabling harness-backed agent patterns for background processing.


🟡 A2AAgentSession with referenced task IDs and input-required support

PR: #5980

Adds A2AAgentSession to agent-framework-a2a and agent-framework-core, supporting referenced task IDs and input-required flow for A2A protocol interactions.


🟡 Experimental prompt-agent conversion and deployment APIs

PR: #5959

Adds experimental APIs to agent-framework-foundry for converting prompt definitions into agents and deploying them programmatically.


python-1.6.0 (May 21, 2026)

Release Notes: python-1.6.0

🔴 Instrumentation enabled by default

PR: #5865

PR #5865 enables OpenTelemetry instrumentation by default in agent-framework-core and agent-framework-foundry.

  • Agent runs now emit telemetry spans automatically without explicit opt-in.
  • If you previously disabled instrumentation or have custom telemetry pipelines, verify that the default behavior does not conflict.
  • To disable, pass enable_instrumentation=False where applicable.

Before:

from agent_framework import Agent
from agent_framework.observability import configure_otel_providers

# Had to explicitly enable instrumentation
configure_otel_providers(enable_console_exporters=True)

agent = Agent(client=client, enable_instrumentation=True)

After:

from agent_framework import Agent

# Instrumentation is now on by default — no opt-in needed
agent = Agent(client=client)

# To explicitly disable:
agent = Agent(client=client, enable_instrumentation=False)

🟡 Shell tool with local and Docker execution support

PR: #5664

Adds a built-in shell tool to agent-framework-core that supports both local execution and Docker-based sandboxed execution.


🟡 New agent-framework-monty CodeAct provider package

PR: #5915

Introduces the agent-framework-monty package for Monty-backed CodeAct integrations (alpha stage).


python-1.4.0 (May 14, 2026)

Release Notes: python-1.4.0

🔴 [Experimental Skills API] Align file skill folder discovery with agentskills.io spec

PR: #5807

PR #5807 updates the experimental skills API to align file-based skill folder discovery with the agentskills.io specification.

  • Skill folder resolution logic has changed; update custom skill directory layouts if using the experimental skills API.

🔴 [Experimental Skills API] Extract skill spec metadata into SkillFrontmatter

PR: #5775

PR #5775 moves skill specification metadata into a dedicated SkillFrontmatter dataclass.

  • If you directly access skill metadata fields, update references to use SkillFrontmatter attributes.

🔴 DevUI: Tighten default access controls and CORS posture

PR: #5740

PR #5740 tightens the default access control and CORS configuration for agent-framework-devui.

  • Default CORS origins are now more restrictive.
  • If your DevUI setup relies on cross-origin access from custom domains, explicitly configure allowed origins.

🔴 A2A: Migrate to a2a-sdk v1.0

PR: #5752

PR #5752 migrates agent-framework-a2a to a2a-sdk v1.0.

  • The A2A protocol types and transport APIs follow the a2a-sdk 1.0 conventions.
  • Update any code that directly interacts with A2A protocol types.

🟡 AG-UI: Tool result display channel and release candidate promotion

PRs: #5762, #5844

Adds tool result display channel to agent-framework-ag-ui and promotes the package to release candidate stage.


python-1.3.0 (May 7, 2026)

Release Notes: python-1.3.0

🔴 [Experimental Skills API] Restructure agent skills to multi-source architecture

PR: #5584

PR #5584 restructures the experimental skills API to support multi-source skill loading.

  • Skill registration and discovery logic changed for the experimental skills feature.
  • If using the experimental skills API, review the new multi-source loading conventions.

🟡 ClassSkill for class-based skill definitions

PR: #5678

Adds ClassSkill to agent-framework-core for class-based skill definitions with declarative metadata and automatic method discovery.


🟡 Information-flow control prompt injection defense

PR: #5331

Adds an information-flow control mechanism to agent-framework-core that helps defend against prompt injection attacks.


🟡 github-copilot-sdk upgraded to v1.0.0b2

PR: #5665

Upgrades agent-framework-github-copilot to github-copilot-sdk>=1.0.0b2, adding instruction_directories, copilot_home configuration, and runtime options forwarding on session resume.


🟡 Enforce approval_mode in Claude and GitHub Copilot agents

PR: #5562

agent-framework-claude and agent-framework-github-copilot now enforce the approval_mode decorator on function tools, consistent with other agent implementations.


🟡 OpenAI and Gemini allowed_tools tool choice support

PR: #5322

Adds support for allowed_tools tool choice in agent-framework-openai, allowing you to constrain which tools the model may call.


python-1.2.2 (April 29, 2026)

Release Notes: python-1.2.2

🔴 Orchestration terminal outputs standardized as AgentResponse

PR: #5301

PR #5301 standardizes orchestration terminal outputs as AgentResponse so Workflow.as_agent() returns the final answer only.

  • Sequential-approval (with_request_info) and concurrent (intermediate_outputs=True) flows now follow the same output contract.
  • If you consume orchestration results directly, expect AgentResponse objects instead of raw text or mixed types.

Before:

# Orchestration returned mixed types (raw strings, dicts, etc.)
result = await workflow.as_agent().run("Draft a report")
text = str(result)  # had to handle various types

After:

# Orchestration now always returns AgentResponse
result = await workflow.as_agent().run("Draft a report")
text = result.text  # consistent AgentResponse API

🟡 Azure AI Content Understanding context provider

PR: #4829

New alpha package agent-framework-azure-contentunderstanding — auto-analyzes file attachments (documents, images, audio, video) and injects structured results into the LLM context.


🟡 Hosted Durable Workflow support via foundry hosting

PR: #5531

Adds hosted Durable Workflow support to agent-framework-foundry-hosting, propagating full conversation history to workflow agents.


python-1.1.0 (April 21, 2026)

Release Notes: python-1.1.0

🔴 CosmosCheckpointStorage restricted pickle deserialization by default

PR: #5200

CosmosCheckpointStorage now uses restricted pickle deserialization by default, matching FileCheckpointStorage behavior.

  • If your checkpoints contain application-defined types, pass them via allowed_checkpoint_types=["my_app.models:MyState"].
  • Without this, deserialization of custom types will raise WorkflowCheckpointException.

Before:

from agent_framework.azure.cosmos import CosmosCheckpointStorage

storage = CosmosCheckpointStorage(endpoint=endpoint, database="mydb", container="checkpoints")

After:

from agent_framework.azure.cosmos import CosmosCheckpointStorage

storage = CosmosCheckpointStorage(
    endpoint=endpoint,
    database="mydb",
    container="checkpoints",
    allowed_checkpoint_types=["my_app.models:MyState"],
)

🟡 GeminiChatClient added

PR: #4847

New agent-framework-gemini package with GeminiChatClient for Google Gemini API and Vertex AI support.


🟡 Hyperlight CodeAct package

PR: #5185

New agent-framework-hyperlight package for Hyperlight-based CodeAct sandboxed code execution.


🟡 Foundry Toolboxes support

PR: #5346

Adds support for Foundry Toolboxes in agent-framework-foundry, enabling managed tool configurations from Azure AI Foundry.


🟡 finish_reason on AgentResponse and AgentResponseUpdate

PR: #5211

Adds finish_reason field to AgentResponse and AgentResponseUpdate, allowing consumers to check why the model stopped generating.


🟡 Hosted agent V2 support in Foundry

PR: #5379

Adds hosted agent V2 support in agent-framework-foundry for the latest Foundry agent service capabilities.


python-1.0.1 (April 9, 2026)

Release Notes: python-1.0.1

🔴 FileCheckpointStorage restricted pickle deserialization (security hardening)

PR: #4941

Checkpoint deserialization now flows through a restricted unpickler by default, which only permits a built-in set of safe Python types and all agent_framework framework types.

  • If your application stores custom types in checkpoints, pass their "module:qualname" identifiers via the new allowed_checkpoint_types constructor parameter — otherwise loads will raise WorkflowCheckpointException.
  • See Security Considerations for details.

Before:

from agent_framework.workflows import FileCheckpointStorage

storage = FileCheckpointStorage(directory="./checkpoints")

After:

from agent_framework import FileCheckpointStorage

storage = FileCheckpointStorage(
    directory="./checkpoints",
    allowed_checkpoint_types=["my_app.models:MyState", "my_app.models:TaskResult"],
)

🔴 Handoff workflow context management fix

PR: #5136