Bagikan melalui


Panduan Perubahan Signifikan Python 2026

Dokumen ini mencantumkan semua perubahan signifikan dalam rilis Python sejak awal 2026, termasuk perubahan yang merusak dan peningkatan penting yang bisa memengaruhi kode Anda. Setiap perubahan ditandai sebagai:

  • 🔴 Melanggar — Memerlukan perubahan kode untuk ditingkatkan
  • 🟡 Peningkatan — Kemampuan atau peningkatan baru; kode yang ada terus berfungsi

Dokumen ini akan dihapus setelah kita mencapai rilis stabil 1.0.0, jadi silakan merujuknya saat meningkatkan antar versi pada tahun 2026 untuk memastikan Anda tidak melewatkan perubahan penting apa pun. Untuk instruksi peningkatan terperinci tentang topik tertentu (misalnya, migrasi opsi), lihat panduan peningkatan tertaut atau PR yang ditautkan.


python-1.0.0rc5 / python-1.0.0b260318 (18 Maret 2026)

Rilis: Dijadwalkan untuk 18 Maret 2026. agent-framework-core dan agent-framework-azure-ai pindah ke 1.0.0rc5; paket Python yang tersisa selaras pada baris build Maret 2026 (1.0.0b260318).

🔴 Kwarg runtime publik dibagi menjadi wadah eksplisit

PR:#4581

Agen Python publik dan API percakapan tidak lagi memperlakukan penerusan publik menyeluruh **kwargs sebagai mekanisme data runtime utama. Nilai runtime sekarang dibagi berdasarkan tujuan:

  • Gunakan function_invocation_kwargs untuk nilai yang hanya akan dilihat oleh alat-alat atau middleware untuk fungsi.
  • Gunakan client_kwargs untuk kwarg lapisan klien dan konfigurasi middleware klien.
  • Akses data alat/runtime melalui FunctionInvocationContext (ctx.kwargs dan ctx.session).
  • Tentukan alat dengan parameter konteks yang disuntikkan alih-alih **kwargs; parameter konteks yang disuntikkan tidak ditampilkan dalam skema yang dilihat model.
  • Saat mendelegasikan ke sub-agen sebagai alat bantu, gunakan agent.as_tool(propagate_session=True) jika agen anak harus berbagi sesi pemanggil.

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",
    },
)

Jika Anda menerapkan publik run() atau get_response() metode kustom, tambahkan function_invocation_kwargs dan client_kwargs ke tanda tangan tersebut. Untuk alat, lebih suka parameter yang dianotasi sebagai FunctionInvocationContext - dapat diberi nama ctx, context, atau nama anotasi lainnya. Jika Anda memberikan model skema/input eksplisit, parameter yang tidak dianotasikan biasa bernama ctx juga dikenali. Objek konteks yang sama tersedia untuk middleware fungsi, dan merupakan tempat dimana kwargs fungsi runtime serta status sesi sekarang berada. Definisi alat yang masih mengandalkan **kwargs hanya menggunakan jalur kompatibilitas warisan dan akan dihapus.


python-1.0.0rc4 / python-1.0.0b260311 (11 Maret 2026)

Catatan Rilis:python-1.0.0rc4

🔴 Integrasi Azure AI sekarang memfokuskan pada azure-ai-projects 2.0 GA

PR:#4536

Integrasi Python dengan Azure AI sekarang menerapkan antarmuka GA 2.0 azure-ai-projects.

  • Rentang dependensi yang didukung sekarang azure-ai-projects>=2.0.0,<3.0.
  • foundry_features passthrough telah dihapus dari pembuatan agen Azure AI.
  • Perilaku pratinjau sekarang menggunakan allow_preview=True pada klien/penyedia yang didukung.
  • Kompabilitas shim beta/GA yang dicampur telah dihapus, sehingga pastikan untuk memperbarui semua impor dan nama tipe sesuai dengan spesifikasi SDK GA 2.0.

🔴 Pengendali alat GitHub Copilot sekarang menggunakan ToolInvocation / ToolResult dan Python 3.11+

PR:#4551

agent-framework-github-copilot sekarang memantau github-copilot-sdk>=0.1.32.

  • Penangan alat menerima ToolInvocation klasifikasi data alih-alih mentah dict.
  • Mengembalikan ToolResult menggunakan bidang snake_case seperti result_type dan text_result_for_llm.
  • Paket agent-framework-github-copilot sekarang memerlukan 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 Maret 2026)

Catatan Rilis:python-1.0.0rc3

🔴 Penyedia keterampilan menyelesaikan seputar struktur yang ditentukan oleh kode Skill / SkillResource

PR:#4387

Python Agent Skills sekarang mendukung objek yang ditentukan kode Skill dan SkillResource serta kemampuan berbasis file, dan antarmuka penyedia publik distandarisasi dengan SkillsProvider.

  • Jika Anda masih mengimpor pratinjau/internal FileAgentSkillsProvideryang lebih lama, beralihlah ke SkillsProvider.
  • Pencarian sumber daya berbasis file tidak lagi bergantung pada referensi yang dikutip backtick di SKILL.md; sumber daya ditemukan dari direktori keterampilan sebagai gantinya.

Jika Anda memiliki pratinjau/kode internal yang diimpor FileAgentSkillsProvider, beralihlah ke antarmuka publik saat ini.

from agent_framework import Skill, SkillResource, SkillsProvider

python-1.0.0rc2 / python-1.0.0b260226 (26 Februari 2026)

Catatan Rilis:Python-1.0.0rc2

