Python SDK for the Travrse Platform
Project description
Travrse Python SDK
The official Python SDK for the Travrse AI product platform
Installation
pip install travrse
Quick Start
from travrse import TravrseClient, FlowBuilder
# Initialize client
client = TravrseClient(api_key="your-api-key")
# List flows
flows = client.flows.list()
for flow in flows.data:
print(flow.name)
# Build and execute a flow
result = (
FlowBuilder()
.create_flow(name="My Analysis Flow")
.prompt(
name="Analyze",
model="gpt-4o",
user_prompt="Summarize the following: {{input}}"
)
.with_options(stream_response=True)
.run(client)
)
# Get the result
output = result.get_result("Analyze")
print(output)
Features
- Synchronous and Asynchronous Clients: Choose the client that fits your use case
- Fluent Flow Builder: Chain methods to build complex flows with ease
- Streaming Support: Real-time streaming of flow execution events
- Type Hints: Full type annotations for IDE support and type checking
- Pydantic Models: Robust data validation and serialization
Usage
Client Initialization
from travrse import TravrseClient, AsyncTravrseClient
# Synchronous client
client = TravrseClient(
api_key="your-api-key",
base_url="https://api.travrse.ai", # Optional
timeout=30.0, # Optional
)
# Async client
async_client = AsyncTravrseClient(api_key="your-api-key")
Resource Operations
# Flows
flows = client.flows.list()
flow = client.flows.get("flow_123")
flow = client.flows.create(name="New Flow", description="A new flow")
client.flows.delete("flow_123")
# Records
records = client.records.list()
record = client.records.create(
type="customer",
name="Acme Corp",
metadata={"industry": "tech"}
)
# Prompts
prompts = client.prompts.list()
prompt = client.prompts.create(
name="Summarizer",
text="Summarize: {{input}}",
model="gpt-4o"
)
Flow Builder
The FlowBuilder provides a fluent interface for building and executing flows:
from travrse import FlowBuilder
result = (
FlowBuilder()
.create_flow(name="Data Pipeline")
.fetch_url(
name="Fetch Data",
url="https://api.example.com/data",
output_variable="raw_data"
)
.transform_data(
name="Transform",
script="return data.items.map(i => i.name)",
output_variable="items"
)
.prompt(
name="Analyze",
model="gpt-4o",
user_prompt="Analyze these items: {{items}}",
output_variable="analysis"
)
.run(client)
)
# Access results
analysis = result.get_result("Analyze")
Streaming with Callbacks
from travrse import FlowBuilder, StreamCallbacks
def on_step_chunk(chunk: str, event):
print(chunk, end="", flush=True)
def on_flow_complete(event):
print(f"\nCompleted in {event.execution_time}ms")
callbacks = StreamCallbacks(
on_step_chunk=on_step_chunk,
on_flow_complete=on_flow_complete,
)
summary = builder.run(client, callbacks=callbacks)
Local Tools (Client-Side Execution)
Local tools allow flows to pause and wait for your code to execute locally, then resume with the result. This is useful for:
- Data Privacy: Keep sensitive logic on your infrastructure
- Internal Systems: Access databases, files, or services not exposed via APIs
- Custom Logic: Execute complex business logic client-side
from travrse import TravrseClient, FlowBuilder
client = TravrseClient(api_key="your-api-key")
# Define local tool handlers
def get_user_data(args: dict) -> dict:
user_id = args.get("user_id")
# Query your internal database
return {"name": "John", "balance": 100.50}
def process_payment(args: dict) -> dict:
# Handle payment locally
return {"success": True, "transaction_id": "txn_123"}
# Execute flow with local tools
result = (
FlowBuilder()
.create_flow(name="Purchase Flow")
.prompt(
name="Process Order",
model="gpt-4o",
user_prompt="Process order for user {{user_id}}",
tools={
"runtime_tools": [
{
"name": "get_user_data",
"description": "Get user information from database",
"tool_type": "local",
"parameters_schema": {
"type": "object",
"properties": {
"user_id": {"type": "string"}
}
}
},
{
"name": "process_payment",
"description": "Process a payment transaction",
"tool_type": "local",
"parameters_schema": {
"type": "object",
"properties": {
"amount": {"type": "number"},
"user_id": {"type": "string"}
}
}
}
]
}
)
.with_options(flow_mode="virtual")
.run(
client,
local_tools={
"get_user_data": get_user_data,
"process_payment": process_payment,
}
)
)
# Get the final result
order_result = result.get_result("Process Order")
The SDK automatically handles the pause/resume cycle - when the AI calls a local tool, the flow pauses, your function executes, and the flow resumes with the result.
Async Usage
import asyncio
from travrse import AsyncTravrseClient, FlowBuilder
async def main():
async with AsyncTravrseClient(api_key="your-api-key") as client:
# List flows
flows = await client.flows.list()
# Stream flow execution
async for event in await client.dispatch(
{"flow": {"name": "Test", "steps": [...]}},
stream=True
):
print(event["type"])
asyncio.run(main())
Using Existing Flows
result = (
FlowBuilder()
.use_existing_flow("flow_abc123")
.with_record(name="Customer A", type="customer")
.with_messages([
{"role": "user", "content": "Analyze this customer"}
])
.run(client)
)
Upsert Mode
For code-first flow management, use upsert mode to create or update flows:
result = (
FlowBuilder()
.upsert_flow(
name="My Flow",
create_version_on_change=True
)
.prompt(name="Process", model="gpt-4o", user_prompt="...")
.run(client)
)
Runtype Fluent API
The Runtype class provides a modern static/fluent API for building and executing flows with global configuration:
from travrse import Runtype
# Configure once at app startup
Runtype.configure(api_key="your-api-key")
# Build and stream a flow (async)
result = await (
Runtype.flows.upsert(name="My Flow")
.prompt(name="Analyze", model="gpt-4o", user_prompt="Analyze: {{input}}")
.stream()
)
output = result.get_result("Analyze")
Flow Modes
# Upsert mode - Create or update flow by name
result = await (
Runtype.flows.upsert(name="My Flow", create_version_on_change=True)
.prompt(name="Step", model="gpt-4o", user_prompt="...")
.stream()
)
# Virtual mode - One-off execution, not saved
result = await (
Runtype.flows.virtual(name="Temp Flow")
.prompt(name="Step", model="gpt-4o", user_prompt="...")
.stream()
)
# Existing flow - Execute a saved flow by ID
result = await (
Runtype.flows.use("flow_abc123")
.with_record(name="Customer A", type="customer")
.stream()
)
Synchronous Execution
# Use stream_sync() or result_sync() for synchronous code
result = (
Runtype.flows.virtual(name="My Flow")
.prompt(name="Analyze", model="gpt-4o", user_prompt="...")
.stream_sync()
)
output = result.get_result("Analyze")
Local Tools with Runtype
from travrse import Runtype
Runtype.configure(api_key="your-api-key")
def get_user_data(args: dict) -> dict:
return {"name": "John", "balance": 100.50}
result = await (
Runtype.flows.virtual(name="Purchase Flow")
.prompt(
name="Process Order",
model="gpt-4o",
user_prompt="Process order for user {{user_id}}",
tools={
"runtime_tools": [{
"name": "get_user_data",
"description": "Get user info",
"tool_type": "local",
"parameters_schema": {
"type": "object",
"properties": {"user_id": {"type": "string"}}
}
}]
}
)
.with_local_tools({"get_user_data": get_user_data})
.stream()
)
Other Namespaces
# Batches - Schedule batch operations
batch = await Runtype.batches.schedule(
flow_id="flow_123",
record_type="customers",
)
# Get batch status
status = await Runtype.batches.get(batch["id"])
# Prompts - Manage and execute prompts
prompts = await Runtype.prompts.list()
result = await Runtype.prompts.run("prompt_123").result()
Available Step Types
prompt()- Execute an LLM promptfetch_url()- Make HTTP requeststransform_data()- Transform data with JavaScriptsearch()- Web or database searchretrieve_record()- Load record dataupsert_record()- Save or update recordsvector_search()- Semantic vector searchsend_email()- Send email messagessend_stream()- Send streaming messagesconditional()- Branching logicwait_until()- Delays and polling
Error Handling
from travrse import TravrseClient, APIError, AuthenticationError, NotFoundError
client = TravrseClient(api_key="your-api-key")
try:
flow = client.flows.get("nonexistent")
except NotFoundError:
print("Flow not found")
except AuthenticationError:
print("Invalid API key")
except APIError as e:
print(f"API error: {e.status_code} - {e.message}")
Development
# Install development dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run tests with coverage
pytest --cov=travrse
# Type checking
mypy travrse
# Linting
ruff check travrse
License
MIT License - see LICENSE file for details.
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 travrse-0.1.1.tar.gz.
File metadata
- Download URL: travrse-0.1.1.tar.gz
- Upload date:
- Size: 30.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf7ac4f0aa2c2e11623d32bd6f8d91085ec6f2d8ef463ad2cc2fbe7a99f4718c
|
|
| MD5 |
aaf2d24eea0469cbee31a71c0ebc6574
|
|
| BLAKE2b-256 |
b5dbea57cb2a8e50bd8e134bce2cb6b84df7df94f452259d44c54e78dbc89455
|
Provenance
The following attestation bundles were made for travrse-0.1.1.tar.gz:
Publisher:
publish-python-sdk.yml on runtypelabs/core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
travrse-0.1.1.tar.gz -
Subject digest:
cf7ac4f0aa2c2e11623d32bd6f8d91085ec6f2d8ef463ad2cc2fbe7a99f4718c - Sigstore transparency entry: 774659051
- Sigstore integration time:
-
Permalink:
runtypelabs/core@018b3e2c6c85736aefb92f3d5923fdae338f5a6d -
Branch / Tag:
refs/heads/main - Owner: https://github.com/runtypelabs
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-python-sdk.yml@018b3e2c6c85736aefb92f3d5923fdae338f5a6d -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file travrse-0.1.1-py3-none-any.whl.
File metadata
- Download URL: travrse-0.1.1-py3-none-any.whl
- Upload date:
- Size: 36.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1fd5d1f62745b1d03adc32337f98f092c2585406fdd8a038be0910b134304a6d
|
|
| MD5 |
eda241acc1ee48626daa9f8a71e15434
|
|
| BLAKE2b-256 |
7bd2647c0999f05bb8f186e00b0235c70ec5710950da16b2b40adf5e6162877f
|
Provenance
The following attestation bundles were made for travrse-0.1.1-py3-none-any.whl:
Publisher:
publish-python-sdk.yml on runtypelabs/core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
travrse-0.1.1-py3-none-any.whl -
Subject digest:
1fd5d1f62745b1d03adc32337f98f092c2585406fdd8a038be0910b134304a6d - Sigstore transparency entry: 774659061
- Sigstore integration time:
-
Permalink:
runtypelabs/core@018b3e2c6c85736aefb92f3d5923fdae338f5a6d -
Branch / Tag:
refs/heads/main - Owner: https://github.com/runtypelabs
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-python-sdk.yml@018b3e2c6c85736aefb92f3d5923fdae338f5a6d -
Trigger Event:
workflow_dispatch
-
Statement type: