다음을 통해 공유


Python 2026 중요 변경 가이드

이 문서에서는 코드에 영향을 줄 수 있는 주요 변경 내용 및 향상된 기능을 포함하여 2026년 초부터 Python 릴리스의 중요한 변경 내용을 모두 나열합니다. 각 변경 내용은 다음과 같이 표시됩니다.

  • 🔴 호환성 중단 — 업그레이드하려면 코드를 변경해야 합니다.
  • 🟡 향상된 기능 - 새로운 기능 또는 개선 사항; 기존 코드가 계속 작동합니다.

이 문서는 1.0.0 안정적인 릴리스에 도달하면 제거되므로 중요한 변경 내용을 놓치지 않도록 2026년 버전 간에 업그레이드할 때 이 문서를 참조하세요. 특정 항목(예: 옵션 마이그레이션)에 대한 자세한 업그레이드 지침은 연결된 업그레이드 가이드 또는 연결된 PR을 참조하세요.


python-1.0.0rc5 / python-1.0.0b260319(2026년 3월 19일)

🔴 채팅 클라이언트 파이프라인 순서 변경: FunctionInvocation이 이제 ChatMiddleware를 래핑합니다.

PR:#4746

ChatClient 파이프라인 순서가 변경되었습니다. FunctionInvocation는 이제 가장 바깥쪽 계층이 되어 ChatMiddleware을(를) 래핑합니다. 즉, 전체 함수 호출 시퀀스에서 한 번 실행되는 것이 아니라, 모델 호출당(도구 호출 루프의 각 반복을 포함하여) 채팅 미들웨어가 실행됩니다.

이전 파이프라인 순서:

ChatMiddleware → FunctionInvocation → RawChatClient

새 파이프라인 주문:

FunctionInvocation → ChatMiddleware → ChatTelemetry → RawChatClient

에이전트 호출당 한 번만 실행한다고 가정하는 사용자 지정 채팅 미들웨어가 있는 경우(전체 도구 호출 루프 래핑) 반복 실행에 안전하도록 업데이트합니다. 이제 도구 결과를 모델로 다시 보내는 요청을 포함하여 각 개별 LLM 요청에 대해 채팅 미들웨어가 호출됩니다.

ChatTelemetry는 또한 이제 ChatMiddleware으로부터 파이프라인에서 RawChatClient에 가장 가깝게 실행되는 별도의 계층입니다.

🔴 퍼블릭 런타임 kwargs를 명시적 버킷으로 분할

PR:#4581

공용 Python 에이전트 및 채팅 API는 더 이상 일괄 공용 **kwargs 전달을 기본 런타임 데이터 메커니즘으로 처리하지 않습니다. 이제 런타임 값이 용도에 따라 분할됩니다.

  • function_invocation_kwargs는 도구 또는 함수 미들웨어만 볼 수 있는 값에 사용하십시오.
  • client_kwargs를 클라이언트 계층 kwargs 및 클라이언트 미들웨어 구성에 사용하세요.
  • FunctionInvocationContext (ctx.kwargsctx.session)를 통해 도구/런타임 데이터에 액세스합니다.
  • **kwargs 대신 삽입된 컨텍스트 매개 변수를 사용하여 도구를 정의합니다. 삽입된 컨텍스트 매개 변수는 모델이 보는 스키마에 표시되지 않습니다.
  • 하위 에이전트를 도구로 위임할 때, 자식 에이전트가 호출자의 세션을 공유해야 하는 경우에는 agent.as_tool(propagate_session=True)을 사용합니다.

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

사용자 지정 공용 run() 또는 get_response() 메서드를 구현하는 경우 해당 서명에 function_invocation_kwargsclient_kwargs을(를) 추가하십시오. 도구의 경우, 주석이 추가된 FunctionInvocationContext 매개변수를 선호합니다. ctx, context, 또는 주석된 다른 이름을 사용할 수도 있습니다. 명시적 스키마/입력 모델을 제공하는 경우 명명 ctx 된 주석이 지정되지 않은 일반 매개 변수도 인식됩니다. 동일한 컨텍스트 개체를 함수 미들웨어에 사용할 수 있으며 런타임 함수 kwargs 및 세션 상태가 현재 있는 위치입니다. **kwargs에 의존하는 도구 정의는 레거시 호환 경로만 사용하며 곧 제거될 것입니다.


python-1.0.0rc4 / python-1.0.0b260311(2026년 3월 11일)

릴리스 정보:python-1.0.0rc4

🔴 Azure AI 통합은 이제 2.0 GA를 대상으로 azure-ai-projects 합니다.

PR:#4536

이제 Python Azure AI 통합은 GA 2.0 azure-ai-projects 표면을 가정합니다.

  • 이제 azure-ai-projects>=2.0.0,<3.0지원되는 종속성 범위가 있습니다.
  • foundry_features 패스스루가 Azure AI 에이전트 생성에서 제거되었습니다.
  • 미리 보기 동작이 이제 allow_preview=True를 지원되는 클라이언트/공급자에서 사용합니다.
  • 혼합 베타/GA 호환성 shim이 제거되었으므로 가져오기 및 형식 이름을 2.0 GA SDK 화면으로 업데이트합니다.

🔴 GitHub Copilot 도구 처리기는 이제 ToolInvocation / ToolResult 및 Python 3.11 이상을 사용합니다.

PR:#4551

agent-framework-github-copilot 이제 github-copilot-sdk>=0.1.32를 추적합니다.

  • 도구 처리기는 원시 ToolInvocation가 아닌 데이터 클래스를 받습니다.
  • ToolResult와 같은 snake_case 필드를 사용하여 result_type을 반환text_result_for_llm합니다.
  • 이제 패키지에 agent-framework-github-copilot 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(2026년 3월 4일)

릴리스 정보:python-1.0.0rc3

🔴 코드 정의에 따라 기술 공급자가 최종 결정됨 Skill / SkillResource