🔴 Alur kerja deklaratif diganti InvokeTool dengan InvokeFunctionTool

PR:#3716

Alur kerja Python deklaratif tidak lagi menggunakan jenis tindakan lama InvokeTool . Ganti dengan InvokeFunctionTool dan daftarkan panggilan Python dengan 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 Februari 2026)

Rilis:agent-framework-core dan agent-framework-azure-ai dipromosikan ke 1.0.0rc1. Semua paket lain diperbarui ke 1.0.0b260219.

🔴 Penanganan kredensial Azure terpadu di semua paket

PR:#4088

Parameter / pembantu ad_token, ad_token_provider, dan get_entra_auth_token telah diganti dengan parameter terpadu credential di semua paket Python terkait Azure. Pendekatan baru menggunakan azure.identity.get_bearer_token_provider untuk penyimpanan sementara dan penyegaran token otomatis.

Kelas yang terpengaruh:AzureOpenAIChatClient, AzureOpenAIResponsesClient, AzureOpenAIAssistantsClient, AzureAIClient, AzureAIAgentClient, AzureAIProjectAgentProvider, AzureAIAgentsProvider, AzureAISearchContextProvider, PurviewClient, 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(),
    ...
)

Parameter credential menerima TokenCredential, , AsyncTokenCredentialatau penyedia token yang dapat dipanggil. Pen-caching-an dan refresh token ditangani secara otomatis.


🔴 Hierarki pengecualian Python yang didesain ulang

PR:#4082

Keluarga datar dari tipe ServiceException telah diganti dengan cabang pengecualian cakupan domain di bawah satu akar AgentFrameworkException. Ini memberi pemanggil target yang tepat except serta semantik kesalahan yang jelas.

Hierarki baru:

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

Pengecualian yang dihapus: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
    ...

Nota

Kesalahan validasi init sekarang menggunakan ValueError/TypeError bawaan daripada pengecualian kustom. Pengecualian Kerangka Kerja Agen dicadangkan untuk kegagalan tingkat domain.


🔴 Status penyedia yang dicakup oleh source_id

PR:#3995

Pengait penyedia sekarang menerima kamus status yang berskala penyedia (state.setdefault(provider.source_id, {})) alih-alih status sesi penuh. Ini berarti implementasi penyedia yang sebelumnya mengakses status berlapis melalui state[self.source_id]["key"] sekarang harus mengakses state["key"] secara langsung.

Selain itu, InMemoryHistoryProvider default source_id berubah dari "memory" ke "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")

🔴 Pengaturan pengetikan pesan yang diketik oleh obrolan/agen (run vs get_response)

PR:#3920

Implementasi chat-client get_response sekarang secara konsisten menerima Sequence[Message]. agent.run(...) tetap fleksibel (str, Content, , Messageatau urutannya), dan menormalkan input sebelum memanggil klien obrolan.

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] pengaturan generik dihapus untuk penerusan skema

PR:#3907

Jalur alat berbasis skema tidak lagi bergantung pada perilaku generik sebelumnya FunctionTool[Any] . Gunakan FunctionTool secara langsung dan berikan skema pydantic BaseModel atau eksplisit jika diperlukan (misalnya, dengan @tool(schema=...)).

Before:

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

After:

placeholder: FunctionTool = FunctionTool(...)

🔴 Pengaturan Pydantic diganti dengan TypedDict + load_settings()

PRs:#3843, #4032

Kelas pydantic-settingsberbasis AFBaseSettings telah diganti dengan sistem pengaturan ringan berbasis fungsi menggunakan TypedDict dan load_settings(). Dependensi pydantic-settings dihapus sepenuhnya.

Semua kelas pengaturan (misalnya, OpenAISettings, , AzureOpenAISettings) AnthropicSettingssekarang TypedDict merupakan definisi, dan nilai pengaturan diakses melalui sintaks kamus alih-alih akses atribut.

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_id = settings["model_id"]

Penting

Kerangka Kerja Agen tidak secara otomatis memuat nilai dari .env file. Anda harus secara eksplisit memilih untuk berpartisipasi dalam .env pemuatan dengan:

  • Memanggil load_dotenv() dari paket python-dotenv di awal aplikasi Anda
  • Meneruskan env_file_path=".env" ke load_settings()
  • Mengatur variabel lingkungan langsung di shell atau IDE Anda

Urutan resolusi adalah: penggantian eksplisit → nilai berkas load_settings (ketika .env disediakan) → variabel lingkungan → nilai-nilai bawaan. Jika Anda menentukan env_file_path, file harus ada atau FileNotFoundError dinaikkan.


🟡 Memperbaiki pengalihan alur kerja model penalaran dan pencatatan riwayat

PR:#4083

Memperbaiki beberapa kegagalan saat menggunakan model penalaran (misalnya, gpt-5-mini, gpt-5.2) dalam alur kerja multi-agen. Item alasan dari API Respons sekarang diserialisasikan dengan benar dan hanya dimasukkan ke dalam riwayat ketika function_call juga hadir, mencegah kesalahan API. Konten penalaran terenkripsi/tersembunyi sekarang ditampilkan dengan benar, dan format bidang summary sudah dikoreksi. Elemen service_session_id juga dibersihkan pada handoff untuk mencegah kebocoran status lintas agen.


🟡 Bedrock ditambahkan ke core[all] dan default pilihan alat diperbaiki

PR:#3953

