AlexaVoxCraft.Lambda
5.0.1.100
See the version list below for details.
dotnet add package AlexaVoxCraft.Lambda --version 5.0.1.100
NuGet\Install-Package AlexaVoxCraft.Lambda -Version 5.0.1.100
<PackageReference Include="AlexaVoxCraft.Lambda" Version="5.0.1.100" />
<PackageVersion Include="AlexaVoxCraft.Lambda" Version="5.0.1.100" />
<PackageReference Include="AlexaVoxCraft.Lambda" />
paket add AlexaVoxCraft.Lambda --version 5.0.1.100
#r "nuget: AlexaVoxCraft.Lambda, 5.0.1.100"
#:package AlexaVoxCraft.Lambda@5.0.1.100
#addin nuget:?package=AlexaVoxCraft.Lambda&version=5.0.1.100
#tool nuget:?package=AlexaVoxCraft.Lambda&version=5.0.1.100
๐ฃ AlexaVoxCraft
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.
Key Features
- ๐ฏ MediatR Integration: CQRS-style request handling with compile-time source-generated DI registration
- ๐จ APL Support: Complete Alexa Presentation Language implementation for rich visual interfaces
- โก Lambda Hosting: Optimized AWS Lambda runtime with custom serialization and ReadyToRun publishing
- ๐ Session Management: Robust session attribute handling and game state persistence
- ๐ง Pipeline Behaviors: Request/response interceptors for cross-cutting concerns like logging and validation
- ๐งช Testing Support: Comprehensive testing utilities with AutoFixture integration and property-based testing
๐ฆ Packages
๐ Quick Start
Install Core Packages
# 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
Requirements
โ ๏ธ 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
Create a Basic Skill
// 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);
}
}
๐ Documentation
๐ Complete Documentation - Comprehensive guides and examples
Core Components
- Request Handling - MediatR integration and handler patterns
- Source Generation - Compile-time DI registration with C# interceptors
- APL Integration - Rich visual interface development
- Lambda Hosting - AWS Lambda deployment and optimization
- Session Management - State persistence and user data
- Pipeline Behaviors - Cross-cutting concerns and interceptors
Examples
- Complete Examples - Production-ready trivia skill implementation
๐ Project Structure
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
๐ Core Concepts
Request Handling Pattern
Skills use the MediatR pattern where:
- Requests implement
IRequestHandler<T> - Handlers optionally implement
ICanHandlefor routing logic - Pipeline behaviors handle cross-cutting concerns (logging, exceptions)
- Lambda functions derive from
AlexaSkillFunction<TRequest, TResponse>
Package Breakdown
| 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 |
๐งช Testing
AlexaVoxCraft includes comprehensive testing support:
- xUnit v3 with Microsoft.Testing.Platform
- AutoFixture integration for property-based testing
- AwesomeAssertions for fluent assertions
- TestKit with specimen builders and test utilities
โ ๏ธ Error Handling
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+ Breaking Changes
Cancellation Token Support
Version 4.0.0 introduces cancellation token support for Lambda functions. This is a breaking change that requires updates to your existing lambda handlers.
Required Changes
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);
}
}
Configuration Options
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+ Breaking Changes
Overview
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.
Package Restructuring
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) |
Namespace Changes
Core Lambda abstractions have been moved to the new AlexaVoxCraft.Lambda package:
Classes Moved:
ILambdaHandler<TRequest, TResponse>HandlerDelegate<TRequest, TResponse>AlexaLambdaSerializerSystemTextDestructuringPolicy
Removed Obsolete Classes
The 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
}
Two Hosting Approaches
Version 5.0.0 provides two ways to host Alexa skills in AWS Lambda:
๐ Modern Approach (Recommended for New Projects)
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:
- Familiar minimal API-style builder pattern (similar to ASP.NET Core)
- Uses industry-standard
AwsLambda.Hostpackage - More flexible service configuration
- Better separation of concerns
Project Configuration:
<PropertyGroup>
<InterceptorsNamespaces>$(InterceptorsNamespaces);AwsLambda.Host.Core.Generated</InterceptorsNamespaces>
</PropertyGroup>
Legacy Approach (Existing Projects)
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.
Migration Impact
Who is affected:
- Projects directly referencing
AlexaVoxCraft.MediatR.Lambda.Abstractionsnamespace - Projects directly referencing
AlexaVoxCraft.MediatR.Lambda.Serializationnamespace - Projects wanting to adopt the modern hosting approach
Who is NOT affected:
- Projects using
AlexaSkillFunction<TRequest, TResponse>without directly referencing moved classes - Projects that don't import the moved namespaces
Required Actions for Migration
1. Update Namespace Imports
If 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;
2. (Optional) Migrate to Modern Hosting
To adopt the new minimal API-style hosting:
Replace package reference:
dotnet remove package AlexaVoxCraft.MediatR.Lambda dotnet add package AlexaVoxCraft.Lambda.HostUpdate 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.
๐ค Contributing
PRs are welcome! Please submit issues and ideas to help make this toolkit even better.
๐ Credits & Attribution
๐ฆ Credits:
- Core Alexa skill models (
AlexaVoxCraft.Model) based on timheuer/alexa-skills-dotnet- APL support (
AlexaVoxCraft.Model.Apl) based on stoiveyp/Alexa.NET.APL
๐ License
This project is licensed under the MIT License.
Stargazers over time
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- AlexaVoxCraft.Model (>= 5.0.1.100)
- Amazon.Lambda.Core (>= 2.8.0)
- LayeredCraft.StructuredLogging (>= 1.1.5.15)
- Serilog (>= 4.3.0)
-
net8.0
- AlexaVoxCraft.Model (>= 5.0.1.100)
- Amazon.Lambda.Core (>= 2.8.0)
- LayeredCraft.StructuredLogging (>= 1.1.5.15)
- Serilog (>= 4.3.0)
-
net9.0
- AlexaVoxCraft.Model (>= 5.0.1.100)
- Amazon.Lambda.Core (>= 2.8.0)
- LayeredCraft.StructuredLogging (>= 1.1.5.15)
- Serilog (>= 4.3.0)
NuGet packages (3)
Showing the top 3 NuGet packages that depend on AlexaVoxCraft.Lambda:
| Package | Downloads |
|---|---|
|
AlexaVoxCraft.MediatR.Lambda
Lambda hosting and middleware integration for Alexa skills using MediatR and AlexaVoxCraft. |
|
|
AlexaVoxCraft.Lambda.Host
Lambda hosting and middleware integration for Alexa skills using MediatR and AlexaVoxCraft. |
|
|
AlexaVoxCraft.MinimalLambda
Minimal API-style Lambda hosting for AlexaVoxCraft skills powered by MinimalLambda. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 5.1.0-beta.101 | 57 | 12/12/2025 |
| 5.0.1.100 | 374 | 12/10/2025 |
| 5.0.0.99 | 755 | 12/1/2025 |
| 5.0.0.98 | 682 | 12/1/2025 |
| 5.0.0-beta.97 | 628 | 12/1/2025 |
| 5.0.0-beta.96 | 611 | 12/1/2025 |
| 5.0.0-beta.95 | 514 | 12/1/2025 |
| 5.0.0-beta.94 | 508 | 12/1/2025 |
| 5.0.0-beta.93 | 509 | 12/1/2025 |
| 5.0.0-beta.92 | 292 | 11/30/2025 |
| 5.0.0-beta.91 | 40 | 11/29/2025 |