Strands Agents
Strands Agents (the strands-agents Python package) is AWS’s open-source, model-driven agent SDK — and the default framework for agents hosted on Amazon Bedrock AgentCore. Strands has built-in OpenTelemetry tracing, so Neens ingests its traces through standard OTLP with zero Neens-specific code.
At a glance
| Language | Python |
| Instrumentation | Built-in (strands.telemetry.StrandsTelemetry) + openinference-instrumentation-strands-agents span processor (community-maintained by Arize) |
| Endpoint | POST /v1/traces (OTLP/HTTP) |
| Auth | Authorization: Bearer nk_live_… agent key |
Instrument your agent
Install the instrumentation
The otel extra pulls in the OTLP/HTTP exporter Strands uses. The OpenInference processor rewrites Strands’ spans into the OpenInference vocabulary so prompts, responses and tool calls land in the same shape as every other quickstart.
pip install 'strands-agents[otel]' openinference-instrumentation-strands-agentsPoint the exporter at Neens
from openinference.instrumentation.strands_agents import StrandsAgentsToOpenInferenceProcessor
from strands.telemetry import StrandsTelemetry
telemetry = StrandsTelemetry()
# Keyword arguments are passed straight to OpenTelemetry's OTLPSpanExporter.
telemetry.setup_otlp_exporter(
endpoint="https://<your-neens-host>/v1/traces",
headers={"Authorization": "Bearer nk_live_your_key_here"},
)
telemetry.tracer_provider.add_span_processor(StrandsAgentsToOpenInferenceProcessor())Run your agent
Run your agent as usual. Pass a conversation id through trace_attributes so every turn of one conversation lands in the same Neens session:
from strands import Agent, tool
@tool
def get_weather(city: str) -> str:
"""Get the current weather for a city."""
return f"It is sunny in {city}."
agent = Agent(
tools=[get_weather],
trace_attributes={"session.id": "conv-42", "user.id": "user-123"},
)
agent("What's the weather in Seattle?")Spans export to Neens in the background.
What Neens captures
Strands emits a span for each agent invocation, each event-loop cycle, every model call (model, token counts, prompt/response messages) and every tool call — so you see the full agent trajectory, including how many reasoning loops a request took. The session.id you set in trace_attributes groups the turns into one conversation (see Traces & sessions).
The OpenInference processor is optional. Without it, Strands emits the standard OpenTelemetry GenAI semantic conventions (gen_ai.*), which Neens also reads — it probes OTel-GenAI and OpenInference attributes per field. We recommend the processor for consistency with the other Neens framework quickstarts.
Deploying to Amazon Bedrock AgentCore Runtime? The runtime installs its own tracer by default, so there is one extra step — see AWS Bedrock AgentCore.
Verify
Open Traces in Neens; your Strands runs appear within a few seconds. Continue to Traces & sessions.