Amazon Bedrock sekarang termasuk dalam agent-framework-core[all] ekstra dan tersedia melalui agent_framework.amazon antarmuka impor tunda. Perilaku pilihan alat juga diperbaiki: nilai pilihan alat yang tidak diatur sekarang tetap tidak diatur sehingga penyedia menggunakan default layanan mereka, sementara nilai yang ditetapkan secara eksplisit dipertahankan.

from agent_framework.amazon import BedrockClient

🟡 AzureAIClient memperingatkan tentang penimpaan runtime yang tidak didukung

PR:#3919

AzureAIClient sekarang mencatat peringatan saat runtime tools atau structured_output berbeda dari konfigurasi waktu pembuatan agen. Azure AI Agent Service tidak mendukung alat runtime atau perubahan format respons — gunakan AzureOpenAIResponsesClient sebagai gantinya jika Anda memerlukan penimpaan dinamis.


🟡 workflow.as_agent() sekarang mengatur riwayat lokal secara default ketika penyedia tidak diatur

PR:#3918

Ketika workflow.as_agent() dibuat tanpa context_providers, sekarang ditambahkan InMemoryHistoryProvider("memory") secara default. Jika penyedia konteks disediakan secara eksplisit, daftar tersebut dipertahankan tidak berubah.

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

🟡 Konteks pelacakan OpenTelemetry ditransmisikan ke permintaan MCP

PR:#3780

Ketika OpenTelemetry diinstal, konteks pelacakan (misalnya, W3C traceparent) secara otomatis dimasukkan ke dalam permintaan MCP melalui params._meta. Ini memungkinkan pelacakan terdistribusi secara end-to-end dari agen ke panggilan server MCP. Tidak ada perubahan kode yang diperlukan — ini adalah perilaku aditif yang diaktifkan ketika konteks rentang yang valid ada.


🟡 Dukungan alur kerja yang tahan lama untuk Azure Functions

PR:#3630

Paket agent-framework-azurefunctions sekarang mendukung menjalankan Workflow grafik di Azure Durable Functions. Teruskan workflow parameter ke AgentFunctionApp untuk mendaftarkan entitas agen, fungsi aktivitas, dan titik akhir HTTP secara otomatis.

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

Mendukung pola fan-out/fan-in, shared state, dan human-in-the-loop dengan batas waktu yang dapat dikonfigurasi dan penolakan otomatis pada kedaluwarsa.


python-1.0.0b260212 (12 Februari 2026)

Catatan Rilis:python-1.0.0b260212

🔴 Hosted*Toolkelas digantikan oleh metode klien get_*_tool()

PR:#3634

Kelas alat yang dihosting dihapus untuk mendukung metode pabrik dengan cakupan klien. Hal ini membuat ketersediaan alat menjadi eksplisit oleh penyedia.

Kelas yang dihapus 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()]

🔴 Alur penyedia sesi/konteks diselesaikan (AgentSession, context_providers)

PR:#3850

Sesi Python dan migrasi penyedia konteks selesai. AgentThread dan jenis penyedia konteks lama dihapus.

  • 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= pola digantikan oleh context_providers=[...]

Before:

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

After:

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

🔴 Model titik pemeriksaan dan perilaku penyimpanan direfaktor

PR:#3744

Struktur internal titik pemeriksaan didesain ulang, yang memengaruhi kompatibilitas titik pemeriksaan yang disimpan dan implementasi penyimpanan kustom.

  • WorkflowCheckpoint sekarang menyimpan objek langsung (serialisasi terjadi di penyimpanan titik pemeriksaan)
  • FileCheckpointStorage sekarang menggunakan serialisasi "pickle"
  • workflow_id telah dihapus dan previous_checkpoint_id ditambahkan
  • Hook titik pemeriksaan yang tidak digunakan lagi dihapus

Jika Anda mempertahankan titik pemeriksaan antar versi, lakukan regenerasi atau migrasikan artefak titik pemeriksaan yang ada sebelum meneruskan alur kerja.


🟡 AzureOpenAIResponsesClient mendukung titik akhir proyek Microsoft Foundry

PR:#3814

Anda sekarang dapat membuat AzureOpenAIResponsesClient dengan titik akhir proyek Foundry atau AIProjectClient, bukan hanya dengan titik akhir langsung Azure OpenAI.

from azure.identity import DefaultAzureCredential
from agent_framework.azure import AzureOpenAIResponsesClient

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

🔴 Middleware call_next tidak lagi menerima context

PR:#3829

Kelanjutan middleware sekarang tidak mengambil argumen. Jika middleware Anda masih memanggil call_next(context), perbarui ke 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 Februari 2026)

Catatan Rilis:python-1.0.0b260210

🔴 Metode pabrik alur kerja dihapus dari WorkflowBuilder

PR:#3781

register_executor() dan register_agent() telah dihapus dari WorkflowBuilder. Semua metode penyusun (add_edge, , add_fan_out_edges, add_fan_in_edgesadd_chain, add_switch_case_edge_group, add_multi_selection_edge_group) dan start_executor tidak lagi menerima nama string — mereka memerlukan instans eksekutor atau agen secara langsung.

Untuk mengisolasi status, bungkus instansiasi eksekutor/agen dan pembangunan alur kerja di dalam metode bantu sehingga setiap panggilan menghasilkan instansi baru.

WorkflowBuilder dengan pelaksana

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 dengan agen

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()

Isolasi status dengan metode pembantu

Untuk alur kerja yang membutuhkan status terisolasi per pemanggilan, bungkus konstruksi dalam metode pembantu:

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 diganti namanya menjadi Agent, ChatMessage diganti namanya menjadi Message

PR:#3747

