Udostępnij za pośrednictwem


Przewodnik po znaczących zmianach w języku Python 2026

Ten dokument zawiera listę wszystkich znaczących zmian w wersjach języka Python od początku 2026 r., w tym zmiany wprowadzające niekompatybilność i ważne ulepszenia, które mogą mieć wpływ na Twój kod. Każda zmiana jest oznaczona jako:

  • 🔴 Niezgodność — wymaga wprowadzenia zmian w kodzie w celu uaktualnienia
  • 🟡 Ulepszenia — nowe możliwości lub ulepszenia; istniejący kod nadal działa

Ten dokument śledzi istotne zmiany języka Python między wersjami zapoznawczymi a wersją 1.0.0 w roku 2026, więc zapoznaj się z nim podczas aktualizacji między wersjami, aby upewnić się, że nie przegapisz żadnych ważnych zmian. Aby uzyskać szczegółowe instrukcje uaktualniania dotyczące określonych tematów (np. migracji opcji), zapoznaj się z powiązanymi przewodnikami uaktualniania lub PR-ami.


python-1.0.0

W tej sekcji przedstawiono istotne zmiany języka Python, które zostały wprowadzone po python-1.0.0rc6 i są teraz częścią elementu python-1.0.0.

🔴 Message(..., text=...) konstrukcja jest teraz w pełni usunięta

Żądanieściągnięcia:#5062

PR #5062 kończy wcześniejsze czyszczenie modelu komunikatów w Pythonie, usuwając ostatnie ścieżki kodu po stronie frameworka, które nadal tworzyły Message obiekty z text=....

  • Skompiluj wiadomości tekstowe jako Message(role="user", contents=["Hello"]) zamiast Message(role="user", text="Hello").
  • Dotyczy to dowolnego miejsca, w którym tworzone są komunikaty bezpośrednio, w tym żądania przepływu pracy, niestandardowe odpowiedzi oprogramowania pośredniczącego, pomocnicy orkiestracji i kod migracji.
  • Zwykłe ciągi wewnątrz contents=[...] są nadal automatycznie znormalizowane do zawartości tekstowej, więc contents=["Hello"] pozostaje najprostszą formą tylko do tekstu.

Before:

message = Message(role="assistant", text="Hello")

After:

message = Message(role="assistant", contents=["Hello"])

🟡 Wydane pakiety języka Python nie wymagają już --pre

Pull Request:#5062

Żądanie ściągnięcia #5062 promuje główne pakiety języka Python 1.0.0 i aktualizuje wskazówki dotyczące instalacji, aby wyraźnie odróżnić wydane pakiety od tych, które nadal znajdują się w wersji wstępnej.

  • agent-framework, agent-framework-core, agent-framework-openai i agent-framework-foundry są teraz wydanymi pakietami i nie wymagają już --pre.
  • Łączniki beta, takie jak agent-framework-ag-ui, agent-framework-azurefunctions, agent-framework-copilotstudio, agent-framework-foundry-local, agent-framework-github-copilot, agent-framework-mem0 i agent-framework-ollama nadal wymagają --pre.
  • Jeśli pojedyncze polecenie instalacji zawiera dowolny pakiet beta, zachowaj --pre to polecenie.

🔴 Usługa Foundry jest teraz właścicielem osadzania języka Python i ustawień punktów końcowych modeli

PR:#5056

Żądanie pull request #5056 usuwa samodzielny pakiet agent-framework-azure-ai i przenosi powierzchnię osadzania języka Python na agent-framework-foundry oraz agent_framework.foundry.

  • Użyj FoundryEmbeddingClient, FoundryEmbeddingOptions oraz FoundryEmbeddingSettings z agent_framework.foundry.
  • Zainstaluj agent-framework-foundry program na potrzeby czatu foundry, agentów zarządzanych przez usługę, dostawców pamięci i osadzania.
  • agent_framework.azure nie eksportuje już AzureAIInferenceEmbeddingClient, AzureAIInferenceEmbeddingOptions, AzureAIInferenceEmbeddingSettings lub AzureAISettings.
  • Osadzenia Foundry używają teraz poleceń FOUNDRY_MODELS_ENDPOINT, FOUNDRY_MODELS_API_KEY, FOUNDRY_EMBEDDING_MODEL i opcjonalnie FOUNDRY_IMAGE_EMBEDDING_MODEL.
  • FoundryChatClient i FoundryAgent nadal używają ustawień punktu końcowego projektu, takich jak FOUNDRY_PROJECT_ENDPOINT i FOUNDRY_MODEL.

Before:

import os

from agent_framework.azure import AzureAIInferenceEmbeddingClient

client = AzureAIInferenceEmbeddingClient(
    endpoint=os.environ["AZURE_AI_SERVICES_ENDPOINT"],
    model=os.environ["AZURE_AI_EMBEDDING_NAME"],
    credential=credential,
)

After:

import os

from agent_framework.foundry import FoundryEmbeddingClient

client = FoundryEmbeddingClient(
    endpoint=os.environ["FOUNDRY_MODELS_ENDPOINT"],
    api_key=os.environ["FOUNDRY_MODELS_API_KEY"],
    model=os.environ["FOUNDRY_EMBEDDING_MODEL"],
)

🔴 Przepływy pracy teraz kierują runtime kwargs przez jawne zasobniki

Pull Request:#5010

Aktualizacja PR #5010 języka Python workflow.run(...), aby argumenty środowiska uruchomieniowego kwargs były przekazywane jawnie jako function_invocation_kwargs= i client_kwargs= zamiast ogólnego przesyłania **kwargs.

  • Płaskie mapowanie jest traktowane jako globalne i jest przesyłane do każdego pasującego agenta wykonawczego w przepływie pracy.
  • Jeśli co najmniej jeden klucz najwyższego poziomu pasuje do identyfikatorów wykonawców, całe mapowanie traktuje się jako cel dla każdego wykonawcy, a każdemu wykonawcy przypisywany jest tylko jego własny wpis.
  • Niestandardowe AgentExecutor(id="...") i inne jawne identyfikatory wykonawcy przepływu pracy są kluczami docelowymi.
  • Te same reguły globalne vs. docelowe mają zastosowanie zarówno do function_invocation_kwargs, jak i do client_kwargs.

Before:

await workflow.run(
    "Draft the report",
    db_config={"connection_string": "..."},
    user_preferences={"format": "markdown"},
)

After:

await workflow.run(
    "Draft the report",
    function_invocation_kwargs={
        "researcher": {
            "db_config": {"connection_string": "..."},
        },
        "writer": {
            "user_preferences": {"format": "markdown"},
        },
    },
)

🟡 GitHubCopilotAgent teraz obsługuje dostawców kontekstu dla każdego wywołania

Pull Request:#5013

Pull request #5013 naprawia lukę w zachowaniu Pythona, w której GitHubCopilotAgent zostały zaakceptowane context_providers , ale nie zostały wywołane.

  • Teraz before_run() jest uruchamiany przed wysłaniem monitu Copilot.
  • Instrukcje i wiadomości dodane przez dostawcę są zawarte w podpowiedzi, która dociera do Copilot CLI.
  • after_run() teraz jest uruchamiana po zebraniu ostatecznej odpowiedzi, w tym ścieżki przesyłania strumieniowego.

Jeśli context_providers został już przekazany do GitHubCopilotAgent, migracja nie jest wymagana — hooki zachowują się teraz spójnie z resztą interfejsu agenta Pythona.


🟡 Teraz uporządkowane dane wyjściowe akceptują mapowania schematów JSON oprócz modeli Pydantic

Pull Request:#5022

Żądanie ściągnięcia #5022 rozszerza analizowanie danych wyjściowych w strukturze Pythona, tak że response_format może być modelem Pydantic lub schematem JSON.

  • Modele Pydantic nadal są przetwarzane na instancje modelu o określonych typach na response.value.
  • Mapowania schematów JSON teraz analizują wartości response.value języka Python zgodne z formatem JSON (zazwyczaj dict lub list).
  • Te same reguły analizowania mają zastosowanie podczas zbierania ostatecznej odpowiedzi ze strumienia.

Jest to ulepszenie, a nie zmiana powodująca niezgodność, ale warto wiedzieć, czy już przechowujesz schematy jako słowniki podobne do JSON.


python-1.0.0rc6

Ta sekcja zawiera istotne zmiany w języku Python, które zostały wprowadzone z lub były śledzone dla python-1.0.0rc6.

🔴 Wybór modelu jest ustandaryzowany w model

Pull request:#4999

PR #4999 wykonuje czyszczenie selekcji modelu po stronie Python w konstruktorach, opcjach z typami, domyślnych wartościach agenta, obiektach odpowiedzi i zmiennych środowiskowych.

  • Użyj model wszędzie, gdzie wcześniej użyto model_id.
  • Agent.default_options i options={...} oczekują teraz "model", a nie "model_id".
  • Obiekty odpowiedzi są wyświetlane jako response.model, a nie jako response.model_id.
  • Ustawienia OpenAI używają teraz OPENAI_MODEL, OPENAI_CHAT_MODEL, OPENAI_CHAT_COMPLETION_MODEL i OPENAI_EMBEDDING_MODEL.
  • Ustawienia usługi Azure OpenAI używają teraz funkcji AZURE_OPENAI_MODEL, , AZURE_OPENAI_CHAT_MODELAZURE_OPENAI_CHAT_COMPLETION_MODELi AZURE_OPENAI_EMBEDDING_MODEL.
  • Anthropic używa teraz ANTHROPIC_CHAT_MODEL, a Foundry Local używa FOUNDRY_LOCAL_MODEL.
  • Pakiet Anthropic dodaje również wrapery hostowane przez dostawcę, takie jak AnthropicFoundryClient, AnthropicBedrockClient i AnthropicVertexClient.

Before:

from agent_framework.anthropic import AnthropicClient

client = AnthropicClient(model_id="claude-sonnet-4-5-20250929")
response = await client.get_response(
    "Hello!",
    options={"model_id": "claude-sonnet-4-5-20250929"},
)

After:

from agent_framework.anthropic import AnthropicClient

client = AnthropicClient(model="claude-sonnet-4-5-20250929")
response = await client.get_response(
    "Hello!",
    options={"model": "claude-sonnet-4-5-20250929"},
)

🔴 Dostawcy kontekstu mogą dodawać middleware i zachowywać historię na każde wywołanie modelu

PR:#4992

Żądanie #4992 ściągnięcia aktualizuje potok dostawcy kontekstu języka Python i sposób utrwalania historii zarządzanej przez platformę podczas uruchamiania wielu wywołań.

  • ContextProvider i HistoryProvider są teraz kanonicznymi klasami bazowymi w Pythonie.
  • BaseContextProvider i BaseHistoryProvider pozostają tymczasowo jako przestarzałe aliasy pod kątem zgodności, ale nowy kod powinien zostać zmigrowany do nowych nazw.
  • SessionContext może teraz zbierać pośredniczące oprogramowanie czatu lub funkcji dodane przez dostawcę poprzez extend_middleware() i uwidaczniać spłaszczoną listę poprzez get_middleware().
  • Agent(..., require_per_service_call_history_persistence=True) uruchamia dostawców historii dla każdego wywołania modelu zamiast raz po pełnym run().
  • Ten tryb jest przeznaczony dla historii lokalnej zarządzanej przez platformę i nie może być połączony z istniejącą konwersacją zarządzaną przez usługę, taką jak session.service_session_id lub options={"conversation_id": ...}.

Before:

from agent_framework import BaseHistoryProvider

class CustomHistoryProvider(BaseHistoryProvider):
    ...

After:

from agent_framework import Agent, HistoryProvider

class CustomHistoryProvider(HistoryProvider):
    ...

agent = Agent(
    client=client,
    context_providers=[CustomHistoryProvider()],
    require_per_service_call_history_persistence=True,
)

🔴 Usunięte przestarzałe obszary zgodności Azure/OpenAI

PR:#4990

