Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieses Dokument listet alle wichtigen Änderungen in Python-Versionen seit Anfang 2026 auf, darunter wichtige Änderungen und wichtige Verbesserungen, die sich auf Ihren Code auswirken können. Jede Änderung wird markiert als:
- 🔴 Kompatibilitätsbruch – Erfordert Codeänderungen für das Upgrade
- 🟡 Verbesserung — Neue Funktion oder Verbesserung; Vorhandener Code funktioniert weiterhin
In diesem Dokument werden die bedeutenden Python-Änderungen im Übergang von 2026 preview-to-1.0.0 nachverfolgt. Bitte lesen Sie es also beim Upgrade zwischen Versionen, um sicherzustellen, dass Sie keine wichtigen Änderungen verpassen. Detaillierte Upgradeanweisungen zu bestimmten Themen (z. B. Optionenmigration) finden Sie in den verknüpften Upgradeleitfäden oder den verknüpften PR.
python-1.0.0
In diesem Abschnitt werden die signifikanten Python-Änderungen erfasst, die nach python-1.0.0rc6 erfolgten und die jetzt Teil von python-1.0.0 sind.
🔴
Message(..., text=...) Konstruktion ist nun vollständig entfernt
PR:#5062
PR #5062 schließt die frühere Python-Nachrichtenmodellbereinigung ab, indem die letzten frameworkseitigen Codepfade entfernt werden, die nach wie vor Message-Objekte mit text=... konstruierten.
- Erstellen von Textnachrichten als
Message(role="user", contents=["Hello"])anstattMessage(role="user", text="Hello"). - Dies gilt überall, wo Sie Nachrichten direkt erstellen, einschließlich Workflowanforderungen, benutzerdefinierte Middleware-Antworten, Orchestrierungshilfsprogramme und Migrationscode.
- Einfache Zeichenfolgen innerhalb
contents=[...]werden immer noch automatisch in Textinhalte normalisiert, sodasscontents=["Hello"]die einfachste Nur-Text-Form bleibt.
Before:
message = Message(role="assistant", text="Hello")
After:
message = Message(role="assistant", contents=["Hello"])
🟡 Veröffentlichte Python-Pakete sind nicht mehr erforderlich --pre
PR:#5062
PR #5062 aktualisiert die wichtigsten Python-Pakete auf 1.0.0 und aktualisiert die Installationsanleitungen, um zwischen veröffentlichten Paketen und Paketen, die noch als Vorabversion verfügbar sind, zu unterscheiden.
-
agent-framework,agent-framework-core,agent-framework-openaiundagent-framework-foundrysind jetzt freigegebene Pakete und erfordern kein--premehr. - Beta-Connectors wie
agent-framework-ag-ui,agent-framework-azurefunctions,agent-framework-copilotstudio,agent-framework-foundry-local,agent-framework-github-copilot,agent-framework-mem0undagent-framework-ollamaerfordern immer noch--pre. - Wenn ein einzelner Installationsbefehl ein Betapaket enthält, behalten Sie diesen Befehl
--prebei.
🔴 Foundry besitzt jetzt Python-Einbettungen und Modelle-Endpunkteinstellungen
PR:#5056
PR #5056 entfernt das eigenständige agent-framework-azure-ai Paket und verschiebt die Python-Einbettungsoberfläche auf agent-framework-foundry und agent_framework.foundry.
- Verwenden Sie
FoundryEmbeddingClient,FoundryEmbeddingOptions, undFoundryEmbeddingSettingsvonagent_framework.foundry. - Installieren Sie
agent-framework-foundryfür den Foundry-Chat, vom Dienst verwaltete Agenten, Speicheranbieter und Einbettungen. -
agent_framework.azureexportiertAzureAIInferenceEmbeddingClientnicht mehr,AzureAIInferenceEmbeddingOptions,AzureAIInferenceEmbeddingSettingsoderAzureAISettings. - Gießereieinbettungen verwenden jetzt
FOUNDRY_MODELS_ENDPOINT,FOUNDRY_MODELS_API_KEY,FOUNDRY_EMBEDDING_MODELund optionalFOUNDRY_IMAGE_EMBEDDING_MODEL. -
FoundryChatClientundFoundryAgentverwenden weiterhin Projekteinstellungen für Endpunkte, z.B.FOUNDRY_PROJECT_ENDPOINTundFOUNDRY_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"],
)
🔴 Workflows leiten jetzt Laufzeit-Kwargs über explizite Buckets weiter.
PR:#5010
PR #5010 aktualisiert Python workflow.run(...), sodass Laufzeit-Kwargs explizit als function_invocation_kwargs= und client_kwargs= und nicht als generisch weitergeleitete **kwargs übergeben werden.
- Eine flache Abbildung wird als global behandelt und an jeden passenden Agent-Executor im Workflow weitergeleitet.
- Wenn ein oder mehrere Top-Level-Schlüssel mit den Executor-IDs übereinstimmen, wird die gesamte Zuordnung als auf individuelle Executor ausgerichtet behandelt, und jeder Executor erhält nur seinen eigenen Eintrag.
- Benutzerdefinierte
AgentExecutor(id="...")und andere explizite Workflowausführer-IDs sind die Schlüssel, auf die Sie abzielen. - Die gleichen Regeln für globale vs. gezielte Anwendungen gelten sowohl für
function_invocation_kwargsals auch fürclient_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 führt jetzt um jeden Aufruf herum Kontextanbieter aus.
PR:#5013
PR #5013 behebt eine Python-Verhaltenslücke, bei der GitHubCopilotAgent zwar context_providers akzeptiert wurde, jedoch nicht tatsächlich aufgerufen wurden.
-
before_run()wird jetzt ausgeführt, bevor die Copilot-Eingabeaufforderung gesendet wird. - Vom Anbieter hinzugefügte Nachrichten und Anweisungen sind in der Eingabeaufforderung enthalten, die die Copilot CLI erreicht.
-
after_run()wird jetzt ausgeführt, nachdem die endgültige Antwort, einschließlich des Streaming-Pfads, zusammengestellt wurde.
Wenn Sie bereits context_providers an GitHubCopilotAgent übergeben haben, ist keine Migration erforderlich – die Hooks verhalten sich jetzt konsistent mit der restlichen Python-Agentenoberfläche.
🟡 Strukturierte Ausgabe akzeptiert jetzt zusätzlich zu Pydantischen Modellen JSON-Schemazuordnungen.
PR:#5022
PR #5022 erweitert Python Structured-Output-Parsing, sodass response_format entweder ein Pydantic-Modell oder eine JSON-Schema-Zuordnung sein kann.
- Pydantic-Modelle werden weiterhin in typisierte Modellinstanzen auf
response.valuegeparst. - JSON-Schemazuordnungen werden jetzt zu JSON-kompatiblen Python-Werten verarbeitet auf
response.value(in der Regeldictoderlist). - Die gleichen Analyseregeln gelten, wenn Sie die endgültige Antwort eines Datenstroms sammeln.
Dies ist eine Verbesserung anstatt eine grundlegende Änderung, aber es ist nützlich zu wissen, ob Sie Schemas bereits als JSON-ähnliche Wörterbücher speichern.
python-1.0.0rc6
In diesem Abschnitt werden die signifikanten Python-Änderungen erfasst, die mit python-1.0.0rc6 ausgeliefert oder für python-1.0.0rc6 verfolgt wurden.
🔴 Die Modellauswahl ist standardisiert auf model
PR:#4999
PR #4999 schließt die Python-seitige Modellauswahlbereinigung für Konstruktoren, typierte Optionen, Agentstandardwerte, Antwortobjekte und Umgebungsvariablen ab.
- Verwenden Sie
modelüberall, wo Sie zuvor verwendet habenmodel_id. -
Agent.default_optionsundoptions={...}pro Lauf erwarten jetzt"model"und nicht"model_id". - Oberfläche
response.modelvon Antwortobjekten , nichtresponse.model_id. - OpenAI-Einstellungen verwenden jetzt
OPENAI_MODEL,OPENAI_CHAT_MODEL,OPENAI_CHAT_COMPLETION_MODELundOPENAI_EMBEDDING_MODEL. - Azure OpenAI-Einstellungen verwenden jetzt
AZURE_OPENAI_MODEL,AZURE_OPENAI_CHAT_MODEL,AZURE_OPENAI_CHAT_COMPLETION_MODELundAZURE_OPENAI_EMBEDDING_MODEL. - Anthropic verwendet
ANTHROPIC_CHAT_MODELjetzt , und Foundry Local verwendetFOUNDRY_LOCAL_MODEL. - Das Anthropic-Paket fügt auch vom Anbieter gehostete Wrapper wie
AnthropicFoundryClient,AnthropicBedrockClient, undAnthropicVertexClient.
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"},
)
🔴 Kontextanbieter können Middleware hinzufügen und den Verlauf pro Modellaufruf beibehalten
PR:#4992
PR #4992 aktualisiert die Python-Kontext-Provider-Pipeline und wie die frameworkverwaltete Historie während mehrfacher Ausführungen beibehalten wird.
-
ContextProviderundHistoryProvidersind jetzt die kanonischen Python-Basisklassen. -
BaseContextProviderundBaseHistoryProviderbleiben vorübergehend als veraltete Aliase zur Kompatibilität, aber neuer Code sollte zu den neuen Namen migriert werden. -
SessionContextkann jetzt vom Anbieter hinzugefügte Chats oder Funktions-Middleware überextend_middleware()sammeln und die flache Liste überget_middleware()verfügbar machen. -
Agent(..., require_per_service_call_history_persistence=True)führt Verlaufsanbieter bei jedem einzelnen Modellaufruf aus, statt einmalig nach dem vollständigenrun()-Aufruf. - Dieser Modus ist für den vom Framework verwalteten lokalen Verlauf vorgesehen und kann nicht mit einer vorhandenen, vom Dienst verwalteten Unterhaltung wie
session.service_session_idoderoptions={"conversation_id": ...}kombiniert werden.
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,
)
🔴 Veraltete Azure/OpenAI-Kompatibilitätsoberflächen wurden entfernt
PR:#4990
PR #4990 schließt die von Anbietern angeführte Migration ab, indem die verbleibenden veralteten Python-Kompatibilitätsschnittstellen entfernt werden, die in früheren Vorschauversionen verfügbar waren.
-
agent_framework.azureexportiert wederAzureOpenAI*noch die älterenAzureAI*Agent-/Client-/Anbieteroberflächen. - Python OpenAI Assistants-Kompatibilitätstypen sind nicht mehr Teil der aktuellen
agent_framework.openaiOberfläche. - Verwenden Sie
OpenAIChatClient,OpenAIChatCompletionClientundOpenAIEmbeddingClientfür direkte OpenAI- oder Azure OpenAI-Szenarien. - Verwenden Sie
FoundryChatClientfür Inferenz im Foundry-Projekt undFoundryAgentfür Prompt Agents oder gehostete Agents. - Der aktuelle
agent_framework.azureNamespace umfasst jetzt die verbleibenden Azure-Integrationen wie Azure AI Search, Cosmos-Verlauf, Azure-Funktionen und dauerhafte Workflows. Foundry-Chats, Agenten, Speicher und Einbettungsclients befinden sich unteragent_framework.foundry.
Wenn Sie älteren Python-Code migrieren, nutzen Sie die folgenden Alternativen:
-
AzureOpenAIResponsesClient→OpenAIChatClient -
AzureOpenAIChatClient→OpenAIChatCompletionClient -
AzureOpenAIEmbeddingClient→OpenAIEmbeddingClient -
AzureAIAgentClient/AzureAIClient/AzureAIProjectAgentProvider/AzureAIAgentsProviderFoundryChatClient→ oderFoundryAgent, je nachdem, ob Ihre App die Agentdefinition besitzt -
OpenAIAssistantsClient/OpenAIAssistantProviderOpenAIChatClient→ für aktuelle Python OpenAI-Arbeit, oderFoundryAgentwenn Sie einen vom Dienst verwalteten Agent in Foundry benötigen
🔴 Anbieterführendes Clientdesign und Paketteilung
PR:#4818
PR #4818 organisiert die Python-Anbieteroberfläche neu in anbieterspezifische Pakete und Namespaces.
- OpenAI-Clients befinden sich jetzt im
agent-framework-openai-Paket, während sie weiterhin aus demagent_framework.openai-Namespace importiert werden. - Microsoft Foundry-Clients befinden sich jetzt im
agent-framework-foundryPaket und imagent_framework.foundryNamespace. - Foundry Local wird auch von
agent_framework.foundryalsFoundryLocalClientbereitgestellt. -
OpenAIResponsesClientwird umbenannt inOpenAIChatClient. -
OpenAIChatClientwird umbenannt inOpenAIChatCompletionClient. - Die Clientkonfiguration ist auf
modelstandardisiert, wobei ältere Parameter wiemodel_id,deployment_nameundmodel_deployment_nameersetzt werden. - Verwenden Sie für den neuen Azure OpenAI-Code die
agent_framework.openaiClients. Die früherenAzureOpenAI*Kompatibilitätsshims wurden später in #4990 entfernt. - Verwenden Sie
FoundryChatClientfür neuen Foundry-Code zur direkten Projekterschließung,FoundryAgentfür Prompt Agents und HostedAgents undFoundryLocalClientfür lokale Laufzeitumgebungen. -
AzureAIClient,AzureAIProjectAgentProvider,AzureAIAgentClient,AzureAIAgentsProvider, und die Python-Assistenten-Kompatibilitätsoberfläche wurden während dieser Umgestaltung auf Kompatibilitätspfade verschoben und später in #4990 entfernt. - Die Stichprobenabdeckung wurde neu organisiert, um dem neuen anbieterführenden Layout zu entsprechen, einschließlich der Foundry-Beispiele unter
samples/02-agents/providers/foundry/.
Paketzuordnung
| Szenario | Installieren | Primärer Namespace |
|---|---|---|
| OpenAI und Azure OpenAI | pip install agent-framework-openai |
agent_framework.openai |
| Microsoft Foundry-Projektendpunkte, Agent-Dienst, Arbeitsspeicher und Einbettungen | pip install agent-framework-foundry |
agent_framework.foundry |
| Gießerei Lokal | 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")
Wenn Sie Azure OpenAI zuvor direkt verwendet haben, ordnen Sie die alten dedizierten Klassen den neuen anbieterführenden OpenAI-Klassen zu:
-
AzureOpenAIResponsesClient→OpenAIChatClient -
AzureOpenAIChatClient→OpenAIChatCompletionClient -
AzureOpenAIEmbeddingClient→OpenAIEmbeddingClient -
AzureOpenAIAssistantsClient→OpenAIChatClientfür die direkte Migration der Antworten-API, oderFoundryAgentwenn Sie einen vom Dienst verwalteten Foundry-Agenten benötigen
Die Codeänderung ist hauptsächlich eine Verschiebung des Klassennamens plus deployment_name → model. Verwenden Sie für die Azure OpenAI-Kompatibilität explizite Azure-Eingaben auf den neuen OpenAI-Clients.
credential= ist jetzt die bevorzugte Azure-Authentifizierungsoberfläche, während ein aufrufbarer api_key Pfad weiterhin ein Kompatibilitätspfad ist:
Vor (AzureOpenAIResponsesClient):
from agent_framework.azure import AzureOpenAIResponsesClient
client = AzureOpenAIResponsesClient(
endpoint=azure_endpoint,
deployment_name=deployment_name,
credential=credential,
)
Nach (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,
)
Vor (AzureOpenAIChatClient):
from agent_framework.azure import AzureOpenAIChatClient
client = AzureOpenAIChatClient(
endpoint=azure_endpoint,
deployment_name=deployment_name,
credential=credential,
)
Nach (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,
)
Wenn Sie von Azure OpenAI-Endpunkten zu einem Microsoft Foundry-Projektendpunkt wechseln möchten, verwenden Sie stattdessen die Foundry-orientierte Oberfläche:
Vor (Azure OpenAI-Endpunkt):
from agent_framework.azure import AzureOpenAIResponsesClient
from azure.identity import AzureCliCredential
client = AzureOpenAIResponsesClient(
deployment_name="gpt-4.1",
credential=AzureCliCredential(),
)
After (Foundry-Projekt):
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)
Verwenden Sie für lokale Microsoft Foundry-Laufzeiten den Foundry-Namespace sowie den lokalen Connector:
from agent_framework.foundry import FoundryLocalClient
client = FoundryLocalClient(model="phi-4-mini")
Wenn Sie model weglassen, setzen Sie FOUNDRY_LOCAL_MODEL in Ihrer Umgebung fest.
Aktualisieren Sie ggf. auch Umgebungs-/Konfigurationsnamen:
- Wird
OPENAI_CHAT_MODELfürOpenAIChatClientundOPENAI_CHAT_COMPLETION_MODELfürOpenAIChatCompletionClientverwendet, mitOPENAI_MODELals allgemeine Rückfallebene. - Azure OpenAI verwendet
AZURE_OPENAI_CHAT_MODELjetzt fürOpenAIChatClient,AZURE_OPENAI_CHAT_COMPLETION_MODELfürOpenAIChatCompletionClientundAZURE_OPENAI_MODELals freigegebenen Fallback. - Verwenden Sie
azure_endpointfür Azure OpenAI-Ressourcen-URLs, oderbase_url, wenn Sie bereits eine vollständige.../openai/v1-URL haben, und setzen Sieapi_versionfür die Azure OpenAI API-Oberfläche, die Sie verwenden. - Übernehmen Von Foundry-spezifischen Einstellungen wie
FOUNDRY_PROJECT_ENDPOINT,FOUNDRY_MODEL, ,FOUNDRY_AGENT_NAMEundFOUNDRY_AGENT_VERSIONfür Cloud Foundry-Clients - Verwendung
ANTHROPIC_CHAT_MODELfür Anthropic undFOUNDRY_LOCAL_MODELfür Foundry Local
Diese Änderung wurde zuerst während des python-1.0.0rc6 Zyklus eingeführt.
🔴 Kernabhängigkeiten sind jetzt absichtlich schlanker
PR:#4904
PR #4904 folgt der Aufteilung des Anbieterpakets von #4818, indem agent-framework-core verkleinert und weitere transitive Anbieterabhängigkeiten aus dem Kernpaket entfernt werden.
-
agent-framework-coreist jetzt absichtlich minimal gehalten. - Wenn Sie importieren
agent_framework.openai, installieren Sieagent-framework-openai. - Wenn Sie
agent_framework.foundryimportieren, installieren Sieagent-framework-foundryfür die Inferenz des Foundry-Projekts, dienstverwaltete Agents, Speicheranbieter und Einbettungen. Verwenden Sieagent-framework-foundry-local --prefür lokale Laufzeiten. - Wenn Sie MCP-Tools oder
Agent.as_mcp_server()andere MCP-Integrationen bei einer minimalen Installation verwenden, installieren Sie diesemcp --premanuell. Installieren Siemcp[ws] --prefür die WebSocket MCP-Unterstützung. - Wenn Sie das umfassende Erlebnis "mit allem Drum und Dran" möchten, installieren Sie das Metapaket
agent-framework.
Dadurch wird die Anbieteroberfläche nicht erneut neu gestaltet; es ändert, was standardmäßig installiert ist, wenn Sie nur den Kern verwenden.
Vorher (core-only Installationen bringen häufig transitiv mehr Anbieterfunktionalität mit):
pip install agent-framework-core
Danach (installieren Sie das anbieterpaket, das Sie tatsächlich verwenden):
pip install agent-framework-core
pip install agent-framework-openai
oder:
pip install agent-framework-core
pip install agent-framework-foundry
Wenn Sie ein vorhandenes Projekt aktualisieren, das zuvor von core plus faulen Anbieterimporten abhängig war, überwachen Sie Ihre Importe, und machen Sie die Anbieterpakete in Ihrer Umgebung oder Abhängigkeitsdateien explizit. Führen Sie die gleichen Schritte für MCP-Abhängigkeiten aus, wenn Sie auf MCP-Tools oder MCP-Serverhosting angewiesen sind.
🔴 Generische OpenAI-Clients bevorzugen jetzt explizite Routingsignale
PR:#4925
PR #4925 ändert, wie sich die generischen agent_framework.openai Clients zwischen OpenAI und Azure OpenAI entscheiden.
- Generische OpenAI-Clients wechseln nicht mehr zu Azure, nur weil
AZURE_OPENAI_*Umgebungsvariablen vorhanden sind. - Wenn
OPENAI_API_KEYkonfiguriert ist, bleiben die generischen Clients auf OpenAI, es sei denn, Sie übergeben ein explizites Azure-Routingsignal wiecredentialoderazure_endpoint. - Wenn nur
AZURE_OPENAI_*Einstellungen vorhanden sind, können die generischen Clients weiterhin auf das umgebungsbasierte Azure-Routing zurückgreifen. - Das bevorzugte Azure OpenAI-Muster besteht nun darin, explizite Azure-Einstellungen sowie den Einbettungsclient auf
credential=AzureCliCredential(),OpenAIChatClientundOpenAIChatCompletionClientzu übergeben. - Veraltete
AzureOpenAI*Wrapper behalten ihr Kompatibilitätsverhalten bei, sodass bestehender Wrapper-basierter Code nicht den neuen Regeln der generischen Clientrangfolge entspricht.
Bevor (OpenAIChatClient konnte zu Azure geleitet werden, da Azure-Env-Vars vorhanden waren):
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")
Nach (generisches OpenAI bleibt bei OpenAI; übergeben Sie explizite Azure-Eingaben, um Azure-Routing zu erzwingen):
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(),
)
Wenn Ihre Umgebung sowohl OPENAI_*- als auch AZURE_OPENAI_*-Werte enthält, überprüfen Sie die generische agent_framework.openai-Clientkonstruktion und machen die Anbieterwahl explizit. Die Azure-Anbieterbeispiele wurden aktualisiert, um Azure-Eingaben direkt zu übergeben.
Azure-Einbettungen folgen jetzt demselben Routingmodell:
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(),
)
Karten für Einbettungsszenarien:
-
AzureOpenAIEmbeddingClient→OpenAIEmbeddingClient -
AZURE_OPENAI_EMBEDDING_MODEL→model -
OPENAI_EMBEDDING_MODELbleibt die OpenAI-seitige Einbettungsumgebungsvariable
python-1.0.0rc5 / python-1.0.0b260319 (19. März 2026)
🔴 Neuanordnung der Chatclientpipeline: FunctionInvocation umschließt jetzt ChatMiddleware
PR:#4746
Die Pipeline-Sortierung von ChatClient hat sich geändert.
FunctionInvocation ist jetzt die äußerste Ebene und umschließt ChatMiddleware, was bedeutet, dass Chat-Middleware pro Modellaufruf (einschließlich jeder Iteration der Toolaufrufschleife) statt einmal um die gesamte Funktionsaufrufsequenz ausgeführt wird.
Alte Pipeline-Reihenfolge:
ChatMiddleware → FunctionInvocation → RawChatClient
Neuer Pipelineauftrag:
FunctionInvocation → ChatMiddleware → ChatTelemetry → RawChatClient
Wenn Sie über eine benutzerdefinierte Chat-Middleware verfügen, die ursprünglich dafür ausgelegt war, nur einmal pro Agentenaufruf ausgeführt zu werden (dabei die gesamte Werkzeugsaufrufschleife umfassend), aktualisieren Sie sie, damit sie auch bei wiederholter Ausführung sicher bleibt. Chat-Middleware wird jetzt für jede einzelne LLM-Anforderung aufgerufen, einschließlich Anforderungen, die Toolergebnisse zurück an das Modell senden.
Darüber hinaus ist ChatTelemetry jetzt eine separate Ebene von ChatMiddleware in der Pipeline und läuft am nächsten zu RawChatClient.
🔴 Öffentliche Laufzeit-Parameter werden in explizite Buckets aufgeteilt
PR:#4581
Öffentliche Python-Agent- und Chat-APIs behandeln keine allgemeine öffentliche **kwargs Weiterleitung mehr als primären Laufzeitdatenmechanismus. Laufzeitwerte werden jetzt nach Zweck aufgeteilt:
- Verwenden Sie
function_invocation_kwargsfür Werte, die nur von Tools oder Funktions-Middleware gesehen werden sollten. - Verwenden Sie
client_kwargsfür Client-Schichten-Kwargs und die Konfiguration von Client-Middleware. - Zugreifen auf Tool-/Laufzeitdaten über
FunctionInvocationContext(ctx.kwargsundctx.session). - Definieren Sie Tools mit einem eingefügten Kontextparameter anstelle von
**kwargs; eingefügte Kontextparameter werden nicht im Schema angezeigt, das das Modell sieht. - Verwenden Sie
agent.as_tool(propagate_session=True)beim Delegieren an einen Unteragenten als Werkzeug, wenn der untergeordnete Agent die Sitzung des Anrufers teilen muss.
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",
},
)
Wenn Sie benutzerdefinierte öffentliche run()- oder get_response()-Methoden implementieren, fügen Sie function_invocation_kwargs und client_kwargs zu diesen Signaturen hinzu. Bevorzugen Sie für Tools einen mit Anmerkungen versehenen Parameter wie FunctionInvocationContext, der ctx, context oder einen anderen kommentierten Namen tragen kann. Wenn Sie ein explizites Schema-/Eingabemodell angeben, wird auch ein unanmerkter Parameter ctx erkannt. Dasselbe Kontextobjekt ist für die Funktion Middleware verfügbar, und dort befinden sich jetzt Laufzeitfunktions-Kwargs und Sitzungszustand. Tooldefinitionen, die weiterhin nur auf **kwargs setzen, verwenden einen Kompatibilitätspfad für Legacy-Systeme und werden entfernt.
python-1.0.0rc4 / python-1.0.0b260311 (11. März 2026)
Versionshinweise:python-1.0.0rc4
🔴Azure AI-Integrationen zielen jetzt auf 2.0 GA ab azure-ai-projects
PR:#4536
Die Python Azure AI-Integrationen gehen jetzt von der GA 2.0-Oberfläche azure-ai-projects aus.
- Der unterstützte Abhängigkeitsbereich ist jetzt
azure-ai-projects>=2.0.0,<3.0. -
foundry_featuresPassthrough wurde aus der Erstellung des Azure AI-Agents entfernt. - Das Vorschauverhalten nutzt jetzt
allow_preview=Trueauf den unterstützten Clients/Anbietern. - Die gemischten Beta-/GA-Kompatibilitäts-Shims wurden entfernt. Daher sollten alle Importe und Typnamen auf die 2.0 GA SDK-Schnittstelle aktualisiert werden.
🔴 GitHub Copilot-Toolhandler verwenden jetzt ToolInvocation / ToolResult und Python 3.11+
PR:#4551
agent-framework-github-copilot verfolgt jetzt github-copilot-sdk>=0.1.32.
- Toolhandler empfangen eine
ToolInvocationDatenklasse anstelle einer unformatiertendict. - Geben Sie
ToolResultzurück, indem Sie snake_case Felder wieresult_typeundtext_result_for_llmverwenden. - Das
agent-framework-github-copilotPaket erfordert jetzt Python 3.11+.
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. März 2026)
Versionshinweise:python-1.0.0rc3
🔴 Der Fachkompetenz-Anbieter wurde basierend auf Code-Definition abgeschlossen Skill / SkillResource
PR:#4387
Python-Agenten-Skills unterstützen jetzt code-definierte Skill- und SkillResource-Objekte zusammen mit dateibasierten Fähigkeiten, und die öffentliche Anbieteroberfläche wird auf SkillsProvider standardisiert.
- Wenn Sie weiterhin die ältere Vorschau/interne
FileAgentSkillsProviderimportieren, sollten Sie zuSkillsProviderwechseln. - Dateibasierte Ressourcensuche basiert nicht mehr auf backtick-zitierten Verweisen in
SKILL.md; Ressourcen werden stattdessen aus dem Qualifikationsverzeichnis ermittelt.
Wenn Sie Vorschau-/internen Code hatten, der FileAgentSkillsProvider importierte, wechseln Sie zur aktuellen öffentlichen API:
from agent_framework import Skill, SkillResource, SkillsProvider
python-1.0.0rc2 / python-1.0.0b260226 (26. Februar 2026)
Versionshinweise:python-1.0.0rc2
🔴 Deklarative Workflows ersetzen InvokeTool durch InvokeFunctionTool
PR:#3716
Deklarative Python-Workflows verwenden nicht mehr die alte InvokeTool Aktionsart. Ersetzen Sie es durch InvokeFunctionTool und registrieren Sie Python-Aufrufables mit 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. Februar 2026)
Release:agent-framework-core und agent-framework-azure-ai höhergestuft zu 1.0.0rc1. Alle anderen Pakete wurden aktualisiert auf 1.0.0b260219.
🔴 Einheitliche Azure-Anmeldeinformationsverarbeitung für alle Pakete
PR:#4088
Die Parameter ad_token, ad_token_provider und get_entra_auth_token beziehungsweise Hilfsprogramme wurden in allen Azure-bezogenen Python-Paketen durch einen einheitlichen credential-Parameter ersetzt. Der neue Ansatz nutzt azure.identity.get_bearer_token_provider für das automatische Zwischenspeichern und die Aktualisierung von Token.
Betroffene Klassen:AzureOpenAIChatClient, AzureOpenAIResponsesClient, , AzureOpenAIAssistantsClient, AzureAIClientAzureAIAgentClient, AzureAIProjectAgentProvider, AzureAIAgentsProvider, AzureAISearchContextProviderPurviewClient, . PurviewPolicyMiddlewarePurviewChatPolicyMiddleware
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(),
...
)
Der credential Parameter akzeptiert TokenCredential, AsyncTokenCredentialoder ein aufrufbarer Tokenanbieter. Tokenzwischenspeicherung und -aktualisierung werden automatisch behandelt.
🔴 Neu gestaltete Python-Ausnahmehierarchie
PR:#4082
Die flache ServiceException-Familie wurde durch domänenbezogene Ausnahmeverzweigungen unter einem einzigen AgentFrameworkException-Stamm ersetzt. Dadurch erhalten Anrufer präzise except Ziele und klare Fehlersemantik.
Neue Hierarchie:
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
Entfernte Ausnahmen: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
...
Hinweis
Initialisierungsvalidierungsfehler ValueError/TypeError verwenden jetzt eingebaute Ausnahmen anstelle benutzerdefinierter. Agent Framework-Ausnahmen sind für Fehler auf Domänenebene reserviert.
🔴 Anbieterstatus im Bereich source_id
PR:#3995
Anbieter-Hooks erhalten jetzt ein anbieterbezogenes Statuswörterbuch (state.setdefault(provider.source_id, {})) statt des vollständigen Sitzungszustands. Dies bedeutet, dass Anbieterimplementierungen, die zuvor auf den geschachtelten Zustand über state[self.source_id]["key"] zugegriffen haben, jetzt direkt auf state["key"] zugreifen müssen.
Darüber hinaus InMemoryHistoryProvider wurde die Standardeinstellung source_id von "memory" zu "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")
🔴 Ausrichtung der Chat-/Agent-Nachrichteneingabe (run vs get_response)
PR:#3920
Chat-Client-Implementierungen get_response empfangen Sequence[Message] jetzt einheitlich.
agent.run(...) bleibt flexibel (str, Content, Messageoder Sequenzen dieser) und normalisiert Eingaben vor dem Aufrufen von Chatclients.
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] generisches Setup für Schema-Passthrough entfernt
PR:#3907
Schemabasierte Toolpfade basieren nicht mehr auf dem vorherigen generischen FunctionTool[Any] Verhalten.
Verwenden Sie FunctionTool direkt und geben Sie entweder ein pydantic BaseModel oder bei Bedarf explizite Schemas an (z. B. mit @tool(schema=...)).
Before:
placeholder: FunctionTool[Any] = FunctionTool(...)
After:
placeholder: FunctionTool = FunctionTool(...)
🔴 Pydantische Einstellungen ersetzt durch TypedDict + load_settings()
Die auf pydantic-settings basierende AFBaseSettings-Klasse wurde durch ein leichtgewichtiges, funktionsbasiertes Einstellungssystem ersetzt, das TypedDict und load_settings() verwendet. Die pydantic-settings Abhängigkeit wurde vollständig entfernt.
Alle Einstellungsklassen (z. B. OpenAISettings, , AzureOpenAISettingsAnthropicSettings) sind jetzt TypedDict Definitionen, und auf Einstellungswerte wird über die Wörterbuchsyntax anstelle des Attributzugriffs zugegriffen.
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"]
Von Bedeutung
Agent Framework lädt Werte nicht automatisch aus Dateien. Sie müssen sich explizit für das .env Laden durch eine der folgenden Aktionen anmelden:
- Aufrufen
load_dotenv()despython-dotenvPakets zu Beginn der Anwendung - Übergeben
env_file_path=".env"anload_settings() - Festlegen von Umgebungsvariablen direkt in der Shell oder IDE
Die load_settings Auflösungsreihenfolge lautet: explizite Außerkraftsetzungen → .env Dateiwerte (sofern env_file_path angegeben) → Umgebungsvariablen → Standardwerten. Wenn Sie env_file_path angeben, muss die Datei vorhanden sein, andernfalls wird eine FileNotFoundError ausgelöst.
🟡 Beheben der Workflow-Übergabe des Reasoning-Models und der Serialisierung der Historie
PR:#4083
Behebt mehrere Fehler bei der Verwendung von Argumentationsmodellen (z. B. gpt-5-mini, gpt-5.2) in Multiagenten-Workflows. Die Abschätzungen aus der Responses-API werden jetzt korrekt serialisiert und nur in den Verlauf aufgenommen, wenn auch ein function_call vorhanden ist, um API-Fehler zu verhindern. Verschlüsselter/ausgeblendeter Begründungsinhalt wird jetzt ordnungsgemäß ausgegeben, und das summary Feldformat wird korrigiert. Zusätzlich wird service_session_id auch beim Handover gelöscht, um ein Leck des agentenübergreifenden Zustands zu verhindern.
🟡 Bedrock zum core[all] hinzugefügt und Standardeinstellungen für die Werkzeugauswahl korrigiert
PR:#3953
Amazon Bedrock ist jetzt in den agent-framework-core[all] Extras enthalten und über die agent_framework.amazon Lazy-Import-Schnittstelle verfügbar. Das Toolauswahlverhalten wurde ebenfalls behoben: Nicht festgelegte Toolauswahlwerte bleiben jetzt nicht festgelegt, sodass Anbieter ihre Dienststandardwerte verwenden, während explizit festgelegte Werte beibehalten werden.
from agent_framework.amazon import BedrockClient
🟡 AzureAIClient bei nicht unterstützten Laufzeitüberschreibungen gewarnt
PR:#3919
Zum Zeitpunkt dieser Änderung wurde eine Warnung protokolliert, wenn die Laufzeit tools oder structured_output sich von der Erstellungszeitkonfiguration des Agents unterscheidet. Diese Python-Oberfläche wurde seitdem entfernt. Verwenden Sie FoundryChatClient für aktuellen Python-Code, wenn Sie eine App-eigene Tool-/Laufzeitkonfiguration benötigen, oder OpenAIChatClient für direkte Responses-API-Szenarien, die dynamische Überschreibungen erfordern.
🟡
workflow.as_agent() Jetzt wird standardmäßig der lokale Verlauf verwendet, wenn Anbieter nicht festgelegt sind.
PR:#3918
Wenn workflow.as_agent() ohne context_providers erstellt wird, wird InMemoryHistoryProvider("memory") jetzt standardmäßig hinzugefügt.
Wenn Kontextanbieter explizit angegeben werden, wird diese Liste unverändert beibehalten.
workflow_agent = workflow.as_agent(name="MyWorkflowAgent")
# Default local history provider is injected when none are provided.
🟡 OpenTelemetry-Ablaufverfolgungskontext an MCP-Anforderungen weitergegeben
PR:#3780
Wenn OpenTelemetry installiert ist, wird der Trace-Kontext (z. B. W3C traceparent) automatisch in MCP-Anforderungen über params._meta eingefügt. Dies ermöglicht die Verfolgung des gesamten Ablaufs von Agenten bis zu Aufrufen des MCP-Servers in einer verteilten Umgebung. Es sind keine Codeänderungen erforderlich – dies ist ein additives Verhalten, das aktiviert wird, wenn ein gültiger Span-Kontext vorhanden ist.
🟡 Dauerhafte Workflowunterstützung für Azure Functions
PR:#3630
Das agent-framework-azurefunctions Paket unterstützt jetzt das Ausführen von Workflow Diagrammen in Azure Durable Functions. Übergeben Sie einen workflow Parameter an AgentFunctionApp, um Agententitäten, Aktivitätsfunktionen und HTTP-Endpunkte automatisch zu registrieren.
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
Unterstützt Fan-Out/Fan-In-, Zustandsteilungs- und Human-in-the-Loop-Muster mit konfigurierbarem Timeout und automatischer Ablehnung bei Ablauf.
python-1.0.0b260212 (12. Februar 2026)
Versionshinweise:python-1.0.0b260212
🔴
Hosted*Tool Durch Clientmethoden get_*_tool() ersetzte Klassen
PR:#3634
Die gehosteten Toolklassen wurden zugunsten von klientenspezifischen Factory-Methoden entfernt. Dadurch wird die Verfügbarkeit des Tools vom Anbieter explizit festgelegt.
| Klasse entfernt | 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()]
🔴 Die Pipeline des Sitzungs-/Kontextanbieters wurde abgeschlossen (AgentSession, context_providers)
PR:#3850
Die Python-Sitzung und die Kontextanbietermigration wurden abgeschlossen.
AgentThread und die alten Kontextanbietertypen wurden entfernt.
-
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=Muster werden durchcontext_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)
🔴 Prüfpunktmodell und Speicherverhalten umgestaltet
PR:#3744
Prüfpunktinsinterne wurden neu gestaltet, was sich auf die permanente Kompatibilität von Prüfpunkten und benutzerdefinierte Speicherimplementierungen auswirkt:
-
WorkflowCheckpointspeichert jetzt Liveobjekte (Serialisierung geschieht im Prüfpunktspeicher) -
FileCheckpointStorageverwendet jetzt Pickle-Serialisierung -
workflow_idwurde entfernt undprevious_checkpoint_idhinzugefügt. - Veraltete Prüfpunkthaken wurden entfernt.
Wenn Sie Prüfpunkte zwischen Versionen beibehalten, generieren oder migrieren Sie vorhandene Prüfpunktartefakte, bevor Sie Workflows fortsetzen.
🟡 Endpunkte des Foundry-Projekts, die ursprünglich durch AzureOpenAIResponsesClient
PR:#3814
Diese Vorschaufunktion erlaubte AzureOpenAIResponsesClient ursprünglich die Verbindung mit Foundry-Projektendpunkten. Die aktuelle Python-Anleitung verwendet FoundryChatClient für die Inferenz im Foundry-Projekt oder FoundryAgent für dienstverwaltete Foundry-Agenten anstelle der entfernten 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(),
)
🔴 Middleware call_next akzeptiert nicht mehr context
PR:#3829
Middleware-Fortsetzung akzeptiert jetzt keine Argumente. Wenn Ihre Middleware weiterhin aufruft call_next(context), aktualisieren Sie sie auf 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. Februar 2026)
Versionshinweise:python-1.0.0b260210
🔴 Workflow-Factory-Methoden entfernt von WorkflowBuilder
PR:#3781
register_executor() und register_agent() wurden aus WorkflowBuilderentfernt. Alle Generatormethoden (add_edge, add_fan_out_edges, , add_fan_in_edgesadd_chain, add_switch_case_edge_group, add_multi_selection_edge_group) und start_executor akzeptieren keine Zeichenfolgennamen mehr – sie erfordern Executor- oder Agentinstanzen direkt.
Um die Isolation des Zustands zu gewährleisten, sollten Sie die Instanziierung von Executor/Agent und den Aufbau von Workflows in einer Hilfsmethode kapseln, sodass jeder Aufruf neue Instanzen erzeugt.
WorkflowBuilder mit Executoren
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 mit Agenten
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()
Zustandsisolation mit Hilfsmethoden
Für Workflows, die einen isolierten Zustand pro Aufruf benötigen, umschließen Sie die Konstruktion in einer Hilfsmethode:
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()
🔴
ChatAgentumbenannt in , Agent umbenannt in ChatMessageMessage
PR:#3747
Core Python-Typen wurden durch Entfernen des redundanten Chat Präfixes vereinfacht. Es werden keine abwärtskompatiblen Aliasnamen bereitgestellt.
| Vorher | Nach |
|---|---|
ChatAgent |
Agent |
RawChatAgent |
RawAgent |
ChatMessage |
Message |
ChatClientProtocol |
SupportsChatGetResponse |
Importe aktualisieren
Before:
from agent_framework import ChatAgent, ChatMessage
After:
from agent_framework import Agent, Message
Aktualisieren von Typverweisen
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")])
Hinweis
ChatClient, ChatResponse, ChatOptionsund ChatMessageStore werden von dieser Änderung nicht umbenannt.
🔴 Typen-API-Überprüfungsupdates über Antwort-/Nachrichtenmodelle hinweg
PR:#3647
Diese Version enthält eine umfassende, unterbrechende Bereinigung von Nachrichten-/Antworteingaben und Hilfs-APIs.
-
RoleundFinishReasonsind jetztNewTypeWrapper überstrmitRoleLiteral/FinishReasonLiteralfür bekannte Werte. Behandeln Sie sie als Zeichenfolgen (keine.valueVerwendung). -
MessageDie Konstruktion ist standardisiertMessage(role, contents=[...]); Zeichenfolgen werdencontentsautomatisch in Textinhalte konvertiert. -
ChatResponseundAgentResponseKonstruktoren fokussieren sich jetzt aufmessages=(einzelnesMessageoder Sequenzen); die Verwendung des Legacy-Konstruktorstext=wurde aus den Antworten entfernt. -
ChatResponseUpdateundAgentResponseUpdateakzeptierentext=nicht mehr; verwenden Siecontents=[Content.from_text(...)]. - Die Bezeichnungen für die Zusammenführung von Updates wurden vereinfacht.
-
try_parse_valuewurde ausChatResponseundAgentResponseentfernt.
Die Hilfsmethode wird umbenannt.
| Vorher | Nach |
|---|---|
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(...) |
Aktualisieren der Antwortaktualisierungskonstruktion
Before:
update = AgentResponseUpdate(text="Processing...", role="assistant")
After:
from agent_framework import AgentResponseUpdate, Content
update = AgentResponseUpdate(
contents=[Content.from_text("Processing...")],
role="assistant",
)
Ersetzen Sie try_parse_value durch try/except auf .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}")
🔴Einheitliches run/get_response Modell und Verwendung ResponseStream
PR:#3379
Python-APIs wurden um agent.run(...) und client.get_response(...) konsolidiert, wobei Streaming durch ResponseStream dargestellt wird.
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)
🔴 Kernkontext/Protokolltyp-Umbenennungen
| Vorher | Nach |
|---|---|
AgentRunContext |
AgentContext |
AgentProtocol |
SupportsAgentRun |
Aktualisieren Sie Importe und Typanmerkungen entsprechend.
🔴 Middleware-Fortsetzungsparameter umbenannt in call_next
PR:#3735
Middleware-Signaturen sollten jetzt call_next anstelle von 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)
🔴 TypeVar-Namen standardisiert (TName → NameT)
PR:#3770
Die Codebasis folgt nun einem konsistenten TypeVar-Benennungsstil, in dem Suffix T verwendet wird.
Before:
TMessage = TypeVar("TMessage")
After:
MessageT = TypeVar("MessageT")
Wenn Sie benutzerdefinierte Wrapper um Framework-Generika verwalten, richten Sie Ihre lokalen TypeVar-Namen an der neuen Konvention aus, um die Änderung von Anmerkungen zu reduzieren.
🔴 Workflow-as-agent-Output und Streaming-Änderungen
PR:#3649
workflow.as_agent() Das Verhalten wurde aktualisiert, um die Ausgabe und das Streaming mit standard-Agent-Antwortmustern auszurichten. Überprüfen Sie Workflow-as-Agent-Consumer, die von der Verarbeitung von Legacyausgabe/Aktualisierungen abhängig sind, und aktualisieren Sie sie auf den aktuellen AgentResponse/AgentResponseUpdate Fluss.
🔴 Fluent Builder-Methoden werden in Konstruktorparameter verschoben
PR:#3693
Fließende Methoden mit einer einzigen Konfiguration über 6 Builder (WorkflowBuilder, SequentialBuilder, ConcurrentBuilder, GroupChatBuilder, MagenticBuilder, HandoffBuilder) wurden zu Konstruktorparametern migriert. Fluent-Methoden, die der einzige Konfigurationspfad für eine Einstellung waren, werden zugunsten von Konstruktorargumenten entfernt.
WorkflowBuilder
set_start_executor(), with_checkpointing()und with_output_from() werden entfernt. Verwenden Sie stattdessen Konstruktorparameter.
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()und with_intermediate_outputs() werden entfernt. Verwenden Sie stattdessen Konstruktorparameter.
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()und with_intermediate_outputs() werden entfernt. Verwenden Sie stattdessen Konstruktorparameter.
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()und with_intermediate_outputs() werden entfernt. Verwenden Sie stattdessen Konstruktorparameter.
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() und with_termination_condition() werden entfernt. Verwenden Sie stattdessen Konstruktorparameter.
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()
)
Validierungsänderungen
-
WorkflowBuildererfordertstart_executorjetzt als Konstruktorargument (zuvor über fluent-Methode festgelegt) -
SequentialBuilder,ConcurrentBuilder,GroupChatBuilderundMagenticBuildererfordern jetzt entwederparticipantsoderparticipant_factoriesbei der Erstellung — keins von beidem führt dazu, dassValueError
Hinweis
HandoffBuilder wurde bereits als Konstruktorparameter akzeptiert participants/participant_factories und in dieser Hinsicht nicht geändert.
🔴Workflow-Ereignisse mit WorkflowEvent-Diskriminator zu einem einzigen type-Ereignis zusammengeführt
PR:#3690
Alle einzelnen Workflow-Ereignis-Unterklassen wurden durch eine generische WorkflowEvent[DataT]-Klasse ersetzt. Anstatt isinstance() Checks zur Identifizierung von Ereignistypen zu verwenden, überprüfen Sie nun das event.type Zeichenfolgenliteral (z. B. "output", "request_info", "status"). Dies folgt demselben Muster wie die Content Klassenkonsolidierung aus python-1.0.0b260123.
Entfernte Ereignisklassen
Die folgenden exportierten Ereignisunterklassen sind nicht mehr vorhanden:
| Alte Klasse | Neuer event.type Wert |
|---|---|
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" |
Importe aktualisieren
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
Aktualisieren von Ereignistypüberprüfungen
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}")
Streaming mit 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}")
Typanmerkungen
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
Hinweis
WorkflowEvent ist generisch (WorkflowEvent[DataT]), aber für Sammlungen gemischter Ereignisse verwenden WorkflowEvent[Any] oder nichtparameterisiert WorkflowEvent.
🔴
workflow.send_responses* entfernt; verwenden workflow.run(responses=...)
PR:#3720
send_responses() und send_responses_streaming() wurden aus Workflowentfernt. Setzen Sie angehaltene Workflows fort, indem Sie Antworten direkt an 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 umbenannt in State; Workflowstatus-APIs sind synchron
PR:#3667
Status-APIs erfordern awaitnicht mehr, und die Benennung wurde standardisiert:
| Vorher | Nach |
|---|---|
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 |
🔴 Orchestrierungsentwickler wurden nach agent_framework.orchestrations
PR:#3685
Orchestrierungs-Generatoren befinden sich jetzt in einem dedizierten Paketnamespace.
Before:
from agent_framework import SequentialBuilder, GroupChatBuilder
After:
from agent_framework.orchestrations import SequentialBuilder, GroupChatBuilder
🟡 Lang andauernde Hintergrundantworten und Fortsetzungstokens
PR:#3808
Hintergrundantworten werden jetzt für die Ausführung von Python-Agenten durch options={"background": True} und continuation_token unterstützt.
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})
🟡 Vorschautypen für Sitzungs-/Kontextanbieter, die nebeneinander hinzugefügt wurden
PR:#3763
Neue Sitzungs-/Kontextpipelinetypen wurden zusammen mit älteren APIs für die inkrementelle Migration eingeführt, einschließlich SessionContext und BaseContextProvider.
🟡 Code-Interpreter-Streaming umfasst jetzt inkrementelle Code-Deltas
PR:#3775
Streaming-Code-Interpreter führt jetzt Aktualisierungen von Codedelta in den gestreamten Inhalten aus, damit UIs generierten Code schrittweise rendern können.
🟡
@tool unterstützt die explizite Schemabehandlung
PR:#3734
Tooldefinitionen können jetzt die explizite Schemabehandlung verwenden, wenn die abgeleitete Schemaausgabe Anpassungen benötigt.
python-1.0.0b260130 (30. Januar 2026)
Versionshinweise:python-1.0.0b260130
🟡
ChatOptions und ChatResponse/AgentResponse jetzt standardisiert im Hinblick auf das Antwortformat
PR:#3305
ChatOptions, ChatResponseund AgentResponse sind jetzt generische Typen parametrisiert durch den Antwortformattyp. Dies ermöglicht eine bessere Typinferenz beim Verwenden strukturierter Ausgaben mit response_format.
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!)
Tipp
Dies ist eine ungebrochene Verbesserung. Vorhandener Code ohne Typparameter funktioniert weiterhin. Sie müssen die Typen im codeausschnitt oben nicht für die Optionen und Antworten angeben. Sie werden hier zur Übersichtlichkeit gezeigt.
🟡
BaseAgent Unterstützung für Claude Agent SDK hinzugefügt
PR:#3509
Das Python SDK enthält jetzt eine BaseAgent Implementierung für das Claude Agent SDK und ermöglicht eine erstklassige, Adapter-basierte Nutzung im Agent Framework.
python-1.0.0b260128 (28. Januar 2026)
Versionshinweise:python-1.0.0b260128
🔴
AIFunction umbenannt in FunctionTool und @ai_function umbenannt in @tool
PR:#3413
Die Klasse und der Dekorateur wurden für Klarheit und Konsistenz mit der Branchenterminologie umbenannt.
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)
🔴 Fabrikmuster zu GroupChat und Magentic hinzugefügt; API-Umbenennungen
PR:#3224
Teilnehmerfabrik und Orchestratorfabrik zum Gruppenchat hinzugefügt. Enthält auch Umbenennungen:
-
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 umbenannt in GitHub
PR:#3486
Klassen- und Paketnamen wurden aktualisiert, um die korrekte Groß-/Kleinschreibung widerzuspiegeln.
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. Januar 2026)
Versionshinweise:python-1.0.0b260127
🟡
BaseAgent Unterstützung für GitHub Copilot SDK hinzugefügt
PR:#3404
Das Python SDK enthält jetzt eine BaseAgent Implementierung für GitHub Copilot SDK-Integrationen.
python-1.0.0b260123 (23. Januar 2026)
Versionshinweise:python-1.0.0b260123
🔴 Inhaltstypen, die in eine einzelne Klasse mit Klassenmethodkonstruktoren vereinfacht wurden
PR:#3252
Alle alten Inhaltstypen (abgeleitet von BaseContent) durch eine einzelne Content Klasse durch Klassenmethoden ersetzt, um bestimmte Typen zu erstellen.
Vollständige Migrationsreferenz
| Alter Typ | Neue Methode |
|---|---|
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(...) |
Zusätzliche neue Methoden (kein direkter Vorgänger):
-
Content.from_text_reasoning(...)— Zum Nachdenken anregende Inhalte -
Content.from_hosted_vector_store(...)— Für Vektorspeicherverweise -
Content.from_usage(...)— Für Nutzungs-/Tokeninformationen -
Content.from_mcp_server_tool_call(...)/Content.from_mcp_server_tool_result(...)— Für MCP-Servertools -
Content.from_code_interpreter_tool_call(...)/Content.from_code_interpreter_tool_result(...)— Für Codedolmetscher -
Content.from_image_generation_tool_call(...)/Content.from_image_generation_tool_result(...)— Für die Bildgenerierung
Typüberprüfung
Verwenden Sie anstelle von isinstance() Überprüfungen die type Eigenschaft:
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)
Einfaches Beispiel
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")
🔴 Anmerkungstypen vereinfacht zu Annotation und TextSpanRegion TypedDicts
PR:#3252
Klassenbasierte Anmerkungstypen wurden durch einfachere TypedDict Definitionen ersetzt.
| Alter Typ | Neuer Typ |
|---|---|
CitationAnnotation (Klasse) |
Annotation (TypedDict mit type="citation") |
BaseAnnotation (Klasse) |
Annotation (TypedDict) |
TextSpanRegion (Klasse mit SerializationMixin) |
TextSpanRegion (TypedDict) |
Annotations (Typ-Alias) |
Annotation |
AnnotatedRegions (Typ-Alias) |
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"
}
Hinweis
Da Annotation und TextSpanRegion sind jetzt TypedDicts, erstellen Sie sie als Wörterbücher und nicht als Klasseninstanzen.
🔴
response_format Überprüfungsfehler sind jetzt für Benutzer sichtbar
PR:#3274
ChatResponse.value und AgentResponse.value lösen jetzt ValidationError aus, wenn die Schemasvalidierung fehlschlägt, anstatt leise None zurückzugeben.
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)
🔴 AG-UI-Ausführungslogik wurde vereinfacht; MCP- und Anthropic-Client-Fehlerbehebungen.
PR:#3322
Die run Methodensignatur und das Verhalten in AG-UI wurden vereinfacht.
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
)
🟡 Anthropic Client unterstützt response_format jetzt strukturierte Ausgaben
PR:#3301
Sie können jetzt die strukturierte Ausgabeverarbeitung mit Anthropic-Clients über response_format verwenden, ähnlich wie OpenAI- und Azure-Clients.
🟡 Azure AI-Konfiguration erweitert (reasoning, rai_config)
Die Azure AI-Unterstützung wurde durch die Unterstützung der Begründungskonfiguration und rai_config während der Agenterstellung erweitert.
python-1.0.0b260116 (16. Januar 2026)
Versionshinweise:python-1.0.0b260116
🔴
create_agent umbenannt in as_agent
PR:#3249
Die Methode wurde umbenannt, um den Zweck besser zu verdeutlichen.
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 umbenannt in executor_id
PR:#3166
Eigenschaft wurde für API-Konsistenz umbenannt.
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 unterstützt die dienstverwaltete Sitzungskontinuität.
PR:#3136
AG-UI behält nun die Identität von Dienstverwalteten Unterhaltungen (z. B. von Foundry verwaltete Sessions/Threads) bei, um die Multi-Turn-Kontinuität aufrechtzuerhalten.
python-1.0.0b260114 (14. Januar 2026)
Versionshinweise:python-1.0.0b260114
🔴 Orchestrierungen umgestaltet
PR:#3023
Umfassende Umgestaltung und Vereinfachung von Orchestrierungen in Agent Framework-Workflows:
-
Gruppenchat: Orchestrator-Executor in dedizierte agentenbasierte und funktionsbasierte Komponenten aufteilen (
BaseGroupChatOrchestrator,GroupChatOrchestrator,AgentBasedGroupChatOrchestrator). Vereinfacht auf Stern-Topologie mit Broadcast-Modell. -
Handoff: Unterstützung für Single-Tier, Koordinator und benutzerdefinierten Executor entfernt. Zum Übertragungsmodell mit
HandoffAgentExecutorübergegangen. -
Sequenziell und gleichzeitig: Vereinfachter Anforderungsinformationsmechanismus für die Verwendung von Unterworkflows über
AgentApprovalExecutorundAgentRequestInfoExecutor.
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]
)
🔴 Als TypedDict und Generic eingeführte Optionen
PR:#3140
Optionen werden jetzt mit TypedDict typisiert, um eine bessere Typsicherheit und IDE-Autocomplete zu ermöglichen.
📖 Vollständige Migrationsanweisungen finden Sie im Handbuch für typierte Optionen.
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 entfernt; context_provider in den Singular geändert; middleware muss Liste sein
PR:#3139
-
display_nameParameter, der von Agenten entfernt wurde -
context_providers(Plural, Akzeptierte Liste) geändert incontext_provider(Singular, nur 1 zulässig) -
middlewareerfordert jetzt eine Liste (keine einzelne Instanz mehr akzeptiert) -
AggregateContextProvideraus Code entfernt (bei Bedarf Beispielimplementierung verwenden)
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* umbenannt in AgentResponse*
PR:#3207
AgentRunResponse und AgentRunResponseUpdate wurden umbenannt in AgentResponse und AgentResponseUpdate.
Before:
from agent_framework import AgentRunResponse, AgentRunResponseUpdate
After:
from agent_framework import AgentResponse, AgentResponseUpdate
🟡 Deklarative Workflowlaufzeit für YAML-definierte Workflows hinzugefügt
PR:#2815
Zum Ausführen deklarativer YAML-Workflows wurde eine graphbasierte Laufzeit hinzugefügt, die die Multi-Agent-Orchestrierung ohne benutzerdefinierten Laufzeitcode ermöglicht.
🟡 Verbesserungen bei der Ladezuverlässigkeit von MCP
PR:#3154
MCP-Integrationen haben ein verbessertes Verbindungsverlustverhalten, Paginierungsunterstützung beim Laden und Darstellungssteuerungsoptionen gewonnen.
🟡 Foundry A2ATool unterstützt jetzt Verbindungen ohne Ziel-URL
PR:#3127
A2ATool kann jetzt Foundry-gestützte A2A-Verbindungen über Projektverbindungsmetadaten ermöglichen, auch wenn eine direkte Ziel-URL nicht konfiguriert ist.
python-1.0.0b260107 (7. Januar 2026)
Versionshinweise:python-1.0.0b260107
Keine signifikanten Änderungen in dieser Version.
python-1.0.0b260106 (6. Januar 2026)
Versionshinweise:python-1.0.0b260106
Keine signifikanten Änderungen in dieser Version.
Zusammenfassungstabelle
| Freigabe | Veröffentlichungshinweise | Typ | Veränderung | PR |
|---|---|---|---|---|
| 1.0.0 | Nur PR | 🔴 Unterbrechung |
Message(..., text=...)Die Konstruktion ist vollständig entfernt; erstellen Sie stattdessen Textnachrichten mit contents=[...] |
#5062 |
| 1.0.0 | Nur PR | 🟡 Verbesserung | Veröffentlichte Python-Pakete (agent-framework, agent-framework-core, agent-framework-openai, agent-framework-foundry) benötigen --pre nicht mehr; Beta-Konnektoren benötigen es jedoch weiterhin |
#5062 |
| 1.0.0 | Nur PR | 🔴 Unterbrechung | Python-Einbettungen verschoben in agent_framework.foundry; verwenden agent-framework-foundry, FoundryEmbeddingClientund FOUNDRY_MODELS_* Einstellungen anstelle des entfernten agent-framework-azure-ai Pakets |
#5056 |
| 1.0.0 | Nur PR | 🔴 Unterbrechung |
workflow.run() verwendet jetzt explizite function_invocation_kwargs / client_kwargs, wobei die globale versus pro-Executor-Zielbestimmung durch die Executor-IDs festgelegt wird. |
#5010 |
| 1.0.0 | Nur PR | 🟡 Verbesserung |
GitHubCopilotAgent ruft jetzt Kontextanbieter-Hooks before_run / after_run auf und enthält vom Anbieter hinzugefügten Eingabeaufforderungskontext. |
#5013 |
| 1.0.0 | Nur PR | 🟡 Verbesserung | Die strukturierte Python-Ausgabe akzeptiert jetzt JSON-Schemazuordnungen als response_format, mit analysierter JSON-Oberfläche auf response.value |
#5022 |
| 1.0.0rc6 | Nur PR | 🔴 Unterbrechung | Veraltete Azure/OpenAI-Kompatibilitätsoberflächen wurden entfernt; verwenden Sie stattdessen anbieterführende OpenAI-Clients oder Foundry Python-Clients | #4990 |
| 1.0.0rc6 | Nur PR | 🔴 Unterbrechung | Anbieterführende Umgestaltung: aufteilen agent-framework-openai, agent-framework-foundry und agent-framework-foundry-local; Umbenennen der OpenAI-Clients; Verschieben von Foundry in agent_framework.foundry; Veraltende Azure AI- und Assistants-Kompatibilitätspfade. |
#4818 |
| 1.0.0rc6 | Nur PR | 🔴 Unterbrechung |
agent-framework-core ist jetzt absichtlich schlank; installieren Sie explizite Anbieterpakete wie agent-framework-openai oder agent-framework-foundry, und installieren Sie mcp manuell für MCP-Tools bei minimalen Installationen, oder verwenden Sie das agent-framework Metapaket für die umfassendere Standardumgebung. |
#4904 |
| 1.0.0rc6 | Nur PR | 🔴 Unterbrechung | Generische agent_framework.openai-Clients bevorzugen jetzt explizite Routingsignale; OpenAI bleibt bei OpenAI, wenn OPENAI_API_KEY festgelegt ist, und Azure-Szenarien sollten explizite Azure-Routingeingaben wie credential oder azure_endpoint übergeben, um dann api_version zu konfigurieren. |
#4925 |
| 1.0.0rc5 / 1.0.0b260318 | N/A (geplant) | 🔴 Unterbrechung | Öffentliche Laufzeit-Kwargs werden in function_invocation_kwargs und client_kwargs aufgeteilt; Werkzeuge verwenden jetzt FunctionInvocationContext / ctx.session. |
#4581 |
| 1.0.0rc4 / 1.0.0b260311 | Hinweise | 🔴 Unterbrechung | Azure AI-Integrationen zielen jetzt auf 2.0 GA ab azure-ai-projects ; foundry_features wurde entfernt und allow_preview ist die Vorschau-Opt-In. |
#4536 |
| 1.0.0rc4 / 1.0.0b260311 | Hinweise | 🔴 Unterbrechung | GitHub Copilot-Integration verwendet jetzt ToolInvocation / ToolResult; agent-framework-github-copilot erfordert Python 3.11+ |
#4551 |
| 1.0.0rc3 / 1.0.0b260304 | Hinweise | 🔴 Unterbrechung | Der Kompetenzanbieter fügt codedefiniert Skill / SkillResourcehinzu; ältere FileAgentSkillsProvider Importe und Backtick-Ressourcenverweise müssen aktualisiert werden. |
#4387 |
| 1.0.0rc2 / 1.0.0b260226 | Hinweise | 🔴 Unterbrechung | Deklarative Workflows ersetzen InvokeTool durch InvokeFunctionTool und WorkflowFactory.register_tool() |
#3716 |
| 1.0.0rc1 / 1.0.0b260219 | Hinweise | 🔴 Unterbrechung | Einheitliche Verwaltung von Azure-Anmeldeinformationen über Azure-Pakete hinweg | #4088 |
| 1.0.0rc1 / 1.0.0b260219 | Hinweise | 🔴 Unterbrechung | Python-Ausnahmehierarchie neu gestaltet unter AgentFrameworkException |
#4082 |
| 1.0.0rc1 / 1.0.0b260219 | Hinweise | 🔴 Unterbrechung | Der Anbieterstatus ist jetzt festgelegt durch source_id |
#3995 |
| 1.0.0rc1 / 1.0.0b260219 | Hinweise | 🔴 Unterbrechung | Benutzerdefinierte get_response() Implementierungen müssen akzeptieren Sequence[Message] |
#3920 |
| 1.0.0rc1 / 1.0.0b260219 | Hinweise | 🔴 Unterbrechung |
FunctionTool[Any] Schema-Passthrough-Shim entfernt |
#3907 |
| 1.0.0rc1 / 1.0.0b260219 | Hinweise | 🔴 Unterbrechung | Einstellungen verschoben von AFBaseSettings / pydantic-settings zu TypedDict + load_settings() |
#3843, #4032 |
| 1.0.0rc1 / 1.0.0b260219 | Hinweise | 🟡 Verbesserung | Die Übergabe des Reasoning-Modell-Workflows und die Verlaufshistorien-Serialisierung wurden behoben. | #4083 |
| 1.0.0rc1 / 1.0.0b260219 | Hinweise | 🟡 Verbesserung | Bedrock hinzugefügt zu core[all]; Toolauswahl-Standardwerte behoben |
#3953 |
| 1.0.0rc1 / 1.0.0b260219 | Hinweise | 🟡 Verbesserung |
AzureAIClient warnt bei nicht unterstützten Laufzeitüberschreibungen |
#3919 |
| 1.0.0rc1 / 1.0.0b260219 | Hinweise | 🟡 Verbesserung |
workflow.as_agent() setzt lokalen Verlauf ein, wenn keine Anbieter festgelegt sind |
#3918 |
| 1.0.0rc1 / 1.0.0b260219 | Hinweise | 🟡 Verbesserung | OpenTelemetry-Ablaufverfolgungskontext wird an MCP-Anforderungen weitergegeben | #3780 |
| 1.0.0rc1 / 1.0.0b260219 | Hinweise | 🟡 Verbesserung | Dauerhafte Workflowunterstützung für Azure Functions hinzugefügt | #3630 |
| 1.0.0b260212 | Hinweise | 🔴 Unterbrechung |
Hosted*ToolKlassen entfernt; Erstellung von gehosteten Tools mittels Client-Methodenget_*_tool() |
#3634 |
| 1.0.0b260212 | Hinweise | 🔴 Unterbrechung | Die Pipeline des Sitzungs-/Kontextanbieters wurde abgeschlossen: AgentThread entfernt, verwenden AgentSession + context_providers |
#3850 |
| 1.0.0b260212 | Hinweise | 🔴 Unterbrechung | Prüfpunktmodell/Speicherumgestaltung (workflow_id entfernt, previous_checkpoint_id hinzugefügt, Speicherverhalten geändert) |
#3744 |
| 1.0.0b260212 | Hinweise | 🟡 Verbesserung |
AzureOpenAIResponsesClient kann aus dem Foundry-Projekt-Endpunkt erstellt werden oder AIProjectClient |
#3814 |
| 1.0.0b260212 | Hinweise | 🔴 Unterbrechung | Die Middleware-Fortsetzung akzeptiert context nicht mehr; aktualisieren Sie call_next(context) auf call_next() |
#3829 |
| 1.0.0b260210 | Hinweise | 🔴 Unterbrechung |
send_responses()
/
send_responses_streaming() Entfernt; Verwenden workflow.run(responses=...) |
#3720 |
| 1.0.0b260210 | Hinweise | 🔴 Unterbrechung |
SharedState → State; Workflowstatus-APIs sind synchron und das Prüfpunktstatusfeld wurde umbenannt. |
#3667 |
| 1.0.0b260210 | Hinweise | 🔴 Unterbrechung | Orchestrierungs-Tools wurden in das Paket agent_framework.orchestrations verschoben |
#3685 |
| 1.0.0b260210 | Hinweise | 🟡 Verbesserung | Hintergrundantworten und continuation_token-Unterstützung wurden zu Python-Agentenantworten hinzugefügt. |
#3808 |
| 1.0.0b260210 | Hinweise | 🟡 Verbesserung | Sitzungs-/Kontextvorschautypen, die nebeneinander hinzugefügt wurden (SessionContext, BaseContextProvider) |
#3763 |
| 1.0.0b260210 | Hinweise | 🟡 Verbesserung | Streaming-Code-Interpreter-Updates enthalten jetzt inkrementelle Codedelta | #3775 |
| 1.0.0b260210 | Hinweise | 🟡 Verbesserung |
@tool Decorator fügt explizite Unterstützung für die Schemabehandlung hinzu |
#3734 |
| 1.0.0b260210 | Hinweise | 🔴 Unterbrechung |
register_executor()
/
register_agent() entfernt von WorkflowBuilder; nutzen Sie Instanzen direkt und verwenden Sie Hilfsmethoden zur Zustandsisolierung. |
#3781 |
| 1.0.0b260210 | Hinweise | 🔴 Unterbrechung |
ChatAgent, Agent → ChatMessage, Message → RawChatAgent, RawAgent → ChatClientProtocol, SupportsChatGetResponse |
#3747 |
| 1.0.0b260210 | Hinweise | 🔴 Unterbrechung | Überprüfung der Typen-API: Role/FinishReason Typänderungen, Verschärfung des Antwort-/Update-Konstruktors, Umbenennung von Hilfsprogrammen in from_updates, und Entfernung von try_parse_value |
#3647 |
| 1.0.0b260210 | Hinweise | 🔴 Unterbrechung | Vereinheitlichte APIs rund um run/get_response und ResponseStream |
#3379 |
| 1.0.0b260210 | Hinweise | 🔴 Unterbrechung |
AgentRunContext umbenannt in AgentContext |
#3714 |
| 1.0.0b260210 | Hinweise | 🔴 Unterbrechung |
AgentProtocol umbenannt in SupportsAgentRun |
#3717 |
| 1.0.0b260210 | Hinweise | 🔴 Unterbrechung | Middleware-Parameter next umbenannt in call_next |
#3735 |
| 1.0.0b260210 | Hinweise | 🔴 Unterbrechung | TypeVar-Benennung standardisiert (TName → NameT) |
#3770 |
| 1.0.0b260210 | Hinweise | 🔴 Unterbrechung | Workflow-as-Agent-Ausgabe-/Datenstromverhalten, das am aktuellen Agent-Antwortfluss ausgerichtet ist | #3649 |
| 1.0.0b260210 | Hinweise | 🔴 Unterbrechung | Fluent Builder-Methoden wurden in Konstruktorparameter bei 6 Buildern verschoben. | #3693 |
| 1.0.0b260210 | Hinweise | 🔴 Unterbrechung | Workflow-Ereignisse in einem einzigen WorkflowEvent mit type Diskriminator vereinheitlicht; isinstance() → event.type == "..." |
#3690 |
| 1.0.0b260130 | Hinweise | 🟡 Verbesserung |
ChatOptions
/
ChatResponse
/
AgentResponse generisches Überantwortformat |
#3305 |
| 1.0.0b260130 | Hinweise | 🟡 Verbesserung |
BaseAgent Unterstützung für Claude Agent SDK-Integrationen hinzugefügt |
#3509 |
| 1.0.0b260128 | Hinweise | 🔴 Unterbrechung |
AIFunction → FunctionTool, @ai_function → @tool |
#3413 |
| 1.0.0b260128 | Hinweise | 🔴 Unterbrechung | Factory pattern für GroupChat/Magentic; with_standard_manager → with_manager, participant_factories → register_participant |
#3224 |
| 1.0.0b260128 | Hinweise | 🔴 Unterbrechung |
Github → GitHub |
#3486 |
| 1.0.0b260127 | Hinweise | 🟡 Verbesserung |
BaseAgent Unterstützung für GitHub Copilot SDK-Integrationen hinzugefügt |
#3404 |
| 1.0.0b260123 | Hinweise | 🔴 Unterbrechung | Inhaltstypen werden zu einer einzelnen Content Klasse mit Klassenmethoden konsolidiert. |
#3252 |
| 1.0.0b260123 | Hinweise | 🔴 Unterbrechung |
response_format Überprüfungsfehler lösen jetzt aus ValidationError |
#3274 |
| 1.0.0b260123 | Hinweise | 🔴 Unterbrechung | AG-UI vereinfachte Ausführungslogik | #3322 |
| 1.0.0b260123 | Hinweise | 🟡 Verbesserung | Anthropic Client bietet response_format Unterstützung für strukturierte Ausgaben |
#3301 |
| 1.0.0b260123 | Hinweise | 🟡 Verbesserung | Azure AI-Konfiguration mit Unterstützung für reasoning und rai_config erweitert |
#3403, #3265 |
| 1.0.0b260116 | Hinweise | 🔴 Unterbrechung |
create_agent → as_agent |
#3249 |
| 1.0.0b260116 | Hinweise | 🔴 Unterbrechung |
source_executor_id → executor_id |
#3166 |
| 1.0.0b260116 | Hinweise | 🟡 Verbesserung | AG-UI unterstützt dienstverwaltete Sitzungs-/Threadkontinuität | #3136 |
| 1.0.0b260114 | Hinweise | 🔴 Unterbrechung | Orchestrierungen umgestaltet (GroupChat, Handoff, Sequenziell, gleichzeitig) | #3023 |
| 1.0.0b260114 | Hinweise | 🔴 Unterbrechung | Optionen als "TypedDict" und "Generic" | #3140 |
| 1.0.0b260114 | Hinweise | 🔴 Unterbrechung |
display_name Entfernt; context_providerscontext_provider → (Singular); middleware muss eine Liste sein |
#3139 |
| 1.0.0b260114 | Hinweise | 🔴 Unterbrechung |
AgentRunResponse
/
AgentRunResponseUpdate umbenannt in AgentResponse/AgentResponseUpdate |
#3207 |
| 1.0.0b260114 | Hinweise | 🟡 Verbesserung | Deklarative Workflowlaufzeit für YAML-definierte Workflows hinzugefügt | #2815 |
| 1.0.0b260114 | Hinweise | 🟡 Verbesserung | Verbesserungen bei Lade- und Zuverlässigkeit von MCP (Verbindungsverlustbehandlung, Paginierung, Darstellungsoptionen) | #3154 |
| 1.0.0b260114 | Hinweise | 🟡 Verbesserung | Foundry A2ATool unterstützt Verbindungen ohne explizite Ziel-URL |
#3127 |
| 1.0.0b260107 | Hinweise | — | Keine signifikanten Änderungen | — |
| 1.0.0b260106 | Hinweise | — | Keine signifikanten Änderungen | — |