Python SDK for the Agent Orchestration API.
Project description
trelent-agents
Python SDK for the Trelent Agent Orchestration API.
Installation
pip install trelent-agents
Quick Start
Without authentication
from trelent_agents import Client
client = Client(api_url="http://localhost:8000")
sandboxes = client.sandboxes.list()
print(sandboxes)
run = client.runs.create(
sandbox="example-agent:latest",
prompt="Create hello.txt with a greeting",
)
print(run.id, run.status, run.harness.kind)
With authentication
When the API has authentication enabled, provide your OAuth2 client credentials:
from trelent_agents import Client
client = Client(
api_url="https://agents.trelent.com",
client_id="your-client-id",
client_secret="your-client-secret",
)
sandboxes = client.sandboxes.list()
run = client.runs.create(
sandbox="my-sandbox:latest",
prompt="Do something useful",
)
The SDK handles token acquisition automatically — it exchanges your client credentials for a JWT via the API's /token endpoint before making authenticated requests.
If you need to call the token proxy directly, use client.tokens.create(...).
The client also supports context manager usage:
with Client(api_url="https://agents.trelent.com", client_id="...", client_secret="...") as client:
runs = client.runs.list()
Client Options
client = Client(
api_url="https://agents.trelent.com", # API base URL (default: https://agents.trelent.com)
client_id="...", # OAuth2 client ID (optional)
client_secret="...", # OAuth2 client secret (optional)
scope="...", # Override default OAuth2 scope (optional)
)
Both client_id and client_secret must be provided together, or both omitted.
Resources
client.sandboxes
sandboxes = client.sandboxes.list()
# => list[RegistrySandbox] — [RegistrySandbox(name="my-sandbox", tags=["latest", "v1"])]
When auth is enabled, sandboxes are automatically filtered to your namespace. Sandbox names are returned without the namespace prefix.
client.tokens
token = client.tokens.create(
client_id="your-client-id",
client_secret="your-client-secret",
scope="AgentOrchestrator:runs:list",
)
client.runs
from trelent_agents import ClaudeCodeHarnessSpec, LocalImporter, S3Exporter
# Create a run
run = client.runs.create(
sandbox="my-sandbox:latest",
prompt="Build a web server",
harness=ClaudeCodeHarnessSpec(), # optional, default: ClaudeCodeHarnessSpec()
timeout_seconds=3600, # optional, default: 3600
imports=[LocalImporter(path="./data")], # optional
exports=[S3Exporter()], # optional
)
# List runs (optionally filter by sandbox)
runs = client.runs.list()
filtered = client.runs.list(sandbox="my-sandbox:latest")
# Get a specific run
run = client.runs.get("run-id")
# Check status
status = client.runs.get_status("run-id")
# Cancel a run
cancel = client.runs.cancel("run-id")
# Get checkpoints
chain = client.runs.get_checkpoint_chain("run-id")
checkpoint = client.runs.get_checkpoint("run-id", "checkpoint-id")
Run operations
# Fork (resume from checkpoint)
forked = run.fork(
"Continue from where you left off",
timeout_seconds=1800,
)
# Refresh run state
run.refresh()
print(run.status) # updated status
Streaming Events
Subscribe to real-time events from a run using Server-Sent Events (SSE). Events are streamed as the agent executes, providing live visibility into reasoning, messages, and tool usage.
Basic streaming
from trelent_agents import Client, EventType
client = Client(api_url=api_url, client_id=client_id, client_secret=client_secret)
run = client.runs.create(
sandbox="my-sandbox:latest",
prompt="Build a simple web server",
)
# Subscribe to the event stream
for event in run.stream():
match event.type:
case EventType.MESSAGE_DELTA:
print(event.data.delta.text, end="", flush=True)
case EventType.TOOL_CALL_STARTED:
print(f"\nTool: {event.data.name}")
case EventType.SESSION_COMPLETED:
print(f"\nCompleted with exit code: {event.data.exit_code}")
Streaming via client
You can also stream using the run ID directly:
for event in client.runs.stream_events("run-abc123"):
print(event.type, event.seq)
Event types
| Event Type | Description |
|---|---|
SESSION_STARTED |
Agent session initialized |
SESSION_COMPLETED |
Session finished (includes exit_code and usage) |
TURN_STARTED |
New conversation turn began |
TURN_COMPLETED |
Turn finished |
TURN_FAILED |
Turn failed with error |
MESSAGE_STARTED |
Assistant message started |
MESSAGE_DELTA |
Incremental text content |
MESSAGE_COMPLETED |
Full message content available |
REASONING_STARTED |
Extended thinking started |
REASONING_DELTA |
Incremental reasoning text |
REASONING_COMPLETED |
Reasoning block finished |
TOOL_CALL_STARTED |
Tool invocation started (includes name and kind) |
TOOL_CALL_INPUT_DELTA |
Streaming tool input JSON |
TOOL_CALL_INPUT_COMPLETE |
Full tool input available |
TOOL_CALL_OUTPUT_DELTA |
Streaming tool output |
TOOL_CALL_COMPLETED |
Tool execution finished (includes exit_code) |
ERROR |
Error occurred |
Event structure
Every event has a common envelope:
class CommonEvent(BaseModel):
seq: int # Sequence number (monotonically increasing)
timestamp: str # ISO 8601 timestamp
type: EventType # Event type discriminator
data: EventData # Type-specific payload
client.health()
health = client.health()
# => HealthResponse(status="ok")
Connectors
Importing local files
from trelent_agents import LocalImporter
run = client.runs.create(
sandbox="my-sandbox:latest",
prompt="Process the data",
imports=[LocalImporter(path="./my-data-dir")],
)
The LocalImporter tarballs and base64-encodes the local path, sending it inline with the request. The API stages large payloads onto a shared volume server-side, so the run-creation request itself stays the only network hop you need.
Exporting to S3
from trelent_agents import S3Exporter
run = client.runs.create(
sandbox="my-sandbox:latest",
prompt="Generate a report",
exports=[S3Exporter(bucket="my-bucket", path="reports/")],
)
Docker Registry Setup
When auth is enabled, push sandbox images to your user namespace on the registry:
# Login with your OAuth2 credentials
docker login registry.example.com -u <client_id> -p <client_secret>
# Push to your namespace
docker tag my-sandbox:latest registry.example.com/<client_id>/my-sandbox:latest
docker push registry.example.com/<client_id>/my-sandbox:latest
When creating runs via the SDK, just use the sandbox name without the namespace prefix:
run = client.runs.create(
sandbox="my-sandbox:latest", # not "<client_id>/my-sandbox:latest"
prompt="...",
)
The API resolves the full registry path automatically based on your authenticated identity.
Types
The SDK exports the following types:
from trelent_agents import (
Client,
ClaudeCodeHarnessSpec,
CodexHarnessSpec,
CommonEvent,
EventType,
GeminiHarnessSpec,
Run,
RunStatus,
RunResult,
RunStatusResponse,
RegistrySandbox,
CheckpointResponse,
CancelRunResponse,
ChatHistoryEntry,
FileOutput,
OutputFile,
HealthResponse,
HarnessInfo,
HarnessKind,
HarnessSpec,
TokenRequest,
TokenResponse,
ToolKind,
WorkflowIds,
LocalImporter,
S3Exporter,
APIError,
NotFoundError,
ValidationError,
)
Project details
Release history Release notifications | RSS feed
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 trelent_agents-0.2.6.tar.gz.
File metadata
- Download URL: trelent_agents-0.2.6.tar.gz
- Upload date:
- Size: 12.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6d3017a787ff174362972958f946faee186d4c093e7b09f11686871a10752ad7
|
|
| MD5 |
957ea71550de94b80a86bfbddf9b7cc0
|
|
| BLAKE2b-256 |
4444ebb4e61dc23ddafa6faf7321f02a03f8eed0165f89995bfce3e5d9485465
|
File details
Details for the file trelent_agents-0.2.6-py3-none-any.whl.
File metadata
- Download URL: trelent_agents-0.2.6-py3-none-any.whl
- Upload date:
- Size: 20.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
065c381ece9d4a5a3757930291f8502c26751f0a6ec1f13ddd3c2740a53178ba
|
|
| MD5 |
6ecbc45a053d1bf1777d38c1932d6713
|
|
| BLAKE2b-256 |
80bdd7131a3df1219112712398937636b2f2dfbfa900f35a31c1e75b5caf01b6
|