PR #4990 umożliwia ukończyć migrację wiodącą dostawcy z #4818 poprzez usunięcie pozostałych wycofanych elementów zgodności Python, które pozostały dostępne podczas wcześniejszych wersji próbnych.

  • agent_framework.azure już nie eksportuje AzureOpenAI* ani starszych interfejsów agenta/klienta/dostawcy.
  • Typy zgodności asystentów OpenAI w języku Python nie są już częścią bieżącego agent_framework.openai interfejsu.
  • W przypadku bezpośrednich scenariuszy OpenAI lub Azure OpenAI należy używać OpenAIChatClient, OpenAIChatCompletionClient i OpenAIEmbeddingClient.
  • Służy FoundryChatClient do wnioskowania w projekcie Foundry i FoundryAgent w przypadku agentów monitu lub hostowanych agentów.
  • Bieżąca agent_framework.azure przestrzeń nazw obejmuje teraz pozostałe integracje platformy Azure, takie jak usługa Azure AI Search, historia usługi Cosmos, usługa Azure Functions i trwałe przepływy pracy. Chat foundry, agent, pamięć i klienci do osadzania znajdują się w obszarze agent_framework.foundry.

W przypadku migrowania starszego kodu w języku Python użyj następujących zamian:

  • AzureOpenAIResponsesClientOpenAIChatClient
  • AzureOpenAIChatClientOpenAIChatCompletionClient
  • AzureOpenAIEmbeddingClientOpenAIEmbeddingClient
  • AzureAIAgentClient / AzureAIClient / AzureAIProjectAgentProvider / AzureAIAgentsProvider FoundryChatClient→ lub FoundryAgent, w zależności od tego, czy aplikacja jest właścicielem definicji agenta
  • OpenAIAssistantsClient / OpenAIAssistantProvider OpenAIChatClient→ dla bieżącej pracy z Python OpenAI lub FoundryAgent jeśli potrzebujesz agenta zarządzanego przez usługę w Foundry

🔴 Lider wśród dostawców w projektowaniu klienta i rozdzieleniu pakietów

Prośba o połączenie:#4818

Żądanie scalenia #4818 reorganizuje przestrzeń dostawcy dla Pythona, koncentrując się na pakietach i przestrzeniach nazw specyficznych dla dostawcy.

  • Klienci OpenAI znajdują się teraz w pakiecie agent-framework-openai, ale nadal importują się z przestrzeni nazw agent_framework.openai.
  • Klienci Microsoft Foundry są teraz umieszczeni w pakiecie agent-framework-foundry i przestrzeni nazw agent_framework.foundry.
  • Program Foundry Local jest również uwidaczniony z agent_framework.foundry elementu jako FoundryLocalClient.
  • OpenAIResponsesClient zmieniono nazwę na OpenAIChatClient.
  • OpenAIChatClient zmieniono nazwę na OpenAIChatCompletionClient.
  • Konfiguracja klienta jest ustandaryzowana w systemie model, zastępując starsze parametry, takie jak model_id, deployment_namei model_deployment_name.
  • W przypadku nowego kodu usługi Azure OpenAI użyj klientów agent_framework.openai. AzureOpenAI* Wcześniejsze podkładki zgodności zostały usunięte później w pliku #4990.
  • W przypadku nowego kodu Foundry użyj FoundryChatClient do bezpośredniej inferencji projektów, FoundryAgent dla agentów Prompt i HostedAgents oraz FoundryLocalClient dla lokalnych środowisk uruchomieniowych.
  • AzureAIClient, AzureAIProjectAgentProvider, AzureAIAgentClient, AzureAIAgentsProvider i powierzchnia zgodności Asystentów Pythona została przeniesiona do ścieżek zgodności podczas tej refaktoryzacji, a następnie została usunięta w #4990.
  • Próbki zostały zreorganizowane, aby odpowiadać nowemu układowi dostawcy wiodącego, w tym próbki Foundry w obszarze samples/02-agents/providers/foundry/.

Mapowanie pakietów

Scenario Install Podstawowa przestrzeń nazw
OpenAI i Azure OpenAI pip install agent-framework-openai agent_framework.openai
Punkty końcowe projektu Microsoft Foundry, usługa agenta, pamięć i osadzanie pip install agent-framework-foundry agent_framework.foundry
Lokalna Odlewnia pip install agent-framework-foundry-local --pre agent_framework.foundry

Before:

from agent_framework.openai import OpenAIResponsesClient

client = OpenAIResponsesClient(model_id="gpt-5.4")

After:

from agent_framework.openai import OpenAIChatClient

client = OpenAIChatClient(model="gpt-5.4")

Jeśli wcześniej używałeś bezpośrednio usługi Azure OpenAI, zamapuj stare dedykowane klasy na nowe klasy OpenAI zalecane przez dostawcę.

  • AzureOpenAIResponsesClientOpenAIChatClient
  • AzureOpenAIChatClientOpenAIChatCompletionClient
  • AzureOpenAIEmbeddingClientOpenAIEmbeddingClient
  • AzureOpenAIAssistantsClientOpenAIChatClient dla migracji interfejsu API Odpowiedzi bezpośrednich lub FoundryAgent jeśli potrzebujesz agenta Foundry zarządzanego przez usługę

Zmiana kodu jest głównie przenoszeniem nazwy klasy i deployment_namemodel. W przypadku zgodności z usługą Azure OpenAI użyj jawnych danych wejściowych platformy Azure na nowych klientach openAI. credential= jest teraz preferowaną warstwą uwierzytelniania platformy Azure, a wywoływalny api_key pozostaje ścieżką zgodności:

Przed (AzureOpenAIResponsesClient):

from agent_framework.azure import AzureOpenAIResponsesClient

client = AzureOpenAIResponsesClient(
    endpoint=azure_endpoint,
    deployment_name=deployment_name,
    credential=credential,
)

Po (OpenAIChatClient):

from agent_framework.openai import OpenAIChatClient
from azure.identity import AzureCliCredential

api_version = "your-azure-openai-api-version"

client = OpenAIChatClient(
    azure_endpoint=azure_endpoint,
    model=deployment_name,
    credential=AzureCliCredential(),
    api_version=api_version,
)

Przed (AzureOpenAIChatClient):

from agent_framework.azure import AzureOpenAIChatClient

client = AzureOpenAIChatClient(
    endpoint=azure_endpoint,
    deployment_name=deployment_name,
    credential=credential,
)

Po (OpenAIChatCompletionClient):

from agent_framework.openai import OpenAIChatCompletionClient
from azure.identity import AzureCliCredential

api_version = "your-azure-openai-api-version"

client = OpenAIChatCompletionClient(
    azure_endpoint=azure_endpoint,
    model=deployment_name,
    credential=AzureCliCredential(),
    api_version=api_version,
)

Jeśli chcesz przenieść się z punktów końcowych usługi Azure OpenAI do punktu końcowego projektu Microsoft Foundry, użyj powierzchni zorientowanej na rozwiązanie Foundry:

Przed (punkt końcowy usługi Azure OpenAI):

from agent_framework.azure import AzureOpenAIResponsesClient
from azure.identity import AzureCliCredential

client = AzureOpenAIResponsesClient(
    deployment_name="gpt-4.1",
    credential=AzureCliCredential(),
)

Po projekcie Foundry:

from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential

client = FoundryChatClient(
    project_endpoint="https://your-project.services.ai.azure.com",
    model="gpt-4.1",
    credential=AzureCliCredential(),
)

agent = Agent(client=client)

W przypadku lokalnych środowisk uruchomieniowych Microsoft Foundry użyj przestrzeni nazw Foundry i łącznika lokalnego:

from agent_framework.foundry import FoundryLocalClient

client = FoundryLocalClient(model="phi-4-mini")

Jeśli pominiesz model, ustaw FOUNDRY_LOCAL_MODEL w swoim środowisku.

Zaktualizuj również nazwy środowiska/konfiguracji, jeśli ma to zastosowanie:

  • Użyj OPENAI_CHAT_MODEL dla OpenAIChatClient, OPENAI_CHAT_COMPLETION_MODEL dla OpenAIChatCompletionClient, z OPENAI_MODEL jako wspólnym zapasowym.
  • Usługa Azure OpenAI teraz używa AZURE_OPENAI_CHAT_MODEL dla OpenAIChatClient, AZURE_OPENAI_CHAT_COMPLETION_MODEL dla OpenAIChatCompletionClient, i AZURE_OPENAI_MODEL jako udostępnionego rezerwowego.
  • Użyj azure_endpoint dla adresów URL usługi Azure OpenAI lub base_url, jeśli masz już pełny adres URL .../openai/v1, i ustaw api_version dla powierzchni API usługi Azure OpenAI, którą używasz.
  • Wdrażanie ustawień specyficznych dla rozwiązania Foundry, takich jak FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL, FOUNDRY_AGENT_NAMEi FOUNDRY_AGENT_VERSION dla klientów rozwiązania Cloud Foundry
  • Użyj ANTHROPIC_CHAT_MODEL dla Anthropic i FOUNDRY_LOCAL_MODEL dla Foundry Local

Ta zmiana po raz pierwszy pojawiła się w cyklu python-1.0.0rc6.


🔴 Zależności podstawowe są teraz celowo ograniczone

Pull Request:#4904

PR #4904 następuje po procesie podziału pakietu dostawcy z #4818, poprzez odchudzenie agent-framework-core i usunięcie większej liczby przejściowych zależności dostawcy z pakietu głównego.

  • agent-framework-core jest teraz celowo minimalny.
  • W przypadku importowania agent_framework.openai, zainstaluj agent-framework-openai.
  • Jeśli importujesz agent_framework.foundry, zainstaluj agent-framework-foundry do wnioskowania w projekcie Foundry, agentów zarządzanych przez usługę, dostawców pamięci i osadzania. Użyj agent-framework-foundry-local --pre dla lokalnych środowisk uruchomieniowych.
  • Jeśli używasz narzędzi MCP, Agent.as_mcp_server()lub innych integracji MCP w minimalnej instalacji, zainstaluj mcp --pre ręcznie. Aby umożliwić obsługę MCP dla WebSocket, zainstaluj mcp[ws] --pre.
  • Jeśli chcesz mieć pełne doświadczenie "wszystko w zestawie", zainstaluj pakiet meta agent-framework.

Nie powoduje to ponownego przeprojektowania powierzchni dostawcy; zmienia to, co jest instalowane domyślnie, gdy tylko wprowadzasz podstawowe funkcje.

Przed (instalacja tylko rdzenia często wprowadzała bardziej przechodnią funkcjonalność dostawcy):

pip install agent-framework-core

Po (zainstaluj pakiet dostawcy, którego faktycznie używasz):

pip install agent-framework-core
pip install agent-framework-openai

or:

pip install agent-framework-core
pip install agent-framework-foundry

Jeśli uaktualniasz istniejący projekt, który wcześniej był zależny od importu rdzenia oraz importów z opóźnionym ładowaniem, przeprowadź przegląd swoich importów i określ pakiety dostawcy jawnie w plikach środowiskowych lub zależności. Wykonaj to samo w przypadku zależności MCP, jeśli korzystasz z narzędzi MCP lub hostingu serwera MCP.


🔴 Klienci ogólnego interfejsu OpenAI preferują teraz jawne sygnały routingu

PR:#4925

PR #4925 zmienia sposób, w jaki klienci generujący agent_framework.openai dokonują wyboru między OpenAI a Azure OpenAI.

  • Klienci ogólnego interfejsu OpenAI nie przełączają się już na platformę Azure tylko dlatego, że zmienne środowiskowe AZURE_OPENAI_* są obecne.
  • Jeśli OPENAI_API_KEY jest skonfigurowany, ogólni klienci pozostają na platformie OpenAI, chyba że przekażesz jawny sygnał routingu z Azure, taki jak credential lub azure_endpoint.
  • Jeśli istnieją tylko AZURE_OPENAI_* ustawienia, klienci ogólni mogą nadal wracać do routingu opartego na środowisku Azure.
  • Preferowanym wzorcem usługi Azure OpenAI jest teraz przekazywanie jawnych ustawień platformy Azure oraz credential=AzureCliCredential() na OpenAIChatClient, OpenAIChatCompletionClienti klienta osadzania.
  • Przestarzałe AzureOpenAI* otoki zachowują zachowanie zgodności, więc istniejący kod oparty na otoce nie jest zgodny z nowymi regułami pierwszeństwa klienta ogólnego.

Wcześniej (OpenAIChatClient mógł prowadzić do Azure, ponieważ obecne były zmienne środowiskowe Azure):

import os
from agent_framework.openai import OpenAIChatClient

os.environ["OPENAI_API_KEY"] = "sk-openai"
os.environ["AZURE_OPENAI_ENDPOINT"] = "https://your-resource.openai.azure.com"
os.environ["AZURE_OPENAI_CHAT_MODEL"] = "gpt-4o-mini"

