The Brixo Python SDK
Project description
Brixo Python SDK
The Brixo Python SDK lets you instrument AI agents and capture high-quality interaction traces for analysis in the Brixo platform. It is designed to be lightweight, explicit, and easy to integrate into existing agent code.
Compatibility
- Python 3.10+
Installation
Install the SDK from PyPI:
pip install brixo
Authentication
Create an API key
- Create a Brixo account @ https://app.brixo.com/sign_up
- Once logged in, generate a new API key from the instructions page
- Export it as an environment variable:
export BRIXO_API_KEY=<your_api_key>
The Brixo SDK will automatically read this value at runtime.
Quickstart (copy/paste)
Create a minimal file that instruments a single interaction:
export BRIXO_API_KEY=<your_api_key>
cat > main.py <<'PY'
from brixo import Brixo
Brixo.init(
app_name="my-app",
environment="development",
)
@Brixo.interaction("Hello World Interaction")
def handle_user_input(user_input: str):
Brixo.begin_context(
user={"id": "1", "name": "Jane Doe"},
input=user_input,
)
response = f"You said: {user_input}"
Brixo.end_context(output=response)
print(response)
def main():
while True:
user_input = input("User: ")
handle_user_input(user_input)
if __name__ == "__main__":
main()
PY
python main.py
What you should see:
- Your console echoes responses like
You said: <input> - A new trace appears in Brixo Live View shortly after each interaction: https://app.brixo.com/traces/live
Instrumentation Quickstart
The typical flow is:
- Initialize Brixo once at application startup
- Wrap each user interaction with
@Brixo.interaction - Attach context (user, customer, session, input, output)
- Let the interaction finish so traces can be flushed
Example
Below is a minimal but complete example that instruments a single agent interaction loop.
Create a file called main.py:
# --- Brixo SDK import ---
# Import the Brixo SDK so we can instrument and send interaction traces to Brixo.
from brixo import Brixo
from my_agent import agent
# --- Brixo interaction boundary ---
# Mark ONE bounded user interaction (one request -> one response) so Brixo can group
# spans/attributes into a single trace and flush it when this function returns.
@Brixo.interaction("Main Agent Execution")
def handle_user_input(user_input: str):
# --- Brixo context start ---
# Attach contextual metadata to the current trace
Brixo.begin_context(
account={"id": "1", "name": "ACME, Inc."},
user={"id": "1", "name": "John Doe"},
session_id="session-123",
metadata={"foo": "bar"},
input=user_input,
)
response = agent.invoke(
{"messages": [{"role": "user", "content": user_input}]}
)
handle_agent_response(response)
def handle_agent_response(response):
"""Extracts the final agent output and updates the trace."""
final_text = response["messages"][-1].content
# --- Brixo context update ---
# Add/update attributes after the agent has produced output.
Brixo.end_context(output=final_text)
def main():
# --- Brixo SDK initialization ---
# Initialize once at startup, before any instrumented code runs.
Brixo.init(
app_name="my-app",
environment="production",
)
while True:
user_input = input("User: ")
handle_user_input(user_input)
if __name__ == "__main__":
main()
Run the example:
python main.py
Key Concepts
Concepts at a glance
- Interaction boundary: one user request -> one response
- Context lifecycle:
begin_contextearly,update_contextfor mid-flight,end_contextto close - Flush timing: traces are exported when the interaction function returns
Brixo.init(...)
Initializes the SDK. Call once at application startup.
Arguments and value formats:
app_name:strlogical name for your application or agent; cannot beNoneenvironment:strsuch asdevelopment,staging,production; cannot beNoneapi_key:strorNone; defaults toBRIXO_API_KEYfilter_openinference_spans:boolorNoneto drop OpenInference spans on exportfilter_traceloop_spans:boolorNoneto drop Traceloop spans on export
Usage:
Brixo.init(
app_name="my-app",
environment="production",
api_key="brx_123456",
filter_openinference_spans=True,
filter_traceloop_spans=True,
)
@Brixo.interaction(name)
Marks a single, bounded user interaction.
Arguments and value formats:
name:strorNonedescriptive interaction name
Usage:
@Brixo.interaction("Main Agent Execution")
def handle_user_input(user_input: str):
...
Guidelines:
- Use one interaction per user request
- The function must terminate (no infinite loops)
- Choose descriptive names - they improve trace readability
Brixo.begin_context(...)
Attaches structured metadata to the current interaction trace.
Arguments and value formats:
account:dictorNonewith any of:id,name,logo_url,website_url(allstr)user:dictorNonewith any of:id,name,email(allstr)session_id:strorNonelogical session identifiermetadata:dictorNoneof arbitrary key/value datainput:strorNoneraw user inputoutput:strorNoneoutput if available at start
Usage:
Brixo.begin_context(
account={
"id": "acct_123",
"name": "ACME, Inc.",
"logo_url": "https://example.com/logo.png",
"website_url": "https://acme.com",
},
user={
"id": "user_456",
"name": "Jane Doe",
"email": "jane@example.com",
},
session_id="session-123",
metadata={"plan": "pro", "feature": "search"},
input="Find me the latest quarterly report.",
output="",
)
Brixo.update_context(...)
Adds or updates attributes after the interaction has started and leaves the interaction context open.
Arguments and value formats:
account:dictorNonewith any of:id,name,logo_url,website_url(allstr)user:dictorNonewith any of:id,name,email(allstr)session_id:strorNonelogical session identifiermetadata:dictorNoneof arbitrary key/value datainput:strorNoneraw user inputoutput:strorNoneoutput or intermediate result
Usage:
Brixo.update_context(
account={
"id": "acct_123",
"name": "ACME, Inc.",
"logo_url": "https://example.com/logo.png",
"website_url": "https://acme.com",
},
user={
"id": "user_456",
"name": "Jane Doe",
"email": "jane@example.com",
},
session_id="session-123",
metadata={"latency_ms": 1200, "tool": "search"},
input="Find me the latest quarterly report.",
output="Intermediate tool summary...",
)
Typical use cases:
- Derived metrics
- Tool results or summaries
Brixo.end_context(...)
Adds or updates attributes after the interaction has started and then explicitly closes the interaction context.
Arguments and value formats:
account:dictorNonewith any of:id,name,logo_url,website_url(allstr)user:dictorNonewith any of:id,name,email(allstr)session_id:strorNonelogical session identifiermetadata:dictorNoneof arbitrary key/value datainput:strorNoneraw user inputoutput:strorNonefinal agent output
Usage:
Brixo.end_context(
account={
"id": "acct_123",
"name": "ACME, Inc.",
"logo_url": "https://example.com/logo.png",
"website_url": "https://acme.com",
},
user={
"id": "user_456",
"name": "Jane Doe",
"email": "jane@example.com",
},
session_id="session-123",
metadata={"feedback_score": 5},
input="Find me the latest quarterly report.",
output="Here is the latest quarterly report summary...",
)
Typical use cases:
- Final agent output
Best Practices
- One interaction = one user request
- Keep interaction functions short and bounded
- Use descriptive interaction names
- Attach inputs early and outputs late
- Initialize Brixo early at startup; if you rely on auto-instrumentation, import those
libraries after
Brixo.init(...)
Troubleshooting
- Missing traces: Confirm
BRIXO_API_KEYis set and thatBrixo.init(...)runs before instrumented code. - Nothing in Live View: Check https://app.brixo.com/traces/live and allow a few seconds after each interaction.
- No internet or proxy issues: Ensure your runtime can reach
app.brixo.com.
Support
If you have questions or run into issues:
- Check the Brixo Live View for trace visibility
- Reach out to the Brixo team at support@brixo.com
Happy instrumenting 🚀
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file brixo-0.1.2.tar.gz.
File metadata
- Download URL: brixo-0.1.2.tar.gz
- Upload date:
- Size: 7.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.16 {"installer":{"name":"uv","version":"0.9.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ad5ac3effb84879dc9ff8b665fd134bd1832ff5b6fd192147843aa657a7badc7
|
|
| MD5 |
9257451a1f509b5e3cf532cc7c080313
|
|
| BLAKE2b-256 |
7d854bbebbd9b38c5172c98a35f1bce605ef4f396582b5eec3141b3b3e793f53
|
File details
Details for the file brixo-0.1.2-py3-none-any.whl.
File metadata
- Download URL: brixo-0.1.2-py3-none-any.whl
- Upload date:
- Size: 8.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.16 {"installer":{"name":"uv","version":"0.9.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fb9297bfc850ed40bd905bb989d73dd648f126c8cf0762078c10f08dd361cfb9
|
|
| MD5 |
19ed05e6980da6f0e21d3a0404ce9381
|
|
| BLAKE2b-256 |
97a9f9cc503eb51803dceab3f24459d26fdfb0163a8df745d83aff673263f322
|