Jenis Core Python telah disederhanakan dengan menghapus awalan redundan Chat . Tidak disediakan alias untuk kompatibilitas mundur.

Sebelumnya Setelahnya
ChatAgent Agent
RawChatAgent RawAgent
ChatMessage Message
ChatClientProtocol SupportsChatGetResponse

Memperbarui impor

Before:

from agent_framework import ChatAgent, ChatMessage

After:

from agent_framework import Agent, Message

Memperbarui referensi tipe

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")])

Nota

ChatClient, ChatResponse, ChatOptions, dan ChatMessageStoretidak namanya diubah dengan perubahan ini.


🔴 Jenis API meninjau pembaruan di seluruh model respons/pesan

PR:#3647

Rilis ini mencakup penyempurnaan pengetikan pesan/respons yang luas dan memengaruhi API pembantu.

  • Role dan FinishReason sekarang menjadi pembungkus di atas NewType menggunakan strRoleLiteral/ untuk nilai yang diketahui. Perlakukan mereka sebagai string (tanpa menggunakan .value).
  • Message konstruksi distandarisasi pada Message(role, contents=[...]); string di contents dikonversi secara otomatis ke konten teks.
  • ChatResponse dan AgentResponse konstruktor sekarang berpusat pada messages= (tunggal Message atau urutan); penggunaan konstruktor warisan text= dihapus dari respons.
  • ChatResponseUpdate dan AgentResponseUpdate tidak lagi menerima text=; gunakan contents=[Content.from_text(...)].
  • Nama asisten penggabungan pembaruan telah disederhanakan.
  • try_parse_value dihapus dari ChatResponse dan AgentResponse.

Nama metode pembantu

Sebelumnya Setelahnya
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(...)

Memperbarui konstruksi pembaruan respons

Before:

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

After:

from agent_framework import AgentResponseUpdate, Content

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

Ganti try_parse_value dengan try/except di .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}")

🔴Model dan penggunaan terpadu run/get_responseResponseStream

PR:#3379

API Python dikonsolidasikan di sekitar agent.run(...) dan client.get_response(...), dengan streaming yang diwakili oleh 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)

🔴 Perubahan nama konteks/protokol inti

PRs:#3714, #3717

Sebelumnya Setelahnya
AgentRunContext AgentContext
AgentProtocol SupportsAgentRun

Perbarui impor dan ketik anotasi yang sesuai.


🔴 Parameter kelanjutan middleware diganti namanya menjadi call_next

PR:#3735

Tanda tangan middleware sekarang harus digunakan call_next alih-alih 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)

🔴 Nama TypeVar distandarisasi (TName → NameT)

PR:#3770

Basis kode sekarang mengikuti gaya penamaan TypeVar yang konsisten di mana akhiran T digunakan.

Before:

TMessage = TypeVar("TMessage")

After:

MessageT = TypeVar("MessageT")

Jika Anda mempertahankan pembungkus khusus di sekitar generik kerangka kerja, sejajarkan nama TypeVar lokal Anda dengan konvensi baru untuk mengurangi perubahan berlebihan pada anotasi.


🔴 Output Alur Kerja Sebagai Agen dan Perubahan Streaming

PR:#3649

workflow.as_agent() perilaku diperbarui untuk menyelaraskan output dan streaming dengan pola respons agen standar. Tinjau konsumen workflow-as-agent yang bergantung pada penanganan output/pembaruan lama dan perbarui ke alur AgentResponse/AgentResponseUpdate saat ini.


🔴 Metode penyusun fasih dipindahkan ke parameter konstruktor

PR:#3693

Metode fasih konfigurasi tunggal di 6 penyusun (WorkflowBuilder, , SequentialBuilder, ConcurrentBuilderGroupChatBuilder, MagenticBuilder, HandoffBuilder) telah dimigrasikan ke parameter konstruktor. Metode fluent yang merupakan jalur konfigurasi satu-satunya untuk pengaturan dihapus untuk mendukung penggunaan argumen konstruktor.

WorkflowBuilder

set_start_executor(), with_checkpointing(), dan with_output_from() dihapus. Gunakan parameter konstruktor sebagai gantinya.

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(), dan with_intermediate_outputs() dihapus. Gunakan parameter konstruktor sebagai gantinya.

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(), dan with_intermediate_outputs() dihapus. Gunakan parameter konstruktor sebagai gantinya.

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(), dan with_intermediate_outputs() dihapus. Gunakan parameter konstruktor sebagai gantinya.

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() dan with_termination_condition() dihapus. Gunakan parameter konstruktor sebagai gantinya.

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()
)

Perubahan validasi

  • WorkflowBuilder sekarang memerlukan start_executor sebagai argumen konstruktor (sebelumnya diatur melalui metode lancar)
  • SequentialBuilder, ConcurrentBuilder, GroupChatBuilder, dan MagenticBuilder sekarang memerlukan participants atau participant_factories saat waktu konstruksi — jika keduanya tidak diberikan, maka akan memicu ValueError

Nota

HandoffBuilder sudah diterima participants/participant_factories sebagai parameter konstruktor dan tidak diubah dalam hal ini.


🔴 Peristiwa alur kerja digabungkan menjadi satu WorkflowEvent dengan type diskriminator

PR:#3690

Semua subkelas peristiwa alur kerja individual telah digantikan oleh satu kelas generik WorkflowEvent[DataT] . Alih-alih menggunakan isinstance() pemeriksaan untuk mengidentifikasi jenis peristiwa, Anda sekarang memeriksa event.type string literal (misalnya, "output", "request_info", "status"). Ini mengikuti pola serupa dengan konsolidasi kelas Content dari python-1.0.0b260123.