client = OpenAIChatClient(model="gpt-4o-mini")

Po (ogólny interfejs OpenAI pozostaje w OpenAI; przekaż jawne parametry Azure, aby wymusić routing przez Azure):

import os
from agent_framework.openai import OpenAIChatClient
from azure.identity import AzureCliCredential

client = OpenAIChatClient(
    model=os.environ["AZURE_OPENAI_CHAT_MODEL"],
    azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
    api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
    credential=AzureCliCredential(),
)

Jeśli środowisko zawiera zarówno wartości OPENAI_* i AZURE_OPENAI_*, skontroluj każdą ogólną budowę klienta agent_framework.openai i jawnie wybierz dostawcę. Przykłady dostawców platformy Azure zostały zaktualizowane, aby z tego powodu bezpośrednio przekazywać dane wejściowe platformy Azure.

Osadzanie platformy Azure jest teraz zgodne z tym samym modelem routingu:

import os
from agent_framework.openai import OpenAIEmbeddingClient
from azure.identity import AzureCliCredential

client = OpenAIEmbeddingClient(
    model=os.environ["AZURE_OPENAI_EMBEDDING_MODEL"],
    azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
    api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
    credential=AzureCliCredential(),
)

W przypadku scenariuszy osadzania mapa:

  • AzureOpenAIEmbeddingClientOpenAIEmbeddingClient
  • AZURE_OPENAI_EMBEDDING_MODELmodel
  • OPENAI_EMBEDDING_MODEL pozostaje zmienną środowiskową osadzenia po stronie OpenAI

python-1.0.0rc5 / python-1.0.0b260319 (19 marca 2026 r.)

🔴 Potok klienta czatu zmienia kolejność: FunkcjaInwokacja teraz opakowuje ChatMiddleware

Pull request #4746

Kolejność potoku ChatClient została zmieniona. FunctionInvocation jest teraz najbardziej zewnętrzną warstwą i otacza ChatMiddleware, co oznacza, że oprogramowanie pośredniczące czatu działa przy każdym wywołaniu modelu (w tym każdej iteracji pętli wywoływania narzędzi), zamiast jednorazowo dla całej sekwencji wywołań funkcji.

Stara kolejność pipeline:

ChatMiddleware → FunctionInvocation → RawChatClient

Nowa kolejność potoku:

FunctionInvocation → ChatMiddleware → ChatTelemetry → RawChatClient

Jeśli masz niestandardowe oprogramowanie pośredniczące czatu, które zakładało, że jest uruchamiane tylko raz na każde wywołanie agenta (obejmujące całą pętlę wywoływania narzędzi), zaktualizuj je, aby było bezpieczne do wielokrotnego wykonywania. Oprogramowanie pośredniczące czatu jest teraz wywoływane dla każdego pojedynczego żądania LLM, w tym żądań, które wysyłają wyniki narzędzia z powrotem do modelu.

Ponadto, ChatTelemetry jest teraz oddzielną warstwą od ChatMiddleware w potoku i działa najbliżej RawChatClient.

🔴 Publiczne środowisko uruchomieniowe kwargs podzielone na jawne zasobniki

PR:#4581

Publiczny agent języka Python i interfejsy API czatu nie traktują już całościowego przekazywania publicznego **kwargs jako głównego mechanizmu przetwarzania danych w czasie rzeczywistym. Wartości środowiska uruchomieniowego są teraz dzielone według celu:

  • Użyj function_invocation_kwargs dla wartości, które powinny być widoczne tylko dla narzędzi lub middleware funkcji.
  • Użyj client_kwargs dla kwargs warstwy klienta i konfiguracji oprogramowania pośredniczącego klienta.
  • Uzyskiwanie dostępu do danych narzędzia/środowiska uruchomieniowego za pomocą FunctionInvocationContext(ctx.kwargs i ctx.session).
  • Zdefiniuj narzędzia za pomocą wprowadzonego parametru kontekstu zamiast parametru **kwargs; wprowadzone parametry kontekstu nie są wyświetlane w schemacie widocznym w modelu.
  • W przypadku delegowania do agenta podrzędnego jako narzędzia należy użyć agent.as_tool(propagate_session=True) , jeśli agent podrzędny musi współużytkować sesję obiektu wywołującego.

Before:

from typing import Any

from agent_framework import tool


@tool
def send_email(address: str, **kwargs: Any) -> str:
    return f"Queued email for {kwargs['user_id']}"


response = await agent.run(
    "Send the update to finance@example.com",
    user_id="user-123",
    request_id="req-789",
)

After:

from agent_framework import FunctionInvocationContext, tool


@tool
def send_email(address: str, ctx: FunctionInvocationContext) -> str:
    user_id = ctx.kwargs["user_id"]
    session_id = ctx.session.session_id if ctx.session else "no-session"
    return f"Queued email for {user_id} in {session_id}"


response = await agent.run(
    "Send the update to finance@example.com",
    session=agent.create_session(),
    function_invocation_kwargs={
        "user_id": "user-123",
        "request_id": "req-789",
    },
)

Jeśli implementujesz niestandardowe publiczne metody run() lub get_response(), dodaj function_invocation_kwargs i client_kwargs do tych sygnatur. W przypadku narzędzi preferuj parametr z adnotacjami — FunctionInvocationContext może mieć nazwę ctx, contextlub dowolną inną nazwę z adnotacjami. Jeśli podasz jawny model schematu/danych wejściowych, rozpoznawany jest również zwykły parametr bez adnotacji o nazwie ctx . Ten sam obiekt kontekstu jest dostępny dla oprogramowania pośredniczącego funkcji i jest to miejsce, w którym funkcja środowiska uruchomieniowego kwargs i stan sesji są teraz aktywne. Definicje narzędzi, które nadal korzystają tylko z **kwargs jako starszej funkcji zgodności, zostaną usunięte.


python-1.0.0rc4 / python-1.0.0b260311 (11 marca 2026 r.)

Informacje o wersji:python-1.0.0rc4

🔴 Integracje sztucznej inteligencji platformy Azure są teraz przeznaczone dla ogólnie dostępnej wersji azure-ai-projects 2.0

PR:#4536

Integracje Azure AI w Pythonie zakładają teraz interfejs ogólnie dostępnej wersji 2.0 azure-ai-projects.

  • Obsługiwany zakres zależności to teraz azure-ai-projects>=2.0.0,<3.0.
  • foundry_features Funkcja "przekazywanie" została usunięta z procesu tworzenia agenta AI platformy Azure.
  • Zachowanie wersji zapoznawczej teraz wykorzystuje allow_preview=True na obsługiwanych klientach/dostawcach.
  • Mieszane warstwy zgodności beta/GA zostały usunięte, dlatego zaktualizuj wszystkie importy i nazwy typów zgodnie z powierzchnią wersji GA 2.0 SDK.

🔴 Programy obsługi narzędzi GitHub Copilot używają teraz języka ToolInvocation / ToolResult Python w wersji 3.11 lub nowszej

Pull Request:#4551

agent-framework-github-copilot teraz śledzi github-copilot-sdk>=0.1.32.

  • Programy obsługi narzędzi otrzymują klasę danych ToolInvocation zamiast nieprzetworzonej klasy dict.
  • Zwracanie ToolResult przy użyciu pól snake_case, takich jak result_type i text_result_for_llm.
  • Pakiet agent-framework-github-copilot wymaga teraz języka Python w wersji 3.11 lub nowszej.

Before:

from typing import Any


def handle_tool(invocation: dict[str, Any]) -> dict[str, Any]:
    args = invocation.get("arguments", {})
    return {
        "resultType": "success",
        "textResultForLlm": f"Handled {args.get('city', 'request')}",
    }

After:

from copilot.types import ToolInvocation, ToolResult


def handle_tool(invocation: ToolInvocation) -> ToolResult:
    args = invocation.arguments
    return ToolResult(
        result_type="success",
        text_result_for_llm=f"Handled {args.get('city', 'request')}",
    )

python-1.0.0rc3 / python-1.0.0b260304 (4 marca 2026 r.)

Informacje o wersji:python-1.0.0rc3

🔴 Dostawca umiejętności sfinalizowany wokół zdefiniowanego kodu Skill / SkillResource

Prośba o ściągnięcie:#4387

Umiejętności agenta języka Python obsługują teraz obiekty zdefiniowane kodowo Skill i SkillResource obok umiejętności opartych na plikach, a interfejs dostawcy publicznego jest ustandaryzowany na SkillsProvider.

  • Jeśli nadal importujesz starszą wersję zapoznawczą/wewnętrzną FileAgentSkillsProvider, przełącz się na SkillsProvider.
  • Wyszukiwanie zasobów oparte na plikach nie opiera się już na odwołaniach cytowanych za pomocą backtick w programie SKILL.md; zasoby są odnajdywane z katalogu umiejętności.

Jeśli masz podgląd/kod wewnętrzny zaimportowany FileAgentSkillsProvider, przełącz się na bieżącą publiczną powierzchnię:

from agent_framework import Skill, SkillResource, SkillsProvider

python-1.0.0rc2 / python-1.0.0b260226 (26 lutego 2026 r.)

Informacje o wersji:python-1.0.0rc2

🔴Deklaratywne przepływy pracy zastępują InvokeTool elementem InvokeFunctionTool

Żądanieściągnięcia:#3716

Deklaratywne przepływy pracy języka Python nie używają już starego InvokeTool rodzaju akcji. Zastąp to za pomocą InvokeFunctionTool i zarejestruj wywoływalne w Pythonie przy użyciu WorkflowFactory.register_tool().

Before:

actions:
  - kind: InvokeTool
    toolName: send_email

After:

factory = WorkflowFactory().register_tool("send_email", send_email)
actions:
  - kind: InvokeFunctionTool
    functionName: send_email

python-1.0.0rc1 / python-1.0.0b260219 (19 lutego 2026 r.)

Wydania:agent-framework-core i agent-framework-azure-ai awansowano do 1.0.0rc1. Wszystkie inne pakiety zostały zaktualizowane do 1.0.0b260219.

🔴 Ujednolicona obsługa poświadczeń platformy Azure we wszystkich pakietach

Prośba o wciągnięcie#4088

Parametry ad_token, ad_token_provider i get_entra_auth_token zostały zastąpione ujednoliconym parametrem credential we wszystkich pakietach języka Python związanych z platformą Azure. Nowe podejście wykorzystuje azure.identity.get_bearer_token_provider do automatycznego buforowania i odświeżania tokenów.

Objęte klasy:AzureOpenAIChatClient, AzureOpenAIResponsesClient, AzureOpenAIAssistantsClientAzureAIClientAzureAIAgentClientAzureAIProjectAgentProviderAzureAIAgentsProviderAzureAISearchContextProviderPurviewClient, PurviewPolicyMiddleware, . PurviewChatPolicyMiddleware

Before:

from azure.identity import AzureCliCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    AzureCliCredential(), "https://cognitiveservices.azure.com/.default"
)

client = AzureOpenAIResponsesClient(
    azure_ad_token_provider=token_provider,
    ...
)

After:

from azure.identity import AzureCliCredential

client = AzureOpenAIResponsesClient(
    credential=AzureCliCredential(),
    ...
)

Parametr credential akceptuje TokenCredential, AsyncTokenCredentiallub wywoływanego dostawcę tokenu. Buforowanie i odświeżanie tokenów są obsługiwane automatycznie.


🔴 Przeprojektowana hierarchia wyjątków języka Python

Prośba o dołączenie:#4082

Rodzina płaska ServiceException została zastąpiona gałęziami wyjątków o określonym zakresie domeny, z jednym wspólnym korzeniem AgentFrameworkException. Zapewnia to dzwoniącym dokładne except cele i jasną semantykę błędów.

Nowa hierarchia:

AgentFrameworkException
├── AgentException
│   ├── AgentInvalidAuthException
│   ├── AgentInvalidRequestException
│   ├── AgentInvalidResponseException
│   └── AgentContentFilterException
├── ChatClientException
│   ├── ChatClientInvalidAuthException
│   ├── ChatClientInvalidRequestException
│   ├── ChatClientInvalidResponseException
│   └── ChatClientContentFilterException
├── IntegrationException
│   ├── IntegrationInitializationError
│   ├── IntegrationInvalidAuthException
│   ├── IntegrationInvalidRequestException
│   ├── IntegrationInvalidResponseException
│   └── IntegrationContentFilterException
├── ContentError
├── WorkflowException
│   ├── WorkflowRunnerException
│   ├── WorkflowValidationError
│   └── WorkflowActionError
├── ToolExecutionException
├── MiddlewareTermination
└── SettingNotFoundError