PR:#4387

이제 Python 에이전트 기술은 파일 기반 기술과 함께 코드 정의 SkillSkillResource 개체를 지원하며, 공용 공급자 인터페이스는 SkillsProvider로 표준화되었습니다.

  • 이전 미리 보기/내부 FileAgentSkillsProvider를 계속 가져오는 경우, SkillsProvider로 전환하십시오.
  • 파일 기반 리소스 조회는 더 이상 SKILL.md에서 백틱으로 감싼 참조에 의존하지 않습니다. 대신 기술 디렉터리에서 리소스를 발견합니다.

FileAgentSkillsProvider을(를) 가져오는 미리 보기/내부 코드를 사용했던 경우, 현재 공용 API로 전환하세요.

from agent_framework import Skill, SkillResource, SkillsProvider

python-1.0.0rc2 / python-1.0.0b260226(2026년 2월 26일)

릴리스 정보:python-1.0.0rc2

🔴 선언적 워크플로가 InvokeToolInvokeFunctionTool로 대체합니다.

PR:#3716

선언적 Python 워크플로는 더 이상 이전 InvokeTool 작업 종류를 사용하지 않습니다. InvokeFunctionTool로 교체하고 Python 호출 가능 항목을 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(2026년 2월 19일)

릴리스:agent-framework-coreagent-framework-azure-ai1.0.0rc1로 승격되었습니다. 모든 패키지가 1.0.0b260219로 업데이트되었습니다.

🔴 모든 패키지에서 통합 Azure 자격 증명 처리

PR:#4088

ad_token, ad_token_providerget_entra_auth_token 매개 변수/도우미가 모든 Azure 관련 Python 패키지에서 통합 credential 매개 변수로 대체되었습니다. 새 방법은 자동 토큰 캐싱 및 새로 고침에 사용됩니다 azure.identity.get_bearer_token_provider .

영향을 받는 클래스:AzureOpenAIChatClient, ,AzureOpenAIResponsesClientAzureOpenAIAssistantsClient, AzureAIClient, AzureAIAgentClient, AzureAIProjectAgentProviderAzureAIAgentsProvider, AzureAISearchContextProviderPurviewClient, . PurviewPolicyMiddlewarePurviewChatPolicyMiddleware

Before:

from azure.identity import AzureCliCredential, get_bearer_token_provider

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

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

After:

from azure.identity import AzureCliCredential

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

매개 변수는 credential, TokenCredential 또는 호출 가능한 토큰 공급자를 허용합니다. 토큰 캐싱 및 새로 고침은 자동으로 처리됩니다.


🔴 다시 디자인된 Python 예외 계층 구조

PR:#4082

플랫 ServiceException 패밀리가 단일 AgentFrameworkException 루트 아래의 도메인 범위 예외 분기로 대체되었습니다. 이렇게 하면 호출자에게 정확한 except 대상과 명확한 오류 의미 체계를 제공합니다.

새 계층 구조:

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

예외 제거:ServiceException, , ServiceInitializationError, ServiceResponseExceptionServiceContentFilterException, ServiceInvalidAuthError, ServiceInvalidExecutionSettingsErrorServiceInvalidRequestError, ServiceInvalidResponseError, AgentExecutionExceptionAgentInvocationErrorAgentInitializationError, . AgentSessionExceptionChatClientInitializationErrorCheckpointDecodingError

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
    ...

비고

이제 Init 유효성 검사 오류는 사용자 지정 예외 대신 기본 제공 ValueError/TypeError 을 사용합니다. 에이전트 프레임워크 예외는 도메인 수준 오류에 대해 예약됩니다.


🔴 공급자 상태를 범위로 지정 source_id

PR:#3995

이제 공급자 후크는 전체 세션 상태 대신 공급자 범위 상태 사전(state.setdefault(provider.source_id, {}))을 받습니다. 즉, 이전에 state[self.source_id]["key"]를 통해 중첩된 상태에 액세스하던 공급자 구현은 이제 state["key"]에 직접 액세스해야 합니다.

또한 InMemoryHistoryProvider 기본값이 source_id에서 "memory""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")

🔴 채팅/에이전트 메시지 입력 맞춤(run vs get_response)

PR:#3920

이제 채팅 클라이언트 get_response 구현은 Sequence[Message]을 일관되게 수신합니다. agent.run(...)은(는) 유연하게 유지되고(strContentMessage해당 시퀀스) 채팅 클라이언트를 호출하기 전에 입력을 정규화합니다.

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] 스키마 통과를 위해 제네릭 설정이 제거됨

PR:#3907

스키마 기반 도구 경로는 더 이상 이전 FunctionTool[Any] 의 제네릭 동작을 사용하지 않습니다. FunctionTool를 직접 사용하고, 필요한 경우 @tool(schema=...)를 사용하여 pydantic BaseModel 또는 명시적 스키마를 제공합니다.

Before:

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

After:

placeholder: FunctionTool = FunctionTool(...)

🔴 Pydantic 설정으로 대체됨 TypedDict + load_settings()

PR:#3843, #4032

pydantic-settings-기반의 AFBaseSettings 클래스는 TypedDictload_settings()를 사용한 경량의 함수 기반 설정 시스템으로 대체되었습니다. pydantic-settings 종속성이 완전히 제거되었습니다.

이제 모든 설정 클래스(예: OpenAISettings, AzureOpenAISettings, AnthropicSettings)는 TypedDict 정의로 간주되며, 설정 값은 속성 접근 대신 딕셔너리 구문을 통해 액세스됩니다.

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

중요합니다

에이전트 프레임워크는 파일에서 값을 자동으로 로드.env 않습니다. 다음 중 하나를 선택하여 .env 로드를 명시적으로 허용해야 합니다.

  • 애플리케이션 시작 시 load_dotenv() 패키지에서 python-dotenv를 호출
  • env_file_path=".env"load_settings()로 전달하기
  • 셸 또는 IDE에서 직접 환경 변수 설정

