The modern .NET SDK for Asterisk PBX. AMI, AGI, ARI, Live API, Sessions, Voice AI — all in one package. Native AOT. Zero reflection. MIT licensed.
Rebrand notice (2026-05-03): this project is rebranding to Verbara (ADR-0036) to avoid trademark conflict with Sangoma's Asterisk PBX product. Repository and NuGet package names will migrate to
verbara-sdk/Verbara.Sdk.*in a coordinated technical track. Existing names continue to work during the transition period.
The .NET Asterisk ecosystem is stalled. AsterNET targets .NET Framework 4.0 and has been abandoned since 2018. AsterNET.NetStandard is a minimal fork stuck at .NET Standard 2.0. Sufficit covers AMI and AGI on .NET 9 but offers no ARI, no Live objects, no Session Engine, and no Voice AI. None of them support Native AOT.
Verbara Sdk is the complete, modern alternative. One NuGet meta-package gives you AMI + AGI + ARI + Live API + Sessions with full DI integration. Add Voice AI packages to build AI-powered telephony — turn-based STT/TTS pipelines or a direct OpenAI Realtime bridge. Everything is AOT-safe, zero-reflection, and backed by four source generators that replace runtime code generation entirely.
The SDK is ported from asterisk-java 3.42.0 — the most mature Asterisk library in any language, with 790+ classes covering every protocol detail. Verbara Sdk takes that foundation and redesigns it from the ground up for .NET 10 performance patterns: System.IO.Pipelines for zero-copy TCP parsing, System.Threading.Channels for async event dispatch, System.Reactive for observable state machines, and System.Text.Json source generation for ARI serialization.
| Capability | Verbara.Sdk | AsterNET | Sufficit | asterisk-java |
|---|---|---|---|---|
| AMI | Yes | Yes | Yes | Yes |
| AGI | Yes | Yes | Yes | Yes |
| ARI | Yes | Separate pkg | No | No |
| Live Objects | Yes | No | No | Basic |
| Session Engine | Yes | No | No | No |
| Voice AI | Yes | No | No | No |
| Native AOT | Yes | No | No | N/A |
| .NET 10 | Yes | .NET Fx 4.0 | .NET 9 | Java 8+ |
| Active | Yes | No (2018) | Yes | Yes |
- AMI Client — Connect to the Asterisk Manager Interface over TCP with MD5 challenge-response authentication, 148 actions, 278 events, and 18 typed responses. Auto-reconnect with configurable exponential backoff. Configurable heartbeat/keepalive with auto-disconnect on timeout.
- FastAGI Server — Async TCP server for the Asterisk Gateway Interface with 54 AGI commands, pluggable script mapping strategies, and zero-copy I/O via
System.IO.Pipelines. Per-connection timeout, status 511 hangup detection, andAgiMetricsinstrumentation. - ARI Client — REST + WebSocket client for the Asterisk REST Interface. Manage channels, bridges, playbacks, recordings, endpoints, applications, and sounds. Domain exceptions (
AriNotFoundException,AriConflictException) for HTTP error mapping. WebSocket reconnect with exponential backoff. - Live API — Real-time in-memory tracking of channels, queues, agents, and conference rooms from AMI events. Secondary indices for O(1) lookups by name. Observable gauges and event counters via
System.Diagnostics.Metrics. - Activities — High-level telephony operations (Dial, Hold, Transfer, Park, Bridge, Conference) modeled as async state machines with
IObservable<ActivityStatus>tracking. Real cancellation support, re-entrance guards, and channel variable capture (DIALSTATUS,QUEUESTATUS). - Session Engine — Correlate AMI events into unified call sessions using LinkedId grouping. State-machine lifecycle (Ringing, Answered, OnHold, Transferred, Completed), domain events (
SessionStarted,SessionEnded,SessionStateChanged), automatic orphan detection viaSessionReconciler, and pluggable extension points (ISessionEnricher,ISessionPolicy,ISessionEventHandler). - Voice AI — Full stack for AI-powered telephony: PCM audio processing (resampler, VAD, gain), AudioSocket and
chan_websockettransports with the Asterisk 22/23 JSON control protocol, STT/TTS abstraction layer with pluggable providers (Deepgram, Google, Whisper, Azure Whisper, Cartesia, AssemblyAI, Speechmatics for STT; ElevenLabs Flash 2.5, Deepgram Aura 2, LMNT, Azure, Cartesia, Speechmatics for TTS),tts.synthesis.ttfa_msTime-To-First-Audio metric for latency observability, barge-in pipeline with turn-taking, and a direct OpenAI Realtime API bridge. - Config Parser — Read and parse Asterisk
.conffiles andextensions.confdialplans. Quote-aware comment stripping. - Hosting —
IHostedServicefor AMI and Live API lifecycle.IHealthCheckfor AMI connection state. AOT-safeIConfigurationbinding. - Native AOT — Zero reflection at runtime. Four source generators replace runtime code generation. 0 trim warnings.
- Multi-Server — Federate multiple Asterisk servers with
VerbaraServerPooland agent routing.
v1.15.3 — 26 NuGet packages, 0 build warnings, 0 trim warnings, ~2,837 unit tests + 154 functional + 65 integration (Testcontainers). Latest releases:
- v1.15.3 "R1.5 VoiceAi Refresh" (2026-05-03) — Three new TTS providers (ElevenLabs Flash 2.5 polish + Deepgram Aura 2 via WebSocket + LMNT TTS with WS+HTTP transport) plus
tts.synthesis.ttfa_mshistogram for Time-To-First-Audio observability across all six TTS providers. Strictly additive minor patch — zero breaking changes. Also rolls incoverlet.collector6→10 dev-dep bump, newdependency-reviewCI workflow, and thexunit v3/v4migration readiness watch list. Whisper V3 local STT was scoped into the original v1 R1.5 spec but deferred (telephony 8 kHz quality concerns + Whisper.net AOT unconfirmed). - v1.15.2 (2026-04-27) — Documentation refresh. Doc-only patch (zero
PublicAPI.Shipped.txtdelta, zero functional changes). Root README + 5 critical-stub package READMEs expanded;nuget.configCI portability fix. - v1.15.1 (2026-04-26) — Housekeeping patch. Dependency maintenance (NATS 2.7.3, OpenTelemetry 1.15.3, Microsoft.Extensions 10.0.7) plus test stability + ADR catalog cleanup. Zero
PublicAPI.Shipped.txtdelta, zero functional change. Forward-compat verified end-to-end for the NATS minor bump. - v1.15.0 "Pre-v2 Foundation" (2026-04-20) — New MIT package
Verbara.Sdk.Cluster.Primitives(IClusterTransport,IDistributedLock,IMembershipProvider+ in-memory references).VerbaraSemanticConventionscatalog grows withTenant/Event/Nodenested classes (60 const strings across 14 nested classes total). Per-URL circuit breaker onVerbara.Sdk.Push.Webhooks. ADR-0028 "Cadence commitment" → Accepted. Operations starter kit (3 Grafana dashboards + Jaeger query catalog) underdocs/operations/. AOT validation expanded to multi-RID matrix (linux-x64 / win-x64 / osx-arm64). Dual Asterisk 22 LTS + 23 Standard test matrix. - v1.14.0 (2026-04-20) — New MIT package
Verbara.Sdk.Resilience— composable circuit breaker + retry + timeout primitives shared by AMI/ARI/Webhook reconnect loops. - v1.13.0 (2026-04-20) — Telemetry layer + multi-node Push bus.
Verbara.Sdk.Push.Natsbidirectional bridge with W3C trace context propagation.WebSocketTestServershared infrastructure. Pack-warnings CI gate.
API coverage (cumulative): 148/152 AMI actions (97%), 94/98 ARI endpoints (96%), 46/46 ARI event types (100%), 27/27 ARI models (100%), 278 AMI events covering Asterisk 18-23. Asterisk 22.5+ outbound WebSocket and Asterisk 22.8/23.2+ chan_websocket JSON control protocol both supported. Compatible with Asterisk 18, 20, 22 LTS, and 23 Standard — see docs/guides/asterisk-version-matrix.md for lifecycle and break-change risk areas.
Architecture decisions: 35 ADRs in docs/decisions/ covering AOT-first design, source-generator-over-reflection policy, three-tier test strategy, push-bus design, cadence commitment, and resilience/cluster primitive split between MIT and Pro.
| Topic | Link |
|---|---|
| Getting started for operators | docs/README-technical.md |
| Commercial overview / positioning | docs/README-commercial.md |
| High-load tuning (10K / 100K agents) | docs/guides/high-load-tuning.md |
| Session store backends (InMemory / Redis / Postgres) | docs/guides/session-store-backends.md |
| Troubleshooting (connection, auth, events, tracing) | docs/guides/troubleshooting.md |
| Asterisk 18/20/22/23 version compatibility | docs/guides/asterisk-version-compatibility.md |
| Asterisk Realtime (ODBC) setup | docs/guides/manual-asterisk-realtime-setup.md |
| Benchmarks (AMD Ryzen 9 9900X, .NET 10) | docs/research/benchmark-analysis.md |
| Release notes | CHANGELOG.md |
| Contributing (dev setup, conventions, hooks) | CONTRIBUTING.md |
| Security policy | SECURITY.md |
Benchmarked on AMD Ryzen 9 9900X (12C/24T), .NET 10.0.5, BenchmarkDotNet v0.14.0 (v1.11.0 full re-run, 2026-04-18):
| Operation | Throughput / Latency |
|---|---|
| AMI event parse + dispatch | 1.53M events/sec (653 ns) |
ARI JSON deserialize Channel |
3.54M ops/sec (283 ns) |
ARI parse StasisStart event |
595K events/sec (1.68 µs) — 2.7× faster than v1.0 |
ChannelManager.GetById (secondary index) |
163.9M lookups/sec (6.1 ns) |
| Observer dispatch (copy-on-write array) | ~0.21 ns / observer (zero-alloc) |
Session store Redis SaveAsync |
~12.6K saves/sec (p50 79 µs) / batch 65,738 sess/sec |
Session store Postgres SaveAsync |
~500 saves/sec (p50 1.97 ms) / batch 9,491 sess/sec |
Full methodology, machine-readable results, and cross-language comparison (asterisk-java, asterisk-ami-client, pyst2) in docs/research/benchmark-analysis.md. Raw BenchmarkDotNet reports are under BenchmarkDotNet.Artifacts/results/. Reproduce: dotnet run -c Release --project Tests/Verbara.Sdk.Benchmarks/.
Every package ships a Meter, ActivitySource, and IHealthCheck. Registered names are exposed as runtime-discoverable lists so consumers don't hard-code strings:
using Verbara.Sdk.Hosting;
using OpenTelemetry;
using OpenTelemetry.Metrics;
using OpenTelemetry.Trace;
builder.Services
.AddOpenTelemetry()
.WithTracing(t => t.AddSource([.. VerbaraTelemetry.ActivitySourceNames])
.AddOtlpExporter())
.WithMetrics(m => m.AddMeter([.. VerbaraTelemetry.MeterNames])
.AddOtlpExporter());- 9
ActivitySources — AMI, ARI, AGI, Live, Sessions, Push, VoiceAi, VoiceAi.AudioSocket, VoiceAi.OpenAiRealtime - 15
Meters — all of the above plus Ari.Audio, VoiceAi.Stt, VoiceAi.Tts, Push.Webhooks, Push.Nats, Resilience - 11
IHealthChecks auto-registered — 6 core + 5 VoiceAi VerbaraSemanticConventions— public static catalog of 60 const strings across 14 nested classes (Resource, Channel, Bridge, Calls, Dialplan, Sip, Media, Queues, Agent, VoiceAi, Events, Tenant, Event, Node) — pinned by 14+ unit tests so dashboard queries stay stable across SDK versions
See the high-load tuning guide for metric definitions and sizing recommendations at 10K / 100K agent scale.
# Core SDK + protocol clients + hosting
dotnet add package Verbara.Sdk.Hosting
# Voice AI — turn-based pipeline (STT + TTS)
dotnet add package Verbara.Sdk.VoiceAi.AudioSocket
dotnet add package Verbara.Sdk.VoiceAi
dotnet add package Verbara.Sdk.VoiceAi.Stt # STT providers
dotnet add package Verbara.Sdk.VoiceAi.Tts # TTS providers
# Voice AI — OpenAI Realtime (GPT-4o direct bridge)
dotnet add package Verbara.Sdk.VoiceAi.OpenAiRealtimeThe Verbara.Sdk.Hosting meta-package includes all core sub-packages and DI extensions. Install VoiceAi packages individually as needed.
First contact in 10 lines. Create a new console app, install Verbara.Sdk.Hosting, and drop the snippet below into Program.cs — on start it connects to your Asterisk over AMI, exposes a /health endpoint, and auto-disconnects on shutdown.
using Verbara.Sdk.Hosting;
using Microsoft.Extensions.Hosting;
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddVerbara(options =>
{
options.Ami.Hostname = "192.168.1.100";
options.Ami.Username = "admin";
options.Ami.Password = "secret";
});
var host = builder.Build();
await host.RunAsync();
// AMI connects on start, disconnects on shutdown via IHostedService.
// Health check available at /health for K8s probes.Need a full runnable example (including appsettings.json config and event subscriptions)? Jump to Examples/BasicAmiExample/ — it's the fastest path to a "working demo on your machine" with Docker-backed Asterisk 23.
Or bind from appsettings.json:
builder.Services.AddVerbara(builder.Configuration);{
"Asterisk": {
"Ami": { "Hostname": "pbx.example.com", "Username": "admin", "Password": "secret" }
}
}using Verbara.Sdk;
using Verbara.Sdk.Ami.Actions;
using Verbara.Sdk.Hosting;
using Microsoft.Extensions.DependencyInjection;
var services = new ServiceCollection();
services.AddLogging();
services.AddVerbara(options =>
{
options.Ami.Hostname = "192.168.1.100";
options.Ami.Username = "admin";
options.Ami.Password = "secret";
});
await using var provider = services.BuildServiceProvider();
var ami = provider.GetRequiredService<IAmiConnection>();
await ami.ConnectAsync();
Console.WriteLine($"Connected to Asterisk {ami.AsteriskVersion}");
var response = await ami.SendActionAsync(new PingAction());
Console.WriteLine($"Ping response: {response.Response}");
ami.OnEvent += async evt =>
{
Console.WriteLine($"Event: {evt.EventType}");
await ValueTask.CompletedTask;
};
await ami.DisconnectAsync();using Verbara.Sdk.Agi.Mapping;
using Verbara.Sdk.Hosting;
using Microsoft.Extensions.DependencyInjection;
var mapping = new SimpleMappingStrategy();
mapping.Add("hello-world", new HelloWorldScript());
var services = new ServiceCollection();
services.AddLogging();
services.AddVerbara(options =>
{
options.Ami.Username = "admin";
options.Ami.Password = "secret";
options.AgiPort = 4573;
options.AgiMappingStrategy = mapping;
});
await using var provider = services.BuildServiceProvider();
var agi = provider.GetRequiredService<IAgiServer>();
await agi.StartAsync();
Console.WriteLine($"FastAGI server listening on port {agi.Port}");
await Task.Delay(Timeout.Infinite);
// In your Asterisk dialplan:
// same => n,AGI(agi://your-server:4573/hello-world)
class HelloWorldScript : IAgiScript
{
public async ValueTask ExecuteAsync(
IAgiChannel channel, IAgiRequest request, CancellationToken ct)
{
await channel.AnswerAsync(ct);
await channel.StreamFileAsync("hello-world", cancellationToken: ct);
await channel.HangupAsync(ct);
}
}using Verbara.Sdk;
using Verbara.Sdk.Hosting;
using Verbara.Sdk.Live.Server;
using Microsoft.Extensions.DependencyInjection;
var services = new ServiceCollection();
services.AddLogging();
services.AddVerbara(options =>
{
options.Ami.Hostname = "192.168.1.100";
options.Ami.Username = "admin";
options.Ami.Password = "secret";
});
await using var provider = services.BuildServiceProvider();
var ami = provider.GetRequiredService<IAmiConnection>();
var server = provider.GetRequiredService<VerbaraServer>();
await ami.ConnectAsync();
await server.StartAsync();
Console.WriteLine($"Active channels: {server.Channels.ChannelCount}");
Console.WriteLine($"Configured queues: {server.Queues.QueueCount}");
server.Channels.ChannelAdded += ch =>
Console.WriteLine($"+ Channel: {ch.Name}");
await ami.DisconnectAsync();Connect Asterisk AudioSocket to a conversation handler powered by Deepgram STT + ElevenLabs TTS:
using Verbara.Sdk.VoiceAi;
using Verbara.Sdk.VoiceAi.AudioSocket.DependencyInjection;
using Verbara.Sdk.VoiceAi.DependencyInjection;
using Verbara.Sdk.VoiceAi.Stt.DependencyInjection;
using Verbara.Sdk.VoiceAi.Tts.DependencyInjection;
using Microsoft.Extensions.Hosting;
var host = Host.CreateDefaultBuilder(args)
.ConfigureServices((ctx, services) =>
{
services.AddAudioSocketServer(o => o.Port = 9091);
services.AddDeepgramSpeechRecognizer(o =>
o.ApiKey = ctx.Configuration["Deepgram:ApiKey"]!);
services.AddElevenLabsSpeechSynthesizer(o =>
o.ApiKey = ctx.Configuration["ElevenLabs:ApiKey"]!);
services.AddVoiceAiPipeline<MyConversationHandler>();
})
.Build();
await host.RunAsync();
// Asterisk dialplan:
// same => n,AudioSocket(your-server:9091)
class MyConversationHandler : IConversationHandler
{
public ValueTask<string> HandleAsync(
string userInput, ConversationContext ctx, CancellationToken ct)
=> ValueTask.FromResult($"You said: {userInput}");
}Replace the entire STT+LLM+TTS chain with a single WebSocket to OpenAI Realtime API:
using Verbara.Sdk.VoiceAi.OpenAiRealtime;
using Verbara.Sdk.VoiceAi.OpenAiRealtime.DependencyInjection;
using Verbara.Sdk.VoiceAi.AudioSocket.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Reactive.Linq;
var host = Host.CreateDefaultBuilder(args)
.ConfigureServices((ctx, services) =>
{
services.AddAudioSocketServer(o => o.Port = 9092);
services.AddOpenAiRealtimeBridge(o =>
{
o.ApiKey = ctx.Configuration["OpenAI:ApiKey"]!;
o.Model = "gpt-4o-realtime-preview";
o.Voice = "alloy";
o.Instructions = "You are a helpful contact center assistant.";
})
.AddFunction<GetWeatherFunction>();
})
.Build();
// Subscribe to events
var bridge = host.Services.GetRequiredService<OpenAiRealtimeBridge>();
bridge.Events
.OfType<RealtimeTranscriptEvent>()
.Where(e => e.IsFinal)
.Subscribe(e => Console.WriteLine($"[{e.ChannelId:D}] User: {e.Transcript}"));
bridge.Events
.OfType<RealtimeFunctionCalledEvent>()
.Subscribe(e => Console.WriteLine($"[{e.ChannelId:D}] Tool '{e.FunctionName}' → {e.ResultJson}"));
Console.WriteLine("Bridge ready on AudioSocket port 9092. Dial your Asterisk extension.");
await host.RunAsync();
// Implement a function tool
class GetWeatherFunction : IRealtimeFunctionHandler
{
public string Name => "get_weather";
public string Description => "Returns current weather for a city.";
public string ParametersSchema =>
"""{"type":"object","properties":{"city":{"type":"string"}},"required":["city"]}""";
public ValueTask<string> ExecuteAsync(string argumentsJson, CancellationToken ct = default)
=> ValueTask.FromResult("""{"temperature":"22°C","condition":"sunny"}""");
}| Package | Description |
|---|---|
| Verbara.Sdk | Core abstractions: interfaces, base classes, enums, attributes |
| Verbara.Sdk.Ami | AMI client with System.IO.Pipelines transport, source-generated serialization |
| Verbara.Sdk.Agi | FastAGI server with pluggable script mapping strategies |
| Verbara.Sdk.Ari | ARI REST + WebSocket client with source-generated JSON serialization |
| Verbara.Sdk.Live | Real-time channel, queue, agent, and conference tracking from AMI events |
| Verbara.Sdk.Activities | High-level telephony activities: Dial, Hold, Transfer, Park, Bridge, Conference |
| Verbara.Sdk.Sessions | Session Engine: call session correlation, state machines, and domain events |
| Verbara.Sdk.Config | Asterisk .conf and extensions.conf file parsers |
| Verbara.Sdk.Hosting | DI extensions (AddAsterisk) and meta-package referencing all core packages |
| Package | Description |
|---|---|
| Verbara.Sdk.Sessions.Redis | RedisSessionStore + UseRedis(...) fluent builder (StackExchange.Redis, pipelined I/O, TTL-driven retention, AOT-safe) |
| Verbara.Sdk.Sessions.Postgres | PostgresSessionStore + UsePostgres(...) fluent builder (Npgsql + Dapper + JSONB, UPSERT on ON CONFLICT, migration SQL shipped in the nupkg) |
| Package | Description |
|---|---|
| Verbara.Sdk.OpenTelemetry | Batteries-included OpenTelemetry wiring: one call enrolls every ActivitySource + Meter, ships Console/OTLP/Prometheus exporter helpers |
| Verbara.Sdk.Push | Real-time push primitives: topic hierarchy, subscription management, authorization, in-memory event fan-out |
| Verbara.Sdk.Push.AspNetCore | SSE streaming endpoint for the Push bus (ASP.NET Core) |
| Verbara.Sdk.Push.Webhooks | Outbound HTTP webhooks: HMAC-SHA256 signing, exponential retry/backoff, topic-pattern matching |
| Verbara.Sdk.Push.Nats | NATS bridge for RxPushEventBus: mirrors topic hierarchy to subject tree for multi-node deployments |
| Package | Description |
|---|---|
| Verbara.Sdk.Audio | Polyphase FIR resampler, VAD, PCM16 processing — zero dependencies |
| Verbara.Sdk.VoiceAi | Pipeline orchestration (VoiceAiPipeline), ISessionHandler, IConversationHandler |
| Verbara.Sdk.VoiceAi.AudioSocket | AudioSocket + chan_websocket (JSON control protocol) servers with System.IO.Pipelines bidirectional streaming |
| Verbara.Sdk.VoiceAi.Stt | STT providers: Deepgram, Whisper, Azure Whisper, Google Speech, Cartesia (Ink-Whisper), AssemblyAI (Universal), Speechmatics |
| Verbara.Sdk.VoiceAi.Tts | TTS providers: ElevenLabs, Azure, Cartesia (Sonic-3, 40-90ms TTFA), Speechmatics |
| Verbara.Sdk.VoiceAi.OpenAiRealtime | OpenAI Realtime API bridge (GPT-4o): dual-loop WebSocket, function calling, observability events |
| Verbara.Sdk.VoiceAi.Testing | Fake STT/TTS/handler implementations for unit testing pipelines |
The Examples/ directory contains standalone console applications demonstrating each SDK layer:
| Example | Description |
|---|---|
BasicAmiExample |
Connect to AMI, send actions, subscribe to events |
AmiAdvancedExample |
Advanced AMI patterns: originate, redirect, queue management |
FastAgiServerExample |
FastAGI server with script handlers |
AgiIvrExample |
Interactive Voice Response (IVR) menu via AGI |
AriStasisExample |
ARI WebSocket connection and Stasis event handling |
AriChannelControlExample |
ARI channel origination and bridge management |
AriOutboundExample |
ARI outbound WebSocket listener (Asterisk connects to your app) |
LiveApiExample |
Real-time channel and queue tracking via Live API |
MultiServerExample |
Federated multi-server management with agent routing |
PbxActivitiesExample |
High-level telephony activities (Dial, Hold, Transfer) |
SessionExample |
Session Engine: call session correlation and domain events |
SessionExtensionsExample |
Session Engine extension points: enrichers, policies, event handlers |
SessionsRedisExample |
Redis-backed distributed session store |
SessionsPostgresExample |
PostgreSQL-backed persistent session store |
ContactCenterSupervisionExample |
Contact center supervision: ChanSpy, Barge, Snoop |
NatsBridgeExample |
Push.Nats bridge for cross-service event distribution |
WebhookSubscriberExample |
Webhook subscriber with HMAC-signed delivery |
VoiceAiExample |
Turn-based Voice AI pipeline: Deepgram STT + ElevenLabs TTS + echo handler |
VoiceAiAssemblyAiExample |
Voice AI with AssemblyAI STT provider |
VoiceAiCartesiaExample |
Voice AI with Cartesia Sonic TTS provider |
VoiceAiSpeechmaticsExample |
Voice AI with Speechmatics STT provider |
VoiceAiCustomProviderExample |
Custom VoiceAi provider implementation pattern |
OpenAiRealtimeExample |
GPT-4o direct bridge via OpenAI Realtime API with function calling |
WebSocketMediaExample |
chan_websocket audio + JSON control protocol |
TelemetryExample |
OpenTelemetry discovery: ActivitySources, Meters, HealthChecks |
PbxAdmin |
(Moved to own repo) |
Need skill-based routing, predictive dialer, real-time analytics, or AI agent assist?
Verbara.Sdk.Pro extends this SDK with enterprise contact center capabilities — same architecture, same AOT guarantees, composable NuGet packages for clustering, outbound campaigns, event sourcing, and more.
- For decision-makers — docs/README-commercial.md
- For developers — docs/README-technical.md
- Pro (enterprise) — Verbara.Sdk.Pro
- .NET 10.0 or later
- Asterisk 18+ (tested with Asterisk 18, 20, 22, and 23)
This project is licensed under the MIT License. See NOTICE for attributions.
This is the open-source base SDK of the Verbara open-core contact-center stack:
| Repository | License | Role |
|---|---|---|
| Verbara Sdk (this repository) | MIT | Telephony primitives (AMI / AGI / ARI / Live API / Sessions / Voice AI) — community attractor |
| Verbara Web | Apache 2.0 | Frontend UI (admin / agent / analytics / operations) |
| Verbara Platform | Apache 2.0 | Backend application — full contact-center engine |
| Verbara Sdk Pro | Commercial | Enterprise overlays (multi-tenant, analytics, cluster, licensing) |
Why MIT here: the SDK is the community attractor of the Verbara stack — maximum permissive license to encourage adoption, evaluation, and contributions. Pro features (skill routing, predictive dialer, real-time analytics, cluster, multi-tenant) are commercial via a separate package family. See ADR-0027 (stewardship pledge) and ADR-0036 (rebrand to Verbara).
Trademark note: "Asterisk" is a registered trademark of Sangoma Technologies / Digium and refers to the Asterisk PBX product. This SDK targets Asterisk PBX as a runtime dependency; the SDK itself is rebranding to Verbara to avoid trademark conflict. References to "Asterisk" in API names, documentation, and code comments refer to the PBX product (Sangoma trademark) and remain accurate.