Usunięto wyjątki:ServiceException, ServiceInitializationError, ServiceResponseException, ServiceContentFilterException, ServiceInvalidAuthError, ServiceInvalidExecutionSettingsError, ServiceInvalidRequestError, ServiceInvalidResponseError, AgentExecutionException, AgentInvocationError, AgentInitializationError, AgentSessionException, ChatClientInitializationError, CheckpointDecodingError.

Before:

from agent_framework.exceptions import ServiceException, ServiceResponseException

try:
    result = await agent.run("Hello")
except ServiceResponseException:
    ...
except ServiceException:
    ...

After:

from agent_framework.exceptions import AgentException, AgentInvalidResponseException, AgentFrameworkException

try:
    result = await agent.run("Hello")
except AgentInvalidResponseException:
    ...
except AgentException:
    ...
except AgentFrameworkException:
    # catch-all for any Agent Framework error
    ...

Uwaga / Notatka

Błędy sprawdzania poprawności inicjowania używają teraz wbudowanych ValueError/TypeError wyjątków zamiast wyjątków niestandardowych. Wyjątki programu Agent Framework są zarezerwowane dla błędów na poziomie domeny.


🔴 Stan dostawcy determinowany przez source_id

PR:#3995

Hooki dostawcy otrzymują teraz słownik stanu ograniczonego do dostawcy (state.setdefault(provider.source_id, {})) zamiast pełnego stanu sesji. Oznacza to, że implementacje dostawcy, które wcześniej uzyskiwały dostęp do stanu zagnieżdżonego za pośrednictwem state[self.source_id]["key"], muszą teraz uzyskiwać dostęp bezpośrednio poprzez state["key"].

Ponadto wartość domyślna InMemoryHistoryProvidersource_id została zmieniona z "memory" na "in_memory".

Before:

# In a custom provider hook:
async def on_before_agent(self, state: dict, **kwargs):
    my_data = state[self.source_id]["my_key"]

# InMemoryHistoryProvider default source_id
provider = InMemoryHistoryProvider("memory")

After:

# Provider hooks receive scoped state — no nested access needed:
async def on_before_agent(self, state: dict, **kwargs):
    my_data = state["my_key"]

# InMemoryHistoryProvider default source_id changed
provider = InMemoryHistoryProvider("in_memory")

🔴 Wyrównanie wpisywanej wiadomości na czacie/agencie (run vs get_response)

Prośba o ściągnięcie:#3920

Implementacje klienta czatu get_response teraz konsekwentnie odbierają Sequence[Message]. agent.run(...) pozostaje elastyczny (str, Content, Message lub ciągami tych) i normalizuje dane wejściowe przed wywołaniem klientów czatu.

Before:

async def get_response(self, messages: str | Message | list[Message], **kwargs): ...

After:

from collections.abc import Sequence
from agent_framework import Message

async def get_response(self, messages: Sequence[Message], **kwargs): ...

🔴 FunctionTool[Any] usunięto ogólną konfigurację w celu przekazywania schematów

PR:#3907

Ścieżki narzędzi oparte na schemacie nie opierają się już na poprzednim FunctionTool[Any] zachowaniu ogólnym. Użyj FunctionTool bezpośrednio i podaj pydantic BaseModel lub jawne schematy w razie potrzeby (na przykład za pomocą polecenia @tool(schema=...)).

Before:

placeholder: FunctionTool[Any] = FunctionTool(...)

After:

placeholder: FunctionTool = FunctionTool(...)

🔴 Ustawienia Pydantic zostały zastąpione przez TypedDict + load_settings()

Prośby o scalenie:#3843, #4032

Lekka klasa oparta na pydantic-settings została zastąpiona systemem ustawień opartym na funkcjach wykorzystującym AFBaseSettings i TypedDict. Zależność pydantic-settings została całkowicie usunięta.

Wszystkie klasy ustawień (np. OpenAISettings, , AzureOpenAISettingsAnthropicSettings) są teraz TypedDict definicjami, a wartości ustawień są dostępne za pośrednictwem składni słownika zamiast dostępu do atrybutów.

Before:

from agent_framework.openai import OpenAISettings

settings = OpenAISettings()  # pydantic-settings auto-loads from env
api_key = settings.api_key
model_id = settings.model_id

After:

from agent_framework.openai import OpenAISettings, load_settings

settings = load_settings(OpenAISettings, env_prefix="OPENAI_")
api_key = settings["api_key"]
model = settings["model"]

Ważne

Framework agentowy nie ładuje automatycznie wartości z .env plików. Musisz jawnie wyrazić zgodę na .env ładowanie za pomocą jednej z następujących opcji:

  • Wywoływanie load_dotenv() z python-dotenv pakietu na początku Twojej aplikacji
  • Przekazywanie elementu env_file_path=".env" do elementu load_settings()
  • Ustawianie zmiennych środowiskowych bezpośrednio w powłoce lub w zintegrowanym środowisku programistycznym (IDE).

Kolejność rozpoznawania load_settings to: jawne przesłonięcia → .env wartości pliku (gdy env_file_path jest podana) → zmienne środowiskowe → wartości domyślne. Jeśli określisz env_file_path, plik musi istnieć lub zostanie zgłoszony wyjątek FileNotFoundError.


🟡 Napraw przekazywanie przepływu pracy modelu rozumowania i serializację historii

Prośba o scalenie:#4083

Naprawia wiele błędów podczas korzystania z modeli rozumowania (np. gpt-5-mini, gpt-5.2) w przepływach pracy z wieloma agentami. Elementy logiki z interfejsu API odpowiedzi są teraz poprawnie serializowane i uwzględniane w historii tylko wtedy, gdy obecny jest również element function_call, dzięki czemu unika się błędów interfejsu API. Zaszyfrowana/ukryta zawartość rozumowania jest teraz prawidłowo generowana, a format pola summary jest poprawiony. Element service_session_id jest również czyszczony podczas przekazania, aby zapobiec przeciekowi stanu między agentami.


🟡 Dodano element Bedrock do core[all], a domyślne ustawienia wyboru narzędzi zostały poprawione.

Prośba o przeniesienie zmian:#3953

Amazon Bedrock jest teraz dołączony do agent-framework-core[all] dodatków i jest dostępny za pośrednictwem leniwej agent_framework.amazon powierzchni importu. Naprawiono również zachowanie wyboru narzędzi: niezwiązane wartości wyboru narzędzi pozostają teraz niezastawione, aby dostawcy używali ustawień domyślnych usługi, podczas gdy jawnie ustawiane wartości są zachowywane.

from agent_framework.amazon import BedrockClient

🟡 AzureAIClient ostrzegł o nieobsługiwanych nadpisaniach parametrów środowiska uruchomieniowego

Pull Request:#3919

W momencie tej zmiany, gdy środowisko wykonawcze tools lub structured_output różniło się od konfiguracji czasu tworzenia agenta, AzureAIClient zarejestrowano ostrzeżenie. Od tego czasu powierzchnia języka Python została usunięta. W przypadku bieżącego kodu w języku Python użyj FoundryChatClient, jeśli potrzebujesz konfiguracji narzędzia/środowiska uruchomieniowego aplikacji, lub OpenAIChatClient w scenariuszach bezpośredniego użycia API odpowiedzi, które wymagają dynamicznych przesłonięć.


🟡 workflow.as_agent() teraz domyślnie używa historii lokalnej, gdy dostawcy nie są ustawieni

Pull Request:#3918

Kiedy workflow.as_agent() jest tworzony bez context_providers, teraz domyślnie dodaje InMemoryHistoryProvider("memory"). Jeśli dostawcy kontekstu są jawnie dostarczani, ta lista jest zachowywana bez zmian.

workflow_agent = workflow.as_agent(name="MyWorkflowAgent")
# Default local history provider is injected when none are provided.

🟡 Kontekst śledzenia OpenTelemetry jest propagowany do żądań MCP

Prośba o ściągnięcie#3780

Po zainstalowaniu biblioteki OpenTelemetry, kontekst śledzenia (np. W3C traceparent) jest automatycznie wstrzykiwany za pośrednictwem metody params._meta do żądań MCP. Umożliwia to od początku do końca śledzenie rozproszone dla wywołań od agenta do serwera MCP. Nie trzeba wprowadzać żadnych zmian w kodzie — jest to zachowanie addytywne, które aktywuje się, gdy istnieje prawidłowy kontekst zakresu.


🟡 Obsługa trwałego przepływu pracy dla usługi Azure Functions

Pull request:#3630

Pakiet agent-framework-azurefunctions obsługuje teraz uruchamianie Workflow grafów w usłudze Azure Durable Functions. Przekaż parametr workflow do AgentFunctionApp, aby automatycznie rejestrować jednostki agenta, funkcje działania i punkty końcowe HTTP.

from agent_framework.azurefunctions import AgentFunctionApp

app = AgentFunctionApp(workflow=my_workflow)
# Automatically registers:
#   POST /api/workflow/run          — start a workflow
#   GET  /api/workflow/status/{id}  — check status
#   POST /api/workflow/respond/{id}/{requestId} — HITL response

Obsługuje wzorce fan-out/fan-in, shared state i human-in-the-loop z konfigurowalnym limitem czasu i automatycznym odrzuceniem po wygaśnięciu.


python-1.0.0b260212 (12 lutego 2026 r.)

Informacje o wersji:python-1.0.0b260212

🔴 Hosted*Toolklasy zastąpione metodami klienta get_*_tool()

Pull Request:#3634

Hostowane klasy narzędzi zostały usunięte na rzecz metod fabryki z zakresem klienta. Dzięki temu dostępność narzędzia jest jawna przez dostawcę.

Usunięto klasę Replacement
HostedCodeInterpreterTool client.get_code_interpreter_tool()
HostedWebSearchTool client.get_web_search_tool()
HostedFileSearchTool client.get_file_search_tool(...)
HostedMCPTool client.get_mcp_tool(...)
HostedImageGenerationTool client.get_image_generation_tool(...)

Before:

from agent_framework import HostedCodeInterpreterTool, HostedWebSearchTool

tools = [HostedCodeInterpreterTool(), HostedWebSearchTool()]

After:

from agent_framework.openai import OpenAIResponsesClient

client = OpenAIResponsesClient()
tools = [client.get_code_interpreter_tool(), client.get_web_search_tool()]

🔴 Potok dostawcy sesji/kontekstu został sfinalizowany (AgentSession, context_providers)

Żądanieściągnięcia:#3850

Sesja języka Python i migracja dostawcy kontekstu została ukończona. AgentThread i usunięto stare typy dostawców kontekstu.

  • AgentThreadAgentSession
  • agent.get_new_thread()agent.create_session()
  • agent.get_new_thread(service_thread_id=...)agent.get_session(service_session_id=...)
  • context_provider= / chat_message_store_factory= wzorce są zastępowane przez context_providers=[...]

Before:

thread = agent.get_new_thread()
response = await agent.run("Hello", thread=thread)

After:

session = agent.create_session()
response = await agent.run("Hello", session=session)

🔴 Przeprojektowany model punktu kontrolnego i zachowanie systemu magazynującego dane

Prośba o pobranie:#3744

Przeprojektowano elementy wewnętrzne punktu kontrolnego, które mają wpływ na utrwalone zgodność punktów kontrolnych i niestandardowe implementacje magazynu:

  • WorkflowCheckpoint teraz przechowuje aktywne obiekty (serializacja odbywa się w przestrzeni pamięci punktów kontrolnych)
  • FileCheckpointStorage Teraz używa serializacji za pomocą pickle
  • workflow_id został usunięty i previous_checkpoint_id został dodany
  • Przestarzałe haki punktów kontrolnych zostały usunięte

Jeśli utrwalasz punkty kontrolne między wersjami, przed wznowieniem przepływów pracy należy ponownie wygenerować lub zmigrować istniejące artefakty punktu kontrolnego.


Punkty końcowe projektu Foundry pierwotnie udostępniane przez AzureOpenAIResponsesClient

PR:#3814

