From b300938cc6e0bf3bf2bb90906603e1e785812602 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 12 Sep 2026 13:56:56 +0000 Subject: [PATCH] feat: Updated OpenAPI spec --- ....IVoiceCloningClient.CreateVoiceClone.g.cs | 4 +-- .../SmallestAI.JsonSerializerContext.g.cs | 2 +- ...SmallestAI.JsonSerializerContextTypes.g.cs | 2 +- ...eCloningCreateVoiceCloneRequest.Json.g.cs} | 26 +++++++++---------- ....VoiceCloningCreateVoiceCloneRequest.g.cs} | 10 +++---- ...eCloningListVoiceClonesResponse.Json.g.cs} | 26 +++++++++---------- ....VoiceCloningListVoiceClonesResponse.g.cs} | 2 +- ...CloningListVoiceClonesResponse2.Json.g.cs} | 26 +++++++++---------- ...VoiceCloningListVoiceClonesResponse2.g.cs} | 2 +- ...I.VoiceCloningClient.CreateVoiceClone.g.cs | 14 +++++----- src/libs/SmallestAI/openapi.yaml | 22 ++++++++-------- 11 files changed, 68 insertions(+), 68 deletions(-) rename src/libs/SmallestAI/Generated/{SmallestAI.Models.CreateVoiceCloneRequest.Json.g.cs => SmallestAI.Models.VoiceCloningCreateVoiceCloneRequest.Json.g.cs} (85%) rename src/libs/SmallestAI/Generated/{SmallestAI.Models.CreateVoiceCloneRequest.g.cs => SmallestAI.Models.VoiceCloningCreateVoiceCloneRequest.g.cs} (95%) rename src/libs/SmallestAI/Generated/{SmallestAI.Models.ListVoiceClonesResponse.Json.g.cs => SmallestAI.Models.VoiceCloningListVoiceClonesResponse.Json.g.cs} (85%) rename src/libs/SmallestAI/Generated/{SmallestAI.Models.ListVoiceClonesResponse2.g.cs => SmallestAI.Models.VoiceCloningListVoiceClonesResponse.g.cs} (87%) rename src/libs/SmallestAI/Generated/{SmallestAI.Models.ListVoiceClonesResponse2.Json.g.cs => SmallestAI.Models.VoiceCloningListVoiceClonesResponse2.Json.g.cs} (85%) rename src/libs/SmallestAI/Generated/{SmallestAI.Models.ListVoiceClonesResponse.g.cs => SmallestAI.Models.VoiceCloningListVoiceClonesResponse2.g.cs} (87%) diff --git a/src/libs/SmallestAI/Generated/SmallestAI.IVoiceCloningClient.CreateVoiceClone.g.cs b/src/libs/SmallestAI/Generated/SmallestAI.IVoiceCloningClient.CreateVoiceClone.g.cs index 1511f68..005f74c 100644 --- a/src/libs/SmallestAI/Generated/SmallestAI.IVoiceCloningClient.CreateVoiceClone.g.cs +++ b/src/libs/SmallestAI/Generated/SmallestAI.IVoiceCloningClient.CreateVoiceClone.g.cs @@ -14,7 +14,7 @@ public partial interface IVoiceCloningClient /// global::System.Threading.Tasks.Task CreateVoiceCloneAsync( - global::SmallestAI.CreateVoiceCloneRequest request, + global::SmallestAI.VoiceCloningCreateVoiceCloneRequest request, global::SmallestAI.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default); /// @@ -27,7 +27,7 @@ public partial interface IVoiceCloningClient /// global::System.Threading.Tasks.Task> CreateVoiceCloneAsResponseAsync( - global::SmallestAI.CreateVoiceCloneRequest request, + global::SmallestAI.VoiceCloningCreateVoiceCloneRequest request, global::SmallestAI.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default); /// diff --git a/src/libs/SmallestAI/Generated/SmallestAI.JsonSerializerContext.g.cs b/src/libs/SmallestAI/Generated/SmallestAI.JsonSerializerContext.g.cs index 55a4a41..a29f148 100644 --- a/src/libs/SmallestAI/Generated/SmallestAI.JsonSerializerContext.g.cs +++ b/src/libs/SmallestAI/Generated/SmallestAI.JsonSerializerContext.g.cs @@ -240,7 +240,7 @@ namespace SmallestAI [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.IList))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::SmallestAI.Error))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::SmallestAI.TranscriptionUrlRequest))] - [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::SmallestAI.CreateVoiceCloneRequest))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::SmallestAI.VoiceCloningCreateVoiceCloneRequest))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(byte[]))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.IList))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] diff --git a/src/libs/SmallestAI/Generated/SmallestAI.JsonSerializerContextTypes.g.cs b/src/libs/SmallestAI/Generated/SmallestAI.JsonSerializerContextTypes.g.cs index cd7d8ce..28834e4 100644 --- a/src/libs/SmallestAI/Generated/SmallestAI.JsonSerializerContextTypes.g.cs +++ b/src/libs/SmallestAI/Generated/SmallestAI.JsonSerializerContextTypes.g.cs @@ -437,7 +437,7 @@ public sealed partial class JsonSerializerContextTypes /// /// /// - public global::SmallestAI.CreateVoiceCloneRequest? Type101 { get; set; } + public global::SmallestAI.VoiceCloningCreateVoiceCloneRequest? Type101 { get; set; } /// /// /// diff --git a/src/libs/SmallestAI/Generated/SmallestAI.Models.CreateVoiceCloneRequest.Json.g.cs b/src/libs/SmallestAI/Generated/SmallestAI.Models.VoiceCloningCreateVoiceCloneRequest.Json.g.cs similarity index 85% rename from src/libs/SmallestAI/Generated/SmallestAI.Models.CreateVoiceCloneRequest.Json.g.cs rename to src/libs/SmallestAI/Generated/SmallestAI.Models.VoiceCloningCreateVoiceCloneRequest.Json.g.cs index b56b442..a06a557 100644 --- a/src/libs/SmallestAI/Generated/SmallestAI.Models.CreateVoiceCloneRequest.Json.g.cs +++ b/src/libs/SmallestAI/Generated/SmallestAI.Models.VoiceCloningCreateVoiceCloneRequest.Json.g.cs @@ -2,7 +2,7 @@ namespace SmallestAI { - public sealed partial class CreateVoiceCloneRequest + public sealed partial class VoiceCloningCreateVoiceCloneRequest { /// /// Serializes the current instance to a JSON string using the provided JsonSerializerContext. @@ -47,20 +47,20 @@ public string ToJson( /// /// Deserializes a JSON string using the provided JsonSerializerContext. /// - public static global::SmallestAI.CreateVoiceCloneRequest? FromJson( + public static global::SmallestAI.VoiceCloningCreateVoiceCloneRequest? FromJson( string json, global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) { return global::System.Text.Json.JsonSerializer.Deserialize( json, - typeof(global::SmallestAI.CreateVoiceCloneRequest), - jsonSerializerContext) as global::SmallestAI.CreateVoiceCloneRequest; + typeof(global::SmallestAI.VoiceCloningCreateVoiceCloneRequest), + jsonSerializerContext) as global::SmallestAI.VoiceCloningCreateVoiceCloneRequest; } /// /// Deserializes a JSON string using the generated default JsonSerializerContext. /// - public static global::SmallestAI.CreateVoiceCloneRequest? FromJson( + public static global::SmallestAI.VoiceCloningCreateVoiceCloneRequest? FromJson( string json) { return FromJson( @@ -75,7 +75,7 @@ public string ToJson( [global::System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] [global::System.Diagnostics.CodeAnalysis.RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] #endif - public static global::SmallestAI.CreateVoiceCloneRequest? FromJson( + public static global::SmallestAI.VoiceCloningCreateVoiceCloneRequest? FromJson( string json, global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) { @@ -86,7 +86,7 @@ public string ToJson( global::SmallestAI.SourceGenerationContext.Default); } - return global::System.Text.Json.JsonSerializer.Deserialize( + return global::System.Text.Json.JsonSerializer.Deserialize( json, jsonSerializerOptions); } @@ -94,20 +94,20 @@ public string ToJson( /// /// Deserializes a JSON stream using the provided JsonSerializerContext. /// - public static async global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( + public static async global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( global::System.IO.Stream jsonStream, global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) { return (await global::System.Text.Json.JsonSerializer.DeserializeAsync( jsonStream, - typeof(global::SmallestAI.CreateVoiceCloneRequest), - jsonSerializerContext).ConfigureAwait(false)) as global::SmallestAI.CreateVoiceCloneRequest; + typeof(global::SmallestAI.VoiceCloningCreateVoiceCloneRequest), + jsonSerializerContext).ConfigureAwait(false)) as global::SmallestAI.VoiceCloningCreateVoiceCloneRequest; } /// /// Deserializes a JSON stream using the generated default JsonSerializerContext. /// - public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( + public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( global::System.IO.Stream jsonStream) { return FromJsonStreamAsync( @@ -122,7 +122,7 @@ public string ToJson( [global::System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] [global::System.Diagnostics.CodeAnalysis.RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] #endif - public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( + public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( global::System.IO.Stream jsonStream, global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) { @@ -133,7 +133,7 @@ public string ToJson( global::SmallestAI.SourceGenerationContext.Default); } - return global::System.Text.Json.JsonSerializer.DeserializeAsync( + return global::System.Text.Json.JsonSerializer.DeserializeAsync( jsonStream, jsonSerializerOptions); } diff --git a/src/libs/SmallestAI/Generated/SmallestAI.Models.CreateVoiceCloneRequest.g.cs b/src/libs/SmallestAI/Generated/SmallestAI.Models.VoiceCloningCreateVoiceCloneRequest.g.cs similarity index 95% rename from src/libs/SmallestAI/Generated/SmallestAI.Models.CreateVoiceCloneRequest.g.cs rename to src/libs/SmallestAI/Generated/SmallestAI.Models.VoiceCloningCreateVoiceCloneRequest.g.cs index 639c3a6..a93ae9b 100644 --- a/src/libs/SmallestAI/Generated/SmallestAI.Models.CreateVoiceCloneRequest.g.cs +++ b/src/libs/SmallestAI/Generated/SmallestAI.Models.VoiceCloningCreateVoiceCloneRequest.g.cs @@ -6,7 +6,7 @@ namespace SmallestAI /// /// /// - public sealed partial class CreateVoiceCloneRequest + public sealed partial class VoiceCloningCreateVoiceCloneRequest { /// /// Human-readable name for the voice clone. @@ -86,7 +86,7 @@ public sealed partial class CreateVoiceCloneRequest public global::System.Collections.Generic.IDictionary AdditionalProperties { get; set; } = new global::System.Collections.Generic.Dictionary(); /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// /// Human-readable name for the voice clone. @@ -133,7 +133,7 @@ public sealed partial class CreateVoiceCloneRequest #if NET7_0_OR_GREATER [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] #endif - public CreateVoiceCloneRequest( + public VoiceCloningCreateVoiceCloneRequest( string displayName, byte[] file, string filename, @@ -154,9 +154,9 @@ public CreateVoiceCloneRequest( } /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - public CreateVoiceCloneRequest() + public VoiceCloningCreateVoiceCloneRequest() { } diff --git a/src/libs/SmallestAI/Generated/SmallestAI.Models.ListVoiceClonesResponse.Json.g.cs b/src/libs/SmallestAI/Generated/SmallestAI.Models.VoiceCloningListVoiceClonesResponse.Json.g.cs similarity index 85% rename from src/libs/SmallestAI/Generated/SmallestAI.Models.ListVoiceClonesResponse.Json.g.cs rename to src/libs/SmallestAI/Generated/SmallestAI.Models.VoiceCloningListVoiceClonesResponse.Json.g.cs index e4b2453..daaf3a2 100644 --- a/src/libs/SmallestAI/Generated/SmallestAI.Models.ListVoiceClonesResponse.Json.g.cs +++ b/src/libs/SmallestAI/Generated/SmallestAI.Models.VoiceCloningListVoiceClonesResponse.Json.g.cs @@ -2,7 +2,7 @@ namespace SmallestAI { - public sealed partial class ListVoiceClonesResponse + public sealed partial class VoiceCloningListVoiceClonesResponse { /// /// Serializes the current instance to a JSON string using the provided JsonSerializerContext. @@ -47,20 +47,20 @@ public string ToJson( /// /// Deserializes a JSON string using the provided JsonSerializerContext. /// - public static global::SmallestAI.ListVoiceClonesResponse? FromJson( + public static global::SmallestAI.VoiceCloningListVoiceClonesResponse? FromJson( string json, global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) { return global::System.Text.Json.JsonSerializer.Deserialize( json, - typeof(global::SmallestAI.ListVoiceClonesResponse), - jsonSerializerContext) as global::SmallestAI.ListVoiceClonesResponse; + typeof(global::SmallestAI.VoiceCloningListVoiceClonesResponse), + jsonSerializerContext) as global::SmallestAI.VoiceCloningListVoiceClonesResponse; } /// /// Deserializes a JSON string using the generated default JsonSerializerContext. /// - public static global::SmallestAI.ListVoiceClonesResponse? FromJson( + public static global::SmallestAI.VoiceCloningListVoiceClonesResponse? FromJson( string json) { return FromJson( @@ -75,7 +75,7 @@ public string ToJson( [global::System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] [global::System.Diagnostics.CodeAnalysis.RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] #endif - public static global::SmallestAI.ListVoiceClonesResponse? FromJson( + public static global::SmallestAI.VoiceCloningListVoiceClonesResponse? FromJson( string json, global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) { @@ -86,7 +86,7 @@ public string ToJson( global::SmallestAI.SourceGenerationContext.Default); } - return global::System.Text.Json.JsonSerializer.Deserialize( + return global::System.Text.Json.JsonSerializer.Deserialize( json, jsonSerializerOptions); } @@ -94,20 +94,20 @@ public string ToJson( /// /// Deserializes a JSON stream using the provided JsonSerializerContext. /// - public static async global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( + public static async global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( global::System.IO.Stream jsonStream, global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) { return (await global::System.Text.Json.JsonSerializer.DeserializeAsync( jsonStream, - typeof(global::SmallestAI.ListVoiceClonesResponse), - jsonSerializerContext).ConfigureAwait(false)) as global::SmallestAI.ListVoiceClonesResponse; + typeof(global::SmallestAI.VoiceCloningListVoiceClonesResponse), + jsonSerializerContext).ConfigureAwait(false)) as global::SmallestAI.VoiceCloningListVoiceClonesResponse; } /// /// Deserializes a JSON stream using the generated default JsonSerializerContext. /// - public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( + public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( global::System.IO.Stream jsonStream) { return FromJsonStreamAsync( @@ -122,7 +122,7 @@ public string ToJson( [global::System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] [global::System.Diagnostics.CodeAnalysis.RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] #endif - public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( + public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( global::System.IO.Stream jsonStream, global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) { @@ -133,7 +133,7 @@ public string ToJson( global::SmallestAI.SourceGenerationContext.Default); } - return global::System.Text.Json.JsonSerializer.DeserializeAsync( + return global::System.Text.Json.JsonSerializer.DeserializeAsync( jsonStream, jsonSerializerOptions); } diff --git a/src/libs/SmallestAI/Generated/SmallestAI.Models.ListVoiceClonesResponse2.g.cs b/src/libs/SmallestAI/Generated/SmallestAI.Models.VoiceCloningListVoiceClonesResponse.g.cs similarity index 87% rename from src/libs/SmallestAI/Generated/SmallestAI.Models.ListVoiceClonesResponse2.g.cs rename to src/libs/SmallestAI/Generated/SmallestAI.Models.VoiceCloningListVoiceClonesResponse.g.cs index 8a96232..60595f3 100644 --- a/src/libs/SmallestAI/Generated/SmallestAI.Models.ListVoiceClonesResponse2.g.cs +++ b/src/libs/SmallestAI/Generated/SmallestAI.Models.VoiceCloningListVoiceClonesResponse.g.cs @@ -6,7 +6,7 @@ namespace SmallestAI /// /// Any type /// - public sealed partial class ListVoiceClonesResponse2 + public sealed partial class VoiceCloningListVoiceClonesResponse { /// diff --git a/src/libs/SmallestAI/Generated/SmallestAI.Models.ListVoiceClonesResponse2.Json.g.cs b/src/libs/SmallestAI/Generated/SmallestAI.Models.VoiceCloningListVoiceClonesResponse2.Json.g.cs similarity index 85% rename from src/libs/SmallestAI/Generated/SmallestAI.Models.ListVoiceClonesResponse2.Json.g.cs rename to src/libs/SmallestAI/Generated/SmallestAI.Models.VoiceCloningListVoiceClonesResponse2.Json.g.cs index c76f0f7..4ddbbdf 100644 --- a/src/libs/SmallestAI/Generated/SmallestAI.Models.ListVoiceClonesResponse2.Json.g.cs +++ b/src/libs/SmallestAI/Generated/SmallestAI.Models.VoiceCloningListVoiceClonesResponse2.Json.g.cs @@ -2,7 +2,7 @@ namespace SmallestAI { - public sealed partial class ListVoiceClonesResponse2 + public sealed partial class VoiceCloningListVoiceClonesResponse2 { /// /// Serializes the current instance to a JSON string using the provided JsonSerializerContext. @@ -47,20 +47,20 @@ public string ToJson( /// /// Deserializes a JSON string using the provided JsonSerializerContext. /// - public static global::SmallestAI.ListVoiceClonesResponse2? FromJson( + public static global::SmallestAI.VoiceCloningListVoiceClonesResponse2? FromJson( string json, global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) { return global::System.Text.Json.JsonSerializer.Deserialize( json, - typeof(global::SmallestAI.ListVoiceClonesResponse2), - jsonSerializerContext) as global::SmallestAI.ListVoiceClonesResponse2; + typeof(global::SmallestAI.VoiceCloningListVoiceClonesResponse2), + jsonSerializerContext) as global::SmallestAI.VoiceCloningListVoiceClonesResponse2; } /// /// Deserializes a JSON string using the generated default JsonSerializerContext. /// - public static global::SmallestAI.ListVoiceClonesResponse2? FromJson( + public static global::SmallestAI.VoiceCloningListVoiceClonesResponse2? FromJson( string json) { return FromJson( @@ -75,7 +75,7 @@ public string ToJson( [global::System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] [global::System.Diagnostics.CodeAnalysis.RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] #endif - public static global::SmallestAI.ListVoiceClonesResponse2? FromJson( + public static global::SmallestAI.VoiceCloningListVoiceClonesResponse2? FromJson( string json, global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) { @@ -86,7 +86,7 @@ public string ToJson( global::SmallestAI.SourceGenerationContext.Default); } - return global::System.Text.Json.JsonSerializer.Deserialize( + return global::System.Text.Json.JsonSerializer.Deserialize( json, jsonSerializerOptions); } @@ -94,20 +94,20 @@ public string ToJson( /// /// Deserializes a JSON stream using the provided JsonSerializerContext. /// - public static async global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( + public static async global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( global::System.IO.Stream jsonStream, global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) { return (await global::System.Text.Json.JsonSerializer.DeserializeAsync( jsonStream, - typeof(global::SmallestAI.ListVoiceClonesResponse2), - jsonSerializerContext).ConfigureAwait(false)) as global::SmallestAI.ListVoiceClonesResponse2; + typeof(global::SmallestAI.VoiceCloningListVoiceClonesResponse2), + jsonSerializerContext).ConfigureAwait(false)) as global::SmallestAI.VoiceCloningListVoiceClonesResponse2; } /// /// Deserializes a JSON stream using the generated default JsonSerializerContext. /// - public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( + public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( global::System.IO.Stream jsonStream) { return FromJsonStreamAsync( @@ -122,7 +122,7 @@ public string ToJson( [global::System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] [global::System.Diagnostics.CodeAnalysis.RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] #endif - public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( + public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( global::System.IO.Stream jsonStream, global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) { @@ -133,7 +133,7 @@ public string ToJson( global::SmallestAI.SourceGenerationContext.Default); } - return global::System.Text.Json.JsonSerializer.DeserializeAsync( + return global::System.Text.Json.JsonSerializer.DeserializeAsync( jsonStream, jsonSerializerOptions); } diff --git a/src/libs/SmallestAI/Generated/SmallestAI.Models.ListVoiceClonesResponse.g.cs b/src/libs/SmallestAI/Generated/SmallestAI.Models.VoiceCloningListVoiceClonesResponse2.g.cs similarity index 87% rename from src/libs/SmallestAI/Generated/SmallestAI.Models.ListVoiceClonesResponse.g.cs rename to src/libs/SmallestAI/Generated/SmallestAI.Models.VoiceCloningListVoiceClonesResponse2.g.cs index c815dfe..08a5e53 100644 --- a/src/libs/SmallestAI/Generated/SmallestAI.Models.ListVoiceClonesResponse.g.cs +++ b/src/libs/SmallestAI/Generated/SmallestAI.Models.VoiceCloningListVoiceClonesResponse2.g.cs @@ -6,7 +6,7 @@ namespace SmallestAI /// /// Any type /// - public sealed partial class ListVoiceClonesResponse + public sealed partial class VoiceCloningListVoiceClonesResponse2 { /// diff --git a/src/libs/SmallestAI/Generated/SmallestAI.VoiceCloningClient.CreateVoiceClone.g.cs b/src/libs/SmallestAI/Generated/SmallestAI.VoiceCloningClient.CreateVoiceClone.g.cs index 26f59fa..3ccb46e 100644 --- a/src/libs/SmallestAI/Generated/SmallestAI.VoiceCloningClient.CreateVoiceClone.g.cs +++ b/src/libs/SmallestAI/Generated/SmallestAI.VoiceCloningClient.CreateVoiceClone.g.cs @@ -27,11 +27,11 @@ public partial class VoiceCloningClient }; partial void PrepareCreateVoiceCloneArguments( global::System.Net.Http.HttpClient httpClient, - global::SmallestAI.CreateVoiceCloneRequest request); + global::SmallestAI.VoiceCloningCreateVoiceCloneRequest request); partial void PrepareCreateVoiceCloneRequest( global::System.Net.Http.HttpClient httpClient, global::System.Net.Http.HttpRequestMessage httpRequestMessage, - global::SmallestAI.CreateVoiceCloneRequest request); + global::SmallestAI.VoiceCloningCreateVoiceCloneRequest request); partial void ProcessCreateVoiceCloneResponse( global::System.Net.Http.HttpClient httpClient, global::System.Net.Http.HttpResponseMessage httpResponseMessage); @@ -51,7 +51,7 @@ partial void ProcessCreateVoiceCloneResponseContent( /// public async global::System.Threading.Tasks.Task CreateVoiceCloneAsync( - global::SmallestAI.CreateVoiceCloneRequest request, + global::SmallestAI.VoiceCloningCreateVoiceCloneRequest request, global::SmallestAI.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default) { @@ -74,7 +74,7 @@ partial void ProcessCreateVoiceCloneResponseContent( /// public async global::System.Threading.Tasks.Task> CreateVoiceCloneAsResponseAsync( - global::SmallestAI.CreateVoiceCloneRequest request, + global::SmallestAI.VoiceCloningCreateVoiceCloneRequest request, global::SmallestAI.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default) { @@ -686,7 +686,7 @@ request.Filename is null global::SmallestAI.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default) { - var __request = new global::SmallestAI.CreateVoiceCloneRequest + var __request = new global::SmallestAI.VoiceCloningCreateVoiceCloneRequest { DisplayName = displayName, File = file, @@ -767,7 +767,7 @@ request.Filename is null { file = file ?? throw new global::System.ArgumentNullException(nameof(file)); - var request = new global::SmallestAI.CreateVoiceCloneRequest + var request = new global::SmallestAI.VoiceCloningCreateVoiceCloneRequest { DisplayName = displayName, File = global::System.Array.Empty(), @@ -1378,7 +1378,7 @@ request.Filename is null { file = file ?? throw new global::System.ArgumentNullException(nameof(file)); - var request = new global::SmallestAI.CreateVoiceCloneRequest + var request = new global::SmallestAI.VoiceCloningCreateVoiceCloneRequest { DisplayName = displayName, File = global::System.Array.Empty(), diff --git a/src/libs/SmallestAI/openapi.yaml b/src/libs/SmallestAI/openapi.yaml index c5b7d13..5501622 100644 --- a/src/libs/SmallestAI/openapi.yaml +++ b/src/libs/SmallestAI/openapi.yaml @@ -7,7 +7,7 @@ "paths": { "/waves/v1/tts": { "post": { - "operationId": "synthesize-speech", + "operationId": "textToSpeech_synthesizeSpeech", "summary": "Synthesize speech", "description": "Synthesize speech from text in a single request. Pass `text` + `voice_id`, get back binary audio.\n\nPick the model with the `model` body parameter: default `lightning_v3.1`, or `lightning_v3.1_pro` for the Pro pool. Other request parameters are identical across models.\n\n**Language behaviour on `lightning_v3.1_pro`:** pass `language: en` for UK + American accented English, pass `language: hi` for Indian accented English + Hindi (code-switching), or omit `language` to default to `en + hi` (mixed Indian + Western English coverage). Pro supports 31 languages total (10 Indic, 8 Asian & Middle Eastern, 13 European including Dutch and Swedish). Pass the matching ISO 639-1 code (e.g. `ta`, `de`, `ja`) with a Pro voice from that language, or use `auto` to route across all supported languages with any English or Hindi voice. See the [Lightning v3.1 Pro model card](/models/model-cards/text-to-speech/lightning-v-3-1-pro#supported-languages) for the full list. On `lightning_v3.1` the model accepts 20 language codes (10 European + 10 Indic) plus `auto`; the trained voice catalog covers 12 of those directly.\n\n## When to use this\n\n- **Use this** for short utterances you can render before playback (notifications, prompts, batch jobs, audio file generation).\n- **Use `/waves/v1/tts/live`** when you want playback to start before the full audio is ready (long passages, latency-sensitive apps).\n- **Use `/waves/v1/tts/live`** (WebSocket) when text arrives incrementally (LLM token streams, live captioning).\n\n## Key features\n\n- 44 kHz natural, expressive synthesis\n- Model selectable per request via `model` body parameter\n- Cloned voice IDs (`voice_*`) work on `lightning_v3.1` — same param as catalog voices\n- 20 accepted language codes on `lightning_v3.1` (12 with trained voices, 8 additional routed via English/Hindi voices). On `lightning_v3.1_pro`: 31 languages with dedicated voices (10 Indic, 8 Asian & Middle Eastern, 13 European); `language: en` → UK + American accented English; `language: hi` → Indian accented English + Hindi; omit `language` → defaults to `en + hi`. Both models accept `language: auto` for cross-language routing.\n- Output formats: `pcm`, `mp3`, `wav`, `ulaw`, `alaw`\n- Sample rates: 8 kHz – 44.1 kHz\n- Speed: 0.5× – 2×\n- Per-call pronunciation dictionaries via `pronunciation_dicts`\n\n## Examples\n\n**cURL — Lightning v3.1 (default)**\n```bash\ncurl -X POST \"https://api.smallest.ai/waves/v1/tts\" \\\n -H \"Authorization: Bearer $SMALLEST_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -H \"Accept: audio/wav\" \\\n -d '{\n \"text\": \"Hello from Waves TTS.\",\n \"voice_id\": \"magnus\",\n \"sample_rate\": 24000,\n \"output_format\": \"wav\"\n }' --output speech.wav\n```\n\n**cURL — Lightning v3.1 Pro (omit `language` → defaults to `en + hi`)**\n```bash\ncurl -X POST \"https://api.smallest.ai/waves/v1/tts\" \\\n -H \"Authorization: Bearer $SMALLEST_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -H \"Accept: audio/wav\" \\\n -d '{\n \"text\": \"Hello from the Lightning v3.1 Pro pool.\",\n \"voice_id\": \"meher\",\n \"model\": \"lightning_v3.1_pro\",\n \"sample_rate\": 24000,\n \"output_format\": \"wav\"\n }' --output speech.wav\n```\n\n**cURL — Lightning v3.1 Pro with explicit `language: en` (UK + American accented English)**\n```bash\ncurl -X POST \"https://api.smallest.ai/waves/v1/tts\" \\\n -H \"Authorization: Bearer $SMALLEST_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -H \"Accept: audio/wav\" \\\n -d '{\n \"text\": \"Good morning, this is a Pro voice speaking.\",\n \"voice_id\": \"meher\",\n \"model\": \"lightning_v3.1_pro\",\n \"language\": \"en\",\n \"sample_rate\": 24000,\n \"output_format\": \"wav\"\n }' --output speech.wav\n```\n\n**cURL — Lightning v3.1 Pro with explicit `language: hi` (Indian accented English + Hindi)**\n```bash\ncurl -X POST \"https://api.smallest.ai/waves/v1/tts\" \\\n -H \"Authorization: Bearer $SMALLEST_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -H \"Accept: audio/wav\" \\\n -d '{\n \"text\": \"Namaste, this is an Indian-accented Pro voice.\",\n \"voice_id\": \"meher\",\n \"model\": \"lightning_v3.1_pro\",\n \"language\": \"hi\",\n \"sample_rate\": 24000,\n \"output_format\": \"wav\"\n }' --output speech.wav\n```\n\n## Common gotchas\n\n- **Set `Accept: audio/wav`.** Omitting it can return an empty or unplayable response.\n- **Pair voice IDs with the right model.** Voice catalogs differ between `lightning_v3.1` and `lightning_v3.1_pro`. The API does not reject mismatched pairings, but using a Pro-only `voice_id` with `model=lightning_v3.1` (or omitting `model`) can return wrong or hallucinated audio. Pair Pro voices with `model=lightning_v3.1_pro`; standard catalog voices with `model=lightning_v3.1` (the default).\n- **Cloned voices** (`voice_*`) work with the pool they were cloned onto. The voice-cloning API accepts `model: lightning-v3.1` (default) or `lightning-v3.1-pro`; pair the resulting `voice_id` with the matching TTS `model` (`lightning_v3.1` or `lightning_v3.1_pro`). Check the clone's `modelIds` if unsure.\n- **44.1 kHz output** is supported but most playback environments are happy with 24 kHz — drop the sample rate if bandwidth matters.\n", "tags": [ @@ -97,7 +97,7 @@ }, "/waves/v1/tts/live": { "post": { - "operationId": "synthesize-speech-sse", + "operationId": "textToSpeech_synthesizeSpeechSse", "summary": "Stream speech (SSE)", "description": "Synthesize speech and stream the audio back over Server-Sent Events. Same body as `/waves/v1/tts` — the only difference is the response is a stream of base64-encoded PCM chunks instead of one binary blob.\n\nPick the model with the `model` body parameter, same as the sync route.\n\n\n **The same URL serves the WebSocket endpoint.** `wss://api.smallest.ai/waves/v1/tts/live` accepts a WebSocket upgrade for streaming-text scenarios (LLM token streams, live captioning). The HTTP `POST` documented on this page returns SSE; use `wss://` to use the WebSocket protocol instead. See the [WebSocket reference](/models/api-reference/text-to-speech/stream-speech-web-socket).\n\n\n## When to use this\n\n- **Use this** when you want playback to start before synthesis is complete — long passages, latency-sensitive UI, live narration.\n- **Use sync `/waves/v1/tts`** when total latency doesn't matter and you'd rather get one buffer.\n- **Use `/waves/v1/tts/live`** (WebSocket) when the *text* arrives incrementally (LLM token stream). SSE assumes you have the full text up front.\n\n## How it works\n\n1. POST your text + voice settings — same payload as `/waves/v1/tts`, plus optional `model`.\n2. The response is `Content-Type: text/event-stream`. Each chunk frame is `event: audio\\n` followed by `data: {\"audio\": \"\", \"done\": false, \"status\": \"206\"}\\n\\n`.\n3. Decode each chunk's `audio` field with base64 and feed the PCM bytes to your audio pipeline (browser `MediaSource`, ffmpeg pipe, raw PCM player, etc.).\n4. A final `data: {\"status\": \"200\", \"done\": true}\\n\\n` frame marks end of stream. Detect the terminator with `done == true`; every chunk frame also carries `done: false`, so `\"done\" in msg` matches every frame.\n\n## Examples\n\n**cURL**\n```bash\ncurl -N -X POST \"https://api.smallest.ai/waves/v1/tts/live\" \\\n -H \"Authorization: Bearer $SMALLEST_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"text\": \"Streaming this paragraph chunk by chunk so playback can start sooner.\",\n \"voice_id\": \"magnus\",\n \"sample_rate\": 24000,\n \"output_format\": \"pcm\"\n }'\n```\n\n## Common gotchas\n\n- **Use a streaming-friendly client.** `curl -N`, Python `iter_lines`, or a `fetch` `ReadableStream` reader. Buffering clients will hide the latency win.\n- **Audio is base64 inside the event payload**, not the raw event bytes. Decode the `data.audio` field per event.\n- **`output_format=pcm`** gives the lowest overhead for streaming playback. `wav`/`mp3` work but add per-chunk framing bytes.\n", "tags": [ @@ -177,7 +177,7 @@ }, "/waves/v1/{model}/get_voices": { "get": { - "operationId": "get-waves-voices", + "operationId": "voices_getWavesVoices", "summary": "Get voices for a pool", "description": "Return the voice catalog for the chosen Lightning v3.1 pool. Two pools:\n\n- `lightning-v3.1` — the Standard catalog. Supports voice cloning; 20 language codes.\n- `lightning-v3.1-pro` — the Pro catalog. Curated set across American, British, and Indian accents plus 29 additional languages. Same latency and concurrency as Standard, on dedicated inference.\n\nThe endpoint is pool-scoped: `/waves/v1/lightning-v3.1/get_voices` returns Standard voices only; `/waves/v1/lightning-v3.1-pro/get_voices` returns Pro voices only. Call one or both depending on which pool you plan to use.\n\nEach voice carries tags (`language`, `accent`, `gender`, `age`, `emotions`, `usecases`). Filter client-side to find the voices that match a target language, accent, or use case. Pass the returned `voiceId` as `voice_id` on the unified [`POST /waves/v1/tts`](/models/api-reference/text-to-speech/synthesize-speech) route, together with `\"model\": \"lightning_v3.1\"` (Standard) or `\"model\": \"lightning_v3.1_pro\"` (Pro).\n\nFor the canonical per-language voice list (with previews and recommended pairings), see the [Lightning v3.1](/models/model-cards/text-to-speech/lightning-v-3-1) and [Lightning v3.1 Pro](/models/model-cards/text-to-speech/lightning-v-3-1-pro) model cards.\n", "tags": [ @@ -240,7 +240,7 @@ }, "/waves/v1/voice-cloning": { "post": { - "operationId": "create-voice-clone", + "operationId": "voiceCloning_createVoiceClone", "summary": "Create a Voice Clone", "description": "Create an instant voice clone in a single call. Defaults to `lightning-v3.1`.\n", "tags": [ @@ -347,7 +347,7 @@ } }, "get": { - "operationId": "list-voice-clones", + "operationId": "voiceCloning_listVoiceClones", "summary": "List Voice Clones", "description": "Retrieve all voice clones in your organization.\n", "tags": [ @@ -399,7 +399,7 @@ }, "/waves/v1/pronunciation-dicts": { "get": { - "operationId": "get-pronunciation-dicts", + "operationId": "pronunciationDictionaries_getPronunciationDicts", "summary": "List", "description": "Retrieve all pronunciation dictionaries for the authenticated user", "tags": [ @@ -452,7 +452,7 @@ } }, "post": { - "operationId": "create-pronunciation-dict", + "operationId": "pronunciationDictionaries_createPronunciationDict", "summary": "Create", "description": "Create a new pronunciation dictionary for the authenticated user", "tags": [ @@ -521,7 +521,7 @@ } }, "put": { - "operationId": "update-pronunciation-dict", + "operationId": "pronunciationDictionaries_updatePronunciationDict", "summary": "Update", "description": "Update an existing pronunciation dictionary for the authenticated user", "tags": [ @@ -590,7 +590,7 @@ } }, "delete": { - "operationId": "delete-pronunciation-dict", + "operationId": "pronunciationDictionaries_deletePronunciationDict", "summary": "Delete", "description": "Delete an existing pronunciation dictionary for the authenticated user", "tags": [ @@ -661,7 +661,7 @@ }, "/waves/v1/stt/": { "post": { - "operationId": "transcribe", + "operationId": "speechToText_transcribe", "summary": "Transcribe (Pre-recorded)", "description": "Transcribe an audio file. The model is chosen via `?model=`:\n\n- `?model=pulse-pro`: English-only, leaderboard-ranked accuracy. Raw bytes only; pass `webhook_url` to receive transcription asynchronously on long files.\n- `?model=pulse`: multilingual transcription (21 streaming + 26 pre-recorded languages), supports both raw bytes and audio-by-URL.\n\n## When to use this\n\nUse this endpoint when you have a complete audio file (call recording, voicemail, podcast episode) and want the transcript back in one response. For live transcription as audio arrives, use the realtime WebSocket endpoint (`WS /waves/v1/stt/live`) instead.\n\nPulse Pro has no streaming worker today; calls to `WS /waves/v1/stt/live?model=pulse-pro` return `400` before the WebSocket upgrades.\n\n## Input methods\n\n- **Raw bytes**: `Content-Type: application/octet-stream` with the audio in the body. All knobs are query parameters.\n- **URL (`?model=pulse` only)**: `Content-Type: application/json` with `{\"url\": \"...\"}` in the body.\n\n## Examples\n\n**cURL**: Pulse Pro, sync\n```bash\ncurl -X POST \"https://api.smallest.ai/waves/v1/stt/?model=pulse-pro&language=en&word_timestamps=true\" \\\n -H \"Authorization: Bearer $SMALLEST_API_KEY\" \\\n -H \"Content-Type: application/octet-stream\" \\\n --data-binary \"@./call.wav\"\n```\n\n**cURL**: Pulse Pro, async via webhook\n```bash\ncurl -X POST \"https://api.smallest.ai/waves/v1/stt/?model=pulse-pro&language=en&webhook_url=https://your.app/cb\" \\\n -H \"Authorization: Bearer $SMALLEST_API_KEY\" \\\n -H \"Content-Type: application/octet-stream\" \\\n --data-binary \"@./call.wav\"\n```\nReturns `200 { \"status\": \"processing\", \"request_id\": \"...\" }` immediately. The webhook receives the full transcription when ready.\n\n**cURL**: Pulse, audio-by-URL\n```bash\ncurl -X POST \"https://api.smallest.ai/waves/v1/stt/?model=pulse&language=en\" \\\n -H \"Authorization: Bearer $SMALLEST_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"url\": \"https://your-bucket.s3.amazonaws.com/call.wav\"}'\n```\n\n**Python**\n```python\nimport requests\n\nwith open(\"./call.wav\", \"rb\") as f:\n audio = f.read()\n\nr = requests.post(\n \"https://api.smallest.ai/waves/v1/stt/\",\n params={\"model\": \"pulse-pro\", \"language\": \"en\", \"word_timestamps\": \"true\"},\n headers={\"Authorization\": f\"Bearer {API_KEY}\", \"Content-Type\": \"application/octet-stream\"},\n data=audio,\n)\nr.raise_for_status()\nprint(r.json()[\"transcription\"])\n```\n\n**JavaScript / TypeScript**\n```typescript\nimport { readFileSync } from \"node:fs\";\n\nconst audio = readFileSync(\"./call.wav\");\nconst params = new URLSearchParams({ model: \"pulse-pro\", language: \"en\", word_timestamps: \"true\" });\n\nconst res = await fetch(`https://api.smallest.ai/waves/v1/stt/?${params}`, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${process.env.SMALLEST_API_KEY}`, \"Content-Type\": \"application/octet-stream\" },\n body: audio,\n});\nconsole.log((await res.json()).transcription);\n```\n\n## Common gotchas\n\n- **`model` is required.** Missing or invalid values return `400` with an enum-validation error.\n- **Pulse Pro is English only.** Pass `language=en`. Other language codes are accepted at the wire level but produce unpredictable output.\n- **Pulse Pro does not support audio-by-URL.** Send raw bytes or use `?model=pulse` for the URL flow.\n- **Max payload 250 MB.** Larger requests return `413`. Compress to mono 16 kHz PCM if you are close to the limit; quality is unaffected.\n", "tags": [ @@ -884,7 +884,7 @@ }, "/waves/v1/chat/completions": { "post": { - "operationId": "complete", + "operationId": "electron_complete", "summary": "Chat Completions (Electron)", "description": "Generate a chat completion with Electron. OpenAI-compatible\nrequest/response shape — point any OpenAI SDK at\n`https://api.smallest.ai/waves/v1` and it just works.\n\nSet `stream: true` to receive tokens via Server-Sent Events. With\n`stream_options: { include_usage: true }`, the final SSE chunk\ncarries the `usage` block so token accounting is exact even on\nclient disconnects.\n\nTool calling follows OpenAI's `tools` array convention. When you\nprovide a voice-agent-style system prompt, Electron emits a short\nfiller phrase in the assistant message `content` field alongside\n`tool_calls` — see the [Tool Calling guide](/models/documentation/llm-electron/tool-function-calling)\nfor the voice-agent pattern.\n\n## Examples\n\n**cURL**\n```bash\ncurl -X POST \"https://api.smallest.ai/waves/v1/chat/completions\" \\\n -H \"Authorization: Bearer $SMALLEST_API_KEY\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"model\": \"electron\",\n \"messages\": [\n {\"role\": \"user\", \"content\": \"Write one sentence about why the sky is blue.\"}\n ]\n }'\n```\n\n**Python** (`pip install openai`)\n```python\nimport os\nfrom openai import OpenAI\n\nclient = OpenAI(\n base_url=\"https://api.smallest.ai/waves/v1\",\n api_key=os.environ[\"SMALLEST_API_KEY\"],\n)\n\nresponse = client.chat.completions.create(\n model=\"electron\",\n messages=[\n {\"role\": \"user\", \"content\": \"Write one sentence about why the sky is blue.\"}\n ],\n)\n\nprint(response.choices[0].message.content)\n```\n\n**JavaScript / TypeScript** (`npm install openai`)\n```typescript\nimport OpenAI from \"openai\";\n\nconst client = new OpenAI({\n baseURL: \"https://api.smallest.ai/waves/v1\",\n apiKey: process.env.SMALLEST_API_KEY,\n});\n\nconst response = await client.chat.completions.create({\n model: \"electron\",\n messages: [\n { role: \"user\", content: \"Write one sentence about why the sky is blue.\" },\n ],\n});\n\nconsole.log(response.choices[0].message.content);\n```\n\n**Streaming with usage** (Python)\n```python\nstream = client.chat.completions.create(\n model=\"electron\",\n messages=[{\"role\": \"user\", \"content\": \"Tell me a one-sentence fun fact.\"}],\n stream=True,\n stream_options={\"include_usage\": True},\n)\nfor chunk in stream:\n if chunk.choices and chunk.choices[0].delta.content:\n print(chunk.choices[0].delta.content, end=\"\", flush=True)\n if chunk.usage:\n print(f\"\\n\\nTokens: {chunk.usage.total_tokens}\")\n```\n\n## Common gotchas\n\n- **Base URL is `/waves/v1`**, not `/v1`. The OpenAI SDK appends `/chat/completions` for you.\n- **`stream_options.include_usage: true`** is required for exact token accounting on streaming calls — the final SSE chunk carries the `usage` block.\n- **`n > 1` and `prompt_logprobs` are rejected.** Use multiple requests if you need parallel completions.\n- **Auth header is `Authorization: Bearer $SMALLEST_API_KEY`** — get the key from the [Smallest AI Console](https://app.smallest.ai/dashboard/api-keys).\n", "tags": [