load_settings 해결 순서: 명시적 재정의 → .env 파일 값 (제공 되는 경우env_file_path) → 환경 변수 → 기본값입니다. env_file_path를 지정하는 경우, 파일이 존재해야 하며 그렇지 않으면 FileNotFoundError가 발생합니다.


🟡 추론 모델 워크플로 이양 및 기록 직렬화 수정

PR:#4083

다중 에이전트 워크플로에서 추론 모델(예: gpt-5-mini, gpt-5.2)을 사용할 때 여러 오류를 수정합니다. 응답 API의 추론 항목은 이제 올바르게 직렬화되며, function_call가 있을 때에만 기록에 포함되어 API 오류를 방지합니다. 이제 암호화/숨겨진 추론 콘텐츠가 제대로 내보내지고 필드 형식이 summary 수정됩니다. service_session_id 또한 에이전트 간 상태 누출을 방지하기 위해 인계 시 지워집니다.


🟡 기반이 core[all]에 추가되고 도구 선택 기본값이 수정됨

PR:#3953

아마존 베드록은 이제 agent-framework-core[all] 추가 기능에 포함되어 있으며 agent_framework.amazon 레이지 임포트 인터페이스를 통해 사용할 수 있습니다. 도구 선택 동작도 수정되었습니다. 설정되지 않은 도구 선택 값은 이제 설정되지 않은 상태로 유지되므로 공급자는 서비스 기본값을 사용하고 명시적으로 설정된 값은 유지됩니다.

from agent_framework.amazon import BedrockClient

🟡 지원되지 않는 런타임 재정의에 대한 AzureAIClient 경고

PR:#3919

AzureAIClient 이제 런타임 tools 또는 structured_output 가 에이전트의 생성 시 구성과 다를 때 경고를 기록합니다. Azure AI 에이전트 서비스는 런타임 도구 또는 응답 형식 변경을 지원하지 않습니다. 동적 재정의가 필요한 경우 대신 사용합니다 AzureOpenAIResponsesClient .


🟡 workflow.as_agent() 이제 공급자가 설정되지 않은 경우 로컬 기록이 기본값으로 설정됩니다.

PR:#3918

workflow.as_agent()context_providers 없이 생성될 때, 기본적으로 InMemoryHistoryProvider("memory")가 추가됩니다. 컨텍스트 공급자가 명시적으로 제공된 경우 해당 목록은 변경되지 않고 유지됩니다.

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

🟡 MCP 요청에 전파된 OpenTelemetry 추적 컨텍스트

PR:#3780

OpenTelemetry가 설치되면 추적 컨텍스트(예: W3C traceparent)가 을 통해 params._metaMCP 요청에 자동으로 삽입됩니다. 이렇게 하면 에이전트 → MCP 서버 호출에서 엔드투엔드 분산 추적이 가능합니다. 코드 변경이 필요하지 않습니다. 유효한 범위 컨텍스트가 있을 때 활성화되는 추가 동작입니다.


🟡 Azure Functions에 대한 지속성 워크플로 지원

PR:#3630

패키지에서는 이제 Azure Durable Functions에서 agent-framework-azurefunctions 그래프를 실행할 수 있습니다. 매개 변수를 workflow 전달하여 AgentFunctionApp 에이전트 엔터티, 활동 함수 및 HTTP 엔드포인트를 자동으로 등록합니다.

from agent_framework.azurefunctions import AgentFunctionApp

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

구성 가능한 시간 제한 및 만료 시 자동 거부를 사용하여 팬아웃/팬인, 공유 상태 및 휴먼 인 더 루프 패턴을 지원합니다.


python-1.0.0b260212(2026년 2월 12일)

릴리스 정보:python-1.0.0b260212

🔴 Hosted*Tool 클래스가 클라이언트 get_*_tool() 메서드로 대체됨

PR:#3634

클라이언트 범위 팩터리 메서드를 선호하여 호스트된 도구 클래스가 제거되었습니다. 이렇게 하면 공급자가 도구 가용성을 명시적으로 설정합니다.

제거된 클래스 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()]

🔴 세션/컨텍스트 공급자 파이프라인 완료됨(AgentSession, context_providers)

PR:#3850

Python 세션 및 컨텍스트 공급자 마이그레이션이 완료되었습니다. AgentThread 이전 컨텍스트 공급자 형식이 제거되었습니다.

  • AgentThreadAgentSession
  • agent.get_new_thread()agent.create_session()
  • agent.get_new_thread(service_thread_id=...)agent.get_session(service_session_id=...)
  • context_provider= / chat_message_store_factory= 패턴이 다음으로 바뀝니다. 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)

🔴 검사점 모델 및 스토리지 동작 리팩터링됨

PR:#3744

검사점 내부가 다시 디자인되어 지속형 검사점 호환성 및 사용자 지정 스토리지 구현에 영향을 줍니다.

  • WorkflowCheckpoint 이제 실시간 객체를 저장합니다(serialization은 체크포인트 스토리지에서 발생)
  • FileCheckpointStorage 이제 pickle serialization을 사용합니다.
  • workflow_id가 제거되고 추가되었습니다.previous_checkpoint_id
  • 사용되지 않는 검사점 후크가 제거되었습니다.

버전 간에 검사점을 유지하는 경우 워크플로를 다시 시작하기 전에 기존 검사점 아티팩트 다시 생성 또는 마이그레이션합니다.


🟡 AzureOpenAIResponsesClient 는 Microsoft Foundry 프로젝트 엔드포인트를 지원합니다.

PR:#3814

이제 Foundry 프로젝트 엔드포인트 또는 AzureOpenAIResponsesClient와 함께 AIProjectClient을(를) 사용할 수 있으며 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(),
)

🔴 미들웨어 call_next 가 더 이상 수락하지 않음 context

PR:#3829