Ta funkcja w wersji zapoznawczej pierwotnie zezwalała AzureOpenAIResponsesClient na łączenie się z punktami końcowymi projektu Foundry. Bieżące wskazówki dotyczące języka Python używają FoundryChatClient dla wnioskowania w projektach Foundry lub FoundryAgent dla agentów Foundry zarządzanych przez usługę zamiast usuniętego AzureOpenAIResponsesClient.

from azure.identity import DefaultAzureCredential
from agent_framework.foundry import FoundryChatClient

client = FoundryChatClient(
    project_endpoint="https://<your-project>.services.ai.azure.com",
    model="gpt-4o-mini",
    credential=DefaultAzureCredential(),
)

🔴 Oprogramowanie pośredniczące call_next nie akceptuje już context

PR:#3829

Kontynuacja oprogramowania pośredniczącego nie przyjmuje teraz żadnych argumentów. Jeśli oprogramowanie pośredniczące nadal wywołuje metodę call_next(context), zaktualizuj ją do call_next().

Before:

async def telemetry_middleware(context, call_next):
    # ...
    return await call_next(context)

After:

async def telemetry_middleware(context, call_next):
    # ...
    return await call_next()

python-1.0.0b260210 (10 lutego 2026 r.)

Informacje o wersji:python-1.0.0b260210

🔴 Metody fabryki przepływu pracy usunięte z WorkflowBuilder

Pull request:#3781

register_executor() i register_agent() zostały usunięte z WorkflowBuilder. Wszystkie metody konstruktora (add_edge, add_fan_out_edges, add_fan_in_edges, add_chain, add_switch_case_edge_group, add_multi_selection_edge_group) oraz start_executor nie akceptują już nazw łańcuchów znaków — wymagają bezpośrednio instancji wykonawcy lub agenta.

W przypadku izolacji stanu zamknięcie instancji wykonawcy/agenta oraz budowanie przepływu pracy wewnątrz metody pomocniczej, tak aby każde wywołanie tworzyło nowe instancje.

WorkflowBuilder z funkcjami wykonawczymi

Before:

workflow = (
    WorkflowBuilder(start_executor="UpperCase")
    .register_executor(lambda: UpperCaseExecutor(id="upper"), name="UpperCase")
    .register_executor(lambda: ReverseExecutor(id="reverse"), name="Reverse")
    .add_edge("UpperCase", "Reverse")
    .build()
)

After:

upper = UpperCaseExecutor(id="upper")
reverse = ReverseExecutor(id="reverse")

workflow = WorkflowBuilder(start_executor=upper).add_edge(upper, reverse).build()

WorkflowBuilder z agentami

Before:

builder = WorkflowBuilder(start_executor="writer_agent")
builder.register_agent(factory_func=create_writer_agent, name="writer_agent")
builder.register_agent(factory_func=create_reviewer_agent, name="reviewer_agent")
builder.add_edge("writer_agent", "reviewer_agent")

workflow = builder.build()

After:

writer_agent = create_writer_agent()
reviewer_agent = create_reviewer_agent()

workflow = WorkflowBuilder(start_executor=writer_agent).add_edge(writer_agent, reviewer_agent).build()

Izolacja stanu przy użyciu metod pomocniczych

W przypadku przepływów pracy, które wymagają izolowanego stanu dla każdego wywołania, umieść konstrukcję w metodzie pomocniczej.

def create_workflow() -> Workflow:
    """Each call produces fresh executor instances with independent state."""
    upper = UpperCaseExecutor(id="upper")
    reverse = ReverseExecutor(id="reverse")

    return WorkflowBuilder(start_executor=upper).add_edge(upper, reverse).build()

workflow_a = create_workflow()
workflow_b = create_workflow()

🔴 ChatAgent zmieniono nazwę na Agent, ChatMessage zmieniono nazwę na Message

PR:#3747

Podstawowe typy języka Python zostały uproszczone przez usunięcie nadmiarowego Chat prefiksu. Nie podano aliasów zgodności wstecznej z poprzednimi wersjami.

Przed Po
ChatAgent Agent
RawChatAgent RawAgent
ChatMessage Message
ChatClientProtocol SupportsChatGetResponse

Aktualizowanie importu

Before:

from agent_framework import ChatAgent, ChatMessage

After:

from agent_framework import Agent, Message

Aktualizuj odwołania do typów

Before:

agent = ChatAgent(
    chat_client=client,
    name="assistant",
    instructions="You are a helpful assistant.",
)

message = ChatMessage(role="user", contents=[Content.from_text("Hello")])

After:

agent = Agent(
    client=client,
    name="assistant",
    instructions="You are a helpful assistant.",
)

message = Message(role="user", contents=[Content.from_text("Hello")])

Uwaga / Notatka

ChatClient, , ChatResponseChatOptionsi ChatMessageStorenie są zmieniane przez tę zmianę.


🔴 Typy interfejsu API — przegląd aktualizacji między modelami odpowiedzi/komunikatów

Pull Request:#3647

Ta wersja obejmuje szerokie, przełomowe zmiany w typowaniu komunikatów/odpowiedzi oraz pomocniczych interfejsach API.

  • Role i FinishReason są teraz NewType wrapery nad str dla znanych wartości RoleLiteral/FinishReasonLiteral. Traktuj je jako ciągi (bez .value użycia).
  • Message konstrukcja jest ustandaryzowana na Message(role, contents=[...]); ciągi w contents są automatycznie konwertowane na zawartość tekstową.
  • ChatResponse i AgentResponse konstruktory teraz koncentrują się na messages= (pojedynczym Message lub sekwencji); starsze użycie konstruktora typu text= zostało usunięte z odpowiedzi.
  • ChatResponseUpdate i AgentResponseUpdate nie akceptują text=już ; użyj polecenia contents=[Content.from_text(...)].
  • Nazwy pomocników do łączenia aktualizacji zostały uproszczone.
  • try_parse_value został usunięty z ChatResponse i AgentResponse.

Metoda pomocnicza zmienia nazwy

Przed Po
ChatResponse.from_chat_response_updates(...) ChatResponse.from_updates(...)
ChatResponse.from_chat_response_generator(...) ChatResponse.from_update_generator(...)
AgentResponse.from_agent_run_response_updates(...) AgentResponse.from_updates(...)

Aktualizacja konstrukcji odpowiedzi-aktualizacji

Before:

update = AgentResponseUpdate(text="Processing...", role="assistant")

After:

from agent_framework import AgentResponseUpdate, Content

update = AgentResponseUpdate(
    contents=[Content.from_text("Processing...")],
    role="assistant",
)

Zastąp try_parse_value z try/except na .value

Before:

if parsed := response.try_parse_value(MySchema):
    print(parsed.name)

After:

from pydantic import ValidationError

try:
    parsed = response.value
    if parsed:
        print(parsed.name)
except ValidationError as err:
    print(f"Validation failed: {err}")

🔴Ujednolicony run/get_response model i użycie ResponseStream

Pull Request:#3379

Interfejsy API Pythona zostały skonsolidowane wokół agent.run(...) i client.get_response(...), a z przesyłaniem strumieniowym reprezentowanym przez element ResponseStream.

Before:

async for update in agent.run_stream("Hello"):
    print(update)

After:

stream = agent.run("Hello", stream=True)
async for update in stream:
    print(update)

🔴 Główne nazwy kontekstu/typu protokołu

PR-y:#3714, #3717

Przed Po
AgentRunContext AgentContext
AgentProtocol SupportsAgentRun

Odpowiednio aktualizuj importy i adnotacje typów.


🔴 Zmieniono nazwę parametru kontynuacji oprogramowania pośredniczącego na call_next

PR:#3735

Podpisy oprogramowania pośredniczącego powinny teraz używać call_next zamiast next.

Before:

async def my_middleware(context, next):
    return await next(context)

After:

async def my_middleware(context, call_next):
    return await call_next(context)

🔴 Nazwy TypeVar ustandaryzowane (TNameNameT)

Pull Request:#3770

Baza kodu jest teraz zgodna ze spójnym stylem nazewnictwa TypeVar, w którym jest używany sufiks T .

Before:

TMessage = TypeVar("TMessage")

After:

MessageT = TypeVar("MessageT")

Jeśli utrzymujesz niestandardowe oprawki wokół typów ogólnych frameworków, dostosuj lokalne nazwy TypeVar do nowej konwencji, aby zmniejszyć liczbę zmian adnotacji.


🔴 Zmiany danych wyjściowych i przesyłania strumieniowego przepływu pracy jako agenta

Prośba o scalenie:#3649

workflow.as_agent() zachowanie zostało zaktualizowane w celu wyrównania danych wyjściowych i przesyłania strumieniowego ze standardowymi wzorcami odpowiedzi agenta. Przejrzyj użytkowników przepływu pracy jako agenta, którzy zależą od starszej obsługi danych wyjściowych/aktualizacji i zaktualizuj je do bieżącego AgentResponse/AgentResponseUpdate przepływu.


🔴 Metody konstruktora Fluent zostały przeniesione do parametrów konstruktora

Pull request:#3693

Jednokrotna konfiguracja metod fluent w 6 builderach (WorkflowBuilder, SequentialBuilder, ConcurrentBuilder, GroupChatBuilder, MagenticBuilder, HandoffBuilder) została przeniesiona do parametrów konstruktora. Płynne metody, które były jedyną ścieżką konfiguracji dla ustawienia, są usuwane na rzecz argumentów konstruktora.

WorkflowBuilder

set_start_executor(), with_checkpointing()i with_output_from() są usuwane. Zamiast tego użyj parametrów konstruktora.

Before:

upper = UpperCaseExecutor(id="upper")
reverse = ReverseExecutor(id="reverse")

workflow = (
    WorkflowBuilder(start_executor=upper)
    .add_edge(upper, reverse)
    .set_start_executor(upper)
    .with_checkpointing(storage)
    .build()
)

After:

upper = UpperCaseExecutor(id="upper")
reverse = ReverseExecutor(id="reverse")

workflow = (
    WorkflowBuilder(start_executor=upper, checkpoint_storage=storage)
    .add_edge(upper, reverse)
    .build()
)

SequentialBuilder / ConcurrentBuilder

participants(), register_participants(), with_checkpointing()i with_intermediate_outputs() są usuwane. Zamiast tego użyj parametrów konstruktora.

Before:

workflow = SequentialBuilder().participants([agent_a, agent_b]).with_checkpointing(storage).build()

After:

workflow = SequentialBuilder(participants=[agent_a, agent_b], checkpoint_storage=storage).build()

GroupChatBuilder

participants(), , register_participants()with_orchestrator()with_termination_condition()with_max_rounds()with_checkpointing()i with_intermediate_outputs() są usuwane. Zamiast tego użyj parametrów konstruktora.

Before:

workflow = (
    GroupChatBuilder()
    .with_orchestrator(selection_func=selector)
    .participants([agent1, agent2])
    .with_termination_condition(lambda conv: len(conv) >= 4)
    .with_max_rounds(10)
    .build()
)

After:

workflow = GroupChatBuilder(
    participants=[agent1, agent2],
    selection_func=selector,
    termination_condition=lambda conv: len(conv) >= 4,
    max_rounds=10,
).build()

MagenticBuilder

participants(), , register_participants(), with_manager()with_plan_review(), with_checkpointing(), i with_intermediate_outputs() są usuwane. Zamiast tego użyj parametrów konstruktora.

Before:

workflow = (
    MagenticBuilder()
    .participants([researcher, coder])
    .with_manager(agent=manager_agent)
    .with_plan_review()
    .build()
)

After:

workflow = MagenticBuilder(
    participants=[researcher, coder],
    manager_agent=manager_agent,
    enable_plan_review=True,
).build()

HandoffBuilder

with_checkpointing() i with_termination_condition() są usuwane. Zamiast tego użyj parametrów konstruktora.

Before:

workflow = (
    HandoffBuilder(participants=[triage, specialist])
    .with_start_agent(triage)
    .with_termination_condition(lambda conv: len(conv) > 5)
    .with_checkpointing(storage)
    .build()
)

After:

workflow = (
    HandoffBuilder(
        participants=[triage, specialist],
        termination_condition=lambda conv: len(conv) > 5,
        checkpoint_storage=storage,
    )
    .with_start_agent(triage)
    .build()
)

Zmiany walidacji

  • WorkflowBuilder teraz wymaga start_executor jako argumentu konstruktora (wcześniej ustawionego za pomocą metody fluent)
  • SequentialBuilder, ConcurrentBuilder, GroupChatBuilder i MagenticBuilder teraz wymagają albo participants albo participant_factories w czasie budowy — brak obu spowoduje podniesienie ValueError

