Python SDK for Sepurux trace recording and uploads
Project description
Sepurux Python SDK
Python SDK for recording Sepurux traces and uploading them to a Sepurux API.
Install
pip install -e sdk
Quick start
import os
from sepurux import SepuruxClient
os.environ["SEPURUX_API_BASE_URL"] = "http://localhost:8000"
os.environ["SEPURUX_API_KEY"] = "sepurux-dev-key"
os.environ["SEPURUX_PROJECT_ID"] = "22222222-2222-2222-2222-222222222222"
with SepuruxClient.from_env() as client:
with client.trace("example_task", {"user_id": "u-123"}) as trace:
trace.model_step("plan", {"goal": "create issue"}, output={"ok": True})
trace.tool_call("jira.create_issue(commit)", {"summary": "SDK test"})
trace.tool_result("jira.create_issue(commit)", {"issue_id": "OPS-123"})
print("trace_id:", trace.trace_id)
This is the intended ergonomic path:
SepuruxClient.from_env()readsSEPURUX_API_BASE_URL,SEPURUX_API_KEY, andSEPURUX_PROJECT_IDclient.trace(...)records and uploads automatically on exittrace.trace_idandtrace.run_idare available after the context closes
LangSmith-style ergonomics
Auto-upload trace context
from sepurux import SepuruxClient
client = SepuruxClient.from_env()
with client.trace(
"checkout_refund",
{"ticket_id": "t-123"},
campaign_id="refund_reliability",
mutation_pack="sepurux.core.reliability",
) as trace:
trace.model_step("triage", {"text": "Refund the duplicate charge"})
trace.tool_call("payments.refund", {"payment_id": "pay_123", "amount": 4200})
trace.tool_result("payments.refund", {"refund_id": "rf_123", "status": "queued"})
print(trace.trace_id)
print(trace.run_id)
@traceable decorator
from sepurux import SepuruxClient
client = SepuruxClient.from_env()
@client.traceable(campaign_id="refund_reliability")
def score_refund_risk(amount: int, currency: str) -> dict:
return {"risk": "medium", "approve": amount < 10000, "currency": currency}
result = score_refund_risk(4200, "usd")
Global configuration
from sepurux import configure, trace, traceable
configure()
@traceable()
def classify_ticket(text: str) -> dict:
return {"label": "bug", "priority": "p2"}
with trace("support_session", {"channel": "email"}) as rec:
rec.model_step("classify", {"text": "checkout timed out"})
API
SepuruxClient
SepuruxClient(base_url, api_key=None, project_id=None, timeout=30, sdk_header=None)
SepuruxClient.from_env(...)
The SDK automatically sends X-Sepurux-SDK: py/<version> on requests.
Use sdk_header only if you need to override it manually.
Methods:
upload_trace(trace: dict) -> strtrace(task_name, task_input=None, campaign_id=None, mutation_pack=None) -> recordertraceable(name=None, campaign_id=None, mutation_pack=None) -> decoratorcreate_campaign(name, mutation_set, eval_set, mutation_pack_id=None) -> strstart_run(trace_id, campaign_id, thresholds=None) -> strrun_pack(campaign_id, mutation_pack) -> strget_run(run_id) -> dict
TraceBuilder
TraceBuilder outputs backend-compatible traces:
{
"trace_version": "0.1",
"source": "sdk",
"task": {"name": "...", "input": {}},
"events": []
}
Recorder
Use a low-level context manager when you want to build the trace manually:
from sepurux import sepurux_trace
with sepurux_trace("task_name", {"input": "value"}) as rec:
rec.model_step("name", {"foo": "bar"}, output={"ok": True})
rec.tool_call("tool.name", {"arg": 1})
rec.tool_result("tool.name", {"result": "ok"})
rec.error(message="something happened", tool="tool.name")
Decorator
from sepurux import record_trace
@record_trace(client=client, campaign_id="<campaign_id>")
def run_business_logic(x: int) -> int:
return x * 2
The decorator preserves the function return value and attempts to upload/start runs in the background path without interrupting normal execution.
Server-side pack execution
run_id = client.run_campaign("demo_campaign", mutation_pack="core.reliability")
Example script
See examples/sdk_demo.py.
python sdk/examples/sdk_demo.py
Optional environment variables:
SEPURUX_API_BASE_URL(defaulthttp://localhost:8000)SEPURUX_UI_BASE_URL(defaulthttp://localhost:3000)SEPURUX_API_KEYSEPURUX_PROJECT_IDSEPURUX_CAMPAIGN_ID(if provided, script starts a run)
Publish to PyPI (CI)
This repository includes .github/workflows/sdk-publish-pypi.yml to publish the SDK directly to PyPI.
Setup:
- Add
PYPI_API_TOKENin GitHub repository secrets. - Ensure the package version in
sdk/pyproject.tomlis new.
Release:
- Push a tag like
sdk-v0.3.0to trigger publish. - Or run the workflow manually from GitHub Actions.
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 sepurux-0.3.0.tar.gz.
File metadata
- Download URL: sepurux-0.3.0.tar.gz
- Upload date:
- Size: 11.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
476c22c483a2766d8de76f389fbac3aea1876b37732fd197e89c76af43ed1d13
|
|
| MD5 |
ac1d42d4ce5696965f08ba83fdd8045f
|
|
| BLAKE2b-256 |
ccd2e3deddcd60d597186cd078e5d9f0d4cee35dc9b926c2d3f672af762fab03
|
File details
Details for the file sepurux-0.3.0-py3-none-any.whl.
File metadata
- Download URL: sepurux-0.3.0-py3-none-any.whl
- Upload date:
- Size: 9.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
97b449ac2f9a0cff31f3a0a8a76add6e9395b2d5c08f0b5ecf061c9884303a6b
|
|
| MD5 |
ccb585d626a2f880abb210f8bfb9f5e7
|
|
| BLAKE2b-256 |
c834da193f27a2007f13dfed3f81283ebfc6d7a11fb3b5241aefb89e501ebe7b
|