Changelog
All notable changes to NSmithy are documented in this file.
The format is based on Keep a Changelog, and NSmithy aims to follow Semantic Versioning.
Preview. NSmithy is in preview — expect some API changes before 1.0. See Protocol Status for supported surfaces, maturity, and official conformance coverage.
Unreleased
Section titled “Unreleased”Changes since the last release
0.14.0
Section titled “0.14.0”GitHub release · Changes since 0.13.0
This release generates endpoint resolvers from Smithy endpoint rules and waiters from
@waitable, moves server routing into the runtime, and lets integrations in separate
packages add protocols, service generators, and shapes. NSmithy’s own AWS support is now
such an integration, smithy-csharp-aws-codegen. When upgrading, implement
StreamsRequestBody on custom server protocols, replace IServiceOperation and
ServiceOperation.Create with IServerOperation and ServerOperation.Create, read
SmithyEndpoint.Headers as lists and AuthSchemes as records in custom endpoint resolvers,
expect an unmodeled SmithyClientException for error codes an operation does not model, and
add smithy-csharp-aws-codegen to builds that run the Smithy CLI directly for AWS services.
- Generated waiters for
@waitableoperations: aWaitUntil{Waiter}Asyncmethod per waiter on the client, its interface, and the fake client. Acceptor paths compile to C# at build time. SmithyClientException.ErrorCode, the error code the protocol read from an error response that matched no modeled error, through the newIClientOperationProtocol.ReadErrorCode.IServiceProtocol.GetServerRouting, through which a protocol reports how requests reach a service’s operations: a route per operation, or one route on which the protocol names the operation from the request.MapSmithyServicemaps any service from its operation catalog and the protocols to serve it over.CSharpIntegration.serviceGenerator, which lets an integration in a separate package generate the service surface for a protocol it supplies.CSharpIntegration.protocols(), which lets an integration add a request/response protocol: a service carrying the protocol’s trait gets a client and server that use its runtime type, as for a built-in protocol.- The
defaultProtocolcode generation setting selects the generated client’s default protocol for a service with several. - Generated endpoint resolvers for services with
@endpointRuleSetor@endpointBdd. Clients use them by default, and each rule parameter a client supplies becomes a{Service}ClientConfigproperty, such asRegion. NSmithy.Awsimplements theaws.partition,aws.parseArn, andaws.isVirtualHostableS3Bucketrule functions and theAWS::*built-ins.AwsSigV4AuthScheme(credentialsProvider), which takes the signing name and region from the resolved endpoint.CSharpIntegrationhooks for endpoint rule functions, built-ins, and auth scheme properties.- Generated S3 clients omit the modeled
/{Bucket}path segment, since S3’s endpoint rules place the bucket in the host or endpoint path. SmithyEndpointParameters.Operationgives custom endpoint resolvers the operation’s schema.- Every generated client can be constructed from its configuration alone, for
example with only an
EndpointResolver. ClientConfigDefaultsSection, a code section integrations can append to through Smithy’sinterceptorshook to set a generated client configuration’s defaults.- The
closurecode generation setting generates the types of ashapeClosuresmetadata entry, with or without a service, andCSharpIntegration.additionalShapeslets an integration add shapes that a service’s operations do not reach, such as published events. - An
Add{Service}Clientoverload whose configuration callback receives theIServiceProvider, to resolve dependencies such as endpoint resolvers.
Changed
Section titled “Changed”- BREAKING: An error response whose error code names none of the operation’s modeled
errors is now an unmodeled
SmithyClientException, instead of the modeled error its HTTP status matched. - BREAKING: AWS support moved out of
smithy-csharp-codegeninto thesmithy-csharp-aws-codegenintegration: the AWS JSON, AWS Query, EC2 Query, and restXml protocols, the AWS endpoint rule functions and built-ins, and the Glacier client customization.NSmithy.MSBuildadds it to every build. Builds that run the Smithy CLI directly addio.github.thomaslaich.nsmithy:smithy-csharp-aws-codegentomaven.dependenciesfor AWS services. AwsQueryProtocoltakes an error’s status code from its@awsQueryErrortrait at runtime. The status code in generated error schemas no longer comes from that trait.- Generated servers route at runtime.
Map{Service}keeps its signature and maps the protocols’ routes, and the generated code holds an operation table instead of an endpoint per operation and protocol. Endpoints are plain request delegates, with no minimal-API parameter binding. - Mapped services use a default
SmithyServerRuntimewhen the application registers none, so registering operation handlers individually no longer requiresAddSmithyServer(). - Generated servers have one operation table, the
ServiceOperationCatalogof their{Service}Definition, which HTTP routing and MCP both use. MCP tool calls now resolve their handler from the call’s services, so scoped handlers work with MCP, and run throughSmithyServerRuntimelike HTTP requests. - BREAKING:
IServerOperationreplacesIServiceOperation, andServerOperation.CreatereplacesServiceOperation.Create: it takes a function that resolves the handler from a request’s services.IServiceDefinition.OperationsreplacesCreateOperationCatalog, andMapSmithyServicetakes the catalog. - An event-stream input or output with sibling members on a gRPC service is now a model
validation error (
GrpcEventStream) instead of a code generation failure. - BREAKING:
IServerOperationProtocolhas a requiredStreamsRequestBodymember. Custom server protocols must say whether the request body streams. - BREAKING:
SmithyEndpoint.Headersvalues are lists, andSmithyEndpoint.AuthSchemesholdsSmithyEndpointAuthSchemerecords with scheme properties instead of scheme ids.SmithyEndpointalso carries the endpoint’s otherProperties.
- SigV4 double-encodes and normalizes the canonical path for services other than S3, as the specification requires. It previously signed every path the S3 way, which differs for paths with reserved characters, such as a Lambda function ARN.
0.13.0
Section titled “0.13.0”GitHub release · Changes since 0.12.0
This release adds the rpcv2Json protocol and reshapes parts of the generated API.
Lists and maps are now plain IReadOnlyList<T> and IReadOnlyDictionary<string, T>,
schema classes move to a Schemas namespace, and colliding generated names get a
suffix. Every service in the AWS model catalog now generates code that compiles.
When upgrading, replace .Values on list and map wrappers with the collection itself,
update references to schema classes, and add the protocol package your server uses
(NSmithy.Protocols.RestJson or NSmithy.Protocols.Grpc) next to
NSmithy.Server.AspNetCore.
Changed
Section titled “Changed”- BREAKING: the ASP.NET Core host is protocol-agnostic.
NSmithy.Server.AspNetCoreno longer depends onNSmithy.Codecs.Json,NSmithy.Protocols.RestJson, orNSmithy.Protocols.Grpc. Existing REST/JSON servers must addNSmithy.Protocols.RestJson; gRPC servers must addNSmithy.Protocols.Grpc, using the same NSmithy version as the host. Servers generating multiple protocols need each corresponding protocol package.NSmithy.Protocols.RpcV2Cborremains required for CBOR servers. The server template and examples now reference their protocol packages explicitly, so servers no longer acquire unrelated protocols and codecs through the host. - BREAKING: lists and maps are generated as read-only collections. Named list
and map shapes no longer generate wrapper records with a
Valuesproperty; members are typedIReadOnlyList<T>andIReadOnlyDictionary<string, T>directly. restJson1 and rpcv2Cbor move back to Preview. - BREAKING: schema classes live in
<Namespace>.Schemas. All generated schema classes take theSchemasuffix and move to their own namespace, so they never clash with a model type. A model type namedSchemasfails generation. - BREAKING: generated name collisions are resolved. Members, enum values, and
types named like their type or an inherited member (
Equals,ToString, …) take aValuesuffix (EqualsValue). Union variant classes namedValue,Tag,Unknown,Match, an inherited member, or their union take aCasesuffix (ValueCase); the factory staysFromValue. - BREAKING: error discriminators are a codec option. The JSON and CBOR codecs
write
CodecFactoryOptions.Discriminatorahead of a top-level structure’s members. The publicSerializeErrorhelpers onRestProtocolandRpcV2CborProtocolare removed.
smithy.protocols#rpcv2Jsonclient and server support in the newNSmithy.Protocols.RpcV2Jsonpackage, including event streams. It shares a newNSmithy.Protocols.RpcV2base withNSmithy.Protocols.RpcV2Cbor.JsonCodecFactoryoptionshonorTimestampFormatTraitandbigNumbersAsStrings.- Operation
@examplesrender as<example>blocks in generated client XML docs.
- RPC v2 servers reject requests that carry an
X-Amz-TargetorX-Amzn-Targetheader, as the specification requires. - Generated code compiles for
bigIntegertrait values outside thelongrange. - String literals escape U+2028, U+2029, U+0085, and other control characters.
- The deprecated
smithy.api#Primitive*prelude shapes are supported. - Error structure members with a
@defaultfall back to the modeled default when omitted, instead of failing to compile or throwingArgumentNullException. - Union examples with no variant no longer crash doc generation.
0.12.0
Section titled “0.12.0”GitHub release · Changes since 0.11.0
This release moves the Smithy CLI out of NSmithy.MSBuild and makes one effective
smithy-build.json the way NSmithy configures every build. NSmithy.MSBuild drops
from about 157 MB to about 3 MB; the CLI now comes from the new NSmithy.SmithyCli
package or from your own installation, and code generation checks its version.
When upgrading, reference NSmithy.SmithyCli or install Smithy CLI 1.73.0 or later,
move SmithyBaseNamespace, SmithyGenerateDependencyInjection, and
SmithyGenerateFakes into smithy-build.json as csharp-codegen settings, and
remove service and NSmithy’s plugin artifacts from the smithy-build.json of
projects that set SmithyService. Templates now use the Smithy CLI on PATH unless
you pass --smithy-cli-package.
Changed
Section titled “Changed”- BREAKING: the Smithy CLI ships as its own package.
NSmithy.MSBuildno longer bundles the Smithy CLI and its Java runtime, which drops it from about 157 MB to about 3 MB. Add<PackageReference Include="NSmithy.SmithyCli" Version="1.73.0" />to each project that generates code, or once inDirectory.Build.props. The package is versioned by the Smithy CLI it contains, so NSmithy upgrades reuse the copy in the NuGet cache. Without it, NSmithy runsSmithyCliPathorsmithyonPATH, so a CLI from pixi, Nix, or Homebrew works without downloading the package. See Smithy CLI. - BREAKING: one effective
smithy-build.json. NSmithy now always merges the project’s ownsmithy-build.json(if any), the referenced contracts, and the plugin settings from properties into one build file underobj/. Properties say what a project builds (SmithyService,SmithyGenerateClient,SmithyGenerateServer,SmithyGenerateDocs,SmithyOpenApiProtocol,SmithyGrpc); every other plugin setting goes insmithy-build.json, and a setting given both ways fails the build (NSMITHYPLUGIN).SmithyBaseNamespace,SmithyGenerateDependencyInjection, andSmithyGenerateFakesare removed: setbaseNamespace,generateDependencyInjection, andgenerateFakeson thecsharp-codegenplugin instead. A project that setsSmithyServicemust no longer setservicein itssmithy-build.json, and NSmithy adds its plugin artifacts itself. Maven Central is listed when no repository is. - BREAKING: template contracts options renamed. The server template’s
--contracts <project>is now--contracts-project <project>, matching the client’s new option, and the client template’s--contracts maven|nugetis now--contracts-package maven|nuget.
- Smithy CLI version check. Code generation fails with
NSMITHYCLIVERSIONwhenNSmithy.SmithyClidiffers fromSmithyVersionor a Smithy CLI you provide is older than it, and withNSMITHYCLIMISSINGwhen no CLI can be run.SmithyCliVersionCheck(exact,minimum, ornone) overrides the default. dotnet nsmithy smithy. Runs the Smithy CLI a project’s build uses, with the same Maven setup, e.g.dotnet nsmithy smithy -- validate.--contracts-projectclient template option. References a contracts project in the same solution, so the client generates its types from it without asmithy-build.json, as the server template already could.--smithy-cli-packagetemplate option. By default the templates use the Smithy CLI onPATH; with--smithy-cli-packagethey referenceNSmithy.SmithyCliinstead.SmithyUseBundledMavenRepo. Set it tofalseto resolve NSmithy’s plugins and every other Maven dependency from Maven repositories, as the plain Smithy CLI does, instead of from the repository bundled inNSmithy.MSBuild. See Maven dependencies.
SmithyCliPathon a read-only path. NSmithy no longer runschmodon a user-supplied Smithy CLI, which failed for read-only installs such as the Nix store.
0.11.0
Section titled “0.11.0”GitHub release · Changes since 0.10.1
This release generates a schema class and a shape serializer for every shape, which makes serialization faster and removes the schema visitor and builder APIs. It also reports Smithy validation errors as MSBuild errors, describes integer shapes as OpenAPI integers, and fixes stream ownership and empty awsJson errors. Regenerate models with the matching codegen version when upgrading, and review the breaking changes below if you use low-level runtime APIs.
Changed
Section titled “Changed”- BREAKING: generated schema classes and shape serializers. Each structure, union,
list, and map schema is now a generated class deriving from
StructSchema,UnionSchema,ListSchema, orMapSchema, in its ownPerson.Schema.g.csfile besidePerson.g.cs. Operation schemas live inGetPerson.Schema.g.cs. Generated code reads and writes each member with one direct call on anIShapeSerializerorIShapeDeserializer. Codecs, the validator, HTTP bindings, and AWS Query forms consume values through those interfaces. Regenerate models with the matching codegen version when upgrading runtime packages. (#227) - BREAKING: removed schema visitors and fluent builders. Removed
ISchemaVisitor,PartialSchemaVisitor,IMemberVisitor,IUnionCaseVisitor, the typed member interfaces (IMemberSchema,ITypedTargetMemberSchema<TValue>,IBuilderMemberSchema),IStructValueSerializer,DocumentDeserializer,Schemas.Structure, andSchemas.Union. A hand-written schema derives from the schema base classes; see the hand-written schemas inNSmithy.Corefor examples. Members and union cases areMemberSchema. A custom value consumer implementsIShapeSerializer.ICodecFactory.FromMembertakes the target schema and the member’s traits. (#227) - Typed defaults. Modeled
@defaultvalues are generated into each builder and each serializer, so no codec reads defaults from traits at runtime. XML and protobuf reads now fill defaults for absent members, as JSON and CBOR reads already did. (#227) - Faster serialization and request handling. The generated code calls the
serializer directly. Server round trips with request bodies are up to 29% faster
with up to 36% less allocation, XML serialization is up to 25% faster, protobuf
serialization up to 11% faster with up to 35% less allocation, CBOR serialization
allocates up to 31% less, and JSON serialization is about 5% faster. JSON and
protobuf deserialization and gRPC round trips perform as before. See the benchmark
results in
benchmarks/results/. (#227) - Less allocation reading client responses. With a declared
Content-Length,HttpClientTransportreads a buffered response into one array of that size instead of copying it out of a growing stream. Large list responses allocate about 18% less. (#228) - Updated build dependencies. The MSBuild tasks are compiled against MSBuild 18.0.2, the version in the oldest supported .NET 10 SDK, which removes the unsupported target framework warning. Scalar is updated. (#231)
-
Smithy errors in the build output. When the Smithy CLI fails, each validation error is reported as an MSBuild error with its event id and file location, so it appears with the terminal logger and in IDE error lists. Other CLI failures report the end of the CLI output. (#230)
-
Request stream ownership.
HttpClientTransportno longer disposes a request stream the caller passed in, so callers can rewind and resend it. The REST server disposes a stream returned by a handler once the response body is written. (#229) -
Empty awsJson errors. An awsJson error response with an empty body is built from the error’s schema. It previously threw
MissingMethodExceptionfor generated errors with members. (#229) -
Integer types in generated OpenAPI. With
SmithyOpenApiProtocolset, Byte, Short, Integer, and Long members are described as OpenAPIinteger, withint32andint64formats for Integer and Long, instead of an untypednumber. (#235) -
Stale generated files. A shape the model no longer produces, such as a renamed shape, no longer leaves its old generated file behind to collide with the new one. A Smithy CLI run that succeeds without producing any of the previously generated files now fails the build with
NSMITHYGEN. (#227)
Packages
Section titled “Packages”All packages are prepared for publication at 0.11.0. Codegen JARs and NuGet
packages must use the same release version.
0.10.1
Section titled “0.10.1”GitHub release · Changes since 0.10.0
Maintenance release with updated runtime and tooling dependencies, refreshed templates, and clearer documentation and examples.
Changed
Section titled “Changed”- Updated runtime and build dependencies. Refresh CBOR, hashing, Scalar, and
MSBuild dependencies. The
dotnet-nsmithytool now uses the stable System.CommandLine API. - Updated Alloy traits. The bundled Maven repository and project templates
now use
alloy-core0.3.40. - Clearer guides and examples. Rework the getting-started and Concepts pages, and organize examples by protocol and unary or streaming interaction style.
Packages
Section titled “Packages”All packages are prepared for publication at 0.10.1. Codegen JARs and NuGet
packages must use the same release version.
0.10.0
Section titled “0.10.0”GitHub release · Changes since 0.9.0
This release adds MCP tools and prompts backed by generated service handlers, completes the applicable official HTTP protocol conformance suites, and simplifies the generated C#. It also makes codec construction consistent and removes the untyped schema API. Applications using low-level runtime APIs should review the migration notes below.
- MCP tools and prompts. The new
NSmithy.Server.Mcppackage exposes generated unary service operations as MCP tools, with typed handlers, strict JSON codecs, validation, modeled errors, and Smithy-derived annotations. Service and operationsmithy.ai#promptstraits produce MCP prompts with modeled arguments. The restJson1 example includes an MCP stdio mode. (#165, #168, #169) - Service catalogs for custom integrations. Generated service definitions expose registered operation handlers and JSON Schema metadata for non-streaming inputs and outputs, allowing custom hosts to reuse the same handlers. (#166, #168)
- Official HTTP protocol conformance gaps. restJson1, simpleRestJson, and rpcv2Cbor now pass every applicable official request and response case on their client and server surfaces; restJson1 also passes all applicable malformed-request cases. AWS JSON 1.1, AWS Query, EC2 Query, and restXml pass every applicable official client request and response case. See Protocol Status for coverage by protocol and surface. (#157, #158, #161, #162)
Changed
Section titled “Changed”- BREAKING: consistent codec factories. Replace the removed static codec entry
points with
JsonCodecFactory,XmlCodecFactory,CborCodecFactory, orProtoCodecFactory. For example, construct a JSON codec withJsonCodecFactory.Default.FromSchema(schema). Custom factories implementICodecFactory, orIProjectionCodecFactorywhen projection support is needed; construction options now useCodecFactoryOptions. (#159) - BREAKING: typed schema APIs. Removed the untyped/object schema tier, including
GetObject/SetObject, object-based collection and enum/union accessors, andSchemas.GetMembers. Custom schema integrations should use typed schema visitors and member APIs, includingPartialSchemaVisitor,IBuilderMemberSchema, andITypedTargetMemberSchema<TValue>.TypedTarget. Structure projections now snapshot their selected members. Regenerate models with the matching codegen version when upgrading runtime packages. (#167) - BREAKING: explicit server runtime registration for manual hosting. Generated
aggregate handler registration calls
AddSmithyServer()automatically. Applications registering individual operation handlers must call it themselves. Direct callers ofSmithyAspNetCoreHost.DispatchAsyncmust supply theSmithyServerRuntimeas the first argument. Existing application runtime registrations are preserved. (#170) - Earlier errors for unsupported HTTP bindings. Unsupported binding kinds and
non-integer
@httpResponseCodemembers now fail during operation protocol construction, before the first request. (#167) - More readable generated C#. Model and framework references use short names
and collected imports where unambiguous, with
global::qualification for name collisions. (#171)
Packages
Section titled “Packages”All packages are prepared for publication at 0.10.0, including the new
NSmithy.Server.Mcp package. Codegen JARs and NuGet packages must use the same
release version.
GitHub release · Changes since 0.8.1
Adds generated fakes, AWS Query and EC2 Query clients, and broader AWS endpoint, credential, and authentication support.
- Fake handlers and clients. Enable
SmithyGenerateFakes(orgenerateFakesin codegen settings) to generateFake{Service}HandlerandFake{Service}Client. They match inputs against modeled@examples, return canned responses or modeled errors, and fall back to deterministic placeholder values. Operation methods are virtual; fake client paginators yield a single page. Register fake handlers withAdd{Service}Handler<T>(). (#147, #148, #150) - AWS Query and EC2 Query clients. The new
NSmithy.Protocols.AwsQuerypackage supports both protocols and passes their applicable official client conformance cases. (#155) - AWS endpoints and credentials.
NSmithy.Awsadds regional endpoint resolution across AWS partitions; environment, shared-profile, IAM Identity Center/SSO, and IMDSv2 credential providers; a default provider chain; credential caching; and SigV4 presigning. (#152, #155) - Modeled client behavior. Generated clients support operation host prefixes,
per-operation auth overrides, endpoint-provided auth narrowing, modeled HTTP
version preferences, and a default NSmithy user agent. Host-prefix injection and
the user agent are configurable through
SmithyClientConfig. (#152)
Changed
Section titled “Changed”- BREAKING: auth scheme interfaces. Replace
ISmithyAuthScheme.CreateInterceptorwithIdentityResolverandSigner, implementingISmithyIdentityResolverandISmithySignerfor custom schemes.SmithyAuthSchemeContext,ISmithyAuthHandler,HeaderAuthInterceptor, andQueryParameterAuthInterceptorare removed.SmithyClientRuntime’s auth map now containsISmithyAuthSchemevalues. (#152) - BREAKING: protocol HTTP preferences. Replace
IProtocol.RequiresHttp2withHttpVersionPreference, which supports HTTP/1.1, HTTP/2, and HTTP/3 plus downgrade policy. Custom protocols using the default continue to use HTTP/1.1. (#152) - Lower codec and client overhead. Reduced processing time and allocations for JSON, CBOR, Proto, modeled errors, and client calls without changing the wire format. (#143, #146, #149, #151, #154)
GitHub release · Changes since 0.8.0
- Generated template projects build correctly. Fixed the obsolete server mapper
call, missing
NSmithy.MSBuildreference in servers created without--contracts, and obsolete gRPC client constructor arguments. (#142)
GitHub release · Changes since 0.7.0
Adds server-side model validation and structured errors for malformed requests.
- Modeled constraint validation. Generated servers enforce
@length,@range,@pattern,@required, and enum values before invoking handlers. Clients receive typedNSmithy.Core.Validation.ValidationExceptionerrors containing the member path and failed constraint. (#131) - Structured request errors. Malformed values produce 400
SerializationExceptionresponses, unsupported request media types produce 415UnsupportedMediaTypeException, and unacceptable response media types produce 406NotAcceptableException. Generated restJson1 servers pass all 655 applicable official malformed-request cases. (#135) - Legacy
@enumvalidation. Servers validate values on string shapes carrying the deprecated trait.@internalvalues are accepted but omitted from rejection messages. (#131, #135) - Model documentation in IntelliSense. Smithy documentation traits become XML comments on generated models, clients, servers, and errors. (#129)
Changed
Section titled “Changed”- BREAKING: schema codec APIs. Runtime schema member access now uses typed visitors. Top-level default materialization is aligned across JSON, CBOR, XML, and Proto codecs. (#134)
- BREAKING: server mapper methods. Use the single service mapper with protocol
flags instead of protocol-specific methods:
app.MapWeatherServiceRpcV2Cbor()becomesapp.MapWeatherService(). Mapping conflicting routes is rejected. (#128) - BREAKING: REST codec factory argument.
RestServiceProtocolnow takesFunc<WireReadMode, IRestBodyCodecFactory>as its first constructor argument, allowing strict server reads and permissive client reads. (#135) - BREAKING: map key schemas.
Schemas.Mapaccepts a key schema, defaulting toSchemas.String. ReplaceIMapSchema.TypedKeyMemberwithIMapSchema.KeyMember. Enum-keyed maps generatestringkeys, while server validation enforces the modeled enum values. (#134, #135) - BREAKING: legacy enum generation. String shapes with deprecated
@enumtraits no longer generate enum types; they map tostringand retain server-side value validation. (#131) - Faster JSON codecs. Reduced serialization and deserialization time and allocations without changing wire output. (#136)
- Smithy 1.73.0. Updated the bundled CLI and Smithy dependencies.
NSmithy.MSBuildgrows by roughly 20 MB with the bundled JRE 25; custom Java codegen integrations must account for the plugin’s bytecode target moving from Java 17 to 21. (#139) - Clearer model errors. Unsupported schemas, gRPC stream wrappers, and other unsupported constructs produce diagnostics naming the shape and reason. (#124–#127)
- Defaults on explicit null. Codecs now apply a member’s modeled
@defaultwhen its input value is explicitly null. (#136)
GitHub release · Changes since 0.6.0
Adds event streaming across rpcv2Cbor and restJson1.
NSmithy.EventStream. A standalone library forvnd.amazon.eventstreammessage framing. (#94)- rpcv2Cbor event streaming. Supports event-stream operations and their initial request and response messages. (#106, #108)
- restJson1 streaming. Adds streaming support to the protocol. (#110)
Changed
Section titled “Changed”- BREAKING: protocol interfaces. Client and server interfaces are separate; custom protocol implementations own their streaming framing. (#93)
- BREAKING: streaming operation signatures. Streaming operations now use
Task<TOutput>(TInput), with the event stream carried inside the input/output structure alongside any initial fields. This applies to gRPC as well. (#93, #108) - Bundled codegen dependencies.
NSmithy.MSBuildincludes the codegen dependencies, so clean-machine builds need no locally built codegen JAR. (#105)
- rpcv2Cbor example. Corrected the runnable example. (#111)
- Prerelease templates. Scaffolded projects reference the actual published prerelease version. (#109)
GitHub release · Changes since 0.5.0
DebugInterceptor. Logs typed input/output, each transport attempt’s request and response, and body bytes as hex. Enable it in the rpcv2Cbor example client with--debug. (#100)- rpcv2Cbor templates.
dotnet newaccepts--protocol rpcv2Cbor. (#97) - Expanded rpcv2Cbor example. Demonstrates resources, pagination, modeled errors, and retries with the Weather service. (#98, #99)
- Client template setup. Corrected project setup and stale template references in the quick-start flow. (#97)
GitHub release · Changes since 0.4.0
Adds client observability, pagination, operation timeouts, and more capable retries.
- OpenTelemetry instrumentation. Client operations emit spans and metrics; the restJson1 example demonstrates an observability setup. (#86, #90)
- Generated paginators.
@paginatedoperations exposeIAsyncEnumerablepaginator methods on generated clients. (#89) - Per-operation endpoint and auth selection. Resolution runs for each operation rather than once per client. (#87)
- Operation timeout.
OperationTimeoutcovers the entire execution, including retries. (#85)
Changed
Section titled “Changed”- BREAKING: HTTP body APIs.
SmithyHttpBody.Empty,Bytes, andStreamingreplace separate buffered/streaming request and response fields. Streaming bodies preserve their content length. (#79) - BREAKING: retry and interceptor APIs. Custom retry strategies now return an
ISmithyRetrySessionfromBegin().IClientInterceptor.OnAfterExecutionreceives an additionalException?argument. Direct runtime callers useInvokeAsync(binding, input, ct). (#82) - Standard retries.
SmithyStandardRetryStrategysupports jittered exponential backoff, a shared retry quota, andRetry-After. Transport failures and modeled@retryableerrors participate in retry classification; interceptors observe failures as well as successes. (#82)
- Release packages build on clean machines.
NSmithy.MSBuildnow references the published codegen version instead of an unpublished-SNAPSHOTJAR. (#95) - Streaming response cleanup. The client runtime disposes abandoned streaming response bodies. (#84)
- Client configuration isolation. Client construction takes a copy of caller-supplied configuration. (#83)
GitHub release · Changes since 0.3.0
Adds AWS JSON, SigV4 authentication, and bidirectional gRPC streaming.
- AWS JSON clients. The new
NSmithy.Protocols.AwsJsonpackage supports AWS JSON services. (#60) - AWS authentication. The new
NSmithy.Awspackage supports SigV4 signing and generated auth configuration. An AWS LocalStack example demonstrates usage. (#61) - Bidirectional gRPC streams. Generated clients and ASP.NET Core servers support
bidirectional event streams, with a
Grpc.Netinteroperability example. (#62) - Client interception and retries. Generated clients use
SmithyClientRuntimewith interceptor hooks, auth resolution, and configurable retries. (#65–#67)
Changed
Section titled “Changed”- Client middleware removed. Migrate custom middleware to client interceptors. (#69)
GitHub release · Changes since 0.2.0
Adds native gRPC and clients that can use any protocol declared by a service.
- Native gRPC. New packages
NSmithy.Codecs.ProtoandNSmithy.Protocols.Grpcsupport HTTP/2 gRPC calls, modeled errors, and ASP.NET Core server mapping withoutprotoc,Grpc.Tools, orGrpc.Net.Client.Map{Service}Grpccan coexist with REST mappings for services declaring both protocols. (#58) - Protocol selection on clients. A single
{Service}Clientaccepts an endpoint,HttpClient, or invoker, with an optional protocol defaulting to the service’s primary declared protocol. (#58) - Opt-in dependency injection. Set
SmithyGenerateDependencyInjection=true(orgenerateDependencyInjectionin codegen settings) to generateAdd{Service}Client(...). It configures HTTP/2 when required and only adds theMicrosoft.Extensions.Httpdependency when enabled. (#58)
Changed
Section titled “Changed”- Protocol construction. Instantiate protocols, such as
new GrpcProtocol(), instead of using.Instance.IProtocolnow exposesRequiresHttp2. (#58) SmithyClientOptionsremoved. PassmiddlewareandidempotencyTokenProviderdirectly to the generated client constructor. (#58)- Low-level HTTP APIs. Request compression and content-MD5 handling move to
NSmithy.Http/SmithyRequestModifiers. Custom operation protocols useRequiresErrorDiscriminatorandSupportsHttpStatusErrorFallbackfor error dispatch. (#58)
GitHub release · Changes since 0.1.0
- rpcv2Cbor servers. Generated ASP.NET Core servers handle CBOR requests,
responses, and modeled errors at
POST /service/{Service}/operation/{Operation}. (#54) - REST server responses. Generated servers honor
@http(code), output header, payload, and document bindings, plus modeled-error headers and status codes. (#55)
Changed
Section titled “Changed”- Server-only generation by default.
NSmithy.Server.AspNetCoresetsSmithyGenerateServer=trueandSmithyGenerateClient=false. Server projects no longer requireNSmithy.Clientor a manual setting to disable client generation. (#53)
First tagged release, superseding 0.1.0-preview.*. Generate typed C# clients,
ASP.NET Core server stubs, and shared models from Smithy during dotnet build,
without a separate codegen step or a Java installation.
- Project templates.
NSmithy.Templatesprovidesnsmithy-server,nsmithy-client, andnsmithy-contractstemplates. - REST clients and servers. Supports
alloy#simpleRestJsonandaws.protocols#restJson1. - Additional client protocols. Supports
aws.protocols#restXmlandsmithy.protocols#rpcv2Cborclients. - Experimental gRPC. Supports
.protoemission, clients, and ASP.NET Core servers foralloy.proto#grpc.
Packages
Section titled “Packages”- Runtime and build integration:
NSmithy.Core,NSmithy.Http,NSmithy.MSBuild. - Client and server:
NSmithy.Client,NSmithy.Server.AspNetCore,NSmithy.Server.AspNetCore.Docs. - Codecs:
NSmithy.Codecs.Json,NSmithy.Codecs.Cbor,NSmithy.Codecs.Xml. - Protocols:
NSmithy.Protocols.Rest,NSmithy.Protocols.RestJson,NSmithy.Protocols.RestXml,NSmithy.Protocols.RpcV2Cbor. - Tooling:
NSmithy.Templates,dotnet-nsmithy.