Uwaga / Notatka

HandoffBuilder został już zaakceptowany participants/participant_factories jako parametry konstruktora i nie został zmieniony w tym względzie.


🔴 Zdarzenia przepływu pracy ujednolicone w jeden WorkflowEvent z type dyskryminatorem

PR:#3690

Wszystkie poszczególne podklasy zdarzeń przepływu pracy zostały zastąpione przez jedną klasę ogólną WorkflowEvent[DataT] . Zamiast używać isinstance() sprawdzeń do identyfikowania typów zdarzeń, teraz sprawdzasz ciąg literałowy event.type (np. "output", "request_info", "status"). Jest to zgodne z tym samym wzorcem co konsolidacja Content klas z klasy python-1.0.0b260123.

Usunięte klasy zdarzeń

Następujące wyeksportowane podklasy zdarzeń już nie istnieją:

Stara klasa Nowa event.type wartość
WorkflowOutputEvent "output"
RequestInfoEvent "request_info"
WorkflowStatusEvent "status"
WorkflowStartedEvent "started"
WorkflowFailedEvent "failed"
ExecutorInvokedEvent "executor_invoked"
ExecutorCompletedEvent "executor_completed"
ExecutorFailedEvent "executor_failed"
SuperStepStartedEvent "superstep_started"
SuperStepCompletedEvent "superstep_completed"

Aktualizowanie importu

Before:

from agent_framework import (
    WorkflowOutputEvent,
    RequestInfoEvent,
    WorkflowStatusEvent,
    ExecutorCompletedEvent,
)

After:

from agent_framework import WorkflowEvent
# Individual event classes no longer exist; use event.type to discriminate

Aktualizowanie kontroli typów zdarzeń

Before:

async for event in workflow.run_stream(input_message):
    if isinstance(event, WorkflowOutputEvent):
        print(f"Output from {event.executor_id}: {event.data}")
    elif isinstance(event, RequestInfoEvent):
        requests[event.request_id] = event.data
    elif isinstance(event, WorkflowStatusEvent):
        print(f"Status: {event.state}")

After:

async for event in workflow.run_stream(input_message):
    if event.type == "output":
        print(f"Output from {event.executor_id}: {event.data}")
    elif event.type == "request_info":
        requests[event.request_id] = event.data
    elif event.type == "status":
        print(f"Status: {event.state}")

Przesyłanie strumieniowe z AgentResponseUpdate

Before:

from agent_framework import AgentResponseUpdate, WorkflowOutputEvent

async for event in workflow.run_stream("Write a blog post about AI agents."):
    if isinstance(event, WorkflowOutputEvent) and isinstance(event.data, AgentResponseUpdate):
        print(event.data, end="", flush=True)
    elif isinstance(event, WorkflowOutputEvent):
        print(f"Final output: {event.data}")

After:

from agent_framework import AgentResponseUpdate

async for event in workflow.run_stream("Write a blog post about AI agents."):
    if event.type == "output" and isinstance(event.data, AgentResponseUpdate):
        print(event.data, end="", flush=True)
    elif event.type == "output":
        print(f"Final output: {event.data}")

Adnotacje typu

Before:

pending_requests: list[RequestInfoEvent] = []
output: WorkflowOutputEvent | None = None

After:

from typing import Any
from agent_framework import WorkflowEvent

pending_requests: list[WorkflowEvent[Any]] = []
output: WorkflowEvent | None = None

Uwaga / Notatka

WorkflowEvent jest ogólny (WorkflowEvent[DataT]), ale w przypadku kolekcji zdarzeń mieszanych użyj WorkflowEvent[Any] lub nieparametryzowany WorkflowEvent.


🔴 workflow.send_responses* Usunięte; Używać workflow.run(responses=...)

Pull Request:#3720

send_responses() i send_responses_streaming() zostały usunięte z Workflow. Kontynuuj wstrzymane przepływy pracy, przekazując odpowiedzi bezpośrednio do run().

Before:

async for event in workflow.send_responses_streaming(
    checkpoint_id=checkpoint_id,
    responses=[approved_response],
):
    ...

After:

async for event in workflow.run(
    checkpoint_id=checkpoint_id,
    responses=[approved_response],
):
    ...

🔴 SharedState zmieniono nazwę na State; interfejsy API stanu przepływu pracy są synchroniczne

Pull Request:#3667

Interfejsy API stanu nie wymagają już await, a nazewnictwo zostało ustandaryzowane:

Przed Po
ctx.shared_state ctx.state
await ctx.get_shared_state("k") ctx.get_state("k")
await ctx.set_shared_state("k", v) ctx.set_state("k", v)
checkpoint.shared_state checkpoint.state

🔴 Konstruktorzy orkiestracji przenieśli się do agent_framework.orchestrations

PR:#3685

Narzędzia orkiestracji znajdują się teraz w dedykowanej przestrzeni nazw pakietu.

Before:

from agent_framework import SequentialBuilder, GroupChatBuilder

After:

from agent_framework.orchestrations import SequentialBuilder, GroupChatBuilder

🟡 Długotrwałe odpowiedzi w tle i tokeny kontynuacji

Pull request:#3808

Odpowiedzi w tle są teraz obsługiwane w przypadku uruchamiania agenta Python za pomocą options={"background": True} i continuation_token.

response = await agent.run("Long task", options={"background": True})
while response.continuation_token is not None:
    response = await agent.run(options={"continuation_token": response.continuation_token})

🟡 Dodano typy podglądu dostawcy sesji/kontekstu obok siebie

Żądanie ściągnięcia kodu:#3763

Wprowadzono nowe typy potoków sesji/kontekstu wraz ze starszymi interfejsami API na potrzeby migracji przyrostowej, w tym SessionContext i BaseContextProvider.


🟡 Przesyłanie strumieniowe interpretera kodu obejmuje teraz przyrostowe zmiany kodu

Pull Request:#3775

Interpreter kodu przesyłania strumieniowego uruchamia teraz aktualizacje różnicowe kodu w strumieniowej zawartości, dzięki czemu interfejsy użytkownika mogą renderować wygenerowany kod stopniowo.


🟡 @tool obsługuje jawną obsługę schematów

Pull Request:#3734

Definicje narzędzi mogą teraz używać jawnej obsługi schematu, gdy wnioskowane dane wyjściowe schematu wymagają dostosowania.


python-1.0.0b260130 (30 stycznia 2026 r.)

Informacje o wersji:python-1.0.0b260130

🟡 ChatOptions a ChatResponse/AgentResponse teraz ogólny w zakresie formatu odpowiedzi

Pull Request:#3305

ChatOptions, ChatResponsei AgentResponse są teraz typami ogólnymi sparametryzowanymi przez typ formatu odpowiedzi. Dzięki temu można lepiej wnioskować o typach podczas używania ustrukturyzowanych danych wyjściowych za pomocą response_format polecenia.

Before:

from agent_framework import ChatOptions, ChatResponse
from pydantic import BaseModel

class MyOutput(BaseModel):
    name: str
    score: int

options: ChatOptions = {"response_format": MyOutput}  # No type inference
response: ChatResponse = await client.get_response("Query", options=options)
result = response.value  # Type: Any

After:

from agent_framework import ChatOptions, ChatResponse
from pydantic import BaseModel

class MyOutput(BaseModel):
    name: str
    score: int

options: ChatOptions[MyOutput] = {"response_format": MyOutput}  # Generic parameter
response: ChatResponse[MyOutput] = await client.get_response("Query", options=options)
result = response.value  # Type: MyOutput | None (inferred!)

Wskazówka

Jest to ulepszenie nienaruszające dotychczasowego działania. Istniejący kod bez parametrów typu nadal działa. Nie trzeba określać typów w powyższym fragmencie kodu dla opcji i odpowiedzi; są one pokazane tutaj, aby uzyskać jasność.


🟡 BaseAgent dodano obsługę zestawu Claude Agent SDK

Żądanie ściągnięcia zmian:#3509

Zestaw SDK języka Python zawiera teraz implementację BaseAgent dla SDK Claude Agent, umożliwiając najlepsze w swojej klasie użycie oparte na adapterze w ramach Agent Framework.


python-1.0.0b260128 (28 stycznia 2026 r.)

Informacje o wersji:python-1.0.0b260128

🔴 AIFunction zmieniono nazwę na FunctionTool i @ai_function zmieniono jej nazwę na @tool

Żądanie połączenia: #3413

Nazwa klasy i dekoratora została zmieniona dla klarowności i spójności z terminologią branżową.

Before:

from agent_framework.core import ai_function, AIFunction

@ai_function
def get_weather(city: str) -> str:
    """Get the weather for a city."""
    return f"Weather in {city}: Sunny"

# Or using the class directly
func = AIFunction(get_weather)

After:

from agent_framework.core import tool, FunctionTool

@tool
def get_weather(city: str) -> str:
    """Get the weather for a city."""
    return f"Weather in {city}: Sunny"

# Or using the class directly
func = FunctionTool(get_weather)

🔴 Wzorzec fabryki dodany do elementów GroupChat i Magentic; Zmiany nazw interfejsu API

PR:#3224

Dodano mechanizm uczestniczący i mechanizm orkiestratora do czatu grupowego. Obejmuje również zmiany nazw:

  • with_standard_managerwith_manager
  • participant_factoriesregister_participant

Before:

from agent_framework.workflows import MagenticBuilder

builder = MagenticBuilder()
builder.with_standard_manager(manager)
builder.participant_factories(factory1, factory2)

After:

from agent_framework.workflows import MagenticBuilder

builder = MagenticBuilder()
builder.with_manager(manager)
builder.register_participant(factory1)
builder.register_participant(factory2)

🔴 Github zmieniono nazwę na GitHub

PR:#3486

Nazwy klas i pakietów zostały zaktualizowane w celu użycia poprawnej wielkości liter.

Before:

from agent_framework_github_copilot import GithubCopilotAgent

agent = GithubCopilotAgent(...)

After:

from agent_framework_github_copilot import GitHubCopilotAgent

agent = GitHubCopilotAgent(...)

python-1.0.0b260127 (27 stycznia 2026 r.)

Informacje o wersji:python-1.0.0b260127

🟡 BaseAgent dodano obsługę pakietu GitHub Copilot SDK

Pull request:#3404

Zestaw SDK języka Python obejmuje teraz implementację integracji z GitHub Copilot SDK.


python-1.0.0b260123 (23 stycznia 2026 r.)

Informacje o wersji:python-1.0.0b260123

🔴 Typy zawartości uproszczone do pojedynczej klasy z konstruktorami classmethod

Pull Request:#3252

Zamieniono wszystkie stare typy zawartości (pochodzące z BaseContent klasy) na pojedynczą Content klasę z metodami klasowymi do tworzenia określonych typów.

Pełna dokumentacja migracji

Stary typ Nowa metoda
TextContent(text=...) Content.from_text(text=...)
DataContent(data=..., media_type=...) Content.from_data(data=..., media_type=...)
UriContent(uri=..., media_type=...) Content.from_uri(uri=..., media_type=...)
ErrorContent(message=...) Content.from_error(message=...)
HostedFileContent(file_id=...) Content.from_hosted_file(file_id=...)
FunctionCallContent(name=..., arguments=..., call_id=...) Content.from_function_call(name=..., arguments=..., call_id=...)
FunctionResultContent(call_id=..., result=...) Content.from_function_result(call_id=..., result=...)
FunctionApprovalRequestContent(...) Content.from_function_approval_request(...)
FunctionApprovalResponseContent(...) Content.from_function_approval_response(...)

Dodatkowe nowe metody (bez bezpośredniego poprzednika):

  • Content.from_text_reasoning(...) — Dla treści dotyczących rozumowania/myślenia
  • Content.from_hosted_vector_store(...) — W przypadku odwołań do magazynów wektorów
  • Content.from_usage(...) — Informacje o użyciu/tokenie
  • Content.from_mcp_server_tool_call(...) / Content.from_mcp_server_tool_result(...) — w przypadku narzędzi serwera MCP
  • Content.from_code_interpreter_tool_call(...) / Content.from_code_interpreter_tool_result(...) — Dla interpretera kodu
  • Content.from_image_generation_tool_call(...) / Content.from_image_generation_tool_result(...) — Do generowania obrazów