미들웨어 연속은 이제 인수를 사용하지 않습니다. 미들웨어가 call_next(context)를 여전히 호출하는 경우 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(2026년 2월 10일)

릴리스 정보:python-1.0.0b260210

🔴 워크플로 팩터리 메서드가 제거됨 WorkflowBuilder

PR:#3781

register_executor()에서 register_agent()WorkflowBuilder가 제거되었습니다. 모든 작성기 메서드(add_edge, , add_fan_out_edgesadd_fan_in_edges, add_chain, add_switch_case_edge_groupadd_multi_selection_edge_group) 및 start_executor 더 이상 문자열 이름을 허용하지 않습니다. 실행기 또는 에이전트 인스턴스가 직접 필요합니다.

상태 격리의 경우 각 호출이 새 인스턴스를 생성하도록 도우미 메서드 내에 실행기/에이전트 인스턴스화 및 워크플로 빌드를 래핑합니다.

WorkflowBuilder 실행기와 함께

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 에이전트가 있는 경우

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

도우미 메서드를 사용하여 상태 격리

호출마다 격리된 상태가 필요한 워크플로의 경우, 헬퍼 메서드 안에 생성 과정을 래핑하세요.

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

<><> 이름이 <>로 변경되고, <> 이름이 <>로 변경됨.

PR:#3747

핵심 Python 형식은 중복 Chat 접두사를 제거하여 간소화되었습니다. 이전 버전과의 호환성 별칭은 제공되지 않습니다.

전에 이후
ChatAgent Agent
RawChatAgent RawAgent
ChatMessage Message
ChatClientProtocol SupportsChatGetResponse

임포트 업데이트

Before:

from agent_framework import ChatAgent, ChatMessage

After:

from agent_framework import Agent, Message

형식 참조 업데이트

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

비고

ChatClient, ChatResponse, ChatOptionsChatMessageStore 변경으로 이름이 바뀌 지 않습니다 .


🔴 형식 API는 응답/메시지 모델에서 업데이트를 검토합니다.

PR:#3647

이 릴리스에는 메시지/응답 타입 지정 및 도우미 API의 광범위하고 호환성이 깨지는 정리가 포함되어 있습니다.

  • RoleFinishReason은 이제 NewType로, 알려진 값을 위해 strRoleLiteral/ 위에 래퍼가 됩니다FinishReasonLiteral. 문자열로 처리합니다(.value는 사용하지 마세요).
  • Message 구축은 Message(role, contents=[...])에 표준화됩니다. contents에 있는 문자열은 텍스트 콘텐츠로 자동 변환됩니다.
  • ChatResponseAgentResponse 생성자는 이제 messages= (단일 Message 또는 시퀀스)를 중심으로 하고, 레거시 text= 생성자의 사용이 응답에서 제거되었습니다.
  • ChatResponseUpdateAgentResponseUpdate는 이제 text=를 수락하지 않습니다. 대신 contents=[Content.from_text(...)]를 사용하십시오.
  • 업데이트 결합 도우미 이름이 간소화되었습니다.
  • try_parse_valueChatResponseAgentResponse에서 제거되었습니다.

도우미 메서드 이름 바꾸기

전에 이후
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(...)

응답 업데이트 구성 업데이트

Before:

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

After:

from agent_framework import AgentResponseUpdate, Content

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

try_parse_value에서 try/except.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}")

🔴 run / get_response 통합 모델 및 ResponseStream 사용

PR:#3379

Python API는 agent.run(...)client.get_response(...)를 중심으로 통합되었으며, 스트리밍은 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)

🔴 핵심 컨텍스트/프로토콜 형식 이름 바꾸기

PR:#3714, #3717

전에 이후
AgentRunContext AgentContext
AgentProtocol SupportsAgentRun

그에 따라 가져오기 및 형식 주석을 업데이트합니다.


🔴 미들웨어 연속 매개 변수 이름이 call_next로 변경됨 call_next

PR:#3735

이제 미들웨어 서명에는 call_next를 사용해야 하며, next 대신 사용합니다.

Before:

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

After:

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

🔴 표준화된 TypeVar 이름(TNameNameT)

PR:#3770

이제 코드베이스는 접미사가 T 사용되는 일관된 TypeVar 명명 스타일을 따릅니다.

Before:

TMessage = TypeVar("TMessage")

After:

MessageT = TypeVar("MessageT")

프레임워크 제네릭을 중심으로 사용자 지정 래퍼를 유지 관리하는 경우 주석 변동을 줄이기 위해 로컬 TypeVar 이름을 새 규칙에 맞춥니다.


🔴 워크플로 에이전트의 출력 및 스트리밍 변경 내용

PR:#3649

workflow.as_agent() 동작이 표준 에이전트 응답 패턴에 맞게 출력 및 스트리밍을 조정하도록 업데이트되었습니다. 레거시 출력/업데이트 처리에 의존하는 워크플로-에이전트 소비자를 검토하고 현재 AgentResponse/AgentResponseUpdate 흐름으로 업데이트합니다.


🔴 흐름 작성기 메서드가 생성자 매개 변수로 이동됨

PR:#3693

6개 작성기(WorkflowBuilder, , SequentialBuilder, ConcurrentBuilderGroupChatBuilder, MagenticBuilderHandoffBuilder)의 단일 구성 흐름 메서드가 생성자 매개 변수로 마이그레이션되었습니다. 설정의 유일한 구성 경로인 Fluent 메서드는 생성자 인수를 위해 제거됩니다.

WorkflowBuilder

set_start_executor(), with_checkpointing()with_output_from() 제거됩니다. 대신 생성자 매개 변수를 사용합니다.

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()with_intermediate_outputs() 제거됩니다. 대신 생성자 매개 변수를 사용합니다.

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()with_intermediate_outputs() 제거됩니다. 대신 생성자 매개 변수를 사용합니다.

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()with_intermediate_outputs() 제거됩니다. 대신 생성자 매개 변수를 사용합니다.

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()with_termination_condition()가 제거됩니다. 대신 생성자 매개 변수를 사용합니다.

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

