From 266aef640b9a45766ca7bc09d30673b139a3927e Mon Sep 17 00:00:00 2001 From: Chinedum Echeta <60179183+cecheta@users.noreply.github.com> Date: Thu, 12 Mar 2026 16:31:33 +0000 Subject: [PATCH 1/4] Add context_providers and description to `workflow.as_agent()` --- .../agent_framework/_workflows/_workflow.py | 22 ++++++++++++++++--- .../tests/workflow/test_workflow_agent.py | 17 ++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/python/packages/core/agent_framework/_workflows/_workflow.py b/python/packages/core/agent_framework/_workflows/_workflow.py index 58050eece9..50697453b3 100644 --- a/python/packages/core/agent_framework/_workflows/_workflow.py +++ b/python/packages/core/agent_framework/_workflows/_workflow.py @@ -13,6 +13,7 @@ from collections.abc import AsyncIterable, Awaitable, Callable, Mapping, Sequence from typing import Any, Literal, overload +from .._sessions import BaseContextProvider from .._types import ResponseStream from ..observability import OtelAttr, capture_exception, create_workflow_span from ._agent import WorkflowAgent @@ -910,7 +911,13 @@ def output_types(self) -> list[type[Any] | types.UnionType]: return list(output_types) - def as_agent(self, name: str | None = None) -> WorkflowAgent: + def as_agent( + self, + name: str | None = None, + description: str | None = None, + context_providers: Sequence[BaseContextProvider] | None = None, + **kwargs: Any, + ) -> WorkflowAgent: """Create a WorkflowAgent that wraps this workflow. The returned agent converts standard agent inputs (strings, Message, or lists of these) @@ -924,7 +931,10 @@ def as_agent(self, name: str | None = None) -> WorkflowAgent: initialization will fail with a ValueError. Args: - name: Optional name for the agent. If None, a default name will be generated. + name: Optional name for the agent. + description: Optional description of the agent. + context_providers: Optional sequence of context providers for the agent. + **kwargs: Additional keyword arguments passed to BaseAgent. Returns: A WorkflowAgent instance that wraps this workflow. @@ -935,4 +945,10 @@ def as_agent(self, name: str | None = None) -> WorkflowAgent: # Import here to avoid circular imports from ._agent import WorkflowAgent - return WorkflowAgent(workflow=self, name=name) + return WorkflowAgent( + workflow=self, + name=name, + description=description, + context_providers=context_providers, + **kwargs, + ) diff --git a/python/packages/core/tests/workflow/test_workflow_agent.py b/python/packages/core/tests/workflow/test_workflow_agent.py index dd2100c1ae..7294d754a7 100644 --- a/python/packages/core/tests/workflow/test_workflow_agent.py +++ b/python/packages/core/tests/workflow/test_workflow_agent.py @@ -312,6 +312,23 @@ def test_workflow_as_agent_method(self) -> None: assert isinstance(agent_no_name, WorkflowAgent) assert agent_no_name.workflow is workflow + def test_workflow_as_agent_with_description_and_context_providers(self) -> None: + """Test that Workflow.as_agent() forwards description and context_providers.""" + executor = SimpleExecutor(id="executor1", response_text="Response") + workflow = WorkflowBuilder(start_executor=executor).build() + + history_provider = InMemoryHistoryProvider() + agent = workflow.as_agent( + name="MyAgent", + description="A test agent", + context_providers=[history_provider], + ) + + assert isinstance(agent, WorkflowAgent) + assert agent.name == "MyAgent" + assert agent.description == "A test agent" + assert history_provider in agent.context_providers + def test_workflow_as_agent_cannot_handle_agent_inputs(self) -> None: """Test that Workflow.as_agent() raises an error if the start executor cannot handle agent inputs.""" From 8abe74bf8f2bd56cf7cd3eef1341de981177d8c4 Mon Sep 17 00:00:00 2001 From: Chinedum Echeta <60179183+cecheta@users.noreply.github.com> Date: Fri, 13 Mar 2026 09:55:12 +0000 Subject: [PATCH 2/4] Add default workflow name and description --- .../core/agent_framework/_workflows/_workflow.py | 8 ++++---- .../core/tests/workflow/test_workflow_agent.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/python/packages/core/agent_framework/_workflows/_workflow.py b/python/packages/core/agent_framework/_workflows/_workflow.py index 50697453b3..b5a1c29ba3 100644 --- a/python/packages/core/agent_framework/_workflows/_workflow.py +++ b/python/packages/core/agent_framework/_workflows/_workflow.py @@ -931,8 +931,8 @@ def as_agent( initialization will fail with a ValueError. Args: - name: Optional name for the agent. - description: Optional description of the agent. + name: Optional name for the agent. Defaults to workflow name. + description: Optional description of the agent. Defaults to workflow description. context_providers: Optional sequence of context providers for the agent. **kwargs: Additional keyword arguments passed to BaseAgent. @@ -947,8 +947,8 @@ def as_agent( return WorkflowAgent( workflow=self, - name=name, - description=description, + name=name if name is not None else self.name, + description=description if description is not None else self.description, context_providers=context_providers, **kwargs, ) diff --git a/python/packages/core/tests/workflow/test_workflow_agent.py b/python/packages/core/tests/workflow/test_workflow_agent.py index 7294d754a7..93157df23a 100644 --- a/python/packages/core/tests/workflow/test_workflow_agent.py +++ b/python/packages/core/tests/workflow/test_workflow_agent.py @@ -329,6 +329,20 @@ def test_workflow_as_agent_with_description_and_context_providers(self) -> None: assert agent.description == "A test agent" assert history_provider in agent.context_providers + def test_workflow_as_agent_defaults_name_and_description_from_workflow(self) -> None: + """Test that as_agent() defaults name and description to the workflow's own values.""" + executor = SimpleExecutor(id="executor1", response_text="Response") + workflow = WorkflowBuilder( + start_executor=executor, + name="my-workflow", + description="Workflow description", + ).build() + + agent = workflow.as_agent() + + assert agent.name == "my-workflow" + assert agent.description == "Workflow description" + def test_workflow_as_agent_cannot_handle_agent_inputs(self) -> None: """Test that Workflow.as_agent() raises an error if the start executor cannot handle agent inputs.""" From 330fa50c5bcd59d6d4a3ac0564ac7448a14b0727 Mon Sep 17 00:00:00 2001 From: Chinedum Echeta <60179183+cecheta@users.noreply.github.com> Date: Fri, 13 Mar 2026 10:03:29 +0000 Subject: [PATCH 3/4] Positional --- python/packages/core/agent_framework/_workflows/_workflow.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/packages/core/agent_framework/_workflows/_workflow.py b/python/packages/core/agent_framework/_workflows/_workflow.py index b5a1c29ba3..4efe7b4cb6 100644 --- a/python/packages/core/agent_framework/_workflows/_workflow.py +++ b/python/packages/core/agent_framework/_workflows/_workflow.py @@ -914,6 +914,7 @@ def output_types(self) -> list[type[Any] | types.UnionType]: def as_agent( self, name: str | None = None, + *, description: str | None = None, context_providers: Sequence[BaseContextProvider] | None = None, **kwargs: Any, From dc93d88179bba5730b8c6d916c2b6840474427e4 Mon Sep 17 00:00:00 2001 From: Chinedum Echeta <60179183+cecheta@users.noreply.github.com> Date: Tue, 17 Mar 2026 08:35:31 +0000 Subject: [PATCH 4/4] Move import --- .../core/agent_framework/_workflows/_workflow.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/python/packages/core/agent_framework/_workflows/_workflow.py b/python/packages/core/agent_framework/_workflows/_workflow.py index 4efe7b4cb6..fc26db8953 100644 --- a/python/packages/core/agent_framework/_workflows/_workflow.py +++ b/python/packages/core/agent_framework/_workflows/_workflow.py @@ -11,12 +11,11 @@ import types import uuid from collections.abc import AsyncIterable, Awaitable, Callable, Mapping, Sequence -from typing import Any, Literal, overload +from typing import TYPE_CHECKING, Any, Literal, overload -from .._sessions import BaseContextProvider +from .._sessions import ContextProvider from .._types import ResponseStream from ..observability import OtelAttr, capture_exception, create_workflow_span -from ._agent import WorkflowAgent from ._checkpoint import CheckpointStorage from ._const import DEFAULT_MAX_ITERATIONS, GLOBAL_KWARGS_KEY, WORKFLOW_RUN_KWARGS_KEY from ._edge import ( @@ -36,6 +35,9 @@ from ._state import State from ._typing_utils import is_instance_of, try_coerce_to_type +if TYPE_CHECKING: + from ._agent import WorkflowAgent + logger = logging.getLogger(__name__) @@ -916,7 +918,7 @@ def as_agent( name: str | None = None, *, description: str | None = None, - context_providers: Sequence[BaseContextProvider] | None = None, + context_providers: Sequence[ContextProvider] | None = None, **kwargs: Any, ) -> WorkflowAgent: """Create a WorkflowAgent that wraps this workflow.