Skip to content

Release Notes: v0.11.0

Release Date: 2026-06-13

Highlights

  • Global Provider Registry: Package-level registration functions for STT, TTS, and CallSystem providers
  • Priority-Based Registration: Thin (stdlib-only) vs thick (SDK-based) provider layering
  • Architecture Documentation: CLAUDE.md with provider implementation guidelines

New Features

Global Provider Registry

The new global registry enables provider packages to register themselves via init(), eliminating circular dependencies:

import omnivoice "github.com/plexusone/omnivoice-core"

// In provider package init()
func init() {
    omnivoice.RegisterSTTProvider("deepgram", NewSTTProvider, omnivoice.PriorityThick)
    omnivoice.RegisterTTSProvider("deepgram", NewTTSProvider, omnivoice.PriorityThick)
}

Priority System

Providers register with a priority level:

Constant Value Description
PriorityThin 0 Stdlib-only implementations (no external dependencies)
PriorityThick 10 Official SDK implementations (full feature support)

Higher priority providers override lower priority registrations for the same name, enabling thin/thick layering:

// In omnivoice-core (thin, stdlib-only)
omnivoice.RegisterSTTProvider("deepgram", thinDeepgramFactory, omnivoice.PriorityThin)

// In omni-deepgram (thick, uses SDK)
omnivoice.RegisterSTTProvider("deepgram", thickDeepgramFactory, omnivoice.PriorityThick)

// Application imports both → gets thick implementation

Using Registered Providers

import (
    omnivoice "github.com/plexusone/omnivoice-core"
    "github.com/plexusone/omnivoice-core/registry"
    _ "github.com/plexusone/omni-deepgram"  // Auto-registers "deepgram"
)

func main() {
    // Get provider from registry
    stt, err := omnivoice.GetSTTProvider("deepgram", registry.WithAPIKey(apiKey))

    // List available providers
    names := omnivoice.ListSTTProviders() // ["deepgram", ...]

    // Check if provider exists
    if omnivoice.HasSTTProvider("deepgram") {
        priority := omnivoice.GetSTTProviderPriority("deepgram") // 10
    }
}

API Reference

Registration Functions

Function Description
RegisterSTTProvider(name, factory, priority) Register STT provider
RegisterTTSProvider(name, factory, priority) Register TTS provider
RegisterCallSystemProvider(name, factory, priority) Register CallSystem provider

Retrieval Functions

Function Description
GetSTTProvider(name, opts...) Create STT provider instance
GetTTSProvider(name, opts...) Create TTS provider instance
GetCallSystemProvider(name, opts...) Create CallSystem instance

Query Functions

Function Description
ListSTTProviders() List registered STT provider names
ListTTSProviders() List registered TTS provider names
ListCallSystemProviders() List registered CallSystem names
HasSTTProvider(name) Check if STT provider is registered
HasTTSProvider(name) Check if TTS provider is registered
HasCallSystemProvider(name) Check if CallSystem is registered
GetSTTProviderPriority(name) Get STT provider priority (-1 if not found)
GetTTSProviderPriority(name) Get TTS provider priority (-1 if not found)
GetCallSystemProviderPriority(name) Get CallSystem priority (-1 if not found)

Priority Constants

Constant Value Use Case
PriorityThin 0 Stdlib-only implementations
PriorityThick 10 Official SDK implementations

Dependency Architecture

The global registry enables proper dependency layering:

omnivoice-core           ← Core interfaces + global registry
provider packages        ← Implement interfaces, register via init()
(omni-deepgram,          (depend on omnivoice-core, NOT omnivoice)
 omni-twilio, etc.)
omnivoice               ← Batteries-included (imports all providers)

Key benefit: Provider packages no longer depend on omnivoice, breaking the circular dependency that previously existed.

Installation

go get github.com/plexusone/omnivoice-core@v0.11.0

Migration Guide

From v0.10.0

No breaking changes. The global registry is additive:

  1. Update dependency:
go get github.com/plexusone/omnivoice-core@v0.11.0
  1. Provider packages can now register directly with omnivoice-core instead of omnivoice:
// Before (created circular dependency)
import "github.com/plexusone/omnivoice"
omnivoice.RegisterSTTProvider("name", factory)

// After (no circular dependency)
import omnivoice "github.com/plexusone/omnivoice-core"
omnivoice.RegisterSTTProvider("name", factory, omnivoice.PriorityThick)
  1. The registry package options remain unchanged:
import "github.com/plexusone/omnivoice-core/registry"

provider, err := omnivoice.GetSTTProvider("name",
    registry.WithAPIKey(apiKey),
    registry.WithBaseURL(baseURL),
)

Full Changelog

See CHANGELOG.md for the complete list of changes.