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¶
Migration Guide¶
From v0.10.0¶
No breaking changes. The global registry is additive:
- Update dependency:
- Provider packages can now register directly with
omnivoice-coreinstead ofomnivoice:
// 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)
- The
registrypackage 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.