Kelas peristiwa yang dihapus

Subkelas peristiwa yang diekspor berikut tidak ada lagi:

Kelas Lama Nilai Baru event.type
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"

Memperbarui impor

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

Memperbarui pemeriksaan jenis peristiwa

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 dengan 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}")

Anotasi tipe

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

Nota

WorkflowEvent umum (WorkflowEvent[DataT]), tetapi untuk koleksi peristiwa campuran, gunakan WorkflowEvent[Any] atau tidak diparameterisasi WorkflowEvent.


🔴 workflow.send_responses* Dihapus; Menggunakan workflow.run(responses=...)

PR:#3720

send_responses() dan send_responses_streaming() dihapus dari Workflow. Lanjutkan alur kerja yang dijeda dengan meneruskan respons langsung ke 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 diganti namanya menjadi State; API status alur kerja sinkron

PR:#3667

API status tidak lagi memerlukan await, dan penamaan distandarkan:

Sebelumnya Setelahnya
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

🔴 Penyusun orkestrasi dipindahkan ke agent_framework.orchestrations

PR:#3685

Penyusun orkestrasi sekarang berada di namespace paket khusus.

Before:

from agent_framework import SequentialBuilder, GroupChatBuilder

After:

from agent_framework.orchestrations import SequentialBuilder, GroupChatBuilder

🟡 Proses latar belakang yang berlangsung lama dan token kelanjutan

PR:#3808

Respons latar belakang sekarang didukung untuk agen Python berjalan melalui options={"background": True} dan 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})

🟡 Jenis pratinjau penyedia sesi/konteks ditambahkan secara berdampingan

PR:#3763

Jenis alur sesi/konteks baru diperkenalkan bersama API warisan untuk migrasi inkremental, termasuk SessionContext dan BaseContextProvider.


🟡 Aliran penerjemah kode sekarang mengikutsertakan delta kode inkremental

PR:#3775

Penerjemah kode streaming sekarang menjalankan pembaruan delta kode permukaan dalam konten yang dialirkan sehingga UI dapat merender kode yang dihasilkan secara progresif.


🟡 @tool mendukung penanganan skema eksplisit

PR:#3734

Definisi alat sekarang dapat menggunakan penanganan skema eksplisit ketika output skema yang disimpulkan membutuhkan penyesuaian.


python-1.0.0b260130 (30 Januari 2026)

Catatan Rilis:python-1.0.0b260130

🟡 ChatOptions dan ChatResponse/AgentResponse sekarang generik terhadap format respons

PR:#3305

ChatOptions, ChatResponse, dan AgentResponse sekarang merupakan jenis generik yang diparameterkan oleh jenis format respons. Ini memungkinkan inferensi jenis yang lebih baik saat menggunakan output terstruktur dengan 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!)

Petunjuk / Saran

Ini adalah peningkatan yang tidak merusak. Kode yang ada tanpa parameter jenis terus berfungsi. Anda tidak perlu menentukan jenis dalam cuplikan kode di atas untuk opsi dan respons; mereka ditampilkan di sini untuk kejelasan.


🟡 BaseAgent dukungan ditambahkan untuk Claude Agent SDK

PR:#3509

Python SDK sekarang menyertakan BaseAgent implementasi untuk Claude Agent SDK, memungkinkan penggunaan berbasis adaptor kelas satu dalam Agent Framework.


python-1.0.0b260128 (28 Januari 2026)

Catatan Rilis:python-1.0.0b260128

🔴 AIFunction diganti namanya menjadi FunctionTool dan @ai_function diganti namanya menjadi @tool

PR:#3413

Kelas dan dekorator telah diganti namanya untuk kejelasan dan konsistensi dengan terminologi industri.

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)

🔴 Pola pabrik ditambahkan ke GroupChat dan Magentic; Mengganti nama API

PR:#3224

Menambahkan pabrik peserta dan pabrik orkestrator ke obrolan grup. Juga termasuk mengganti nama:

  • 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 diganti namanya menjadi GitHub

PR:#3486

Nama kelas dan paket diperbarui untuk menggunakan casing yang benar.

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 Januari 2026)

Catatan Rilis:python-1.0.0b260127

🟡 BaseAgent dukungan ditambahkan untuk GitHub Copilot SDK

PR:#3404

Python SDK sekarang memiliki BaseAgent implementasi untuk integrasi GitHub Copilot SDK.


python-1.0.0b260123 (23 Januari 2026)

Catatan Rilis:python-1.0.0b260123

🔴 Jenis konten disederhanakan ke satu kelas dengan konstruktor classmethod

PR:#3252

Mengganti semua jenis Konten lama (berasal dari BaseContent) dengan sebuah kelas Content tunggal yang menggunakan metode kelas untuk menciptakan jenis tertentu.

Referensi Migrasi Penuh

Tipe Lama Metode Baru
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(...)

Metode baru tambahan (tidak ada pendahulu langsung):

  • Content.from_text_reasoning(...) — Untuk konten penalaran/pemikiran
  • Content.from_hosted_vector_store(...) — Untuk referensi penyimpanan vektor
  • Content.from_usage(...) — Untuk informasi penggunaan/token
  • Content.from_mcp_server_tool_call(...) / Content.from_mcp_server_tool_result(...) — Untuk alat server MCP
  • Content.from_code_interpreter_tool_call(...) / Content.from_code_interpreter_tool_result(...) — Untuk penerjemah kode
  • Content.from_image_generation_tool_call(...) / Content.from_image_generation_tool_result(...) — Untuk pembuatan gambar