유효성 검사 변경 내용

  • WorkflowBuilder 이제 생성자 인수로 필요합니다 start_executor (이전에 Fluent 메서드를 통해 설정됨).
  • SequentialBuilder, ConcurrentBuilder, GroupChatBuilderMagenticBuilder는 이제 생성 시 participants 또는 participant_factories가 필요합니다 — 둘 중 아무것도 전달되지 않으면 ValueError가 발생합니다.

비고

HandoffBuilder 이미 생성자 매개 변수로 허용 participants/participant_factories 되었으며 이와 관련하여 변경되지 않았습니다.


🔴 워크플로 이벤트가 WorkflowEvent 판별자를 사용하여 단일 type로 통합됨

PR:#3690

모든 개별 워크플로 이벤트 서브클래스는 단일 제네릭 WorkflowEvent[DataT] 클래스로 대체되었습니다. 이제 isinstance() 검사를 사용하여 이벤트 유형을 식별하는 대신 event.type, "output", "request_info"와 같은 문자열 리터럴을 확인합니다. 이는 Content의 클래스 통합python-1.0.0b260123과 동일한 패턴을 따릅니다.

제거된 이벤트 클래스

내보낸 다음 이벤트 서브클래스가 더 이상 존재하지 않습니다.

이전 클래스 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"

임포트 업데이트

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

이벤트 유형 검사 업데이트

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

스트리밍: 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}")

형식 주석

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

비고

WorkflowEvent는 제네릭(WorkflowEvent[DataT])이지만, 혼합 이벤트 컬렉션의 경우 WorkflowEvent[Any] 또는 매개변수가 없는 WorkflowEvent을(를) 사용하십시오.


🔴 workflow.send_responses* 제거; 사용 workflow.run(responses=...)

PR:#3720

send_responses()send_responses_streaming()Workflow에서 제거되었습니다. 응답을 직접 전달하여 일시 중지된 워크플로를 계속합니다 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 이름이 State로 변경되었습니다. 워크플로 상태 API는 동기식입니다.

PR:#3667

상태 API는 더 이상 await가 필요하지 않으며, 명명 규칙이 표준화되었습니다.

전에 이후
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

🔴 오케스트레이션 빌더가 agent_framework.orchestrations로 이동했습니다

PR:#3685

오케스트레이션 빌더는 이제 전용 패키지 네임스페이스에 있습니다.

Before:

from agent_framework import SequentialBuilder, GroupChatBuilder

After:

from agent_framework.orchestrations import SequentialBuilder, GroupChatBuilder

🟡 장기 실행 백그라운드 응답 및 연속 토큰들

PR:#3808

이제 Python 에이전트 실행에 대한 백그라운드 응답이 지원됩니다options={"background": True}.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})

🟡 나란히 추가된 세션/컨텍스트 공급자 미리 보기 형식

PR:#3763

증분 마이그레이션 SessionContextBaseContextProvider을 위한 레거시 API와 함께 새 세션/컨텍스트 파이프라인 유형이 도입되었습니다.


🟡 이제 코드 인터프리터 스트리밍에 증분 코드 델타가 포함됩니다.

PR:#3775

이제 스트리밍 코드 인터프리터가 실행되어 UI가 생성된 코드를 점진적으로 렌더링할 수 있도록 스트리밍된 콘텐츠에서 코드 델타 업데이트를 표시합니다.


🟡 @tool 는 명시적 스키마 처리를 지원합니다.

PR:#3734

이제 유추된 스키마 출력에 사용자 지정이 필요한 경우 도구 정의에서 명시적 스키마 처리를 사용할 수 있습니다.


python-1.0.0b260130(2026년 1월 30일)

릴리스 정보:python-1.0.0b260130

이제 🟡ChatOptionsChatResponse/AgentResponse는 응답 형식에 대해 제네릭으로 처리됩니다.

PR:#3305

ChatOptions, ChatResponse이제 AgentResponse 제네릭 형식이 응답 형식 형식으로 매개 변수화됩니다. 이렇게 하면 구조화된 출력을 사용할 때 형식 유추를 향상할 수 있습니다 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!)

팁 (조언)

이는 비파괴적 향상입니다. 형식 매개 변수가 없는 기존 코드는 계속 작동합니다. 옵션 및 응답에 대해 위의 코드 조각에서 형식을 지정할 필요가 없습니다. 명확성을 위해 여기에 표시됩니다.


🟡 BaseAgent Claude 에이전트 SDK에 대한 지원이 추가됨

PR:#3509

이제 Python SDK에 Claude 에이전트 SDK의 구현이 포함되어, 에이전트 프레임워크에서 최상위 어댑터 기반 사용을 가능하게 합니다.


python-1.0.0b260128(2026년 1월 28일)

릴리스 정보:python-1.0.0b260128

🔴 AIFunctionFunctionTool로 이름이 변경되고, @ai_function@tool로 이름이 변경되었습니다.

PR:#3413

클래스 및 데코레이터는 업계 용어와의 명확성과 일관성을 위해 이름이 바뀌었습니다.

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)

🔴 GroupChat 및 Magentic에 추가된 팩터리 패턴 API 이름 바꾸기

PR:#3224

그룹 채팅에 참가자 팩터리 및 오케스트레이터 팩터리를 추가했습니다. 이름 바꾸기도 포함됩니다.

  • with_standard_managerwith_manager
  • participant_factoriesregister_participant

Before:

from agent_framework.workflows import MagenticBuilder

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

After:

from agent_framework.workflows import MagenticBuilder

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

🔴 Github 이름이 GitHub로 변경됨

PR:#3486

클래스 및 패키지 이름이 대소문자를 올바르게 사용하도록 업데이트되었습니다.

Before:

from agent_framework_github_copilot import GithubCopilotAgent

