Huitzo SDK
A Python framework for building modular command functions that integrate with the Huitzo platform.
Features
- Simple command decorator for defining functions
- Built-in clients for LLM, Email, HTTP, Telegram, SSH, Database, and File operations
- Pluggable storage backends with namespace isolation
- Full async/await support with automatic sync function handling
- Type-safe with Pydantic validation
- Comprehensive error handling
Installation
pip install huitzo-sdk
Quick Start
Defining a Command
from pydantic import BaseModel
from huitzo_sdk import command, Context, Result
class GreetingArgs(BaseModel):
name: str
language: str = "en"
@command(
name="greet",
namespace="examples",
version="1.0.0",
description="Greet a user in their language"
)
async def greet_user(args: GreetingArgs, ctx: Context) -> Result:
greetings = {"en": "Hello", "es": "Hola", "fr": "Bonjour"}
greeting = greetings.get(args.language, "Hello")
return {
"message": f"{greeting}, {args.name}!",
"user_id": str(ctx.user_id)
}
Using Built-in Integrations
from pydantic import BaseModel
from huitzo_sdk import command, Context, Result
class WeatherArgs(BaseModel):
city: str
@command(
name="get_weather",
namespace="weather",
version="1.0.0",
)
async def get_weather(args: WeatherArgs, ctx: Context) -> Result:
# Use built-in HTTP client
response = await ctx.http.get(
f"https://api.weather.com/v1/forecast?city={args.city}"
)
return response.json()
Complete Example: Data Processing Pipeline
from pydantic import BaseModel
from huitzo_sdk import command, Context, Result
class ProcessDataArgs(BaseModel):
data_url: str
recipient_email: str
@command(
name="process_data",
namespace="analytics",
version="1.0.0",
description="Fetch, analyze, and report on data"
)
async def process_data(args: ProcessDataArgs, ctx: Context) -> Result:
# Fetch data from external API
response = await ctx.http.get(args.data_url)
data = response.json()
# Store raw data
await ctx.storage.set(f"raw_data:{str(ctx.session_id)}", data)
# Analyze with LLM (limit data size to avoid token limits)
data_summary = str(data)[:500]
analysis = await ctx.llm.complete(
prompt=f"Analyze this data and provide insights: {data_summary}",
model="gpt-4"
)
# Send results via email
await ctx.email.send(
to=args.recipient_email,
subject="Data Analysis Complete",
body=f"Analysis Results:\n\n{analysis}"
)
return {
"status": "complete",
"session_id": str(ctx.session_id),
"data_points": len(data)
}
Core Concepts
Commands
Commands are functions decorated with @command. The decorator supports both sync and async functions.
Decorator parameters:
name: Command identifiernamespace: Organizational groupingversion: Semantic versiontimeout: Maximum execution time in seconds (default: 60)retries: Number of retry attempts (default: 3)description: Optional command description
Context
The Context object provides access to:
- Identity:
user_id,tenant_id,session_id,correlation_id - Metadata:
command_name,namespace,command_version - Integration Clients:
llm,email,http,telegram,ssh,db,files - Platform Services:
storage,secrets,log,cron
async def my_command(args: dict, ctx: Context) -> Result:
# Access user identity
user_id = ctx.user_id
# Use integration clients
completion = await ctx.llm.complete(
prompt="Explain quantum computing",
model="gpt-4"
)
# Send results via email
await ctx.email.send(
to="user@example.com",
subject="Your Results",
body=completion
)
return {"status": "sent"}
Integration Clients
Built-in clients for external services:
LLMClient: Language model completions and chatEmailClient: Send emails with templatesHTTPClient: HTTP requests with security controlsTelegramClient: Send messages and interact with TelegramSSHClient: Execute remote commands via SSHDBClient: Database operations with transaction supportFileClient: File operations and storage
Platform Services
Built-in platform utilities:
StorageClient: Persistent key-value storage with namespace isolationSecretsClient: Secure credential managementLogClient: Structured loggingCronClient: Schedule recurring tasks
Storage
Persistent storage with namespace isolation:
from huitzo_sdk.storage import InMemoryBackend, StorageNamespace
# Create storage backend
backend = InMemoryBackend()
storage = StorageNamespace(backend=backend, namespace="my-app")
# Store and retrieve data
await storage.set("user:123", {"name": "Alice", "score": 100})
user_data = await storage.get("user:123")
Error Handling
The SDK provides a comprehensive error hierarchy:
from huitzo_sdk import (
HuitzoError,
ValidationError,
CommandTimeoutError,
IntegrationError,
LLMError,
HTTPError,
StorageError
)
try:
result = await ctx.llm.complete(prompt="Hello")
except LLMError as e:
print(f"LLM failed: {e}")
except CommandTimeoutError as e:
print(f"Request timed out: {e}")
except HuitzoError as e:
print(f"Huitzo error: {e}")
Development
Prerequisites
- Python 3.11 or higher
- uv (recommended) or pip
Setup
# Clone the repository
git clone https://github.com/Huitzo-Inc/sdk.git
cd sdk
# Install dependencies
uv sync --dev
# Or with pip
pip install -e ".[dev]"
Running Tests
# Run all tests
pytest
# Run with coverage
pytest --cov=huitzo_sdk --cov-report=term-missing
# Run specific test file
pytest tests/test_command.py
Code Quality
# Type checking
mypy src/huitzo_sdk
# Linting and formatting
ruff check src tests
ruff format src tests
Project Structure
huitzo-sdk/
├── src/
│ └── huitzo_sdk/
│ ├── __init__.py # Public API exports
│ ├── command.py # @command decorator
│ ├── context.py # Context object
│ ├── types.py # Core type definitions
│ ├── errors.py # Error hierarchy
│ ├── integrations/ # Integration clients
│ │ ├── llm.py
│ │ ├── email.py
│ │ ├── http.py
│ │ ├── telegram.py
│ │ └── files.py
│ └── storage/ # Storage backends
│ ├── protocol.py
│ ├── memory.py
│ └── namespace.py
├── tests/ # Test suite
├── pyproject.toml # Project configuration
└── README.md # This file
Contributing
We welcome contributions! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes with tests
- Ensure all tests pass (
pytest) - Run linters (
ruff check src tests) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
License
See the LICENSE file for details.
Support
- Email: support@huitzo.com
- Community: Discord
- Documentation: docs.huitzo.com
- Issues: GitHub Issues
Metadata
Release files for huitzo-sdk 1.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| huitzo_sdk-1.6.0.tar.gz | 268.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| huitzo_sdk-1.6.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 414.1 kB
Release files / huitzo_sdk-1.6.0.tar.gz
| Download URL | huitzo_sdk-1.6.0.tar.gz |
|---|---|
| Size | 268.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
047214b11ed8daf5b9b9a0be44f5b8b06d4d1882fcb27b6253361727edc3521b
|
|
BLAKE2b-256 checksum How to use checksums |
1474af596281c0277c2e0857071a8b4cc76fbbf121ea18b7da339ff5e95330af
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / huitzo_sdk-1.6.0-py3-none-any.whl
| Download URL | huitzo_sdk-1.6.0-py3-none-any.whl |
|---|---|
| Size | 145.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ec3efbb37a013bfb5faaa4a629ace30505d8f3ba730062ca940289d78676a3c0
|
|
BLAKE2b-256 checksum How to use checksums |
a97efa9b52f6be2324b23384fa7387c787b96372ed26e88ca8e6d79845a6585b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|