Sprawdzanie typów

Zamiast sprawdzania isinstance() użyj właściwości type.

Before:

from agent_framework.core import TextContent, FunctionCallContent

if isinstance(content, TextContent):
    print(content.text)
elif isinstance(content, FunctionCallContent):
    print(content.name)

After:

from agent_framework.core import Content

if content.type == "text":
    print(content.text)
elif content.type == "function_call":
    print(content.name)

Przykład podstawowy

Before:

from agent_framework.core import TextContent, DataContent, UriContent

text = TextContent(text="Hello world")
data = DataContent(data=b"binary", media_type="application/octet-stream")
uri = UriContent(uri="https://example.com/image.png", media_type="image/png")

After:

from agent_framework.core import Content

text = Content.from_text("Hello world")
data = Content.from_data(data=b"binary", media_type="application/octet-stream")
uri = Content.from_uri(uri="https://example.com/image.png", media_type="image/png")

🔴 Typy adnotacji uproszczone do Annotation i TextSpanRegion TypedDicts

Pull Request:#3252

Zamieniono typy adnotacji na podstawie klas na prostsze TypedDict definicje.

Stary typ Nowy typ
CitationAnnotation (klasa) Annotation (TypedDict z type="citation")
BaseAnnotation (klasa) Annotation (TypedDict)
TextSpanRegion (klasa z SerializationMixin) TextSpanRegion (TypedDict)
Annotations (alias typu) Annotation
AnnotatedRegions (alias typu) TextSpanRegion

Before:

from agent_framework import CitationAnnotation, TextSpanRegion

region = TextSpanRegion(start_index=0, end_index=25)
citation = CitationAnnotation(
    annotated_regions=[region],
    url="https://example.com/source",
    title="Source Title"
)

After:

from agent_framework import Annotation, TextSpanRegion

region: TextSpanRegion = {"start_index": 0, "end_index": 25}
citation: Annotation = {
    "type": "citation",
    "annotated_regions": [region],
    "url": "https://example.com/source",
    "title": "Source Title"
}

Uwaga / Notatka

Ponieważ Annotation i TextSpanRegion są teraz TypedDict, tworzysz je jako słowniki, a nie instancje klas.


🔴 response_format Błędy walidacji są teraz widoczne dla użytkowników

Prośba o ściągnięcie:#3274

ChatResponse.value a AgentResponse.value teraz zgłaszają ValidationError, gdy sprawdzanie poprawności schematu kończy się niepowodzeniem zamiast dyskretnie zwracać None wartość.

Before:

response = await agent.run(query, options={"response_format": MySchema})
if response.value:  # Returns None on validation failure - no error details
    print(response.value.name)

After:

from pydantic import ValidationError

# Option 1: Catch validation errors
try:
    print(response.value.name)  # Raises ValidationError on failure
except ValidationError as e:
    print(f"Validation failed: {e}")

# Option 2: Safe parsing (returns None on failure)
if result := response.try_parse_value(MySchema):
    print(result.name)

🔴 Uproszczono logikę AG-UI; Poprawki klienta MCP i Anthropic

PR:#3322

Sygnatura run metody i zachowanie w AG-UI została uproszczona.

Before:

from agent_framework.ag_ui import AGUIEndpoint

endpoint = AGUIEndpoint(agent=agent)
result = await endpoint.run(
    request=request,
    run_config={"streaming": True, "timeout": 30}
)

After:

from agent_framework.ag_ui import AGUIEndpoint

endpoint = AGUIEndpoint(agent=agent)
result = await endpoint.run(
    request=request,
    streaming=True,
    timeout=30
)

🟡 Klient Anthropic obsługuje teraz response_format dane wyjściowe ze strukturą

Pull Request:#3301

Teraz możesz używać parsowania strukturalnego wyjścia z klientami Anthropic za pośrednictwem programu response_format, podobnie jak z klientami OpenAI i platformą Azure.


🟡 Rozszerzono konfigurację sztucznej inteligencji platformy Azure (reasoning, rai_config)

PR:#3403, #3265

Obsługa sztucznej inteligencji platformy Azure została rozszerzona o obsługę konfiguracji rozumowania i rai_config podczas tworzenia agenta.


python-1.0.0b260116 (16 stycznia 2026 r.)

Informacje o wersji:python-1.0.0b260116

🔴 create_agent zmieniono nazwę na as_agent

PR:#3249

Zmieniono nazwę metody, aby uzyskać lepszą przejrzystość w jej celach.

Before:

from agent_framework.core import ChatClient

client = ChatClient(...)
agent = client.create_agent()

After:

from agent_framework.core import ChatClient

client = ChatClient(...)
agent = client.as_agent()

🔴 WorkflowOutputEvent.source_executor_id zmieniono nazwę na executor_id

Pull Request:#3166

Zmieniono nazwę właściwości dla spójności API.

Before:

async for event in workflow.run_stream(...):
    if isinstance(event, WorkflowOutputEvent):
        executor = event.source_executor_id

After:

async for event in workflow.run_stream(...):
    if isinstance(event, WorkflowOutputEvent):
        executor = event.executor_id

🟡 AG-UI obsługuje ciągłość sesji zarządzanej przez usługę

PR:#3136

AG-UI teraz zachowuje identyfikator konwersacji zarządzany przez usługę (na przykład sesje/wątki zarządzane przez Foundry), aby zachować ciągłość wieloetapowych interakcji.


python-1.0.0b260114 (14 stycznia 2026 r.)

Informacje o wersji:python-1.0.0b260114

🔴 Refaktoryzacja orkiestracji

Prośba o ściągnięcie:#3023

Obszerna refaktoryzacja i uproszczenie orkiestracji w przepływach pracy Frameworku Agenta.

  • Czat grupy: Podziel funkcję wykonawcy orkiestratora na dedykowaną opartą na agencie i opartą na funkcjach (BaseGroupChatOrchestrator, GroupChatOrchestrator, AgentBasedGroupChatOrchestrator). Uproszczono topologię gwiazdy z modelem emisji.
  • Przekazywanie: Usunięto obsługę pojedynczej warstwy, koordynatora i niestandardowego modułu wykonawczego. Przeniesiono do modelu transmisji z użyciem HandoffAgentExecutor.
  • Sekwencyjny i współbieżny: uproszczony mechanizm informacji o żądaniu, który opiera się na podrzędnych przepływach pracy za pośrednictwem AgentApprovalExecutor i AgentRequestInfoExecutor.

Before:

from agent_framework.workflows import GroupChat, HandoffOrchestrator

# Group chat with custom coordinator
group = GroupChat(
    participants=[agent1, agent2],
    coordinator=my_coordinator
)

# Handoff with single tier
handoff = HandoffOrchestrator(
    agents=[agent1, agent2],
    tier="single"
)

After:

from agent_framework.workflows import (
    GroupChatOrchestrator,
    HandoffAgentExecutor,
    AgentApprovalExecutor
)

# Group chat with star topology
group = GroupChatOrchestrator(
    participants=[agent1, agent2]
)

# Handoff with executor-based approach
handoff = HandoffAgentExecutor(
    agents=[agent1, agent2]
)

🔴 Opcje wprowadzone jako TypedDict i Generic

Pull Request:#3140

Opcje są obecnie typowane przy użyciu TypedDict dla lepszego bezpieczeństwa typów oraz autouzupełniania w środowisku IDE.

📖 Aby uzyskać pełne instrukcje dotyczące migracji, zobacz Przewodnik po typowanych opcjach.

Before:

response = await client.get_response(
    "Hello!",
    model_id="gpt-4",
    temperature=0.7,
    max_tokens=1000,
)

After:

response = await client.get_response(
    "Hello!",
    options={
        "model": "gpt-4",
        "temperature": 0.7,
        "max_tokens": 1000,
    },
)

🔴 display_name został usunięty; context_provider do formy pojedynczej; middleware musi być listą

PR:#3139

  • display_name parametr usunięty z agentów
  • context_providers (liczba mnoga, akceptowana lista) została zmieniona na context_provider (liczba pojedyncza, tylko 1 dozwolona)
  • middleware teraz wymaga listy (nie akceptuje już pojedynczego wystąpienia)
  • AggregateContextProvider usunięto z kodu (w razie potrzeby użyj przykładowej implementacji)

Before:

from agent_framework.core import Agent, AggregateContextProvider

agent = Agent(
    name="my-agent",
    display_name="My Agent",
    context_providers=[provider1, provider2],
    middleware=my_middleware,  # single instance was allowed
)

aggregate = AggregateContextProvider([provider1, provider2])

After:

from agent_framework.core import Agent

# Only one context provider allowed; combine manually if needed
agent = Agent(
    name="my-agent",  # display_name removed
    context_provider=provider1,  # singular, only 1
    middleware=[my_middleware],  # must be a list now
)

# For multiple context providers, create your own aggregate
class MyAggregateProvider:
    def __init__(self, providers):
        self.providers = providers
    # ... implement aggregation logic

🔴 AgentRunResponse* zmieniono nazwę na AgentResponse*

PR:#3207

AgentRunResponse zmieniono nazwy na AgentRunResponseUpdateAgentResponse i AgentResponseUpdate.

Before:

from agent_framework import AgentRunResponse, AgentRunResponseUpdate

After:

from agent_framework import AgentResponse, AgentResponseUpdate

🟡 Dodano środowisko uruchomieniowe dla deklaratywnie zdefiniowanych przepływów pracy w języku YAML

PR:#2815

Dodano środowisko uruchomieniowe oparte na grafach do wykonywania deklaratywnych przepływów pracy YAML, umożliwiając orkiestrację wielu agentów bez niestandardowego kodu środowiska uruchomieniowego.


🟡 Ulepszenia ładowania i niezawodności MCP

Pull Request:#3154

Integracje MCP zyskały poprawione zachowanie przy utracie połączenia, obsługę stronicowania podczas ładowania oraz opcje kontroli reprezentacji.


🟡 Usługa Foundry A2ATool obsługuje teraz połączenia bez docelowego adresu URL

Pull request:#3127

A2ATool Program może teraz rozpoznawać połączenia A2A oparte na rozwiązaniu Foundry za pośrednictwem metadanych połączenia projektu, nawet jeśli bezpośredni docelowy adres URL nie jest skonfigurowany.


python-1.0.0b260107 (7 stycznia 2026 r.)

Informacje o wersji:python-1.0.0b260107

Brak znaczących zmian w tej wersji.


python-1.0.0b260106 (6 stycznia 2026 r.)

Informacje o wersji:python-1.0.0b260106

Brak znaczących zmian w tej wersji.


Tabela podsumowania

