Installation
Copy
pip install --upgrade asteroid-odyssey
Copy
uv pip install asteroid-odyssey
Create your Python file (run_agent.py)
Copy
from asteroid_odyssey import (
Configuration,
ApiClient,
AgentsApi,
ExecutionApi,
AgentsAgentExecuteAgentRequest,
)
import time
# Configure the client
config = Configuration(
api_key={"ApiKeyAuth": "your-api-key"}
)
client = ApiClient(config)
# Execute an agent
agents_api = AgentsApi(client)
request = AgentsAgentExecuteAgentRequest(
inputs={"username": "[email protected]"}
)
response = agents_api.agent_execute_post(
agent_id="your-agent-id",
agents_agent_execute_agent_request=request
)
execution_id = response.execution_id
print(f"Execution started: {execution_id}")
# Wait for result
execution_api = ExecutionApi(client)
while True:
result = execution_api.execution_get(execution_id=execution_id)
status = result.status.value
print(f"Status: {status}")
if status in ["completed", "failed", "cancelled"]:
break
time.sleep(2)
print(f"Final status: {status}")
Run the agent
Replace your API key, your agent_id, and update the inputs with your agent’s variables (or remove if no variables), then run:
Copy
python run_agent.py
Agent Creation: Agents can only be created through the Asteroid Platform web interface. The API is designed for executing existing agents, not creating them.
API Classes
The SDK provides four main API classes:| Class | Purpose |
|---|---|
AgentsApi | List agents, execute agents |
ExecutionApi | Get execution status, activities, send messages |
FilesApi | Upload files, stage temporary files |
AgentProfilesApi | Manage agent profiles (browser configs, proxies, cookies) |
AgentProfilePoolsApi | Manage profile pools (group profiles for automatic selection) |
Quick Reference
- AgentsApi
- ExecutionApi
- FilesApi
- AgentProfilesApi
- AgentProfilePoolsApi
Copy
from asteroid_odyssey import AgentsApi, AgentsAgentExecuteAgentRequest
agents_api = AgentsApi(client)
# List all agents
response = agents_api.agent_list()
for agent in response.items:
print(f"{agent.id}: {agent.name}")
# List with pagination and search
response = agents_api.agent_list(
page_size=10,
page=1,
search_name="My Agent"
)
# Execute an agent
request = AgentsAgentExecuteAgentRequest(
inputs={"username": "[email protected]", "date": "2025-01-15"},
agent_profile_id="optional-profile-id" # Optional: use a single profile
# agent_profile_pool_id="optional-pool-id" # Or use a profile pool
)
response = agents_api.agent_execute_post(
agent_id="your-agent-id",
agents_agent_execute_agent_request=request
)
execution_id = response.execution_id
Copy
from asteroid_odyssey import ExecutionApi, AgentsExecutionUserMessagesAddTextBody
execution_api = ExecutionApi(client)
# List executions
response = execution_api.executions_list(page_size=10)
for execution in response.items:
print(f"{execution.id}: {execution.status.value}")
# Get execution details
execution = execution_api.execution_get(execution_id="your-execution-id")
print(f"Status: {execution.status.value}")
print(f"Agent ID: {execution.agent_id}")
# Get execution activities
activities = execution_api.execution_activities_get(execution_id="your-execution-id")
for activity in activities:
print(f"Activity: {activity.payload}")
# Send a message to a running execution
body = AgentsExecutionUserMessagesAddTextBody(text="Hello from the user!")
execution_api.execution_user_messages_add(
execution_id="your-execution-id",
agents_execution_user_messages_add_text_body=body
)
Copy
from asteroid_odyssey import FilesApi
files_api = FilesApi(client)
# Get files from an execution
files = files_api.execution_context_files_get(execution_id="your-execution-id")
for f in files:
print(f"{f.name}: {f.size} bytes")
# Stage temporary files (for use in execution)
file_content = b"Hello World!"
response = files_api.temp_files_stage(
organization_id="your-org-id",
files=[("document.txt", file_content)]
)
print(f"Staged files: {response.files}")
# Upload files to a running execution
with open("myfile.pdf", "rb") as f:
files_api.execution_context_files_upload(
execution_id="your-execution-id",
files=[("myfile.pdf", f.read())]
)
Copy
from asteroid_odyssey import (
AgentProfilesApi,
AgentsProfileCreateAgentProfileRequest,
AgentsProfileUpdateAgentProfileRequest,
AgentsProfileCountryCode,
AgentsProfileProxyType,
)
profiles_api = AgentProfilesApi(client)
# List profiles for an organization
response = profiles_api.agent_profiles_list(organization_id="your-org-id")
for profile in response.items:
print(f"{profile.id}: {profile.name}")
# Get a specific profile
profile = profiles_api.agent_profile_get(profile_id="your-profile-id")
print(f"Name: {profile.name}")
print(f"OS: {profile.operating_system}")
# Create a new profile
request = AgentsProfileCreateAgentProfileRequest(
name="My Profile",
organization_id="your-org-id",
country_code=AgentsProfileCountryCode.US,
proxy_type=AgentsProfileProxyType.RESIDENTIAL,
)
new_profile = profiles_api.agent_profiles_create(
agents_profile_create_agent_profile_request=request
)
# Update a profile
update_request = AgentsProfileUpdateAgentProfileRequest(
name="Updated Profile Name"
)
profiles_api.agent_profile_update(
profile_id="your-profile-id",
agents_profile_update_agent_profile_request=update_request
)
# Delete a profile
profiles_api.agent_profile_delete(profile_id="your-profile-id")
# Clear browser cache for a profile
profiles_api.agent_profile_clear_browser_cache(profile_id="your-profile-id")
Copy
from asteroid_odyssey import (
AgentProfilePoolsApi,
AgentsApi,
AgentsAgentExecuteAgentRequest,
AgentsProfilePoolCreateProfilePoolRequest,
AgentsProfilePoolUpdateProfilePoolRequest,
AgentsProfilePoolAddMembersRequest,
AgentsProfilePoolRemoveMembersRequest,
AgentsProfilePoolSelectionStrategy,
)
pools_api = AgentProfilePoolsApi(client)
# Create a profile pool
request = AgentsProfilePoolCreateProfilePoolRequest(
name="My Rotation Pool",
organization_id="your-org-id",
selection_strategy=AgentsProfilePoolSelectionStrategy.LEAST_RECENTLY_USED,
allow_concurrent_use=False,
)
pool = pools_api.agent_profile_pool_create(
agents_profile_pool_create_profile_pool_request=request
)
print(f"Created pool: {pool.id}")
# List pools for an organization
response = pools_api.agent_profile_pool_list(organization_id="your-org-id")
for p in response.items:
print(f"{p.id}: {p.name} ({p.selection_strategy})")
# Get a specific pool
pool_details = pools_api.agent_profile_pool_get(pool_id="your-pool-id")
print(f"Pool: {pool_details.name}")
# Update a pool
update_request = AgentsProfilePoolUpdateProfilePoolRequest(
selection_strategy=AgentsProfilePoolSelectionStrategy.MOST_RECENTLY_USED,
allow_concurrent_use=True,
)
pools_api.agent_profile_pool_update(
pool_id="your-pool-id",
agents_profile_pool_update_profile_pool_request=update_request
)
# Add profiles to the pool
add_request = AgentsProfilePoolAddMembersRequest(
profile_ids=["profile-id-1", "profile-id-2", "profile-id-3"]
)
pools_api.agent_profile_pool_members_add(
pool_id="your-pool-id",
agents_profile_pool_add_members_request=add_request
)
# List pool members
members = pools_api.agent_profile_pool_members_list(pool_id="your-pool-id")
for member in members.items:
print(f"Profile: {member.name}")
# Remove profiles from the pool
remove_request = AgentsProfilePoolRemoveMembersRequest(
profile_ids=["profile-id-1"]
)
pools_api.agent_profile_pool_members_remove(
pool_id="your-pool-id",
agents_profile_pool_remove_members_request=remove_request
)
# Execute an agent with a profile pool
agents_api = AgentsApi(client)
exec_request = AgentsAgentExecuteAgentRequest(
inputs={"username": "[email protected]"},
agent_profile_pool_id=pool.id # Use pool instead of agent_profile_id
)
response = agents_api.agent_execute_post(
agent_id="your-agent-id",
agents_agent_execute_agent_request=exec_request
)
print(f"Execution ID: {response.execution_id}")
# Delete a pool
pools_api.agent_profile_pool_delete(pool_id="your-pool-id")
Complete Examples
Execute an agent and wait for completion
Execute an agent and wait for completion
Copy
from asteroid_odyssey import (
Configuration,
ApiClient,
AgentsApi,
ExecutionApi,
AgentsAgentExecuteAgentRequest,
)
import time
import os
# Terminal statuses
TERMINAL_STATUSES = {"completed", "failed", "cancelled"}
def main():
# Configure client
config = Configuration(
api_key={"ApiKeyAuth": os.environ.get("ASTEROID_API_KEY")}
)
client = ApiClient(config)
# Execute agent
agents_api = AgentsApi(client)
request = AgentsAgentExecuteAgentRequest(
inputs={
"username": "[email protected]",
"order_id": "ORD-12345"
}
)
response = agents_api.agent_execute_post(
agent_id="your-agent-id",
agents_agent_execute_agent_request=request
)
execution_id = response.execution_id
print(f"Execution started: {execution_id}")
# Poll for completion
execution_api = ExecutionApi(client)
while True:
result = execution_api.execution_get(execution_id=execution_id)
status = result.status.value
print(f"Status: {status}")
if status in TERMINAL_STATUSES:
break
time.sleep(2)
print(f"Execution finished with status: {status}")
if __name__ == "__main__":
main()
Interactive agent with user messages
Interactive agent with user messages
Copy
from asteroid_odyssey import (
Configuration,
ApiClient,
AgentsApi,
ExecutionApi,
AgentsAgentExecuteAgentRequest,
AgentsExecutionUserMessagesAddTextBody,
)
import time
import os
TERMINAL_STATUSES = {"completed", "failed", "cancelled"}
def main():
config = Configuration(
api_key={"ApiKeyAuth": os.environ.get("ASTEROID_API_KEY")}
)
client = ApiClient(config)
# Start execution
agents_api = AgentsApi(client)
request = AgentsAgentExecuteAgentRequest(
inputs={"task": "Book an appointment"}
)
response = agents_api.agent_execute_post(
agent_id="your-agent-id",
agents_agent_execute_agent_request=request
)
execution_id = response.execution_id
print(f"Execution started: {execution_id}")
execution_api = ExecutionApi(client)
while True:
result = execution_api.execution_get(execution_id=execution_id)
status = result.status.value
print(f"Status: {status}")
if status in TERMINAL_STATUSES:
print(f"Execution completed with status: {status}")
break
if status == "paused_by_agent":
# Agent is waiting for user input
print("Agent is waiting for input...")
user_input = input("Your response: ")
body = AgentsExecutionUserMessagesAddTextBody(text=user_input)
execution_api.execution_user_messages_add(
execution_id=execution_id,
agents_execution_user_messages_add_text_body=body
)
print("Message sent!")
time.sleep(2)
if __name__ == "__main__":
main()
Upload files to an execution
Upload files to an execution
Copy
from asteroid_odyssey import (
Configuration,
ApiClient,
FilesApi,
)
import os
def upload_files_example():
config = Configuration(
api_key={"ApiKeyAuth": os.environ.get("ASTEROID_API_KEY")}
)
client = ApiClient(config)
files_api = FilesApi(client)
execution_id = "your-execution-id"
# Upload a file from disk
with open("document.pdf", "rb") as f:
file_content = f.read()
files_api.execution_context_files_upload(
execution_id=execution_id,
files=[("document.pdf", file_content)]
)
print("File uploaded successfully!")
# Upload multiple files
files_to_upload = []
for filename in ["file1.txt", "file2.txt"]:
with open(filename, "rb") as f:
files_to_upload.append((filename, f.read()))
files_api.execution_context_files_upload(
execution_id=execution_id,
files=files_to_upload
)
print(f"Uploaded {len(files_to_upload)} files")
if __name__ == "__main__":
upload_files_example()
Create and use an agent profile
Create and use an agent profile
Copy
from asteroid_odyssey import (
Configuration,
ApiClient,
AgentsApi,
AgentProfilesApi,
AgentsAgentExecuteAgentRequest,
AgentsProfileCreateAgentProfileRequest,
AgentsProfileCountryCode,
AgentsProfileProxyType,
AgentsProfileCookie,
)
import os
def profile_example():
config = Configuration(
api_key={"ApiKeyAuth": os.environ.get("ASTEROID_API_KEY")}
)
client = ApiClient(config)
profiles_api = AgentProfilesApi(client)
# Create a profile with proxy and cookies
request = AgentsProfileCreateAgentProfileRequest(
name="E-commerce Profile",
organization_id="your-org-id",
country_code=AgentsProfileCountryCode.US,
proxy_type=AgentsProfileProxyType.RESIDENTIAL,
captcha_solver_active=True,
cookies=[
AgentsProfileCookie(
name="session",
key="session_id",
value="abc123",
domain="example.com",
secure=True,
http_only=True,
)
]
)
profile = profiles_api.agent_profiles_create(
agents_profile_create_agent_profile_request=request
)
print(f"Created profile: {profile.id}")
# Execute an agent with the profile
agents_api = AgentsApi(client)
exec_request = AgentsAgentExecuteAgentRequest(
inputs={"product_url": "https://example.com/product/123"},
agent_profile_id=profile.id
)
response = agents_api.agent_execute_post(
agent_id="your-agent-id",
agents_agent_execute_agent_request=exec_request
)
print(f"Execution started: {response.execution_id}")
if __name__ == "__main__":
profile_example()
Rotate credentials with profile pools
Rotate credentials with profile pools
Copy
from asteroid_odyssey import (
Configuration,
ApiClient,
AgentsApi,
AgentProfilesApi,
AgentProfilePoolsApi,
ExecutionApi,
AgentsProfileCreateAgentProfileRequest,
AgentsProfileCountryCode,
AgentsProfileProxyType,
AgentsProfilePoolCreateProfilePoolRequest,
AgentsProfilePoolAddMembersRequest,
AgentsProfilePoolSelectionStrategy,
AgentsAgentExecuteAgentRequest,
)
import os
import time
TERMINAL_STATUSES = {"completed", "failed", "cancelled"}
def profile_pool_example():
config = Configuration(
api_key={"ApiKeyAuth": os.environ.get("ASTEROID_API_KEY")}
)
client = ApiClient(config)
profiles_api = AgentProfilesApi(client)
pools_api = AgentProfilePoolsApi(client)
agents_api = AgentsApi(client)
execution_api = ExecutionApi(client)
org_id = "your-org-id"
# Create multiple profiles with different credentials
profile_names = ["Account 1", "Account 2", "Account 3"]
profiles = []
for name in profile_names:
request = AgentsProfileCreateAgentProfileRequest(
name=name,
organization_id=org_id,
country_code=AgentsProfileCountryCode.US,
proxy_type=AgentsProfileProxyType.RESIDENTIAL,
)
profile = profiles_api.agent_profiles_create(
agents_profile_create_agent_profile_request=request
)
profiles.append(profile)
print(f"Created profile: {profile.id}")
print(f"Created {len(profiles)} profiles")
# Create a pool with LRU strategy
pool_request = AgentsProfilePoolCreateProfilePoolRequest(
name="Rotation Pool",
organization_id=org_id,
selection_strategy=AgentsProfilePoolSelectionStrategy.LEAST_RECENTLY_USED,
allow_concurrent_use=False, # Prevent credential conflicts
)
pool = pools_api.agent_profile_pool_create(
agents_profile_pool_create_profile_pool_request=pool_request
)
print(f"Created pool: {pool.id}")
# Add profiles to the pool
add_request = AgentsProfilePoolAddMembersRequest(
profile_ids=[p.id for p in profiles]
)
pools_api.agent_profile_pool_members_add(
pool_id=pool.id,
agents_profile_pool_add_members_request=add_request
)
print("Added profiles to pool")
# Run multiple executions - system will distribute across profiles
execution_ids = []
for i in range(3):
exec_request = AgentsAgentExecuteAgentRequest(
inputs={"task": f"Execution {i+1}"},
agent_profile_pool_id=pool.id
)
response = agents_api.agent_execute_post(
agent_id="your-agent-id",
agents_agent_execute_agent_request=exec_request
)
execution_ids.append(response.execution_id)
print(f"Started execution: {response.execution_id}")
print(f"Started {len(execution_ids)} executions with pool")
# Wait for all to complete
for exec_id in execution_ids:
print(f"Waiting for execution: {exec_id}")
while True:
result = execution_api.execution_get(execution_id=exec_id)
status = result.status.value
if status in TERMINAL_STATUSES:
print(f"{exec_id}: {status}")
break
time.sleep(2)
print("All executions completed")
if __name__ == "__main__":
profile_pool_example()
Configuration Options
Copy
from asteroid_odyssey import Configuration, ApiClient
# Basic configuration
config = Configuration(
api_key={"ApiKeyAuth": "your-api-key"}
)
# Custom host (for self-hosted or development)
config = Configuration(
host="https://custom-host.example.com/agents/v2",
api_key={"ApiKeyAuth": "your-api-key"}
)
# With debug logging
config = Configuration(
api_key={"ApiKeyAuth": "your-api-key"},
debug=True
)
client = ApiClient(config)
Execution Statuses
| Status | Description |
|---|---|
starting | Execution is initializing |
running | Agent is actively working |
paused | Execution is paused |
paused_by_agent | Agent is waiting for user input |
awaiting_confirmation | Waiting for confirmation |
completed | Successfully finished |
failed | Execution failed |
cancelled | Execution was cancelled |
Error Handling
Copy
from asteroid_odyssey import ApiException
try:
response = agents_api.agent_execute_post(
agent_id="invalid-id",
agents_agent_execute_agent_request=request
)
except ApiException as e:
print(f"API Error: {e.status} - {e.reason}")
print(f"Body: {e.body}")

