Skip to main content

Unified AI SDK - Multi-provider AI abstraction layer with fallback support

Project description

Unified AI SDK

Multi-provider AI abstraction layer with TTS support, fallback chains, and breadcrumb observability.

Quick Start

from unified_ai import UnifiedAI, Config, ProviderConfig

# Configure providers
config = Config(
    providers={
        "gemini": ProviderConfig(api_key="AIza..."),
        "elevenlabs": ProviderConfig(api_key="sk_..."),
    }
)

sdk = UnifiedAI(config)

# Generate speech with preset (recommended)
response = await sdk.generate_speech(
    "Hello world!",
    preset="gemini/turov_channel"
)
response.audio.save("output.mp3")

# Or with explicit parameters
response = await sdk.generate_speech(
    "Hello!",
    voice="Enceladus",
    model="gemini/gemini-2.5-pro-preview-tts",
    provider_params={"temperature": 1.35}
)

Available Presets

from unified_ai import list_presets

for name, description in list_presets().items():
    print(f"{name}: {description}")

Gemini Presets

Preset Voice Model Temperature Use Case
gemini/turov_channel Enceladus Pro 1.35 Business/motivational content
gemini/warm_trainer Enceladus Pro 1.35 Educational content
gemini/narrator_fast Kore Flash 1.0 Quick narration
gemini/long_content Puck Pro 1.2 Audiobooks (streaming)
gemini/storyteller Puck Pro 1.2 Expressive stories
gemini/news Charon Flash 0.8 News reading

ElevenLabs Presets

Preset Voice Description
elevenlabs/turov Vladimir Turov Custom cloned voice
elevenlabs/george George Warm storyteller

Custom Presets

Add YAML files to presets/configs/:

# presets/configs/custom/my_voice.yaml
provider: gemini
model: gemini-2.5-pro-preview-tts
voice: Enceladus
temperature: 1.35
output_format: mp3
streaming: false
description: "My custom voice preset"

Then use: preset="custom/my_voice"

Provider Parameters

Gemini TTS

provider_params={
    "temperature": 1.35,  # 0.0-2.0, higher = more expressive
    "streaming": True,    # For long content
}

ElevenLabs TTS

provider_params={
    "stability": 0.5,
    "similarity_boost": 0.75,
}

Fallback Chains

from unified_ai import Config, FallbackConfig

config = Config(
    providers={...},
    fallback=FallbackConfig(
        tts=["gemini/gemini-2.5-pro-preview-tts", "elevenlabs/eleven_multilingual_v2"]
    )
)

# Will try Gemini first, then ElevenLabs if Gemini fails
response = await sdk.generate_speech(text)

Breadcrumb Observability

Every request includes breadcrumbs for debugging:

response = await sdk.generate_speech(text, include_breadcrumbs=True)

for bc in response.breadcrumbs:
    print(f"[{bc['level']}] {bc['layer']}: {bc['action']}")

API Reference

UnifiedAI

class UnifiedAI:
    async def generate_speech(
        text: str,
        voice: str = None,           # Voice name/ID
        model: str = None,           # "provider/model"
        output_format: str = "mp3",  # mp3, wav, ogg
        preset: str = None,          # "provider/preset_name"
        provider_params: dict = {},  # Provider-specific params
    ) -> TTSResponse

TTSResponse

@dataclass
class TTSResponse:
    success: bool
    audio: RawAudioResponse  # .data, .format, .save(path)
    provider: str
    model: str
    latency_ms: float
    breadcrumbs: List[dict]

Helper Functions

from unified_ai import list_presets, load_preset

# List all available presets
presets = list_presets()

# Load a specific preset
preset = load_preset("gemini/turov_channel")
print(preset.voice, preset.temperature)

File Structure

unified_ai/
├── sdk.py              # Main UnifiedAI class
├── config.py           # Config, ProviderConfig
├── types.py            # TTSRequest, TTSResponse, AudioFormat
├── exceptions.py       # SDKError, ProviderError
├── breadcrumbs.py      # Observability system
├── adapters/
│   ├── base.py         # BaseAdapter ABC
│   ├── gemini.py       # GeminiAdapter (TTS)
│   └── elevenlabs.py   # ElevenLabsAdapter (TTS)
├── clients/
│   ├── base.py         # AdapterRegistry
│   └── tts.py          # UnifiedTTSClient with fallback
├── presets/
│   ├── __init__.py     # load_preset, list_presets
│   └── configs/        # YAML preset files
│       ├── gemini/
│       └── elevenlabs/
├── utils/
│   ├── audio.py        # PCM to MP3/WAV/OGG conversion
│   └── retry.py        # Retry strategies
└── tests/
    └── audio_samples/  # Test audio files

Requirements

aiohttp
pydub      # For MP3/OGG conversion
pyyaml     # For YAML presets
google-genai  # For Gemini adapter

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lifeaitools_sdk-0.0.1.tar.gz (1.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lifeaitools_sdk-0.0.1-py3-none-any.whl (7.8 kB view details)

Uploaded Python 3

File details

Details for the file lifeaitools_sdk-0.0.1.tar.gz.

File metadata

  • Download URL: lifeaitools_sdk-0.0.1.tar.gz
  • Upload date:
  • Size: 1.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.12

File hashes

Hashes for lifeaitools_sdk-0.0.1.tar.gz
Algorithm Hash digest
SHA256 76e57e18786f4980fad6ee016fd5082c485b5fd39ec4dc667a40fae349e8cb17
MD5 c224a2ec20ac6886a565ea730dd34544
BLAKE2b-256 5cbc41867e4f295ed7159e5eb9392c925c6d92c7eec1e1736abd178ec41b1901

See more details on using hashes here.

File details

Details for the file lifeaitools_sdk-0.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for lifeaitools_sdk-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a2d02c66991aacbe67e953b1dbeed4a5810bc4b62b24b705a9d687d71059de3d
MD5 2b0791e66c3642779b45b09ae201ab2d
BLAKE2b-256 3eb809d7c32ff20f2cc5fe3e1c1ef9c40b1b79b91da7847ed3e9fff09199dce6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page