Installation
The SDK is included with the main omnara package.
Quick Start
from omnara import OmnaraClient
import uuid
# Initialize client
client = OmnaraClient(api_key="your-api-key")
# Generate session ID
instance_id = str(uuid.uuid4())
# Send a status update
response = client.send_message(
agent_type="My Custom Agent",
content="Analyzing codebase structure",
agent_instance_id=instance_id,
requires_user_input=False
)
print(f"Message sent: {response['message_id']}")
# Ask for user input
answer = client.send_message(
content="Should I refactor this legacy module?",
agent_instance_id=instance_id,
requires_user_input=True
)
print(f"User answered: {answer}")
Client Initialization
base_url
string
default:"https://agent.omnara.com"
API server URL (for self-hosted instances)
from omnara import OmnaraClient
# Basic
client = OmnaraClient(api_key="xxxxxxxxxxxxxxxxxxxx")
# Self-hosted
client = OmnaraClient(
api_key="xxxxxxxxxxxxxxxxxxxx",
base_url="https://omnara.mycompany.com"
)
# From environment variable
import os
client = OmnaraClient(api_key=os.getenv("OMNARA_API_KEY"))
Sending Messages
Non-blocking Message
Send status updates without waiting:
response = client.send_message(
agent_type="Code Analyzer",
content="Found 5 potential issues",
agent_instance_id=instance_id,
requires_user_input=False,
send_push=True # Send push notification
)
# Check for queued user messages
if response.get("queued_user_messages"):
for msg in response["queued_user_messages"]:
print(f"User said: {msg['content']}")
Blocking Question
Ask a question and wait for response:
answer = client.send_message(
content="Which file should I start with?",
agent_instance_id=instance_id,
requires_user_input=True,
timeout_minutes=60, # Wait up to 1 hour
poll_interval=10.0 # Check every 10 seconds
)
print(f"User selected: {answer}")
Async Client
For async/await usage:
from omnara import AsyncOmnaraClient
import asyncio
async def main():
client = AsyncOmnaraClient(api_key="your-api-key")
# Send message
response = await client.send_message(
agent_type="Async Agent",
content="Processing...",
requires_user_input=False
)
# Ask question
answer = await client.send_message(
content="Proceed?",
agent_instance_id=response["agent_instance_id"],
requires_user_input=True
)
print(answer)
asyncio.run(main())
Session Management
Creating Sessions
Sessions are created automatically on first message:
import uuid
# Generate unique session ID
session_id = str(uuid.uuid4())
# First message creates session
client.send_message(
agent_type="My Agent",
content="Starting work",
agent_instance_id=session_id,
requires_user_input=False
)
Ending Sessions
Mark a session as complete:
client.end_session(agent_instance_id=session_id)
This:
- Sets status to COMPLETED
- Timestamps the end time
- Stops tracking as active
- Keeps session in history
Advanced Features
Git Diff Tracking
Include code changes with your messages:
import subprocess
def get_git_diff():
result = subprocess.run(
["git", "diff", "HEAD"],
capture_output=True,
text=True
)
return result.stdout
# Send with diff
response = client.send_message(
agent_type="Code Agent",
content="Modified authentication flow",
agent_instance_id=instance_id,
requires_user_input=False,
git_diff=get_git_diff()
)
The diff appears in the dashboard for easy code review.
Attach custom metadata to messages:
response = client.send_message(
agent_type="Test Runner",
content="Tests completed",
agent_instance_id=instance_id,
requires_user_input=False,
message_metadata={
"test_results": {
"passed": 42,
"failed": 3,
"skipped": 1
},
"duration_ms": 1234,
"commit_hash": "abc123def"
}
)
Metadata is stored with the message and visible in the dashboard.
Error Handling
from omnara import OmnaraClient
from omnara.exceptions import OmnaraAPIError
client = OmnaraClient(api_key="your-key")
try:
response = client.send_message(
agent_type="My Agent",
content="Test message",
requires_user_input=False
)
except OmnaraAPIError as e:
print(f"API error: {e.status_code} - {e.message}")
# Handle error appropriately
except Exception as e:
print(f"Unexpected error: {e}")
Complete Example
Full agent implementation with error handling:
from omnara import OmnaraClient
import uuid
import time
def run_agent():
# Initialize
client = OmnaraClient(api_key="your-key")
session_id = str(uuid.uuid4())
try:
# Start session
client.send_message(
agent_type="Code Review Agent",
content="Starting code review",
agent_instance_id=session_id,
requires_user_input=False
)
# Do some work
time.sleep(2)
# Report progress
client.send_message(
content="Analyzed 10 files, found 3 issues",
agent_instance_id=session_id,
requires_user_input=False
)
# Ask for guidance
answer = client.send_message(
content="Should I auto-fix the linting issues?",
agent_instance_id=session_id,
requires_user_input=True,
timeout_minutes=30
)
# Process response
if "yes" in answer.lower():
client.send_message(
content="Fixing issues...",
agent_instance_id=session_id,
requires_user_input=False
)
# Fix issues...
time.sleep(5)
client.send_message(
content="All issues fixed! ✅",
agent_instance_id=session_id,
requires_user_input=False,
send_push=True
)
else:
client.send_message(
content="Skipping auto-fix as requested",
agent_instance_id=session_id,
requires_user_input=False
)
finally:
# Always end session
client.end_session(agent_instance_id=session_id)
if __name__ == "__main__":
run_agent()
SDK Reference
OmnaraClient
Methods:
Send a message or ask a questionParameters:
agent_type (str, optional): Agent type name
content (str, required): Message content
agent_instance_id (str, optional): Session ID
requires_user_input (bool, default=False): Whether to wait for response
timeout_minutes (int, default=1440): Wait timeout (24 hours)
poll_interval (float, default=10.0): Polling interval in seconds
send_email (bool, default=False): Send email notification
send_sms (bool, default=False): Send SMS notification
send_push (bool, default=False): Send push notification
git_diff (str, optional): Git diff content
message_metadata (dict, optional): Custom metadata
Returns:
- If
requires_user_input=False: Response dict with message_id, agent_instance_id, queued_user_messages
- If
requires_user_input=True: User’s response text (string)
Mark session as completedParameters:
agent_instance_id (str, required): Session to end
Returns: Success response dict
AsyncOmnaraClient
Same interface as OmnaraClient but with async/await:
from omnara import AsyncOmnaraClient
async def async_agent():
client = AsyncOmnaraClient(api_key="your-key")
response = await client.send_message(
agent_type="Async Agent",
content="Processing async task",
requires_user_input=False
)
answer = await client.send_message(
content="Continue processing?",
agent_instance_id=response["agent_instance_id"],
requires_user_input=True
)
await client.end_session(agent_instance_id=response["agent_instance_id"])
Source Code
The SDK source is open source and available in the repository:
View SDK Source
src/omnara/sdk/ in the Omnara repository