Skip to main content

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 identifier
  • namespace: Organizational grouping
  • version: Semantic version
  • timeout: 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 chat
  • EmailClient: Send emails with templates
  • HTTPClient: HTTP requests with security controls
  • TelegramClient: Send messages and interact with Telegram
  • SSHClient: Execute remote commands via SSH
  • DBClient: Database operations with transaction support
  • FileClient: File operations and storage

Platform Services

Built-in platform utilities:

  • StorageClient: Persistent key-value storage with namespace isolation
  • SecretsClient: Secure credential management
  • LogClient: Structured logging
  • CronClient: 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:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Make your changes with tests
  4. Ensure all tests pass (pytest)
  5. Run linters (ruff check src tests)
  6. Commit your changes (git commit -m 'Add amazing feature')
  7. Push to the branch (git push origin feature/amazing-feature)
  8. Open a Pull Request

License

See the LICENSE file for details.

Support

Metadata

Release files for huitzo-sdk 1.7.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for huitzo-sdk 1.7.0
File Size Uploaded
huitzo_sdk-1.7.0.tar.gz 275.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for huitzo-sdk 1.7.0
File Interpreter ABI Platform
huitzo_sdk-1.7.0-py3-none-any.whl Python 3 none any Details

Total release size: 421.1 kB

Release files / huitzo_sdk-1.7.0.tar.gz

Download URL huitzo_sdk-1.7.0.tar.gz
Size 275.1 kB
Tags Source
SHA-256 checksum
How to use checksums
f47c609e4cb29676c343768b6eafd69e8de267500f8173273aeafb5eb2ee7d1b
BLAKE2b-256 checksum
How to use checksums
bcf75d017d737ccc7d87fe66ac0ded39e2681288c29f5df40068b64c9314947f
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.7.0-py3-none-any.whl

Download URL huitzo_sdk-1.7.0-py3-none-any.whl
Size 146.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
34470135d10b02e3f23a6752fbd64411a5ecf2d66cca833410390947d47b8a69
BLAKE2b-256 checksum
How to use checksums
8251d7bd53358008895542e529ff78ec8f65f164bc192647e99e97360ac94a78
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

1.7.1

2 release files

This release

1.7.0 This release

2 release files

1.6.0

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

0.0.11

2 release files

0.0.10

2 release files

0.0.9

2 release files

0.0.8

2 release files

0.0.7

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

0.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page