Uwolnij Notatki o wydaniu Typ Change żądanie ściągnięcia
1.0.0 Tylko żądanie ściągnięcia zmian (PR) 🔴 Łamanie Message(..., text=...) konstrukcja jest w pełni usunięta; utwórz wiadomości tekstowe za pomocą contents=[...] #5062
1.0.0 Tylko żądanie ściągnięcia zmian (PR) 🟡 Ulepszenie Wydane pakiety języka Python (agent-framework, agent-framework-core, agent-framework-openai, agent-framework-foundry) nie wymagają --prejuż ; łączniki beta nadal działają #5062
1.0.0 Tylko żądanie ściągnięcia zmian (PR) 🔴 Łamanie Embeddingi Pythona zostały przeniesione do agent_framework.foundry; użyj ustawień agent-framework-foundry, FoundryEmbeddingClient i FOUNDRY_MODELS_* zamiast usuniętego pakietu agent-framework-azure-ai. #5056
1.0.0 Tylko żądanie ściągnięcia zmian (PR) 🔴 Łamanie workflow.run() teraz używa jawnych function_invocation_kwargs / client_kwargs, stosując elementy globalne lub przypisanie do poszczególnych funkcji wykonawczych na podstawie ich identyfikatorów. #5010
1.0.0 Tylko żądanie ściągnięcia zmian (PR) 🟡 Ulepszenie GitHubCopilotAgent teraz wywołuje haki dostarczyciela before_run / after_run kontekstu oraz zawiera kontekst monitu dodany przez dostarczyciela. #5013
1.0.0 Tylko żądanie ściągnięcia zmian (PR) 🟡 Ulepszenie Dane wyjściowe ustrukturyzowane w języku Python akceptują teraz mapowania schematów JSON jako response_format, z analizowanym kodem JSON na response.value #5022
1.0.0rc6 Tylko żądanie ściągnięcia zmian (PR) 🔴 Łamanie Przestarzałe warstwy zgodności Azure/OpenAI zostały usunięte; zamiast tego należy używać wiodących klientów OpenAI dostawcy lub klientów Foundry Python. #4990
1.0.0rc6 Tylko żądanie ściągnięcia zmian (PR) 🔴 Łamanie Refaktoryzacja wiodąca u dostawców: podział agent-framework-openai, agent-framework-foundry, i agent-framework-foundry-local; zmienianie nazw klientów OpenAI; przeniesienie Foundry do agent_framework.foundry; wycofanie zgodności z usługą Azure AI i ścieżkami Asystentów #4818
1.0.0rc6 Tylko żądanie ściągnięcia zmian (PR) 🔴 Łamanie agent-framework-core jest teraz celowo odchudzony; zainstaluj precyzyjne pakiety dostawcy, takie jak agent-framework-openai lub agent-framework-foundry, i zainstaluj mcp ręcznie w celu obsługi narzędzi MCP przy minimalnych instalacjach, lub użyj pakietu meta agent-framework dla szerszego doświadczenia domyślnego #4904
1.0.0rc6 Tylko żądanie ściągnięcia zmian (PR) 🔴 Łamanie Ogólni klienci agent_framework.openai preferują teraz jawne sygnały routingu; OpenAI pozostaje na OpenAI, gdy OPENAI_API_KEY jest ustawiony, a scenariusze Azure powinny przekazywać jawne sygnały routingu Azure, takie jak credential lub azure_endpoint, a następnie skonfigurować api_version #4925
1.0.0rc5 / 1.0.0b260318 Nie dotyczy (zaplanowane) 🔴 Łamanie Publiczne parametry wykonawcze kwargs podzielone na function_invocation_kwargs i client_kwargs; narzędzia teraz używają FunctionInvocationContext / ctx.session #4581
1.0.0rc4 / 1.0.0b260311 Notatki 🔴 Łamanie Integracje sztucznej inteligencji platformy Azure są teraz przeznaczone dla azure-ai-projects ogólnie dostępnej wersji 2.0; foundry_features została usunięta, a allow_preview jest wersją zapoznawczą do opcji wyboru. #4536
1.0.0rc4 / 1.0.0b260311 Notatki 🔴 Łamanie Integracja GitHub Copilot korzysta teraz z ToolInvocation / ToolResult; agent-framework-github-copilot wymaga Python 3.11 lub nowszego #4551
1.0.0rc3 / 1.0.0b260304 Notatki 🔴 Łamanie Dostawca funkcjonalności dodaje określony kod Skill / SkillResource; starsze FileAgentSkillsProvider importy i odniesienia do zasobów z użyciem backticków muszą zostać zaktualizowane. #4387
1.0.0rc2 / 1.0.0b260226 Notatki 🔴 Łamanie Deklaratywne przepływy pracy zastępują InvokeTool elementami InvokeFunctionTool i WorkflowFactory.register_tool() #3716
1.0.0rc1 / 1.0.0b260219 Notatki 🔴 Łamanie Ujednolicona obsługa poświadczeń platformy Azure w pakietach platformy Azure #4088
1.0.0rc1 / 1.0.0b260219 Notatki 🔴 Łamanie Hierarchia wyjątków języka Python przeprojektowana w obszarze AgentFrameworkException #4082
1.0.0rc1 / 1.0.0b260219 Notatki 🔴 Łamanie Stan dostawcy jest teraz ograniczony przez source_id #3995
1.0.0rc1 / 1.0.0b260219 Notatki 🔴 Łamanie Implementacje niestandardowe get_response() muszą zaakceptować Sequence[Message] #3920
1.0.0rc1 / 1.0.0b260219 Notatki 🔴 Łamanie FunctionTool[Any] Usunięto podkładkę przekazującą schematu #3907
1.0.0rc1 / 1.0.0b260219 Notatki 🔴 Łamanie Ustawienia przeniesione z AFBaseSettings /pydantic-settings do TypedDict + load_settings() #3843, #4032
1.0.0rc1 / 1.0.0b260219 Notatki 🟡 Ulepszenie Naprawiono przekazywanie przepływu pracy modelu rozumowania i serializacji historii #4083
1.0.0rc1 / 1.0.0b260219 Notatki 🟡 Ulepszenie Element Bedrock dodany do core[all]; domyślny wybór narzędzia został naprawiony #3953
1.0.0rc1 / 1.0.0b260219 Notatki 🟡 Ulepszenie AzureAIClient ostrzega o nieobsługiwanych nadpisaniach środowiska uruchomieniowego #3919
1.0.0rc1 / 1.0.0b260219 Notatki 🟡 Ulepszenie workflow.as_agent() wstrzykuje historię lokalną, gdy dostawcy są niezdefiniowani #3918
1.0.0rc1 / 1.0.0b260219 Notatki 🟡 Ulepszenie Kontekst śledzenia OpenTelemetry jest propagowany do żądań MCP #3780
1.0.0rc1 / 1.0.0b260219 Notatki 🟡 Ulepszenie Dodano obsługę trwałego przepływu pracy dla usługi Azure Functions #3630
1.0.0b260212 Notatki 🔴 Łamanie Hosted*Toolklasy usunięte; tworzenie hostowanych narzędzi za pomocą metod klienta get_*_tool() #3634
1.0.0b260212 Notatki 🔴 Łamanie Przepływ dostawcy sesji/kontekstu został sfinalizowany: AgentThread usunięto, użyj AgentSession + context_providers. #3850
1.0.0b260212 Notatki 🔴 Łamanie Refaktoryzacja modelu/przechowywania punktów kontrolnych (workflow_id usunięto, previous_checkpoint_id dodano, zmieniono zachowanie przechowywania) #3744
1.0.0b260212 Notatki 🟡 Ulepszenie AzureOpenAIResponsesClient Można utworzyć z poziomu punktu końcowego projektu Foundry lub AIProjectClient #3814
1.0.0b260212 Notatki 🔴 Łamanie Kontynuacja działania usług pośredniczących nie akceptuje już context; zaktualizuj call_next(context) do call_next() #3829
1.0.0b260210 Notatki 🔴 Łamanie send_responses() / send_responses_streaming() Usunięte; Używać workflow.run(responses=...) #3720
1.0.0b260210 Notatki 🔴 Łamanie SharedStateState; API stanu przepływu pracy są synchroniczne, a nazwa pola stanu punktu kontrolnego została zmieniona. #3667
1.0.0b260210 Notatki 🔴 Łamanie Konstruktorzy orkiestracji przenieśli się do agent_framework.orchestrations pakietu #3685
1.0.0b260210 Notatki 🟡 Ulepszenie Dodano obsługę odpowiedzi w tle i continuation_token do reakcji agenta w języku Python. #3808
1.0.0b260210 Notatki 🟡 Ulepszenie Dodano typy podglądu sesji/kontekstu obok siebie (SessionContext, BaseContextProvider) #3763
1.0.0b260210 Notatki 🟡 Ulepszenie Aktualizacje interpretera kodu do przesyłania strumieniowego teraz zawierają przyrostowe delty kodu. #3775
1.0.0b260210 Notatki 🟡 Ulepszenie @tool Dekorator dodaje obsługę precyzyjnego zarządzania schematem #3734
1.0.0b260210 Notatki 🔴 Łamanie register_executor() / register_agent() usunięte z WorkflowBuilder; używaj wystąpień bezpośrednio oraz metod pomocniczych do izolacji stanu #3781
1.0.0b260210 Notatki 🔴 Łamanie ChatAgent AgentChatMessageMessage, RawChatAgentRawAgent, ChatClientProtocolSupportsChatGetResponse #3747
1.0.0b260210 Notatki 🔴 Łamanie Przegląd API typów: Role/FinishReason zmiany typu, dostosowanie konstruktora odpowiedzi/aktualizacji, zmiana nazw pomocników na from_updates, i usunięcie try_parse_value #3647
1.0.0b260210 Notatki 🔴 Łamanie Interfejsy API zjednoczone wokół run/get_response i ResponseStream #3379
1.0.0b260210 Notatki 🔴 Łamanie AgentRunContext zmieniono nazwę na AgentContext #3714
1.0.0b260210 Notatki 🔴 Łamanie AgentProtocol zmieniono nazwę na SupportsAgentRun #3717
1.0.0b260210 Notatki 🔴 Łamanie Zmieniono nazwę parametru oprogramowania pośredniczącego next na call_next #3735
1.0.0b260210 Notatki 🔴 Łamanie TypVar nazewnictwo ustandaryzowane (TNameNameT) #3770
1.0.0b260210 Notatki 🔴 Łamanie Zachowanie danych wyjściowych/strumienia przepływu pracy jako agenta dostosowane do bieżącego przepływu odpowiedzi agenta #3649
1.0.0b260210 Notatki 🔴 Łamanie Metody konstruktora Fluent zostały przeniesione do parametrów konstruktora w 6 konstruktorach #3693
1.0.0b260210 Notatki 🔴 Łamanie Zdarzenia przepływu pracy ujednolicone w jeden WorkflowEvent z dyskryminatorem type; isinstance()event.type == "..." #3690
1.0.0b260130 Notatki 🟡 Ulepszenie ChatOptions / ChatResponse / AgentResponse ogólny format odpowiedzi #3305
1.0.0b260130 Notatki 🟡 Ulepszenie BaseAgent dodano obsługę integracji Claude Agent SDK #3509
1.0.0b260128 Notatki 🔴 Łamanie AIFunctionFunctionTool, @ai_function@tool #3413
1.0.0b260128 Notatki 🔴 Łamanie Wzorzec fabryki dla GroupChat/Magentic; with_standard_managerwith_manager, participant_factoriesregister_participant #3224
1.0.0b260128 Notatki 🔴 Łamanie GithubGitHub #3486
1.0.0b260127 Notatki 🟡 Ulepszenie BaseAgent dodano obsługę integracji zestawu SDK Copilot w usłudze GitHub #3404
1.0.0b260123 Notatki 🔴 Łamanie Typy zawartości zostały skonsolidowane do jednej klasy Content przy użyciu classmethods. #3252
1.0.0b260123 Notatki 🔴 Łamanie response_format błędy walidacji są teraz zgłaszane ValidationError #3274
1.0.0b260123 Notatki 🔴 Łamanie Uproszczone uruchamianie logiki AG-UI #3322
1.0.0b260123 Notatki 🟡 Ulepszenie Klient Anthropic dodaje response_format obsługę dla struktur danych wyjściowych #3301
1.0.0b260123 Notatki 🟡 Ulepszenie Rozszerzona konfiguracja sztucznej inteligencji platformy Azure z obsługą reasoning i rai_config #3403, #3265
1.0.0b260116 Notatki 🔴 Łamanie create_agentas_agent #3249
1.0.0b260116 Notatki 🔴 Łamanie source_executor_idexecutor_id #3166
1.0.0b260116 Notatki 🟡 Ulepszenie AG-UI obsługuje sesję zarządzaną przez usługę/ciągłość wątków #3136
1.0.0b260114 Notatki 🔴 Łamanie Zrefaktoryzowano orkiestracje (GroupChat, Handoff, Sekwencyjna, Współbieżna) #3023
1.0.0b260114 Notatki 🔴 Łamanie Opcje jako TypedDict i Generic #3140
1.0.0b260114 Notatki 🔴 Łamanie display_name usunięte; context_providerscontext_provider (liczba pojedyncza); middleware musi być listą #3139
1.0.0b260114 Notatki 🔴 Łamanie AgentRunResponse / AgentRunResponseUpdate zmieniono nazwę na AgentResponse/AgentResponseUpdate #3207
1.0.0b260114 Notatki 🟡 Ulepszenie Dodano środowisko uruchomieniowe deklaratywnego przepływu pracy dla przepływów pracy zdefiniowanych w języku YAML #2815
1.0.0b260114 Notatki 🟡 Ulepszenie Ulepszenia ładowania/niezawodności MCP (obsługa utraty połączenia, stronicowanie, kontrole reprezentacji) #3154
1.0.0b260114 Notatki 🟡 Ulepszenie Usługa Foundry A2ATool obsługuje połączenia bez jawnego adresu URL docelowego #3127
1.0.0b260107 Notatki Brak znaczących zmian
1.0.0b260106 Notatki Brak znaczących zmian

Dalsze kroki