From b265f1d060d4516bce2c912e5a1832d52eb09f40 Mon Sep 17 00:00:00 2001 From: Strands Agent <217235299+strands-agent@users.noreply.github.com> Date: Fri, 20 Feb 2026 20:44:26 +0000 Subject: [PATCH 1/2] docs: add plugins documentation - Add new docs/user-guide/concepts/plugins/index.md with comprehensive plugin documentation covering overview, basic usage, creating custom plugins, async initialization, advanced patterns, and best practices - Update mkdocs.yml navigation to include Plugins under Concepts - Update docs/community/get-featured.md to add Plugins category type - Update docs/user-guide/concepts/agents/hooks.md with: - Plugin recommendation tip at the top - Simplified agent.add_hook() API with type inference documentation - HookProvider vs Plugin comparison note - Add plugin recommendation tips to guardrails.md and retry-strategies.md - Update AGENTS.md directory structure to include plugins directory Resolves #568 --- AGENTS.md | 2 + docs/community/get-featured.md | 1 + docs/user-guide/concepts/agents/hooks.md | 38 +- .../concepts/agents/retry-strategies.md | 3 + docs/user-guide/concepts/plugins/index.md | 329 ++++++++++++++++++ docs/user-guide/safety-security/guardrails.md | 3 + mkdocs.yml | 2 + 7 files changed, 374 insertions(+), 4 deletions(-) create mode 100644 docs/user-guide/concepts/plugins/index.md diff --git a/AGENTS.md b/AGENTS.md index 788033da..7702863c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -201,6 +201,8 @@ These documents define the standards and processes that ensure consistency and q │ │ │ ├── multi-agent-patterns.md │ │ │ ├── swarm.md │ │ │ └── workflow.md +│ │ ├── plugins +│ │ │ └── index.md │ │ ├── streaming │ │ │ ├── async-iterators.md │ │ │ ├── callback-handlers.md diff --git a/docs/community/get-featured.md b/docs/community/get-featured.md index cb6bfe37..6b6d7107 100644 --- a/docs/community/get-featured.md +++ b/docs/community/get-featured.md @@ -28,6 +28,7 @@ Place your documentation in the right spot: | Model Providers | `community/model-providers/` | `cohere.md` | | Tools | `community/tools/` | `strands-deepgram.md` | | Session Managers | `community/session-managers/` | `agentcore-memory.md` | +| Plugins | `community/plugins/` | `my-plugin.md` | | Integrations | `community/integrations/` | `ag-ui.md` | ## Document Layout diff --git a/docs/user-guide/concepts/agents/hooks.md b/docs/user-guide/concepts/agents/hooks.md index c366ed24..31df367a 100644 --- a/docs/user-guide/concepts/agents/hooks.md +++ b/docs/user-guide/concepts/agents/hooks.md @@ -2,9 +2,12 @@ Hooks are a composable extensibility mechanism for extending agent functionality by subscribing to events throughout the agent lifecycle. The hook system enables both built-in components and user code to react to or modify agent behavior through strongly-typed event callbacks. +!!! tip "Consider Plugins for High-Level Behavior Changes" + For packaging reusable agent extensions or implementing complex behavior changes, consider using [Plugins](../plugins/index.md) instead of raw hooks. Plugins provide a higher-level abstraction that encapsulates related hooks, configuration, and initialization logic into shareable packages. + ## Overview -The hooks system is a composable, type-safe system that supports multiple subscribers per event type. +The hooks system is a composable, type-safe system that supports multiple subscribers per event type. A **Hook Event** is a specific event in the lifecycle that callbacks can be associated with. A **Hook Callback** is a callback function that is invoked when the hook event is emitted. @@ -23,18 +26,27 @@ Hook callbacks are registered against specific event types and receive strongly- ### Registering Individual Hook Callbacks -You can register callbacks for specific events using `agent.hooks` after the fact: +The simplest way to register a hook callback is using the `agent.add_hook()` method: === "Python" ```python + from strands import Agent + from strands.hooks import BeforeInvocationEvent, BeforeToolCallEvent + agent = Agent() - # Register individual callbacks + # Register individual callbacks using the simplified API def my_callback(event: BeforeInvocationEvent) -> None: print("Custom callback triggered") - agent.hooks.add_callback(BeforeInvocationEvent, my_callback) + agent.add_hook(my_callback, BeforeInvocationEvent) + + # Type inference: If your callback has a type hint, the event type is inferred + def typed_callback(event: BeforeToolCallEvent) -> None: + print(f"Tool called: {event.tool_use['name']}") + + agent.add_hook(typed_callback) # Event type inferred from type hint ``` === "TypeScript" @@ -43,6 +55,21 @@ You can register callbacks for specific events using `agent.hooks` after the fac --8<-- "user-guide/concepts/agents/hooks.ts:individual_callback" ``` +You can also use the `agent.hooks.add_callback()` method for explicit event type specification: + +=== "Python" + + ```python + agent = Agent() + + def my_callback(event: BeforeInvocationEvent) -> None: + print("Custom callback triggered") + + agent.hooks.add_callback(BeforeInvocationEvent, my_callback) + ``` + +{{ ts_not_supported_code("This syntax is not yet available in TypeScript SDK") }} + For multi-agent orchestrators, you can register callbacks for orchestration events: === "Python" @@ -91,6 +118,9 @@ The `HookProvider` protocol allows a single object to register callbacks for mul --8<-- "user-guide/concepts/agents/hooks.ts:hook_provider_class" ``` +!!! note "HookProvider vs Plugin" + For simple hook registration, `HookProvider` works well. However, if you need initialization logic, configuration, or plan to share your extension with others, consider creating a [Plugin](../plugins/index.md) instead. Plugins extend the `HookProvider` pattern with additional capabilities like named identification and agent-aware initialization. + ## Hook Event Lifecycle ### Single-Agent Lifecycle diff --git a/docs/user-guide/concepts/agents/retry-strategies.md b/docs/user-guide/concepts/agents/retry-strategies.md index 45455ede..4ebcc9da 100644 --- a/docs/user-guide/concepts/agents/retry-strategies.md +++ b/docs/user-guide/concepts/agents/retry-strategies.md @@ -96,4 +96,7 @@ Built in retry constructs like `ModelRetryStrategy` are useful for customizing m Unlike `ModelRetryStrategy`, hooks don't automatically introduce delays between retries. The example above uses `asyncio.sleep` to add a 2-second delay before each retry. +!!! tip "Package as a Plugin" + If you want to share custom retry logic with others or reuse it across projects, consider packaging it as a [Plugin](../plugins/index.md). Plugins provide a clean interface for configuration and make your extensions easier to distribute. + See [Hooks](hooks.md#model-call-retry) for more examples. diff --git a/docs/user-guide/concepts/plugins/index.md b/docs/user-guide/concepts/plugins/index.md new file mode 100644 index 00000000..66a56e3f --- /dev/null +++ b/docs/user-guide/concepts/plugins/index.md @@ -0,0 +1,329 @@ +# Plugins + +Plugins are a composable mechanism for extending agent functionality by encapsulating related hooks, configuration, and initialization logic into reusable packages. While [hooks](../agents/hooks.md) provide fine-grained control over agent lifecycle events, plugins offer a higher-level abstraction for packaging behavior changes that can be easily shared and reused. + +## Overview + +Plugins build on the hooks system to provide: + +- **Encapsulation**: Bundle related hooks, configuration, and state into a single reusable unit +- **Initialization**: Perform setup tasks when attached to an agent (register hooks, modify attributes, etc.) +- **Composability**: Combine multiple plugins to build complex agent behaviors +- **Shareability**: Package and distribute agent extensions for others to use + +```mermaid +flowchart LR + subgraph Plugin["Plugin"] + direction TB + Name["name property"] + Init["init_plugin()"] + State["Internal State"] + end + + subgraph Agent["Agent"] + direction TB + Hooks["Hook Registry"] + Config["Agent Configuration"] + end + + Plugin -->|"registers hooks"| Hooks + Plugin -->|"modifies"| Config +``` + +## Basic Usage + +### Using Plugins + +Plugins are passed to agents during initialization via the `plugins` parameter: + +=== "Python" + + ```python + from strands import Agent + from strands.experimental.steering import LLMSteeringHandler + + # Create an agent with plugins + agent = Agent( + tools=[my_tool], + plugins=[LLMSteeringHandler(system_prompt="Guide the agent...")] + ) + ``` + +{{ ts_not_supported_code("Plugins are not yet available in TypeScript SDK") }} + +### Creating Custom Plugins + +To create a plugin, extend the `Plugin` base class and implement the required `name` property and `init_plugin` method: + +=== "Python" + + ```python + from strands.plugins import Plugin + from strands.hooks import BeforeToolCallEvent, AfterToolCallEvent + from typing import TYPE_CHECKING + + if TYPE_CHECKING: + from strands import Agent + + class LoggingPlugin(Plugin): + """A plugin that logs all tool calls.""" + + name = "logging-plugin" + + def init_plugin(self, agent: "Agent") -> None: + """Initialize the plugin with an agent instance.""" + # Register hooks using the simplified add_hook API + agent.add_hook(self.log_before_tool, BeforeToolCallEvent) + agent.add_hook(self.log_after_tool, AfterToolCallEvent) + + def log_before_tool(self, event: BeforeToolCallEvent) -> None: + print(f"Calling tool: {event.tool_use['name']}") + + def log_after_tool(self, event: AfterToolCallEvent) -> None: + print(f"Tool completed: {event.tool_use['name']}") + + # Use the plugin + agent = Agent( + tools=[my_tool], + plugins=[LoggingPlugin()] + ) + ``` + +{{ ts_not_supported_code("Plugins are not yet available in TypeScript SDK") }} + +## Plugin Interface + +The `Plugin` base class defines the contract that all plugins must follow: + +### Required Members + +| Member | Type | Description | +|--------|------|-------------| +| `name` | `str` (property) | A stable string identifier for the plugin. Should be unique and descriptive. | +| `init_plugin(agent)` | Method | Called when the plugin is attached to an agent. Use this to register hooks, modify agent configuration, or perform other initialization. | + +### The `init_plugin` Method + +The `init_plugin` method receives the agent instance and can: + +- Register hooks via `agent.add_hook(callback, EventType)` +- Access and modify agent attributes +- Store references for later use +- Perform async initialization (return an `Awaitable`) + +=== "Python" + + ```python + from strands.plugins import Plugin + from strands.hooks import BeforeInvocationEvent + + class ConfigPlugin(Plugin): + name = "config-plugin" + + def __init__(self, setting: str): + self.setting = setting + + def init_plugin(self, agent: "Agent") -> None: + # Access agent attributes + print(f"Attaching to agent: {agent.name}") + + # Register hooks + agent.add_hook(self.on_invocation, BeforeInvocationEvent) + + # Store agent reference if needed + self.agent = agent + + def on_invocation(self, event: BeforeInvocationEvent) -> None: + print(f"Using setting: {self.setting}") + ``` + +{{ ts_not_supported_code("Plugins are not yet available in TypeScript SDK") }} + +## Async Plugin Initialization + +Plugins can perform asynchronous initialization by returning an `Awaitable` from `init_plugin`: + +=== "Python" + + ```python + import asyncio + from strands.plugins import Plugin + + class AsyncPlugin(Plugin): + name = "async-plugin" + + async def init_plugin(self, agent: "Agent") -> None: + # Perform async setup + self.config = await self.load_remote_config() + agent.add_hook(self.handler, BeforeToolCallEvent) + + async def load_remote_config(self) -> dict: + # Simulate async config loading + await asyncio.sleep(0.1) + return {"key": "value"} + ``` + +{{ ts_not_supported_code("Plugins are not yet available in TypeScript SDK") }} + +## Plugins vs. Hooks + +Understanding when to use plugins versus raw hooks: + +| Use Case | Recommended Approach | +|----------|---------------------| +| Simple, one-off event handling | Use hooks directly via `agent.add_hook()` | +| Reusable behavior packages | Create a plugin | +| Sharing extensions with others | Create a plugin | +| Complex initialization logic | Create a plugin | +| Stateful event handling | Create a plugin | +| Quick prototyping | Use hooks directly | + +### When to Use Plugins + +- **Packaging related hooks**: When you have multiple hooks that work together +- **Distributing extensions**: When you want others to use your agent extensions +- **Complex setup requirements**: When initialization involves configuration, validation, or async operations +- **Maintaining state**: When your hooks need shared state or configuration + +### When to Use Hooks Directly + +- **Simple callbacks**: Single event handlers that don't need state +- **Quick experiments**: Rapid prototyping during development +- **Application-specific logic**: Code that won't be reused elsewhere + +## Advanced Patterns + +### Plugin Composition + +Combine multiple plugins to build complex agent behaviors: + +=== "Python" + + ```python + from strands import Agent + + # Compose multiple plugins + agent = Agent( + tools=[my_tools], + plugins=[ + LoggingPlugin(), + MetricsPlugin(), + ValidationPlugin(rules=my_rules), + ] + ) + ``` + +{{ ts_not_supported_code("Plugins are not yet available in TypeScript SDK") }} + +### Conditional Hook Registration + +Register hooks based on runtime conditions: + +=== "Python" + + ```python + from strands.plugins import Plugin + from strands.hooks import BeforeToolCallEvent, AfterToolCallEvent + import os + + class ConditionalPlugin(Plugin): + name = "conditional-plugin" + + def init_plugin(self, agent: "Agent") -> None: + # Only register detailed logging in debug mode + if os.getenv("DEBUG"): + agent.add_hook(self.detailed_log, BeforeToolCallEvent) + agent.add_hook(self.detailed_log_after, AfterToolCallEvent) + else: + agent.add_hook(self.simple_log, AfterToolCallEvent) + ``` + +{{ ts_not_supported_code("Plugins are not yet available in TypeScript SDK") }} + +### Error Handling in Plugins + +Handle errors gracefully during initialization: + +=== "Python" + + ```python + from strands.plugins import Plugin + import logging + + logger = logging.getLogger(__name__) + + class RobustPlugin(Plugin): + name = "robust-plugin" + + def init_plugin(self, agent: "Agent") -> None: + try: + self.config = self.load_config() + agent.add_hook(self.handler, BeforeToolCallEvent) + except FileNotFoundError: + logger.warning("Config not found, using defaults") + self.config = self.default_config() + agent.add_hook(self.handler, BeforeToolCallEvent) + ``` + +{{ ts_not_supported_code("Plugins are not yet available in TypeScript SDK") }} + +## Best Practices + +### Naming Conventions + +- Use descriptive, unique names for your plugins +- Consider namespacing if distributing: `"myorg-feature-plugin"` +- Keep names stable across versions for compatibility + +### Plugin Design + +- **Single responsibility**: Each plugin should have one clear purpose +- **Minimal side effects**: Avoid modifying global state +- **Document dependencies**: Clearly state what your plugin requires +- **Graceful degradation**: Handle missing dependencies or configuration gracefully + +### Hook Registration + +- Register only the hooks you need +- Use the simplified `agent.add_hook(callback, EventType)` API +- Clean up resources if your plugin maintains state + +## Existing Plugins + +### Steering Plugin + +The [Steering](../experimental/steering.md) plugin provides modular prompting capabilities for complex agent tasks: + +=== "Python" + + ```python + from strands import Agent + from strands.experimental.steering import LLMSteeringHandler + + handler = LLMSteeringHandler( + system_prompt=""" + You provide guidance to ensure responses are appropriate. + """ + ) + + agent = Agent( + tools=[my_tool], + plugins=[handler] + ) + ``` + +{{ ts_not_supported_code("Plugins are not yet available in TypeScript SDK") }} + +## Sharing Plugins + +Want to share your plugin with the community? See [Get Featured](../../../community/get-featured.md) for guidelines on contributing to the Strands ecosystem. Published plugins can be: + +- Distributed via PyPI for easy installation +- Featured in the community catalog +- Discovered by other Strands developers + +## Next Steps + +- [Hooks](../agents/hooks.md) - Learn about the underlying hook system +- [Steering](../experimental/steering.md) - Explore the built-in steering plugin +- [Get Featured](../../../community/get-featured.md) - Share your plugins with the community diff --git a/docs/user-guide/safety-security/guardrails.md b/docs/user-guide/safety-security/guardrails.md index 49a12214..ff1e24c2 100644 --- a/docs/user-guide/safety-security/guardrails.md +++ b/docs/user-guide/safety-security/guardrails.md @@ -55,6 +55,9 @@ print(f"Conversation: {json.dumps(agent.messages, indent=4)}") Alternatively, if you want to implement your own soft-launching guardrails, you can utilize Hooks along with Bedrock's ApplyGuardrail API in shadow mode. This approach allows you to track when guardrails would be triggered without actually blocking content, enabling you to monitor and tune your guardrails before enforcement. +!!! tip "Consider Creating a Plugin" + If you plan to reuse this guardrails pattern across multiple agents or share it with your team, consider packaging it as a [Plugin](../concepts/plugins/index.md) for easier distribution and configuration. + Steps: 1. Create a NotifyOnlyGuardrailsHook class that contains hooks diff --git a/mkdocs.yml b/mkdocs.yml index 1e15d1f6..5873c4a1 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -106,6 +106,8 @@ nav: - Model Context Protocol (MCP): user-guide/concepts/tools/mcp-tools.md - Executors: user-guide/concepts/tools/executors.md - Community Tools Package: user-guide/concepts/tools/community-tools-package.md + - Plugins: + - Overview: user-guide/concepts/plugins/index.md - Model Providers: - Overview: user-guide/concepts/model-providers/index.md - Amazon Bedrock: user-guide/concepts/model-providers/amazon-bedrock.md From b86e218940a87eb64ae30f80266f13ab476cf990 Mon Sep 17 00:00:00 2001 From: Strands Agent <217235299+strands-agent@users.noreply.github.com> Date: Fri, 20 Feb 2026 20:45:39 +0000 Subject: [PATCH 2/2] Additional changes from write operations --- build_output.log | 264 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 264 insertions(+) create mode 100644 build_output.log diff --git a/build_output.log b/build_output.log new file mode 100644 index 00000000..a0ad3aa5 --- /dev/null +++ b/build_output.log @@ -0,0 +1,264 @@ + +> docs@1.0.0 docs:clone +> rm -rf sdk-typescript && git clone https://github.com/strands-agents/sdk-typescript.git + +Cloning into 'sdk-typescript'... + +> docs@1.0.0 docs:ts +> typedoc --options typedoc.json + +[warning] HookRegistry, defined in @strands-agents/sdk/src/hooks/registry.ts, is referenced by HookRegistry but not included in the documentation +[warning] RuntimeConfig, defined in @strands-agents/sdk/src/mcp.ts, is referenced by McpClientConfig but not included in the documentation +[warning] ModelContentBlockStopEventData, defined in @strands-agents/sdk/src/models/streaming.ts, is referenced by ModelStreamEvent but not included in the documentation +[warning] ModelStreamEventHook, defined in @strands-agents/sdk/src/hooks/events.ts, is referenced by AgentStreamEvent but not included in the documentation +[warning] JSONSerializable, defined in @strands-agents/sdk/src/types/json.ts, is referenced by S3Location but not included in the documentation +[warning] JsonBlockData, defined in @strands-agents/sdk/src/types/messages.ts, is referenced by JsonBlock but not included in the documentation +[warning] SystemContentBlockData, defined in @strands-agents/sdk/src/types/messages.ts, is referenced by SystemPromptData but not included in the documentation +[warning] ZodInferred, defined in @strands-agents/sdk/src/tools/zod-tool.ts, is referenced by tool but not included in the documentation +[warning] ToolResultContentData, defined in @strands-agents/sdk/src/types/messages.ts, is referenced by ToolResultBlockData.content but not included in the documentation +[warning] ToolRegistry, defined in @strands-agents/sdk/src/registry/tool-registry.ts, is referenced by Agent.toolRegistry but not included in the documentation +[warning] HookCleanup, defined in @strands-agents/sdk/src/hooks/types.ts, is referenced by HookRegistry.addCallback but not included in the documentation +[warning] McpTool, defined in @strands-agents/sdk/src/tools/mcp-tool.ts, is referenced by McpClient.listTools but not included in the documentation +[warning] StreamAggregatedResult, defined in @strands-agents/sdk/src/models/model.ts, is referenced by BedrockModel.streamAggregated but not included in the documentation +[warning] ToolConfig, defined in @strands-agents/sdk/src/tools/zod-tool.ts, is referenced by tool.config but not included in the documentation +[warning] Serialized, defined in @strands-agents/sdk/src/types/json.ts, is referenced by ImageBlock.__type.image but not included in the documentation +[warning] InvokeArgs, defined in @strands-agents/sdk/src/agent/agent.ts, is referenced by Agent.invoke.args but not included in the documentation +[warning] FunctionToolConfig, defined in @strands-agents/sdk/src/tools/function-tool.ts, is referenced by FunctionTool.constructor.config but not included in the documentation +[info] html generated at ./docs/api-reference/typescript +[warning] Found 0 errors and 17 warnings + + │ ⚠ WARNING – MkDocs 2.0 is incompatible with Material for MkDocs + │  + │  MkDocs 1.x is unmaintained. We recommend switching to Zensical, our + │  new static site generator, as soon as possible. We're providing an + │  analysis of the situation in this article: + │  + │  https://squidfunk.github.io/mkdocs-material/blog/2026/02/18/mkdocs-2.0/ + +✓ TypeScript clone repository successfully +✓ TypeScript documentation generated successfully +✓ Python Repository cloned successfully +Failed to install package: Command '['pip', 'install', './temp_python_sdk[all,bidi-all]']' returned non-zero exit status 1. +Generating Python API docs... +Found module: strands.interrupt +Found module: strands.agent.agent +Found module: strands.agent.state +Found module: strands.agent.agent_result +Found module (with import issues): strands.agent.a2a_agent - No module named 'a2a' +Found module: strands.agent.base +Found module (with import issues): strands.models.writer - No module named 'writerai' +Found module (with import issues): strands.models.litellm - No module named 'litellm' +Found module (with import issues): strands.models.openai - No module named 'openai' +Found module: strands.models.llamacpp +Found module (with import issues): strands.models.sagemaker - No module named 'mypy_boto3_sagemaker_runtime' +Found module (with import issues): strands.models.gemini - cannot import name 'genai' from 'google' (unknown location) +Found module (with import issues): strands.models.llamaapi - No module named 'llama_api_client' +Found module (with import issues): strands.models.ollama - No module named 'ollama' +Found module: strands.models.bedrock +Found module (with import issues): strands.models.mistral - No module named 'mistralai' +Found module: strands.models.model +Found module (with import issues): strands.models.anthropic - No module named 'anthropic' +Found module: strands.types.interrupt +Found module: strands.types.agent +Found module: strands.types.event_loop +Found module: strands.types.traces +Found module: strands.types.multiagent +Found module: strands.types.collections +Found module: strands.types.citations +Found module: strands.types.exceptions +Found module: strands.types.session +Found module: strands.types.json_dict +Found module (with import issues): strands.types.a2a - No module named 'a2a' +Found module: strands.types.content +Found module: strands.types.media +Found module: strands.types.guardrails +Found module: strands.types.streaming +Found module: strands.types.tools +Found module: strands.multiagent.graph +Found module: strands.multiagent.swarm +Found module: strands.multiagent.base +Found module: strands.event_loop.event_loop +Found module: strands.event_loop.streaming +Found module: strands.handlers.callback_handler +Found module: strands.telemetry.metrics +Found module: strands.telemetry.tracer +Found module: strands.telemetry.metrics_constants +Found module: strands.telemetry.config +Found module: strands.session.session_repository +Found module: strands.session.session_manager +Found module: strands.session.repository_session_manager +Found module: strands.session.file_session_manager +Found module: strands.session.s3_session_manager +Found module: strands.tools.loader +Found module: strands.tools.watcher +Found module: strands.tools.tool_provider +Found module: strands.tools.decorator +Found module: strands.tools.registry +Found module: strands.tools.tools +Found module: strands.hooks.events +Found module: strands.hooks.registry +Found module: strands.experimental.agent_config +Found module: strands.plugins.plugin +Found module: strands.plugins.registry +Found module: strands.experimental.hooks.events +Found module: strands.experimental.steering.core.context +Found module: strands.experimental.steering.core.handler +Found module: strands.experimental.steering.core.action +Found module: strands.experimental.steering.context_providers.ledger_provider +Found module: strands.experimental.steering.handlers.llm.mappers +Found module: strands.experimental.steering.handlers.llm.llm_handler +Found module: strands.experimental.hooks.multiagent.events +Found module: strands.experimental.bidi.agent.agent +Found module: strands.experimental.bidi.agent.loop +Found module (with import issues): strands.experimental.bidi.models.openai_realtime - No module named 'websockets' +Found module (with import issues): strands.experimental.bidi.models.gemini_live - cannot import name 'genai' from 'google' (unknown location) +Found module (with import issues): strands.experimental.bidi.models.nova_sonic - No module named 'aws_sdk_bedrock_runtime' +Found module: strands.experimental.bidi.models.model +Found module: strands.experimental.bidi.types.agent +Found module: strands.experimental.bidi.types.events +Found module: strands.experimental.bidi.types.model +Found module: strands.experimental.bidi.types.io +Found module (with import issues): strands.experimental.bidi.io.audio - No module named 'pyaudio' +Found module (with import issues): strands.experimental.bidi.io.text - No module named 'pyaudio' +Found module: strands.experimental.bidi.tools.stop_conversation +Found module: strands.tools.mcp.mcp_types +Found module: strands.tools.mcp.mcp_agent_tool +Found module: strands.tools.mcp.mcp_instrumentation +Found module: strands.tools.mcp.mcp_tasks +Found module: strands.tools.mcp.mcp_client +Found module: strands.tools.executors.sequential +Found module: strands.tools.executors.concurrent +Found module: strands.tools.structured_output.structured_output_utils +Found module: strands.tools.structured_output.structured_output_tool +Found module (with import issues): strands.multiagent.a2a.server - No module named 'a2a' +Found module (with import issues): strands.multiagent.a2a.executor - No module named 'a2a' +Found module: strands.agent.conversation_manager.conversation_manager +Found module: strands.agent.conversation_manager.sliding_window_conversation_manager +Found module: strands.agent.conversation_manager.null_conversation_manager +Found module: strands.agent.conversation_manager.summarizing_conversation_manager +Generated docs/api-reference/python/agent/agent.md +Generated docs/api-reference/python/agent/state.md +Generated docs/api-reference/python/agent/agent_result.md +Generated docs/api-reference/python/agent/a2a_agent.md +Generated docs/api-reference/python/agent/base.md +Generated docs/api-reference/python/agent/conversation_manager/conversation_manager.md +Generated docs/api-reference/python/agent/conversation_manager/sliding_window_conversation_manager.md +Generated docs/api-reference/python/agent/conversation_manager/null_conversation_manager.md +Generated docs/api-reference/python/agent/conversation_manager/summarizing_conversation_manager.md +Generated docs/api-reference/python/event_loop/event_loop.md +Generated docs/api-reference/python/event_loop/streaming.md +Generated docs/api-reference/python/experimental/agent_config.md +Generated docs/api-reference/python/experimental/hooks/events.md +Generated docs/api-reference/python/experimental/steering/core/context.md +Generated docs/api-reference/python/experimental/steering/core/handler.md +Generated docs/api-reference/python/experimental/steering/core/action.md +Generated docs/api-reference/python/experimental/steering/context_providers/ledger_provider.md +Generated docs/api-reference/python/experimental/steering/handlers/llm/mappers.md +Generated docs/api-reference/python/experimental/steering/handlers/llm/llm_handler.md +Generated docs/api-reference/python/experimental/hooks/multiagent/events.md +Generated docs/api-reference/python/experimental/bidi/agent/agent.md +Generated docs/api-reference/python/experimental/bidi/agent/loop.md +Generated docs/api-reference/python/experimental/bidi/models/openai_realtime.md +Generated docs/api-reference/python/experimental/bidi/models/gemini_live.md +Generated docs/api-reference/python/experimental/bidi/models/nova_sonic.md +Generated docs/api-reference/python/experimental/bidi/models/model.md +Generated docs/api-reference/python/experimental/bidi/types/agent.md +Generated docs/api-reference/python/experimental/bidi/types/events.md +Generated docs/api-reference/python/experimental/bidi/types/model.mdINFO - [macros] - Found local Python module 'macros' in: /home/runner/work/docs/docs +INFO - [macros] - Found external Python module 'macros' in: /home/runner/work/docs/docs +INFO - [macros] - Functions found: define_env,on_pre_page_macros,on_post_page_macros,on_post_build +INFO - [macros] - Config variables: ['extra', 'config', 'environment', 'plugin', 'git', 'social', 'version', 'docs_repo', 'sdk_pypi', 'sdk_repo', 'py_sdk_repo_home', 'ts_sdk_repo_home', 'tools_pypi', 'tools_repo', 'tools_repo_home', 'agent_builder_pypi', 'agent_builder_repo_home', 'link_strands_tools', 'link_strands_builder', 'community_contribution_banner', 'macros', 'filters', 'filters_builtin'] +INFO - [macros] - Config macros: ['context', 'macros_info', 'now', 'fix_url', 'ts_not_supported', 'ts_not_supported_code', 'experimental_feature_warning'] +INFO - [macros] - Config filters: ['pretty', 'relative_url'] +INFO - Cleaning site directory +INFO - Building documentation to directory: /home/runner/work/docs/docs/site +INFO - Downloading external file: https://unpkg.com/mermaid@11/dist/mermaid.min.js +INFO - The following pages exist in the docs directory, but are not included in the "nav" configuration: + - examples/cdk/deploy_to_apprunner/README.md + - examples/cdk/deploy_to_ec2/README.md + - examples/cdk/deploy_to_fargate/README.md + - examples/cdk/deploy_to_lambda/README.md + - examples/deploy_to_eks/README.md + - examples/python/multi_agent_example/index.md + - examples/typescript/deploy_to_bedrock_agentcore/README.md + - user-guide/quickstart.md + - user-guide/evals-sdk/how-to/agentcore_evaluation_dashboard.md + - user-guide/observability-evaluation/evaluation.md +WARNING - griffe: /opt/hostedtoolcache/Python/3.13.11/x64/lib/python3.13/site-packages/strands/types/_events.py:63: No type or annotation for parameter 'invocation_state' +WARNING - griffe: /opt/hostedtoolcache/Python/3.13.11/x64/lib/python3.13/site-packages/strands/types/_events.py:63: Parameter 'invocation_state' does not appear in the function signature +INFO - mkdocstrings_handlers: Formatting signatures requires either Black or Ruff to be installed. +WARNING - griffe: /opt/hostedtoolcache/Python/3.13.11/x64/lib/python3.13/site-packages/strands/types/interrupt.py:86: Failed to get 'name: description' pair from 'Must be unique across hook callbacks.' +ERROR - mkdocstrings: strands.plugins.plugin could not be found +ERROR - Error reading page 'api-reference/python/plugins/plugin.md': +ERROR - Could not collect 'strands.plugins.plugin' + +Generated docs/api-reference/python/experimental/bidi/types/io.md +Generated docs/api-reference/python/experimental/bidi/io/audio.md +Generated docs/api-reference/python/experimental/bidi/io/text.md +Generated docs/api-reference/python/experimental/bidi/tools/stop_conversation.md +Generated docs/api-reference/python/handlers/callback_handler.md +Generated docs/api-reference/python/hooks/events.md +Generated docs/api-reference/python/hooks/registry.md +Generated docs/api-reference/python/interrupt/index.md +Generated docs/api-reference/python/models/writer.md +Generated docs/api-reference/python/models/litellm.md +Generated docs/api-reference/python/models/openai.md +Generated docs/api-reference/python/models/llamacpp.md +Generated docs/api-reference/python/models/sagemaker.md +Generated docs/api-reference/python/models/gemini.md +Generated docs/api-reference/python/models/llamaapi.md +Generated docs/api-reference/python/models/ollama.md +Generated docs/api-reference/python/models/bedrock.md +Generated docs/api-reference/python/models/mistral.md +Generated docs/api-reference/python/models/model.md +Generated docs/api-reference/python/models/anthropic.md +Generated docs/api-reference/python/multiagent/graph.md +Generated docs/api-reference/python/multiagent/swarm.md +Generated docs/api-reference/python/multiagent/base.md +Generated docs/api-reference/python/multiagent/a2a/server.md +Generated docs/api-reference/python/multiagent/a2a/executor.md +Generated docs/api-reference/python/plugins/plugin.md +Generated docs/api-reference/python/plugins/registry.md +Generated docs/api-reference/python/session/session_repository.md +Generated docs/api-reference/python/session/session_manager.md +Generated docs/api-reference/python/session/repository_session_manager.md +Generated docs/api-reference/python/session/file_session_manager.md +Generated docs/api-reference/python/session/s3_session_manager.md +Generated docs/api-reference/python/telemetry/metrics.md +Generated docs/api-reference/python/telemetry/tracer.md +Generated docs/api-reference/python/telemetry/metrics_constants.md +Generated docs/api-reference/python/telemetry/config.md +Generated docs/api-reference/python/tools/loader.md +Generated docs/api-reference/python/tools/watcher.md +Generated docs/api-reference/python/tools/tool_provider.md +Generated docs/api-reference/python/tools/decorator.md +Generated docs/api-reference/python/tools/registry.md +Generated docs/api-reference/python/tools/tools.md +Generated docs/api-reference/python/tools/mcp/mcp_types.md +Generated docs/api-reference/python/tools/mcp/mcp_agent_tool.md +Generated docs/api-reference/python/tools/mcp/mcp_instrumentation.md +Generated docs/api-reference/python/tools/mcp/mcp_tasks.md +Generated docs/api-reference/python/tools/mcp/mcp_client.md +Generated docs/api-reference/python/tools/executors/sequential.md +Generated docs/api-reference/python/tools/executors/concurrent.md +Generated docs/api-reference/python/tools/structured_output/structured_output_utils.md +Generated docs/api-reference/python/tools/structured_output/structured_output_tool.md +Generated docs/api-reference/python/types/interrupt.md +Generated docs/api-reference/python/types/agent.md +Generated docs/api-reference/python/types/event_loop.md +Generated docs/api-reference/python/types/traces.md +Generated docs/api-reference/python/types/multiagent.md +Generated docs/api-reference/python/types/collections.md +Generated docs/api-reference/python/types/citations.md +Generated docs/api-reference/python/types/exceptions.md +Generated docs/api-reference/python/types/session.md +Generated docs/api-reference/python/types/json_dict.md +Generated docs/api-reference/python/types/a2a.md +Generated docs/api-reference/python/types/content.md +Generated docs/api-reference/python/types/media.md +Generated docs/api-reference/python/types/guardrails.md +Generated docs/api-reference/python/types/streaming.md +Generated docs/api-reference/python/types/tools.md +✓ Updated Python API nav menu + +Aborted with a BuildError!