From 5fa5fe53f950f086aba89a748e8c6dd5b1d90480 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= Date: Wed, 11 Mar 2026 13:46:05 +0100 Subject: [PATCH 1/2] feat(agentstack-sdk-py): provide platform defaults MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jan Pokorný --- agents/canvas/src/canvas/agent.py | 3 --- agents/chat/src/chat/agent.py | 5 ----- .../src/content_builder/agent.py | 2 +- agents/form/src/form/agent.py | 3 --- agents/rag/src/rag/agent.py | 5 ----- apps/agentstack-sdk-py/examples/citation_agent.py | 3 +-- .../examples/citation_agent_artifact.py | 3 +-- apps/agentstack-sdk-py/examples/history_framework.py | 2 -- apps/agentstack-sdk-py/examples/oauth.py | 2 -- apps/agentstack-sdk-py/examples/trajectory_agent.py | 3 +-- .../src/agentstack_sdk/server/server.py | 8 +++++--- docs/development/agent-integration/multi-turn.mdx | 10 +++++----- docs/development/agent-integration/observability.mdx | 10 +++++----- 13 files changed, 19 insertions(+), 40 deletions(-) diff --git a/agents/canvas/src/canvas/agent.py b/agents/canvas/src/canvas/agent.py index 1581f65b6f..aa062c6530 100644 --- a/agents/canvas/src/canvas/agent.py +++ b/agents/canvas/src/canvas/agent.py @@ -18,7 +18,6 @@ from agentstack_sdk.a2a.types import AgentArtifact from agentstack_sdk.server import Server from agentstack_sdk.server.context import RunContext -from agentstack_sdk.server.middleware.platform_auth_backend import PlatformAuthBackend from openai import AsyncOpenAI from openai.types.chat import ChatCompletionMessageParam @@ -145,8 +144,6 @@ def serve(): server.run( host=os.getenv("HOST", "127.0.0.1"), port=int(os.getenv("PORT", 10002)), - configure_telemetry=True, - auth_backend=PlatformAuthBackend(), ) except KeyboardInterrupt: pass diff --git a/agents/chat/src/chat/agent.py b/agents/chat/src/chat/agent.py index 36a2e3d175..ad2b70a22e 100644 --- a/agents/chat/src/chat/agent.py +++ b/agents/chat/src/chat/agent.py @@ -32,8 +32,6 @@ from agentstack_sdk.a2a.types import AgentArtifact, AgentMessage from agentstack_sdk.server import Server from agentstack_sdk.server.context import RunContext -from agentstack_sdk.server.middleware.platform_auth_backend import PlatformAuthBackend -from agentstack_sdk.server.store.platform_context_store import PlatformContextStore from beeai_framework.adapters.agentstack.backend.chat import AgentStackChatModel from beeai_framework.agents.requirement import RequirementAgent from beeai_framework.agents.requirement.events import ( @@ -289,9 +287,6 @@ def serve(): server.run( host=os.getenv("HOST", "127.0.0.1"), port=int(os.getenv("PORT", 8000)), - configure_telemetry=True, - context_store=PlatformContextStore(), - auth_backend=PlatformAuthBackend(), ) except KeyboardInterrupt: pass diff --git a/agents/deepagents_content_builder/src/content_builder/agent.py b/agents/deepagents_content_builder/src/content_builder/agent.py index 7639d9ebf3..82cdcbc15b 100644 --- a/agents/deepagents_content_builder/src/content_builder/agent.py +++ b/agents/deepagents_content_builder/src/content_builder/agent.py @@ -165,7 +165,7 @@ async def content_builder_agent( def serve(): try: - server.run(host=os.getenv("HOST", "127.0.0.1"), port=int(os.getenv("PORT", 10003)), configure_telemetry=True) + server.run(host=os.getenv("HOST", "127.0.0.1"), port=int(os.getenv("PORT", 10003))) except KeyboardInterrupt: pass diff --git a/agents/form/src/form/agent.py b/agents/form/src/form/agent.py index a012669f5b..4831e59b66 100644 --- a/agents/form/src/form/agent.py +++ b/agents/form/src/form/agent.py @@ -24,7 +24,6 @@ FormServiceExtensionSpec, ) from agentstack_sdk.server import Server -from agentstack_sdk.server.middleware.platform_auth_backend import PlatformAuthBackend from pydantic import BaseModel agent_detail_extension_spec = agentstack_sdk.a2a.extensions.AgentDetailExtensionSpec( @@ -119,8 +118,6 @@ def serve(): server.run( host=os.getenv("HOST", "127.0.0.1"), port=int(os.getenv("PORT", 10001)), - configure_telemetry=True, - auth_backend=PlatformAuthBackend(), ) except KeyboardInterrupt: pass diff --git a/agents/rag/src/rag/agent.py b/agents/rag/src/rag/agent.py index 15b3b33172..d453eb35dc 100644 --- a/agents/rag/src/rag/agent.py +++ b/agents/rag/src/rag/agent.py @@ -26,8 +26,6 @@ from agentstack_sdk.a2a.types import AgentArtifact, AgentMessage from agentstack_sdk.server import Server from agentstack_sdk.server.context import RunContext -from agentstack_sdk.server.middleware.platform_auth_backend import PlatformAuthBackend -from agentstack_sdk.server.store.platform_context_store import PlatformContextStore from beeai_framework.adapters.agentstack.backend.chat import AgentStackChatModel from beeai_framework.agents.requirement import RequirementAgent from beeai_framework.agents.requirement.utils._tool import FinalAnswerTool @@ -324,9 +322,6 @@ def serve(): server.run( host=os.getenv("HOST", "127.0.0.1"), port=int(os.getenv("PORT", 8000)), - configure_telemetry=True, - context_store=PlatformContextStore(), - auth_backend=PlatformAuthBackend(), ) except KeyboardInterrupt: pass diff --git a/apps/agentstack-sdk-py/examples/citation_agent.py b/apps/agentstack-sdk-py/examples/citation_agent.py index 43b5f9c937..d7097296f9 100644 --- a/apps/agentstack-sdk-py/examples/citation_agent.py +++ b/apps/agentstack-sdk-py/examples/citation_agent.py @@ -16,7 +16,6 @@ from agentstack_sdk.a2a.types import AgentMessage from agentstack_sdk.server import Server from agentstack_sdk.server.context import RunContext -from agentstack_sdk.server.store.platform_context_store import PlatformContextStore server = Server() @@ -69,7 +68,7 @@ async def example_agent( def run(): server.run( - host=os.getenv("HOST", "127.0.0.1"), port=int(os.getenv("PORT", 8000)), context_store=PlatformContextStore() + host=os.getenv("HOST", "127.0.0.1"), port=int(os.getenv("PORT", 8000)) ) diff --git a/apps/agentstack-sdk-py/examples/citation_agent_artifact.py b/apps/agentstack-sdk-py/examples/citation_agent_artifact.py index d6feb0e698..5981e67346 100644 --- a/apps/agentstack-sdk-py/examples/citation_agent_artifact.py +++ b/apps/agentstack-sdk-py/examples/citation_agent_artifact.py @@ -16,7 +16,6 @@ from agentstack_sdk.a2a.types import AgentArtifact from agentstack_sdk.server import Server from agentstack_sdk.server.context import RunContext -from agentstack_sdk.server.store.platform_context_store import PlatformContextStore server = Server() @@ -71,7 +70,7 @@ async def example_agent( def run(): server.run( - host=os.getenv("HOST", "127.0.0.1"), port=int(os.getenv("PORT", 8002)), context_store=PlatformContextStore() + host=os.getenv("HOST", "127.0.0.1"), port=int(os.getenv("PORT", 8002)) ) diff --git a/apps/agentstack-sdk-py/examples/history_framework.py b/apps/agentstack-sdk-py/examples/history_framework.py index aeb2e6ca80..a6a545f5d8 100644 --- a/apps/agentstack-sdk-py/examples/history_framework.py +++ b/apps/agentstack-sdk-py/examples/history_framework.py @@ -21,7 +21,6 @@ from agentstack_sdk.a2a.types import AgentMessage from agentstack_sdk.server import Server from agentstack_sdk.server.context import RunContext -from agentstack_sdk.server.store.platform_context_store import PlatformContextStore server = Server() @@ -91,7 +90,6 @@ def run(): server.run( host=os.getenv("HOST", "127.0.0.1"), port=int(os.getenv("PORT", "8000")), - context_store=PlatformContextStore(), # Enable persistent storage ) diff --git a/apps/agentstack-sdk-py/examples/oauth.py b/apps/agentstack-sdk-py/examples/oauth.py index ced5b3f729..49628d1350 100644 --- a/apps/agentstack-sdk-py/examples/oauth.py +++ b/apps/agentstack-sdk-py/examples/oauth.py @@ -32,7 +32,6 @@ from agentstack_sdk.a2a.types import AgentMessage from agentstack_sdk.server import Server from agentstack_sdk.server.context import RunContext -from agentstack_sdk.server.store.platform_context_store import PlatformContextStore server = Server() @@ -113,7 +112,6 @@ def run(): server.run( host=os.getenv("HOST", "127.0.0.1"), port=int(os.getenv("PORT", "8000")), - context_store=PlatformContextStore(), # Enable persistent storage ) diff --git a/apps/agentstack-sdk-py/examples/trajectory_agent.py b/apps/agentstack-sdk-py/examples/trajectory_agent.py index 1e6b329c77..593742e35e 100644 --- a/apps/agentstack-sdk-py/examples/trajectory_agent.py +++ b/apps/agentstack-sdk-py/examples/trajectory_agent.py @@ -16,7 +16,6 @@ from agentstack_sdk.a2a.types import AgentMessage from agentstack_sdk.server import Server from agentstack_sdk.server.context import RunContext -from agentstack_sdk.server.store.platform_context_store import PlatformContextStore server = Server() @@ -222,7 +221,7 @@ def extract_entities(text): def run(): server.run( - host=os.getenv("HOST", "127.0.0.1"), port=int(os.getenv("PORT", 8000)), context_store=PlatformContextStore() + host=os.getenv("HOST", "127.0.0.1"), port=int(os.getenv("PORT", 8000)) ) diff --git a/apps/agentstack-sdk-py/src/agentstack_sdk/server/server.py b/apps/agentstack-sdk-py/src/agentstack_sdk/server/server.py index 736553e974..2aad780c60 100644 --- a/apps/agentstack-sdk-py/src/agentstack_sdk/server/server.py +++ b/apps/agentstack-sdk-py/src/agentstack_sdk/server/server.py @@ -37,8 +37,9 @@ from agentstack_sdk.platform.provider import Provider from agentstack_sdk.server.agent import Agent, AgentFactory from agentstack_sdk.server.agent import agent as agent_decorator +from agentstack_sdk.server.middleware.platform_auth_backend import PlatformAuthBackend from agentstack_sdk.server.store.context_store import ContextStore -from agentstack_sdk.server.store.memory_context_store import InMemoryContextStore +from agentstack_sdk.server.store.platform_context_store import PlatformContextStore from agentstack_sdk.server.telemetry import configure_telemetry as configure_telemetry_func from agentstack_sdk.server.utils import cancel_task from agentstack_sdk.types import SdkAuthenticationBackend @@ -72,7 +73,7 @@ async def serve( self, *, configure_logger: bool = True, - configure_telemetry: bool = False, + configure_telemetry: bool = True, self_registration: bool = True, self_registration_id: str | None = None, task_store: TaskStore | None = None, @@ -140,7 +141,8 @@ async def serve( if not self._agent_factory: raise ValueError("Agent is not registered") - context_store = context_store or InMemoryContextStore() + context_store = context_store or PlatformContextStore() + auth_backend = auth_backend if auth_backend is not None else PlatformAuthBackend() self._agent = self._agent_factory(context_store.modify_dependencies) card_url = url and url.strip() self._agent.card.url = card_url.rstrip("/") if card_url else f"http://{host}:{port}" diff --git a/docs/development/agent-integration/multi-turn.mdx b/docs/development/agent-integration/multi-turn.mdx index fd15154c87..f626270338 100644 --- a/docs/development/agent-integration/multi-turn.mdx +++ b/docs/development/agent-integration/multi-turn.mdx @@ -12,7 +12,7 @@ When building conversational AI agents, one of the key requirements is maintaini | **await context.store(input)** | Stores current user message in conversation history. Storage of messages must be explicitly requested| | **await context.store(response)** | Stores agent’s responses in conversation history, and must be explicitly requested | | **context: RunContext)** | Sets up a RunContext instance for storing and accessing the conversation history | -| **context_store=PlatformContextStore()** | Configures server to use the platform’s persistent context store to maintain conversation history across agent restarts | +| **context_store** | Configures the context store used to persist conversation history. Defaults to `PlatformContextStore()` for persistent storage across agent restarts. | ## Simple History Access Example @@ -306,23 +306,23 @@ This advanced example demonstrates several key concepts: ### Persistent Storage Example -By default, conversation history is stored in memory and is lost when the agent process restarts. For production applications, you'll want to use persistent context storage to maintain conversation history across agent restarts. The `PlatformContextStore` automatically handles conversation persistence, ensuring that users can continue their conversations even after agent restarts or deployments. +Conversation history is automatically persisted using `PlatformContextStore` by default, ensuring users can continue their conversations even after agent restarts or deployments. No extra configuration is needed: ```python import os from agentstack_sdk.server import Server -from agentstack_sdk.server.store.platform_context_store import PlatformContextStore server = Server() def run(): server.run( - host=os.getenv("HOST", "127.0.0.1"), + host=os.getenv("HOST", "127.0.0.1"), port=int(os.getenv("PORT", 8000)), - context_store=PlatformContextStore() ) ``` +To opt out of persistent storage and use in-memory history only, pass `context_store=InMemoryContextStore()` explicitly. + ### History Contents diff --git a/docs/development/agent-integration/observability.mdx b/docs/development/agent-integration/observability.mdx index c1761d9d3b..c254508557 100644 --- a/docs/development/agent-integration/observability.mdx +++ b/docs/development/agent-integration/observability.mdx @@ -47,7 +47,7 @@ For telemetry to flow successfully, it must be enabled at three levels: - The server must be configured to export that data by setting `configure_telemetry=True`. + Telemetry export is enabled by default. You can disable it by setting `configure_telemetry=False` in `server.run()`. @@ -59,7 +59,7 @@ For telemetry to flow successfully, it must be enabled at three levels: ## Agent SDK Configuration Before configuring an observability platform, your agent code must be "telemetry-aware." This configuration applies to all implementations, whether you are using local Phoenix or a cloud provider like Langfuse. -You must initialize instrumentation at the agent logic level and enable the export flag in the Agent Stack SDK: +You must initialize instrumentation at the agent logic level. Telemetry export to the platform collector is enabled by default: ```python from agentstack_sdk.server import Server @@ -72,11 +72,11 @@ from agentstack_sdk.server import Server server = Server() @server.agent() -async def my_agent(): +async def my_agent(): ... -# 2. SDK Level: Enable the bridge to the platform collector -server.run(configure_telemetry=True) +# 2. SDK Level: telemetry export is enabled by default +server.run() ``` From dbbfe66ba9aa722bf080c7dac578fdb4564086b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= Date: Wed, 11 Mar 2026 14:47:49 +0100 Subject: [PATCH 2/2] fix: circular import MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jan Pokorný --- apps/agentstack-sdk-py/src/agentstack_sdk/server/server.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/agentstack-sdk-py/src/agentstack_sdk/server/server.py b/apps/agentstack-sdk-py/src/agentstack_sdk/server/server.py index 2aad780c60..99e8ecb98e 100644 --- a/apps/agentstack-sdk-py/src/agentstack_sdk/server/server.py +++ b/apps/agentstack-sdk-py/src/agentstack_sdk/server/server.py @@ -37,9 +37,7 @@ from agentstack_sdk.platform.provider import Provider from agentstack_sdk.server.agent import Agent, AgentFactory from agentstack_sdk.server.agent import agent as agent_decorator -from agentstack_sdk.server.middleware.platform_auth_backend import PlatformAuthBackend from agentstack_sdk.server.store.context_store import ContextStore -from agentstack_sdk.server.store.platform_context_store import PlatformContextStore from agentstack_sdk.server.telemetry import configure_telemetry as configure_telemetry_func from agentstack_sdk.server.utils import cancel_task from agentstack_sdk.types import SdkAuthenticationBackend @@ -141,7 +139,10 @@ async def serve( if not self._agent_factory: raise ValueError("Agent is not registered") - context_store = context_store or PlatformContextStore() + from agentstack_sdk.server.middleware.platform_auth_backend import PlatformAuthBackend + from agentstack_sdk.server.store.platform_context_store import PlatformContextStore + + context_store = context_store if context_store is not None else PlatformContextStore() auth_backend = auth_backend if auth_backend is not None else PlatformAuthBackend() self._agent = self._agent_factory(context_store.modify_dependencies) card_url = url and url.strip()