이 문서에서는 코드에 영향을 줄 수 있는 주요 변경 내용 및 향상된 기능을 포함하여 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.kwargs및ctx.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_kwargs 및 client_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-copilotPython 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 에이전트 기술은 파일 기반 기술과 함께 코드 정의 Skill 및 SkillResource 개체를 지원하며, 공용 공급자 인터페이스는 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
🔴 선언적 워크플로가 InvokeTool을 InvokeFunctionTool로 대체합니다.
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-ai가 1.0.0rc1로 승격되었습니다. 모든 패키지가 1.0.0b260219로 업데이트되었습니다.
🔴 모든 패키지에서 통합 Azure 자격 증명 처리
PR:#4088
ad_token, ad_token_provider및 get_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()
pydantic-settings-기반의 AFBaseSettings 클래스는 TypedDict와 load_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 이전 컨텍스트 공급자 형식이 제거되었습니다.
-
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=패턴이 다음으로 바뀝니다.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, ChatOptions이 ChatMessageStore 변경으로 이름이 바뀌 지 않습니다 .
🔴 형식 API는 응답/메시지 모델에서 업데이트를 검토합니다.
PR:#3647
이 릴리스에는 메시지/응답 타입 지정 및 도우미 API의 광범위하고 호환성이 깨지는 정리가 포함되어 있습니다.
-
Role와FinishReason은 이제NewType로, 알려진 값을 위해strRoleLiteral/ 위에 래퍼가 됩니다FinishReasonLiteral. 문자열로 처리합니다(.value는 사용하지 마세요). -
Message구축은Message(role, contents=[...])에 표준화됩니다.contents에 있는 문자열은 텍스트 콘텐츠로 자동 변환됩니다. -
ChatResponse및AgentResponse생성자는 이제messages=(단일Message또는 시퀀스)를 중심으로 하고, 레거시text=생성자의 사용이 응답에서 제거되었습니다. -
ChatResponseUpdate및AgentResponseUpdate는 이제text=를 수락하지 않습니다. 대신contents=[Content.from_text(...)]를 사용하십시오. - 업데이트 결합 도우미 이름이 간소화되었습니다.
-
try_parse_value가ChatResponse및AgentResponse에서 제거되었습니다.
도우미 메서드 이름 바꾸기
| 전에 | 이후 |
|---|---|
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)
🔴 핵심 컨텍스트/프로토콜 형식 이름 바꾸기
| 전에 | 이후 |
|---|---|
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 이름(TName → NameT)
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,GroupChatBuilder및MagenticBuilder는 이제 생성 시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
이제 🟡ChatOptions 및 ChatResponse/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
🔴
AIFunction는 FunctionTool로 이름이 변경되고, @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_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 이름이 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")
🔴 주석 유형이 Annotation 및 TextSpanRegion 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"
}
비고
Annotation와 TextSpanRegion가 이제 TypedDict이므로, 이를 클래스 인스턴스가 아닌 사전으로 생성합니다.
🔴
response_format 이제 사용자에게 유효성 검사 오류가 표시됩니다.
PR:#3274
ChatResponse.value 및 AgentResponse.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)
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를 사용하여 방송 모델로 이동했습니다. -
순차적 및 동시성: 하위 워크플로를 통해 요청 정보 메커니즘을 단순화합니다.
AgentApprovalExecutor및AgentRequestInfoExecutor.
Before:
from agent_framework.workflows import GroupChat, HandoffOrchestrator
# Group chat with custom coordinator
group = GroupChat(
participants=[agent1, agent2],
coordinator=my_coordinator
)
# Handoff with single tier
handoff = HandoffOrchestrator(
agents=[agent1, agent2],
tier="single"
)
After:
from agent_framework.workflows import (
GroupChatOrchestrator,
HandoffAgentExecutor,
AgentApprovalExecutor
)
# Group chat with star topology
group = GroupChatOrchestrator(
participants=[agent1, agent2]
)
# Handoff with executor-based approach
handoff = HandoffAgentExecutor(
agents=[agent1, agent2]
)
🔴 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
AgentRunResponse 및 AgentRunResponseUpdate는 AgentResponse 및 AgentResponseUpdate으로 이름이 바뀌었습니다.
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_kwargs와 client_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을(를) InvokeFunctionTool 및 WorkflowFactory.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
Agent → ChatMessage → Message, RawChatAgent → RawAgent, ChatClientProtocol → SupportsChatGetResponse |
#3747 |
| 1.0.0b260210 | Notes | 🔴 속보 | 형식 API 검토: Role/FinishReason 형식 변경, 응답/업데이트 생성자 강화, 도우미 이름 바꾸기 from_updates및 제거 try_parse_value |
#3647 |
| 1.0.0b260210 | Notes | 🔴 속보 | API를 중심으로 한 run/get_response 및 ResponseStream 통합 |
#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 명명 표준화됨(TName → NameT) |
#3770 |
| 1.0.0b260210 | Notes | 🔴 속보 | 현재 에이전트 응답 흐름에 맞춰 정렬된 워크플로-에이전트 출력/스트림 동작 | #3649 |
| 1.0.0b260210 | Notes | 🔴 속보 | Fluent 작성기 메서드가 6개 작성기에서 생성자 매개 변수로 이동됨 | #3693 |
| 1.0.0b260210 | Notes | 🔴 속보 | 워크플로 이벤트는 WorkflowEvent에 type 판별자로 단일화됩니다. isinstance() → event.type == "..." |
#3690 |
| 1.0.0b260130 | Notes | 🟡 개선 |
ChatOptions
/
ChatResponse
/
AgentResponse 공통의 응답 형식 |
#3305 |
| 1.0.0b260130 | Notes | 🟡 개선 |
BaseAgent Claude 에이전트 SDK 통합에 대한 지원이 추가됨 |
#3509 |
| 1.0.0b260128 | Notes | 🔴 속보 |
AIFunction → FunctionTool, @ai_function → @tool |
#3413 |
| 1.0.0b260128 | Notes | 🔴 속보 | GroupChat/Magentic에 대한 팩터리 패턴; with_standard_manager → with_manager, participant_factories → register_participant |
#3224 |
| 1.0.0b260128 | Notes | 🔴 속보 |
Github → GitHub |
#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 구성 확대 및 reasoning 및 rai_config 지원 |
#3403, #3265 |
| 1.0.0b260116 | Notes | 🔴 속보 |
create_agent → as_agent |
#3249 |
| 1.0.0b260116 | Notes | 🔴 속보 |
source_executor_id → executor_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 | — | 중요한 변경 내용 없음 | — |