agent = GithubCopilotAgent(...)

After:

from agent_framework_github_copilot import GitHubCopilotAgent

agent = GitHubCopilotAgent(...)

python-1.0.0b260127(2026년 1월 27일)

릴리스 정보:python-1.0.0b260127

🟡 BaseAgent GitHub Copilot SDK에 대한 지원이 추가됨

PR:#3404

이제 Python SDK에는 GitHub Copilot SDK 통합을 위한 구현이 포함 BaseAgent 됩니다.


python-1.0.0b260123(2026년 1월 23일)

릴리스 정보:python-1.0.0b260123

🔴 classmethod 생성자를 사용하여 단일 클래스로 간소화된 콘텐츠 형식

PR:#3252

특정 형식을 만들기 위해 모든 이전 콘텐츠 형식(파생 BaseContent)을 classmethods가 있는 단일 Content 클래스로 바꿉니다.

전체 마이그레이션 레퍼런스

이전 형식 새 메서드
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(...)

추가 새 메서드(직접 선행 작업 없음):

  • Content.from_text_reasoning(...) — 추론/사고 콘텐츠
  • Content.from_hosted_vector_store(...) — 벡터 저장소 참조의 경우
  • Content.from_usage(...) — 사용량/토큰 정보
  • Content.from_mcp_server_tool_call(...) / Content.from_mcp_server_tool_result(...) — MCP 서버 도구용
  • Content.from_code_interpreter_tool_call(...) / Content.from_code_interpreter_tool_result(...) — 코드 인터프리터의 경우
  • Content.from_image_generation_tool_call(...) / Content.from_image_generation_tool_result(...) — 이미지 생성용

형식 검사

isinstance() 검사를 대신하여 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)

기본 예제

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

🔴 주석 유형이 AnnotationTextSpanRegion TypedDicts로 단순화됨

PR:#3252

클래스 기반 주석 형식을 더 TypedDict 간단한 정의로 바꿉니다.

이전 형식 새 형식
CitationAnnotation (클래스) Annotation (TypedDict 와 함께 type="citation")
BaseAnnotation (클래스) Annotation (TypedDict)
TextSpanRegion (클래스와 SerializationMixin) TextSpanRegion (TypedDict)
Annotations (형식 별칭) Annotation
AnnotatedRegions (형식 별칭) 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"
}

비고

AnnotationTextSpanRegion가 이제 TypedDict이므로, 이를 클래스 인스턴스가 아닌 사전으로 생성합니다.


🔴 response_format 이제 사용자에게 유효성 검사 오류가 표시됩니다.

PR:#3274

ChatResponse.valueAgentResponse.value 스키마 유효성 검사가 실패할 때 ValidationError을(를) 발생시키고, 더 이상 None을(를) 조용히 반환하지 않습니다.

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 실행 논리 단순화; MCP 및 Anthropic 클라이언트 측 수정 완료

PR:#3322

runAG-UI 메서드 서명 및 동작이 간소화되었습니다.

Before:

from agent_framework.ag_ui import AGUIEndpoint

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

After:

from agent_framework.ag_ui import AGUIEndpoint

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

🟡 이제 Anthropic 클라이언트가 구조화된 출력을 response_format 지원합니다.

PR:#3301

이제 OpenAI 및 Azure 클라이언트와 유사하게, response_format를 통해 Anthropic 클라이언트와 구조화된 출력 구문 분석을 사용할 수 있습니다.


🟡 확장된 Azure AI 구성(reasoning, rai_config)

PR:#3403, #3265

Azure AI 지원은 추론 구성 지원 및 rai_config 에이전트 생성 중에 확장되었습니다.


python-1.0.0b260116(2026년 1월 16일)

릴리스 정보:python-1.0.0b260116

🔴 create_agent 이름이 as_agent로 변경됨

PR:#3249

메서드의 용도에 대한 명확성을 높이기 위해 이름이 바뀌었습니다.

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 이름이 executor_id로 변경됨

PR:#3166

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 서비스 관리 세션 연속성을 지원합니다.

PR:#3136

AG-UI는 이제 다중 턴 연속성을 유지하기 위해 서비스 관리 대화 ID(예: Foundry 관리 세션/스레드)를 보존합니다.


python-1.0.0b260114(2026년 1월 14일)

릴리스 정보:python-1.0.0b260114

🔴 리팩터링된 오케스트레이션

PR:#3023

에이전트 프레임워크 워크플로에서 오케스트레이션의 광범위한 리팩터링 및 간소화:

  • 그룹 채팅: 오케스트레이터 실행기를 전용 에이전트 기반 및 함수 기반(BaseGroupChatOrchestrator, GroupChatOrchestrator, AgentBasedGroupChatOrchestrator)으로 분할합니다. 브로드캐스팅 모델을 사용하여 스타 토폴로지로 간소화되었습니다.
  • 핸드오프: 단일 계층, 코디네이터 및 사용자 지정 실행기 지원이 제거되었습니다. HandoffAgentExecutor를 사용하여 방송 모델로 이동했습니다.
  • 순차적 및 동시성: 하위 워크플로를 통해 요청 정보 메커니즘을 단순화합니다. AgentApprovalExecutorAgentRequestInfoExecutor.

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

🔴 TypedDict 및 제네릭으로 도입된 옵션

PR:#3140

옵션은 이제 더 나은 형식 안전성 및 IDE 자동 완성을 위해 TypedDict로 입력됩니다.

📖 전체 마이그레이션 지침은 형식화된 옵션 가이드를 참조하세요.

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 제거; context_provider 단수로, middleware 목록이어야 합니다.

PR:#3139

  • display_name 에이전트에서 제거된 매개 변수
  • context_providers (복수, 허용 목록)이 context_provider (단수, 1개만 허용됨)로 변경됨
  • middleware 이제 목록이 필요합니다(더 이상 단일 인스턴스를 허용하지 않음).
  • AggregateContextProvider 코드에서 제거됨(필요한 경우 샘플 구현 사용)

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* 이름이 AgentResponse*로 변경됨

PR:#3207

AgentRunResponseAgentRunResponseUpdateAgentResponseAgentResponseUpdate으로 이름이 바뀌었습니다.

Before:

from agent_framework import AgentRunResponse, AgentRunResponseUpdate

After:

from agent_framework import AgentResponse, AgentResponseUpdate

🟡 YAML 정의 워크플로에 대해 추가된 선언적 워크플로 런타임

PR:#2815

선언적 YAML 워크플로를 실행하기 위해 그래프 기반 런타임이 추가되어 사용자 지정 런타임 코드 없이 다중 에이전트 오케스트레이션을 사용하도록 설정했습니다.


🟡 MCP 성능/안정성 향상

PR:#3154

MCP 통합은 향상된 연결 손실 동작, 로드 시 페이지 매김 지원 및 표현 제어 옵션을 얻었습니다.


🟡 이제 Foundry A2ATool 는 대상 URL 없이 연결을 지원합니다.

PR:#3127

A2ATool 이제 직접 대상 URL이 구성되지 않은 경우에도 프로젝트 연결 메타데이터를 통해 Foundry 지원 A2A 연결을 확인할 수 있습니다.


python-1.0.0b260107(2026년 1월 7일)

릴리스 정보:python-1.0.0b260107

이 릴리스에는 큰 변화가 없습니다.


python-1.0.0b260106(2026년 1월 6일)

릴리스 정보:python-1.0.0b260106

이 릴리스에는 큰 변화가 없습니다.


요약 표