Pemeriksaan Jenis

Sebagai pengganti isinstance() pemeriksaan, gunakan properti 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)

Contoh Dasar

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")

🔴 Jenis anotasi disederhanakan ke Annotation dan TextSpanRegion TypedDicts

PR:#3252

Mengganti jenis anotasi berbasis kelas dengan definisi yang lebih TypedDict sederhana.

Tipe Lama Tipe Baru
CitationAnnotation (kelas) Annotation (TypedDict dengan type="citation")
BaseAnnotation (kelas) Annotation (TypedDict)
TextSpanRegion (kelas dengan SerializationMixin) TextSpanRegion (TypedDict)
Annotations (alias jenis) Annotation
AnnotatedRegions (alias jenis) 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"
}

Nota

Karena Annotation dan TextSpanRegion sekarang TypedDict, Anda membuatnya sebagai kamus daripada instans kelas.


🔴 response_format kesalahan validasi sekarang terlihat oleh pengguna

PR:#3274

ChatResponse.value dan AgentResponse.value sekarang naikkan ValidationError ketika validasi skema gagal alih-alih mengembalikan Nonesecara diam-diam .

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 menjalankan logika yang disederhanakan; Perbaikan klien MCP dan Antropis

PR:#3322

Signature metode run dan perilaku dalam AG-UI telah disederhanakan.

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
)

🟡 Klien antropis response_format sekarang mendukung output terstruktur

PR:#3301

Anda sekarang dapat menggunakan penguraian output terstruktur dengan klien Anthropic melalui response_format, mirip dengan klien OpenAI dan Azure.


🟡 Konfigurasi Azure AI diperluas (reasoning, rai_config)

PRs:#3403, #3265

Dukungan Azure AI diperluas dengan dukungan konfigurasi penalaran dan rai_config selama pembuatan agen.


python-1.0.0b260116 (16 Januari 2026)

Catatan Rilis:python-1.0.0b260116

🔴 create_agent diganti namanya menjadi as_agent

PR:#3249

Metode diganti namanya untuk kejelasan yang lebih baik pada tujuannya.

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 diganti namanya menjadi executor_id

PR:#3166

Properti diganti namanya untuk konsistensi 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 mendukung kelangsungan sesi yang dikelola layanan

PR:#3136

AG-UI sekarang mempertahankan identitas percakapan yang dikelola oleh layanan (misalnya, sesi/utas yang dikelola Foundry) untuk mempertahankan kelangsungan percakapan multi-giliran.


python-1.0.0b260114 (14 Januari 2026)

Catatan Rilis:python-1.0.0b260114

🔴 Orkestrasi diubah struktur

PR:#3023

Perombakan menyeluruh dan penyederhanaan orkestrasi dalam Alur Kerja Framework Agen.

  • Obrolan Grup: Pisahkan eksekutor orkestrator menjadi berbasis agen khusus dan berbasis fungsi (BaseGroupChatOrchestrator, GroupChatOrchestrator, AgentBasedGroupChatOrchestrator). Disederhanakan ke topologi bintang dengan model penyiaran.
  • Handoff: Menghapus dukungan tingkat tunggal, koordinator, dan pelaksana kustom. Beralih ke model penyiaran dengan HandoffAgentExecutor.
  • Berurutan & Bersamaan: Mekanisme informasi permintaan yang disederhanakan untuk bergantung pada sub-workflow melalui AgentApprovalExecutor dan AgentRequestInfoExecutor.

Before:

from agent_framework.workflows import GroupChat, HandoffOrchestrator

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

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

After:

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

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

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

🔴 Opsi yang diperkenalkan sebagai TypedDict dan Generic

PR:#3140

Opsi sekarang ditik menggunakan TypedDict untuk keamanan jenis yang lebih baik dan pelengkapan otomatis IDE.

📖 Untuk instruksi migrasi lengkap, lihat Panduan Opsi Yang Ditiru.

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_id": "gpt-4",
        "temperature": 0.7,
        "max_tokens": 1000,
    },
)

🔴 display_name Dihapus; context_provider ke tunggal; middleware harus berupa daftar

PR:#3139

  • display_name parameter dihapus dari agen
  • context_providers (plural, daftar penerimaan) diubah menjadi context_provider (tunggal, hanya 1 yang diizinkan)
  • middleware sekarang memerlukan daftar (tidak lagi menerima instans tunggal)
  • AggregateContextProvider dihapus dari kode (gunakan implementasi sampel jika diperlukan)

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* diganti namanya menjadi AgentResponse*

PR:#3207

AgentRunResponse dan AgentRunResponseUpdate diganti namanya menjadi AgentResponse dan AgentResponseUpdate.

Before:

from agent_framework import AgentRunResponse, AgentRunResponseUpdate

After:

from agent_framework import AgentResponse, AgentResponseUpdate

🟡 Runtime alur kerja deklaratif ditambahkan untuk workflow yang didefinisikan oleh YAML

PR:#2815

Runtime berbasis grafik ditambahkan untuk menjalankan alur kerja YAML deklaratif, memungkinkan orkestrasi multi-agen tanpa kode runtime kustom.


🟡 Peningkatan pemuatan/keandalan MCP

PR:#3154

Integrasi MCP mendapat peningkatan perilaku saat kehilangan koneksi, dukungan paginasi saat memuat, dan opsi kontrol representasi visual.


🟡 Foundry A2ATool sekarang mendukung koneksi tanpa URL target

PR:#3127

