Official Python SDK for ExosphereHost
Project description
ExosphereHost Python SDK
The official Python SDK for ExosphereHost - an open-source infrastructure layer for background AI workflows and agents. This SDK enables you to create distributed, stateful applications using a node-based architecture.
Overview
ExosphereHost provides a robust, affordable, and effortless infrastructure for building scalable AI workflows and agents. The Python SDK allows you to:
- Create distributed workflows using a simple node-based architecture.
- Build stateful applications that can scale across multiple compute resources.
- Execute complex AI workflows with automatic state management.
- Integrate with the ExosphereHost platform for optimized performance.
Installation
pip install exospherehost
Quick Start
Important: In v1, all fields in
Inputs,Outputs, andSecretsmust be strings. If you need to pass complex data (e.g., JSON), serialize the data to a string first, then parse that string within your node.
Basic Node Creation
Create a simple node that processes data:
from exospherehost import Runtime, BaseNode
from pydantic import BaseModel
class SampleNode(BaseNode):
class Inputs(BaseModel):
name: str
data: str # v1: strings only
class Outputs(BaseModel):
message: str
processed_data: str # v1: strings only
async def execute(self) -> Outputs:
print(f"Processing data for: {self.inputs.name}")
# Your processing logic here; serialize complex data to strings (e.g., JSON)
processed_data = f"completed:{self.inputs.data}"
return self.Outputs(
message="success",
processed_data=processed_data
)
# Initialize the runtime
Runtime(
namespace="MyProject",
name="DataProcessor",
nodes=[SampleNode]
).start()
Environment Configuration
The SDK requires the following environment variables for authentication with ExosphereHost:
export EXOSPHERE_STATE_MANAGER_URI="your-state-manager-uri"
export EXOSPHERE_API_KEY="your-api-key"
Key Features
- Distributed Execution: Run nodes across multiple compute resources
- State Management: Automatic state persistence and recovery
- Type Safety: Full Pydantic integration for input/output validation
- String-only data model (v1): All
Inputs,Outputs, andSecretsfields are strings. Serialize non-string data (e.g., JSON) as needed. - Async Support: Native async/await support for high-performance operations
- Error Handling: Built-in retry mechanisms and error recovery
- Scalability: Designed for high-volume batch processing and workflows
- Graph Store (beta): Strings-only key-value store with per-run scope for sharing data across nodes (not durable across separate runs or clusters)
Architecture
The SDK is built around two core concepts:
Runtime
The Runtime class manages the execution environment and coordinates with the ExosphereHost state manager. It handles:
- Node lifecycle management
- State coordination
- Error handling and recovery
- Resource allocation
Nodes
Nodes are the building blocks of your workflows. Each node:
- Defines input/output schemas using Pydantic models
- Implements an
executemethod for processing logic - Can be connected to other nodes to form workflows
- Automatically handles state persistence
Advanced Usage
Custom Node Configuration
class ConfigurableNode(BaseNode):
class Inputs(BaseModel):
text: str
max_length: str = "100" # v1: strings only
class Outputs(BaseModel):
result: str
length: str # v1: strings only
async def execute(self) -> Outputs:
max_length = int(self.inputs.max_length)
result = self.inputs.text[:max_length]
return self.Outputs(result=result, length=str(len(result)))
Error Handling
class RobustNode(BaseNode):
class Inputs(BaseModel):
data: str
class Outputs(BaseModel):
success: str
result: str
async def execute(self) -> Outputs:
raise Exception("This is a test error")
Error handling is automatically handled by the runtime and the state manager.
Working with Secrets
Secrets allow you to securely manage sensitive configuration data like API keys, database credentials, and authentication tokens. Here's how to use secrets in your nodes:
from exospherehost import Runtime, BaseNode
from pydantic import BaseModel
import json
class APINode(BaseNode):
class Inputs(BaseModel):
user_id: str
query: str
class Outputs(BaseModel):
response: str # v1: strings only
status: str
class Secrets(BaseModel):
api_key: str
api_endpoint: str
database_url: str
async def execute(self) -> Outputs:
# Access secrets via self.secrets
headers = {"Authorization": f"Bearer {self.secrets.api_key}"}
# Use secrets for API calls
import httpx
async with httpx.AsyncClient() as client:
http_response = await client.post(
f"{self.secrets.api_endpoint}/process",
headers=headers,
json={"user_id": self.inputs.user_id, "query": self.inputs.query}
)
# Serialize body: prefer JSON if valid; fallback to text or empty string
response_text = http_response.text or ""
if response_text:
try:
response_str = json.dumps(http_response.json())
except Exception:
response_str = response_text
else:
response_str = ""
return self.Outputs(
response=response_str,
status="success"
)
Key points about secrets:
- Security: Secrets are stored securely by the ExosphereHost Runtime and are never exposed in logs or error messages
- Validation: The
Secretsclass uses Pydantic for automatic validation of secret values - String-only (v1): All
Secretsfields must be strings. - Access: Secrets are available via
self.secretsduring node execution - Types: Common secret types include API keys, database credentials, encryption keys, and authentication tokens
- Injection: Secrets are injected by the Runtime at execution time, so you don't need to handle them manually
State Management
The SDK provides a StateManager class for programmatically triggering graph executions and managing workflow states. This is useful for integrating ExosphereHost workflows into existing applications or for building custom orchestration logic.
StateManager Class
The StateManager class allows you to trigger graph executions with custom trigger states. It handles authentication and communication with the ExosphereHost state manager service.
Initialization
from exospherehost import StateManager
# Initialize with explicit configuration
state_manager = StateManager(
namespace="MyProject",
state_manager_uri="https://your-state-manager.exosphere.host",
key="your-api-key",
state_manager_version="v0"
)
# Or initialize with environment variables
state_manager = StateManager(namespace="MyProject")
Parameters:
namespace(str): The namespace for your projectstate_manager_uri(str, optional): The URI of the state manager service. If not provided, reads fromEXOSPHERE_STATE_MANAGER_URIenvironment variablekey(str, optional): Your API key. If not provided, reads fromEXOSPHERE_API_KEYenvironment variablestate_manager_version(str): The API version to use (default: "v0")
Triggering Graph Execution
from exospherehost import StateManager, TriggerState
# Create a single trigger state
trigger_state = TriggerState(
identifier="user-login",
inputs={
"user_id": "12345",
"session_token": "abc123def456",
"timestamp": "2024-01-15T10:30:00Z"
}
)
# Trigger the graph (beta store support)
result = await state_manager.trigger(
"my-graph",
inputs={
"user_id": "12345",
"session_token": "abc123def456"
},
store={
"cursor": "0" # persisted across nodes (beta)
}
)
Parameters:
graph_name(str): Name of the graph to executeinputs(dict[str, str] | None): Key/value inputs for the first node (strings only)store(dict[str, str] | None): Graph-level key/value store (beta) persisted across nodes
Returns:
dict: JSON payload from the state manager
Raises:
Exception: If the HTTP request fails
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 exospherehost-0.0.2b5.tar.gz.
File metadata
- Download URL: exospherehost-0.0.2b5.tar.gz
- Upload date:
- Size: 36.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.8.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4ca528f89c19f84433ad7d8423b8048a3bcaf53557f93c3a4fcc30418879d553
|
|
| MD5 |
3285bca6c8ca4827c1be607b9a47e62d
|
|
| BLAKE2b-256 |
8b9a97c72ba907651f641f72454d954bef57c26bcd6c02793f60c883dd84eefd
|
File details
Details for the file exospherehost-0.0.2b5-py3-none-any.whl.
File metadata
- Download URL: exospherehost-0.0.2b5-py3-none-any.whl
- Upload date:
- Size: 17.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.8.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0e5857a3301efe1d13c9f186220fa82e076801e57fbd1b8c446c5b4c29392e31
|
|
| MD5 |
c41313cd37bf359356d6bebd6af8da28
|
|
| BLAKE2b-256 |
d0e677d266bd9954290c9391d906668191fbf3e74771c7405a1ec9aa0663820c
|