해제 릴리스 노트 유형 변화 PR
1.0.0rc5 / 1.0.0b260318 N/A(예약됨) 🔴 속보 퍼블릭 런타임 kwargs가 function_invocation_kwargsclient_kwargs로 나누어졌고, 도구는 이제 FunctionInvocationContext / ctx.session를 사용합니다. #4581
1.0.0rc4 / 1.0.0b260311 Notes 🔴 속보 이제 Azure AI 통합은 azure-ai-projects 2.0 GA를 목표로 하고 있으며, foundry_features 는 제거되었고 allow_preview 는 미리 보기 옵트인 옵션입니다. #4536
1.0.0rc4 / 1.0.0b260311 Notes 🔴 속보 이제 GitHub Copilot 통합이 사용됩니다ToolInvocation / ToolResultagent-framework-github-copilot. Python 3.11 이상 필요 #4551
1.0.0rc3 / 1.0.0b260304 Notes 🔴 속보 기술 공급자는 코드 정의 Skill / SkillResource 를 추가합니다. 이전 FileAgentSkillsProvider 가져오기 및 백틱 리소스 참조를 업데이트해야 합니다. #4387
1.0.0rc2 / 1.0.0b260226 Notes 🔴 속보 선언적 워크플로는 InvokeTool을(를) InvokeFunctionToolWorkflowFactory.register_tool()로 대체합니다. #3716
1.0.0rc1 / 1.0.0b260219 Notes 🔴 속보 Azure 패키지 간 통합 Azure 자격 증명 처리 #4088
1.0.0rc1 / 1.0.0b260219 Notes 🔴 속보 아래에서 다시 디자인된 Python 예외 계층 구조 AgentFrameworkException #4082
1.0.0rc1 / 1.0.0b260219 Notes 🔴 속보 공급자 상태는 이제 source_id에 의해 범위가 지정됩니다. #3995
1.0.0rc1 / 1.0.0b260219 Notes 🔴 속보 사용자 지정 get_response() 구현은 Sequence[Message]를 수락해야 합니다. #3920
1.0.0rc1 / 1.0.0b260219 Notes 🔴 속보 FunctionTool[Any] 스키마 통과 shim이 제거됨 #3907
1.0.0rc1 / 1.0.0b260219 Notes 🔴 속보 설정이 AFBaseSettings/pydantic-settings에서 TypedDict + load_settings()로 이동되었습니다. #3843, #4032
1.0.0rc1 / 1.0.0b260219 Notes 🟡 개선 추론 모델 워크플로 전환 및 기록 직렬화가 수정됨 #4083
1.0.0rc1 / 1.0.0b260219 Notes 🟡 개선 Bedrock이 core[all]에 추가되었습니다. 도구 선택 기본값이 수정되었습니다. #3953
1.0.0rc1 / 1.0.0b260219 Notes 🟡 개선 AzureAIClient 지원되지 않는 런타임 재정의에 대한 경고 #3919
1.0.0rc1 / 1.0.0b260219 Notes 🟡 개선 workflow.as_agent() 공급자가 설정되지 않은 경우 로컬 기록을 삽입합니다. #3918
1.0.0rc1 / 1.0.0b260219 Notes 🟡 개선 OpenTelemetry 추적 컨텍스트가 MCP 요청에 전파됩니다. #3780
1.0.0rc1 / 1.0.0b260219 Notes 🟡 개선 Azure Functions에 대해 추가된 지속성 워크플로 지원 #3630
1.0.0b260212 Notes 🔴 속보 Hosted*Tool 클래스가 제거되었습니다. 클라이언트 get_*_tool() 메서드를 통해 호스트된 도구 만들기 #3634
1.0.0b260212 Notes 🔴 속보 세션/컨텍스트 공급자 파이프라인 완료: AgentThread 제거됨, 사용 AgentSession + context_providers #3850
1.0.0b260212 Notes 🔴 속보 검사점 모델/스토리지 리팩터링(workflow_id 제거, 추가, previous_checkpoint_id 스토리지 동작 변경) #3744
1.0.0b260212 Notes 🟡 개선 AzureOpenAIResponsesClient는 Foundry 프로젝트 엔드포인트에서 생성할 수 있으며 AIProjectClient #3814
1.0.0b260212 Notes 🔴 속보 미들웨어 연속에서는 더 이상 context를 수락하지 않으므로 call_next(context)call_next()로 업데이트하십시오. #3829
1.0.0b260210 Notes 🔴 속보 send_responses() / send_responses_streaming() 제거; 사용 workflow.run(responses=...) #3720
1.0.0b260210 Notes 🔴 속보 SharedState State→; 워크플로 상태 API가 동기적이며 검사점 상태 필드 이름이 바뀝니다. #3667
1.0.0b260210 Notes 🔴 속보 오케스트레이션 작성기가 agent_framework.orchestrations 패키지로 이동되었습니다. #3685
1.0.0b260210 Notes 🟡 개선 Python 에이전트 응답에 추가된 백그라운드 응답 및 continuation_token 지원 #3808
1.0.0b260210 Notes 🟡 개선 나란히 추가된 세션/컨텍스트 미리 보기 형식(SessionContext, BaseContextProvider) #3763
1.0.0b260210 Notes 🟡 개선 이제 스트리밍 코드 인터프리터 업데이트에 증분 코드 델타가 포함됩니다. #3775
1.0.0b260210 Notes 🟡 개선 @tool 데코레이터에서 명시적 스키마 처리 지원을 추가합니다. #3734
1.0.0b260210 Notes 🔴 속보 register_executor() / register_agent()WorkflowBuilder에서 제거됨; 상태 격리를 위해 인스턴스를 직접 사용하거나 도우미 메서드를 사용하십시오. #3781
1.0.0b260210 Notes 🔴 속보 ChatAgent AgentChatMessageMessage, RawChatAgentRawAgent, ChatClientProtocolSupportsChatGetResponse #3747
1.0.0b260210 Notes 🔴 속보 형식 API 검토: Role/FinishReason 형식 변경, 응답/업데이트 생성자 강화, 도우미 이름 바꾸기 from_updates및 제거 try_parse_value #3647
1.0.0b260210 Notes 🔴 속보 API를 중심으로 한 run/get_responseResponseStream 통합 #3379
1.0.0b260210 Notes 🔴 속보 AgentRunContext 이름이 로 변경됨 AgentContext #3714
1.0.0b260210 Notes 🔴 속보 AgentProtocol 이름이 로 변경됨 SupportsAgentRun #3717
1.0.0b260210 Notes 🔴 속보 미들웨어 next 매개변수 이름이 call_next로 변경되었습니다. #3735
1.0.0b260210 Notes 🔴 속보 TypeVar 명명 표준화됨(TNameNameT) #3770
1.0.0b260210 Notes 🔴 속보 현재 에이전트 응답 흐름에 맞춰 정렬된 워크플로-에이전트 출력/스트림 동작 #3649
1.0.0b260210 Notes 🔴 속보 Fluent 작성기 메서드가 6개 작성기에서 생성자 매개 변수로 이동됨 #3693
1.0.0b260210 Notes 🔴 속보 워크플로 이벤트는 WorkflowEventtype 판별자로 단일화됩니다. isinstance()event.type == "..." #3690
1.0.0b260130 Notes 🟡 개선 ChatOptions / ChatResponse / AgentResponse 공통의 응답 형식 #3305
1.0.0b260130 Notes 🟡 개선 BaseAgent Claude 에이전트 SDK 통합에 대한 지원이 추가됨 #3509
1.0.0b260128 Notes 🔴 속보 AIFunctionFunctionTool, @ai_function@tool #3413
1.0.0b260128 Notes 🔴 속보 GroupChat/Magentic에 대한 팩터리 패턴; with_standard_managerwith_manager, participant_factoriesregister_participant #3224
1.0.0b260128 Notes 🔴 속보 GithubGitHub #3486
1.0.0b260127 Notes 🟡 개선 BaseAgent GitHub Copilot SDK 통합에 대한 지원이 추가됨 #3404
1.0.0b260123 Notes 🔴 속보 classmethods를 사용하여 단일 Content 클래스에 통합된 콘텐츠 형식 #3252
1.0.0b260123 Notes 🔴 속보 response_format 이제 유효성 검사 오류가 발생합니다. ValidationError #3274
1.0.0b260123 Notes 🔴 속보 AG-UI 실행 로직 간소화 #3322
1.0.0b260123 Notes 🟡 개선 Anthropic 클라이언트는 구조화된 출력에 대한 지원을 추가 response_format 합니다. #3301
1.0.0b260123 Notes 🟡 개선 Azure AI 구성 확대 및 reasoningrai_config 지원 #3403, #3265
1.0.0b260116 Notes 🔴 속보 create_agentas_agent #3249
1.0.0b260116 Notes 🔴 속보 source_executor_idexecutor_id #3166
1.0.0b260116 Notes 🟡 개선 AG-UI 서비스 관리 세션/스레드 연속성을 지원합니다. #3136
1.0.0b260114 Notes 🔴 속보 리팩터링된 오케스트레이션 (그룹 채팅, 핸드오프, 순차적 및 동시 수행) #3023
1.0.0b260114 Notes 🔴 속보 제네릭 및 TypedDict 옵션 #3140
1.0.0b260114 Notes 🔴 속보 display_name 제거; context_providerscontext_provider →(단수) middleware 는 목록이어야 합니다. #3139
1.0.0b260114 Notes 🔴 속보 이름이 로 변경됨 #3207
1.0.0b260114 Notes 🟡 개선 YAML 정의 워크플로에 대해 추가된 선언적 워크플로 런타임 #2815
1.0.0b260114 Notes 🟡 개선 MCP 로드/안정성 향상(연결 손실 처리, 페이지 매김, 표현 컨트롤) #3154
1.0.0b260114 Notes 🟡 개선 Foundry A2ATool 는 명시적 대상 URL 없이 연결을 지원합니다. #3127
1.0.0b260107 Notes 중요한 변경 내용 없음
1.0.0b260106 Notes 중요한 변경 내용 없음

다음 단계: