Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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_kwargsuntuk nilai yang hanya akan dilihat oleh alat-alat atau middleware untuk fungsi. - Gunakan
client_kwargsuntuk kwarg lapisan klien dan konfigurasi middleware klien. - Akses data alat/runtime melalui
FunctionInvocationContext(ctx.kwargsdanctx.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_featurespassthrough telah dihapus dari pembuatan agen Azure AI. - Perilaku pratinjau sekarang menggunakan
allow_preview=Truepada 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
ToolInvocationklasifikasi data alih-alih mentahdict. - Mengembalikan
ToolResultmenggunakan bidang snake_case sepertiresult_typedantext_result_for_llm. - Paket
agent-framework-github-copilotsekarang 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 keSkillsProvider. - 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()
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 paketpython-dotenvdi awal aplikasi Anda - Meneruskan
env_file_path=".env"keload_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 olehcontext_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.
-
WorkflowCheckpointsekarang menyimpan objek langsung (serialisasi terjadi di penyimpanan titik pemeriksaan) -
FileCheckpointStoragesekarang menggunakan serialisasi "pickle" -
workflow_idtelah dihapus danprevious_checkpoint_idditambahkan - 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.
-
RoledanFinishReasonsekarang menjadi pembungkus di atasNewTypemenggunakanstrRoleLiteral/ untuk nilai yang diketahui. Perlakukan mereka sebagai string (tanpa menggunakan.value). -
Messagekonstruksi distandarisasi padaMessage(role, contents=[...]); string dicontentsdikonversi secara otomatis ke konten teks. -
ChatResponsedanAgentResponsekonstruktor sekarang berpusat padamessages=(tunggalMessageatau urutan); penggunaan konstruktor warisantext=dihapus dari respons. -
ChatResponseUpdatedanAgentResponseUpdatetidak lagi menerimatext=; gunakancontents=[Content.from_text(...)]. - Nama asisten penggabungan pembaruan telah disederhanakan.
-
try_parse_valuedihapus dariChatResponsedanAgentResponse.
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
| 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
-
WorkflowBuildersekarang memerlukanstart_executorsebagai argumen konstruktor (sebelumnya diatur melalui metode lancar) -
SequentialBuilder,ConcurrentBuilder,GroupChatBuilder, danMagenticBuildersekarang memerlukanparticipantsatauparticipant_factoriessaat waktu konstruksi — jika keduanya tidak diberikan, maka akan memicuValueError
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)
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
AgentApprovalExecutordanAgentRequestInfoExecutor.
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_nameparameter dihapus dari agen -
context_providers(plural, daftar penerimaan) diubah menjadicontext_provider(tunggal, hanya 1 yang diizinkan) -
middlewaresekarang memerlukan daftar (tidak lagi menerima instans tunggal) -
AggregateContextProviderdihapus 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 | — |