A2ATool sekarang dapat memproses koneksi A2A yang didukung oleh Foundry melalui metadata koneksi proyek bahkan jika URL target langsung tidak dikonfigurasi.


python-1.0.0b260107 (7 Januari 2026)

Catatan Rilis:python-1.0.0b260107

Tidak ada perubahan signifikan dalam rilis ini.


python-1.0.0b260106 (6 Januari 2026)

Catatan Rilis:python-1.0.0b260106

Tidak ada perubahan signifikan dalam rilis ini.


Tabel Ringkasan

Pelepasan Catatan Rilis Tipe Ubah PR
1.0.0rc5 / 1.0.0b260318 Tidak Tersedia (terjadwal) 🔴 Berita Terkini "Public runtime kwargs dibagi menjadi function_invocation_kwargs dan client_kwargs; alat sekarang menggunakan FunctionInvocationContext / ctx.session" #4581
1.0.0rc4 / 1.0.0b260311 Notes 🔴 Berita Terkini Pengintegrasian Azure AI sekarang menargetkan azure-ai-projects 2.0 GA; foundry_features dihapus dan allow_preview merupakan opsi pratinjau #4536
1.0.0rc4 / 1.0.0b260311 Notes 🔴 Berita Terkini Integrasi GitHub Copilot sekarang menggunakan ToolInvocation / ToolResult; agent-framework-github-copilot memerlukan Python 3.11+ #4551
1.0.0rc3 / 1.0.0b260304 Notes 🔴 Berita Terkini Penyedia keterampilan menambahkan kode yang ditentukan Skill / SkillResource; impor yang lebih lama dan referensi sumber daya backtick harus diperbarui. #4387
1.0.0rc2 / 1.0.0b260226 Notes 🔴 Berita Terkini Alur kerja deklaratif mengganti InvokeTool dengan InvokeFunctionTool dan WorkflowFactory.register_tool() #3716
1.0.0rc1 / 1.0.0b260219 Notes 🔴 Berita Terkini Penanganan kredensial Azure terpadu di seluruh paket Azure #4088
1.0.0rc1 / 1.0.0b260219 Notes 🔴 Berita Terkini Hierarki pengecualian Python didesain ulang di bawah AgentFrameworkException #4082
1.0.0rc1 / 1.0.0b260219 Notes 🔴 Berita Terkini Status penyedia sekarang dicakup oleh source_id #3995
1.0.0rc1 / 1.0.0b260219 Notes 🔴 Berita Terkini Implementasi kustom get_response() harus menerima Sequence[Message] #3920
1.0.0rc1 / 1.0.0b260219 Notes 🔴 Berita Terkini FunctionTool[Any] skema shim passthrough dihapus #3907
1.0.0rc1 / 1.0.0b260219 Notes 🔴 Berita Terkini Pengaturan dipindahkan dari AFBaseSettings / pydantic-settings ke TypedDict + load_settings() #3843, #4032
1.0.0rc1 / 1.0.0b260219 Notes 🟡 Peningkatan Perbaikan penyerahan alur kerja model penalaran dan serialisasi riwayat #4083
1.0.0rc1 / 1.0.0b260219 Notes 🟡 Peningkatan Bedrock ditambahkan ke core[all]; pilihan alat default diperbaiki #3953
1.0.0rc1 / 1.0.0b260219 Notes 🟡 Peningkatan AzureAIClient mengingatkan mengenai penggantian runtime yang tidak didukung #3919
1.0.0rc1 / 1.0.0b260219 Notes 🟡 Peningkatan workflow.as_agent() menyuntikkan riwayat lokal saat penyedia tidak diatur atau tidak disetel #3918
1.0.0rc1 / 1.0.0b260219 Notes 🟡 Peningkatan Konteks jejak OpenTelemetry diteruskan ke permintaan MCP #3780
1.0.0rc1 / 1.0.0b260219 Notes 🟡 Peningkatan Dukungan alur kerja tahan lama ditambahkan untuk Azure Functions #3630
1.0.0b260212 Notes 🔴 Berita Terkini Hosted*Toolkelas-kelas dihapus; membuat alat yang dihosting melalui metode klien get_*_tool() #3634
1.0.0b260212 Notes 🔴 Berita Terkini Alur penyedia sesi/konteks diselesaikan: AgentThread dihapus, gunakan AgentSession + context_providers #3850
1.0.0b260212 Notes 🔴 Berita Terkini Model titik pemeriksaan/refaktor penyimpanan (workflow_id dihapus, previous_checkpoint_id ditambahkan, perilaku penyimpanan berubah) #3744
1.0.0b260212 Notes 🟡 Peningkatan AzureOpenAIResponsesClient dapat dibuat dari titik akhir proyek Foundry atau AIProjectClient #3814
1.0.0b260212 Notes 🔴 Berita Terkini Kelanjutan middleware tidak lagi menerima context; perbarui call_next(context) ke call_next() #3829
1.0.0b260210 Notes 🔴 Berita Terkini send_responses() / send_responses_streaming() Dihapus; Menggunakan workflow.run(responses=...) #3720
1.0.0b260210 Notes 🔴 Berita Terkini SharedState State→ ; API status alur kerja bersifat sinkron dan bidang status titik pemeriksaan diganti namanya #3667
1.0.0b260210 Notes 🔴 Berita Terkini Penyusun orkestrasi dipindahkan ke agent_framework.orchestrations paket #3685
1.0.0b260210 Notes 🟡 Peningkatan Tanggapan latar belakang dan dukungan continuation_token ditambahkan ke tanggapan agen Python #3808
1.0.0b260210 Notes 🟡 Peningkatan Jenis pratinjau sesi/konteks ditambahkan berdampingan (SessionContext, BaseContextProvider) #3763
1.0.0b260210 Notes 🟡 Peningkatan Pembaruan penerjemah kode streaming sekarang menyertakan delta kode inkremental #3775
1.0.0b260210 Notes 🟡 Peningkatan @tool dekorator menambahkan dukungan penanganan skema eksplisit #3734
1.0.0b260210 Notes 🔴 Berita Terkini register_executor() / register_agent() dihapus dari WorkflowBuilder; gunakan instans secara langsung, metode pembantu untuk isolasi status #3781
1.0.0b260210 Notes 🔴 Berita Terkini ChatAgent → Agent, ChatMessage → Message, RawChatAgent → RawAgent, ChatClientProtocol → SupportsChatGetResponse #3747
1.0.0b260210 Notes 🔴 Berita Terkini Jenis ulasan API: Role/FinishReason perubahan jenis, pengetatan respons/pembaruan konstruktor, fungsi pembantu mengganti nama menjadi from_updates, serta penghapusan try_parse_value #3647
1.0.0b260210 Notes 🔴 Berita Terkini API terpadu di sekitar run/get_response dan ResponseStream #3379
1.0.0b260210 Notes 🔴 Berita Terkini AgentRunContext diganti namanya menjadi AgentContext #3714
1.0.0b260210 Notes 🔴 Berita Terkini AgentProtocol diganti namanya menjadi SupportsAgentRun #3717
1.0.0b260210 Notes 🔴 Berita Terkini Parameter middleware next diganti namanya menjadi call_next #3735
1.0.0b260210 Notes 🔴 Berita Terkini Penamaan TypeVar yang distandarisasi (TName → NameT) #3770
1.0.0b260210 Notes 🔴 Berita Terkini Perilaku output/aliran alur kerja sebagai agen yang selaras dengan alur respons agen saat ini #3649
1.0.0b260210 Notes 🔴 Berita Terkini Metode penyusun yang fasih dipindahkan ke parameter konstruktor di 6 penyusun #3693
1.0.0b260210 Notes 🔴 Berita Terkini Peristiwa workflow disatukan menjadi satu WorkflowEvent dengan diskriminator type; isinstance() → event.type == "..." #3690
1.0.0b260130 Notes 🟡 Peningkatan ChatOptions / ChatResponse / AgentResponse generik mengenai format respons #3305
1.0.0b260130 Notes 🟡 Peningkatan BaseAgent dukungan ditambahkan untuk integrasi Claude Agent SDK #3509
1.0.0b260128 Notes 🔴 Berita Terkini AIFunction FunctionTool, @ai_function → @tool #3413
1.0.0b260128 Notes 🔴 Berita Terkini Pola Pabrik untuk GroupChat/Magentic; with_standard_manager → with_manager, participant_factories → register_participant #3224
1.0.0b260128 Notes 🔴 Berita Terkini Github → GitHub #3486
1.0.0b260127 Notes 🟡 Peningkatan BaseAgent dukungan ditambahkan untuk integrasi GitHub Copilot SDK #3404
1.0.0b260123 Notes 🔴 Berita Terkini Jenis konten dikonsolidasikan ke kelas tunggal Content dengan classmethods #3252
1.0.0b260123 Notes 🔴 Berita Terkini response_format kesalahan validasi sekarang muncul ValidationError #3274
1.0.0b260123 Notes 🔴 Berita Terkini AG-UI menjalankan logika yang disederhanakan #3322
1.0.0b260123 Notes 🟡 Peningkatan Klien antropis response_format menambahkan dukungan untuk output terstruktur #3301
1.0.0b260123 Notes 🟡 Peningkatan Konfigurasi Azure AI diperluas dengan dukungan reasoning dan rai_config #3403, #3265
1.0.0b260116 Notes 🔴 Berita Terkini create_agent → as_agent #3249
1.0.0b260116 Notes 🔴 Berita Terkini source_executor_id → executor_id #3166
1.0.0b260116 Notes 🟡 Peningkatan AG-UI mendukung kelangsungan sesi/utas yang dikelola layanan #3136
1.0.0b260114 Notes 🔴 Berita Terkini Orkestrasi direfaktorisasi (GroupChat, Handoff, Eksekusi Berurutan, Eksekusi Bersamaan) #3023
1.0.0b260114 Notes 🔴 Berita Terkini Opsi sebagai TypedDict dan Generic #3140
1.0.0b260114 Notes 🔴 Berita Terkini display_name Dihapus; context_providers → context_provider (tunggal); middleware harus menjadi daftar #3139
1.0.0b260114 Notes 🔴 Berita Terkini AgentRunResponse / AgentRunResponseUpdate diganti namanya menjadi AgentResponse/AgentResponseUpdate #3207
1.0.0b260114 Notes 🟡 Peningkatan Runtime alur kerja deklaratif ditambahkan untuk alur kerja yang didefinisikan YAML #2815
1.0.0b260114 Notes 🟡 Peningkatan Peningkatan pemuatan/keandalan MCP (penanganan kehilangan koneksi, penomoran halaman, kontrol representasi) #3154
1.0.0b260114 Notes 🟡 Peningkatan Foundry A2ATool mendukung koneksi tanpa URL target eksplisit #3127
1.0.0b260107 Notes — Tidak ada perubahan signifikan —
1.0.0b260106 Notes — Tidak ada perubahan signifikan —

Langkah selanjutnya