![]() |
VOOZH | about |
dotnet add package AlexaVoxCraft.Lambda.Host --version 5.0.1.100
NuGet\Install-Package AlexaVoxCraft.Lambda.Host -Version 5.0.1.100
<PackageReference Include="AlexaVoxCraft.Lambda.Host" Version="5.0.1.100" />
<PackageVersion Include="AlexaVoxCraft.Lambda.Host" Version="5.0.1.100" />Directory.Packages.props
<PackageReference Include="AlexaVoxCraft.Lambda.Host" />Project file
paket add AlexaVoxCraft.Lambda.Host --version 5.0.1.100
#r "nuget: AlexaVoxCraft.Lambda.Host, 5.0.1.100"
#:package AlexaVoxCraft.Lambda.Host@5.0.1.100
#addin nuget:?package=AlexaVoxCraft.Lambda.Host&version=5.0.1.100Install as a Cake Addin
#tool nuget:?package=AlexaVoxCraft.Lambda.Host&version=5.0.1.100Install as a Cake Tool
AlexaVoxCraft is a modular C# .NET library for building Amazon Alexa skills using modern .NET practices. It provides comprehensive support for Alexa skill development with CQRS patterns, visual interfaces, and AWS Lambda hosting.
| Package | NuGet | Downloads |
|---|---|---|
| AlexaVoxCraft.Model | ๐ NuGet |
๐ Downloads |
| AlexaVoxCraft.Model.Apl | ๐ NuGet |
๐ Downloads |
| AlexaVoxCraft.MediatR | ๐ NuGet |
๐ Downloads |
| AlexaVoxCraft.Lambda | ๐ NuGet |
๐ Downloads |
| AlexaVoxCraft.Lambda.Host | ๐ NuGet |
๐ Downloads |
| AlexaVoxCraft.MediatR.Lambda | ๐ NuGet |
๐ Downloads |
| AlexaVoxCraft.Observability | ๐ NuGet |
๐ Downloads |
| AlexaVoxCraft.Smapi | ๐ NuGet |
๐ Downloads |
# Core MediatR integration and Lambda hosting
dotnet add package AlexaVoxCraft.MediatR.Lambda
# APL visual interface support (optional)
dotnet add package AlexaVoxCraft.Model.Apl
# OpenTelemetry observability (optional)
dotnet add package AlexaVoxCraft.Observability
# CloudWatch-compatible JSON logging (optional)
dotnet add package LayeredCraft.Logging.CompactJsonFormatter
โ ๏ธ SDK Version Required: To use source-generated dependency injection with interceptors, you must use at least version 8.0.400 of the .NET SDK. This ships with Visual Studio 2022 version 17.11 or higher.
# Check your SDK version
dotnet --version
# Should show 8.0.400 or higher
// Program.cs
using AlexaVoxCraft.MediatR.Lambda;
using AlexaVoxCraft.Model.Response;
return await LambdaHostExtensions.RunAlexaSkill<MySkillFunction, SkillRequest, SkillResponse>();
// Function.cs
public class MySkillFunction : AlexaSkillFunction<SkillRequest, SkillResponse>
{
protected override void Init(IHostBuilder builder)
{
builder
.UseHandler<LambdaHandler, SkillRequest, SkillResponse>()
.ConfigureServices((context, services) =>
{
// Handlers are automatically discovered and registered at compile time
services.AddSkillMediator(context.Configuration);
});
}
}
// Handler.cs
public class LaunchRequestHandler : IRequestHandler<LaunchRequest>
{
public bool CanHandle(IHandlerInput handlerInput) =>
handlerInput.RequestEnvelope.Request is LaunchRequest;
public async Task<SkillResponse> Handle(IHandlerInput input, CancellationToken cancellationToken)
{
return await input.ResponseBuilder
.Speak("Welcome to my skill!")
.Reprompt("What would you like to do?")
.GetResponse(cancellationToken);
}
}
๐ Complete Documentation - Comprehensive guides and examples
AlexaVoxCraft/
โโโ ๐ src/ # Core library packages
โ โโโ ๐ฆ AlexaVoxCraft.Model/ # Base Alexa skill models & serialization
โ โโโ ๐ฆ AlexaVoxCraft.Model.Apl/ # APL (Alexa Presentation Language) support
โ โโโ ๐ฆ AlexaVoxCraft.MediatR/ # MediatR integration & request handling
โ โโโ ๐ฆ AlexaVoxCraft.MediatR.Generators/ # Source generator for compile-time DI
โ โโโ ๐ฆ AlexaVoxCraft.Lambda/ # Core Lambda abstractions & serialization
โ โโโ ๐ฆ AlexaVoxCraft.Lambda.Host/ # Modern minimal API-style Lambda hosting
โ โโโ ๐ฆ AlexaVoxCraft.MediatR.Lambda/ # Legacy Lambda hosting (AlexaSkillFunction)
โ โโโ ๐ฆ AlexaVoxCraft.Observability/ # OpenTelemetry instrumentation & telemetry
โ โโโ ๐ฆ AlexaVoxCraft.Smapi/ # Skill Management API (SMAPI) client
โ
โโโ ๐ samples/ # Working example projects
โ โโโ ๐ฑ Sample.Skill.Function/ # Basic skill (legacy hosting)
โ โโโ ๐ฑ Sample.Host.Function/ # Modern minimal API hosting
โ โโโ ๐ฑ Sample.Generated.Function/ # Source-generated DI demonstration
โ โโโ ๐ฑ Sample.Apl.Function/ # APL skill with visual interfaces
โ
โโโ ๐ test/ # Comprehensive test coverage
โ โโโ ๐งช AlexaVoxCraft.Model.Tests/ # Core model & serialization tests
โ โโโ ๐งช AlexaVoxCraft.Model.Apl.Tests/ # APL functionality tests
โ โโโ ๐งช AlexaVoxCraft.MediatR.Tests/ # MediatR integration tests
โ โโโ ๐งช AlexaVoxCraft.MediatR.Lambda.Tests/ # Lambda hosting tests
โ โโโ ๐งช AlexaVoxCraft.Smapi.Tests/ # SMAPI client tests
โ
โโโ ๐ AlexaVoxCraft.TestKit/ # Testing utilities & AutoFixture support
โโโ ๐ docs/ # Documentation source
Skills use the MediatR pattern where:
IRequestHandler<T>ICanHandle for routing logicAlexaSkillFunction<TRequest, TResponse>| Package | Purpose | Key Features |
|---|---|---|
| AlexaVoxCraft.Model | Core Alexa models | Request/response types, SSML, cards, directives, System.Text.Json serialization |
| AlexaVoxCraft.Model.Apl | APL support | 40+ components, commands, audio, vector graphics, extensions (DataStore, SmartMotion) |
| AlexaVoxCraft.MediatR | Request handling | Handler routing, pipeline behaviors, attributes management, DI integration |
| AlexaVoxCraft.MediatR.Lambda | Lambda hosting | AWS Lambda functions, context management, custom serialization, hosting extensions |
| AlexaVoxCraft.Observability | OpenTelemetry integration | Opt-in telemetry, metrics, spans, semantic attributes, ADOT/CloudWatch support |
AlexaVoxCraft includes comprehensive testing support:
Implement the IExceptionHandler interface for centralized error handling:
public class GlobalExceptionHandler : IExceptionHandler
{
public Task<bool> CanHandle(IHandlerInput handlerInput, Exception ex, CancellationToken cancellationToken)
{
return Task.FromResult(true); // Handle all exceptions
}
public Task<SkillResponse> Handle(IHandlerInput handlerInput, Exception ex, CancellationToken cancellationToken)
{
return handlerInput.ResponseBuilder
.Speak("Sorry, something went wrong. Please try again.")
.GetResponse(cancellationToken);
}
}
Version 4.0.0 introduces cancellation token support for Lambda functions. This is a breaking change that requires updates to your existing lambda handlers.
1. Update Lambda Handlers
Lambda handlers must now accept and pass the cancellation token:
// โ Before (v3.x)
public class LambdaHandler : ILambdaHandler<SkillRequest, SkillResponse>
{
public async Task<SkillResponse> HandleAsync(SkillRequest input, ILambdaContext context)
{
return await _skillMediator.Send(input);
}
}
// โ
After (v4.0+)
public class LambdaHandler : ILambdaHandler<SkillRequest, SkillResponse>
{
public async Task<SkillResponse> HandleAsync(SkillRequest input, ILambdaContext context, CancellationToken cancellationToken)
{
return await _skillMediator.Send(input, cancellationToken);
}
}
2. Update AlexaSkillFunction Override
If you override FunctionHandlerAsync in your skill function class, you must update the signature:
// โ Before (v3.x)
public class MySkillFunction : AlexaSkillFunction<SkillRequest, SkillResponse>
{
public override async Task<SkillResponse> FunctionHandlerAsync(SkillRequest input, ILambdaContext context)
{
// Custom logic here
return await base.FunctionHandlerAsync(input, context);
}
}
// โ
After (v4.0+)
public class MySkillFunction : AlexaSkillFunction<SkillRequest, SkillResponse>
{
public override async Task<SkillResponse> FunctionHandlerAsync(SkillRequest input, ILambdaContext context, CancellationToken cancellationToken)
{
// Custom logic here
return await base.FunctionHandlerAsync(input, context, cancellationToken);
}
}
You can now configure the cancellation timeout buffer in your appsettings.json:
{
"SkillConfiguration": {
"SkillId": "amzn1.ask.skill.your-skill-id",
"CancellationTimeoutBufferMilliseconds": 500
}
}
The timeout buffer (default: 250ms) is subtracted from Lambda's remaining execution time to allow graceful shutdown and telemetry flushing.
Version 5.0.0 introduces a modern minimal API-style hosting model powered by the AwsLambda.Host package. This update also restructures the package architecture to better separate concerns and provide more flexibility. The legacy hosting approach remains fully supported for backward compatibility.
Version 5.0.0 introduces two new packages and refactors the existing Lambda hosting:
| Package | Purpose | Status |
|---|---|---|
| AlexaVoxCraft.Lambda | Core Lambda abstractions and serialization | New (extracted from MediatR.Lambda) |
| AlexaVoxCraft.Lambda.Host | Modern minimal API-style Lambda hosting | New (recommended for new projects) |
| AlexaVoxCraft.MediatR.Lambda | Legacy Lambda hosting with AlexaSkillFunction | Existing (still fully supported) |
Core Lambda abstractions have been moved to the new AlexaVoxCraft.Lambda package:
Classes Moved:
ILambdaHandler<TRequest, TResponse>HandlerDelegate<TRequest, TResponse>AlexaLambdaSerializerSystemTextDestructuringPolicyThe following obsolete class has been removed:
PollyVoices - This class was marked as obsolete in previous versions and has been removed. Use the AlexaSupportedVoices class instead for Amazon Polly voice name constants.
Before (v4.x):
using AlexaVoxCraft.MediatR.Lambda.Abstractions;
using AlexaVoxCraft.MediatR.Lambda.Serialization;
public class LambdaHandler : ILambdaHandler<SkillRequest, SkillResponse>
{
// Implementation
}
After (v5.0+):
using AlexaVoxCraft.Lambda.Abstractions;
using AlexaVoxCraft.Lambda.Serialization;
public class LambdaHandler : ILambdaHandler<SkillRequest, SkillResponse>
{
// Implementation
}
Version 5.0.0 provides two ways to host Alexa skills in AWS Lambda:
Use AlexaVoxCraft.Lambda.Host for a familiar minimal API-style hosting experience:
dotnet add package AlexaVoxCraft.Lambda.Host
// Program.cs
using AlexaVoxCraft.Lambda.Host;
using AlexaVoxCraft.Lambda.Host.Extensions;
using AwsLambda.Host.Builder;
var builder = LambdaApplication.CreateBuilder();
builder.Services.AddSerilog(/* ... */);
builder.Services.AddSkillMediator(builder.Configuration);
builder.Services.AddAlexaSkillHost<LambdaHandler, SkillRequest, SkillResponse>();
await using var app = builder.Build();
app.MapHandler(AlexaHandler.Invoke<SkillRequest, SkillResponse>);
await app.RunAsync();
Benefits:
AwsLambda.Host packageProject Configuration:
<PropertyGroup>
<InterceptorsNamespaces>$(InterceptorsNamespaces);AwsLambda.Host.Core.Generated</InterceptorsNamespaces>
</PropertyGroup>
Continue using AlexaVoxCraft.MediatR.Lambda with the AlexaSkillFunction pattern:
dotnet add package AlexaVoxCraft.MediatR.Lambda
// Program.cs
using AlexaVoxCraft.MediatR.Lambda;
return await LambdaHostExtensions.RunAlexaSkill<MySkillFunction, SkillRequest, SkillResponse>();
// Function.cs
public class MySkillFunction : AlexaSkillFunction<SkillRequest, SkillResponse>
{
protected override void Init(IHostBuilder builder)
{
builder
.UseHandler<LambdaHandler, SkillRequest, SkillResponse>()
.ConfigureServices((context, services) =>
{
services.AddSkillMediator(context.Configuration);
});
}
}
This approach remains fully supported and requires no migration for existing projects.
Who is affected:
AlexaVoxCraft.MediatR.Lambda.Abstractions namespaceAlexaVoxCraft.MediatR.Lambda.Serialization namespaceWho is NOT affected:
AlexaSkillFunction<TRequest, TResponse> without directly referencing moved classesIf you directly reference the moved classes, update your using statements:
// Change this:
using AlexaVoxCraft.MediatR.Lambda.Abstractions;
using AlexaVoxCraft.MediatR.Lambda.Serialization;
// To this:
using AlexaVoxCraft.Lambda.Abstractions;
using AlexaVoxCraft.Lambda.Serialization;
To adopt the new minimal API-style hosting:
Replace package reference:
dotnet remove package AlexaVoxCraft.MediatR.Lambda
dotnet add package AlexaVoxCraft.Lambda.Host
Update project file to include interceptors:
<InterceptorsNamespaces>$(InterceptorsNamespaces);AwsLambda.Host.Core.Generated</InterceptorsNamespaces>
Refactor Program.cs to use builder pattern (see example above)
Remove Function class inheriting from AlexaSkillFunction
For detailed migration guidance, see the Lambda Hosting documentation.
PRs are welcome! Please submit issues and ideas to help make this toolkit even better.
๐ฆ Credits:
- Core Alexa skill models (
AlexaVoxCraft.Model) based on timheuer/alexa-skills-dotnet- APL support (
AlexaVoxCraft.Model.Apl) based on stoiveyp/Alexa.NET.APL
This project is licensed under the .
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 is compatible. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
This package is not used by any NuGet packages.
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 5.0.1.100 | 503 | 12/10/2025 |
| 5.0.0.99 | 793 | 12/1/2025 |
| 5.0.0.98 | 715 | 12/1/2025 |
| 5.0.0-beta.97 | 682 | 12/1/2025 |
| 5.0.0-beta.96 | 659 | 12/1/2025 |
| 5.0.0-beta.95 | 572 | 12/1/2025 |
| 5.0.0-beta.94 | 567 | 12/1/2025 |
| 5.0.0-beta.93 | 565 | 12/1/2025 |
| 5.0.0-beta.92 | 344 | 11/30/2025 |
| 5.0.0-beta.91 | 86 | 11/29/2025 |