Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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"])zamiastMessage(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ęccontents=["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-openaiiagent-framework-foundrysą 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-mem0iagent-framework-ollamanadal wymagają--pre. - Jeśli pojedyncze polecenie instalacji zawiera dowolny pakiet beta, zachowaj
--preto 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,FoundryEmbeddingOptionsorazFoundryEmbeddingSettingszagent_framework.foundry. - Zainstaluj
agent-framework-foundryprogram na potrzeby czatu foundry, agentów zarządzanych przez usługę, dostawców pamięci i osadzania. -
agent_framework.azurenie eksportuje jużAzureAIInferenceEmbeddingClient,AzureAIInferenceEmbeddingOptions,AzureAIInferenceEmbeddingSettingslubAzureAISettings. - Osadzenia Foundry używają teraz poleceń
FOUNDRY_MODELS_ENDPOINT,FOUNDRY_MODELS_API_KEY,FOUNDRY_EMBEDDING_MODELi opcjonalnieFOUNDRY_IMAGE_EMBEDDING_MODEL. -
FoundryChatClientiFoundryAgentnadal używają ustawień punktu końcowego projektu, takich jakFOUNDRY_PROJECT_ENDPOINTiFOUNDRY_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 doclient_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.valuejęzyka Python zgodne z formatem JSON (zazwyczajdictlublist). - 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
modelwszędzie, gdzie wcześniej użytomodel_id. -
Agent.default_optionsioptions={...}oczekują teraz"model", a nie"model_id". - Obiekty odpowiedzi są wyświetlane jako
response.model, a nie jakoresponse.model_id. - Ustawienia OpenAI używają teraz
OPENAI_MODEL,OPENAI_CHAT_MODEL,OPENAI_CHAT_COMPLETION_MODELiOPENAI_EMBEDDING_MODEL. - Ustawienia usługi Azure OpenAI używają teraz funkcji
AZURE_OPENAI_MODEL, ,AZURE_OPENAI_CHAT_MODELAZURE_OPENAI_CHAT_COMPLETION_MODELiAZURE_OPENAI_EMBEDDING_MODEL. - Anthropic używa teraz
ANTHROPIC_CHAT_MODEL, a Foundry Local używaFOUNDRY_LOCAL_MODEL. - Pakiet Anthropic dodaje również wrapery hostowane przez dostawcę, takie jak
AnthropicFoundryClient,AnthropicBedrockClientiAnthropicVertexClient.
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ń.
-
ContextProvideriHistoryProvidersą teraz kanonicznymi klasami bazowymi w Pythonie. -
BaseContextProvideriBaseHistoryProviderpozostają tymczasowo jako przestarzałe aliasy pod kątem zgodności, ale nowy kod powinien zostać zmigrowany do nowych nazw. -
SessionContextmoże teraz zbierać pośredniczące oprogramowanie czatu lub funkcji dodane przez dostawcę poprzezextend_middleware()i uwidaczniać spłaszczoną listę poprzezget_middleware(). -
Agent(..., require_per_service_call_history_persistence=True)uruchamia dostawców historii dla każdego wywołania modelu zamiast raz po pełnymrun(). - 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_idluboptions={"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.azurejuż nie eksportujeAzureOpenAI*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.openaiinterfejsu. - W przypadku bezpośrednich scenariuszy OpenAI lub Azure OpenAI należy używać
OpenAIChatClient,OpenAIChatCompletionClientiOpenAIEmbeddingClient. - Służy
FoundryChatClientdo wnioskowania w projekcie Foundry iFoundryAgentw przypadku agentów monitu lub hostowanych agentów. - Bieżąca
agent_framework.azureprzestrzeń 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 obszarzeagent_framework.foundry.
W przypadku migrowania starszego kodu w języku Python użyj następujących zamian:
-
AzureOpenAIResponsesClient→OpenAIChatClient -
AzureOpenAIChatClient→OpenAIChatCompletionClient -
AzureOpenAIEmbeddingClient→OpenAIEmbeddingClient -
AzureAIAgentClient/AzureAIClient/AzureAIProjectAgentProvider/AzureAIAgentsProviderFoundryChatClient→ lubFoundryAgent, w zależności od tego, czy aplikacja jest właścicielem definicji agenta -
OpenAIAssistantsClient/OpenAIAssistantProviderOpenAIChatClient→ dla bieżącej pracy z Python OpenAI lubFoundryAgentjeś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 nazwagent_framework.openai. - Klienci Microsoft Foundry są teraz umieszczeni w pakiecie
agent-framework-foundryi przestrzeni nazwagent_framework.foundry. - Program Foundry Local jest również uwidaczniony z
agent_framework.foundryelementu jakoFoundryLocalClient. -
OpenAIResponsesClientzmieniono nazwę naOpenAIChatClient. -
OpenAIChatClientzmieniono nazwę naOpenAIChatCompletionClient. - Konfiguracja klienta jest ustandaryzowana w systemie
model, zastępując starsze parametry, takie jakmodel_id,deployment_nameimodel_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
FoundryChatClientdo bezpośredniej inferencji projektów,FoundryAgentdla agentów Prompt i HostedAgents orazFoundryLocalClientdla lokalnych środowisk uruchomieniowych. -
AzureAIClient,AzureAIProjectAgentProvider,AzureAIAgentClient,AzureAIAgentsProvideri 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ę.
-
AzureOpenAIResponsesClient→OpenAIChatClient -
AzureOpenAIChatClient→OpenAIChatCompletionClient -
AzureOpenAIEmbeddingClient→OpenAIEmbeddingClient -
AzureOpenAIAssistantsClient→OpenAIChatClientdla migracji interfejsu API Odpowiedzi bezpośrednich lubFoundryAgentjeśli potrzebujesz agenta Foundry zarządzanego przez usługę
Zmiana kodu jest głównie przenoszeniem nazwy klasy i deployment_name → model. 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_MODELdlaOpenAIChatClient,OPENAI_CHAT_COMPLETION_MODELdlaOpenAIChatCompletionClient, zOPENAI_MODELjako wspólnym zapasowym. - Usługa Azure OpenAI teraz używa
AZURE_OPENAI_CHAT_MODELdlaOpenAIChatClient,AZURE_OPENAI_CHAT_COMPLETION_MODELdlaOpenAIChatCompletionClient, iAZURE_OPENAI_MODELjako udostępnionego rezerwowego. - Użyj
azure_endpointdla adresów URL usługi Azure OpenAI lubbase_url, jeśli masz już pełny adres URL.../openai/v1, i ustawapi_versiondla 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_NAMEiFOUNDRY_AGENT_VERSIONdla klientów rozwiązania Cloud Foundry - Użyj
ANTHROPIC_CHAT_MODELdla Anthropic iFOUNDRY_LOCAL_MODELdla 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-corejest teraz celowo minimalny. - W przypadku importowania
agent_framework.openai, zainstalujagent-framework-openai. - Jeśli importujesz
agent_framework.foundry, zainstalujagent-framework-foundrydo wnioskowania w projekcie Foundry, agentów zarządzanych przez usługę, dostawców pamięci i osadzania. Użyjagent-framework-foundry-local --predla lokalnych środowisk uruchomieniowych. - Jeśli używasz narzędzi MCP,
Agent.as_mcp_server()lub innych integracji MCP w minimalnej instalacji, zainstalujmcp --preręcznie. Aby umożliwić obsługę MCP dla WebSocket, zainstalujmcp[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_KEYjest skonfigurowany, ogólni klienci pozostają na platformie OpenAI, chyba że przekażesz jawny sygnał routingu z Azure, taki jakcredentiallubazure_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()naOpenAIChatClient,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:
-
AzureOpenAIEmbeddingClient→OpenAIEmbeddingClient -
AZURE_OPENAI_EMBEDDING_MODEL→model -
OPENAI_EMBEDDING_MODELpozostaje 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_kwargsdla wartości, które powinny być widoczne tylko dla narzędzi lub middleware funkcji. - Użyj
client_kwargsdla kwargs warstwy klienta i konfiguracji oprogramowania pośredniczącego klienta. - Uzyskiwanie dostępu do danych narzędzia/środowiska uruchomieniowego za pomocą
FunctionInvocationContext(ctx.kwargsictx.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_featuresFunkcja "przekazywanie" została usunięta z procesu tworzenia agenta AI platformy Azure. - Zachowanie wersji zapoznawczej teraz wykorzystuje
allow_preview=Truena 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
ToolInvocationzamiast nieprzetworzonej klasydict. - Zwracanie
ToolResultprzy użyciu pól snake_case, takich jakresult_typeitext_result_for_llm. - Pakiet
agent-framework-github-copilotwymaga 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ę naSkillsProvider. - 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()zpython-dotenvpakietu na początku Twojej aplikacji - Przekazywanie elementu
env_file_path=".env"do elementuload_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.
-
AgentThread→AgentSession -
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 przezcontext_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:
-
WorkflowCheckpointteraz przechowuje aktywne obiekty (serializacja odbywa się w przestrzeni pamięci punktów kontrolnych) -
FileCheckpointStorageTeraz używa serializacji za pomocą pickle -
workflow_idzostał usunięty iprevious_checkpoint_idzostał 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.
-
RoleiFinishReasonsą terazNewTypewrapery nadstrdla znanych wartościRoleLiteral/FinishReasonLiteral. Traktuj je jako ciągi (bez.valueużycia). -
Messagekonstrukcja jest ustandaryzowana naMessage(role, contents=[...]); ciągi wcontentssą automatycznie konwertowane na zawartość tekstową. -
ChatResponseiAgentResponsekonstruktory teraz koncentrują się namessages=(pojedynczymMessagelub sekwencji); starsze użycie konstruktora typutext=zostało usunięte z odpowiedzi. -
ChatResponseUpdateiAgentResponseUpdatenie akceptujątext=już ; użyj poleceniacontents=[Content.from_text(...)]. - Nazwy pomocników do łączenia aktualizacji zostały uproszczone.
-
try_parse_valuezostał usunięty zChatResponseiAgentResponse.
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
| 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 (TName → NameT)
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
-
WorkflowBuilderteraz wymagastart_executorjako argumentu konstruktora (wcześniej ustawionego za pomocą metody fluent) -
SequentialBuilder,ConcurrentBuilder,GroupChatBuilderiMagenticBuilderteraz wymagają alboparticipantsalboparticipant_factoriesw czasie budowy — brak obu spowoduje podniesienieValueError
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_manager→with_manager -
participant_factories→register_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)
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
AgentApprovalExecutoriAgentRequestInfoExecutor.
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_nameparametr usunięty z agentów -
context_providers(liczba mnoga, akceptowana lista) została zmieniona nacontext_provider(liczba pojedyncza, tylko 1 dozwolona) -
middlewareteraz wymaga listy (nie akceptuje już pojedynczego wystąpienia) -
AggregateContextProviderusunię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 |
SharedState → State; 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
Agent → ChatMessage → Message, RawChatAgent → RawAgent, ChatClientProtocol → SupportsChatGetResponse |
#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 (TName → NameT) |
#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 |
AIFunction → FunctionTool, @ai_function → @tool |
#3413 |
| 1.0.0b260128 | Notatki | 🔴 Łamanie | Wzorzec fabryki dla GroupChat/Magentic; with_standard_manager → with_manager, participant_factories → register_participant |
#3224 |
| 1.0.0b260128 | Notatki | 🔴 Łamanie |
Github → GitHub |
#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_agent → as_agent |
#3249 |
| 1.0.0b260116 | Notatki | 🔴 Łamanie |
source_executor_id → executor_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_providers → context_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 | — |