# Strands Agents

Install Brizz with the Strands Agents framework.

Quickstart for the Strands Agents integration shown during onboarding. For the full Python SDK reference, see the [Python SDK guide](/docs/sdks/python.md).

## Install

:::tabs
:::tab[pip]
```bash
pip install brizz
```
:::tab[uv]
```bash
uv add brizz
```
:::tab[poetry]
```bash
poetry add brizz
```
:::

## Initialize and run

```python
from dotenv import load_dotenv
load_dotenv()

import os
from brizz import Brizz, start_session

Brizz.initialize(
    api_key=os.getenv("BRIZZ_API_KEY"),
    app_name="my-app",
)

from strands import Agent
from strands.models.openai import OpenAIModel

model = OpenAIModel(model_id="gpt-4o-mini")
agent = Agent(model=model)

with start_session("my-session", {"user_id": "user-123"}):
    response = agent("What is 2+2?")
    print(response.message['content'][0]['text'])
```

## With Langfuse

If you already use Langfuse to trace Strands (via OpenLIT), set `allowed_instrumentations=[]` so Brizz stays out and only ingests Langfuse's OTel spans.

```python
from dotenv import load_dotenv
load_dotenv()

import os
from brizz import Brizz

Brizz.initialize(
    api_key=os.getenv("BRIZZ_API_KEY"),
    app_name="my-app",
    allowed_instrumentations=[],
)

from langfuse import get_client, propagate_attributes
import openlit
langfuse = get_client()
openlit.init(tracer=langfuse._otel_tracer, disable_batch=True)

from strands import Agent
from strands.models.openai import OpenAIModel

model = OpenAIModel(model_id="gpt-4o-mini")
agent = Agent(model=model)

with langfuse.start_as_current_observation(as_type="span", name="strands-run") as span:
    with propagate_attributes(session_id="my-session", user_id="user-123"):
        response = agent("What is 2+2?")
        print(response.message['content'][0]['text'])
```

## Complete example

A single file you can copy, set `BRIZZ_API_KEY` + `OPENAI_API_KEY`, and run with `python agent.py`.

```python
# agent.py
from dotenv import load_dotenv
load_dotenv()

import os
# Initialize Brizz BEFORE importing Strands so auto-instrumentation can hook.
from brizz import Brizz, start_session, emit_event

Brizz.initialize(
    api_key=os.environ["BRIZZ_API_KEY"],
    app_name="my-app",
    environment=os.getenv("APP_ENV", "development"),
)

from strands import Agent
from strands.models.openai import OpenAIModel

model = OpenAIModel(model_id="gpt-4o-mini")
agent = Agent(model=model)


def run_turn(session_id: str, user_id: str, user_message: str) -> str:
    # The properties dict on start_session becomes session-wide span attributes.
    with start_session(session_id, {"user_id": user_id, "plan": "enterprise"}) as session:
        session.set_input(user_message)

        response = agent(user_message)
        text = response.message["content"][0]["text"]
        session.set_output(text)

        # User feedback — map "feedback.positive" / "feedback.negative" to system
        # events in Org Settings -> Event so it powers filters and the Overview chart.
        emit_event(
            "feedback.positive",
            attributes={"category": "helpfulness"},
            body={"comment": "Exactly what I needed!", "context": "support-agent"},
        )
        return text


if __name__ == "__main__":
    print(run_turn("session-123", "user-42", "What is 2+2?"))
```

**Gotchas**

- Brizz initialization must happen before `from strands import Agent`.
- Already tracing Strands via Langfuse + OpenLIT? Use the `allowed_instrumentations=[]` pattern in [With Langfuse](#with-langfuse) above.

## See also

- [Python SDK](/docs/sdks/python.md) — full SDK reference.
- [Sessions](/docs/instrument/sessions.md) — session capture patterns.
- [Identify users](/docs/instrument/identify-users.md) — attach user properties to Strands runs.
