diff --git a/src/libs/Speechify/Generated/Speechify.ConversationsClient.List.g.cs b/src/libs/Speechify/Generated/Speechify.ConversationsClient.List.g.cs index aa89bb6b..d52fdce6 100644 --- a/src/libs/Speechify/Generated/Speechify.ConversationsClient.List.g.cs +++ b/src/libs/Speechify/Generated/Speechify.ConversationsClient.List.g.cs @@ -32,6 +32,8 @@ partial void PrepareListArguments( ref string? agentId, ref global::Speechify.ConversationStatus? status, ref global::Speechify.ConversationTransport? transport, + ref global::Speechify.ConversationChannel? channel, + ref bool? live, ref string? callerIdentity, ref string? contactId, ref string? q, @@ -49,6 +51,8 @@ partial void PrepareListRequest( string? agentId, global::Speechify.ConversationStatus? status, global::Speechify.ConversationTransport? transport, + global::Speechify.ConversationChannel? channel, + bool? live, string? callerIdentity, string? contactId, string? q, @@ -85,11 +89,28 @@ partial void ProcessListResponseContent( /// /// /// - /// How the caller reached the agent. `web` is the browser /
+ /// Which runtime carried the conversation. `web` is the browser /
/// SDK realtime path; the `sip_*` and `phone` variants come
- /// from the telephony stack; `text` is the text/chat channel
- /// (turn-based, roomless, no call duration). + /// from the telephony stack; `text` is the turn-based, roomless
+ /// runtime (no call duration) that the message API and every
+ /// messaging channel share.
+ /// A conversation reports the transport it actually ran on:
+ /// `web`, `sip_inbound`, `sip_outbound` or `text`. `phone` is
+ /// selectable when filtering a list and matches calls in either
+ /// direction; `whatsapp` is reserved and matches nothing today.
+ /// To tell two conversations on the same transport apart, filter
+ /// or read `channel` instead. /// + /// + /// Which front door the conversation arrived through, one level
+ /// coarser than `transport`, and the value to display or group a
+ /// conversation's channel by. Both telephony directions are
+ /// `voice`; the browser / SDK realtime path is `web`; the message
+ /// API is `text`; a conversation reached over a provider front
+ /// door names that provider (`slack`) rather than the transport it
+ /// shares with the message API. + /// + /// /// /// /// @@ -108,6 +129,8 @@ partial void ProcessListResponseContent( string? agentId = default, global::Speechify.ConversationStatus? status = default, global::Speechify.ConversationTransport? transport = default, + global::Speechify.ConversationChannel? channel = default, + bool? live = default, string? callerIdentity = default, string? contactId = default, string? q = default, @@ -126,6 +149,8 @@ partial void ProcessListResponseContent( agentId: agentId, status: status, transport: transport, + channel: channel, + live: live, callerIdentity: callerIdentity, contactId: contactId, q: q, @@ -159,11 +184,28 @@ partial void ProcessListResponseContent( /// /// /// - /// How the caller reached the agent. `web` is the browser /
+ /// Which runtime carried the conversation. `web` is the browser /
/// SDK realtime path; the `sip_*` and `phone` variants come
- /// from the telephony stack; `text` is the text/chat channel
- /// (turn-based, roomless, no call duration). + /// from the telephony stack; `text` is the turn-based, roomless
+ /// runtime (no call duration) that the message API and every
+ /// messaging channel share.
+ /// A conversation reports the transport it actually ran on:
+ /// `web`, `sip_inbound`, `sip_outbound` or `text`. `phone` is
+ /// selectable when filtering a list and matches calls in either
+ /// direction; `whatsapp` is reserved and matches nothing today.
+ /// To tell two conversations on the same transport apart, filter
+ /// or read `channel` instead. + /// + /// + /// Which front door the conversation arrived through, one level
+ /// coarser than `transport`, and the value to display or group a
+ /// conversation's channel by. Both telephony directions are
+ /// `voice`; the browser / SDK realtime path is `web`; the message
+ /// API is `text`; a conversation reached over a provider front
+ /// door names that provider (`slack`) rather than the transport it
+ /// shares with the message API. /// + /// /// /// /// @@ -182,6 +224,8 @@ partial void ProcessListResponseContent( string? agentId = default, global::Speechify.ConversationStatus? status = default, global::Speechify.ConversationTransport? transport = default, + global::Speechify.ConversationChannel? channel = default, + bool? live = default, string? callerIdentity = default, string? contactId = default, string? q = default, @@ -203,6 +247,8 @@ partial void ProcessListResponseContent( agentId: ref agentId, status: ref status, transport: ref transport, + channel: ref channel, + live: ref live, callerIdentity: ref callerIdentity, contactId: ref contactId, q: ref q, @@ -245,6 +291,8 @@ partial void ProcessListResponseContent( .AddOptionalParameter("agent_id", agentId) .AddOptionalParameter("status", status?.ToValueString()) .AddOptionalParameter("transport", transport?.ToValueString()) + .AddOptionalParameter("channel", channel?.ToValueString()) + .AddOptionalParameter("live", live?.ToString().ToLowerInvariant()) .AddOptionalParameter("caller_identity", callerIdentity) .AddOptionalParameter("contact_id", contactId) .AddOptionalParameter("q", q) @@ -305,6 +353,8 @@ partial void ProcessListResponseContent( agentId: agentId, status: status, transport: transport, + channel: channel, + live: live, callerIdentity: callerIdentity, contactId: contactId, q: q, diff --git a/src/libs/Speechify/Generated/Speechify.ConversationsClient.Stats.g.cs b/src/libs/Speechify/Generated/Speechify.ConversationsClient.Stats.g.cs index e33e547e..c8ee4fa5 100644 --- a/src/libs/Speechify/Generated/Speechify.ConversationsClient.Stats.g.cs +++ b/src/libs/Speechify/Generated/Speechify.ConversationsClient.Stats.g.cs @@ -30,6 +30,8 @@ partial void PrepareStatsArguments( ref string? agentId, ref global::Speechify.ConversationStatus? status, ref global::Speechify.ConversationTransport? transport, + ref global::Speechify.ConversationChannel? channel, + ref bool? live, ref string? callerIdentity, ref string? contactId, ref string? q, @@ -45,6 +47,8 @@ partial void PrepareStatsRequest( string? agentId, global::Speechify.ConversationStatus? status, global::Speechify.ConversationTransport? transport, + global::Speechify.ConversationChannel? channel, + bool? live, string? callerIdentity, string? contactId, string? q, @@ -71,11 +75,28 @@ partial void ProcessStatsResponseContent( /// /// /// - /// How the caller reached the agent. `web` is the browser /
+ /// Which runtime carried the conversation. `web` is the browser /
/// SDK realtime path; the `sip_*` and `phone` variants come
- /// from the telephony stack; `text` is the text/chat channel
- /// (turn-based, roomless, no call duration). + /// from the telephony stack; `text` is the turn-based, roomless
+ /// runtime (no call duration) that the message API and every
+ /// messaging channel share.
+ /// A conversation reports the transport it actually ran on:
+ /// `web`, `sip_inbound`, `sip_outbound` or `text`. `phone` is
+ /// selectable when filtering a list and matches calls in either
+ /// direction; `whatsapp` is reserved and matches nothing today.
+ /// To tell two conversations on the same transport apart, filter
+ /// or read `channel` instead. /// + /// + /// Which front door the conversation arrived through, one level
+ /// coarser than `transport`, and the value to display or group a
+ /// conversation's channel by. Both telephony directions are
+ /// `voice`; the browser / SDK realtime path is `web`; the message
+ /// API is `text`; a conversation reached over a provider front
+ /// door names that provider (`slack`) rather than the transport it
+ /// shares with the message API. + /// + /// /// /// /// @@ -92,6 +113,8 @@ partial void ProcessStatsResponseContent( string? agentId = default, global::Speechify.ConversationStatus? status = default, global::Speechify.ConversationTransport? transport = default, + global::Speechify.ConversationChannel? channel = default, + bool? live = default, string? callerIdentity = default, string? contactId = default, string? q = default, @@ -108,6 +131,8 @@ partial void ProcessStatsResponseContent( agentId: agentId, status: status, transport: transport, + channel: channel, + live: live, callerIdentity: callerIdentity, contactId: contactId, q: q, @@ -131,11 +156,28 @@ partial void ProcessStatsResponseContent( /// /// /// - /// How the caller reached the agent. `web` is the browser /
+ /// Which runtime carried the conversation. `web` is the browser /
/// SDK realtime path; the `sip_*` and `phone` variants come
- /// from the telephony stack; `text` is the text/chat channel
- /// (turn-based, roomless, no call duration). + /// from the telephony stack; `text` is the turn-based, roomless
+ /// runtime (no call duration) that the message API and every
+ /// messaging channel share.
+ /// A conversation reports the transport it actually ran on:
+ /// `web`, `sip_inbound`, `sip_outbound` or `text`. `phone` is
+ /// selectable when filtering a list and matches calls in either
+ /// direction; `whatsapp` is reserved and matches nothing today.
+ /// To tell two conversations on the same transport apart, filter
+ /// or read `channel` instead. + /// + /// + /// Which front door the conversation arrived through, one level
+ /// coarser than `transport`, and the value to display or group a
+ /// conversation's channel by. Both telephony directions are
+ /// `voice`; the browser / SDK realtime path is `web`; the message
+ /// API is `text`; a conversation reached over a provider front
+ /// door names that provider (`slack`) rather than the transport it
+ /// shares with the message API. /// + /// /// /// /// @@ -152,6 +194,8 @@ partial void ProcessStatsResponseContent( string? agentId = default, global::Speechify.ConversationStatus? status = default, global::Speechify.ConversationTransport? transport = default, + global::Speechify.ConversationChannel? channel = default, + bool? live = default, string? callerIdentity = default, string? contactId = default, string? q = default, @@ -171,6 +215,8 @@ partial void ProcessStatsResponseContent( agentId: ref agentId, status: ref status, transport: ref transport, + channel: ref channel, + live: ref live, callerIdentity: ref callerIdentity, contactId: ref contactId, q: ref q, @@ -211,6 +257,8 @@ partial void ProcessStatsResponseContent( .AddOptionalParameter("agent_id", agentId) .AddOptionalParameter("status", status?.ToValueString()) .AddOptionalParameter("transport", transport?.ToValueString()) + .AddOptionalParameter("channel", channel?.ToValueString()) + .AddOptionalParameter("live", live?.ToString().ToLowerInvariant()) .AddOptionalParameter("caller_identity", callerIdentity) .AddOptionalParameter("contact_id", contactId) .AddOptionalParameter("q", q) @@ -269,6 +317,8 @@ partial void ProcessStatsResponseContent( agentId: agentId, status: status, transport: transport, + channel: channel, + live: live, callerIdentity: callerIdentity, contactId: contactId, q: q, diff --git a/src/libs/Speechify/Generated/Speechify.DocumentsClient.AggregateDocuments.g.cs b/src/libs/Speechify/Generated/Speechify.DocumentsClient.AggregateDocuments.g.cs new file mode 100644 index 00000000..e642a150 --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.DocumentsClient.AggregateDocuments.g.cs @@ -0,0 +1,705 @@ + +#nullable enable + +namespace Speechify +{ + public partial class DocumentsClient + { + + + private static readonly global::Speechify.EndPointSecurityRequirement s_AggregateDocumentsSecurityRequirement0 = + new global::Speechify.EndPointSecurityRequirement + { + Authorizations = new global::Speechify.EndPointAuthorizationRequirement[] + { new global::Speechify.EndPointAuthorizationRequirement + { + Type = "Http", + SchemeId = "HttpBearer", + Location = "Header", + Name = "Bearer", + FriendlyName = "Bearer", + }, + }, + }; + private static readonly global::Speechify.EndPointSecurityRequirement[] s_AggregateDocumentsSecurityRequirements = + new global::Speechify.EndPointSecurityRequirement[] + { s_AggregateDocumentsSecurityRequirement0, + }; + partial void PrepareAggregateDocumentsArguments( + global::System.Net.Http.HttpClient httpClient, + ref string storeId, + ref string collection, + ref string? speechifyVersion, + global::Speechify.StoreAggregateQuery request); + partial void PrepareAggregateDocumentsRequest( + global::System.Net.Http.HttpClient httpClient, + global::System.Net.Http.HttpRequestMessage httpRequestMessage, + string storeId, + string collection, + string? speechifyVersion, + global::Speechify.StoreAggregateQuery request); + partial void ProcessAggregateDocumentsResponse( + global::System.Net.Http.HttpClient httpClient, + global::System.Net.Http.HttpResponseMessage httpResponseMessage); + + partial void ProcessAggregateDocumentsResponseContent( + global::System.Net.Http.HttpClient httpClient, + global::System.Net.Http.HttpResponseMessage httpResponseMessage, + ref string content); + + /// + /// Aggregate Documents
+ /// Count, sum, average, min or max over a collection, filtered with the
+ /// same `where` a query takes and optionally grouped by one field, in
+ /// one request. It runs on each document's indexed projection (its
+ /// top-level string / number / boolean / null fields), never on the
+ /// bodies: a nested value does not exist to it, a string longer than 256
+ /// characters groups by its first 256 and the answer says
+ /// `key_truncated` when that happened, and at most 100 groups come back,
+ /// largest first (`groups_truncated`). A read carrying a body, hence a
+ /// POST on a literal sub-path; `aggregate` is a reserved document id.
+ /// This is the last operation the query surface takes. A store is a
+ /// Firestore-shaped document store: filter, order, page and aggregate on
+ /// top-level fields. No joins, nested-field filters, full-text search or
+ /// SQL follow; a customer who needs more brings their own database
+ /// through a webhook or MCP tool, or pulls a collection into a run's
+ /// sandbox.
+ /// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). + ///
+ /// + /// + /// + /// + /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. + /// The token to cancel the operation with + /// + public async global::System.Threading.Tasks.Task AggregateDocumentsAsync( + string storeId, + string collection, + + global::Speechify.StoreAggregateQuery request, + string? speechifyVersion = default, + global::Speechify.AutoSDKRequestOptions? requestOptions = default, + global::System.Threading.CancellationToken cancellationToken = default) + { + var __response = await AggregateDocumentsAsResponseAsync( + storeId: storeId, + collection: collection, + + request: request, + speechifyVersion: speechifyVersion, + requestOptions: requestOptions, + cancellationToken: cancellationToken + ).ConfigureAwait(false); + + return __response.Body; + } + /// + /// Aggregate Documents
+ /// Count, sum, average, min or max over a collection, filtered with the
+ /// same `where` a query takes and optionally grouped by one field, in
+ /// one request. It runs on each document's indexed projection (its
+ /// top-level string / number / boolean / null fields), never on the
+ /// bodies: a nested value does not exist to it, a string longer than 256
+ /// characters groups by its first 256 and the answer says
+ /// `key_truncated` when that happened, and at most 100 groups come back,
+ /// largest first (`groups_truncated`). A read carrying a body, hence a
+ /// POST on a literal sub-path; `aggregate` is a reserved document id.
+ /// This is the last operation the query surface takes. A store is a
+ /// Firestore-shaped document store: filter, order, page and aggregate on
+ /// top-level fields. No joins, nested-field filters, full-text search or
+ /// SQL follow; a customer who needs more brings their own database
+ /// through a webhook or MCP tool, or pulls a collection into a run's
+ /// sandbox.
+ /// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). + ///
+ /// + /// + /// + /// + /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. + /// The token to cancel the operation with + /// + public async global::System.Threading.Tasks.Task> AggregateDocumentsAsResponseAsync( + string storeId, + string collection, + + global::Speechify.StoreAggregateQuery request, + string? speechifyVersion = default, + global::Speechify.AutoSDKRequestOptions? requestOptions = default, + global::System.Threading.CancellationToken cancellationToken = default) + { + request = request ?? throw new global::System.ArgumentNullException(nameof(request)); + + PrepareArguments( + client: HttpClient); + PrepareAggregateDocumentsArguments( + httpClient: HttpClient, + storeId: ref storeId, + collection: ref collection, + speechifyVersion: ref speechifyVersion, + request: request); + + + var __authorizations = global::Speechify.EndPointSecurityResolver.ResolveAuthorizations( + availableAuthorizations: Authorizations, + securityRequirements: s_AggregateDocumentsSecurityRequirements, + operationName: "AggregateDocumentsAsync"); + + using var __timeoutCancellationTokenSource = global::Speechify.AutoSDKRequestOptionsSupport.CreateTimeoutCancellationTokenSource( + clientOptions: Options, + requestOptions: requestOptions, + cancellationToken: cancellationToken); + var __effectiveCancellationToken = __timeoutCancellationTokenSource?.Token ?? cancellationToken; + var __effectiveReadResponseAsString = global::Speechify.AutoSDKRequestOptionsSupport.GetReadResponseAsString( + clientOptions: Options, + requestOptions: requestOptions, + fallbackValue: ReadResponseAsString); + var __maxAttempts = global::Speechify.AutoSDKRequestOptionsSupport.GetMaxAttempts( + clientOptions: Options, + requestOptions: requestOptions, + supportsRetry: true); + + global::System.Net.Http.HttpRequestMessage __CreateHttpRequest() + { + + var __pathBuilder = new global::Speechify.PathBuilder( + path: $"/v1/stores/{storeId}/collections/{collection}/documents/aggregate", + baseUri: HttpClient.BaseAddress); + var __path = __pathBuilder.ToString(); + __path = global::Speechify.AutoSDKRequestOptionsSupport.AppendQueryParameters( + path: __path, + clientParameters: Options.QueryParameters, + requestParameters: requestOptions?.QueryParameters); + var __httpRequest = new global::System.Net.Http.HttpRequestMessage( + method: global::System.Net.Http.HttpMethod.Post, + requestUri: new global::System.Uri(__path, global::System.UriKind.RelativeOrAbsolute)); +#if NET6_0_OR_GREATER + __httpRequest.Version = global::System.Net.HttpVersion.Version11; + __httpRequest.VersionPolicy = global::System.Net.Http.HttpVersionPolicy.RequestVersionOrHigher; +#endif + + foreach (var __authorization in __authorizations) + { + if (__authorization.Type == "Http" || + __authorization.Type == "OAuth2" || + __authorization.Type == "OpenIdConnect") + { + __httpRequest.Headers.Authorization = new global::System.Net.Http.Headers.AuthenticationHeaderValue( + scheme: __authorization.Name, + parameter: __authorization.Value); + } + else if (__authorization.Type == "ApiKey" && + __authorization.Location == "Header") + { + __httpRequest.Headers.Add(__authorization.Name, __authorization.Value); + } + } + + if (speechifyVersion != default) + { + __httpRequest.Headers.TryAddWithoutValidation("Speechify-Version", speechifyVersion.ToString()); + } + + var __httpRequestContentBody = request.ToJson(JsonSerializerContext); + var __httpRequestContent = new global::System.Net.Http.StringContent( + content: __httpRequestContentBody, + encoding: global::System.Text.Encoding.UTF8, + mediaType: "application/json"); + __httpRequest.Content = __httpRequestContent; + global::Speechify.AutoSDKRequestOptionsSupport.ApplyHeaders( + request: __httpRequest, + clientHeaders: Options.Headers, + requestHeaders: requestOptions?.Headers); + + PrepareRequest( + client: HttpClient, + request: __httpRequest); + PrepareAggregateDocumentsRequest( + httpClient: HttpClient, + httpRequestMessage: __httpRequest, + storeId: storeId!, + collection: collection!, + speechifyVersion: speechifyVersion, + request: request); + + return __httpRequest; + } + + global::System.Net.Http.HttpRequestMessage? __httpRequest = null; + global::System.Net.Http.HttpResponseMessage? __response = null; + var __attemptNumber = 0; + try + { + for (var __attempt = 1; __attempt <= __maxAttempts; __attempt++) + { + __attemptNumber = __attempt; + __httpRequest = __CreateHttpRequest(); + await global::Speechify.AutoSDKRequestOptionsSupport.OnBeforeRequestAsync( + clientOptions: Options, + context: global::Speechify.AutoSDKRequestOptionsSupport.CreateHookContext( + operationId: "AggregateDocuments", + methodName: "AggregateDocumentsAsync", + pathTemplate: "$\"/v1/stores/{storeId}/collections/{collection}/documents/aggregate\"", + httpMethod: "POST", + baseUri: BaseUri, + request: __httpRequest!, + response: null, + exception: null, + clientOptions: Options, + requestOptions: requestOptions, + attempt: __attempt, + maxAttempts: __maxAttempts, + willRetry: false, + retryDelay: null, + retryReason: global::System.String.Empty, + cancellationToken: __effectiveCancellationToken)).ConfigureAwait(false); + try + { + __response = await HttpClient.SendAsync( + request: __httpRequest, + completionOption: global::System.Net.Http.HttpCompletionOption.ResponseContentRead, + cancellationToken: __effectiveCancellationToken).ConfigureAwait(false); + } + catch (global::System.Net.Http.HttpRequestException __exception) + { + var __retryDelay = global::Speechify.AutoSDKRequestOptionsSupport.GetRetryDelay( + clientOptions: Options, + requestOptions: requestOptions, + response: null, + attempt: __attempt); + var __willRetry = __attempt < __maxAttempts && !__effectiveCancellationToken.IsCancellationRequested; + await global::Speechify.AutoSDKRequestOptionsSupport.OnAfterErrorAsync( + clientOptions: Options, + context: global::Speechify.AutoSDKRequestOptionsSupport.CreateHookContext( + operationId: "AggregateDocuments", + methodName: "AggregateDocumentsAsync", + pathTemplate: "$\"/v1/stores/{storeId}/collections/{collection}/documents/aggregate\"", + httpMethod: "POST", + baseUri: BaseUri, + request: __httpRequest!, + response: null, + exception: __exception, + clientOptions: Options, + requestOptions: requestOptions, + attempt: __attempt, + maxAttempts: __maxAttempts, + willRetry: __willRetry, + retryDelay: __willRetry ? __retryDelay : (global::System.TimeSpan?)null, + retryReason: "exception", + cancellationToken: __effectiveCancellationToken)).ConfigureAwait(false); + if (!__willRetry) + { + throw; + } + + __httpRequest.Dispose(); + __httpRequest = null; + await global::Speechify.AutoSDKRequestOptionsSupport.DelayBeforeRetryAsync( + retryDelay: __retryDelay, + cancellationToken: __effectiveCancellationToken).ConfigureAwait(false); + continue; + } + + if (__response != null && + __attempt < __maxAttempts && + global::Speechify.AutoSDKRequestOptionsSupport.ShouldRetryStatusCode(__response.StatusCode)) + { + var __retryDelay = global::Speechify.AutoSDKRequestOptionsSupport.GetRetryDelay( + clientOptions: Options, + requestOptions: requestOptions, + response: __response, + attempt: __attempt); + await global::Speechify.AutoSDKRequestOptionsSupport.OnAfterErrorAsync( + clientOptions: Options, + context: global::Speechify.AutoSDKRequestOptionsSupport.CreateHookContext( + operationId: "AggregateDocuments", + methodName: "AggregateDocumentsAsync", + pathTemplate: "$\"/v1/stores/{storeId}/collections/{collection}/documents/aggregate\"", + httpMethod: "POST", + baseUri: BaseUri, + request: __httpRequest!, + response: __response, + exception: null, + clientOptions: Options, + requestOptions: requestOptions, + attempt: __attempt, + maxAttempts: __maxAttempts, + willRetry: true, + retryDelay: __retryDelay, + retryReason: "status:" + ((int)__response.StatusCode).ToString(global::System.Globalization.CultureInfo.InvariantCulture), + cancellationToken: __effectiveCancellationToken)).ConfigureAwait(false); + __response.Dispose(); + __response = null; + __httpRequest.Dispose(); + __httpRequest = null; + await global::Speechify.AutoSDKRequestOptionsSupport.DelayBeforeRetryAsync( + retryDelay: __retryDelay, + cancellationToken: __effectiveCancellationToken).ConfigureAwait(false); + continue; + } + + break; + } + + if (__response == null) + { + throw new global::System.InvalidOperationException("No response received."); + } + + using (__response) + { + + ProcessResponse( + client: HttpClient, + response: __response); + ProcessAggregateDocumentsResponse( + httpClient: HttpClient, + httpResponseMessage: __response); + if (__response.IsSuccessStatusCode) + { + await global::Speechify.AutoSDKRequestOptionsSupport.OnAfterSuccessAsync( + clientOptions: Options, + context: global::Speechify.AutoSDKRequestOptionsSupport.CreateHookContext( + operationId: "AggregateDocuments", + methodName: "AggregateDocumentsAsync", + pathTemplate: "$\"/v1/stores/{storeId}/collections/{collection}/documents/aggregate\"", + httpMethod: "POST", + baseUri: BaseUri, + request: __httpRequest!, + response: __response, + exception: null, + clientOptions: Options, + requestOptions: requestOptions, + attempt: __attemptNumber, + maxAttempts: __maxAttempts, + willRetry: false, + retryDelay: null, + retryReason: global::System.String.Empty, + cancellationToken: __effectiveCancellationToken)).ConfigureAwait(false); + } + else + { + await global::Speechify.AutoSDKRequestOptionsSupport.OnAfterErrorAsync( + clientOptions: Options, + context: global::Speechify.AutoSDKRequestOptionsSupport.CreateHookContext( + operationId: "AggregateDocuments", + methodName: "AggregateDocumentsAsync", + pathTemplate: "$\"/v1/stores/{storeId}/collections/{collection}/documents/aggregate\"", + httpMethod: "POST", + baseUri: BaseUri, + request: __httpRequest!, + response: __response, + exception: null, + clientOptions: Options, + requestOptions: requestOptions, + attempt: __attemptNumber, + maxAttempts: __maxAttempts, + willRetry: false, + retryDelay: null, + retryReason: global::System.String.Empty, + cancellationToken: __effectiveCancellationToken)).ConfigureAwait(false); + } + // The request was malformed or failed validation. The response body is the standard `Error` envelope; for validation failures `error.fields` enumerates the offending fields as a `path -> message` map (code = `validation_failed`). + if ((int)__response.StatusCode == 400) + { + string? __content_400 = null; + global::System.Exception? __exception_400 = null; + global::Speechify.Error? __value_400 = null; + try + { + if (__effectiveReadResponseAsString) + { + __content_400 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + __value_400 = global::Speechify.Error.FromJson(__content_400, JsonSerializerContext); + } + else + { + __content_400 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + + __value_400 = global::Speechify.Error.FromJson(__content_400, JsonSerializerContext); + } + } + catch (global::System.Exception __ex) + { + __exception_400 = __ex; + } + + + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content_400 ?? __response.ReasonPhrase ?? string.Empty, + innerException: __exception_400, + responseBody: __content_400, + responseObject: __value_400, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } + // Authentication is missing or invalid. The request did not carry a recognised credential (console session token, API key, or worker JWT). + if ((int)__response.StatusCode == 401) + { + string? __content_401 = null; + global::System.Exception? __exception_401 = null; + global::Speechify.Error? __value_401 = null; + try + { + if (__effectiveReadResponseAsString) + { + __content_401 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + __value_401 = global::Speechify.Error.FromJson(__content_401, JsonSerializerContext); + } + else + { + __content_401 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + + __value_401 = global::Speechify.Error.FromJson(__content_401, JsonSerializerContext); + } + } + catch (global::System.Exception __ex) + { + __exception_401 = __ex; + } + + + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content_401 ?? __response.ReasonPhrase ?? string.Empty, + innerException: __exception_401, + responseBody: __content_401, + responseObject: __value_401, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } + // The workspace has insufficient credits, or the request needs a plan tier the workspace is not on (e.g. voice cloning). Distinct from `Forbidden` so SDK consumers can drive upgrade UX. + if ((int)__response.StatusCode == 402) + { + string? __content_402 = null; + global::System.Exception? __exception_402 = null; + global::Speechify.Error? __value_402 = null; + try + { + if (__effectiveReadResponseAsString) + { + __content_402 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + __value_402 = global::Speechify.Error.FromJson(__content_402, JsonSerializerContext); + } + else + { + __content_402 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + + __value_402 = global::Speechify.Error.FromJson(__content_402, JsonSerializerContext); + } + } + catch (global::System.Exception __ex) + { + __exception_402 = __ex; + } + + + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content_402 ?? __response.ReasonPhrase ?? string.Empty, + innerException: __exception_402, + responseBody: __content_402, + responseObject: __value_402, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } + // The referenced resource does not exist or is not visible to the caller's workspace. + if ((int)__response.StatusCode == 404) + { + string? __content_404 = null; + global::System.Exception? __exception_404 = null; + global::Speechify.Error? __value_404 = null; + try + { + if (__effectiveReadResponseAsString) + { + __content_404 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + __value_404 = global::Speechify.Error.FromJson(__content_404, JsonSerializerContext); + } + else + { + __content_404 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + + __value_404 = global::Speechify.Error.FromJson(__content_404, JsonSerializerContext); + } + } + catch (global::System.Exception __ex) + { + __exception_404 = __ex; + } + + + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content_404 ?? __response.ReasonPhrase ?? string.Empty, + innerException: __exception_404, + responseBody: __content_404, + responseObject: __value_404, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } + + if (__effectiveReadResponseAsString) + { + var __content = await __response.Content.ReadAsStringAsync( + #if NET5_0_OR_GREATER + __effectiveCancellationToken + #endif + ).ConfigureAwait(false); + + ProcessResponseContent( + client: HttpClient, + response: __response, + content: ref __content); + ProcessAggregateDocumentsResponseContent( + httpClient: HttpClient, + httpResponseMessage: __response, + content: ref __content); + + try + { + __response.EnsureSuccessStatusCode(); + + var __value = global::Speechify.StoreAggregateResponse.FromJson(__content, JsonSerializerContext) ?? + throw new global::System.InvalidOperationException($"Response deserialization failed for \"{__content}\" "); + return new global::Speechify.AutoSDKHttpResponse( + statusCode: __response.StatusCode, + headers: global::Speechify.AutoSDKHttpResponse.CreateHeaders(__response), + requestUri: __response.RequestMessage?.RequestUri, + body: __value); + } + catch (global::System.Exception __ex) + { + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content ?? __response.ReasonPhrase ?? string.Empty, + innerException: __ex, + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } + } + else + { + try + { + __response.EnsureSuccessStatusCode(); + using var __content = await __response.Content.ReadAsStreamAsync( + #if NET5_0_OR_GREATER + __effectiveCancellationToken + #endif + ).ConfigureAwait(false); + + var __value = await global::Speechify.StoreAggregateResponse.FromJsonStreamAsync(__content, JsonSerializerContext).ConfigureAwait(false) ?? + throw new global::System.InvalidOperationException("Response deserialization failed."); + return new global::Speechify.AutoSDKHttpResponse( + statusCode: __response.StatusCode, + headers: global::Speechify.AutoSDKHttpResponse.CreateHeaders(__response), + requestUri: __response.RequestMessage?.RequestUri, + body: __value); + } + catch (global::System.Exception __ex) + { + string? __content = null; + try + { + __content = await __response.Content.ReadAsStringAsync( + #if NET5_0_OR_GREATER + __effectiveCancellationToken + #endif + ).ConfigureAwait(false); + } + catch (global::System.Exception) + { + } + + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content ?? __response.ReasonPhrase ?? string.Empty, + innerException: __ex, + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } + } + + } + } + finally + { + __httpRequest?.Dispose(); + } + } + /// + /// Aggregate Documents
+ /// Count, sum, average, min or max over a collection, filtered with the
+ /// same `where` a query takes and optionally grouped by one field, in
+ /// one request. It runs on each document's indexed projection (its
+ /// top-level string / number / boolean / null fields), never on the
+ /// bodies: a nested value does not exist to it, a string longer than 256
+ /// characters groups by its first 256 and the answer says
+ /// `key_truncated` when that happened, and at most 100 groups come back,
+ /// largest first (`groups_truncated`). A read carrying a body, hence a
+ /// POST on a literal sub-path; `aggregate` is a reserved document id.
+ /// This is the last operation the query surface takes. A store is a
+ /// Firestore-shaped document store: filter, order, page and aggregate on
+ /// top-level fields. No joins, nested-field filters, full-text search or
+ /// SQL follow; a customer who needs more brings their own database
+ /// through a webhook or MCP tool, or pulls a collection into a run's
+ /// sandbox.
+ /// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). + ///
+ /// + /// + /// + /// + /// Filters, ANDed, the same ones a query takes. + /// + /// + /// One projected field to group by. A string that reaches the index's 256-byte limit may have been cut there, and the answer says so. + /// + /// + /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. + /// The token to cancel the operation with + /// + public async global::System.Threading.Tasks.Task AggregateDocumentsAsync( + string storeId, + string collection, + global::System.Collections.Generic.IList metrics, + string? speechifyVersion = default, + global::System.Collections.Generic.IList? where = default, + string? groupBy = default, + global::Speechify.AutoSDKRequestOptions? requestOptions = default, + global::System.Threading.CancellationToken cancellationToken = default) + { + var __request = new global::Speechify.StoreAggregateQuery + { + Where = where, + GroupBy = groupBy, + Metrics = metrics, + }; + + return await AggregateDocumentsAsync( + storeId: storeId, + collection: collection, + speechifyVersion: speechifyVersion, + request: __request, + requestOptions: requestOptions, + cancellationToken: cancellationToken).ConfigureAwait(false); + } + } +} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.DocumentsClient.DeleteDocument.g.cs b/src/libs/Speechify/Generated/Speechify.DocumentsClient.DeleteDocument.g.cs index 6c646f2a..9e0713ae 100644 --- a/src/libs/Speechify/Generated/Speechify.DocumentsClient.DeleteDocument.g.cs +++ b/src/libs/Speechify/Generated/Speechify.DocumentsClient.DeleteDocument.g.cs @@ -30,14 +30,16 @@ partial void PrepareDeleteDocumentArguments( ref string storeId, ref string collection, ref string documentId, - ref string? speechifyVersion); + ref string? speechifyVersion, + ref string? ifMatch); partial void PrepareDeleteDocumentRequest( global::System.Net.Http.HttpClient httpClient, global::System.Net.Http.HttpRequestMessage httpRequestMessage, string storeId, string collection, string documentId, - string? speechifyVersion); + string? speechifyVersion, + string? ifMatch); partial void ProcessDeleteDocumentResponse( global::System.Net.Http.HttpClient httpClient, global::System.Net.Http.HttpResponseMessage httpResponseMessage); @@ -49,13 +51,15 @@ partial void ProcessDeleteDocumentResponseContent( /// /// Delete Document
- /// Delete one document.
+ /// Delete one document. `If-Match` makes the delete conditional on the
+ /// `revision` you read, so it never removes a version written since.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). ///
/// /// /// /// + /// /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. /// The token to cancel the operation with /// @@ -64,6 +68,7 @@ partial void ProcessDeleteDocumentResponseContent( string collection, string documentId, string? speechifyVersion = default, + string? ifMatch = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default) { @@ -72,6 +77,7 @@ partial void ProcessDeleteDocumentResponseContent( collection: collection, documentId: documentId, speechifyVersion: speechifyVersion, + ifMatch: ifMatch, requestOptions: requestOptions, cancellationToken: cancellationToken ).ConfigureAwait(false); @@ -80,13 +86,15 @@ partial void ProcessDeleteDocumentResponseContent( } /// /// Delete Document
- /// Delete one document.
+ /// Delete one document. `If-Match` makes the delete conditional on the
+ /// `revision` you read, so it never removes a version written since.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). ///
/// /// /// /// + /// /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. /// The token to cancel the operation with /// @@ -95,6 +103,7 @@ partial void ProcessDeleteDocumentResponseContent( string collection, string documentId, string? speechifyVersion = default, + string? ifMatch = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default) { @@ -105,7 +114,8 @@ partial void ProcessDeleteDocumentResponseContent( storeId: ref storeId, collection: ref collection, documentId: ref documentId, - speechifyVersion: ref speechifyVersion); + speechifyVersion: ref speechifyVersion, + ifMatch: ref ifMatch); var __authorizations = global::Speechify.EndPointSecurityResolver.ResolveAuthorizations( @@ -167,6 +177,10 @@ partial void ProcessDeleteDocumentResponseContent( { __httpRequest.Headers.TryAddWithoutValidation("Speechify-Version", speechifyVersion.ToString()); } + if (ifMatch != default) + { + __httpRequest.Headers.TryAddWithoutValidation("If-Match", ifMatch.ToString()); + } global::Speechify.AutoSDKRequestOptionsSupport.ApplyHeaders( request: __httpRequest, @@ -182,7 +196,8 @@ partial void ProcessDeleteDocumentResponseContent( storeId: storeId!, collection: collection!, documentId: documentId!, - speechifyVersion: speechifyVersion); + speechifyVersion: speechifyVersion, + ifMatch: ifMatch); return __httpRequest; } @@ -509,6 +524,43 @@ partial void ProcessDeleteDocumentResponseContent( h => h.Key, h => h.Value)); } + // The `If-Match` precondition does not hold: the resource changed, or was deleted, after the version the request names. Nothing was written. + if ((int)__response.StatusCode == 412) + { + string? __content_412 = null; + global::System.Exception? __exception_412 = null; + global::Speechify.Error? __value_412 = null; + try + { + if (__effectiveReadResponseAsString) + { + __content_412 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + __value_412 = global::Speechify.Error.FromJson(__content_412, JsonSerializerContext); + } + else + { + __content_412 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + + __value_412 = global::Speechify.Error.FromJson(__content_412, JsonSerializerContext); + } + } + catch (global::System.Exception __ex) + { + __exception_412 = __ex; + } + + + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content_412 ?? __response.ReasonPhrase ?? string.Empty, + innerException: __exception_412, + responseBody: __content_412, + responseObject: __value_412, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } if (__effectiveReadResponseAsString) { diff --git a/src/libs/Speechify/Generated/Speechify.DocumentsClient.PutDocument.g.cs b/src/libs/Speechify/Generated/Speechify.DocumentsClient.PutDocument.g.cs index d1a73f66..c14a1678 100644 --- a/src/libs/Speechify/Generated/Speechify.DocumentsClient.PutDocument.g.cs +++ b/src/libs/Speechify/Generated/Speechify.DocumentsClient.PutDocument.g.cs @@ -31,6 +31,7 @@ partial void PreparePutDocumentArguments( ref string collection, ref string documentId, ref string? speechifyVersion, + ref string? ifMatch, global::Speechify.WriteStoreDocumentRequest request); partial void PreparePutDocumentRequest( global::System.Net.Http.HttpClient httpClient, @@ -39,6 +40,7 @@ partial void PreparePutDocumentRequest( string collection, string documentId, string? speechifyVersion, + string? ifMatch, global::Speechify.WriteStoreDocumentRequest request); partial void ProcessPutDocumentResponse( global::System.Net.Http.HttpClient httpClient, @@ -56,12 +58,18 @@ partial void ProcessPutDocumentResponseContent( /// JSON object of at most 256 KiB; its top-level scalar fields become the
/// queryable projection. The reserved ids `query` and `batch` are refused
/// (400 `validation_failed`).
+ /// Writing from a document you read? Send its `ETag` (equivalently its
+ /// `revision`) in `If-Match` and the write applies only if nothing has
+ /// changed since,
+ /// answering 412 instead of overwriting somebody else's edit or bringing a
+ /// deleted document back.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// /// /// /// + /// /// /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. /// The token to cancel the operation with @@ -73,6 +81,7 @@ partial void ProcessPutDocumentResponseContent( global::Speechify.WriteStoreDocumentRequest request, string? speechifyVersion = default, + string? ifMatch = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default) { @@ -83,6 +92,7 @@ partial void ProcessPutDocumentResponseContent( request: request, speechifyVersion: speechifyVersion, + ifMatch: ifMatch, requestOptions: requestOptions, cancellationToken: cancellationToken ).ConfigureAwait(false); @@ -96,12 +106,18 @@ partial void ProcessPutDocumentResponseContent( /// JSON object of at most 256 KiB; its top-level scalar fields become the
/// queryable projection. The reserved ids `query` and `batch` are refused
/// (400 `validation_failed`).
+ /// Writing from a document you read? Send its `ETag` (equivalently its
+ /// `revision`) in `If-Match` and the write applies only if nothing has
+ /// changed since,
+ /// answering 412 instead of overwriting somebody else's edit or bringing a
+ /// deleted document back.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// /// /// /// + /// /// /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. /// The token to cancel the operation with @@ -113,6 +129,7 @@ partial void ProcessPutDocumentResponseContent( global::Speechify.WriteStoreDocumentRequest request, string? speechifyVersion = default, + string? ifMatch = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default) { @@ -126,6 +143,7 @@ partial void ProcessPutDocumentResponseContent( collection: ref collection, documentId: ref documentId, speechifyVersion: ref speechifyVersion, + ifMatch: ref ifMatch, request: request); @@ -188,6 +206,10 @@ partial void ProcessPutDocumentResponseContent( { __httpRequest.Headers.TryAddWithoutValidation("Speechify-Version", speechifyVersion.ToString()); } + if (ifMatch != default) + { + __httpRequest.Headers.TryAddWithoutValidation("If-Match", ifMatch.ToString()); + } var __httpRequestContentBody = request.ToJson(JsonSerializerContext); var __httpRequestContent = new global::System.Net.Http.StringContent( @@ -210,6 +232,7 @@ partial void ProcessPutDocumentResponseContent( collection: collection!, documentId: documentId!, speechifyVersion: speechifyVersion, + ifMatch: ifMatch, request: request); return __httpRequest; @@ -574,6 +597,43 @@ partial void ProcessPutDocumentResponseContent( h => h.Key, h => h.Value)); } + // The `If-Match` precondition does not hold: the resource changed, or was deleted, after the version the request names. Nothing was written. + if ((int)__response.StatusCode == 412) + { + string? __content_412 = null; + global::System.Exception? __exception_412 = null; + global::Speechify.Error? __value_412 = null; + try + { + if (__effectiveReadResponseAsString) + { + __content_412 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + __value_412 = global::Speechify.Error.FromJson(__content_412, JsonSerializerContext); + } + else + { + __content_412 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + + __value_412 = global::Speechify.Error.FromJson(__content_412, JsonSerializerContext); + } + } + catch (global::System.Exception __ex) + { + __exception_412 = __ex; + } + + + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content_412 ?? __response.ReasonPhrase ?? string.Empty, + innerException: __exception_412, + responseBody: __content_412, + responseObject: __value_412, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } // A downstream dependency is degraded or the endpoint is intentionally disabled (e.g. phone-number purchase before ops setup). if ((int)__response.StatusCode == 503) { @@ -714,12 +774,18 @@ partial void ProcessPutDocumentResponseContent( /// JSON object of at most 256 KiB; its top-level scalar fields become the
/// queryable projection. The reserved ids `query` and `batch` are refused
/// (400 `validation_failed`).
+ /// Writing from a document you read? Send its `ETag` (equivalently its
+ /// `revision`) in `If-Match` and the write applies only if nothing has
+ /// changed since,
+ /// answering 412 instead of overwriting somebody else's edit or bringing a
+ /// deleted document back.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// /// /// /// + /// /// /// On `createDocument`, the id to write at (letters, digits, `_ . - : ~ @ +`, at most 200,
/// not the reserved `query` or `batch`); minted when absent. Ignored on `putDocument` /
@@ -737,6 +803,7 @@ partial void ProcessPutDocumentResponseContent( string documentId, object data, string? speechifyVersion = default, + string? ifMatch = default, string? id = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default) @@ -752,6 +819,7 @@ partial void ProcessPutDocumentResponseContent( collection: collection, documentId: documentId, speechifyVersion: speechifyVersion, + ifMatch: ifMatch, request: __request, requestOptions: requestOptions, cancellationToken: cancellationToken).ConfigureAwait(false); diff --git a/src/libs/Speechify/Generated/Speechify.DocumentsClient.QueryDocuments.g.cs b/src/libs/Speechify/Generated/Speechify.DocumentsClient.QueryDocuments.g.cs index 3659eed4..136722da 100644 --- a/src/libs/Speechify/Generated/Speechify.DocumentsClient.QueryDocuments.g.cs +++ b/src/libs/Speechify/Generated/Speechify.DocumentsClient.QueryDocuments.g.cs @@ -53,7 +53,9 @@ partial void ProcessQueryDocumentsResponseContent( /// order on one with `order_by`, page with `limit` + `cursor`. Values
/// compare with JSON semantics (numbers as numbers, strings lexically, so
/// ISO-8601 timestamps order as dates). A read carrying a body, hence a
- /// POST on a literal sub-path; `query` and `batch` are reserved document ids.
+ /// POST on a literal sub-path; `query`, `aggregate` and `batch` are
+ /// reserved document ids. For a count or a total, `aggregate` answers in
+ /// one request instead of a page walk.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// @@ -90,7 +92,9 @@ partial void ProcessQueryDocumentsResponseContent( /// order on one with `order_by`, page with `limit` + `cursor`. Values
/// compare with JSON semantics (numbers as numbers, strings lexically, so
/// ISO-8601 timestamps order as dates). A read carrying a body, hence a
- /// POST on a literal sub-path; `query` and `batch` are reserved document ids.
+ /// POST on a literal sub-path; `query`, `aggregate` and `batch` are
+ /// reserved document ids. For a count or a total, `aggregate` answers in
+ /// one request instead of a page walk.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// @@ -630,7 +634,9 @@ partial void ProcessQueryDocumentsResponseContent( /// order on one with `order_by`, page with `limit` + `cursor`. Values
/// compare with JSON semantics (numbers as numbers, strings lexically, so
/// ISO-8601 timestamps order as dates). A read carrying a body, hence a
- /// POST on a literal sub-path; `query` and `batch` are reserved document ids.
+ /// POST on a literal sub-path; `query`, `aggregate` and `batch` are
+ /// reserved document ids. For a count or a total, `aggregate` answers in
+ /// one request instead of a page walk.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// diff --git a/src/libs/Speechify/Generated/Speechify.DocumentsClient.UpdateDocument.g.cs b/src/libs/Speechify/Generated/Speechify.DocumentsClient.UpdateDocument.g.cs index 7aa0dcc2..ca8d9cda 100644 --- a/src/libs/Speechify/Generated/Speechify.DocumentsClient.UpdateDocument.g.cs +++ b/src/libs/Speechify/Generated/Speechify.DocumentsClient.UpdateDocument.g.cs @@ -31,6 +31,7 @@ partial void PrepareUpdateDocumentArguments( ref string collection, ref string documentId, ref string? speechifyVersion, + ref string? ifMatch, global::Speechify.WriteStoreDocumentRequest request); partial void PrepareUpdateDocumentRequest( global::System.Net.Http.HttpClient httpClient, @@ -39,6 +40,7 @@ partial void PrepareUpdateDocumentRequest( string collection, string documentId, string? speechifyVersion, + string? ifMatch, global::Speechify.WriteStoreDocumentRequest request); partial void ProcessUpdateDocumentResponse( global::System.Net.Http.HttpClient httpClient, @@ -52,13 +54,16 @@ partial void ProcessUpdateDocumentResponseContent( /// /// Update Document
/// Shallow-merge `data` into the stored document (a JSON null removes a
- /// field) and write the result as a new version.
+ /// field) and write the result as a new version. `If-Match` makes the
+ /// merge conditional on the `revision` you read, so a patch never lands on
+ /// top of an edit you have not seen.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). ///
/// /// /// /// + /// /// /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. /// The token to cancel the operation with @@ -70,6 +75,7 @@ partial void ProcessUpdateDocumentResponseContent( global::Speechify.WriteStoreDocumentRequest request, string? speechifyVersion = default, + string? ifMatch = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default) { @@ -80,6 +86,7 @@ partial void ProcessUpdateDocumentResponseContent( request: request, speechifyVersion: speechifyVersion, + ifMatch: ifMatch, requestOptions: requestOptions, cancellationToken: cancellationToken ).ConfigureAwait(false); @@ -89,13 +96,16 @@ partial void ProcessUpdateDocumentResponseContent( /// /// Update Document
/// Shallow-merge `data` into the stored document (a JSON null removes a
- /// field) and write the result as a new version.
+ /// field) and write the result as a new version. `If-Match` makes the
+ /// merge conditional on the `revision` you read, so a patch never lands on
+ /// top of an edit you have not seen.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). ///
/// /// /// /// + /// /// /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. /// The token to cancel the operation with @@ -107,6 +117,7 @@ partial void ProcessUpdateDocumentResponseContent( global::Speechify.WriteStoreDocumentRequest request, string? speechifyVersion = default, + string? ifMatch = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default) { @@ -120,6 +131,7 @@ partial void ProcessUpdateDocumentResponseContent( collection: ref collection, documentId: ref documentId, speechifyVersion: ref speechifyVersion, + ifMatch: ref ifMatch, request: request); @@ -182,6 +194,10 @@ partial void ProcessUpdateDocumentResponseContent( { __httpRequest.Headers.TryAddWithoutValidation("Speechify-Version", speechifyVersion.ToString()); } + if (ifMatch != default) + { + __httpRequest.Headers.TryAddWithoutValidation("If-Match", ifMatch.ToString()); + } var __httpRequestContentBody = request.ToJson(JsonSerializerContext); var __httpRequestContent = new global::System.Net.Http.StringContent( @@ -204,6 +220,7 @@ partial void ProcessUpdateDocumentResponseContent( collection: collection!, documentId: documentId!, speechifyVersion: speechifyVersion, + ifMatch: ifMatch, request: request); return __httpRequest; @@ -531,6 +548,43 @@ partial void ProcessUpdateDocumentResponseContent( h => h.Key, h => h.Value)); } + // The `If-Match` precondition does not hold: the resource changed, or was deleted, after the version the request names. Nothing was written. + if ((int)__response.StatusCode == 412) + { + string? __content_412 = null; + global::System.Exception? __exception_412 = null; + global::Speechify.Error? __value_412 = null; + try + { + if (__effectiveReadResponseAsString) + { + __content_412 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + __value_412 = global::Speechify.Error.FromJson(__content_412, JsonSerializerContext); + } + else + { + __content_412 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + + __value_412 = global::Speechify.Error.FromJson(__content_412, JsonSerializerContext); + } + } + catch (global::System.Exception __ex) + { + __exception_412 = __ex; + } + + + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content_412 ?? __response.ReasonPhrase ?? string.Empty, + innerException: __exception_412, + responseBody: __content_412, + responseObject: __value_412, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } // A downstream dependency is degraded or the endpoint is intentionally disabled (e.g. phone-number purchase before ops setup). if ((int)__response.StatusCode == 503) { @@ -667,13 +721,16 @@ partial void ProcessUpdateDocumentResponseContent( /// /// Update Document
/// Shallow-merge `data` into the stored document (a JSON null removes a
- /// field) and write the result as a new version.
+ /// field) and write the result as a new version. `If-Match` makes the
+ /// merge conditional on the `revision` you read, so a patch never lands on
+ /// top of an edit you have not seen.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). ///
/// /// /// /// + /// /// /// On `createDocument`, the id to write at (letters, digits, `_ . - : ~ @ +`, at most 200,
/// not the reserved `query` or `batch`); minted when absent. Ignored on `putDocument` /
@@ -691,6 +748,7 @@ partial void ProcessUpdateDocumentResponseContent( string documentId, object data, string? speechifyVersion = default, + string? ifMatch = default, string? id = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default) @@ -706,6 +764,7 @@ partial void ProcessUpdateDocumentResponseContent( collection: collection, documentId: documentId, speechifyVersion: speechifyVersion, + ifMatch: ifMatch, request: __request, requestOptions: requestOptions, cancellationToken: cancellationToken).ConfigureAwait(false); diff --git a/src/libs/Speechify/Generated/Speechify.HostedApisClient.Create.g.cs b/src/libs/Speechify/Generated/Speechify.HostedApisClient.Create.g.cs index 9529c00d..3a797c65 100644 --- a/src/libs/Speechify/Generated/Speechify.HostedApisClient.Create.g.cs +++ b/src/libs/Speechify/Generated/Speechify.HostedApisClient.Create.g.cs @@ -676,7 +676,13 @@ partial void ProcessCreateResponseContent( /// /// Runs the API may start per UTC day through its run routes; 1000 when omitted. /// + /// + /// Reads the API may serve from storage per UTC day; 100000 when omitted. + /// /// + /// + /// Register the key set end-user tokens are verified against (an `https` URL on a public host). + /// /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. /// The token to cancel the operation with /// @@ -689,7 +695,9 @@ partial void ProcessCreateResponseContent( global::Speechify.CreateHostedApiRequestAuthMode? authMode = default, global::System.Collections.Generic.IList? corsOrigins = default, int? dailyRunCap = default, + int? dailyReadCap = default, string? projectId = default, + string? userTokenJwksUrl = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default) { @@ -701,7 +709,9 @@ partial void ProcessCreateResponseContent( AuthMode = authMode, CorsOrigins = corsOrigins, DailyRunCap = dailyRunCap, + DailyReadCap = dailyReadCap, ProjectId = projectId, + UserTokenJwksUrl = userTokenJwksUrl, }; return await CreateAsync( diff --git a/src/libs/Speechify/Generated/Speechify.HostedApisClient.GetUsage.g.cs b/src/libs/Speechify/Generated/Speechify.HostedApisClient.GetUsage.g.cs new file mode 100644 index 00000000..b2f6d7a2 --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.HostedApisClient.GetUsage.g.cs @@ -0,0 +1,599 @@ + +#nullable enable + +namespace Speechify +{ + public partial class HostedApisClient + { + + + private static readonly global::Speechify.EndPointSecurityRequirement s_GetUsageSecurityRequirement0 = + new global::Speechify.EndPointSecurityRequirement + { + Authorizations = new global::Speechify.EndPointAuthorizationRequirement[] + { new global::Speechify.EndPointAuthorizationRequirement + { + Type = "Http", + SchemeId = "HttpBearer", + Location = "Header", + Name = "Bearer", + FriendlyName = "Bearer", + }, + }, + }; + private static readonly global::Speechify.EndPointSecurityRequirement[] s_GetUsageSecurityRequirements = + new global::Speechify.EndPointSecurityRequirement[] + { s_GetUsageSecurityRequirement0, + }; + partial void PrepareGetUsageArguments( + global::System.Net.Http.HttpClient httpClient, + ref string apiId, + ref string? speechifyVersion); + partial void PrepareGetUsageRequest( + global::System.Net.Http.HttpClient httpClient, + global::System.Net.Http.HttpRequestMessage httpRequestMessage, + string apiId, + string? speechifyVersion); + partial void ProcessGetUsageResponse( + global::System.Net.Http.HttpClient httpClient, + global::System.Net.Http.HttpResponseMessage httpResponseMessage); + + partial void ProcessGetUsageResponseContent( + global::System.Net.Http.HttpClient httpClient, + global::System.Net.Http.HttpResponseMessage httpResponseMessage, + ref string content); + + /// + /// Get Hosted API Usage
+ /// Today's reads and runs against the API's daily caps, with each route's
+ /// share of the reads. A read is a request a store, file or run_latest
+ /// route answered from storage; a response served from the cache is not
+ /// one. `counters_available` is false where nothing counts (no Redis), so
+ /// a zero is never mistaken for a quiet day.
+ /// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). + ///
+ /// + /// + /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. + /// The token to cancel the operation with + /// + public async global::System.Threading.Tasks.Task GetUsageAsync( + string apiId, + string? speechifyVersion = default, + global::Speechify.AutoSDKRequestOptions? requestOptions = default, + global::System.Threading.CancellationToken cancellationToken = default) + { + var __response = await GetUsageAsResponseAsync( + apiId: apiId, + speechifyVersion: speechifyVersion, + requestOptions: requestOptions, + cancellationToken: cancellationToken + ).ConfigureAwait(false); + + return __response.Body; + } + /// + /// Get Hosted API Usage
+ /// Today's reads and runs against the API's daily caps, with each route's
+ /// share of the reads. A read is a request a store, file or run_latest
+ /// route answered from storage; a response served from the cache is not
+ /// one. `counters_available` is false where nothing counts (no Redis), so
+ /// a zero is never mistaken for a quiet day.
+ /// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). + ///
+ /// + /// + /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. + /// The token to cancel the operation with + /// + public async global::System.Threading.Tasks.Task> GetUsageAsResponseAsync( + string apiId, + string? speechifyVersion = default, + global::Speechify.AutoSDKRequestOptions? requestOptions = default, + global::System.Threading.CancellationToken cancellationToken = default) + { + PrepareArguments( + client: HttpClient); + PrepareGetUsageArguments( + httpClient: HttpClient, + apiId: ref apiId, + speechifyVersion: ref speechifyVersion); + + + var __authorizations = global::Speechify.EndPointSecurityResolver.ResolveAuthorizations( + availableAuthorizations: Authorizations, + securityRequirements: s_GetUsageSecurityRequirements, + operationName: "GetUsageAsync"); + + using var __timeoutCancellationTokenSource = global::Speechify.AutoSDKRequestOptionsSupport.CreateTimeoutCancellationTokenSource( + clientOptions: Options, + requestOptions: requestOptions, + cancellationToken: cancellationToken); + var __effectiveCancellationToken = __timeoutCancellationTokenSource?.Token ?? cancellationToken; + var __effectiveReadResponseAsString = global::Speechify.AutoSDKRequestOptionsSupport.GetReadResponseAsString( + clientOptions: Options, + requestOptions: requestOptions, + fallbackValue: ReadResponseAsString); + var __maxAttempts = global::Speechify.AutoSDKRequestOptionsSupport.GetMaxAttempts( + clientOptions: Options, + requestOptions: requestOptions, + supportsRetry: true); + + global::System.Net.Http.HttpRequestMessage __CreateHttpRequest() + { + + var __pathBuilder = new global::Speechify.PathBuilder( + path: $"/v1/apis/{apiId}/usage", + baseUri: HttpClient.BaseAddress); + var __path = __pathBuilder.ToString(); + __path = global::Speechify.AutoSDKRequestOptionsSupport.AppendQueryParameters( + path: __path, + clientParameters: Options.QueryParameters, + requestParameters: requestOptions?.QueryParameters); + var __httpRequest = new global::System.Net.Http.HttpRequestMessage( + method: global::System.Net.Http.HttpMethod.Get, + requestUri: new global::System.Uri(__path, global::System.UriKind.RelativeOrAbsolute)); +#if NET6_0_OR_GREATER + __httpRequest.Version = global::System.Net.HttpVersion.Version11; + __httpRequest.VersionPolicy = global::System.Net.Http.HttpVersionPolicy.RequestVersionOrHigher; +#endif + + foreach (var __authorization in __authorizations) + { + if (__authorization.Type == "Http" || + __authorization.Type == "OAuth2" || + __authorization.Type == "OpenIdConnect") + { + __httpRequest.Headers.Authorization = new global::System.Net.Http.Headers.AuthenticationHeaderValue( + scheme: __authorization.Name, + parameter: __authorization.Value); + } + else if (__authorization.Type == "ApiKey" && + __authorization.Location == "Header") + { + __httpRequest.Headers.Add(__authorization.Name, __authorization.Value); + } + } + + if (speechifyVersion != default) + { + __httpRequest.Headers.TryAddWithoutValidation("Speechify-Version", speechifyVersion.ToString()); + } + + global::Speechify.AutoSDKRequestOptionsSupport.ApplyHeaders( + request: __httpRequest, + clientHeaders: Options.Headers, + requestHeaders: requestOptions?.Headers); + + PrepareRequest( + client: HttpClient, + request: __httpRequest); + PrepareGetUsageRequest( + httpClient: HttpClient, + httpRequestMessage: __httpRequest, + apiId: apiId!, + speechifyVersion: speechifyVersion); + + return __httpRequest; + } + + global::System.Net.Http.HttpRequestMessage? __httpRequest = null; + global::System.Net.Http.HttpResponseMessage? __response = null; + var __attemptNumber = 0; + try + { + for (var __attempt = 1; __attempt <= __maxAttempts; __attempt++) + { + __attemptNumber = __attempt; + __httpRequest = __CreateHttpRequest(); + await global::Speechify.AutoSDKRequestOptionsSupport.OnBeforeRequestAsync( + clientOptions: Options, + context: global::Speechify.AutoSDKRequestOptionsSupport.CreateHookContext( + operationId: "GetUsage", + methodName: "GetUsageAsync", + pathTemplate: "$\"/v1/apis/{apiId}/usage\"", + httpMethod: "GET", + baseUri: BaseUri, + request: __httpRequest!, + response: null, + exception: null, + clientOptions: Options, + requestOptions: requestOptions, + attempt: __attempt, + maxAttempts: __maxAttempts, + willRetry: false, + retryDelay: null, + retryReason: global::System.String.Empty, + cancellationToken: __effectiveCancellationToken)).ConfigureAwait(false); + try + { + __response = await HttpClient.SendAsync( + request: __httpRequest, + completionOption: global::System.Net.Http.HttpCompletionOption.ResponseContentRead, + cancellationToken: __effectiveCancellationToken).ConfigureAwait(false); + } + catch (global::System.Net.Http.HttpRequestException __exception) + { + var __retryDelay = global::Speechify.AutoSDKRequestOptionsSupport.GetRetryDelay( + clientOptions: Options, + requestOptions: requestOptions, + response: null, + attempt: __attempt); + var __willRetry = __attempt < __maxAttempts && !__effectiveCancellationToken.IsCancellationRequested; + await global::Speechify.AutoSDKRequestOptionsSupport.OnAfterErrorAsync( + clientOptions: Options, + context: global::Speechify.AutoSDKRequestOptionsSupport.CreateHookContext( + operationId: "GetUsage", + methodName: "GetUsageAsync", + pathTemplate: "$\"/v1/apis/{apiId}/usage\"", + httpMethod: "GET", + baseUri: BaseUri, + request: __httpRequest!, + response: null, + exception: __exception, + clientOptions: Options, + requestOptions: requestOptions, + attempt: __attempt, + maxAttempts: __maxAttempts, + willRetry: __willRetry, + retryDelay: __willRetry ? __retryDelay : (global::System.TimeSpan?)null, + retryReason: "exception", + cancellationToken: __effectiveCancellationToken)).ConfigureAwait(false); + if (!__willRetry) + { + throw; + } + + __httpRequest.Dispose(); + __httpRequest = null; + await global::Speechify.AutoSDKRequestOptionsSupport.DelayBeforeRetryAsync( + retryDelay: __retryDelay, + cancellationToken: __effectiveCancellationToken).ConfigureAwait(false); + continue; + } + + if (__response != null && + __attempt < __maxAttempts && + global::Speechify.AutoSDKRequestOptionsSupport.ShouldRetryStatusCode(__response.StatusCode)) + { + var __retryDelay = global::Speechify.AutoSDKRequestOptionsSupport.GetRetryDelay( + clientOptions: Options, + requestOptions: requestOptions, + response: __response, + attempt: __attempt); + await global::Speechify.AutoSDKRequestOptionsSupport.OnAfterErrorAsync( + clientOptions: Options, + context: global::Speechify.AutoSDKRequestOptionsSupport.CreateHookContext( + operationId: "GetUsage", + methodName: "GetUsageAsync", + pathTemplate: "$\"/v1/apis/{apiId}/usage\"", + httpMethod: "GET", + baseUri: BaseUri, + request: __httpRequest!, + response: __response, + exception: null, + clientOptions: Options, + requestOptions: requestOptions, + attempt: __attempt, + maxAttempts: __maxAttempts, + willRetry: true, + retryDelay: __retryDelay, + retryReason: "status:" + ((int)__response.StatusCode).ToString(global::System.Globalization.CultureInfo.InvariantCulture), + cancellationToken: __effectiveCancellationToken)).ConfigureAwait(false); + __response.Dispose(); + __response = null; + __httpRequest.Dispose(); + __httpRequest = null; + await global::Speechify.AutoSDKRequestOptionsSupport.DelayBeforeRetryAsync( + retryDelay: __retryDelay, + cancellationToken: __effectiveCancellationToken).ConfigureAwait(false); + continue; + } + + break; + } + + if (__response == null) + { + throw new global::System.InvalidOperationException("No response received."); + } + + using (__response) + { + + ProcessResponse( + client: HttpClient, + response: __response); + ProcessGetUsageResponse( + httpClient: HttpClient, + httpResponseMessage: __response); + if (__response.IsSuccessStatusCode) + { + await global::Speechify.AutoSDKRequestOptionsSupport.OnAfterSuccessAsync( + clientOptions: Options, + context: global::Speechify.AutoSDKRequestOptionsSupport.CreateHookContext( + operationId: "GetUsage", + methodName: "GetUsageAsync", + pathTemplate: "$\"/v1/apis/{apiId}/usage\"", + httpMethod: "GET", + baseUri: BaseUri, + request: __httpRequest!, + response: __response, + exception: null, + clientOptions: Options, + requestOptions: requestOptions, + attempt: __attemptNumber, + maxAttempts: __maxAttempts, + willRetry: false, + retryDelay: null, + retryReason: global::System.String.Empty, + cancellationToken: __effectiveCancellationToken)).ConfigureAwait(false); + } + else + { + await global::Speechify.AutoSDKRequestOptionsSupport.OnAfterErrorAsync( + clientOptions: Options, + context: global::Speechify.AutoSDKRequestOptionsSupport.CreateHookContext( + operationId: "GetUsage", + methodName: "GetUsageAsync", + pathTemplate: "$\"/v1/apis/{apiId}/usage\"", + httpMethod: "GET", + baseUri: BaseUri, + request: __httpRequest!, + response: __response, + exception: null, + clientOptions: Options, + requestOptions: requestOptions, + attempt: __attemptNumber, + maxAttempts: __maxAttempts, + willRetry: false, + retryDelay: null, + retryReason: global::System.String.Empty, + cancellationToken: __effectiveCancellationToken)).ConfigureAwait(false); + } + // The request was malformed or failed validation. The response body is the standard `Error` envelope; for validation failures `error.fields` enumerates the offending fields as a `path -> message` map (code = `validation_failed`). + if ((int)__response.StatusCode == 400) + { + string? __content_400 = null; + global::System.Exception? __exception_400 = null; + global::Speechify.Error? __value_400 = null; + try + { + if (__effectiveReadResponseAsString) + { + __content_400 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + __value_400 = global::Speechify.Error.FromJson(__content_400, JsonSerializerContext); + } + else + { + __content_400 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + + __value_400 = global::Speechify.Error.FromJson(__content_400, JsonSerializerContext); + } + } + catch (global::System.Exception __ex) + { + __exception_400 = __ex; + } + + + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content_400 ?? __response.ReasonPhrase ?? string.Empty, + innerException: __exception_400, + responseBody: __content_400, + responseObject: __value_400, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } + // Authentication is missing or invalid. The request did not carry a recognised credential (console session token, API key, or worker JWT). + if ((int)__response.StatusCode == 401) + { + string? __content_401 = null; + global::System.Exception? __exception_401 = null; + global::Speechify.Error? __value_401 = null; + try + { + if (__effectiveReadResponseAsString) + { + __content_401 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + __value_401 = global::Speechify.Error.FromJson(__content_401, JsonSerializerContext); + } + else + { + __content_401 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + + __value_401 = global::Speechify.Error.FromJson(__content_401, JsonSerializerContext); + } + } + catch (global::System.Exception __ex) + { + __exception_401 = __ex; + } + + + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content_401 ?? __response.ReasonPhrase ?? string.Empty, + innerException: __exception_401, + responseBody: __content_401, + responseObject: __value_401, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } + // The workspace has insufficient credits, or the request needs a plan tier the workspace is not on (e.g. voice cloning). Distinct from `Forbidden` so SDK consumers can drive upgrade UX. + if ((int)__response.StatusCode == 402) + { + string? __content_402 = null; + global::System.Exception? __exception_402 = null; + global::Speechify.Error? __value_402 = null; + try + { + if (__effectiveReadResponseAsString) + { + __content_402 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + __value_402 = global::Speechify.Error.FromJson(__content_402, JsonSerializerContext); + } + else + { + __content_402 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + + __value_402 = global::Speechify.Error.FromJson(__content_402, JsonSerializerContext); + } + } + catch (global::System.Exception __ex) + { + __exception_402 = __ex; + } + + + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content_402 ?? __response.ReasonPhrase ?? string.Empty, + innerException: __exception_402, + responseBody: __content_402, + responseObject: __value_402, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } + // The referenced resource does not exist or is not visible to the caller's workspace. + if ((int)__response.StatusCode == 404) + { + string? __content_404 = null; + global::System.Exception? __exception_404 = null; + global::Speechify.Error? __value_404 = null; + try + { + if (__effectiveReadResponseAsString) + { + __content_404 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + __value_404 = global::Speechify.Error.FromJson(__content_404, JsonSerializerContext); + } + else + { + __content_404 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + + __value_404 = global::Speechify.Error.FromJson(__content_404, JsonSerializerContext); + } + } + catch (global::System.Exception __ex) + { + __exception_404 = __ex; + } + + + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content_404 ?? __response.ReasonPhrase ?? string.Empty, + innerException: __exception_404, + responseBody: __content_404, + responseObject: __value_404, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } + + if (__effectiveReadResponseAsString) + { + var __content = await __response.Content.ReadAsStringAsync( + #if NET5_0_OR_GREATER + __effectiveCancellationToken + #endif + ).ConfigureAwait(false); + + ProcessResponseContent( + client: HttpClient, + response: __response, + content: ref __content); + ProcessGetUsageResponseContent( + httpClient: HttpClient, + httpResponseMessage: __response, + content: ref __content); + + try + { + __response.EnsureSuccessStatusCode(); + + var __value = global::Speechify.HostedAPIUsage.FromJson(__content, JsonSerializerContext) ?? + throw new global::System.InvalidOperationException($"Response deserialization failed for \"{__content}\" "); + return new global::Speechify.AutoSDKHttpResponse( + statusCode: __response.StatusCode, + headers: global::Speechify.AutoSDKHttpResponse.CreateHeaders(__response), + requestUri: __response.RequestMessage?.RequestUri, + body: __value); + } + catch (global::System.Exception __ex) + { + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content ?? __response.ReasonPhrase ?? string.Empty, + innerException: __ex, + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } + } + else + { + try + { + __response.EnsureSuccessStatusCode(); + using var __content = await __response.Content.ReadAsStreamAsync( + #if NET5_0_OR_GREATER + __effectiveCancellationToken + #endif + ).ConfigureAwait(false); + + var __value = await global::Speechify.HostedAPIUsage.FromJsonStreamAsync(__content, JsonSerializerContext).ConfigureAwait(false) ?? + throw new global::System.InvalidOperationException("Response deserialization failed."); + return new global::Speechify.AutoSDKHttpResponse( + statusCode: __response.StatusCode, + headers: global::Speechify.AutoSDKHttpResponse.CreateHeaders(__response), + requestUri: __response.RequestMessage?.RequestUri, + body: __value); + } + catch (global::System.Exception __ex) + { + string? __content = null; + try + { + __content = await __response.Content.ReadAsStringAsync( + #if NET5_0_OR_GREATER + __effectiveCancellationToken + #endif + ).ConfigureAwait(false); + } + catch (global::System.Exception) + { + } + + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content ?? __response.ReasonPhrase ?? string.Empty, + innerException: __ex, + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } + } + + } + } + finally + { + __httpRequest?.Dispose(); + } + } + } +} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.HostedApisClient.RotateUserTokenSecret.g.cs b/src/libs/Speechify/Generated/Speechify.HostedApisClient.RotateUserTokenSecret.g.cs new file mode 100644 index 00000000..782b44bb --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.HostedApisClient.RotateUserTokenSecret.g.cs @@ -0,0 +1,622 @@ + +#nullable enable + +namespace Speechify +{ + public partial class HostedApisClient + { + + + private static readonly global::Speechify.EndPointSecurityRequirement s_RotateUserTokenSecretSecurityRequirement0 = + new global::Speechify.EndPointSecurityRequirement + { + Authorizations = new global::Speechify.EndPointAuthorizationRequirement[] + { new global::Speechify.EndPointAuthorizationRequirement + { + Type = "Http", + SchemeId = "HttpBearer", + Location = "Header", + Name = "Bearer", + FriendlyName = "Bearer", + }, + }, + }; + private static readonly global::Speechify.EndPointSecurityRequirement[] s_RotateUserTokenSecretSecurityRequirements = + new global::Speechify.EndPointSecurityRequirement[] + { s_RotateUserTokenSecretSecurityRequirement0, + }; + partial void PrepareRotateUserTokenSecretArguments( + global::System.Net.Http.HttpClient httpClient, + ref string apiId, + ref string? speechifyVersion, + ref string? idempotencyKey); + partial void PrepareRotateUserTokenSecretRequest( + global::System.Net.Http.HttpClient httpClient, + global::System.Net.Http.HttpRequestMessage httpRequestMessage, + string apiId, + string? speechifyVersion, + string? idempotencyKey); + partial void ProcessRotateUserTokenSecretResponse( + global::System.Net.Http.HttpClient httpClient, + global::System.Net.Http.HttpResponseMessage httpResponseMessage); + + partial void ProcessRotateUserTokenSecretResponseContent( + global::System.Net.Http.HttpClient httpClient, + global::System.Net.Http.HttpResponseMessage httpResponseMessage, + ref string content); + + /// + /// Rotate End-User Token Secret
+ /// Mint the signing secret end-user tokens are verified against, replacing
+ /// any previous one at once: every token signed with the old secret stops
+ /// verifying. The plaintext is in this response and nowhere else; later
+ /// reads show `user_token_secret_hint`. Your backend signs a JWT with it
+ /// (HS256) carrying `sub` (the user, at most 256 characters) and `exp`
+ /// (within 24 hours), and the consumer presents it as
+ /// `Authorization: Bearer <token>`. Register `user_token_jwks_url`
+ /// instead to verify with your own keys.
+ /// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). + ///
+ /// + /// + /// + /// Optional idempotency key. When omitted, the SDK generates one for this request. + /// + /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. + /// The token to cancel the operation with + /// + public async global::System.Threading.Tasks.Task RotateUserTokenSecretAsync( + string apiId, + string? speechifyVersion = default, + string? idempotencyKey = default, + global::Speechify.AutoSDKRequestOptions? requestOptions = default, + global::System.Threading.CancellationToken cancellationToken = default) + { + var __response = await RotateUserTokenSecretAsResponseAsync( + apiId: apiId, + speechifyVersion: speechifyVersion, + idempotencyKey: idempotencyKey, + requestOptions: requestOptions, + cancellationToken: cancellationToken + ).ConfigureAwait(false); + + return __response.Body; + } + /// + /// Rotate End-User Token Secret
+ /// Mint the signing secret end-user tokens are verified against, replacing
+ /// any previous one at once: every token signed with the old secret stops
+ /// verifying. The plaintext is in this response and nowhere else; later
+ /// reads show `user_token_secret_hint`. Your backend signs a JWT with it
+ /// (HS256) carrying `sub` (the user, at most 256 characters) and `exp`
+ /// (within 24 hours), and the consumer presents it as
+ /// `Authorization: Bearer <token>`. Register `user_token_jwks_url`
+ /// instead to verify with your own keys.
+ /// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). + ///
+ /// + /// + /// + /// Optional idempotency key. When omitted, the SDK generates one for this request. + /// + /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. + /// The token to cancel the operation with + /// + public async global::System.Threading.Tasks.Task> RotateUserTokenSecretAsResponseAsync( + string apiId, + string? speechifyVersion = default, + string? idempotencyKey = default, + global::Speechify.AutoSDKRequestOptions? requestOptions = default, + global::System.Threading.CancellationToken cancellationToken = default) + { + PrepareArguments( + client: HttpClient); + PrepareRotateUserTokenSecretArguments( + httpClient: HttpClient, + apiId: ref apiId, + speechifyVersion: ref speechifyVersion, + idempotencyKey: ref idempotencyKey); + + + var __authorizations = global::Speechify.EndPointSecurityResolver.ResolveAuthorizations( + availableAuthorizations: Authorizations, + securityRequirements: s_RotateUserTokenSecretSecurityRequirements, + operationName: "RotateUserTokenSecretAsync"); + + using var __timeoutCancellationTokenSource = global::Speechify.AutoSDKRequestOptionsSupport.CreateTimeoutCancellationTokenSource( + clientOptions: Options, + requestOptions: requestOptions, + cancellationToken: cancellationToken); + var __effectiveCancellationToken = __timeoutCancellationTokenSource?.Token ?? cancellationToken; + var __effectiveReadResponseAsString = global::Speechify.AutoSDKRequestOptionsSupport.GetReadResponseAsString( + clientOptions: Options, + requestOptions: requestOptions, + fallbackValue: ReadResponseAsString); + var __maxAttempts = global::Speechify.AutoSDKRequestOptionsSupport.GetMaxAttempts( + clientOptions: Options, + requestOptions: requestOptions, + supportsRetry: true); + + global::System.Net.Http.HttpRequestMessage __CreateHttpRequest() + { + + var __pathBuilder = new global::Speechify.PathBuilder( + path: $"/v1/apis/{apiId}/rotate-user-token-secret", + baseUri: HttpClient.BaseAddress); + var __path = __pathBuilder.ToString(); + __path = global::Speechify.AutoSDKRequestOptionsSupport.AppendQueryParameters( + path: __path, + clientParameters: Options.QueryParameters, + requestParameters: requestOptions?.QueryParameters); + var __httpRequest = new global::System.Net.Http.HttpRequestMessage( + method: global::System.Net.Http.HttpMethod.Post, + requestUri: new global::System.Uri(__path, global::System.UriKind.RelativeOrAbsolute)); +#if NET6_0_OR_GREATER + __httpRequest.Version = global::System.Net.HttpVersion.Version11; + __httpRequest.VersionPolicy = global::System.Net.Http.HttpVersionPolicy.RequestVersionOrHigher; +#endif + + foreach (var __authorization in __authorizations) + { + if (__authorization.Type == "Http" || + __authorization.Type == "OAuth2" || + __authorization.Type == "OpenIdConnect") + { + __httpRequest.Headers.Authorization = new global::System.Net.Http.Headers.AuthenticationHeaderValue( + scheme: __authorization.Name, + parameter: __authorization.Value); + } + else if (__authorization.Type == "ApiKey" && + __authorization.Location == "Header") + { + __httpRequest.Headers.Add(__authorization.Name, __authorization.Value); + } + } + + if (speechifyVersion != default) + { + __httpRequest.Headers.TryAddWithoutValidation("Speechify-Version", speechifyVersion.ToString()); + } + var __idempotencyKey = global::System.String.IsNullOrWhiteSpace(idempotencyKey) + ? CreateIdempotencyKey() + : idempotencyKey; + __httpRequest.Headers.TryAddWithoutValidation("Idempotency-Key", __idempotencyKey); + + global::Speechify.AutoSDKRequestOptionsSupport.ApplyHeaders( + request: __httpRequest, + clientHeaders: Options.Headers, + requestHeaders: requestOptions?.Headers); + + PrepareRequest( + client: HttpClient, + request: __httpRequest); + PrepareRotateUserTokenSecretRequest( + httpClient: HttpClient, + httpRequestMessage: __httpRequest, + apiId: apiId!, + speechifyVersion: speechifyVersion, + idempotencyKey: idempotencyKey); + + return __httpRequest; + } + + global::System.Net.Http.HttpRequestMessage? __httpRequest = null; + global::System.Net.Http.HttpResponseMessage? __response = null; + var __attemptNumber = 0; + try + { + for (var __attempt = 1; __attempt <= __maxAttempts; __attempt++) + { + __attemptNumber = __attempt; + __httpRequest = __CreateHttpRequest(); + await global::Speechify.AutoSDKRequestOptionsSupport.OnBeforeRequestAsync( + clientOptions: Options, + context: global::Speechify.AutoSDKRequestOptionsSupport.CreateHookContext( + operationId: "RotateUserTokenSecret", + methodName: "RotateUserTokenSecretAsync", + pathTemplate: "$\"/v1/apis/{apiId}/rotate-user-token-secret\"", + httpMethod: "POST", + baseUri: BaseUri, + request: __httpRequest!, + response: null, + exception: null, + clientOptions: Options, + requestOptions: requestOptions, + attempt: __attempt, + maxAttempts: __maxAttempts, + willRetry: false, + retryDelay: null, + retryReason: global::System.String.Empty, + cancellationToken: __effectiveCancellationToken)).ConfigureAwait(false); + try + { + __response = await HttpClient.SendAsync( + request: __httpRequest, + completionOption: global::System.Net.Http.HttpCompletionOption.ResponseContentRead, + cancellationToken: __effectiveCancellationToken).ConfigureAwait(false); + } + catch (global::System.Net.Http.HttpRequestException __exception) + { + var __retryDelay = global::Speechify.AutoSDKRequestOptionsSupport.GetRetryDelay( + clientOptions: Options, + requestOptions: requestOptions, + response: null, + attempt: __attempt); + var __willRetry = __attempt < __maxAttempts && !__effectiveCancellationToken.IsCancellationRequested; + await global::Speechify.AutoSDKRequestOptionsSupport.OnAfterErrorAsync( + clientOptions: Options, + context: global::Speechify.AutoSDKRequestOptionsSupport.CreateHookContext( + operationId: "RotateUserTokenSecret", + methodName: "RotateUserTokenSecretAsync", + pathTemplate: "$\"/v1/apis/{apiId}/rotate-user-token-secret\"", + httpMethod: "POST", + baseUri: BaseUri, + request: __httpRequest!, + response: null, + exception: __exception, + clientOptions: Options, + requestOptions: requestOptions, + attempt: __attempt, + maxAttempts: __maxAttempts, + willRetry: __willRetry, + retryDelay: __willRetry ? __retryDelay : (global::System.TimeSpan?)null, + retryReason: "exception", + cancellationToken: __effectiveCancellationToken)).ConfigureAwait(false); + if (!__willRetry) + { + throw; + } + + __httpRequest.Dispose(); + __httpRequest = null; + await global::Speechify.AutoSDKRequestOptionsSupport.DelayBeforeRetryAsync( + retryDelay: __retryDelay, + cancellationToken: __effectiveCancellationToken).ConfigureAwait(false); + continue; + } + + if (__response != null && + __attempt < __maxAttempts && + global::Speechify.AutoSDKRequestOptionsSupport.ShouldRetryStatusCode(__response.StatusCode)) + { + var __retryDelay = global::Speechify.AutoSDKRequestOptionsSupport.GetRetryDelay( + clientOptions: Options, + requestOptions: requestOptions, + response: __response, + attempt: __attempt); + await global::Speechify.AutoSDKRequestOptionsSupport.OnAfterErrorAsync( + clientOptions: Options, + context: global::Speechify.AutoSDKRequestOptionsSupport.CreateHookContext( + operationId: "RotateUserTokenSecret", + methodName: "RotateUserTokenSecretAsync", + pathTemplate: "$\"/v1/apis/{apiId}/rotate-user-token-secret\"", + httpMethod: "POST", + baseUri: BaseUri, + request: __httpRequest!, + response: __response, + exception: null, + clientOptions: Options, + requestOptions: requestOptions, + attempt: __attempt, + maxAttempts: __maxAttempts, + willRetry: true, + retryDelay: __retryDelay, + retryReason: "status:" + ((int)__response.StatusCode).ToString(global::System.Globalization.CultureInfo.InvariantCulture), + cancellationToken: __effectiveCancellationToken)).ConfigureAwait(false); + __response.Dispose(); + __response = null; + __httpRequest.Dispose(); + __httpRequest = null; + await global::Speechify.AutoSDKRequestOptionsSupport.DelayBeforeRetryAsync( + retryDelay: __retryDelay, + cancellationToken: __effectiveCancellationToken).ConfigureAwait(false); + continue; + } + + break; + } + + if (__response == null) + { + throw new global::System.InvalidOperationException("No response received."); + } + + using (__response) + { + + ProcessResponse( + client: HttpClient, + response: __response); + ProcessRotateUserTokenSecretResponse( + httpClient: HttpClient, + httpResponseMessage: __response); + if (__response.IsSuccessStatusCode) + { + await global::Speechify.AutoSDKRequestOptionsSupport.OnAfterSuccessAsync( + clientOptions: Options, + context: global::Speechify.AutoSDKRequestOptionsSupport.CreateHookContext( + operationId: "RotateUserTokenSecret", + methodName: "RotateUserTokenSecretAsync", + pathTemplate: "$\"/v1/apis/{apiId}/rotate-user-token-secret\"", + httpMethod: "POST", + baseUri: BaseUri, + request: __httpRequest!, + response: __response, + exception: null, + clientOptions: Options, + requestOptions: requestOptions, + attempt: __attemptNumber, + maxAttempts: __maxAttempts, + willRetry: false, + retryDelay: null, + retryReason: global::System.String.Empty, + cancellationToken: __effectiveCancellationToken)).ConfigureAwait(false); + } + else + { + await global::Speechify.AutoSDKRequestOptionsSupport.OnAfterErrorAsync( + clientOptions: Options, + context: global::Speechify.AutoSDKRequestOptionsSupport.CreateHookContext( + operationId: "RotateUserTokenSecret", + methodName: "RotateUserTokenSecretAsync", + pathTemplate: "$\"/v1/apis/{apiId}/rotate-user-token-secret\"", + httpMethod: "POST", + baseUri: BaseUri, + request: __httpRequest!, + response: __response, + exception: null, + clientOptions: Options, + requestOptions: requestOptions, + attempt: __attemptNumber, + maxAttempts: __maxAttempts, + willRetry: false, + retryDelay: null, + retryReason: global::System.String.Empty, + cancellationToken: __effectiveCancellationToken)).ConfigureAwait(false); + } + // The request was malformed or failed validation. The response body is the standard `Error` envelope; for validation failures `error.fields` enumerates the offending fields as a `path -> message` map (code = `validation_failed`). + if ((int)__response.StatusCode == 400) + { + string? __content_400 = null; + global::System.Exception? __exception_400 = null; + global::Speechify.Error? __value_400 = null; + try + { + if (__effectiveReadResponseAsString) + { + __content_400 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + __value_400 = global::Speechify.Error.FromJson(__content_400, JsonSerializerContext); + } + else + { + __content_400 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + + __value_400 = global::Speechify.Error.FromJson(__content_400, JsonSerializerContext); + } + } + catch (global::System.Exception __ex) + { + __exception_400 = __ex; + } + + + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content_400 ?? __response.ReasonPhrase ?? string.Empty, + innerException: __exception_400, + responseBody: __content_400, + responseObject: __value_400, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } + // Authentication is missing or invalid. The request did not carry a recognised credential (console session token, API key, or worker JWT). + if ((int)__response.StatusCode == 401) + { + string? __content_401 = null; + global::System.Exception? __exception_401 = null; + global::Speechify.Error? __value_401 = null; + try + { + if (__effectiveReadResponseAsString) + { + __content_401 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + __value_401 = global::Speechify.Error.FromJson(__content_401, JsonSerializerContext); + } + else + { + __content_401 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + + __value_401 = global::Speechify.Error.FromJson(__content_401, JsonSerializerContext); + } + } + catch (global::System.Exception __ex) + { + __exception_401 = __ex; + } + + + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content_401 ?? __response.ReasonPhrase ?? string.Empty, + innerException: __exception_401, + responseBody: __content_401, + responseObject: __value_401, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } + // The workspace has insufficient credits, or the request needs a plan tier the workspace is not on (e.g. voice cloning). Distinct from `Forbidden` so SDK consumers can drive upgrade UX. + if ((int)__response.StatusCode == 402) + { + string? __content_402 = null; + global::System.Exception? __exception_402 = null; + global::Speechify.Error? __value_402 = null; + try + { + if (__effectiveReadResponseAsString) + { + __content_402 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + __value_402 = global::Speechify.Error.FromJson(__content_402, JsonSerializerContext); + } + else + { + __content_402 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + + __value_402 = global::Speechify.Error.FromJson(__content_402, JsonSerializerContext); + } + } + catch (global::System.Exception __ex) + { + __exception_402 = __ex; + } + + + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content_402 ?? __response.ReasonPhrase ?? string.Empty, + innerException: __exception_402, + responseBody: __content_402, + responseObject: __value_402, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } + // The referenced resource does not exist or is not visible to the caller's workspace. + if ((int)__response.StatusCode == 404) + { + string? __content_404 = null; + global::System.Exception? __exception_404 = null; + global::Speechify.Error? __value_404 = null; + try + { + if (__effectiveReadResponseAsString) + { + __content_404 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + __value_404 = global::Speechify.Error.FromJson(__content_404, JsonSerializerContext); + } + else + { + __content_404 = await __response.Content.ReadAsStringAsync(__effectiveCancellationToken).ConfigureAwait(false); + + __value_404 = global::Speechify.Error.FromJson(__content_404, JsonSerializerContext); + } + } + catch (global::System.Exception __ex) + { + __exception_404 = __ex; + } + + + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content_404 ?? __response.ReasonPhrase ?? string.Empty, + innerException: __exception_404, + responseBody: __content_404, + responseObject: __value_404, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } + + if (__effectiveReadResponseAsString) + { + var __content = await __response.Content.ReadAsStringAsync( + #if NET5_0_OR_GREATER + __effectiveCancellationToken + #endif + ).ConfigureAwait(false); + + ProcessResponseContent( + client: HttpClient, + response: __response, + content: ref __content); + ProcessRotateUserTokenSecretResponseContent( + httpClient: HttpClient, + httpResponseMessage: __response, + content: ref __content); + + try + { + __response.EnsureSuccessStatusCode(); + + var __value = global::Speechify.HostedAPIUserTokenSecret.FromJson(__content, JsonSerializerContext) ?? + throw new global::System.InvalidOperationException($"Response deserialization failed for \"{__content}\" "); + return new global::Speechify.AutoSDKHttpResponse( + statusCode: __response.StatusCode, + headers: global::Speechify.AutoSDKHttpResponse.CreateHeaders(__response), + requestUri: __response.RequestMessage?.RequestUri, + body: __value); + } + catch (global::System.Exception __ex) + { + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content ?? __response.ReasonPhrase ?? string.Empty, + innerException: __ex, + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } + } + else + { + try + { + __response.EnsureSuccessStatusCode(); + using var __content = await __response.Content.ReadAsStreamAsync( + #if NET5_0_OR_GREATER + __effectiveCancellationToken + #endif + ).ConfigureAwait(false); + + var __value = await global::Speechify.HostedAPIUserTokenSecret.FromJsonStreamAsync(__content, JsonSerializerContext).ConfigureAwait(false) ?? + throw new global::System.InvalidOperationException("Response deserialization failed."); + return new global::Speechify.AutoSDKHttpResponse( + statusCode: __response.StatusCode, + headers: global::Speechify.AutoSDKHttpResponse.CreateHeaders(__response), + requestUri: __response.RequestMessage?.RequestUri, + body: __value); + } + catch (global::System.Exception __ex) + { + string? __content = null; + try + { + __content = await __response.Content.ReadAsStringAsync( + #if NET5_0_OR_GREATER + __effectiveCancellationToken + #endif + ).ConfigureAwait(false); + } + catch (global::System.Exception) + { + } + + throw global::Speechify.ApiException.Create( + statusCode: __response.StatusCode, + message: __content ?? __response.ReasonPhrase ?? string.Empty, + innerException: __ex, + responseBody: __content, + responseHeaders: global::System.Linq.Enumerable.ToDictionary( + __response.Headers, + h => h.Key, + h => h.Value)); + } + } + + } + } + finally + { + __httpRequest?.Dispose(); + } + } + } +} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.HostedApisClient.Update.g.cs b/src/libs/Speechify/Generated/Speechify.HostedApisClient.Update.g.cs index 0abfd503..dae4df07 100644 --- a/src/libs/Speechify/Generated/Speechify.HostedApisClient.Update.g.cs +++ b/src/libs/Speechify/Generated/Speechify.HostedApisClient.Update.g.cs @@ -49,7 +49,9 @@ partial void ProcessUpdateResponseContent( /// Update Hosted API
/// Update a hosted API (merge-patch). Switching to `public` is refused
/// while a `run` route exists: an anonymous caller must not start runs
- /// that spend the workspace's budget.
+ /// that spend the workspace's budget. Switching away from `user_token`
+ /// is refused while a route binds `{{user.*}}`: nothing else supplies
+ /// a user.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// @@ -81,7 +83,9 @@ partial void ProcessUpdateResponseContent( /// Update Hosted API
/// Update a hosted API (merge-patch). Switching to `public` is refused
/// while a `run` route exists: an anonymous caller must not start runs
- /// that spend the workspace's budget.
+ /// that spend the workspace's budget. Switching away from `user_token`
+ /// is refused while a route binds `{{user.*}}`: nothing else supplies
+ /// a user.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// @@ -615,7 +619,9 @@ partial void ProcessUpdateResponseContent( /// Update Hosted API
/// Update a hosted API (merge-patch). Switching to `public` is refused
/// while a `run` route exists: an anonymous caller must not start runs
- /// that spend the workspace's budget.
+ /// that spend the workspace's budget. Switching away from `user_token`
+ /// is refused while a route binds `{{user.*}}`: nothing else supplies
+ /// a user.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// @@ -628,6 +634,10 @@ partial void ProcessUpdateResponseContent( /// A paused API answers 503 to every consumer request. /// /// + /// + /// + /// Replace the registered key set; an empty string removes it, after which the signing secret verifies tokens again. + /// /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. /// The token to cancel the operation with /// @@ -640,6 +650,8 @@ partial void ProcessUpdateResponseContent( global::System.Collections.Generic.IList? corsOrigins = default, bool? enabled = default, int? dailyRunCap = default, + int? dailyReadCap = default, + string? userTokenJwksUrl = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default) { @@ -651,6 +663,8 @@ partial void ProcessUpdateResponseContent( CorsOrigins = corsOrigins, Enabled = enabled, DailyRunCap = dailyRunCap, + DailyReadCap = dailyReadCap, + UserTokenJwksUrl = userTokenJwksUrl, }; return await UpdateAsync( diff --git a/src/libs/Speechify/Generated/Speechify.IConversationsClient.List.g.cs b/src/libs/Speechify/Generated/Speechify.IConversationsClient.List.g.cs index 2769f0ae..d74c0238 100644 --- a/src/libs/Speechify/Generated/Speechify.IConversationsClient.List.g.cs +++ b/src/libs/Speechify/Generated/Speechify.IConversationsClient.List.g.cs @@ -22,11 +22,28 @@ public partial interface IConversationsClient /// /// /// - /// How the caller reached the agent. `web` is the browser /
+ /// Which runtime carried the conversation. `web` is the browser /
/// SDK realtime path; the `sip_*` and `phone` variants come
- /// from the telephony stack; `text` is the text/chat channel
- /// (turn-based, roomless, no call duration). + /// from the telephony stack; `text` is the turn-based, roomless
+ /// runtime (no call duration) that the message API and every
+ /// messaging channel share.
+ /// A conversation reports the transport it actually ran on:
+ /// `web`, `sip_inbound`, `sip_outbound` or `text`. `phone` is
+ /// selectable when filtering a list and matches calls in either
+ /// direction; `whatsapp` is reserved and matches nothing today.
+ /// To tell two conversations on the same transport apart, filter
+ /// or read `channel` instead. /// + /// + /// Which front door the conversation arrived through, one level
+ /// coarser than `transport`, and the value to display or group a
+ /// conversation's channel by. Both telephony directions are
+ /// `voice`; the browser / SDK realtime path is `web`; the message
+ /// API is `text`; a conversation reached over a provider front
+ /// door names that provider (`slack`) rather than the transport it
+ /// shares with the message API. + /// + /// /// /// /// @@ -45,6 +62,8 @@ public partial interface IConversationsClient string? agentId = default, global::Speechify.ConversationStatus? status = default, global::Speechify.ConversationTransport? transport = default, + global::Speechify.ConversationChannel? channel = default, + bool? live = default, string? callerIdentity = default, string? contactId = default, string? q = default, @@ -74,11 +93,28 @@ public partial interface IConversationsClient /// /// /// - /// How the caller reached the agent. `web` is the browser /
+ /// Which runtime carried the conversation. `web` is the browser /
/// SDK realtime path; the `sip_*` and `phone` variants come
- /// from the telephony stack; `text` is the text/chat channel
- /// (turn-based, roomless, no call duration). + /// from the telephony stack; `text` is the turn-based, roomless
+ /// runtime (no call duration) that the message API and every
+ /// messaging channel share.
+ /// A conversation reports the transport it actually ran on:
+ /// `web`, `sip_inbound`, `sip_outbound` or `text`. `phone` is
+ /// selectable when filtering a list and matches calls in either
+ /// direction; `whatsapp` is reserved and matches nothing today.
+ /// To tell two conversations on the same transport apart, filter
+ /// or read `channel` instead. + /// + /// + /// Which front door the conversation arrived through, one level
+ /// coarser than `transport`, and the value to display or group a
+ /// conversation's channel by. Both telephony directions are
+ /// `voice`; the browser / SDK realtime path is `web`; the message
+ /// API is `text`; a conversation reached over a provider front
+ /// door names that provider (`slack`) rather than the transport it
+ /// shares with the message API. /// + /// /// /// /// @@ -97,6 +133,8 @@ public partial interface IConversationsClient string? agentId = default, global::Speechify.ConversationStatus? status = default, global::Speechify.ConversationTransport? transport = default, + global::Speechify.ConversationChannel? channel = default, + bool? live = default, string? callerIdentity = default, string? contactId = default, string? q = default, diff --git a/src/libs/Speechify/Generated/Speechify.IConversationsClient.Stats.g.cs b/src/libs/Speechify/Generated/Speechify.IConversationsClient.Stats.g.cs index cdd473e5..30264f3e 100644 --- a/src/libs/Speechify/Generated/Speechify.IConversationsClient.Stats.g.cs +++ b/src/libs/Speechify/Generated/Speechify.IConversationsClient.Stats.g.cs @@ -12,11 +12,28 @@ public partial interface IConversationsClient /// /// /// - /// How the caller reached the agent. `web` is the browser /
+ /// Which runtime carried the conversation. `web` is the browser /
/// SDK realtime path; the `sip_*` and `phone` variants come
- /// from the telephony stack; `text` is the text/chat channel
- /// (turn-based, roomless, no call duration). + /// from the telephony stack; `text` is the turn-based, roomless
+ /// runtime (no call duration) that the message API and every
+ /// messaging channel share.
+ /// A conversation reports the transport it actually ran on:
+ /// `web`, `sip_inbound`, `sip_outbound` or `text`. `phone` is
+ /// selectable when filtering a list and matches calls in either
+ /// direction; `whatsapp` is reserved and matches nothing today.
+ /// To tell two conversations on the same transport apart, filter
+ /// or read `channel` instead. /// + /// + /// Which front door the conversation arrived through, one level
+ /// coarser than `transport`, and the value to display or group a
+ /// conversation's channel by. Both telephony directions are
+ /// `voice`; the browser / SDK realtime path is `web`; the message
+ /// API is `text`; a conversation reached over a provider front
+ /// door names that provider (`slack`) rather than the transport it
+ /// shares with the message API. + /// + /// /// /// /// @@ -33,6 +50,8 @@ public partial interface IConversationsClient string? agentId = default, global::Speechify.ConversationStatus? status = default, global::Speechify.ConversationTransport? transport = default, + global::Speechify.ConversationChannel? channel = default, + bool? live = default, string? callerIdentity = default, string? contactId = default, string? q = default, @@ -52,11 +71,28 @@ public partial interface IConversationsClient /// /// /// - /// How the caller reached the agent. `web` is the browser /
+ /// Which runtime carried the conversation. `web` is the browser /
/// SDK realtime path; the `sip_*` and `phone` variants come
- /// from the telephony stack; `text` is the text/chat channel
- /// (turn-based, roomless, no call duration). + /// from the telephony stack; `text` is the turn-based, roomless
+ /// runtime (no call duration) that the message API and every
+ /// messaging channel share.
+ /// A conversation reports the transport it actually ran on:
+ /// `web`, `sip_inbound`, `sip_outbound` or `text`. `phone` is
+ /// selectable when filtering a list and matches calls in either
+ /// direction; `whatsapp` is reserved and matches nothing today.
+ /// To tell two conversations on the same transport apart, filter
+ /// or read `channel` instead. + /// + /// + /// Which front door the conversation arrived through, one level
+ /// coarser than `transport`, and the value to display or group a
+ /// conversation's channel by. Both telephony directions are
+ /// `voice`; the browser / SDK realtime path is `web`; the message
+ /// API is `text`; a conversation reached over a provider front
+ /// door names that provider (`slack`) rather than the transport it
+ /// shares with the message API. /// + /// /// /// /// @@ -73,6 +109,8 @@ public partial interface IConversationsClient string? agentId = default, global::Speechify.ConversationStatus? status = default, global::Speechify.ConversationTransport? transport = default, + global::Speechify.ConversationChannel? channel = default, + bool? live = default, string? callerIdentity = default, string? contactId = default, string? q = default, diff --git a/src/libs/Speechify/Generated/Speechify.IDocumentsClient.AggregateDocuments.g.cs b/src/libs/Speechify/Generated/Speechify.IDocumentsClient.AggregateDocuments.g.cs new file mode 100644 index 00000000..62135d93 --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.IDocumentsClient.AggregateDocuments.g.cs @@ -0,0 +1,117 @@ +#nullable enable + +namespace Speechify +{ + public partial interface IDocumentsClient + { + /// + /// Aggregate Documents
+ /// Count, sum, average, min or max over a collection, filtered with the
+ /// same `where` a query takes and optionally grouped by one field, in
+ /// one request. It runs on each document's indexed projection (its
+ /// top-level string / number / boolean / null fields), never on the
+ /// bodies: a nested value does not exist to it, a string longer than 256
+ /// characters groups by its first 256 and the answer says
+ /// `key_truncated` when that happened, and at most 100 groups come back,
+ /// largest first (`groups_truncated`). A read carrying a body, hence a
+ /// POST on a literal sub-path; `aggregate` is a reserved document id.
+ /// This is the last operation the query surface takes. A store is a
+ /// Firestore-shaped document store: filter, order, page and aggregate on
+ /// top-level fields. No joins, nested-field filters, full-text search or
+ /// SQL follow; a customer who needs more brings their own database
+ /// through a webhook or MCP tool, or pulls a collection into a run's
+ /// sandbox.
+ /// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). + ///
+ /// + /// + /// + /// + /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. + /// The token to cancel the operation with + /// + global::System.Threading.Tasks.Task AggregateDocumentsAsync( + string storeId, + string collection, + + global::Speechify.StoreAggregateQuery request, + string? speechifyVersion = default, + global::Speechify.AutoSDKRequestOptions? requestOptions = default, + global::System.Threading.CancellationToken cancellationToken = default); + /// + /// Aggregate Documents
+ /// Count, sum, average, min or max over a collection, filtered with the
+ /// same `where` a query takes and optionally grouped by one field, in
+ /// one request. It runs on each document's indexed projection (its
+ /// top-level string / number / boolean / null fields), never on the
+ /// bodies: a nested value does not exist to it, a string longer than 256
+ /// characters groups by its first 256 and the answer says
+ /// `key_truncated` when that happened, and at most 100 groups come back,
+ /// largest first (`groups_truncated`). A read carrying a body, hence a
+ /// POST on a literal sub-path; `aggregate` is a reserved document id.
+ /// This is the last operation the query surface takes. A store is a
+ /// Firestore-shaped document store: filter, order, page and aggregate on
+ /// top-level fields. No joins, nested-field filters, full-text search or
+ /// SQL follow; a customer who needs more brings their own database
+ /// through a webhook or MCP tool, or pulls a collection into a run's
+ /// sandbox.
+ /// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). + ///
+ /// + /// + /// + /// + /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. + /// The token to cancel the operation with + /// + global::System.Threading.Tasks.Task> AggregateDocumentsAsResponseAsync( + string storeId, + string collection, + + global::Speechify.StoreAggregateQuery request, + string? speechifyVersion = default, + global::Speechify.AutoSDKRequestOptions? requestOptions = default, + global::System.Threading.CancellationToken cancellationToken = default); + /// + /// Aggregate Documents
+ /// Count, sum, average, min or max over a collection, filtered with the
+ /// same `where` a query takes and optionally grouped by one field, in
+ /// one request. It runs on each document's indexed projection (its
+ /// top-level string / number / boolean / null fields), never on the
+ /// bodies: a nested value does not exist to it, a string longer than 256
+ /// characters groups by its first 256 and the answer says
+ /// `key_truncated` when that happened, and at most 100 groups come back,
+ /// largest first (`groups_truncated`). A read carrying a body, hence a
+ /// POST on a literal sub-path; `aggregate` is a reserved document id.
+ /// This is the last operation the query surface takes. A store is a
+ /// Firestore-shaped document store: filter, order, page and aggregate on
+ /// top-level fields. No joins, nested-field filters, full-text search or
+ /// SQL follow; a customer who needs more brings their own database
+ /// through a webhook or MCP tool, or pulls a collection into a run's
+ /// sandbox.
+ /// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). + ///
+ /// + /// + /// + /// + /// Filters, ANDed, the same ones a query takes. + /// + /// + /// One projected field to group by. A string that reaches the index's 256-byte limit may have been cut there, and the answer says so. + /// + /// + /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. + /// The token to cancel the operation with + /// + global::System.Threading.Tasks.Task AggregateDocumentsAsync( + string storeId, + string collection, + global::System.Collections.Generic.IList metrics, + string? speechifyVersion = default, + global::System.Collections.Generic.IList? where = default, + string? groupBy = default, + global::Speechify.AutoSDKRequestOptions? requestOptions = default, + global::System.Threading.CancellationToken cancellationToken = default); + } +} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.IDocumentsClient.DeleteDocument.g.cs b/src/libs/Speechify/Generated/Speechify.IDocumentsClient.DeleteDocument.g.cs index 51276210..3ad58d06 100644 --- a/src/libs/Speechify/Generated/Speechify.IDocumentsClient.DeleteDocument.g.cs +++ b/src/libs/Speechify/Generated/Speechify.IDocumentsClient.DeleteDocument.g.cs @@ -6,13 +6,15 @@ public partial interface IDocumentsClient { /// /// Delete Document
- /// Delete one document.
+ /// Delete one document. `If-Match` makes the delete conditional on the
+ /// `revision` you read, so it never removes a version written since.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). ///
/// /// /// /// + /// /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. /// The token to cancel the operation with /// @@ -21,17 +23,20 @@ public partial interface IDocumentsClient string collection, string documentId, string? speechifyVersion = default, + string? ifMatch = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default); /// /// Delete Document
- /// Delete one document.
+ /// Delete one document. `If-Match` makes the delete conditional on the
+ /// `revision` you read, so it never removes a version written since.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). ///
/// /// /// /// + /// /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. /// The token to cancel the operation with /// @@ -40,6 +45,7 @@ public partial interface IDocumentsClient string collection, string documentId, string? speechifyVersion = default, + string? ifMatch = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default); } diff --git a/src/libs/Speechify/Generated/Speechify.IDocumentsClient.PutDocument.g.cs b/src/libs/Speechify/Generated/Speechify.IDocumentsClient.PutDocument.g.cs index 19b231b6..711c6eab 100644 --- a/src/libs/Speechify/Generated/Speechify.IDocumentsClient.PutDocument.g.cs +++ b/src/libs/Speechify/Generated/Speechify.IDocumentsClient.PutDocument.g.cs @@ -11,12 +11,18 @@ public partial interface IDocumentsClient /// JSON object of at most 256 KiB; its top-level scalar fields become the
/// queryable projection. The reserved ids `query` and `batch` are refused
/// (400 `validation_failed`).
+ /// Writing from a document you read? Send its `ETag` (equivalently its
+ /// `revision`) in `If-Match` and the write applies only if nothing has
+ /// changed since,
+ /// answering 412 instead of overwriting somebody else's edit or bringing a
+ /// deleted document back.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// /// /// /// + /// /// /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. /// The token to cancel the operation with @@ -28,6 +34,7 @@ public partial interface IDocumentsClient global::Speechify.WriteStoreDocumentRequest request, string? speechifyVersion = default, + string? ifMatch = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default); /// @@ -37,12 +44,18 @@ public partial interface IDocumentsClient /// JSON object of at most 256 KiB; its top-level scalar fields become the
/// queryable projection. The reserved ids `query` and `batch` are refused
/// (400 `validation_failed`).
+ /// Writing from a document you read? Send its `ETag` (equivalently its
+ /// `revision`) in `If-Match` and the write applies only if nothing has
+ /// changed since,
+ /// answering 412 instead of overwriting somebody else's edit or bringing a
+ /// deleted document back.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). ///
/// /// /// /// + /// /// /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. /// The token to cancel the operation with @@ -54,6 +67,7 @@ public partial interface IDocumentsClient global::Speechify.WriteStoreDocumentRequest request, string? speechifyVersion = default, + string? ifMatch = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default); /// @@ -63,12 +77,18 @@ public partial interface IDocumentsClient /// JSON object of at most 256 KiB; its top-level scalar fields become the
/// queryable projection. The reserved ids `query` and `batch` are refused
/// (400 `validation_failed`).
+ /// Writing from a document you read? Send its `ETag` (equivalently its
+ /// `revision`) in `If-Match` and the write applies only if nothing has
+ /// changed since,
+ /// answering 412 instead of overwriting somebody else's edit or bringing a
+ /// deleted document back.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). ///
/// /// /// /// + /// /// /// On `createDocument`, the id to write at (letters, digits, `_ . - : ~ @ +`, at most 200,
/// not the reserved `query` or `batch`); minted when absent. Ignored on `putDocument` /
@@ -86,6 +106,7 @@ public partial interface IDocumentsClient string documentId, object data, string? speechifyVersion = default, + string? ifMatch = default, string? id = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default); diff --git a/src/libs/Speechify/Generated/Speechify.IDocumentsClient.QueryDocuments.g.cs b/src/libs/Speechify/Generated/Speechify.IDocumentsClient.QueryDocuments.g.cs index 3092e71d..5f8168db 100644 --- a/src/libs/Speechify/Generated/Speechify.IDocumentsClient.QueryDocuments.g.cs +++ b/src/libs/Speechify/Generated/Speechify.IDocumentsClient.QueryDocuments.g.cs @@ -10,7 +10,9 @@ public partial interface IDocumentsClient /// order on one with `order_by`, page with `limit` + `cursor`. Values
/// compare with JSON semantics (numbers as numbers, strings lexically, so
/// ISO-8601 timestamps order as dates). A read carrying a body, hence a
- /// POST on a literal sub-path; `query` and `batch` are reserved document ids.
+ /// POST on a literal sub-path; `query`, `aggregate` and `batch` are
+ /// reserved document ids. For a count or a total, `aggregate` answers in
+ /// one request instead of a page walk.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// @@ -34,7 +36,9 @@ public partial interface IDocumentsClient /// order on one with `order_by`, page with `limit` + `cursor`. Values
/// compare with JSON semantics (numbers as numbers, strings lexically, so
/// ISO-8601 timestamps order as dates). A read carrying a body, hence a
- /// POST on a literal sub-path; `query` and `batch` are reserved document ids.
+ /// POST on a literal sub-path; `query`, `aggregate` and `batch` are
+ /// reserved document ids. For a count or a total, `aggregate` answers in
+ /// one request instead of a page walk.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// @@ -58,7 +62,9 @@ public partial interface IDocumentsClient /// order on one with `order_by`, page with `limit` + `cursor`. Values
/// compare with JSON semantics (numbers as numbers, strings lexically, so
/// ISO-8601 timestamps order as dates). A read carrying a body, hence a
- /// POST on a literal sub-path; `query` and `batch` are reserved document ids.
+ /// POST on a literal sub-path; `query`, `aggregate` and `batch` are
+ /// reserved document ids. For a count or a total, `aggregate` answers in
+ /// one request instead of a page walk.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// diff --git a/src/libs/Speechify/Generated/Speechify.IDocumentsClient.UpdateDocument.g.cs b/src/libs/Speechify/Generated/Speechify.IDocumentsClient.UpdateDocument.g.cs index 868cb8f4..c7d27480 100644 --- a/src/libs/Speechify/Generated/Speechify.IDocumentsClient.UpdateDocument.g.cs +++ b/src/libs/Speechify/Generated/Speechify.IDocumentsClient.UpdateDocument.g.cs @@ -7,13 +7,16 @@ public partial interface IDocumentsClient /// /// Update Document
/// Shallow-merge `data` into the stored document (a JSON null removes a
- /// field) and write the result as a new version.
+ /// field) and write the result as a new version. `If-Match` makes the
+ /// merge conditional on the `revision` you read, so a patch never lands on
+ /// top of an edit you have not seen.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). ///
/// /// /// /// + /// /// /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. /// The token to cancel the operation with @@ -25,18 +28,22 @@ public partial interface IDocumentsClient global::Speechify.WriteStoreDocumentRequest request, string? speechifyVersion = default, + string? ifMatch = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default); /// /// Update Document
/// Shallow-merge `data` into the stored document (a JSON null removes a
- /// field) and write the result as a new version.
+ /// field) and write the result as a new version. `If-Match` makes the
+ /// merge conditional on the `revision` you read, so a patch never lands on
+ /// top of an edit you have not seen.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). ///
/// /// /// /// + /// /// /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. /// The token to cancel the operation with @@ -48,18 +55,22 @@ public partial interface IDocumentsClient global::Speechify.WriteStoreDocumentRequest request, string? speechifyVersion = default, + string? ifMatch = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default); /// /// Update Document
/// Shallow-merge `data` into the stored document (a JSON null removes a
- /// field) and write the result as a new version.
+ /// field) and write the result as a new version. `If-Match` makes the
+ /// merge conditional on the `revision` you read, so a patch never lands on
+ /// top of an edit you have not seen.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). ///
/// /// /// /// + /// /// /// On `createDocument`, the id to write at (letters, digits, `_ . - : ~ @ +`, at most 200,
/// not the reserved `query` or `batch`); minted when absent. Ignored on `putDocument` /
@@ -77,6 +88,7 @@ public partial interface IDocumentsClient string documentId, object data, string? speechifyVersion = default, + string? ifMatch = default, string? id = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default); diff --git a/src/libs/Speechify/Generated/Speechify.IHostedApisClient.Create.g.cs b/src/libs/Speechify/Generated/Speechify.IHostedApisClient.Create.g.cs index 91b26c15..db3d6902 100644 --- a/src/libs/Speechify/Generated/Speechify.IHostedApisClient.Create.g.cs +++ b/src/libs/Speechify/Generated/Speechify.IHostedApisClient.Create.g.cs @@ -68,7 +68,13 @@ public partial interface IHostedApisClient /// /// Runs the API may start per UTC day through its run routes; 1000 when omitted. /// + /// + /// Reads the API may serve from storage per UTC day; 100000 when omitted. + /// /// + /// + /// Register the key set end-user tokens are verified against (an `https` URL on a public host). + /// /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. /// The token to cancel the operation with /// @@ -81,7 +87,9 @@ public partial interface IHostedApisClient global::Speechify.CreateHostedApiRequestAuthMode? authMode = default, global::System.Collections.Generic.IList? corsOrigins = default, int? dailyRunCap = default, + int? dailyReadCap = default, string? projectId = default, + string? userTokenJwksUrl = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default); } diff --git a/src/libs/Speechify/Generated/Speechify.IHostedApisClient.GetUsage.g.cs b/src/libs/Speechify/Generated/Speechify.IHostedApisClient.GetUsage.g.cs new file mode 100644 index 00000000..59004f8f --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.IHostedApisClient.GetUsage.g.cs @@ -0,0 +1,46 @@ +#nullable enable + +namespace Speechify +{ + public partial interface IHostedApisClient + { + /// + /// Get Hosted API Usage
+ /// Today's reads and runs against the API's daily caps, with each route's
+ /// share of the reads. A read is a request a store, file or run_latest
+ /// route answered from storage; a response served from the cache is not
+ /// one. `counters_available` is false where nothing counts (no Redis), so
+ /// a zero is never mistaken for a quiet day.
+ /// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). + ///
+ /// + /// + /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. + /// The token to cancel the operation with + /// + global::System.Threading.Tasks.Task GetUsageAsync( + string apiId, + string? speechifyVersion = default, + global::Speechify.AutoSDKRequestOptions? requestOptions = default, + global::System.Threading.CancellationToken cancellationToken = default); + /// + /// Get Hosted API Usage
+ /// Today's reads and runs against the API's daily caps, with each route's
+ /// share of the reads. A read is a request a store, file or run_latest
+ /// route answered from storage; a response served from the cache is not
+ /// one. `counters_available` is false where nothing counts (no Redis), so
+ /// a zero is never mistaken for a quiet day.
+ /// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). + ///
+ /// + /// + /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. + /// The token to cancel the operation with + /// + global::System.Threading.Tasks.Task> GetUsageAsResponseAsync( + string apiId, + string? speechifyVersion = default, + global::Speechify.AutoSDKRequestOptions? requestOptions = default, + global::System.Threading.CancellationToken cancellationToken = default); + } +} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.IHostedApisClient.RotateUserTokenSecret.g.cs b/src/libs/Speechify/Generated/Speechify.IHostedApisClient.RotateUserTokenSecret.g.cs new file mode 100644 index 00000000..8d619ab9 --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.IHostedApisClient.RotateUserTokenSecret.g.cs @@ -0,0 +1,60 @@ +#nullable enable + +namespace Speechify +{ + public partial interface IHostedApisClient + { + /// + /// Rotate End-User Token Secret
+ /// Mint the signing secret end-user tokens are verified against, replacing
+ /// any previous one at once: every token signed with the old secret stops
+ /// verifying. The plaintext is in this response and nowhere else; later
+ /// reads show `user_token_secret_hint`. Your backend signs a JWT with it
+ /// (HS256) carrying `sub` (the user, at most 256 characters) and `exp`
+ /// (within 24 hours), and the consumer presents it as
+ /// `Authorization: Bearer <token>`. Register `user_token_jwks_url`
+ /// instead to verify with your own keys.
+ /// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). + ///
+ /// + /// + /// + /// Optional idempotency key. When omitted, the SDK generates one for this request. + /// + /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. + /// The token to cancel the operation with + /// + global::System.Threading.Tasks.Task RotateUserTokenSecretAsync( + string apiId, + string? speechifyVersion = default, + string? idempotencyKey = default, + global::Speechify.AutoSDKRequestOptions? requestOptions = default, + global::System.Threading.CancellationToken cancellationToken = default); + /// + /// Rotate End-User Token Secret
+ /// Mint the signing secret end-user tokens are verified against, replacing
+ /// any previous one at once: every token signed with the old secret stops
+ /// verifying. The plaintext is in this response and nowhere else; later
+ /// reads show `user_token_secret_hint`. Your backend signs a JWT with it
+ /// (HS256) carrying `sub` (the user, at most 256 characters) and `exp`
+ /// (within 24 hours), and the consumer presents it as
+ /// `Authorization: Bearer <token>`. Register `user_token_jwks_url`
+ /// instead to verify with your own keys.
+ /// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). + ///
+ /// + /// + /// + /// Optional idempotency key. When omitted, the SDK generates one for this request. + /// + /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. + /// The token to cancel the operation with + /// + global::System.Threading.Tasks.Task> RotateUserTokenSecretAsResponseAsync( + string apiId, + string? speechifyVersion = default, + string? idempotencyKey = default, + global::Speechify.AutoSDKRequestOptions? requestOptions = default, + global::System.Threading.CancellationToken cancellationToken = default); + } +} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.IHostedApisClient.Update.g.cs b/src/libs/Speechify/Generated/Speechify.IHostedApisClient.Update.g.cs index 9bcbdcc7..e7e5699e 100644 --- a/src/libs/Speechify/Generated/Speechify.IHostedApisClient.Update.g.cs +++ b/src/libs/Speechify/Generated/Speechify.IHostedApisClient.Update.g.cs @@ -8,7 +8,9 @@ public partial interface IHostedApisClient /// Update Hosted API
/// Update a hosted API (merge-patch). Switching to `public` is refused
/// while a `run` route exists: an anonymous caller must not start runs
- /// that spend the workspace's budget.
+ /// that spend the workspace's budget. Switching away from `user_token`
+ /// is refused while a route binds `{{user.*}}`: nothing else supplies
+ /// a user.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// @@ -28,7 +30,9 @@ public partial interface IHostedApisClient /// Update Hosted API
/// Update a hosted API (merge-patch). Switching to `public` is refused
/// while a `run` route exists: an anonymous caller must not start runs
- /// that spend the workspace's budget.
+ /// that spend the workspace's budget. Switching away from `user_token`
+ /// is refused while a route binds `{{user.*}}`: nothing else supplies
+ /// a user.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// @@ -48,7 +52,9 @@ public partial interface IHostedApisClient /// Update Hosted API
/// Update a hosted API (merge-patch). Switching to `public` is refused
/// while a `run` route exists: an anonymous caller must not start runs
- /// that spend the workspace's budget.
+ /// that spend the workspace's budget. Switching away from `user_token`
+ /// is refused while a route binds `{{user.*}}`: nothing else supplies
+ /// a user.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// @@ -61,6 +67,10 @@ public partial interface IHostedApisClient /// A paused API answers 503 to every consumer request. /// /// + /// + /// + /// Replace the registered key set; an empty string removes it, after which the signing secret verifies tokens again. + /// /// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering. /// The token to cancel the operation with /// @@ -73,6 +83,8 @@ public partial interface IHostedApisClient global::System.Collections.Generic.IList? corsOrigins = default, bool? enabled = default, int? dailyRunCap = default, + int? dailyReadCap = default, + string? userTokenJwksUrl = default, global::Speechify.AutoSDKRequestOptions? requestOptions = default, global::System.Threading.CancellationToken cancellationToken = default); } diff --git a/src/libs/Speechify/Generated/Speechify.IRoutesClient.CreateRoute.g.cs b/src/libs/Speechify/Generated/Speechify.IRoutesClient.CreateRoute.g.cs index 123d1e31..07b56ebc 100644 --- a/src/libs/Speechify/Generated/Speechify.IRoutesClient.CreateRoute.g.cs +++ b/src/libs/Speechify/Generated/Speechify.IRoutesClient.CreateRoute.g.cs @@ -11,10 +11,16 @@ public partial interface IRoutesClient /// structured output of a schedule trigger's runs; `run` starts a run
/// through a webhook trigger per request (POST only, never on a public
/// API) and waits up to `wait_seconds` before answering 202 with a
- /// handle to poll at `/_runs/{run_id}`. Where-clause values and the
+ /// handle to poll at `/_runs/{run_id}`; `file` serves one published file,
+ /// or a whole published tree when the path ends in `*` (`/app/*` with
+ /// `file_root` and `file_index`). Where-clause values and the
/// document id may be `{{query.x}}`, `{{path.x}}` or `{{body.x}}`
- /// templates bound from the consumer's request; a clause whose template
- /// is absent is skipped.
+ /// templates bound from the consumer's request, or `{{user.x}}` claims
+ /// of the verified end-user token on a `user_token` API; a clause whose
+ /// template is absent is skipped. Two bindings are refused at write
+ /// time: `{{user.*}}` on an API that does not verify end-user tokens,
+ /// and a clause on `user_identity` bound from a request template, which
+ /// would let any caller read any user's rows.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// @@ -41,10 +47,16 @@ public partial interface IRoutesClient /// structured output of a schedule trigger's runs; `run` starts a run
/// through a webhook trigger per request (POST only, never on a public
/// API) and waits up to `wait_seconds` before answering 202 with a
- /// handle to poll at `/_runs/{run_id}`. Where-clause values and the
+ /// handle to poll at `/_runs/{run_id}`; `file` serves one published file,
+ /// or a whole published tree when the path ends in `*` (`/app/*` with
+ /// `file_root` and `file_index`). Where-clause values and the
/// document id may be `{{query.x}}`, `{{path.x}}` or `{{body.x}}`
- /// templates bound from the consumer's request; a clause whose template
- /// is absent is skipped.
+ /// templates bound from the consumer's request, or `{{user.x}}` claims
+ /// of the verified end-user token on a `user_token` API; a clause whose
+ /// template is absent is skipped. Two bindings are refused at write
+ /// time: `{{user.*}}` on an API that does not verify end-user tokens,
+ /// and a clause on `user_identity` bound from a request template, which
+ /// would let any caller read any user's rows.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// @@ -71,10 +83,16 @@ public partial interface IRoutesClient /// structured output of a schedule trigger's runs; `run` starts a run
/// through a webhook trigger per request (POST only, never on a public
/// API) and waits up to `wait_seconds` before answering 202 with a
- /// handle to poll at `/_runs/{run_id}`. Where-clause values and the
+ /// handle to poll at `/_runs/{run_id}`; `file` serves one published file,
+ /// or a whole published tree when the path ends in `*` (`/app/*` with
+ /// `file_root` and `file_index`). Where-clause values and the
/// document id may be `{{query.x}}`, `{{path.x}}` or `{{body.x}}`
- /// templates bound from the consumer's request; a clause whose template
- /// is absent is skipped.
+ /// templates bound from the consumer's request, or `{{user.x}}` claims
+ /// of the verified end-user token on a `user_token` API; a clause whose
+ /// template is absent is skipped. Two bindings are refused at write
+ /// time: `{{user.*}}` on an API that does not verify end-user tokens,
+ /// and a clause on `user_identity` bound from a request template, which
+ /// would let any caller read any user's rows.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). /// /// @@ -92,9 +110,13 @@ public partial interface IRoutesClient /// What answers a route. `type` selects the fields that apply:
/// `store_query` (store_id, collection, where, order_by, limit),
/// `store_document` (store_id, collection, document_id),
+ /// `store_aggregate` (store_id, collection, where, group_by, metrics:
+ /// a summary in one request, from the same implementation as the
+ /// collection's `aggregate` operation),
/// `run_latest` (trigger_id of a schedule trigger),
/// `run` (trigger_id of a webhook trigger, wait_seconds),
- /// `file` (file_path of a published file). + /// `file` (file_path of one published file; or, on a route whose path
+ /// ends in `*`, file_root and file_index for a whole published tree). /// /// /// diff --git a/src/libs/Speechify/Generated/Speechify.IRoutesClient.UpdateRoute.g.cs b/src/libs/Speechify/Generated/Speechify.IRoutesClient.UpdateRoute.g.cs index 4067e40e..87ecd2f5 100644 --- a/src/libs/Speechify/Generated/Speechify.IRoutesClient.UpdateRoute.g.cs +++ b/src/libs/Speechify/Generated/Speechify.IRoutesClient.UpdateRoute.g.cs @@ -60,9 +60,13 @@ public partial interface IRoutesClient /// What answers a route. `type` selects the fields that apply:
/// `store_query` (store_id, collection, where, order_by, limit),
/// `store_document` (store_id, collection, document_id),
+ /// `store_aggregate` (store_id, collection, where, group_by, metrics:
+ /// a summary in one request, from the same implementation as the
+ /// collection's `aggregate` operation),
/// `run_latest` (trigger_id of a schedule trigger),
/// `run` (trigger_id of a webhook trigger, wait_seconds),
- /// `file` (file_path of a published file). + /// `file` (file_path of one published file; or, on a route whose path
+ /// ends in `*`, file_root and file_index for a whole published tree). /// /// /// diff --git a/src/libs/Speechify/Generated/Speechify.JsonConverters.ConversationChannel.g.cs b/src/libs/Speechify/Generated/Speechify.JsonConverters.ConversationChannel.g.cs new file mode 100644 index 00000000..85418203 --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.JsonConverters.ConversationChannel.g.cs @@ -0,0 +1,53 @@ +#nullable enable + +namespace Speechify.JsonConverters +{ + /// + public sealed class ConversationChannelJsonConverter : global::System.Text.Json.Serialization.JsonConverter + { + /// + public override global::Speechify.ConversationChannel Read( + ref global::System.Text.Json.Utf8JsonReader reader, + global::System.Type typeToConvert, + global::System.Text.Json.JsonSerializerOptions options) + { + switch (reader.TokenType) + { + case global::System.Text.Json.JsonTokenType.String: + { + var stringValue = reader.GetString(); + if (stringValue != null) + { + return global::Speechify.ConversationChannelExtensions.ToEnum(stringValue) ?? default; + } + + break; + } + case global::System.Text.Json.JsonTokenType.Number: + { + var numValue = reader.GetInt32(); + return (global::Speechify.ConversationChannel)numValue; + } + case global::System.Text.Json.JsonTokenType.Null: + { + return default(global::Speechify.ConversationChannel); + } + default: + throw new global::System.ArgumentOutOfRangeException(nameof(reader)); + } + + return default; + } + + /// + public override void Write( + global::System.Text.Json.Utf8JsonWriter writer, + global::Speechify.ConversationChannel value, + global::System.Text.Json.JsonSerializerOptions options) + { + writer = writer ?? throw new global::System.ArgumentNullException(nameof(writer)); + + writer.WriteStringValue(global::Speechify.ConversationChannelExtensions.ToValueString(value)); + } + } +} diff --git a/src/libs/Speechify/Generated/Speechify.JsonConverters.ConversationChannelNullable.g.cs b/src/libs/Speechify/Generated/Speechify.JsonConverters.ConversationChannelNullable.g.cs new file mode 100644 index 00000000..15bf98ea --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.JsonConverters.ConversationChannelNullable.g.cs @@ -0,0 +1,60 @@ +#nullable enable + +namespace Speechify.JsonConverters +{ + /// + public sealed class ConversationChannelNullableJsonConverter : global::System.Text.Json.Serialization.JsonConverter + { + /// + public override global::Speechify.ConversationChannel? Read( + ref global::System.Text.Json.Utf8JsonReader reader, + global::System.Type typeToConvert, + global::System.Text.Json.JsonSerializerOptions options) + { + switch (reader.TokenType) + { + case global::System.Text.Json.JsonTokenType.String: + { + var stringValue = reader.GetString(); + if (stringValue != null) + { + return global::Speechify.ConversationChannelExtensions.ToEnum(stringValue); + } + + break; + } + case global::System.Text.Json.JsonTokenType.Number: + { + var numValue = reader.GetInt32(); + return (global::Speechify.ConversationChannel)numValue; + } + case global::System.Text.Json.JsonTokenType.Null: + { + return default(global::Speechify.ConversationChannel?); + } + default: + throw new global::System.ArgumentOutOfRangeException(nameof(reader)); + } + + return default; + } + + /// + public override void Write( + global::System.Text.Json.Utf8JsonWriter writer, + global::Speechify.ConversationChannel? value, + global::System.Text.Json.JsonSerializerOptions options) + { + writer = writer ?? throw new global::System.ArgumentNullException(nameof(writer)); + + if (value == null) + { + writer.WriteNullValue(); + } + else + { + writer.WriteStringValue(global::Speechify.ConversationChannelExtensions.ToValueString(value.Value)); + } + } + } +} diff --git a/src/libs/Speechify/Generated/Speechify.JsonConverters.PhoneNumberRelayHealth.g.cs b/src/libs/Speechify/Generated/Speechify.JsonConverters.StoreAggregateMetricOp.g.cs similarity index 70% rename from src/libs/Speechify/Generated/Speechify.JsonConverters.PhoneNumberRelayHealth.g.cs rename to src/libs/Speechify/Generated/Speechify.JsonConverters.StoreAggregateMetricOp.g.cs index ce26c388..dbd66f34 100644 --- a/src/libs/Speechify/Generated/Speechify.JsonConverters.PhoneNumberRelayHealth.g.cs +++ b/src/libs/Speechify/Generated/Speechify.JsonConverters.StoreAggregateMetricOp.g.cs @@ -3,10 +3,10 @@ namespace Speechify.JsonConverters { /// - public sealed class PhoneNumberRelayHealthJsonConverter : global::System.Text.Json.Serialization.JsonConverter + public sealed class StoreAggregateMetricOpJsonConverter : global::System.Text.Json.Serialization.JsonConverter { /// - public override global::Speechify.PhoneNumberRelayHealth Read( + public override global::Speechify.StoreAggregateMetricOp Read( ref global::System.Text.Json.Utf8JsonReader reader, global::System.Type typeToConvert, global::System.Text.Json.JsonSerializerOptions options) @@ -18,7 +18,7 @@ public sealed class PhoneNumberRelayHealthJsonConverter : global::System.Text.Js var stringValue = reader.GetString(); if (stringValue != null) { - return global::Speechify.PhoneNumberRelayHealthExtensions.ToEnum(stringValue) ?? default; + return global::Speechify.StoreAggregateMetricOpExtensions.ToEnum(stringValue) ?? default; } break; @@ -26,11 +26,11 @@ public sealed class PhoneNumberRelayHealthJsonConverter : global::System.Text.Js case global::System.Text.Json.JsonTokenType.Number: { var numValue = reader.GetInt32(); - return (global::Speechify.PhoneNumberRelayHealth)numValue; + return (global::Speechify.StoreAggregateMetricOp)numValue; } case global::System.Text.Json.JsonTokenType.Null: { - return default(global::Speechify.PhoneNumberRelayHealth); + return default(global::Speechify.StoreAggregateMetricOp); } default: throw new global::System.ArgumentOutOfRangeException(nameof(reader)); @@ -42,12 +42,12 @@ public sealed class PhoneNumberRelayHealthJsonConverter : global::System.Text.Js /// public override void Write( global::System.Text.Json.Utf8JsonWriter writer, - global::Speechify.PhoneNumberRelayHealth value, + global::Speechify.StoreAggregateMetricOp value, global::System.Text.Json.JsonSerializerOptions options) { writer = writer ?? throw new global::System.ArgumentNullException(nameof(writer)); - writer.WriteStringValue(global::Speechify.PhoneNumberRelayHealthExtensions.ToValueString(value)); + writer.WriteStringValue(global::Speechify.StoreAggregateMetricOpExtensions.ToValueString(value)); } } } diff --git a/src/libs/Speechify/Generated/Speechify.JsonConverters.PhoneNumberRelayHealthNullable.g.cs b/src/libs/Speechify/Generated/Speechify.JsonConverters.StoreAggregateMetricOpNullable.g.cs similarity index 72% rename from src/libs/Speechify/Generated/Speechify.JsonConverters.PhoneNumberRelayHealthNullable.g.cs rename to src/libs/Speechify/Generated/Speechify.JsonConverters.StoreAggregateMetricOpNullable.g.cs index 6fdf1ab5..4683a54f 100644 --- a/src/libs/Speechify/Generated/Speechify.JsonConverters.PhoneNumberRelayHealthNullable.g.cs +++ b/src/libs/Speechify/Generated/Speechify.JsonConverters.StoreAggregateMetricOpNullable.g.cs @@ -3,10 +3,10 @@ namespace Speechify.JsonConverters { /// - public sealed class PhoneNumberRelayHealthNullableJsonConverter : global::System.Text.Json.Serialization.JsonConverter + public sealed class StoreAggregateMetricOpNullableJsonConverter : global::System.Text.Json.Serialization.JsonConverter { /// - public override global::Speechify.PhoneNumberRelayHealth? Read( + public override global::Speechify.StoreAggregateMetricOp? Read( ref global::System.Text.Json.Utf8JsonReader reader, global::System.Type typeToConvert, global::System.Text.Json.JsonSerializerOptions options) @@ -18,7 +18,7 @@ public sealed class PhoneNumberRelayHealthNullableJsonConverter : global::System var stringValue = reader.GetString(); if (stringValue != null) { - return global::Speechify.PhoneNumberRelayHealthExtensions.ToEnum(stringValue); + return global::Speechify.StoreAggregateMetricOpExtensions.ToEnum(stringValue); } break; @@ -26,11 +26,11 @@ public sealed class PhoneNumberRelayHealthNullableJsonConverter : global::System case global::System.Text.Json.JsonTokenType.Number: { var numValue = reader.GetInt32(); - return (global::Speechify.PhoneNumberRelayHealth)numValue; + return (global::Speechify.StoreAggregateMetricOp)numValue; } case global::System.Text.Json.JsonTokenType.Null: { - return default(global::Speechify.PhoneNumberRelayHealth?); + return default(global::Speechify.StoreAggregateMetricOp?); } default: throw new global::System.ArgumentOutOfRangeException(nameof(reader)); @@ -42,7 +42,7 @@ public sealed class PhoneNumberRelayHealthNullableJsonConverter : global::System /// public override void Write( global::System.Text.Json.Utf8JsonWriter writer, - global::Speechify.PhoneNumberRelayHealth? value, + global::Speechify.StoreAggregateMetricOp? value, global::System.Text.Json.JsonSerializerOptions options) { writer = writer ?? throw new global::System.ArgumentNullException(nameof(writer)); @@ -53,7 +53,7 @@ public override void Write( } else { - writer.WriteStringValue(global::Speechify.PhoneNumberRelayHealthExtensions.ToValueString(value.Value)); + writer.WriteStringValue(global::Speechify.StoreAggregateMetricOpExtensions.ToValueString(value.Value)); } } } diff --git a/src/libs/Speechify/Generated/Speechify.JsonSerializerContext.g.cs b/src/libs/Speechify/Generated/Speechify.JsonSerializerContext.g.cs index 2197a555..5c759dc7 100644 --- a/src/libs/Speechify/Generated/Speechify.JsonSerializerContext.g.cs +++ b/src/libs/Speechify/Generated/Speechify.JsonSerializerContext.g.cs @@ -198,6 +198,7 @@ namespace Speechify [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.CreateConversationRequest))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.ConversationStatus), TypeInfoPropertyName = "ConversationStatus2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.ConversationTransport), TypeInfoPropertyName = "ConversationTransport2")] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.ConversationChannel), TypeInfoPropertyName = "ConversationChannel2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.ConversationEndReason), TypeInfoPropertyName = "ConversationEndReason2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.SkillPin))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.AgentSnapshotInterruptionSensitivity), TypeInfoPropertyName = "AgentSnapshotInterruptionSensitivity2")] @@ -506,14 +507,13 @@ namespace Speechify [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.CreateShareLinkSessionRequest))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.ShareLinkSession))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.PhoneNumberProvider), TypeInfoPropertyName = "PhoneNumberProvider2")] - [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.PhoneNumberRelayHealth), TypeInfoPropertyName = "PhoneNumberRelayHealth2")] - [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.PhoneNumberRelay))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.PhoneNumberCapability), TypeInfoPropertyName = "PhoneNumberCapability2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.PhoneNumberReputationRisk), TypeInfoPropertyName = "PhoneNumberReputationRisk2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.PhoneNumberReputation))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.PhoneNumber))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.IList))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.ListPhoneNumbersResponse))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.IList))] internal sealed partial class SourceGenerationContextChunk0 : global::System.Text.Json.Serialization.JsonSerializerContext { } @@ -526,7 +526,6 @@ internal sealed partial class SourceGenerationContextChunk0 : global::System.Tex Converters = new global::System.Type[] { })] - [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.IList))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.TwilioImportSpec))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.TelnyxImportSpec))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.ImportPhoneNumberRequest))] @@ -640,6 +639,14 @@ internal sealed partial class SourceGenerationContextChunk0 : global::System.Tex [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.StoreOrderBy))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.StoreDocumentQuery))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.IList))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.StoreAggregateMetricOp), TypeInfoPropertyName = "StoreAggregateMetricOp2")] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.StoreAggregateMetric))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.StoreAggregateQuery))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.IList))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.StoreAggregateGroup))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.Dictionary))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.StoreAggregateResponse))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.IList))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.StoreBatchWriteOp), TypeInfoPropertyName = "StoreBatchWriteOp2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.StoreBatchWrite))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.StoreBatchRequest))] @@ -657,6 +664,9 @@ internal sealed partial class SourceGenerationContextChunk0 : global::System.Tex [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.CreateHostedAPIRequest))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.UpdateHostedApiRequestAuthMode), TypeInfoPropertyName = "UpdateHostedApiRequestAuthMode2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.UpdateHostedAPIRequest))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.HostedApiUsageRoutesItems))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.HostedAPIUsage))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.IList))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.HostedApiRouteMethod), TypeInfoPropertyName = "HostedApiRouteMethod2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.HostedApiResolverType), TypeInfoPropertyName = "HostedApiResolverType2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.HostedApiResolverWhereItemsOp), TypeInfoPropertyName = "HostedApiResolverWhereItemsOp2")] @@ -676,6 +686,7 @@ internal sealed partial class SourceGenerationContextChunk0 : global::System.Tex [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.ListHostedAPIKeysResponse))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.IList))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.CreateHostedAPIKeyRequest))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.HostedAPIUserTokenSecret))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.ContactIdentifierKind), TypeInfoPropertyName = "ContactIdentifierKind2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.ContactIdentifierAssertedBy), TypeInfoPropertyName = "ContactIdentifierAssertedBy2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.ContactIdentifier))] @@ -795,6 +806,7 @@ internal sealed partial class SourceGenerationContextChunk0 : global::System.Tex [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.DynamicVariableType?), TypeInfoPropertyName = "NullableDynamicVariableType2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.ConversationStatus?), TypeInfoPropertyName = "NullableConversationStatus2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.ConversationTransport?), TypeInfoPropertyName = "NullableConversationTransport2")] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.ConversationChannel?), TypeInfoPropertyName = "NullableConversationChannel2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.ConversationEndReason?), TypeInfoPropertyName = "NullableConversationEndReason2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.AgentSnapshotInterruptionSensitivity?), TypeInfoPropertyName = "NullableAgentSnapshotInterruptionSensitivity2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.AgentSnapshotBackgroundNoisePreset?), TypeInfoPropertyName = "NullableAgentSnapshotBackgroundNoisePreset2")] @@ -868,7 +880,6 @@ internal sealed partial class SourceGenerationContextChunk0 : global::System.Tex [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.ShareLinkStatus?), TypeInfoPropertyName = "NullableShareLinkStatus2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.CreateShareLinkResponseStatus?), TypeInfoPropertyName = "NullableCreateShareLinkResponseStatus2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.PhoneNumberProvider?), TypeInfoPropertyName = "NullablePhoneNumberProvider2")] - [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.PhoneNumberRelayHealth?), TypeInfoPropertyName = "NullablePhoneNumberRelayHealth2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.PhoneNumberCapability?), TypeInfoPropertyName = "NullablePhoneNumberCapability2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.PhoneNumberReputationRisk?), TypeInfoPropertyName = "NullablePhoneNumberReputationRisk2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.PurchasedPhoneNumberProvider?), TypeInfoPropertyName = "NullablePurchasedPhoneNumberProvider2")] @@ -888,6 +899,7 @@ internal sealed partial class SourceGenerationContextChunk0 : global::System.Tex [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.V1FilesPostRequestBodyContentMultipartFormDataSchemaKind?), TypeInfoPropertyName = "NullableV1FilesPostRequestBodyContentMultipartFormDataSchemaKind2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.StoreWhereClauseOp?), TypeInfoPropertyName = "NullableStoreWhereClauseOp2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.StoreOrderByDirection?), TypeInfoPropertyName = "NullableStoreOrderByDirection2")] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.StoreAggregateMetricOp?), TypeInfoPropertyName = "NullableStoreAggregateMetricOp2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.StoreBatchWriteOp?), TypeInfoPropertyName = "NullableStoreBatchWriteOp2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.StoreBatchResultOp?), TypeInfoPropertyName = "NullableStoreBatchResultOp2")] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::Speechify.HostedApiAuthMode?), TypeInfoPropertyName = "NullableHostedApiAuthMode2")] @@ -1014,18 +1026,6 @@ internal sealed partial class SourceGenerationContextChunk0 : global::System.Tex [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] - [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] - [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] - [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] - [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] - [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] - [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] - [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] - [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] - [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] - [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] - [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] - [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] internal sealed partial class SourceGenerationContextChunk1 : global::System.Text.Json.Serialization.JsonSerializerContext { } @@ -1038,6 +1038,21 @@ internal sealed partial class SourceGenerationContextChunk1 : global::System.Tex Converters = new global::System.Type[] { })] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] + [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] [global::System.Text.Json.Serialization.JsonSerializable(typeof(global::System.Collections.Generic.List))] @@ -1277,6 +1292,10 @@ public override bool CanConvert(global::System.Type typeToConvert) || typeToConvert == typeof(global::Speechify.ConversationTransport?) + || typeToConvert == typeof(global::Speechify.ConversationChannel) + + || typeToConvert == typeof(global::Speechify.ConversationChannel?) + || typeToConvert == typeof(global::Speechify.ConversationEndReason) || typeToConvert == typeof(global::Speechify.ConversationEndReason?) @@ -1525,10 +1544,6 @@ public override bool CanConvert(global::System.Type typeToConvert) || typeToConvert == typeof(global::Speechify.PhoneNumberProvider?) - || typeToConvert == typeof(global::Speechify.PhoneNumberRelayHealth) - - || typeToConvert == typeof(global::Speechify.PhoneNumberRelayHealth?) - || typeToConvert == typeof(global::Speechify.PhoneNumberCapability) || typeToConvert == typeof(global::Speechify.PhoneNumberCapability?) @@ -1605,6 +1620,10 @@ public override bool CanConvert(global::System.Type typeToConvert) || typeToConvert == typeof(global::Speechify.StoreOrderByDirection?) + || typeToConvert == typeof(global::Speechify.StoreAggregateMetricOp) + + || typeToConvert == typeof(global::Speechify.StoreAggregateMetricOp?) + || typeToConvert == typeof(global::Speechify.StoreBatchWriteOp) || typeToConvert == typeof(global::Speechify.StoreBatchWriteOp?) @@ -2104,6 +2123,16 @@ public override bool CanConvert(global::System.Type typeToConvert) return new global::Speechify.JsonConverters.ConversationTransportNullableJsonConverter(); } + if (typeToConvert == typeof(global::Speechify.ConversationChannel)) + { + return new global::Speechify.JsonConverters.ConversationChannelJsonConverter(); + } + + if (typeToConvert == typeof(global::Speechify.ConversationChannel?)) + { + return new global::Speechify.JsonConverters.ConversationChannelNullableJsonConverter(); + } + if (typeToConvert == typeof(global::Speechify.ConversationEndReason)) { return new global::Speechify.JsonConverters.ConversationEndReasonJsonConverter(); @@ -2724,16 +2753,6 @@ public override bool CanConvert(global::System.Type typeToConvert) return new global::Speechify.JsonConverters.PhoneNumberProviderNullableJsonConverter(); } - if (typeToConvert == typeof(global::Speechify.PhoneNumberRelayHealth)) - { - return new global::Speechify.JsonConverters.PhoneNumberRelayHealthJsonConverter(); - } - - if (typeToConvert == typeof(global::Speechify.PhoneNumberRelayHealth?)) - { - return new global::Speechify.JsonConverters.PhoneNumberRelayHealthNullableJsonConverter(); - } - if (typeToConvert == typeof(global::Speechify.PhoneNumberCapability)) { return new global::Speechify.JsonConverters.PhoneNumberCapabilityJsonConverter(); @@ -2924,6 +2943,16 @@ public override bool CanConvert(global::System.Type typeToConvert) return new global::Speechify.JsonConverters.StoreOrderByDirectionNullableJsonConverter(); } + if (typeToConvert == typeof(global::Speechify.StoreAggregateMetricOp)) + { + return new global::Speechify.JsonConverters.StoreAggregateMetricOpJsonConverter(); + } + + if (typeToConvert == typeof(global::Speechify.StoreAggregateMetricOp?)) + { + return new global::Speechify.JsonConverters.StoreAggregateMetricOpNullableJsonConverter(); + } + if (typeToConvert == typeof(global::Speechify.StoreBatchWriteOp)) { return new global::Speechify.JsonConverters.StoreBatchWriteOpJsonConverter(); diff --git a/src/libs/Speechify/Generated/Speechify.JsonSerializerContextTypes.g.cs b/src/libs/Speechify/Generated/Speechify.JsonSerializerContextTypes.g.cs index d537ed45..381cc9e6 100644 --- a/src/libs/Speechify/Generated/Speechify.JsonSerializerContextTypes.g.cs +++ b/src/libs/Speechify/Generated/Speechify.JsonSerializerContextTypes.g.cs @@ -757,2155 +757,2199 @@ public sealed partial class JsonSerializerContextTypes /// /// /// - public global::Speechify.ConversationEndReason? Type181 { get; set; } + public global::Speechify.ConversationChannel? Type181 { get; set; } /// /// /// - public global::Speechify.SkillPin? Type182 { get; set; } + public global::Speechify.ConversationEndReason? Type182 { get; set; } /// /// /// - public global::Speechify.AgentSnapshotInterruptionSensitivity? Type183 { get; set; } + public global::Speechify.SkillPin? Type183 { get; set; } /// /// /// - public global::Speechify.AgentSnapshotBackgroundNoisePreset? Type184 { get; set; } + public global::Speechify.AgentSnapshotInterruptionSensitivity? Type184 { get; set; } /// /// /// - public global::Speechify.AgentSnapshot? Type185 { get; set; } + public global::Speechify.AgentSnapshotBackgroundNoisePreset? Type185 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type186 { get; set; } + public global::Speechify.AgentSnapshot? Type186 { get; set; } /// /// /// - public global::Speechify.ConversationIvrSurrenderReason? Type187 { get; set; } + public global::System.Collections.Generic.IList? Type187 { get; set; } /// /// /// - public global::Speechify.Conversation? Type188 { get; set; } + public global::Speechify.ConversationIvrSurrenderReason? Type188 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type189 { get; set; } + public global::Speechify.Conversation? Type189 { get; set; } /// /// /// - public global::Speechify.CreateConversationResponse? Type190 { get; set; } + public global::System.Collections.Generic.IList? Type190 { get; set; } /// /// /// - public global::Speechify.CreateSessionRequest? Type191 { get; set; } + public global::Speechify.CreateConversationResponse? Type191 { get; set; } /// /// /// - public global::Speechify.ListConversationsResponse? Type192 { get; set; } + public global::Speechify.CreateSessionRequest? Type192 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type193 { get; set; } + public global::Speechify.ListConversationsResponse? Type193 { get; set; } /// /// /// - public global::Speechify.RecentCallee? Type194 { get; set; } + public global::System.Collections.Generic.IList? Type194 { get; set; } /// /// /// - public global::Speechify.ListRecentCalleesResponse? Type195 { get; set; } + public global::Speechify.RecentCallee? Type195 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type196 { get; set; } + public global::Speechify.ListRecentCalleesResponse? Type196 { get; set; } /// /// /// - public global::Speechify.ConversationStats? Type197 { get; set; } + public global::System.Collections.Generic.IList? Type197 { get; set; } /// /// /// - public global::Speechify.MessageRole? Type198 { get; set; } + public global::Speechify.ConversationStats? Type198 { get; set; } /// /// /// - public global::Speechify.Message? Type199 { get; set; } + public global::Speechify.MessageRole? Type199 { get; set; } /// /// /// - public global::Speechify.ListMessagesResponse? Type200 { get; set; } + public global::Speechify.Message? Type200 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type201 { get; set; } + public global::Speechify.ListMessagesResponse? Type201 { get; set; } /// /// /// - public global::Speechify.EvaluationKind? Type202 { get; set; } + public global::System.Collections.Generic.IList? Type202 { get; set; } /// /// /// - public global::Speechify.EvaluationStatus? Type203 { get; set; } + public global::Speechify.EvaluationKind? Type203 { get; set; } /// /// /// - public global::Speechify.Evaluation? Type204 { get; set; } + public global::Speechify.EvaluationStatus? Type204 { get; set; } /// /// /// - public global::Speechify.ListEvaluationsResponse? Type205 { get; set; } + public global::Speechify.Evaluation? Type205 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type206 { get; set; } + public global::Speechify.ListEvaluationsResponse? Type206 { get; set; } /// /// /// - public global::Speechify.Memory? Type207 { get; set; } + public global::System.Collections.Generic.IList? Type207 { get; set; } /// /// /// - public global::Speechify.ListMemoriesResponse? Type208 { get; set; } + public global::Speechify.Memory? Type208 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type209 { get; set; } + public global::Speechify.ListMemoriesResponse? Type209 { get; set; } /// /// /// - public global::Speechify.SearchHitRanking? Type210 { get; set; } + public global::System.Collections.Generic.IList? Type210 { get; set; } /// /// /// - public global::Speechify.RetrievalLogResult? Type211 { get; set; } + public global::Speechify.SearchHitRanking? Type211 { get; set; } /// /// /// - public global::Speechify.RetrievalCoverage? Type212 { get; set; } + public global::Speechify.RetrievalLogResult? Type212 { get; set; } /// /// /// - public global::Speechify.RetrievalLogEntry? Type213 { get; set; } + public global::Speechify.RetrievalCoverage? Type213 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type214 { get; set; } + public global::Speechify.RetrievalLogEntry? Type214 { get; set; } /// /// /// - public global::Speechify.ListRetrievalLogsResponse? Type215 { get; set; } + public global::System.Collections.Generic.IList? Type215 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type216 { get; set; } + public global::Speechify.ListRetrievalLogsResponse? Type216 { get; set; } /// /// /// - public global::Speechify.WebhookDeliveryStatus? Type217 { get; set; } + public global::System.Collections.Generic.IList? Type217 { get; set; } /// /// /// - public global::Speechify.WebhookDelivery? Type218 { get; set; } + public global::Speechify.WebhookDeliveryStatus? Type218 { get; set; } /// /// /// - public global::Speechify.ListWebhookDeliveriesResponse? Type219 { get; set; } + public global::Speechify.WebhookDelivery? Type219 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type220 { get; set; } + public global::Speechify.ListWebhookDeliveriesResponse? Type220 { get; set; } /// /// /// - public global::Speechify.ShadowConversationResponse? Type221 { get; set; } + public global::System.Collections.Generic.IList? Type221 { get; set; } /// /// /// - public global::Speechify.PublishAgentRequest? Type222 { get; set; } + public global::Speechify.ShadowConversationResponse? Type222 { get; set; } /// /// /// - public global::Speechify.PublishAgentResponse? Type223 { get; set; } + public global::Speechify.PublishAgentRequest? Type223 { get; set; } /// /// /// - public global::Speechify.PublishGateRunDecision? Type224 { get; set; } + public global::Speechify.PublishAgentResponse? Type224 { get; set; } /// /// /// - public global::Speechify.PublishGateRun? Type225 { get; set; } + public global::Speechify.PublishGateRunDecision? Type225 { get; set; } /// /// /// - public global::Speechify.LatestPublishGateRunResponse? Type226 { get; set; } + public global::Speechify.PublishGateRun? Type226 { get; set; } /// /// /// - public global::Speechify.CreateAgentRunRequest? Type227 { get; set; } + public global::Speechify.LatestPublishGateRunResponse? Type227 { get; set; } /// /// /// - public global::Speechify.AgentRunStatus? Type228 { get; set; } + public global::Speechify.CreateAgentRunRequest? Type228 { get; set; } /// /// /// - public global::Speechify.AgentRunInputDelegationTargetsItems? Type229 { get; set; } + public global::Speechify.AgentRunStatus? Type229 { get; set; } /// /// /// - public global::Speechify.AgentRunInput? Type230 { get; set; } + public global::Speechify.AgentRunInputDelegationTargetsItems? Type230 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type231 { get; set; } + public global::Speechify.AgentRunInput? Type231 { get; set; } /// /// /// - public global::Speechify.AgentRunOutputTranscriptItems? Type232 { get; set; } + public global::System.Collections.Generic.IList? Type232 { get; set; } /// /// /// - public global::Speechify.AgentRunOutput? Type233 { get; set; } + public global::Speechify.AgentRunOutputTranscriptItems? Type233 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type234 { get; set; } + public global::Speechify.AgentRunOutput? Type234 { get; set; } /// /// /// - public global::Speechify.AgentRunError? Type235 { get; set; } + public global::System.Collections.Generic.IList? Type235 { get; set; } /// /// /// - public global::Speechify.AgentRunIncompleteReason? Type236 { get; set; } + public global::Speechify.AgentRunError? Type236 { get; set; } /// /// /// - public global::Speechify.AgentRunUsageModelsItems? Type237 { get; set; } + public global::Speechify.AgentRunIncompleteReason? Type237 { get; set; } /// /// /// - public global::Speechify.AgentRunUsageToolsItems? Type238 { get; set; } + public global::Speechify.AgentRunUsageModelsItems? Type238 { get; set; } /// /// /// - public global::Speechify.AgentRunUsage? Type239 { get; set; } + public global::Speechify.AgentRunUsageToolsItems? Type239 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type240 { get; set; } + public global::Speechify.AgentRunUsage? Type240 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type241 { get; set; } + public global::System.Collections.Generic.IList? Type241 { get; set; } /// /// /// - public global::Speechify.PendingActionDefaultDecision? Type242 { get; set; } + public global::System.Collections.Generic.IList? Type242 { get; set; } /// /// /// - public global::Speechify.PendingAction? Type243 { get; set; } + public global::Speechify.PendingActionDefaultDecision? Type243 { get; set; } /// /// /// - public global::Speechify.AgentRun? Type244 { get; set; } + public global::Speechify.PendingAction? Type244 { get; set; } /// /// /// - public global::Speechify.V1AgentsAgentIdRunsGetParametersStatus? Type245 { get; set; } + public global::Speechify.AgentRun? Type245 { get; set; } /// /// /// - public global::Speechify.ListAgentRunsResponse? Type246 { get; set; } + public global::Speechify.V1AgentsAgentIdRunsGetParametersStatus? Type246 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type247 { get; set; } + public global::Speechify.ListAgentRunsResponse? Type247 { get; set; } /// /// /// - public global::Speechify.V1AgentsRunsGetParametersStatus? Type248 { get; set; } + public global::System.Collections.Generic.IList? Type248 { get; set; } /// /// /// - public global::Speechify.SubmitAgentRunRequestDecision? Type249 { get; set; } + public global::Speechify.V1AgentsRunsGetParametersStatus? Type249 { get; set; } /// /// /// - public global::Speechify.SubmitAgentRunRequest? Type250 { get; set; } + public global::Speechify.SubmitAgentRunRequestDecision? Type250 { get; set; } /// /// /// - public global::Speechify.AgentRunStepKind? Type251 { get; set; } + public global::Speechify.SubmitAgentRunRequest? Type251 { get; set; } /// /// /// - public global::Speechify.RunStepDelegationChildStatus? Type252 { get; set; } + public global::Speechify.AgentRunStepKind? Type252 { get; set; } /// /// /// - public global::Speechify.RunStepDelegation? Type253 { get; set; } + public global::Speechify.RunStepDelegationChildStatus? Type253 { get; set; } /// /// /// - public global::Speechify.AgentRunStep? Type254 { get; set; } + public global::Speechify.RunStepDelegation? Type254 { get; set; } /// /// /// - public global::Speechify.ListAgentRunStepsResponse? Type255 { get; set; } + public global::Speechify.AgentRunStep? Type255 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type256 { get; set; } + public global::Speechify.ListAgentRunStepsResponse? Type256 { get; set; } /// /// /// - public global::Speechify.AgentRunStepAddedEventKind? Type257 { get; set; } + public global::System.Collections.Generic.IList? Type257 { get; set; } /// /// /// - public global::Speechify.AgentRunStatusChangedEventStatus? Type258 { get; set; } + public global::Speechify.AgentRunStepAddedEventKind? Type258 { get; set; } /// /// /// - public global::Speechify.AgentRunEndedEventStatus? Type259 { get; set; } + public global::Speechify.AgentRunStatusChangedEventStatus? Type259 { get; set; } /// /// /// - public global::Speechify.AgentRunEndedEventOutput? Type260 { get; set; } + public global::Speechify.AgentRunEndedEventStatus? Type260 { get; set; } /// /// /// - public global::Speechify.AgentRunStreamEvent? Type261 { get; set; } + public global::Speechify.AgentRunEndedEventOutput? Type261 { get; set; } /// /// /// - public global::Speechify.AgentRunStreamEventVariant1? Type262 { get; set; } + public global::Speechify.AgentRunStreamEvent? Type262 { get; set; } /// /// /// - public global::Speechify.AgentRunStreamEventVariant1Type? Type263 { get; set; } + public global::Speechify.AgentRunStreamEventVariant1? Type263 { get; set; } /// /// /// - public global::Speechify.AgentRunStreamEventVariant2? Type264 { get; set; } + public global::Speechify.AgentRunStreamEventVariant1Type? Type264 { get; set; } /// /// /// - public global::Speechify.AgentRunStreamEventVariant2Type? Type265 { get; set; } + public global::Speechify.AgentRunStreamEventVariant2? Type265 { get; set; } /// /// /// - public global::Speechify.AgentRunStreamEventVariant3? Type266 { get; set; } + public global::Speechify.AgentRunStreamEventVariant2Type? Type266 { get; set; } /// /// /// - public global::Speechify.AgentRunStreamEventVariant3Type? Type267 { get; set; } + public global::Speechify.AgentRunStreamEventVariant3? Type267 { get; set; } /// /// /// - public global::Speechify.AgentRunStreamEventDiscriminator? Type268 { get; set; } + public global::Speechify.AgentRunStreamEventVariant3Type? Type268 { get; set; } /// /// /// - public global::Speechify.AgentRunStreamEventDiscriminatorType? Type269 { get; set; } + public global::Speechify.AgentRunStreamEventDiscriminator? Type269 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseInjection? Type270 { get; set; } + public global::Speechify.AgentRunStreamEventDiscriminatorType? Type270 { get; set; } /// /// /// - public global::Speechify.KnowledgeBase? Type271 { get; set; } + public global::Speechify.KnowledgeBaseInjection? Type271 { get; set; } /// /// /// - public global::Speechify.ListKnowledgeBasesResponse? Type272 { get; set; } + public global::Speechify.KnowledgeBase? Type272 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type273 { get; set; } + public global::Speechify.ListKnowledgeBasesResponse? Type273 { get; set; } /// /// /// - public global::Speechify.CreateKnowledgeBaseRequest? Type274 { get; set; } + public global::System.Collections.Generic.IList? Type274 { get; set; } /// /// /// - public global::Speechify.SearchKnowledgeBasesRequest? Type275 { get; set; } + public global::Speechify.CreateKnowledgeBaseRequest? Type275 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseSearchHit? Type276 { get; set; } + public global::Speechify.SearchKnowledgeBasesRequest? Type276 { get; set; } /// /// /// - public global::Speechify.SearchKnowledgeBasesResponse? Type277 { get; set; } + public global::Speechify.KnowledgeBaseSearchHit? Type277 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type278 { get; set; } + public global::Speechify.SearchKnowledgeBasesResponse? Type278 { get; set; } /// /// /// - public global::Speechify.UpdateKnowledgeBaseRequest? Type279 { get; set; } + public global::System.Collections.Generic.IList? Type279 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseCoverageHealth? Type280 { get; set; } + public global::Speechify.UpdateKnowledgeBaseRequest? Type280 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseCoverageGap? Type281 { get; set; } + public global::Speechify.KnowledgeBaseCoverageHealth? Type281 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseDocumentSourceKind? Type282 { get; set; } + public global::Speechify.KnowledgeBaseCoverageGap? Type282 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseCoverageDocument? Type283 { get; set; } + public global::Speechify.KnowledgeBaseDocumentSourceKind? Type283 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseCoverage? Type284 { get; set; } + public global::Speechify.KnowledgeBaseCoverageDocument? Type284 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type285 { get; set; } + public global::Speechify.KnowledgeBaseCoverage? Type285 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type286 { get; set; } + public global::System.Collections.Generic.IList? Type286 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseEvalCase? Type287 { get; set; } + public global::System.Collections.Generic.IList? Type287 { get; set; } /// /// /// - public global::Speechify.ListKnowledgeBaseEvalCasesResponse? Type288 { get; set; } + public global::Speechify.KnowledgeBaseEvalCase? Type288 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type289 { get; set; } + public global::Speechify.ListKnowledgeBaseEvalCasesResponse? Type289 { get; set; } /// /// /// - public global::Speechify.CreateKnowledgeBaseEvalCaseRequest? Type290 { get; set; } + public global::System.Collections.Generic.IList? Type290 { get; set; } /// /// /// - public global::Speechify.UpdateKnowledgeBaseEvalCaseRequest? Type291 { get; set; } + public global::Speechify.CreateKnowledgeBaseEvalCaseRequest? Type291 { get; set; } /// /// /// - public global::Speechify.JobStatus? Type292 { get; set; } + public global::Speechify.UpdateKnowledgeBaseEvalCaseRequest? Type292 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseEvaluationResults? Type293 { get; set; } + public global::Speechify.JobStatus? Type293 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseEvaluationMetrics? Type294 { get; set; } + public global::Speechify.KnowledgeBaseEvaluationResults? Type294 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseEvaluation? Type295 { get; set; } + public global::Speechify.KnowledgeBaseEvaluationMetrics? Type295 { get; set; } /// /// /// - public global::Speechify.ListKnowledgeBaseEvaluationsResponse? Type296 { get; set; } + public global::Speechify.KnowledgeBaseEvaluation? Type296 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type297 { get; set; } + public global::Speechify.ListKnowledgeBaseEvaluationsResponse? Type297 { get; set; } /// /// /// - public global::Speechify.StartKnowledgeBaseEvaluationRequest? Type298 { get; set; } + public global::System.Collections.Generic.IList? Type298 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseEvaluationHit? Type299 { get; set; } + public global::Speechify.StartKnowledgeBaseEvaluationRequest? Type299 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseEvaluationResult? Type300 { get; set; } + public global::Speechify.KnowledgeBaseEvaluationHit? Type300 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type301 { get; set; } + public global::Speechify.KnowledgeBaseEvaluationResult? Type301 { get; set; } /// /// /// - public global::Speechify.ListKnowledgeBaseEvaluationResultsResponse? Type302 { get; set; } + public global::System.Collections.Generic.IList? Type302 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type303 { get; set; } + public global::Speechify.ListKnowledgeBaseEvaluationResultsResponse? Type303 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseDocumentInjectionMode? Type304 { get; set; } + public global::System.Collections.Generic.IList? Type304 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseDocumentStatus? Type305 { get; set; } + public global::Speechify.KnowledgeBaseDocumentInjectionMode? Type305 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseDocument? Type306 { get; set; } + public global::Speechify.KnowledgeBaseDocumentStatus? Type306 { get; set; } /// /// /// - public global::Speechify.ListKnowledgeBaseDocumentsResponse? Type307 { get; set; } + public global::Speechify.KnowledgeBaseDocument? Type307 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type308 { get; set; } + public global::Speechify.ListKnowledgeBaseDocumentsResponse? Type308 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseDocumentDetailInjectionMode? Type309 { get; set; } + public global::System.Collections.Generic.IList? Type309 { get; set; } /// /// /// - public global::Speechify.DependentAgent? Type310 { get; set; } + public global::Speechify.KnowledgeBaseDocumentDetailInjectionMode? Type310 { get; set; } /// /// /// - public global::Speechify.RefreshConfig? Type311 { get; set; } + public global::Speechify.DependentAgent? Type311 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseDocumentDetail? Type312 { get; set; } + public global::Speechify.RefreshConfig? Type312 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type313 { get; set; } + public global::Speechify.KnowledgeBaseDocumentDetail? Type313 { get; set; } /// /// /// - public global::Speechify.V1AgentsKnowledgeBasesKbIdDocumentsDocumentIdPatchRequestBodyContentApplicationJsonSchemaInjectionMode? Type314 { get; set; } + public global::System.Collections.Generic.IList? Type314 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseChunk? Type315 { get; set; } + public global::Speechify.V1AgentsKnowledgeBasesKbIdDocumentsDocumentIdPatchRequestBodyContentApplicationJsonSchemaInjectionMode? Type315 { get; set; } /// /// /// - public global::Speechify.ListKnowledgeBaseChunksResponse? Type316 { get; set; } + public global::Speechify.KnowledgeBaseChunk? Type316 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type317 { get; set; } + public global::Speechify.ListKnowledgeBaseChunksResponse? Type317 { get; set; } /// /// /// - public global::Speechify.CreateCrawlImportRequest? Type318 { get; set; } + public global::System.Collections.Generic.IList? Type318 { get; set; } /// /// /// - public global::Speechify.ImportJobKind? Type319 { get; set; } + public global::Speechify.CreateCrawlImportRequest? Type319 { get; set; } /// /// /// - public global::Speechify.ImportJob? Type320 { get; set; } + public global::Speechify.ImportJobKind? Type320 { get; set; } /// /// /// - public global::Speechify.CreateSitemapImportRequest? Type321 { get; set; } + public global::Speechify.ImportJob? Type321 { get; set; } /// /// /// - public global::Speechify.CreateTextDocumentRequest? Type322 { get; set; } + public global::Speechify.CreateSitemapImportRequest? Type322 { get; set; } /// /// /// - public global::Speechify.CreateURLDocumentRequest? Type323 { get; set; } + public global::Speechify.CreateTextDocumentRequest? Type323 { get; set; } /// /// /// - public global::Speechify.CreateURLBatchImportRequest? Type324 { get; set; } + public global::Speechify.CreateURLDocumentRequest? Type324 { get; set; } /// /// /// - public global::Speechify.BatchDeleteDocumentsRequest? Type325 { get; set; } + public global::Speechify.CreateURLBatchImportRequest? Type325 { get; set; } /// /// /// - public global::Speechify.BatchMoveDocumentsRequest? Type326 { get; set; } + public global::Speechify.BatchDeleteDocumentsRequest? Type326 { get; set; } /// /// /// - public global::Speechify.BatchMoveDocumentsResponse? Type327 { get; set; } + public global::Speechify.BatchMoveDocumentsRequest? Type327 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type328 { get; set; } + public global::Speechify.BatchMoveDocumentsResponse? Type328 { get; set; } /// /// /// - public global::Speechify.UpdateRefreshConfigRequest? Type329 { get; set; } + public global::System.Collections.Generic.IList? Type329 { get; set; } /// /// /// - public global::Speechify.RefreshHistoryEntryStatus? Type330 { get; set; } + public global::Speechify.UpdateRefreshConfigRequest? Type330 { get; set; } /// /// /// - public global::Speechify.RefreshHistoryEntry? Type331 { get; set; } + public global::Speechify.RefreshHistoryEntryStatus? Type331 { get; set; } /// /// /// - public global::Speechify.ListRefreshHistoryResponse? Type332 { get; set; } + public global::Speechify.RefreshHistoryEntry? Type332 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type333 { get; set; } + public global::Speechify.ListRefreshHistoryResponse? Type333 { get; set; } /// /// /// - public global::Speechify.KnowledgeBaseFolder? Type334 { get; set; } + public global::System.Collections.Generic.IList? Type334 { get; set; } /// /// /// - public global::Speechify.ListKnowledgeBaseFoldersResponse? Type335 { get; set; } + public global::Speechify.KnowledgeBaseFolder? Type335 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type336 { get; set; } + public global::Speechify.ListKnowledgeBaseFoldersResponse? Type336 { get; set; } /// /// /// - public global::Speechify.CreateFolderRequest? Type337 { get; set; } + public global::System.Collections.Generic.IList? Type337 { get; set; } /// /// /// - public global::Speechify.UpdateFolderRequest? Type338 { get; set; } + public global::Speechify.CreateFolderRequest? Type338 { get; set; } /// /// /// - public global::Speechify.ListImportJobsResponse? Type339 { get; set; } + public global::Speechify.UpdateFolderRequest? Type339 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type340 { get; set; } + public global::Speechify.ListImportJobsResponse? Type340 { get; set; } /// /// /// - public global::Speechify.AttachedKnowledgeBasesResponseInjection? Type341 { get; set; } + public global::System.Collections.Generic.IList? Type341 { get; set; } /// /// /// - public global::Speechify.AttachedKnowledgeBasesResponse? Type342 { get; set; } + public global::Speechify.AttachedKnowledgeBasesResponseInjection? Type342 { get; set; } /// /// /// - public global::Speechify.ToolKind? Type343 { get; set; } + public global::Speechify.AttachedKnowledgeBasesResponse? Type343 { get; set; } /// /// /// - public global::Speechify.ToolParamType? Type344 { get; set; } + public global::Speechify.ToolKind? Type344 { get; set; } /// /// /// - public global::Speechify.ToolParam? Type345 { get; set; } + public global::Speechify.ToolParamType? Type345 { get; set; } /// /// /// - public global::Speechify.BuiltinToolConfig? Type346 { get; set; } + public global::Speechify.ToolParam? Type346 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type347 { get; set; } + public global::Speechify.BuiltinToolConfig? Type347 { get; set; } /// /// /// - public global::Speechify.WebhookToolConfigMethod? Type348 { get; set; } + public global::System.Collections.Generic.IList? Type348 { get; set; } /// /// /// - public global::Speechify.LongRunningToolConfigWaitAudioPreset? Type349 { get; set; } + public global::Speechify.WebhookToolConfigMethod? Type349 { get; set; } /// /// /// - public global::Speechify.LongRunningToolConfigWaitAudio? Type350 { get; set; } + public global::Speechify.LongRunningToolConfigWaitAudioPreset? Type350 { get; set; } /// /// /// - public global::Speechify.LongRunningToolConfigOnDuplicate? Type351 { get; set; } + public global::Speechify.LongRunningToolConfigWaitAudio? Type351 { get; set; } /// /// /// - public global::Speechify.LongRunningToolConfig? Type352 { get; set; } + public global::Speechify.LongRunningToolConfigOnDuplicate? Type352 { get; set; } /// /// /// - public global::Speechify.WebhookToolConfig? Type353 { get; set; } + public global::Speechify.LongRunningToolConfig? Type353 { get; set; } /// /// /// - public global::Speechify.ClientToolConfig? Type354 { get; set; } + public global::Speechify.WebhookToolConfig? Type354 { get; set; } /// /// /// - public global::Speechify.MCPTransport? Type355 { get; set; } + public global::Speechify.ClientToolConfig? Type355 { get; set; } /// /// /// - public global::Speechify.MCPAuth? Type356 { get; set; } + public global::Speechify.MCPTransport? Type356 { get; set; } /// /// /// - public global::Speechify.MCPAuthVariant1? Type357 { get; set; } + public global::Speechify.MCPAuth? Type357 { get; set; } /// /// /// - public global::Speechify.MCPAuthVariant1Type? Type358 { get; set; } + public global::Speechify.MCPAuthVariant1? Type358 { get; set; } /// /// /// - public global::Speechify.MCPAuthVariant2? Type359 { get; set; } + public global::Speechify.MCPAuthVariant1Type? Type359 { get; set; } /// /// /// - public global::Speechify.MCPAuthVariant2Type? Type360 { get; set; } + public global::Speechify.MCPAuthVariant2? Type360 { get; set; } /// /// /// - public global::Speechify.MCPAuthVariant3? Type361 { get; set; } + public global::Speechify.MCPAuthVariant2Type? Type361 { get; set; } /// /// /// - public global::Speechify.MCPAuthVariant3Type? Type362 { get; set; } + public global::Speechify.MCPAuthVariant3? Type362 { get; set; } /// /// /// - public global::Speechify.MCPAuthDiscriminator? Type363 { get; set; } + public global::Speechify.MCPAuthVariant3Type? Type363 { get; set; } /// /// /// - public global::Speechify.MCPAuthDiscriminatorType? Type364 { get; set; } + public global::Speechify.MCPAuthDiscriminator? Type364 { get; set; } /// /// /// - public global::Speechify.ToolActionClass? Type365 { get; set; } + public global::Speechify.MCPAuthDiscriminatorType? Type365 { get; set; } /// /// /// - public global::Speechify.MCPToolConfig? Type366 { get; set; } + public global::Speechify.ToolActionClass? Type366 { get; set; } /// /// /// - public global::System.Collections.Generic.Dictionary? Type367 { get; set; } + public global::Speechify.MCPToolConfig? Type367 { get; set; } /// /// /// - public global::Speechify.AgentToolConfig? Type368 { get; set; } + public global::System.Collections.Generic.Dictionary? Type368 { get; set; } /// /// /// - public global::Speechify.ToolApprovalClass? Type369 { get; set; } + public global::Speechify.AgentToolConfig? Type369 { get; set; } /// /// /// - public global::Speechify.AgentTool? Type370 { get; set; } + public global::Speechify.ToolApprovalClass? Type370 { get; set; } /// /// /// - public global::Speechify.ListAgentToolsResponse? Type371 { get; set; } + public global::Speechify.AgentTool? Type371 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type372 { get; set; } + public global::Speechify.ListAgentToolsResponse? Type372 { get; set; } /// /// /// - public global::Speechify.CreateAgentToolRequestConfig? Type373 { get; set; } + public global::System.Collections.Generic.IList? Type373 { get; set; } /// /// /// - public global::Speechify.CreateAgentToolRequest? Type374 { get; set; } + public global::Speechify.CreateAgentToolRequestConfig? Type374 { get; set; } /// /// /// - public global::Speechify.ToolNameHolderKind? Type375 { get; set; } + public global::Speechify.CreateAgentToolRequest? Type375 { get; set; } /// /// /// - public global::Speechify.ToolNameHolder? Type376 { get; set; } + public global::Speechify.ToolNameHolderKind? Type376 { get; set; } /// /// /// - public global::Speechify.ToolNameTakenErrorDetailDetails? Type377 { get; set; } + public global::Speechify.ToolNameHolder? Type377 { get; set; } /// /// /// - public global::Speechify.ToolNameTakenErrorDetail? Type378 { get; set; } + public global::Speechify.ToolNameTakenErrorDetailDetails? Type378 { get; set; } /// /// /// - public global::Speechify.ToolNameTakenError? Type379 { get; set; } + public global::Speechify.ToolNameTakenErrorDetail? Type379 { get; set; } /// /// /// - public global::Speechify.UpdateAgentToolRequestConfig? Type380 { get; set; } + public global::Speechify.ToolNameTakenError? Type380 { get; set; } /// /// /// - public global::Speechify.UpdateAgentToolRequest? Type381 { get; set; } + public global::Speechify.UpdateAgentToolRequestConfig? Type381 { get; set; } /// /// /// - public global::Speechify.ToolConfig? Type382 { get; set; } + public global::Speechify.UpdateAgentToolRequest? Type382 { get; set; } /// /// /// - public global::Speechify.Tool? Type383 { get; set; } + public global::Speechify.ToolConfig? Type383 { get; set; } /// /// /// - public global::Speechify.ListToolsResponse? Type384 { get; set; } + public global::Speechify.Tool? Type384 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type385 { get; set; } + public global::Speechify.ListToolsResponse? Type385 { get; set; } /// /// /// - public global::Speechify.CreateToolRequestConfig? Type386 { get; set; } + public global::System.Collections.Generic.IList? Type386 { get; set; } /// /// /// - public global::Speechify.CreateToolRequest? Type387 { get; set; } + public global::Speechify.CreateToolRequestConfig? Type387 { get; set; } /// /// /// - public global::Speechify.UpdateToolRequestConfig? Type388 { get; set; } + public global::Speechify.CreateToolRequest? Type388 { get; set; } /// /// /// - public global::Speechify.UpdateToolRequest? Type389 { get; set; } + public global::Speechify.UpdateToolRequestConfig? Type389 { get; set; } /// /// /// - public global::Speechify.ToolAttachedAgent? Type390 { get; set; } + public global::Speechify.UpdateToolRequest? Type390 { get; set; } /// /// /// - public global::Speechify.ListToolAttachedAgentsResponse? Type391 { get; set; } + public global::Speechify.ToolAttachedAgent? Type391 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type392 { get; set; } + public global::Speechify.ListToolAttachedAgentsResponse? Type392 { get; set; } /// /// /// - public global::Speechify.TestMCPConnectionRequest? Type393 { get; set; } + public global::System.Collections.Generic.IList? Type393 { get; set; } /// /// /// - public global::Speechify.MCPProbeTool? Type394 { get; set; } + public global::Speechify.TestMCPConnectionRequest? Type394 { get; set; } /// /// /// - public global::Speechify.McpProbeErrorDetailsStage? Type395 { get; set; } + public global::Speechify.MCPProbeTool? Type395 { get; set; } /// /// /// - public global::Speechify.MCPProbeErrorDetails? Type396 { get; set; } + public global::Speechify.McpProbeErrorDetailsStage? Type396 { get; set; } /// /// /// - public global::Speechify.MCPProbeResult? Type397 { get; set; } + public global::Speechify.MCPProbeErrorDetails? Type397 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type398 { get; set; } + public global::Speechify.MCPProbeResult? Type398 { get; set; } /// /// /// - public global::Speechify.TestWebhookConnectionRequest? Type399 { get; set; } + public global::System.Collections.Generic.IList? Type399 { get; set; } /// /// /// - public global::Speechify.WebhookProbeResult? Type400 { get; set; } + public global::Speechify.TestWebhookConnectionRequest? Type400 { get; set; } /// /// /// - public global::Speechify.SystemBuiltinInfoExecution? Type401 { get; set; } + public global::Speechify.WebhookProbeResult? Type401 { get; set; } /// /// /// - public global::Speechify.SystemBuiltinInfo? Type402 { get; set; } + public global::Speechify.SystemBuiltinInfoExecution? Type402 { get; set; } /// /// /// - public global::Speechify.ListSystemBuiltinsResponse? Type403 { get; set; } + public global::Speechify.SystemBuiltinInfo? Type403 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type404 { get; set; } + public global::Speechify.ListSystemBuiltinsResponse? Type404 { get; set; } /// /// /// - public global::Speechify.TestType? Type405 { get; set; } + public global::System.Collections.Generic.IList? Type405 { get; set; } /// /// /// - public global::Speechify.SimulationMessageRole? Type406 { get; set; } + public global::Speechify.TestType? Type406 { get; set; } /// /// /// - public global::Speechify.SimulationMessage? Type407 { get; set; } + public global::Speechify.SimulationMessageRole? Type407 { get; set; } /// /// /// - public global::Speechify.ReplyConfig? Type408 { get; set; } + public global::Speechify.SimulationMessage? Type408 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type409 { get; set; } + public global::Speechify.ReplyConfig? Type409 { get; set; } /// /// /// - public global::Speechify.ParameterCheckMode? Type410 { get; set; } + public global::System.Collections.Generic.IList? Type410 { get; set; } /// /// /// - public global::Speechify.ParameterCheck? Type411 { get; set; } + public global::Speechify.ParameterCheckMode? Type411 { get; set; } /// /// /// - public global::Speechify.ToolCallConfig? Type412 { get; set; } + public global::Speechify.ParameterCheck? Type412 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type413 { get; set; } + public global::Speechify.ToolCallConfig? Type413 { get; set; } /// /// /// - public global::Speechify.DataAssertionMode? Type414 { get; set; } + public global::System.Collections.Generic.IList? Type414 { get; set; } /// /// /// - public global::Speechify.DataAssertion? Type415 { get; set; } + public global::Speechify.DataAssertionMode? Type415 { get; set; } /// /// /// - public global::Speechify.SimulationConfig? Type416 { get; set; } + public global::Speechify.DataAssertion? Type416 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type417 { get; set; } + public global::Speechify.SimulationConfig? Type417 { get; set; } /// /// /// - public global::Speechify.CreateAgentTestRequestConfig? Type418 { get; set; } + public global::System.Collections.Generic.IList? Type418 { get; set; } /// /// /// - public global::Speechify.MockingStrategy? Type419 { get; set; } + public global::Speechify.CreateAgentTestRequestConfig? Type419 { get; set; } /// /// /// - public global::Speechify.ToolMock? Type420 { get; set; } + public global::Speechify.MockingStrategy? Type420 { get; set; } /// /// /// - public global::Speechify.NoMatchBehavior? Type421 { get; set; } + public global::Speechify.ToolMock? Type421 { get; set; } /// /// /// - public global::Speechify.ToolMockConfig? Type422 { get; set; } + public global::Speechify.NoMatchBehavior? Type422 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type423 { get; set; } + public global::Speechify.ToolMockConfig? Type423 { get; set; } /// /// /// - public global::Speechify.CreateAgentTestRequest? Type424 { get; set; } + public global::System.Collections.Generic.IList? Type424 { get; set; } /// /// /// - public global::Speechify.AgentTestConfig? Type425 { get; set; } + public global::Speechify.CreateAgentTestRequest? Type425 { get; set; } /// /// /// - public global::Speechify.AgentTest? Type426 { get; set; } + public global::Speechify.AgentTestConfig? Type426 { get; set; } /// /// /// - public global::Speechify.TestVerdict? Type427 { get; set; } + public global::Speechify.AgentTest? Type427 { get; set; } /// /// /// - public global::Speechify.ReplyResult? Type428 { get; set; } + public global::Speechify.TestVerdict? Type428 { get; set; } /// /// /// - public global::Speechify.ParameterCheckResult? Type429 { get; set; } + public global::Speechify.ReplyResult? Type429 { get; set; } /// /// /// - public global::Speechify.ToolCallResult? Type430 { get; set; } + public global::Speechify.ParameterCheckResult? Type430 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type431 { get; set; } + public global::Speechify.ToolCallResult? Type431 { get; set; } /// /// /// - public global::Speechify.SimulationToolCall? Type432 { get; set; } + public global::System.Collections.Generic.IList? Type432 { get; set; } /// /// /// - public global::Speechify.SimulationResultSentiment? Type433 { get; set; } + public global::Speechify.SimulationToolCall? Type433 { get; set; } /// /// /// - public global::Speechify.SimulationCriterionResultStatus? Type434 { get; set; } + public global::Speechify.SimulationResultSentiment? Type434 { get; set; } /// /// /// - public global::Speechify.SimulationCriterionResult? Type435 { get; set; } + public global::Speechify.SimulationCriterionResultStatus? Type435 { get; set; } /// /// /// - public global::Speechify.DataAssertionResultMode? Type436 { get; set; } + public global::Speechify.SimulationCriterionResult? Type436 { get; set; } /// /// /// - public global::Speechify.DataAssertionResult? Type437 { get; set; } + public global::Speechify.DataAssertionResultMode? Type437 { get; set; } /// /// /// - public global::Speechify.SimulationResult? Type438 { get; set; } + public global::Speechify.DataAssertionResult? Type438 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type439 { get; set; } + public global::Speechify.SimulationResult? Type439 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type440 { get; set; } + public global::System.Collections.Generic.IList? Type440 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type441 { get; set; } + public global::System.Collections.Generic.IList? Type441 { get; set; } /// /// /// - public global::Speechify.TestRunResult? Type442 { get; set; } + public global::System.Collections.Generic.IList? Type442 { get; set; } /// /// /// - public global::Speechify.AgentTestRun? Type443 { get; set; } + public global::Speechify.TestRunResult? Type443 { get; set; } /// /// /// - public global::Speechify.AgentTestWithLastRun? Type444 { get; set; } + public global::Speechify.AgentTestRun? Type444 { get; set; } /// /// /// - public global::Speechify.ListTestsResponse? Type445 { get; set; } + public global::Speechify.AgentTestWithLastRun? Type445 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type446 { get; set; } + public global::Speechify.ListTestsResponse? Type446 { get; set; } /// /// /// - public global::Speechify.UpdateAgentTestRequestConfig? Type447 { get; set; } + public global::System.Collections.Generic.IList? Type447 { get; set; } /// /// /// - public global::Speechify.UpdateAgentTestRequest? Type448 { get; set; } + public global::Speechify.UpdateAgentTestRequestConfig? Type448 { get; set; } /// /// /// - public global::Speechify.AgentTestFolder? Type449 { get; set; } + public global::Speechify.UpdateAgentTestRequest? Type449 { get; set; } /// /// /// - public global::Speechify.ListAgentTestFoldersResponse? Type450 { get; set; } + public global::Speechify.AgentTestFolder? Type450 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type451 { get; set; } + public global::Speechify.ListAgentTestFoldersResponse? Type451 { get; set; } /// /// /// - public global::Speechify.CreateAgentTestFolderRequest? Type452 { get; set; } + public global::System.Collections.Generic.IList? Type452 { get; set; } /// /// /// - public global::Speechify.UpdateAgentTestFolderRequest? Type453 { get; set; } + public global::Speechify.CreateAgentTestFolderRequest? Type453 { get; set; } /// /// /// - public global::Speechify.ListAgentTestRunsResponse? Type454 { get; set; } + public global::Speechify.UpdateAgentTestFolderRequest? Type454 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type455 { get; set; } + public global::Speechify.ListAgentTestRunsResponse? Type455 { get; set; } /// /// /// - public global::Speechify.RunTarget? Type456 { get; set; } + public global::System.Collections.Generic.IList? Type456 { get; set; } /// /// /// - public global::Speechify.TestRunConfigOverride? Type457 { get; set; } + public global::Speechify.RunTarget? Type457 { get; set; } /// /// /// - public global::Speechify.RunTargetedTestsRequest? Type458 { get; set; } + public global::Speechify.TestRunConfigOverride? Type458 { get; set; } /// /// /// - public global::Speechify.SuiteRunTrigger? Type459 { get; set; } + public global::Speechify.RunTargetedTestsRequest? Type459 { get; set; } /// /// /// - public global::Speechify.AgentTestSuiteRunResults? Type460 { get; set; } + public global::Speechify.SuiteRunTrigger? Type460 { get; set; } /// /// /// - public global::Speechify.AgentTestSuiteRun? Type461 { get; set; } + public global::Speechify.AgentTestSuiteRunResults? Type461 { get; set; } /// /// /// - public global::Speechify.RunAgentTestsResponse? Type462 { get; set; } + public global::Speechify.AgentTestSuiteRun? Type462 { get; set; } /// /// /// - public global::Speechify.BatchRunEntry? Type463 { get; set; } + public global::Speechify.RunAgentTestsResponse? Type463 { get; set; } /// /// /// - public global::Speechify.RunBatchRequest? Type464 { get; set; } + public global::Speechify.BatchRunEntry? Type464 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type465 { get; set; } + public global::Speechify.RunBatchRequest? Type465 { get; set; } /// /// /// - public global::Speechify.ListSuiteRunsResponse? Type466 { get; set; } + public global::System.Collections.Generic.IList? Type466 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type467 { get; set; } + public global::Speechify.ListSuiteRunsResponse? Type467 { get; set; } /// /// /// - public global::Speechify.AgentTestSuiteRunWithRunsResults? Type468 { get; set; } + public global::System.Collections.Generic.IList? Type468 { get; set; } /// /// /// - public global::Speechify.SuiteChildRun? Type469 { get; set; } + public global::Speechify.AgentTestSuiteRunWithRunsResults? Type469 { get; set; } /// /// /// - public global::Speechify.AgentTestSuiteRunWithRuns? Type470 { get; set; } + public global::Speechify.SuiteChildRun? Type470 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type471 { get; set; } + public global::Speechify.AgentTestSuiteRunWithRuns? Type471 { get; set; } /// /// /// - public global::Speechify.RunAllTestsRequest? Type472 { get; set; } + public global::System.Collections.Generic.IList? Type472 { get; set; } /// /// /// - public global::Speechify.TestStatsBucket? Type473 { get; set; } + public global::Speechify.RunAllTestsRequest? Type473 { get; set; } /// /// /// - public global::Speechify.TestStats? Type474 { get; set; } + public global::Speechify.TestStatsBucket? Type474 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type475 { get; set; } + public global::Speechify.TestStats? Type475 { get; set; } /// /// /// - public global::System.Collections.Generic.Dictionary? Type476 { get; set; } + public global::System.Collections.Generic.IList? Type476 { get; set; } /// /// /// - public global::Speechify.ShareLinkStatus? Type477 { get; set; } + public global::System.Collections.Generic.Dictionary? Type477 { get; set; } /// /// /// - public global::Speechify.ShareLink? Type478 { get; set; } + public global::Speechify.ShareLinkStatus? Type478 { get; set; } /// /// /// - public global::Speechify.ListShareLinksResponse? Type479 { get; set; } + public global::Speechify.ShareLink? Type479 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type480 { get; set; } + public global::Speechify.ListShareLinksResponse? Type480 { get; set; } /// /// /// - public global::Speechify.CreateShareLinkRequest? Type481 { get; set; } + public global::System.Collections.Generic.IList? Type481 { get; set; } /// /// /// - public global::Speechify.CreateShareLinkResponseStatus? Type482 { get; set; } + public global::Speechify.CreateShareLinkRequest? Type482 { get; set; } /// /// /// - public global::Speechify.CreateShareLinkResponse? Type483 { get; set; } + public global::Speechify.CreateShareLinkResponseStatus? Type483 { get; set; } /// /// /// - public global::Speechify.RevealShareLinkTokenResponse? Type484 { get; set; } + public global::Speechify.CreateShareLinkResponse? Type484 { get; set; } /// /// /// - public global::Speechify.ShareLinkPreview? Type485 { get; set; } + public global::Speechify.RevealShareLinkTokenResponse? Type485 { get; set; } /// /// /// - public global::Speechify.CreateShareLinkSessionRequest? Type486 { get; set; } + public global::Speechify.ShareLinkPreview? Type486 { get; set; } /// /// /// - public global::Speechify.ShareLinkSession? Type487 { get; set; } + public global::Speechify.CreateShareLinkSessionRequest? Type487 { get; set; } /// /// /// - public global::Speechify.PhoneNumberProvider? Type488 { get; set; } + public global::Speechify.ShareLinkSession? Type488 { get; set; } /// /// /// - public global::Speechify.PhoneNumberRelayHealth? Type489 { get; set; } + public global::Speechify.PhoneNumberProvider? Type489 { get; set; } /// /// /// - public global::Speechify.PhoneNumberRelay? Type490 { get; set; } + public global::Speechify.PhoneNumberCapability? Type490 { get; set; } /// /// /// - public global::Speechify.PhoneNumberCapability? Type491 { get; set; } + public global::Speechify.PhoneNumberReputationRisk? Type491 { get; set; } /// /// /// - public global::Speechify.PhoneNumberReputationRisk? Type492 { get; set; } + public global::Speechify.PhoneNumberReputation? Type492 { get; set; } /// /// /// - public global::Speechify.PhoneNumberReputation? Type493 { get; set; } + public global::Speechify.PhoneNumber? Type493 { get; set; } /// /// /// - public global::Speechify.PhoneNumber? Type494 { get; set; } + public global::System.Collections.Generic.IList? Type494 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type495 { get; set; } + public global::Speechify.ListPhoneNumbersResponse? Type495 { get; set; } /// /// /// - public global::Speechify.ListPhoneNumbersResponse? Type496 { get; set; } + public global::System.Collections.Generic.IList? Type496 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type497 { get; set; } + public global::Speechify.TwilioImportSpec? Type497 { get; set; } /// /// /// - public global::Speechify.TwilioImportSpec? Type498 { get; set; } + public global::Speechify.TelnyxImportSpec? Type498 { get; set; } /// /// /// - public global::Speechify.TelnyxImportSpec? Type499 { get; set; } + public global::Speechify.ImportPhoneNumberRequest? Type499 { get; set; } /// /// /// - public global::Speechify.ImportPhoneNumberRequest? Type500 { get; set; } + public global::Speechify.PurchasedPhoneNumberProvider? Type500 { get; set; } /// /// /// - public global::Speechify.PurchasedPhoneNumberProvider? Type501 { get; set; } + public global::Speechify.AvailablePhoneNumber? Type501 { get; set; } /// /// /// - public global::Speechify.AvailablePhoneNumber? Type502 { get; set; } + public global::Speechify.SearchAvailablePhoneNumbersResponse? Type502 { get; set; } /// /// /// - public global::Speechify.SearchAvailablePhoneNumbersResponse? Type503 { get; set; } + public global::System.Collections.Generic.IList? Type503 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type504 { get; set; } + public global::Speechify.IntendedUseMarketingOrInformational? Type504 { get; set; } /// /// /// - public global::Speechify.IntendedUseMarketingOrInformational? Type505 { get; set; } + public global::Speechify.IntendedUse? Type505 { get; set; } /// /// /// - public global::Speechify.IntendedUse? Type506 { get; set; } + public global::Speechify.PurchasePhoneNumberRequest? Type506 { get; set; } /// /// /// - public global::Speechify.PurchasePhoneNumberRequest? Type507 { get; set; } + public global::Speechify.UpdatePhoneNumberRequest? Type507 { get; set; } /// /// /// - public global::Speechify.UpdatePhoneNumberRequest? Type508 { get; set; } + public global::Speechify.CreateOutboundCallRequest? Type508 { get; set; } /// /// /// - public global::Speechify.CreateOutboundCallRequest? Type509 { get; set; } + public global::Speechify.CreateOutboundCallResponse? Type509 { get; set; } /// /// /// - public global::Speechify.CreateOutboundCallResponse? Type510 { get; set; } + public global::Speechify.BatchCall? Type510 { get; set; } /// /// /// - public global::Speechify.BatchCall? Type511 { get; set; } + public global::Speechify.ListBatchCallsResponse? Type511 { get; set; } /// /// /// - public global::Speechify.ListBatchCallsResponse? Type512 { get; set; } + public global::System.Collections.Generic.IList? Type512 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type513 { get; set; } + public global::Speechify.BatchRecipientRequest? Type513 { get; set; } /// /// /// - public global::Speechify.BatchRecipientRequest? Type514 { get; set; } + public global::Speechify.CreateBatchCallRequest? Type514 { get; set; } /// /// /// - public global::Speechify.CreateBatchCallRequest? Type515 { get; set; } + public global::System.Collections.Generic.IList? Type515 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type516 { get; set; } + public global::Speechify.BatchRecipientStatus? Type516 { get; set; } /// /// /// - public global::Speechify.BatchRecipientStatus? Type517 { get; set; } + public global::Speechify.BatchRecipient? Type517 { get; set; } /// /// /// - public global::Speechify.BatchRecipient? Type518 { get; set; } + public global::Speechify.ListBatchRecipientsResponse? Type518 { get; set; } /// /// /// - public global::Speechify.ListBatchRecipientsResponse? Type519 { get; set; } + public global::System.Collections.Generic.IList? Type519 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type520 { get; set; } + public global::Speechify.IvrMenuListEntryMenuTree? Type520 { get; set; } /// /// /// - public global::Speechify.IvrMenuListEntryMenuTree? Type521 { get; set; } + public global::Speechify.IVRMenuListEntry? Type521 { get; set; } /// /// /// - public global::Speechify.IVRMenuListEntry? Type522 { get; set; } + public global::Speechify.ListIVRMenusResponse? Type522 { get; set; } /// /// /// - public global::Speechify.ListIVRMenusResponse? Type523 { get; set; } + public global::System.Collections.Generic.IList? Type523 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type524 { get; set; } + public global::Speechify.IvrMenuMenuTree? Type524 { get; set; } /// /// /// - public global::Speechify.IvrMenuMenuTree? Type525 { get; set; } + public global::Speechify.IVRMenu? Type525 { get; set; } /// /// /// - public global::Speechify.IVRMenu? Type526 { get; set; } + public global::Speechify.UpdateIVRMenuLabelRequest? Type526 { get; set; } /// /// /// - public global::Speechify.UpdateIVRMenuLabelRequest? Type527 { get; set; } + public global::Speechify.InvalidateIVRMenuRequest? Type527 { get; set; } /// /// /// - public global::Speechify.InvalidateIVRMenuRequest? Type528 { get; set; } + public global::Speechify.SIPTrunkProvider? Type528 { get; set; } /// /// /// - public global::Speechify.SIPTrunkProvider? Type529 { get; set; } + public global::Speechify.SIPTrunkDirection? Type529 { get; set; } /// /// /// - public global::Speechify.SIPTrunkDirection? Type530 { get; set; } + public global::Speechify.SIPTransport? Type530 { get; set; } /// /// /// - public global::Speechify.SIPTransport? Type531 { get; set; } + public global::Speechify.SIPMediaEncryption? Type531 { get; set; } /// /// /// - public global::Speechify.SIPMediaEncryption? Type532 { get; set; } + public global::Speechify.SIPTrunk? Type532 { get; set; } /// /// /// - public global::Speechify.SIPTrunk? Type533 { get; set; } + public global::Speechify.ListSIPTrunksResponse? Type533 { get; set; } /// /// /// - public global::Speechify.ListSIPTrunksResponse? Type534 { get; set; } + public global::System.Collections.Generic.IList? Type534 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type535 { get; set; } + public global::Speechify.CreateSipTrunkRequestCredentials? Type535 { get; set; } /// /// /// - public global::Speechify.CreateSipTrunkRequestCredentials? Type536 { get; set; } + public global::Speechify.CreateSIPTrunkRequest? Type536 { get; set; } /// /// /// - public global::Speechify.CreateSIPTrunkRequest? Type537 { get; set; } + public global::Speechify.Caller? Type537 { get; set; } /// /// /// - public global::Speechify.Caller? Type538 { get; set; } + public global::Speechify.ListCallersResponse? Type538 { get; set; } /// /// /// - public global::Speechify.ListCallersResponse? Type539 { get; set; } + public global::System.Collections.Generic.IList? Type539 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type540 { get; set; } + public global::Speechify.UpdateCallerRequest? Type540 { get; set; } /// /// /// - public global::Speechify.UpdateCallerRequest? Type541 { get; set; } + public global::Speechify.DeleteCallerResponse? Type541 { get; set; } /// /// /// - public global::Speechify.DeleteCallerResponse? Type542 { get; set; } + public global::Speechify.ListCallerConversationsResponse? Type542 { get; set; } /// /// /// - public global::Speechify.ListCallerConversationsResponse? Type543 { get; set; } + public global::Speechify.ListCallerMemoriesResponse? Type543 { get; set; } /// /// /// - public global::Speechify.ListCallerMemoriesResponse? Type544 { get; set; } + public global::Speechify.AudioAsset? Type544 { get; set; } /// /// /// - public global::Speechify.AudioAsset? Type545 { get; set; } + public global::Speechify.ListAudioAssetsResponse? Type545 { get; set; } /// /// /// - public global::Speechify.ListAudioAssetsResponse? Type546 { get; set; } + public global::System.Collections.Generic.IList? Type546 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type547 { get; set; } + public global::Speechify.TeamMember? Type547 { get; set; } /// /// /// - public global::Speechify.TeamMember? Type548 { get; set; } + public global::Speechify.Team? Type548 { get; set; } /// /// /// - public global::Speechify.Team? Type549 { get; set; } + public global::System.Collections.Generic.IList? Type549 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type550 { get; set; } + public global::Speechify.ListTeamsResponse? Type550 { get; set; } /// /// /// - public global::Speechify.ListTeamsResponse? Type551 { get; set; } + public global::System.Collections.Generic.IList? Type551 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type552 { get; set; } + public global::Speechify.TeamMemberInput? Type552 { get; set; } /// /// /// - public global::Speechify.TeamMemberInput? Type553 { get; set; } + public global::Speechify.CreateTeamRequest? Type553 { get; set; } /// /// /// - public global::Speechify.CreateTeamRequest? Type554 { get; set; } + public global::System.Collections.Generic.IList? Type554 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type555 { get; set; } + public global::Speechify.UpdateTeamRequest? Type555 { get; set; } /// /// /// - public global::Speechify.UpdateTeamRequest? Type556 { get; set; } + public global::Speechify.CreateTeamRunRequest? Type556 { get; set; } /// /// /// - public global::Speechify.CreateTeamRunRequest? Type557 { get; set; } + public global::Speechify.AgentTriggerType? Type557 { get; set; } /// /// /// - public global::Speechify.AgentTriggerType? Type558 { get; set; } + public global::Speechify.TriggerRunSpec? Type558 { get; set; } /// /// /// - public global::Speechify.TriggerRunSpec? Type559 { get; set; } + public global::Speechify.TriggerScheduleConfig? Type559 { get; set; } /// /// /// - public global::Speechify.TriggerScheduleConfig? Type560 { get; set; } + public global::Speechify.TriggerWebhookConfigUserIdentitySource? Type560 { get; set; } /// /// /// - public global::Speechify.TriggerWebhookConfigUserIdentitySource? Type561 { get; set; } + public global::Speechify.TriggerWebhookConfig? Type561 { get; set; } /// /// /// - public global::Speechify.TriggerWebhookConfig? Type562 { get; set; } + public global::Speechify.AgentTriggerLastFireStatus? Type562 { get; set; } /// /// /// - public global::Speechify.AgentTriggerLastFireStatus? Type563 { get; set; } + public global::Speechify.AgentTrigger? Type563 { get; set; } /// /// /// - public global::Speechify.AgentTrigger? Type564 { get; set; } + public global::Speechify.ListAgentTriggersResponse? Type564 { get; set; } /// /// /// - public global::Speechify.ListAgentTriggersResponse? Type565 { get; set; } + public global::System.Collections.Generic.IList? Type565 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type566 { get; set; } + public global::Speechify.CreateAgentTriggerRequestType? Type566 { get; set; } /// /// /// - public global::Speechify.CreateAgentTriggerRequestType? Type567 { get; set; } + public global::Speechify.CreateAgentTriggerRequest? Type567 { get; set; } /// /// /// - public global::Speechify.CreateAgentTriggerRequest? Type568 { get; set; } + public global::Speechify.UpdateAgentTriggerRequest? Type568 { get; set; } /// /// /// - public global::Speechify.UpdateAgentTriggerRequest? Type569 { get; set; } + public global::Speechify.AgentTriggerFireResponseStatus? Type569 { get; set; } /// /// /// - public global::Speechify.AgentTriggerFireResponseStatus? Type570 { get; set; } + public global::Speechify.AgentTriggerFireResponse? Type570 { get; set; } /// /// /// - public global::Speechify.AgentTriggerFireResponse? Type571 { get; set; } + public global::Speechify.Skill? Type571 { get; set; } /// /// /// - public global::Speechify.Skill? Type572 { get; set; } + public global::Speechify.ListSkillsResponse? Type572 { get; set; } /// /// /// - public global::Speechify.ListSkillsResponse? Type573 { get; set; } + public global::System.Collections.Generic.IList? Type573 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type574 { get; set; } + public global::Speechify.CreateSkillRequest? Type574 { get; set; } /// /// /// - public global::Speechify.CreateSkillRequest? Type575 { get; set; } + public global::Speechify.UpdateSkillRequest? Type575 { get; set; } /// /// /// - public global::Speechify.UpdateSkillRequest? Type576 { get; set; } + public global::Speechify.SkillVersion? Type576 { get; set; } /// /// /// - public global::Speechify.SkillVersion? Type577 { get; set; } + public global::Speechify.ListSkillVersionsResponse? Type577 { get; set; } /// /// /// - public global::Speechify.ListSkillVersionsResponse? Type578 { get; set; } + public global::System.Collections.Generic.IList? Type578 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type579 { get; set; } + public global::Speechify.AgentSkill? Type579 { get; set; } /// /// /// - public global::Speechify.AgentSkill? Type580 { get; set; } + public global::Speechify.ListAgentSkillsResponse? Type580 { get; set; } /// /// /// - public global::Speechify.ListAgentSkillsResponse? Type581 { get; set; } + public global::System.Collections.Generic.IList? Type581 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type582 { get; set; } + public global::Speechify.AttachSkillRequest? Type582 { get; set; } /// /// /// - public global::Speechify.AttachSkillRequest? Type583 { get; set; } + public global::Speechify.UpdateAgentSkillRequest? Type583 { get; set; } /// /// /// - public global::Speechify.UpdateAgentSkillRequest? Type584 { get; set; } + public global::Speechify.V1FilesGetParametersKind? Type584 { get; set; } /// /// /// - public global::Speechify.V1FilesGetParametersKind? Type585 { get; set; } + public global::Speechify.FileKind? Type585 { get; set; } /// /// /// - public global::Speechify.FileKind? Type586 { get; set; } + public global::Speechify.FileSource? Type586 { get; set; } /// /// /// - public global::Speechify.FileSource? Type587 { get; set; } + public global::Speechify.File? Type587 { get; set; } /// /// /// - public global::Speechify.File? Type588 { get; set; } + public global::Speechify.ListFilesResponse? Type588 { get; set; } /// /// /// - public global::Speechify.ListFilesResponse? Type589 { get; set; } + public global::System.Collections.Generic.IList? Type589 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type590 { get; set; } + public global::Speechify.V1FilesPostRequestBodyContentMultipartFormDataSchemaKind? Type590 { get; set; } /// /// /// - public global::Speechify.V1FilesPostRequestBodyContentMultipartFormDataSchemaKind? Type591 { get; set; } + public global::Speechify.Store? Type591 { get; set; } /// /// /// - public global::Speechify.Store? Type592 { get; set; } + public global::Speechify.ListStoresResponse? Type592 { get; set; } /// /// /// - public global::Speechify.ListStoresResponse? Type593 { get; set; } + public global::System.Collections.Generic.IList? Type593 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type594 { get; set; } + public global::Speechify.CreateStoreRequest? Type594 { get; set; } /// /// /// - public global::Speechify.CreateStoreRequest? Type595 { get; set; } + public global::Speechify.UpdateStoreRequest? Type595 { get; set; } /// /// /// - public global::Speechify.UpdateStoreRequest? Type596 { get; set; } + public global::Speechify.StoreCollection? Type596 { get; set; } /// /// /// - public global::Speechify.StoreCollection? Type597 { get; set; } + public global::Speechify.ListStoreCollectionsResponse? Type597 { get; set; } /// /// /// - public global::Speechify.ListStoreCollectionsResponse? Type598 { get; set; } + public global::System.Collections.Generic.IList? Type598 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type599 { get; set; } + public global::Speechify.StoreDocumentSource? Type599 { get; set; } /// /// /// - public global::Speechify.StoreDocumentSource? Type600 { get; set; } + public global::Speechify.StoreDocument? Type600 { get; set; } /// /// /// - public global::Speechify.StoreDocument? Type601 { get; set; } + public global::Speechify.QueryStoreDocumentsResponse? Type601 { get; set; } /// /// /// - public global::Speechify.QueryStoreDocumentsResponse? Type602 { get; set; } + public global::System.Collections.Generic.IList? Type602 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type603 { get; set; } + public global::Speechify.WriteStoreDocumentRequest? Type603 { get; set; } /// /// /// - public global::Speechify.WriteStoreDocumentRequest? Type604 { get; set; } + public global::Speechify.StoreWhereClauseOp? Type604 { get; set; } /// /// /// - public global::Speechify.StoreWhereClauseOp? Type605 { get; set; } + public global::Speechify.StoreWhereClause? Type605 { get; set; } /// /// /// - public global::Speechify.StoreWhereClause? Type606 { get; set; } + public global::Speechify.StoreOrderByDirection? Type606 { get; set; } /// /// /// - public global::Speechify.StoreOrderByDirection? Type607 { get; set; } + public global::Speechify.StoreOrderBy? Type607 { get; set; } /// /// /// - public global::Speechify.StoreOrderBy? Type608 { get; set; } + public global::Speechify.StoreDocumentQuery? Type608 { get; set; } /// /// /// - public global::Speechify.StoreDocumentQuery? Type609 { get; set; } + public global::System.Collections.Generic.IList? Type609 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type610 { get; set; } + public global::Speechify.StoreAggregateMetricOp? Type610 { get; set; } /// /// /// - public global::Speechify.StoreBatchWriteOp? Type611 { get; set; } + public global::Speechify.StoreAggregateMetric? Type611 { get; set; } /// /// /// - public global::Speechify.StoreBatchWrite? Type612 { get; set; } + public global::Speechify.StoreAggregateQuery? Type612 { get; set; } /// /// /// - public global::Speechify.StoreBatchRequest? Type613 { get; set; } + public global::System.Collections.Generic.IList? Type613 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type614 { get; set; } + public global::Speechify.StoreAggregateGroup? Type614 { get; set; } /// /// /// - public global::Speechify.StoreBatchResultOp? Type615 { get; set; } + public global::System.Collections.Generic.Dictionary? Type615 { get; set; } /// /// /// - public global::Speechify.StoreBatchResult? Type616 { get; set; } + public global::Speechify.StoreAggregateResponse? Type616 { get; set; } /// /// /// - public global::Speechify.StoreBatchResponse? Type617 { get; set; } + public global::System.Collections.Generic.IList? Type617 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type618 { get; set; } + public global::Speechify.StoreBatchWriteOp? Type618 { get; set; } /// /// /// - public global::Speechify.ListAgentStoresResponse? Type619 { get; set; } + public global::Speechify.StoreBatchWrite? Type619 { get; set; } /// /// /// - public global::Speechify.HostedApiAuthMode? Type620 { get; set; } + public global::Speechify.StoreBatchRequest? Type620 { get; set; } /// /// /// - public global::Speechify.HostedAPI? Type621 { get; set; } + public global::System.Collections.Generic.IList? Type621 { get; set; } /// /// /// - public global::Speechify.ListHostedAPIsResponse? Type622 { get; set; } + public global::Speechify.StoreBatchResultOp? Type622 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type623 { get; set; } + public global::Speechify.StoreBatchResult? Type623 { get; set; } /// /// /// - public global::Speechify.CreateHostedApiRequestAuthMode? Type624 { get; set; } + public global::Speechify.StoreBatchResponse? Type624 { get; set; } /// /// /// - public global::Speechify.CreateHostedAPIRequest? Type625 { get; set; } + public global::System.Collections.Generic.IList? Type625 { get; set; } /// /// /// - public global::Speechify.UpdateHostedApiRequestAuthMode? Type626 { get; set; } + public global::Speechify.ListAgentStoresResponse? Type626 { get; set; } /// /// /// - public global::Speechify.UpdateHostedAPIRequest? Type627 { get; set; } + public global::Speechify.HostedApiAuthMode? Type627 { get; set; } /// /// /// - public global::Speechify.HostedApiRouteMethod? Type628 { get; set; } + public global::Speechify.HostedAPI? Type628 { get; set; } /// /// /// - public global::Speechify.HostedApiResolverType? Type629 { get; set; } + public global::Speechify.ListHostedAPIsResponse? Type629 { get; set; } /// /// /// - public global::Speechify.HostedApiResolverWhereItemsOp? Type630 { get; set; } + public global::System.Collections.Generic.IList? Type630 { get; set; } /// /// /// - public global::Speechify.HostedApiResolverWhereItems? Type631 { get; set; } + public global::Speechify.CreateHostedApiRequestAuthMode? Type631 { get; set; } /// /// /// - public global::Speechify.HostedApiResolverOrderByDirection? Type632 { get; set; } + public global::Speechify.CreateHostedAPIRequest? Type632 { get; set; } /// /// /// - public global::Speechify.HostedApiResolverOrderBy? Type633 { get; set; } + public global::Speechify.UpdateHostedApiRequestAuthMode? Type633 { get; set; } /// /// /// - public global::Speechify.HostedAPIResolver? Type634 { get; set; } + public global::Speechify.UpdateHostedAPIRequest? Type634 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type635 { get; set; } + public global::Speechify.HostedApiUsageRoutesItems? Type635 { get; set; } /// /// /// - public global::Speechify.HostedAPIRoute? Type636 { get; set; } + public global::Speechify.HostedAPIUsage? Type636 { get; set; } /// /// /// - public global::Speechify.ListHostedAPIRoutesResponse? Type637 { get; set; } + public global::System.Collections.Generic.IList? Type637 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type638 { get; set; } + public global::Speechify.HostedApiRouteMethod? Type638 { get; set; } /// /// /// - public global::Speechify.CreateHostedApiRouteRequestMethod? Type639 { get; set; } + public global::Speechify.HostedApiResolverType? Type639 { get; set; } /// /// /// - public global::Speechify.CreateHostedAPIRouteRequest? Type640 { get; set; } + public global::Speechify.HostedApiResolverWhereItemsOp? Type640 { get; set; } /// /// /// - public global::Speechify.UpdateHostedApiRouteRequestMethod? Type641 { get; set; } + public global::Speechify.HostedApiResolverWhereItems? Type641 { get; set; } /// /// /// - public global::Speechify.UpdateHostedAPIRouteRequest? Type642 { get; set; } + public global::Speechify.HostedApiResolverOrderByDirection? Type642 { get; set; } /// /// /// - public global::Speechify.HostedAPIKey? Type643 { get; set; } + public global::Speechify.HostedApiResolverOrderBy? Type643 { get; set; } /// /// /// - public global::Speechify.ListHostedAPIKeysResponse? Type644 { get; set; } + public global::Speechify.HostedAPIResolver? Type644 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type645 { get; set; } + public global::System.Collections.Generic.IList? Type645 { get; set; } /// /// /// - public global::Speechify.CreateHostedAPIKeyRequest? Type646 { get; set; } + public global::Speechify.HostedAPIRoute? Type646 { get; set; } /// /// /// - public global::Speechify.ContactIdentifierKind? Type647 { get; set; } + public global::Speechify.ListHostedAPIRoutesResponse? Type647 { get; set; } /// /// /// - public global::Speechify.ContactIdentifierAssertedBy? Type648 { get; set; } + public global::System.Collections.Generic.IList? Type648 { get; set; } /// /// /// - public global::Speechify.ContactIdentifier? Type649 { get; set; } + public global::Speechify.CreateHostedApiRouteRequestMethod? Type649 { get; set; } /// /// /// - public global::Speechify.Contact? Type650 { get; set; } + public global::Speechify.CreateHostedAPIRouteRequest? Type650 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type651 { get; set; } + public global::Speechify.UpdateHostedApiRouteRequestMethod? Type651 { get; set; } /// /// /// - public global::Speechify.ListContactsResponse? Type652 { get; set; } + public global::Speechify.UpdateHostedAPIRouteRequest? Type652 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type653 { get; set; } + public global::Speechify.HostedAPIKey? Type653 { get; set; } /// /// /// - public global::Speechify.UpdateContactRequest? Type654 { get; set; } + public global::Speechify.ListHostedAPIKeysResponse? Type654 { get; set; } /// /// /// - public global::Speechify.DeleteContactResponse? Type655 { get; set; } + public global::System.Collections.Generic.IList? Type655 { get; set; } /// /// /// - public global::Speechify.AttachContactIdentifierRequestKind? Type656 { get; set; } + public global::Speechify.CreateHostedAPIKeyRequest? Type656 { get; set; } /// /// /// - public global::Speechify.AttachContactIdentifierRequest? Type657 { get; set; } + public global::Speechify.HostedAPIUserTokenSecret? Type657 { get; set; } /// /// /// - public global::Speechify.MergeContactsRequest? Type658 { get; set; } + public global::Speechify.ContactIdentifierKind? Type658 { get; set; } /// /// /// - public global::Speechify.MergeContactsResponseMerged? Type659 { get; set; } + public global::Speechify.ContactIdentifierAssertedBy? Type659 { get; set; } /// /// /// - public global::Speechify.MergeContactsResponse? Type660 { get; set; } + public global::Speechify.ContactIdentifier? Type660 { get; set; } /// /// /// - public global::Speechify.BillingEntitlementsMaxLlmModelClass? Type661 { get; set; } + public global::Speechify.Contact? Type661 { get; set; } /// /// /// - public global::Speechify.BillingEntitlements? Type662 { get; set; } + public global::System.Collections.Generic.IList? Type662 { get; set; } /// /// /// - public global::Speechify.EntitlementsResponse? Type663 { get; set; } + public global::Speechify.ListContactsResponse? Type663 { get; set; } /// /// /// - public global::System.Collections.Generic.Dictionary? Type664 { get; set; } + public global::System.Collections.Generic.IList? Type664 { get; set; } /// /// /// - public global::Speechify.ContactResolver? Type665 { get; set; } + public global::Speechify.UpdateContactRequest? Type665 { get; set; } /// /// /// - public global::Speechify.PutContactResolverRequest? Type666 { get; set; } + public global::Speechify.DeleteContactResponse? Type666 { get; set; } /// /// /// - public global::Speechify.WebhookEndpoint? Type667 { get; set; } + public global::Speechify.AttachContactIdentifierRequestKind? Type667 { get; set; } /// /// /// - public global::Speechify.ListWebhookEndpointsResponse? Type668 { get; set; } + public global::Speechify.AttachContactIdentifierRequest? Type668 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type669 { get; set; } + public global::Speechify.MergeContactsRequest? Type669 { get; set; } /// /// /// - public global::Speechify.CreateWebhookEndpointRequest? Type670 { get; set; } + public global::Speechify.MergeContactsResponseMerged? Type670 { get; set; } /// /// /// - public global::Speechify.UpdateWebhookEndpointRequest? Type671 { get; set; } + public global::Speechify.MergeContactsResponse? Type671 { get; set; } /// /// /// - public global::Speechify.WebhookEndpointDelivery? Type672 { get; set; } + public global::Speechify.BillingEntitlementsMaxLlmModelClass? Type672 { get; set; } /// /// /// - public global::Speechify.ListWebhookEndpointDeliveriesResponse? Type673 { get; set; } + public global::Speechify.BillingEntitlements? Type673 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type674 { get; set; } + public global::Speechify.EntitlementsResponse? Type674 { get; set; } /// /// /// - public global::Speechify.Project? Type675 { get; set; } + public global::System.Collections.Generic.Dictionary? Type675 { get; set; } /// /// /// - public global::Speechify.ListProjectsResponse? Type676 { get; set; } + public global::Speechify.ContactResolver? Type676 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type677 { get; set; } + public global::Speechify.PutContactResolverRequest? Type677 { get; set; } /// /// /// - public global::Speechify.CreateProjectRequest? Type678 { get; set; } + public global::Speechify.WebhookEndpoint? Type678 { get; set; } /// /// /// - public global::Speechify.UpdateProjectRequest? Type679 { get; set; } + public global::Speechify.ListWebhookEndpointsResponse? Type679 { get; set; } /// /// /// - public global::Speechify.DeleteProjectRequestMode? Type680 { get; set; } + public global::System.Collections.Generic.IList? Type680 { get; set; } /// /// /// - public global::Speechify.DeleteProjectRequest? Type681 { get; set; } + public global::Speechify.CreateWebhookEndpointRequest? Type681 { get; set; } /// /// /// - public global::Speechify.ProjectRestoredCounts? Type682 { get; set; } + public global::Speechify.UpdateWebhookEndpointRequest? Type682 { get; set; } /// /// /// - public global::Speechify.ProjectStillRevokedCounts? Type683 { get; set; } + public global::Speechify.WebhookEndpointDelivery? Type683 { get; set; } /// /// /// - public global::Speechify.ProjectRestore? Type684 { get; set; } + public global::Speechify.ListWebhookEndpointDeliveriesResponse? Type684 { get; set; } /// /// /// - public global::Speechify.ProjectTeardownBlockerKind? Type685 { get; set; } + public global::System.Collections.Generic.IList? Type685 { get; set; } /// /// /// - public global::Speechify.ProjectTeardownBlockerBlocksItems? Type686 { get; set; } + public global::Speechify.Project? Type686 { get; set; } /// /// /// - public global::Speechify.ProjectTeardownBlocker? Type687 { get; set; } + public global::Speechify.ListProjectsResponse? Type687 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type688 { get; set; } + public global::System.Collections.Generic.IList? Type688 { get; set; } /// /// /// - public global::Speechify.ProjectTeardownGroup? Type689 { get; set; } + public global::Speechify.CreateProjectRequest? Type689 { get; set; } /// /// /// - public global::Speechify.ProjectTeardown? Type690 { get; set; } + public global::Speechify.UpdateProjectRequest? Type690 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type691 { get; set; } + public global::Speechify.DeleteProjectRequestMode? Type691 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type692 { get; set; } + public global::Speechify.DeleteProjectRequest? Type692 { get; set; } /// /// /// - public global::Speechify.ProjectResourceCounts? Type693 { get; set; } + public global::Speechify.ProjectRestoredCounts? Type693 { get; set; } /// /// /// - public global::Speechify.ProjectStats? Type694 { get; set; } + public global::Speechify.ProjectStillRevokedCounts? Type694 { get; set; } /// /// /// - public global::Speechify.PromoteProjectRequest? Type695 { get; set; } + public global::Speechify.ProjectRestore? Type695 { get; set; } /// /// /// - public global::Speechify.PromoteCreated? Type696 { get; set; } + public global::Speechify.ProjectTeardownBlockerKind? Type696 { get; set; } /// /// /// - public global::Speechify.PromoteReused? Type697 { get; set; } + public global::Speechify.ProjectTeardownBlockerBlocksItems? Type697 { get; set; } /// /// /// - public global::Speechify.PromoteAttentionKind? Type698 { get; set; } + public global::Speechify.ProjectTeardownBlocker? Type698 { get; set; } /// /// /// - public global::Speechify.PromoteAttentionReason? Type699 { get; set; } + public global::System.Collections.Generic.IList? Type699 { get; set; } /// /// /// - public global::Speechify.PromoteAttention? Type700 { get; set; } + public global::Speechify.ProjectTeardownGroup? Type700 { get; set; } /// /// /// - public global::Speechify.PromoteProjectResponse? Type701 { get; set; } + public global::Speechify.ProjectTeardown? Type701 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type702 { get; set; } + public global::System.Collections.Generic.IList? Type702 { get; set; } /// /// /// - public global::Speechify.ProjectAuditEventType? Type703 { get; set; } + public global::System.Collections.Generic.IList? Type703 { get; set; } /// /// /// - public global::Speechify.ProjectAuditEvent? Type704 { get; set; } + public global::Speechify.ProjectResourceCounts? Type704 { get; set; } /// /// /// - public global::Speechify.ProjectAuditResponse? Type705 { get; set; } + public global::Speechify.ProjectStats? Type705 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type706 { get; set; } + public global::Speechify.PromoteProjectRequest? Type706 { get; set; } /// /// /// - public global::Speechify.ProjectMember? Type707 { get; set; } + public global::Speechify.PromoteCreated? Type707 { get; set; } /// /// /// - public global::Speechify.ProjectMembersResponse? Type708 { get; set; } + public global::Speechify.PromoteReused? Type708 { get; set; } /// /// /// - public global::System.Collections.Generic.IList? Type709 { get; set; } + public global::Speechify.PromoteAttentionKind? Type709 { get; set; } /// /// /// - public global::Speechify.GrantProjectMemberRequest? Type710 { get; set; } + public global::Speechify.PromoteAttentionReason? Type710 { get; set; } /// /// /// - public global::Speechify.CreateRequest? Type711 { get; set; } + public global::Speechify.PromoteAttention? Type711 { get; set; } /// /// /// - public global::Speechify.DetectRequest? Type712 { get; set; } + public global::Speechify.PromoteProjectResponse? Type712 { get; set; } /// /// /// - public global::Speechify.VerifyRequest? Type713 { get; set; } + public global::System.Collections.Generic.IList? Type713 { get; set; } /// /// /// - public global::Speechify.UploadDocumentRequest? Type714 { get; set; } + public global::Speechify.ProjectAuditEventType? Type714 { get; set; } /// /// /// - public global::Speechify.UpdateDocumentRequest? Type715 { get; set; } + public global::Speechify.ProjectAuditEvent? Type715 { get; set; } /// /// /// - public global::Speechify.RunTestRequest? Type716 { get; set; } + public global::Speechify.ProjectAuditResponse? Type716 { get; set; } /// /// /// - public global::Speechify.UploadRequest? Type717 { get; set; } + public global::System.Collections.Generic.IList? Type717 { get; set; } /// /// /// - public global::Speechify.UploadRequest2? Type718 { get; set; } + public global::Speechify.ProjectMember? Type718 { get; set; } + /// + /// + /// + public global::Speechify.ProjectMembersResponse? Type719 { get; set; } + /// + /// + /// + public global::System.Collections.Generic.IList? Type720 { get; set; } + /// + /// + /// + public global::Speechify.GrantProjectMemberRequest? Type721 { get; set; } + /// + /// + /// + public global::Speechify.CreateRequest? Type722 { get; set; } + /// + /// + /// + public global::Speechify.DetectRequest? Type723 { get; set; } + /// + /// + /// + public global::Speechify.VerifyRequest? Type724 { get; set; } + /// + /// + /// + public global::Speechify.UploadDocumentRequest? Type725 { get; set; } + /// + /// + /// + public global::Speechify.UpdateDocumentRequest? Type726 { get; set; } + /// + /// + /// + public global::Speechify.RunTestRequest? Type727 { get; set; } + /// + /// + /// + public global::Speechify.UploadRequest? Type728 { get; set; } + /// + /// + /// + public global::Speechify.UploadRequest2? Type729 { get; set; } /// /// @@ -3342,70 +3386,82 @@ public sealed partial class JsonSerializerContextTypes /// /// /// - public global::System.Collections.Generic.List? ListType108 { get; set; } + public global::System.Collections.Generic.List? ListType108 { get; set; } + /// + /// + /// + public global::System.Collections.Generic.List? ListType109 { get; set; } + /// + /// + /// + public global::System.Collections.Generic.List? ListType110 { get; set; } + /// + /// + /// + public global::System.Collections.Generic.List? ListType111 { get; set; } /// /// /// - public global::System.Collections.Generic.List? ListType109 { get; set; } + public global::System.Collections.Generic.List? ListType112 { get; set; } /// /// /// - public global::System.Collections.Generic.List? ListType110 { get; set; } + public global::System.Collections.Generic.List? ListType113 { get; set; } /// /// /// - public global::System.Collections.Generic.List? ListType111 { get; set; } + public global::System.Collections.Generic.List? ListType114 { get; set; } /// /// /// - public global::System.Collections.Generic.List? ListType112 { get; set; } + public global::System.Collections.Generic.List? ListType115 { get; set; } /// /// /// - public global::System.Collections.Generic.List? ListType113 { get; set; } + public global::System.Collections.Generic.List? ListType116 { get; set; } /// /// /// - public global::System.Collections.Generic.List? ListType114 { get; set; } + public global::System.Collections.Generic.List? ListType117 { get; set; } /// /// /// - public global::System.Collections.Generic.List? ListType115 { get; set; } + public global::System.Collections.Generic.List? ListType118 { get; set; } /// /// /// - public global::System.Collections.Generic.List? ListType116 { get; set; } + public global::System.Collections.Generic.List? ListType119 { get; set; } /// /// /// - public global::System.Collections.Generic.List? ListType117 { get; set; } + public global::System.Collections.Generic.List? ListType120 { get; set; } /// /// /// - public global::System.Collections.Generic.List? ListType118 { get; set; } + public global::System.Collections.Generic.List? ListType121 { get; set; } /// /// /// - public global::System.Collections.Generic.List? ListType119 { get; set; } + public global::System.Collections.Generic.List? ListType122 { get; set; } /// /// /// - public global::System.Collections.Generic.List? ListType120 { get; set; } + public global::System.Collections.Generic.List? ListType123 { get; set; } /// /// /// - public global::System.Collections.Generic.List? ListType121 { get; set; } + public global::System.Collections.Generic.List? ListType124 { get; set; } /// /// /// - public global::System.Collections.Generic.List? ListType122 { get; set; } + public global::System.Collections.Generic.List? ListType125 { get; set; } /// /// /// - public global::System.Collections.Generic.List? ListType123 { get; set; } + public global::System.Collections.Generic.List? ListType126 { get; set; } /// /// /// - public global::System.Collections.Generic.List? ListType124 { get; set; } + public global::System.Collections.Generic.List? ListType127 { get; set; } } } \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.Models.ContactIdentifier.g.cs b/src/libs/Speechify/Generated/Speechify.Models.ContactIdentifier.g.cs index d4360114..33d8c8f3 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.ContactIdentifier.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.ContactIdentifier.g.cs @@ -50,6 +50,11 @@ public sealed partial class ContactIdentifier /// - `telephony` - carrier ANI on an inbound call. Trustworthy as a
/// fact about the call and silent about which of your users it is,
/// so it creates a phone-only contact until you say otherwise.
+ /// - `channel` - the messaging provider a person reached your agent
+ /// through. The event naming them was signed with a secret you
+ /// installed, so they are authenticated, but the handle names an
+ /// account in that provider's workspace rather than a user in your
+ /// system, so it creates its own contact until you link it.
/// - `unverified` - a self-asserted claim from a public or embedded
/// browser session. Nobody stands behind it, so it never joins a
/// verified contact. @@ -101,6 +106,11 @@ public sealed partial class ContactIdentifier /// - `telephony` - carrier ANI on an inbound call. Trustworthy as a
/// fact about the call and silent about which of your users it is,
/// so it creates a phone-only contact until you say otherwise.
+ /// - `channel` - the messaging provider a person reached your agent
+ /// through. The event naming them was signed with a secret you
+ /// installed, so they are authenticated, but the handle names an
+ /// account in that provider's workspace rather than a user in your
+ /// system, so it creates its own contact until you link it.
/// - `unverified` - a self-asserted claim from a public or embedded
/// browser session. Nobody stands behind it, so it never joins a
/// verified contact. diff --git a/src/libs/Speechify/Generated/Speechify.Models.ContactIdentifierAssertedBy.g.cs b/src/libs/Speechify/Generated/Speechify.Models.ContactIdentifierAssertedBy.g.cs index 10d80541..a8d17ec5 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.ContactIdentifierAssertedBy.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.ContactIdentifierAssertedBy.g.cs @@ -11,6 +11,11 @@ namespace Speechify /// - `telephony` - carrier ANI on an inbound call. Trustworthy as a
/// fact about the call and silent about which of your users it is,
/// so it creates a phone-only contact until you say otherwise.
+ /// - `channel` - the messaging provider a person reached your agent
+ /// through. The event naming them was signed with a secret you
+ /// installed, so they are authenticated, but the handle names an
+ /// account in that provider's workspace rather than a user in your
+ /// system, so it creates its own contact until you link it.
/// - `unverified` - a self-asserted claim from a public or embedded
/// browser session. Nobody stands behind it, so it never joins a
/// verified contact. @@ -24,6 +29,10 @@ public enum ContactIdentifierAssertedBy /// /// /// + Channel, + /// + /// + /// Telephony, /// /// @@ -44,6 +53,7 @@ public static string ToValueString(this ContactIdentifierAssertedBy value) return value switch { ContactIdentifierAssertedBy.Api => "api", + ContactIdentifierAssertedBy.Channel => "channel", ContactIdentifierAssertedBy.Telephony => "telephony", ContactIdentifierAssertedBy.Unverified => "unverified", _ => throw new global::System.ArgumentOutOfRangeException(nameof(value), value, null), @@ -57,6 +67,7 @@ public static string ToValueString(this ContactIdentifierAssertedBy value) return value switch { "api" => ContactIdentifierAssertedBy.Api, + "channel" => ContactIdentifierAssertedBy.Channel, "telephony" => ContactIdentifierAssertedBy.Telephony, "unverified" => ContactIdentifierAssertedBy.Unverified, _ => null, diff --git a/src/libs/Speechify/Generated/Speechify.Models.Conversation.g.cs b/src/libs/Speechify/Generated/Speechify.Models.Conversation.g.cs index bbbab0b0..604ce7c5 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.Conversation.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.Conversation.g.cs @@ -35,16 +35,37 @@ public sealed partial class Conversation public required global::Speechify.ConversationStatus Status { get; set; } /// - /// How the caller reached the agent. `web` is the browser /
+ /// Which runtime carried the conversation. `web` is the browser /
/// SDK realtime path; the `sip_*` and `phone` variants come
- /// from the telephony stack; `text` is the text/chat channel
- /// (turn-based, roomless, no call duration). + /// from the telephony stack; `text` is the turn-based, roomless
+ /// runtime (no call duration) that the message API and every
+ /// messaging channel share.
+ /// A conversation reports the transport it actually ran on:
+ /// `web`, `sip_inbound`, `sip_outbound` or `text`. `phone` is
+ /// selectable when filtering a list and matches calls in either
+ /// direction; `whatsapp` is reserved and matches nothing today.
+ /// To tell two conversations on the same transport apart, filter
+ /// or read `channel` instead. ///
[global::System.Text.Json.Serialization.JsonPropertyName("transport")] [global::System.Text.Json.Serialization.JsonConverter(typeof(global::Speechify.JsonConverters.ConversationTransportJsonConverter))] [global::System.Text.Json.Serialization.JsonRequired] public required global::Speechify.ConversationTransport Transport { get; set; } + /// + /// Which front door the conversation arrived through, one level
+ /// coarser than `transport`, and the value to display or group a
+ /// conversation's channel by. Both telephony directions are
+ /// `voice`; the browser / SDK realtime path is `web`; the message
+ /// API is `text`; a conversation reached over a provider front
+ /// door names that provider (`slack`) rather than the transport it
+ /// shares with the message API. + ///
+ [global::System.Text.Json.Serialization.JsonPropertyName("channel")] + [global::System.Text.Json.Serialization.JsonConverter(typeof(global::Speechify.JsonConverters.ConversationChannelJsonConverter))] + [global::System.Text.Json.Serialization.JsonRequired] + public required global::Speechify.ConversationChannel Channel { get; set; } + /// /// When the conversation row was created (the call was
/// initiated). Always present, including for conversations
@@ -269,10 +290,26 @@ public sealed partial class Conversation /// /// /// - /// How the caller reached the agent. `web` is the browser /
+ /// Which runtime carried the conversation. `web` is the browser /
/// SDK realtime path; the `sip_*` and `phone` variants come
- /// from the telephony stack; `text` is the text/chat channel
- /// (turn-based, roomless, no call duration). + /// from the telephony stack; `text` is the turn-based, roomless
+ /// runtime (no call duration) that the message API and every
+ /// messaging channel share.
+ /// A conversation reports the transport it actually ran on:
+ /// `web`, `sip_inbound`, `sip_outbound` or `text`. `phone` is
+ /// selectable when filtering a list and matches calls in either
+ /// direction; `whatsapp` is reserved and matches nothing today.
+ /// To tell two conversations on the same transport apart, filter
+ /// or read `channel` instead. + /// + /// + /// Which front door the conversation arrived through, one level
+ /// coarser than `transport`, and the value to display or group a
+ /// conversation's channel by. Both telephony directions are
+ /// `voice`; the browser / SDK realtime path is `web`; the message
+ /// API is `text`; a conversation reached over a provider front
+ /// door names that provider (`slack`) rather than the transport it
+ /// shares with the message API. /// /// /// When the conversation row was created (the call was
@@ -413,6 +450,7 @@ public Conversation( string agentId, global::Speechify.ConversationStatus status, global::Speechify.ConversationTransport transport, + global::Speechify.ConversationChannel channel, global::System.DateTime createdAt, object metadata, int messageCount, @@ -437,6 +475,7 @@ public Conversation( this.AgentId = agentId ?? throw new global::System.ArgumentNullException(nameof(agentId)); this.Status = status; this.Transport = transport; + this.Channel = channel; this.CreatedAt = createdAt; this.StartedAt = startedAt; this.EndedAt = endedAt; diff --git a/src/libs/Speechify/Generated/Speechify.Models.ConversationChannel.g.cs b/src/libs/Speechify/Generated/Speechify.Models.ConversationChannel.g.cs new file mode 100644 index 00000000..d0f487fc --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.ConversationChannel.g.cs @@ -0,0 +1,69 @@ + +#nullable enable + +namespace Speechify +{ + /// + /// Which front door the conversation arrived through, one level
+ /// coarser than `transport`, and the value to display or group a
+ /// conversation's channel by. Both telephony directions are
+ /// `voice`; the browser / SDK realtime path is `web`; the message
+ /// API is `text`; a conversation reached over a provider front
+ /// door names that provider (`slack`) rather than the transport it
+ /// shares with the message API. + ///
+ public enum ConversationChannel + { + /// + /// + /// + Slack, + /// + /// + /// + Text, + /// + /// + /// + Voice, + /// + /// + /// + Web, + } + + /// + /// Enum extensions to do fast conversions without the reflection. + /// + public static class ConversationChannelExtensions + { + /// + /// Converts an enum to a string. + /// + public static string ToValueString(this ConversationChannel value) + { + return value switch + { + ConversationChannel.Slack => "slack", + ConversationChannel.Text => "text", + ConversationChannel.Voice => "voice", + ConversationChannel.Web => "web", + _ => throw new global::System.ArgumentOutOfRangeException(nameof(value), value, null), + }; + } + /// + /// Converts an string to a enum. + /// + public static ConversationChannel? ToEnum(string value) + { + return value switch + { + "slack" => ConversationChannel.Slack, + "text" => ConversationChannel.Text, + "voice" => ConversationChannel.Voice, + "web" => ConversationChannel.Web, + _ => null, + }; + } + } +} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.Models.ConversationTransport.g.cs b/src/libs/Speechify/Generated/Speechify.Models.ConversationTransport.g.cs index 37e3a204..aeffc662 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.ConversationTransport.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.ConversationTransport.g.cs @@ -4,10 +4,17 @@ namespace Speechify { /// - /// How the caller reached the agent. `web` is the browser /
+ /// Which runtime carried the conversation. `web` is the browser /
/// SDK realtime path; the `sip_*` and `phone` variants come
- /// from the telephony stack; `text` is the text/chat channel
- /// (turn-based, roomless, no call duration). + /// from the telephony stack; `text` is the turn-based, roomless
+ /// runtime (no call duration) that the message API and every
+ /// messaging channel share.
+ /// A conversation reports the transport it actually ran on:
+ /// `web`, `sip_inbound`, `sip_outbound` or `text`. `phone` is
+ /// selectable when filtering a list and matches calls in either
+ /// direction; `whatsapp` is reserved and matches nothing today.
+ /// To tell two conversations on the same transport apart, filter
+ /// or read `channel` instead. ///
public enum ConversationTransport { diff --git a/src/libs/Speechify/Generated/Speechify.Models.CreateHostedAPIRequest.g.cs b/src/libs/Speechify/Generated/Speechify.Models.CreateHostedAPIRequest.g.cs index 574c1432..cac7cd29 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.CreateHostedAPIRequest.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.CreateHostedAPIRequest.g.cs @@ -47,12 +47,24 @@ public sealed partial class CreateHostedAPIRequest [global::System.Text.Json.Serialization.JsonPropertyName("daily_run_cap")] public int? DailyRunCap { get; set; } + /// + /// Reads the API may serve from storage per UTC day; 100000 when omitted. + /// + [global::System.Text.Json.Serialization.JsonPropertyName("daily_read_cap")] + public int? DailyReadCap { get; set; } + /// /// /// [global::System.Text.Json.Serialization.JsonPropertyName("project_id")] public string? ProjectId { get; set; } + /// + /// Register the key set end-user tokens are verified against (an `https` URL on a public host). + /// + [global::System.Text.Json.Serialization.JsonPropertyName("user_token_jwks_url")] + public string? UserTokenJwksUrl { get; set; } + /// /// Additional properties that are not explicitly defined in the schema /// @@ -74,7 +86,13 @@ public sealed partial class CreateHostedAPIRequest /// /// Runs the API may start per UTC day through its run routes; 1000 when omitted. /// + /// + /// Reads the API may serve from storage per UTC day; 100000 when omitted. + /// /// + /// + /// Register the key set end-user tokens are verified against (an `https` URL on a public host). + /// #if NET7_0_OR_GREATER [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] #endif @@ -85,7 +103,9 @@ public CreateHostedAPIRequest( global::Speechify.CreateHostedApiRequestAuthMode? authMode, global::System.Collections.Generic.IList? corsOrigins, int? dailyRunCap, - string? projectId) + int? dailyReadCap, + string? projectId, + string? userTokenJwksUrl) { this.Slug = slug ?? throw new global::System.ArgumentNullException(nameof(slug)); this.Name = name ?? throw new global::System.ArgumentNullException(nameof(name)); @@ -93,7 +113,9 @@ public CreateHostedAPIRequest( this.AuthMode = authMode; this.CorsOrigins = corsOrigins; this.DailyRunCap = dailyRunCap; + this.DailyReadCap = dailyReadCap; this.ProjectId = projectId; + this.UserTokenJwksUrl = userTokenJwksUrl; } /// diff --git a/src/libs/Speechify/Generated/Speechify.Models.CreateHostedAPIRouteRequest.g.cs b/src/libs/Speechify/Generated/Speechify.Models.CreateHostedAPIRouteRequest.g.cs index a4c56bcb..ff54798e 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.CreateHostedAPIRouteRequest.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.CreateHostedAPIRouteRequest.g.cs @@ -39,9 +39,13 @@ public sealed partial class CreateHostedAPIRouteRequest /// What answers a route. `type` selects the fields that apply:
/// `store_query` (store_id, collection, where, order_by, limit),
/// `store_document` (store_id, collection, document_id),
+ /// `store_aggregate` (store_id, collection, where, group_by, metrics:
+ /// a summary in one request, from the same implementation as the
+ /// collection's `aggregate` operation),
/// `run_latest` (trigger_id of a schedule trigger),
/// `run` (trigger_id of a webhook trigger, wait_seconds),
- /// `file` (file_path of a published file). + /// `file` (file_path of one published file; or, on a route whose path
+ /// ends in `*`, file_root and file_index for a whole published tree). ///
[global::System.Text.Json.Serialization.JsonPropertyName("resolver")] [global::System.Text.Json.Serialization.JsonRequired] @@ -82,9 +86,13 @@ public sealed partial class CreateHostedAPIRouteRequest /// What answers a route. `type` selects the fields that apply:
/// `store_query` (store_id, collection, where, order_by, limit),
/// `store_document` (store_id, collection, document_id),
+ /// `store_aggregate` (store_id, collection, where, group_by, metrics:
+ /// a summary in one request, from the same implementation as the
+ /// collection's `aggregate` operation),
/// `run_latest` (trigger_id of a schedule trigger),
/// `run` (trigger_id of a webhook trigger, wait_seconds),
- /// `file` (file_path of a published file). + /// `file` (file_path of one published file; or, on a route whose path
+ /// ends in `*`, file_root and file_index for a whole published tree). /// /// /// diff --git a/src/libs/Speechify/Generated/Speechify.Models.CreateHostedApiRequestAuthMode.g.cs b/src/libs/Speechify/Generated/Speechify.Models.CreateHostedApiRequestAuthMode.g.cs index a08ac414..73c72944 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.CreateHostedApiRequestAuthMode.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.CreateHostedApiRequestAuthMode.g.cs @@ -16,6 +16,10 @@ public enum CreateHostedApiRequestAuthMode /// ///
Public, + /// + /// + /// + UserToken, } /// @@ -32,6 +36,7 @@ public static string ToValueString(this CreateHostedApiRequestAuthMode value) { CreateHostedApiRequestAuthMode.ConsumerKey => "consumer_key", CreateHostedApiRequestAuthMode.Public => "public", + CreateHostedApiRequestAuthMode.UserToken => "user_token", _ => throw new global::System.ArgumentOutOfRangeException(nameof(value), value, null), }; } @@ -44,6 +49,7 @@ public static string ToValueString(this CreateHostedApiRequestAuthMode value) { "consumer_key" => CreateHostedApiRequestAuthMode.ConsumerKey, "public" => CreateHostedApiRequestAuthMode.Public, + "user_token" => CreateHostedApiRequestAuthMode.UserToken, _ => null, }; } diff --git a/src/libs/Speechify/Generated/Speechify.Models.DeleteContactResponse.g.cs b/src/libs/Speechify/Generated/Speechify.Models.DeleteContactResponse.g.cs index 730d23ba..5e8145a2 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.DeleteContactResponse.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.DeleteContactResponse.g.cs @@ -53,6 +53,16 @@ public sealed partial class DeleteContactResponse [global::System.Text.Json.Serialization.JsonPropertyName("runs_erased")] public int? RunsErased { get; set; } + /// + /// Turns in SHARED threads that named this person and no longer do.
+ /// A room has no single caller, so its conversation cannot be erased
+ /// on one member's behalf without taking everyone else's words with
+ /// it; their name comes off their turns instead, leaving the words as
+ /// unattributable as they were before we recorded who said them. + ///
+ [global::System.Text.Json.Serialization.JsonPropertyName("speaker_attributions_erased")] + public int? SpeakerAttributionsErased { get; set; } + /// /// Additional properties that are not explicitly defined in the schema /// @@ -85,6 +95,13 @@ public sealed partial class DeleteContactResponse /// status, timings and usage - what the workspace was billed for is
/// not the person's to erase. /// + /// + /// Turns in SHARED threads that named this person and no longer do.
+ /// A room has no single caller, so its conversation cannot be erased
+ /// on one member's behalf without taking everyone else's words with
+ /// it; their name comes off their turns instead, leaving the words as
+ /// unattributable as they were before we recorded who said them. + /// #if NET7_0_OR_GREATER [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] #endif @@ -93,13 +110,15 @@ public DeleteContactResponse( int identifiersPurged, int callersPurged, int memoriesPurged, - int? runsErased) + int? runsErased, + int? speakerAttributionsErased) { this.ContactPurged = contactPurged; this.IdentifiersPurged = identifiersPurged; this.CallersPurged = callersPurged; this.MemoriesPurged = memoriesPurged; this.RunsErased = runsErased; + this.SpeakerAttributionsErased = speakerAttributionsErased; } /// diff --git a/src/libs/Speechify/Generated/Speechify.Models.ErrorCode.g.cs b/src/libs/Speechify/Generated/Speechify.Models.ErrorCode.g.cs index 47577bcf..c98d14e7 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.ErrorCode.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.ErrorCode.g.cs @@ -396,6 +396,10 @@ public enum ErrorCode /// /// /// + RouteReadLimitReached, + /// + /// + /// RouteRunFailed, /// /// @@ -476,6 +480,10 @@ public enum ErrorCode /// /// /// + StoreDocumentDeleted, + /// + /// + /// StoreDocumentLimitReached, /// /// @@ -484,6 +492,10 @@ public enum ErrorCode /// /// /// + StoreDocumentVersionConflict, + /// + /// + /// StoreLimitReached, /// /// @@ -706,6 +718,7 @@ public static string ToValueString(this ErrorCode value) ErrorCode.RateLimited => "rate_limited", ErrorCode.RelayDisplacesAgent => "relay_displaces_agent", ErrorCode.RouteOutputUnavailable => "route_output_unavailable", + ErrorCode.RouteReadLimitReached => "route_read_limit_reached", ErrorCode.RouteRunFailed => "route_run_failed", ErrorCode.RouteRunLimitReached => "route_run_limit_reached", ErrorCode.RouteRunTimeout => "route_run_timeout", @@ -726,8 +739,10 @@ public static string ToValueString(this ErrorCode value) ErrorCode.SpendBudgetExceeded => "spend_budget_exceeded", ErrorCode.SpendCapExceeded => "spend_cap_exceeded", ErrorCode.StoreBytesLimitReached => "store_bytes_limit_reached", + ErrorCode.StoreDocumentDeleted => "store_document_deleted", ErrorCode.StoreDocumentLimitReached => "store_document_limit_reached", ErrorCode.StoreDocumentNotFound => "store_document_not_found", + ErrorCode.StoreDocumentVersionConflict => "store_document_version_conflict", ErrorCode.StoreLimitReached => "store_limit_reached", ErrorCode.StoreNotConfigured => "store_not_configured", ErrorCode.StoreNotFound => "store_not_found", @@ -862,6 +877,7 @@ public static string ToValueString(this ErrorCode value) "rate_limited" => ErrorCode.RateLimited, "relay_displaces_agent" => ErrorCode.RelayDisplacesAgent, "route_output_unavailable" => ErrorCode.RouteOutputUnavailable, + "route_read_limit_reached" => ErrorCode.RouteReadLimitReached, "route_run_failed" => ErrorCode.RouteRunFailed, "route_run_limit_reached" => ErrorCode.RouteRunLimitReached, "route_run_timeout" => ErrorCode.RouteRunTimeout, @@ -882,8 +898,10 @@ public static string ToValueString(this ErrorCode value) "spend_budget_exceeded" => ErrorCode.SpendBudgetExceeded, "spend_cap_exceeded" => ErrorCode.SpendCapExceeded, "store_bytes_limit_reached" => ErrorCode.StoreBytesLimitReached, + "store_document_deleted" => ErrorCode.StoreDocumentDeleted, "store_document_limit_reached" => ErrorCode.StoreDocumentLimitReached, "store_document_not_found" => ErrorCode.StoreDocumentNotFound, + "store_document_version_conflict" => ErrorCode.StoreDocumentVersionConflict, "store_limit_reached" => ErrorCode.StoreLimitReached, "store_not_configured" => ErrorCode.StoreNotConfigured, "store_not_found" => ErrorCode.StoreNotFound, diff --git a/src/libs/Speechify/Generated/Speechify.Models.HostedAPI.g.cs b/src/libs/Speechify/Generated/Speechify.Models.HostedAPI.g.cs index 3129b8a2..115b5e15 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.HostedAPI.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.HostedAPI.g.cs @@ -55,7 +55,12 @@ public sealed partial class HostedAPI /// /// `consumer_key`: every request presents a `ck_` bearer minted for this
/// API. `public`: no credential; only read resolvers may be served, and
- /// the per-IP limiter is the only bound. + /// the per-IP limiter is the only bound. `user_token`: every request
+ /// presents a short-lived JWT your backend signed for the calling user
+ /// (`sub`, `exp` within 24 hours, optional `aud` naming this API),
+ /// verified against the API's signing secret (HS256) or its registered
+ /// JWKS URL (RS256 / ES256 / EdDSA). Routes bind the verified claims as
+ /// `{{user.sub}}` and the response cache is keyed per user. ///
[global::System.Text.Json.Serialization.JsonPropertyName("auth_mode")] [global::System.Text.Json.Serialization.JsonConverter(typeof(global::Speechify.JsonConverters.HostedApiAuthModeJsonConverter))] @@ -83,12 +88,40 @@ public sealed partial class HostedAPI [global::System.Text.Json.Serialization.JsonRequired] public required int DailyRunCap { get; set; } + /// + /// Reads the API's store, file and run_latest routes may serve from
+ /// storage per UTC day; the storage ceiling behind a hot path. Always
+ /// present on a current API; optional on the wire so a reader built
+ /// before it existed keeps parsing. A
+ /// response served from the cache is not a read. Past the cap a read
+ /// route answers 429 `route_read_limit_reached`. Without Redis nothing
+ /// counts: a public route is paused by the limiter in that state, a
+ /// keyed or tokened caller passes. + ///
+ [global::System.Text.Json.Serialization.JsonPropertyName("daily_read_cap")] + public int? DailyReadCap { get; set; } + /// /// /// [global::System.Text.Json.Serialization.JsonPropertyName("project_id")] public string? ProjectId { get; set; } + /// + /// The key set end-user tokens are verified against when set (an
+ /// `https` URL on a public host, read on demand and cached briefly).
+ /// When null, tokens are verified against the API's signing secret. + ///
+ [global::System.Text.Json.Serialization.JsonPropertyName("user_token_jwks_url")] + public string? UserTokenJwksUrl { get; set; } + + /// + /// The masked signing secret end-user tokens are verified against
+ /// (the rotate-user-token-secret verb mints it); null until minted. + ///
+ [global::System.Text.Json.Serialization.JsonPropertyName("user_token_secret_hint")] + public string? UserTokenSecretHint { get; set; } + /// /// /// @@ -123,7 +156,12 @@ public sealed partial class HostedAPI /// /// `consumer_key`: every request presents a `ck_` bearer minted for this
/// API. `public`: no credential; only read resolvers may be served, and
- /// the per-IP limiter is the only bound. + /// the per-IP limiter is the only bound. `user_token`: every request
+ /// presents a short-lived JWT your backend signed for the calling user
+ /// (`sub`, `exp` within 24 hours, optional `aud` naming this API),
+ /// verified against the API's signing secret (HS256) or its registered
+ /// JWKS URL (RS256 / ES256 / EdDSA). Routes bind the verified claims as
+ /// `{{user.sub}}` and the response cache is keyed per user. /// /// /// Browser origins allowed to call the API (`*` for any). Empty for server-to-server only. @@ -134,7 +172,26 @@ public sealed partial class HostedAPI /// /// /// + /// + /// Reads the API's store, file and run_latest routes may serve from
+ /// storage per UTC day; the storage ceiling behind a hot path. Always
+ /// present on a current API; optional on the wire so a reader built
+ /// before it existed keeps parsing. A
+ /// response served from the cache is not a read. Past the cap a read
+ /// route answers 429 `route_read_limit_reached`. Without Redis nothing
+ /// counts: a public route is paused by the limiter in that state, a
+ /// keyed or tokened caller passes. + /// /// + /// + /// The key set end-user tokens are verified against when set (an
+ /// `https` URL on a public host, read on demand and cached briefly).
+ /// When null, tokens are verified against the API's signing secret. + /// + /// + /// The masked signing secret end-user tokens are verified against
+ /// (the rotate-user-token-secret verb mints it); null until minted. + /// #if NET7_0_OR_GREATER [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] #endif @@ -151,7 +208,10 @@ public HostedAPI( int dailyRunCap, global::System.DateTime createdAt, global::System.DateTime updatedAt, - string? projectId) + int? dailyReadCap, + string? projectId, + string? userTokenJwksUrl, + string? userTokenSecretHint) { this.Id = id ?? throw new global::System.ArgumentNullException(nameof(id)); this.Slug = slug ?? throw new global::System.ArgumentNullException(nameof(slug)); @@ -163,7 +223,10 @@ public HostedAPI( this.CorsOrigins = corsOrigins ?? throw new global::System.ArgumentNullException(nameof(corsOrigins)); this.Enabled = enabled; this.DailyRunCap = dailyRunCap; + this.DailyReadCap = dailyReadCap; this.ProjectId = projectId; + this.UserTokenJwksUrl = userTokenJwksUrl; + this.UserTokenSecretHint = userTokenSecretHint; this.CreatedAt = createdAt; this.UpdatedAt = updatedAt; } diff --git a/src/libs/Speechify/Generated/Speechify.Models.HostedAPIResolver.g.cs b/src/libs/Speechify/Generated/Speechify.Models.HostedAPIResolver.g.cs index cceaec9b..dc4a14f2 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.HostedAPIResolver.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.HostedAPIResolver.g.cs @@ -7,9 +7,13 @@ namespace Speechify /// What answers a route. `type` selects the fields that apply:
/// `store_query` (store_id, collection, where, order_by, limit),
/// `store_document` (store_id, collection, document_id),
+ /// `store_aggregate` (store_id, collection, where, group_by, metrics:
+ /// a summary in one request, from the same implementation as the
+ /// collection's `aggregate` operation),
/// `run_latest` (trigger_id of a schedule trigger),
/// `run` (trigger_id of a webhook trigger, wait_seconds),
- /// `file` (file_path of a published file). + /// `file` (file_path of one published file; or, on a route whose path
+ /// ends in `*`, file_root and file_index for a whole published tree). ///
public sealed partial class HostedAPIResolver { @@ -34,7 +38,7 @@ public sealed partial class HostedAPIResolver public string? Collection { get; set; } /// - /// A literal id or a `{{path.x}}` / `{{query.x}}` template. + /// A literal id, a `{{path.x}}` / `{{query.x}}` template bound from the request, or a `{{user.x}}` claim of the verified end-user token. /// [global::System.Text.Json.Serialization.JsonPropertyName("document_id")] public string? DocumentId { get; set; } @@ -58,26 +62,61 @@ public sealed partial class HostedAPIResolver public int? Limit { get; set; } /// - /// The path a `kept` file was published under, for a `file` route.
- /// The route answers that file's bytes under the file's own media type
- /// - the only route type that does not return JSON - so a page renders
- /// and a spreadsheet downloads. Must be a GET.
+ /// For a `store_aggregate` route, the projected field to group by. + ///
+ [global::System.Text.Json.Serialization.JsonPropertyName("group_by")] + public string? GroupBy { get; set; } + + /// + /// For a `store_aggregate` route, the reductions to answer with; the where clauses bind from the request as on a query. + /// + [global::System.Text.Json.Serialization.JsonPropertyName("metrics")] + public global::System.Collections.Generic.IList? Metrics { get; set; } + + /// + /// The path a `kept` file was published under, for a `file` route on
+ /// a path without a wildcard. The route answers that file's bytes
+ /// under the file's own media type - the only route type that does
+ /// not return JSON - so a page renders and a spreadsheet downloads.
+ /// Must be a GET.
/// A literal path, or a `{{path.x}}` template that replaces the whole
- /// value, so one route can serve many files: mount `/{name}` and the
- /// URL names the published path. A published path is slash-separated,
- /// and the template carries the whole path after its route - a route
- /// at `/files/{name}` serves `/files/reports/q3.csv` as well as a file
- /// at the top level. A template embedded in a longer path
- /// (`a/{{path.x}}.html`) is refused - substitution here replaces the
- /// value, it does not interpolate into it.
- /// Only a `kept` file is reachable: working material handed to a run
- /// cannot be published by pointing a route at it. A path with nothing
- /// at it answers `404`, so an artifact can be wired before it is
- /// uploaded and replaced without touching the route. + /// value and binds one segment of the URL. A template embedded in a
+ /// longer path (`a/{{path.x}}.html`) is refused - substitution here
+ /// replaces the value, it does not interpolate into it. To serve many
+ /// files, or a nested tree, mount a route ending in `*` and use
+ /// file_root instead.
+ /// Only a `kept`, workspace-wide file is reachable: working material
+ /// handed to a run cannot be published by pointing a route at it, and
+ /// a file uploaded for one person is never served by a route, because
+ /// a route answers whoever holds the URL. A `{{user.x}}` template may
+ /// shape the path on a `user_token` API, but the file it reaches is
+ /// still one the workspace published. A path with nothing at it
+ /// answers `404`, so an artifact can be wired before it is uploaded
+ /// and replaced without touching the route. ///
[global::System.Text.Json.Serialization.JsonPropertyName("file_path")] public string? FilePath { get; set; } + /// + /// For a `file` route whose path ends in `*`: the published-path
+ /// prefix the tree lives under (`dash` serves `dash/index.html` at
+ /// `/app/index.html` on a route at `/app/*`). Empty serves every
+ /// published file under the route. A rebuild that renames the tree's
+ /// assets touches no route. Refused on a route without the wildcard. + ///
+ [global::System.Text.Json.Serialization.JsonPropertyName("file_root")] + public string? FileRoot { get; set; } + + /// + /// For a tree route: the entry document, relative to file_root, that
+ /// a bare prefix answers and that an unmatched path with no file
+ /// extension falls back to, so a client-routed application survives
+ /// a refresh and a deep link. A missing asset with an extension stays
+ /// a 404. Omit for a plain file tree. + ///
+ [global::System.Text.Json.Serialization.JsonPropertyName("file_index")] + public string? FileIndex { get; set; } + /// /// /// @@ -103,30 +142,53 @@ public sealed partial class HostedAPIResolver /// /// /// - /// A literal id or a `{{path.x}}` / `{{query.x}}` template. + /// A literal id, a `{{path.x}}` / `{{query.x}}` template bound from the request, or a `{{user.x}}` claim of the verified end-user token. /// /// /// /// /// Default page size; the consumer's `limit` query parameter overrides it. /// + /// + /// For a `store_aggregate` route, the projected field to group by. + /// + /// + /// For a `store_aggregate` route, the reductions to answer with; the where clauses bind from the request as on a query. + /// /// - /// The path a `kept` file was published under, for a `file` route.
- /// The route answers that file's bytes under the file's own media type
- /// - the only route type that does not return JSON - so a page renders
- /// and a spreadsheet downloads. Must be a GET.
+ /// The path a `kept` file was published under, for a `file` route on
+ /// a path without a wildcard. The route answers that file's bytes
+ /// under the file's own media type - the only route type that does
+ /// not return JSON - so a page renders and a spreadsheet downloads.
+ /// Must be a GET.
/// A literal path, or a `{{path.x}}` template that replaces the whole
- /// value, so one route can serve many files: mount `/{name}` and the
- /// URL names the published path. A published path is slash-separated,
- /// and the template carries the whole path after its route - a route
- /// at `/files/{name}` serves `/files/reports/q3.csv` as well as a file
- /// at the top level. A template embedded in a longer path
- /// (`a/{{path.x}}.html`) is refused - substitution here replaces the
- /// value, it does not interpolate into it.
- /// Only a `kept` file is reachable: working material handed to a run
- /// cannot be published by pointing a route at it. A path with nothing
- /// at it answers `404`, so an artifact can be wired before it is
- /// uploaded and replaced without touching the route. + /// value and binds one segment of the URL. A template embedded in a
+ /// longer path (`a/{{path.x}}.html`) is refused - substitution here
+ /// replaces the value, it does not interpolate into it. To serve many
+ /// files, or a nested tree, mount a route ending in `*` and use
+ /// file_root instead.
+ /// Only a `kept`, workspace-wide file is reachable: working material
+ /// handed to a run cannot be published by pointing a route at it, and
+ /// a file uploaded for one person is never served by a route, because
+ /// a route answers whoever holds the URL. A `{{user.x}}` template may
+ /// shape the path on a `user_token` API, but the file it reaches is
+ /// still one the workspace published. A path with nothing at it
+ /// answers `404`, so an artifact can be wired before it is uploaded
+ /// and replaced without touching the route. + /// + /// + /// For a `file` route whose path ends in `*`: the published-path
+ /// prefix the tree lives under (`dash` serves `dash/index.html` at
+ /// `/app/index.html` on a route at `/app/*`). Empty serves every
+ /// published file under the route. A rebuild that renames the tree's
+ /// assets touches no route. Refused on a route without the wildcard. + /// + /// + /// For a tree route: the entry document, relative to file_root, that
+ /// a bare prefix answers and that an unmatched path with no file
+ /// extension falls back to, so a client-routed application survives
+ /// a refresh and a deep link. A missing asset with an extension stays
+ /// a 404. Omit for a plain file tree. /// /// /// @@ -143,7 +205,11 @@ public HostedAPIResolver( global::System.Collections.Generic.IList? where, global::Speechify.HostedApiResolverOrderBy? orderBy, int? limit, + string? groupBy, + global::System.Collections.Generic.IList? metrics, string? filePath, + string? fileRoot, + string? fileIndex, string? triggerId, int? waitSeconds) { @@ -154,7 +220,11 @@ public HostedAPIResolver( this.Where = where; this.OrderBy = orderBy; this.Limit = limit; + this.GroupBy = groupBy; + this.Metrics = metrics; this.FilePath = filePath; + this.FileRoot = fileRoot; + this.FileIndex = fileIndex; this.TriggerId = triggerId; this.WaitSeconds = waitSeconds; } diff --git a/src/libs/Speechify/Generated/Speechify.Models.HostedAPIRoute.g.cs b/src/libs/Speechify/Generated/Speechify.Models.HostedAPIRoute.g.cs index f7aacc2a..59f21984 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.HostedAPIRoute.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.HostedAPIRoute.g.cs @@ -31,7 +31,7 @@ public sealed partial class HostedAPIRoute public required global::Speechify.HostedApiRouteMethod Method { get; set; } /// - /// + /// Lowercase segments, one-segment `{params}`, and optionally a trailing `*` that serves a published tree (file routes only). /// [global::System.Text.Json.Serialization.JsonPropertyName("path")] [global::System.Text.Json.Serialization.JsonRequired] @@ -55,9 +55,13 @@ public sealed partial class HostedAPIRoute /// What answers a route. `type` selects the fields that apply:
/// `store_query` (store_id, collection, where, order_by, limit),
/// `store_document` (store_id, collection, document_id),
+ /// `store_aggregate` (store_id, collection, where, group_by, metrics:
+ /// a summary in one request, from the same implementation as the
+ /// collection's `aggregate` operation),
/// `run_latest` (trigger_id of a schedule trigger),
/// `run` (trigger_id of a webhook trigger, wait_seconds),
- /// `file` (file_path of a published file). + /// `file` (file_path of one published file; or, on a route whose path
+ /// ends in `*`, file_root and file_index for a whole published tree). ///
[global::System.Text.Json.Serialization.JsonPropertyName("resolver")] [global::System.Text.Json.Serialization.JsonRequired] @@ -70,7 +74,12 @@ public sealed partial class HostedAPIRoute public object? ResponseSchema { get; set; } /// - /// Cache-Control max-age on GET responses; 0 disables caching. + /// Cache-Control max-age on GET responses, and the shared response
+ /// cache's lifetime for store and run_latest routes; 0 disables
+ /// caching, except on a public API, where a GET route with 0 is served
+ /// with the platform default of 60 seconds so an anonymous crawler
+ /// never reads storage per request. File routes are never in the
+ /// response cache; they carry the header for the edge. ///
[global::System.Text.Json.Serialization.JsonPropertyName("cache_ttl_seconds")] [global::System.Text.Json.Serialization.JsonRequired] @@ -109,19 +118,30 @@ public sealed partial class HostedAPIRoute /// /// /// - /// + /// + /// Lowercase segments, one-segment `{params}`, and optionally a trailing `*` that serves a published tree (file routes only). + /// /// /// /// /// What answers a route. `type` selects the fields that apply:
/// `store_query` (store_id, collection, where, order_by, limit),
/// `store_document` (store_id, collection, document_id),
+ /// `store_aggregate` (store_id, collection, where, group_by, metrics:
+ /// a summary in one request, from the same implementation as the
+ /// collection's `aggregate` operation),
/// `run_latest` (trigger_id of a schedule trigger),
/// `run` (trigger_id of a webhook trigger, wait_seconds),
- /// `file` (file_path of a published file). + /// `file` (file_path of one published file; or, on a route whose path
+ /// ends in `*`, file_root and file_index for a whole published tree). /// /// - /// Cache-Control max-age on GET responses; 0 disables caching. + /// Cache-Control max-age on GET responses, and the shared response
+ /// cache's lifetime for store and run_latest routes; 0 disables
+ /// caching, except on a public API, where a GET route with 0 is served
+ /// with the platform default of 60 seconds so an anonymous crawler
+ /// never reads storage per request. File routes are never in the
+ /// response cache; they carry the header for the edge. /// /// /// diff --git a/src/libs/Speechify/Generated/Speechify.Models.PhoneNumberRelay.Json.g.cs b/src/libs/Speechify/Generated/Speechify.Models.HostedAPIUsage.Json.g.cs similarity index 88% rename from src/libs/Speechify/Generated/Speechify.Models.PhoneNumberRelay.Json.g.cs rename to src/libs/Speechify/Generated/Speechify.Models.HostedAPIUsage.Json.g.cs index cac77e2f..9ce6556c 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.PhoneNumberRelay.Json.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.HostedAPIUsage.Json.g.cs @@ -2,7 +2,7 @@ namespace Speechify { - public sealed partial class PhoneNumberRelay + public sealed partial class HostedAPIUsage { /// /// 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::Speechify.PhoneNumberRelay? FromJson( + public static global::Speechify.HostedAPIUsage? FromJson( string json, global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) { return global::System.Text.Json.JsonSerializer.Deserialize( json, - typeof(global::Speechify.PhoneNumberRelay), - jsonSerializerContext) as global::Speechify.PhoneNumberRelay; + typeof(global::Speechify.HostedAPIUsage), + jsonSerializerContext) as global::Speechify.HostedAPIUsage; } /// /// Deserializes a JSON string using the generated default JsonSerializerContext. /// - public static global::Speechify.PhoneNumberRelay? FromJson( + public static global::Speechify.HostedAPIUsage? 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::Speechify.PhoneNumberRelay? FromJson( + public static global::Speechify.HostedAPIUsage? FromJson( string json, global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) { @@ -86,7 +86,7 @@ public string ToJson( global::Speechify.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::Speechify.PhoneNumberRelay), - jsonSerializerContext).ConfigureAwait(false)) as global::Speechify.PhoneNumberRelay; + typeof(global::Speechify.HostedAPIUsage), + jsonSerializerContext).ConfigureAwait(false)) as global::Speechify.HostedAPIUsage; } /// /// 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::Speechify.SourceGenerationContext.Default); } - return global::System.Text.Json.JsonSerializer.DeserializeAsync( + return global::System.Text.Json.JsonSerializer.DeserializeAsync( jsonStream, jsonSerializerOptions); } diff --git a/src/libs/Speechify/Generated/Speechify.Models.HostedAPIUsage.g.cs b/src/libs/Speechify/Generated/Speechify.Models.HostedAPIUsage.g.cs new file mode 100644 index 00000000..5738b4c7 --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.HostedAPIUsage.g.cs @@ -0,0 +1,113 @@ + +#nullable enable + +namespace Speechify +{ + /// + /// + /// + public sealed partial class HostedAPIUsage + { + /// + /// The UTC day the counters cover, `YYYY-MM-DD`. + /// + [global::System.Text.Json.Serialization.JsonPropertyName("day")] + [global::System.Text.Json.Serialization.JsonRequired] + public required string Day { get; set; } + + /// + /// Reads served from storage today across the API's routes. + /// + [global::System.Text.Json.Serialization.JsonPropertyName("reads")] + [global::System.Text.Json.Serialization.JsonRequired] + public required long Reads { get; set; } + + /// + /// + /// + [global::System.Text.Json.Serialization.JsonPropertyName("daily_read_cap")] + [global::System.Text.Json.Serialization.JsonRequired] + public required int DailyReadCap { get; set; } + + /// + /// Runs started today through the API's run routes. + /// + [global::System.Text.Json.Serialization.JsonPropertyName("runs")] + [global::System.Text.Json.Serialization.JsonRequired] + public required long Runs { get; set; } + + /// + /// + /// + [global::System.Text.Json.Serialization.JsonPropertyName("daily_run_cap")] + [global::System.Text.Json.Serialization.JsonRequired] + public required int DailyRunCap { get; set; } + + /// + /// + /// + [global::System.Text.Json.Serialization.JsonPropertyName("routes")] + [global::System.Text.Json.Serialization.JsonRequired] + public required global::System.Collections.Generic.IList Routes { get; set; } + + /// + /// False where nothing counts (no Redis); the numbers are then zero, not quiet. + /// + [global::System.Text.Json.Serialization.JsonPropertyName("counters_available")] + [global::System.Text.Json.Serialization.JsonRequired] + public required bool CountersAvailable { get; set; } + + /// + /// Additional properties that are not explicitly defined in the schema + /// + [global::System.Text.Json.Serialization.JsonExtensionData] + public global::System.Collections.Generic.IDictionary AdditionalProperties { get; set; } = new global::System.Collections.Generic.Dictionary(); + + /// + /// Initializes a new instance of the class. + /// + /// + /// The UTC day the counters cover, `YYYY-MM-DD`. + /// + /// + /// Reads served from storage today across the API's routes. + /// + /// + /// + /// Runs started today through the API's run routes. + /// + /// + /// + /// + /// False where nothing counts (no Redis); the numbers are then zero, not quiet. + /// +#if NET7_0_OR_GREATER + [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] +#endif + public HostedAPIUsage( + string day, + long reads, + int dailyReadCap, + long runs, + int dailyRunCap, + global::System.Collections.Generic.IList routes, + bool countersAvailable) + { + this.Day = day ?? throw new global::System.ArgumentNullException(nameof(day)); + this.Reads = reads; + this.DailyReadCap = dailyReadCap; + this.Runs = runs; + this.DailyRunCap = dailyRunCap; + this.Routes = routes ?? throw new global::System.ArgumentNullException(nameof(routes)); + this.CountersAvailable = countersAvailable; + } + + /// + /// Initializes a new instance of the class. + /// + public HostedAPIUsage() + { + } + + } +} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.Models.HostedAPIUserTokenSecret.Json.g.cs b/src/libs/Speechify/Generated/Speechify.Models.HostedAPIUserTokenSecret.Json.g.cs new file mode 100644 index 00000000..1323efdf --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.HostedAPIUserTokenSecret.Json.g.cs @@ -0,0 +1,141 @@ +#nullable enable + +namespace Speechify +{ + public sealed partial class HostedAPIUserTokenSecret + { + /// + /// Serializes the current instance to a JSON string using the provided JsonSerializerContext. + /// + public string ToJson( + global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) + { + return global::System.Text.Json.JsonSerializer.Serialize( + this, + this.GetType(), + jsonSerializerContext); + } + + /// + /// Serializes the current instance to a JSON string using the generated default JsonSerializerContext. + /// + public string ToJson() + { + return ToJson(global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Serializes the current instance to a JSON string using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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 string ToJson( + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return ToJson(global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.Serialize( + this, + jsonSerializerOptions); + } + + /// + /// Deserializes a JSON string using the provided JsonSerializerContext. + /// + public static global::Speechify.HostedAPIUserTokenSecret? FromJson( + string json, + global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) + { + return global::System.Text.Json.JsonSerializer.Deserialize( + json, + typeof(global::Speechify.HostedAPIUserTokenSecret), + jsonSerializerContext) as global::Speechify.HostedAPIUserTokenSecret; + } + + /// + /// Deserializes a JSON string using the generated default JsonSerializerContext. + /// + public static global::Speechify.HostedAPIUserTokenSecret? FromJson( + string json) + { + return FromJson( + json, + global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Deserializes a JSON string using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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::Speechify.HostedAPIUserTokenSecret? FromJson( + string json, + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return FromJson( + json, + global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.Deserialize( + json, + jsonSerializerOptions); + } + + /// + /// Deserializes a JSON stream using the provided JsonSerializerContext. + /// + 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::Speechify.HostedAPIUserTokenSecret), + jsonSerializerContext).ConfigureAwait(false)) as global::Speechify.HostedAPIUserTokenSecret; + } + + /// + /// Deserializes a JSON stream using the generated default JsonSerializerContext. + /// + public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( + global::System.IO.Stream jsonStream) + { + return FromJsonStreamAsync( + jsonStream, + global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Deserializes a JSON stream using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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( + global::System.IO.Stream jsonStream, + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return FromJsonStreamAsync( + jsonStream, + global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.DeserializeAsync( + jsonStream, + jsonSerializerOptions); + } + } +} diff --git a/src/libs/Speechify/Generated/Speechify.Models.HostedAPIUserTokenSecret.g.cs b/src/libs/Speechify/Generated/Speechify.Models.HostedAPIUserTokenSecret.g.cs new file mode 100644 index 00000000..6fe46522 --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.HostedAPIUserTokenSecret.g.cs @@ -0,0 +1,59 @@ + +#nullable enable + +namespace Speechify +{ + /// + /// + /// + public sealed partial class HostedAPIUserTokenSecret + { + /// + /// The plaintext signing secret, present on this response only. Sign end-user tokens with it (HS256). + /// + [global::System.Text.Json.Serialization.JsonPropertyName("secret")] + [global::System.Text.Json.Serialization.JsonRequired] + public required string Secret { get; set; } + + /// + /// The masked form every later read shows as `user_token_secret_hint`. + /// + [global::System.Text.Json.Serialization.JsonPropertyName("secret_hint")] + [global::System.Text.Json.Serialization.JsonRequired] + public required string SecretHint { get; set; } + + /// + /// Additional properties that are not explicitly defined in the schema + /// + [global::System.Text.Json.Serialization.JsonExtensionData] + public global::System.Collections.Generic.IDictionary AdditionalProperties { get; set; } = new global::System.Collections.Generic.Dictionary(); + + /// + /// Initializes a new instance of the class. + /// + /// + /// The plaintext signing secret, present on this response only. Sign end-user tokens with it (HS256). + /// + /// + /// The masked form every later read shows as `user_token_secret_hint`. + /// +#if NET7_0_OR_GREATER + [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] +#endif + public HostedAPIUserTokenSecret( + string secret, + string secretHint) + { + this.Secret = secret ?? throw new global::System.ArgumentNullException(nameof(secret)); + this.SecretHint = secretHint ?? throw new global::System.ArgumentNullException(nameof(secretHint)); + } + + /// + /// Initializes a new instance of the class. + /// + public HostedAPIUserTokenSecret() + { + } + + } +} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.Models.HostedApiAuthMode.g.cs b/src/libs/Speechify/Generated/Speechify.Models.HostedApiAuthMode.g.cs index 50030073..b0300281 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.HostedApiAuthMode.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.HostedApiAuthMode.g.cs @@ -6,7 +6,12 @@ namespace Speechify /// /// `consumer_key`: every request presents a `ck_` bearer minted for this
/// API. `public`: no credential; only read resolvers may be served, and
- /// the per-IP limiter is the only bound. + /// the per-IP limiter is the only bound. `user_token`: every request
+ /// presents a short-lived JWT your backend signed for the calling user
+ /// (`sub`, `exp` within 24 hours, optional `aud` naming this API),
+ /// verified against the API's signing secret (HS256) or its registered
+ /// JWKS URL (RS256 / ES256 / EdDSA). Routes bind the verified claims as
+ /// `{{user.sub}}` and the response cache is keyed per user. ///
public enum HostedApiAuthMode { @@ -18,6 +23,10 @@ public enum HostedApiAuthMode /// no credential; only read resolvers may be served, and ///
Public, + /// + /// every request + /// + UserToken, } /// @@ -34,6 +43,7 @@ public static string ToValueString(this HostedApiAuthMode value) { HostedApiAuthMode.ConsumerKey => "consumer_key", HostedApiAuthMode.Public => "public", + HostedApiAuthMode.UserToken => "user_token", _ => throw new global::System.ArgumentOutOfRangeException(nameof(value), value, null), }; } @@ -46,6 +56,7 @@ public static string ToValueString(this HostedApiAuthMode value) { "consumer_key" => HostedApiAuthMode.ConsumerKey, "public" => HostedApiAuthMode.Public, + "user_token" => HostedApiAuthMode.UserToken, _ => null, }; } diff --git a/src/libs/Speechify/Generated/Speechify.Models.HostedApiResolverType.g.cs b/src/libs/Speechify/Generated/Speechify.Models.HostedApiResolverType.g.cs index 2a250ba2..17ca4c80 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.HostedApiResolverType.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.HostedApiResolverType.g.cs @@ -23,6 +23,10 @@ public enum HostedApiResolverType /// /// /// + StoreAggregate, + /// + /// + /// StoreDocument, /// /// @@ -45,6 +49,7 @@ public static string ToValueString(this HostedApiResolverType value) HostedApiResolverType.File => "file", HostedApiResolverType.Run => "run", HostedApiResolverType.RunLatest => "run_latest", + HostedApiResolverType.StoreAggregate => "store_aggregate", HostedApiResolverType.StoreDocument => "store_document", HostedApiResolverType.StoreQuery => "store_query", _ => throw new global::System.ArgumentOutOfRangeException(nameof(value), value, null), @@ -60,6 +65,7 @@ public static string ToValueString(this HostedApiResolverType value) "file" => HostedApiResolverType.File, "run" => HostedApiResolverType.Run, "run_latest" => HostedApiResolverType.RunLatest, + "store_aggregate" => HostedApiResolverType.StoreAggregate, "store_document" => HostedApiResolverType.StoreDocument, "store_query" => HostedApiResolverType.StoreQuery, _ => null, diff --git a/src/libs/Speechify/Generated/Speechify.Models.HostedApiResolverWhereItems.g.cs b/src/libs/Speechify/Generated/Speechify.Models.HostedApiResolverWhereItems.g.cs index 4432a3cc..9ea48358 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.HostedApiResolverWhereItems.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.HostedApiResolverWhereItems.g.cs @@ -24,7 +24,14 @@ public sealed partial class HostedApiResolverWhereItems public required global::Speechify.HostedApiResolverWhereItemsOp Op { get; set; } /// - /// A literal, or a `{{query.x}}` / `{{path.x}}` / `{{body.x}}` template; a clause whose template is absent from the request is skipped. + /// A literal; a `{{query.x}}` / `{{path.x}}` / `{{body.x}}` template
+ /// bound from the request; or a `{{user.x}}` claim of the verified
+ /// end-user token (only on a `user_token` API). A clause whose
+ /// template is absent from the request is skipped. The field
+ /// `user_identity` is the person a document belongs to, and a
+ /// clause on it must bind `{{user.sub}}`, never a request template:
+ /// a request parameter is whatever the caller sends, so scoping on
+ /// it would let any caller read any user's rows. ///
[global::System.Text.Json.Serialization.JsonPropertyName("value")] [global::System.Text.Json.Serialization.JsonRequired] @@ -42,7 +49,14 @@ public sealed partial class HostedApiResolverWhereItems /// /// /// - /// A literal, or a `{{query.x}}` / `{{path.x}}` / `{{body.x}}` template; a clause whose template is absent from the request is skipped. + /// A literal; a `{{query.x}}` / `{{path.x}}` / `{{body.x}}` template
+ /// bound from the request; or a `{{user.x}}` claim of the verified
+ /// end-user token (only on a `user_token` API). A clause whose
+ /// template is absent from the request is skipped. The field
+ /// `user_identity` is the person a document belongs to, and a
+ /// clause on it must bind `{{user.sub}}`, never a request template:
+ /// a request parameter is whatever the caller sends, so scoping on
+ /// it would let any caller read any user's rows. /// #if NET7_0_OR_GREATER [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] diff --git a/src/libs/Speechify/Generated/Speechify.Models.HostedApiResolverWhereItemsValue.g.cs b/src/libs/Speechify/Generated/Speechify.Models.HostedApiResolverWhereItemsValue.g.cs index 08177d66..16c42ae9 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.HostedApiResolverWhereItemsValue.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.HostedApiResolverWhereItemsValue.g.cs @@ -4,7 +4,14 @@ namespace Speechify { /// - /// A literal, or a `{{query.x}}` / `{{path.x}}` / `{{body.x}}` template; a clause whose template is absent from the request is skipped. + /// A literal; a `{{query.x}}` / `{{path.x}}` / `{{body.x}}` template
+ /// bound from the request; or a `{{user.x}}` claim of the verified
+ /// end-user token (only on a `user_token` API). A clause whose
+ /// template is absent from the request is skipped. The field
+ /// `user_identity` is the person a document belongs to, and a
+ /// clause on it must bind `{{user.sub}}`, never a request template:
+ /// a request parameter is whatever the caller sends, so scoping on
+ /// it would let any caller read any user's rows. ///
public sealed partial class HostedApiResolverWhereItemsValue { diff --git a/src/libs/Speechify/Generated/Speechify.Models.HostedApiUsageRoutesItems.Json.g.cs b/src/libs/Speechify/Generated/Speechify.Models.HostedApiUsageRoutesItems.Json.g.cs new file mode 100644 index 00000000..aab2e159 --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.HostedApiUsageRoutesItems.Json.g.cs @@ -0,0 +1,141 @@ +#nullable enable + +namespace Speechify +{ + public sealed partial class HostedApiUsageRoutesItems + { + /// + /// Serializes the current instance to a JSON string using the provided JsonSerializerContext. + /// + public string ToJson( + global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) + { + return global::System.Text.Json.JsonSerializer.Serialize( + this, + this.GetType(), + jsonSerializerContext); + } + + /// + /// Serializes the current instance to a JSON string using the generated default JsonSerializerContext. + /// + public string ToJson() + { + return ToJson(global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Serializes the current instance to a JSON string using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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 string ToJson( + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return ToJson(global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.Serialize( + this, + jsonSerializerOptions); + } + + /// + /// Deserializes a JSON string using the provided JsonSerializerContext. + /// + public static global::Speechify.HostedApiUsageRoutesItems? FromJson( + string json, + global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) + { + return global::System.Text.Json.JsonSerializer.Deserialize( + json, + typeof(global::Speechify.HostedApiUsageRoutesItems), + jsonSerializerContext) as global::Speechify.HostedApiUsageRoutesItems; + } + + /// + /// Deserializes a JSON string using the generated default JsonSerializerContext. + /// + public static global::Speechify.HostedApiUsageRoutesItems? FromJson( + string json) + { + return FromJson( + json, + global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Deserializes a JSON string using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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::Speechify.HostedApiUsageRoutesItems? FromJson( + string json, + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return FromJson( + json, + global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.Deserialize( + json, + jsonSerializerOptions); + } + + /// + /// Deserializes a JSON stream using the provided JsonSerializerContext. + /// + 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::Speechify.HostedApiUsageRoutesItems), + jsonSerializerContext).ConfigureAwait(false)) as global::Speechify.HostedApiUsageRoutesItems; + } + + /// + /// Deserializes a JSON stream using the generated default JsonSerializerContext. + /// + public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( + global::System.IO.Stream jsonStream) + { + return FromJsonStreamAsync( + jsonStream, + global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Deserializes a JSON stream using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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( + global::System.IO.Stream jsonStream, + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return FromJsonStreamAsync( + jsonStream, + global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.DeserializeAsync( + jsonStream, + jsonSerializerOptions); + } + } +} diff --git a/src/libs/Speechify/Generated/Speechify.Models.HostedApiUsageRoutesItems.g.cs b/src/libs/Speechify/Generated/Speechify.Models.HostedApiUsageRoutesItems.g.cs new file mode 100644 index 00000000..b86239ee --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.HostedApiUsageRoutesItems.g.cs @@ -0,0 +1,55 @@ + +#nullable enable + +namespace Speechify +{ + /// + /// + /// + public sealed partial class HostedApiUsageRoutesItems + { + /// + /// + /// + [global::System.Text.Json.Serialization.JsonPropertyName("route_id")] + [global::System.Text.Json.Serialization.JsonRequired] + public required string RouteId { get; set; } + + /// + /// + /// + [global::System.Text.Json.Serialization.JsonPropertyName("reads")] + [global::System.Text.Json.Serialization.JsonRequired] + public required long Reads { get; set; } + + /// + /// Additional properties that are not explicitly defined in the schema + /// + [global::System.Text.Json.Serialization.JsonExtensionData] + public global::System.Collections.Generic.IDictionary AdditionalProperties { get; set; } = new global::System.Collections.Generic.Dictionary(); + + /// + /// Initializes a new instance of the class. + /// + /// + /// +#if NET7_0_OR_GREATER + [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] +#endif + public HostedApiUsageRoutesItems( + string routeId, + long reads) + { + this.RouteId = routeId ?? throw new global::System.ArgumentNullException(nameof(routeId)); + this.Reads = reads; + } + + /// + /// Initializes a new instance of the class. + /// + public HostedApiUsageRoutesItems() + { + } + + } +} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.Models.Message.g.cs b/src/libs/Speechify/Generated/Speechify.Models.Message.g.cs index 689f8457..21802ec6 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.Message.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.Message.g.cs @@ -41,6 +41,20 @@ public sealed partial class Message [global::System.Text.Json.Serialization.JsonRequired] public required string Content { get; set; } + /// + /// Who spoke this turn, in the same vocabulary as the conversation's
+ /// `caller_identity`. Set on a `user` turn whose channel named a
+ /// person, and it is the ONLY record of who said what in a shared
+ /// channel thread - a room has no single caller, so the conversation
+ /// carries none. A channel-native id is namespaced by its provider
+ /// (`slack:<team>:<user>`).
+ /// Always present, and explicitly `null` where nobody was named -
+ /// including on the agent's own turns, and on a turn whose speaker was
+ /// later erased at their own request. + ///
+ [global::System.Text.Json.Serialization.JsonPropertyName("speaker_identity")] + public string? SpeakerIdentity { get; set; } + /// /// /// @@ -94,6 +108,17 @@ public sealed partial class Message /// /// /// + /// + /// Who spoke this turn, in the same vocabulary as the conversation's
+ /// `caller_identity`. Set on a `user` turn whose channel named a
+ /// person, and it is the ONLY record of who said what in a shared
+ /// channel thread - a room has no single caller, so the conversation
+ /// carries none. A channel-native id is namespaced by its provider
+ /// (`slack:<team>:<user>`).
+ /// Always present, and explicitly `null` where nobody was named -
+ /// including on the agent's own turns, and on a turn whose speaker was
+ /// later erased at their own request. + /// /// /// /// @@ -109,6 +134,7 @@ public Message( global::Speechify.MessageRole role, string content, global::System.DateTime startedAt, + string? speakerIdentity, string? toolName, object? toolArgs, object? toolResult, @@ -118,6 +144,7 @@ public Message( this.ConversationId = conversationId ?? throw new global::System.ArgumentNullException(nameof(conversationId)); this.Role = role; this.Content = content ?? throw new global::System.ArgumentNullException(nameof(content)); + this.SpeakerIdentity = speakerIdentity; this.ToolName = toolName; this.ToolArgs = toolArgs; this.ToolResult = toolResult; diff --git a/src/libs/Speechify/Generated/Speechify.Models.PhoneNumber.g.cs b/src/libs/Speechify/Generated/Speechify.Models.PhoneNumber.g.cs index 326ac08b..890bf851 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.PhoneNumber.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.PhoneNumber.g.cs @@ -1,6 +1,4 @@ -#pragma warning disable CS0618 // Type or member is obsolete - #nullable enable namespace Speechify @@ -86,15 +84,6 @@ public sealed partial class PhoneNumber [global::System.Text.Json.Serialization.JsonPropertyName("brain_id")] public string? BrainId { get; set; } - /// - /// **Deprecated. Use `brain_id`.** Returned only by the deprecated
- /// rotate-secret operation on this resource, to carry the brain's
- /// one-time `signing_secret`; omitted everywhere else. - ///
- [global::System.Text.Json.Serialization.JsonPropertyName("relay")] - [global::System.Obsolete("This property marked as deprecated.")] - public global::Speechify.PhoneNumberRelay? Relay { get; set; } - /// /// ISO-3166 alpha-2 country of the number. Present on purchased
/// numbers; may be absent on imported numbers. diff --git a/src/libs/Speechify/Generated/Speechify.Models.PhoneNumberRelay.g.cs b/src/libs/Speechify/Generated/Speechify.Models.PhoneNumberRelay.g.cs deleted file mode 100644 index 144c4f88..00000000 --- a/src/libs/Speechify/Generated/Speechify.Models.PhoneNumberRelay.g.cs +++ /dev/null @@ -1,231 +0,0 @@ - -#nullable enable - -namespace Speechify -{ - /// - /// **Deprecated. Read the number's `brain_id` and fetch the brain at
- /// `/v1/agents/brains/{brain_id}` instead.**
- /// A read-only projection of the brain a number is bound to, kept for one
- /// deprecation cycle. It is returned ONLY by the deprecated
- /// `POST /v1/agents/phone-numbers/{phone_number_id}/rotate-secret`, which
- /// is the one place its `signing_secret` can appear; every other
- /// phone-number response omits it. - ///
- [global::System.Obsolete("This model marked as deprecated.")] - public sealed partial class PhoneNumberRelay - { - /// - /// The HTTPS endpoint receiving this number's events. - /// - [global::System.Text.Json.Serialization.JsonPropertyName("url")] - [global::System.Text.Json.Serialization.JsonRequired] - [global::System.Obsolete("This property marked as deprecated.")] - public required string Url { get; set; } - - /// - /// Voice that speaks the relayed replies. When absent, the platform
- /// default voice is used. - ///
- [global::System.Text.Json.Serialization.JsonPropertyName("voice_id")] - [global::System.Obsolete("This property marked as deprecated.")] - public string? VoiceId { get; set; } - - /// - /// Per-turn deadline in milliseconds for the endpoint to answer a
- /// reply-bearing event. Default 5000. - ///
- [global::System.Text.Json.Serialization.JsonPropertyName("reply_timeout_ms")] - [global::System.Text.Json.Serialization.JsonRequired] - [global::System.Obsolete("This property marked as deprecated.")] - public required int ReplyTimeoutMs { get; set; } - - /// - /// Line spoken to cover a slow or failing endpoint while the
- /// delivery is retried (e.g. "One moment please"). - ///
- [global::System.Text.Json.Serialization.JsonPropertyName("fallback_line")] - [global::System.Obsolete("This property marked as deprecated.")] - public string? FallbackLine { get; set; } - - /// - /// Line spoken before hanging up when the endpoint stays
- /// unreachable after the retry. - ///
- [global::System.Text.Json.Serialization.JsonPropertyName("goodbye_line")] - [global::System.Obsolete("This property marked as deprecated.")] - public string? GoodbyeLine { get; set; } - - /// - /// Dated version (`YYYY-MM-DD`) the relay's event payloads are
- /// rendered at. When absent, deliveries follow the workspace's
- /// current version. - ///
- [global::System.Text.Json.Serialization.JsonPropertyName("api_version")] - [global::System.Obsolete("This property marked as deprecated.")] - public string? ApiVersion { get; set; } - - /// - /// Line spoken when the call is picked up, ahead of the webhook's own
- /// `call.started` reply (and after any AI-disclosure line). Omitted
- /// when unset. - ///
- [global::System.Text.Json.Serialization.JsonPropertyName("greeting")] - [global::System.Obsolete("This property marked as deprecated.")] - public string? Greeting { get; set; } - - /// - /// Default cold-transfer destination in E.164, used when a reply asks
- /// to transfer without an explicit target. Omitted when unset. - ///
- [global::System.Text.Json.Serialization.JsonPropertyName("transfer_number")] - [global::System.Obsolete("This property marked as deprecated.")] - public string? TransferNumber { get; set; } - - /// - /// Auto-hangup silence timeout in seconds. Omitted when unset (no
- /// silence hangup). - ///
- [global::System.Text.Json.Serialization.JsonPropertyName("hangup_after_silence_seconds")] - [global::System.Obsolete("This property marked as deprecated.")] - public int? HangupAfterSilenceSeconds { get; set; } - - /// - /// Opt-in AI-disclosure opening line spoken first on `call.started`,
- /// before the webhook greeting. Omitted when off (the default). - ///
- [global::System.Text.Json.Serialization.JsonPropertyName("ai_disclosure")] - [global::System.Obsolete("This property marked as deprecated.")] - public global::Speechify.AIDisclosure? AiDisclosure { get; set; } - - /// - /// HMAC signing secret (`whsec_...`) for verifying the
- /// `Speechify-Signature` header on deliveries. Present ONLY in the
- /// response that FIRST bound the relay and in the rotate-secret
- /// response; store it, it cannot be retrieved later. Editing a relay
- /// setting on an already-bound number never mints a new one, so the
- /// copy you stored keeps verifying - rotate-secret is the only way
- /// to replace it. - ///
- [global::System.Text.Json.Serialization.JsonPropertyName("signing_secret")] - [global::System.Obsolete("This property marked as deprecated.")] - public string? SigningSecret { get; set; } - - /// - /// Read-only endpoint health. `unhealthy` after several consecutive
- /// delivery failures: inbound calls answer with the goodbye line and
- /// SMS events are parked instead of delivered. Resets to `healthy`
- /// on the next successful delivery, on rebinding the relay, or on
- /// rotating the secret. - ///
- [global::System.Text.Json.Serialization.JsonPropertyName("health")] - [global::System.Text.Json.Serialization.JsonConverter(typeof(global::Speechify.JsonConverters.PhoneNumberRelayHealthJsonConverter))] - [global::System.Obsolete("This property marked as deprecated.")] - public global::Speechify.PhoneNumberRelayHealth? Health { get; set; } - - /// - /// Additional properties that are not explicitly defined in the schema - /// - [global::System.Text.Json.Serialization.JsonExtensionData] - public global::System.Collections.Generic.IDictionary AdditionalProperties { get; set; } = new global::System.Collections.Generic.Dictionary(); - - /// - /// Initializes a new instance of the class. - /// - /// - /// The HTTPS endpoint receiving this number's events. - /// - /// - /// Per-turn deadline in milliseconds for the endpoint to answer a
- /// reply-bearing event. Default 5000. - /// - /// - /// Voice that speaks the relayed replies. When absent, the platform
- /// default voice is used. - /// - /// - /// Line spoken to cover a slow or failing endpoint while the
- /// delivery is retried (e.g. "One moment please"). - /// - /// - /// Line spoken before hanging up when the endpoint stays
- /// unreachable after the retry. - /// - /// - /// Dated version (`YYYY-MM-DD`) the relay's event payloads are
- /// rendered at. When absent, deliveries follow the workspace's
- /// current version. - /// - /// - /// Line spoken when the call is picked up, ahead of the webhook's own
- /// `call.started` reply (and after any AI-disclosure line). Omitted
- /// when unset. - /// - /// - /// Default cold-transfer destination in E.164, used when a reply asks
- /// to transfer without an explicit target. Omitted when unset. - /// - /// - /// Auto-hangup silence timeout in seconds. Omitted when unset (no
- /// silence hangup). - /// - /// - /// Opt-in AI-disclosure opening line spoken first on `call.started`,
- /// before the webhook greeting. Omitted when off (the default). - /// - /// - /// HMAC signing secret (`whsec_...`) for verifying the
- /// `Speechify-Signature` header on deliveries. Present ONLY in the
- /// response that FIRST bound the relay and in the rotate-secret
- /// response; store it, it cannot be retrieved later. Editing a relay
- /// setting on an already-bound number never mints a new one, so the
- /// copy you stored keeps verifying - rotate-secret is the only way
- /// to replace it. - /// - /// - /// Read-only endpoint health. `unhealthy` after several consecutive
- /// delivery failures: inbound calls answer with the goodbye line and
- /// SMS events are parked instead of delivered. Resets to `healthy`
- /// on the next successful delivery, on rebinding the relay, or on
- /// rotating the secret. - /// -#if NET7_0_OR_GREATER - [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] -#endif - public PhoneNumberRelay( - string url, - int replyTimeoutMs, - string? voiceId, - string? fallbackLine, - string? goodbyeLine, - string? apiVersion, - string? greeting, - string? transferNumber, - int? hangupAfterSilenceSeconds, - global::Speechify.AIDisclosure? aiDisclosure, - string? signingSecret, - global::Speechify.PhoneNumberRelayHealth? health) - { - this.Url = url ?? throw new global::System.ArgumentNullException(nameof(url)); - this.VoiceId = voiceId; - this.ReplyTimeoutMs = replyTimeoutMs; - this.FallbackLine = fallbackLine; - this.GoodbyeLine = goodbyeLine; - this.ApiVersion = apiVersion; - this.Greeting = greeting; - this.TransferNumber = transferNumber; - this.HangupAfterSilenceSeconds = hangupAfterSilenceSeconds; - this.AiDisclosure = aiDisclosure; - this.SigningSecret = signingSecret; - this.Health = health; - } - - /// - /// Initializes a new instance of the class. - /// - public PhoneNumberRelay() - { - } - - } -} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.Models.PhoneNumberRelayHealth.g.cs b/src/libs/Speechify/Generated/Speechify.Models.PhoneNumberRelayHealth.g.cs deleted file mode 100644 index bd8c68dd..00000000 --- a/src/libs/Speechify/Generated/Speechify.Models.PhoneNumberRelayHealth.g.cs +++ /dev/null @@ -1,55 +0,0 @@ - -#nullable enable - -namespace Speechify -{ - /// - /// Read-only endpoint health. `unhealthy` after several consecutive
- /// delivery failures: inbound calls answer with the goodbye line and
- /// SMS events are parked instead of delivered. Resets to `healthy`
- /// on the next successful delivery, on rebinding the relay, or on
- /// rotating the secret. - ///
- public enum PhoneNumberRelayHealth - { - /// - /// - /// - Healthy, - /// - /// - /// - Unhealthy, - } - - /// - /// Enum extensions to do fast conversions without the reflection. - /// - public static class PhoneNumberRelayHealthExtensions - { - /// - /// Converts an enum to a string. - /// - public static string ToValueString(this PhoneNumberRelayHealth value) - { - return value switch - { - PhoneNumberRelayHealth.Healthy => "healthy", - PhoneNumberRelayHealth.Unhealthy => "unhealthy", - _ => throw new global::System.ArgumentOutOfRangeException(nameof(value), value, null), - }; - } - /// - /// Converts an string to a enum. - /// - public static PhoneNumberRelayHealth? ToEnum(string value) - { - return value switch - { - "healthy" => PhoneNumberRelayHealth.Healthy, - "unhealthy" => PhoneNumberRelayHealth.Unhealthy, - _ => null, - }; - } - } -} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateGroup.Json.g.cs b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateGroup.Json.g.cs new file mode 100644 index 00000000..e69e8be2 --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateGroup.Json.g.cs @@ -0,0 +1,141 @@ +#nullable enable + +namespace Speechify +{ + public sealed partial class StoreAggregateGroup + { + /// + /// Serializes the current instance to a JSON string using the provided JsonSerializerContext. + /// + public string ToJson( + global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) + { + return global::System.Text.Json.JsonSerializer.Serialize( + this, + this.GetType(), + jsonSerializerContext); + } + + /// + /// Serializes the current instance to a JSON string using the generated default JsonSerializerContext. + /// + public string ToJson() + { + return ToJson(global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Serializes the current instance to a JSON string using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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 string ToJson( + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return ToJson(global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.Serialize( + this, + jsonSerializerOptions); + } + + /// + /// Deserializes a JSON string using the provided JsonSerializerContext. + /// + public static global::Speechify.StoreAggregateGroup? FromJson( + string json, + global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) + { + return global::System.Text.Json.JsonSerializer.Deserialize( + json, + typeof(global::Speechify.StoreAggregateGroup), + jsonSerializerContext) as global::Speechify.StoreAggregateGroup; + } + + /// + /// Deserializes a JSON string using the generated default JsonSerializerContext. + /// + public static global::Speechify.StoreAggregateGroup? FromJson( + string json) + { + return FromJson( + json, + global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Deserializes a JSON string using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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::Speechify.StoreAggregateGroup? FromJson( + string json, + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return FromJson( + json, + global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.Deserialize( + json, + jsonSerializerOptions); + } + + /// + /// Deserializes a JSON stream using the provided JsonSerializerContext. + /// + 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::Speechify.StoreAggregateGroup), + jsonSerializerContext).ConfigureAwait(false)) as global::Speechify.StoreAggregateGroup; + } + + /// + /// Deserializes a JSON stream using the generated default JsonSerializerContext. + /// + public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( + global::System.IO.Stream jsonStream) + { + return FromJsonStreamAsync( + jsonStream, + global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Deserializes a JSON stream using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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( + global::System.IO.Stream jsonStream, + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return FromJsonStreamAsync( + jsonStream, + global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.DeserializeAsync( + jsonStream, + jsonSerializerOptions); + } + } +} diff --git a/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateGroup.g.cs b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateGroup.g.cs new file mode 100644 index 00000000..7132d72d --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateGroup.g.cs @@ -0,0 +1,58 @@ + +#nullable enable + +namespace Speechify +{ + /// + /// + /// + public sealed partial class StoreAggregateGroup + { + /// + /// The `group_by` value; absent when nothing was grouped. + /// + [global::System.Text.Json.Serialization.JsonPropertyName("key")] + public object? Key { get; set; } + + /// + /// The metrics by their keys; null where no document contributed. + /// + [global::System.Text.Json.Serialization.JsonPropertyName("values")] + [global::System.Text.Json.Serialization.JsonRequired] + public required global::System.Collections.Generic.Dictionary Values { get; set; } + + /// + /// Additional properties that are not explicitly defined in the schema + /// + [global::System.Text.Json.Serialization.JsonExtensionData] + public global::System.Collections.Generic.IDictionary AdditionalProperties { get; set; } = new global::System.Collections.Generic.Dictionary(); + + /// + /// Initializes a new instance of the class. + /// + /// + /// The metrics by their keys; null where no document contributed. + /// + /// + /// The `group_by` value; absent when nothing was grouped. + /// +#if NET7_0_OR_GREATER + [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] +#endif + public StoreAggregateGroup( + global::System.Collections.Generic.Dictionary values, + object? key) + { + this.Key = key; + this.Values = values ?? throw new global::System.ArgumentNullException(nameof(values)); + } + + /// + /// Initializes a new instance of the class. + /// + public StoreAggregateGroup() + { + } + + } +} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateGroupKey.Json.g.cs b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateGroupKey.Json.g.cs new file mode 100644 index 00000000..5574b753 --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateGroupKey.Json.g.cs @@ -0,0 +1,141 @@ +#nullable enable + +namespace Speechify +{ + public sealed partial class StoreAggregateGroupKey + { + /// + /// Serializes the current instance to a JSON string using the provided JsonSerializerContext. + /// + public string ToJson( + global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) + { + return global::System.Text.Json.JsonSerializer.Serialize( + this, + this.GetType(), + jsonSerializerContext); + } + + /// + /// Serializes the current instance to a JSON string using the generated default JsonSerializerContext. + /// + public string ToJson() + { + return ToJson(global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Serializes the current instance to a JSON string using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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 string ToJson( + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return ToJson(global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.Serialize( + this, + jsonSerializerOptions); + } + + /// + /// Deserializes a JSON string using the provided JsonSerializerContext. + /// + public static global::Speechify.StoreAggregateGroupKey? FromJson( + string json, + global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) + { + return global::System.Text.Json.JsonSerializer.Deserialize( + json, + typeof(global::Speechify.StoreAggregateGroupKey), + jsonSerializerContext) as global::Speechify.StoreAggregateGroupKey; + } + + /// + /// Deserializes a JSON string using the generated default JsonSerializerContext. + /// + public static global::Speechify.StoreAggregateGroupKey? FromJson( + string json) + { + return FromJson( + json, + global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Deserializes a JSON string using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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::Speechify.StoreAggregateGroupKey? FromJson( + string json, + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return FromJson( + json, + global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.Deserialize( + json, + jsonSerializerOptions); + } + + /// + /// Deserializes a JSON stream using the provided JsonSerializerContext. + /// + 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::Speechify.StoreAggregateGroupKey), + jsonSerializerContext).ConfigureAwait(false)) as global::Speechify.StoreAggregateGroupKey; + } + + /// + /// Deserializes a JSON stream using the generated default JsonSerializerContext. + /// + public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( + global::System.IO.Stream jsonStream) + { + return FromJsonStreamAsync( + jsonStream, + global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Deserializes a JSON stream using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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( + global::System.IO.Stream jsonStream, + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return FromJsonStreamAsync( + jsonStream, + global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.DeserializeAsync( + jsonStream, + jsonSerializerOptions); + } + } +} diff --git a/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateGroupKey.g.cs b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateGroupKey.g.cs new file mode 100644 index 00000000..6984524c --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateGroupKey.g.cs @@ -0,0 +1,19 @@ + +#nullable enable + +namespace Speechify +{ + /// + /// The `group_by` value; absent when nothing was grouped. + /// + public sealed partial class StoreAggregateGroupKey + { + + /// + /// Additional properties that are not explicitly defined in the schema + /// + [global::System.Text.Json.Serialization.JsonExtensionData] + public global::System.Collections.Generic.IDictionary AdditionalProperties { get; set; } = new global::System.Collections.Generic.Dictionary(); + + } +} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateGroupValues.Json.g.cs b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateGroupValues.Json.g.cs new file mode 100644 index 00000000..55327cdf --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateGroupValues.Json.g.cs @@ -0,0 +1,141 @@ +#nullable enable + +namespace Speechify +{ + public sealed partial class StoreAggregateGroupValues + { + /// + /// Serializes the current instance to a JSON string using the provided JsonSerializerContext. + /// + public string ToJson( + global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) + { + return global::System.Text.Json.JsonSerializer.Serialize( + this, + this.GetType(), + jsonSerializerContext); + } + + /// + /// Serializes the current instance to a JSON string using the generated default JsonSerializerContext. + /// + public string ToJson() + { + return ToJson(global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Serializes the current instance to a JSON string using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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 string ToJson( + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return ToJson(global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.Serialize( + this, + jsonSerializerOptions); + } + + /// + /// Deserializes a JSON string using the provided JsonSerializerContext. + /// + public static global::Speechify.StoreAggregateGroupValues? FromJson( + string json, + global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) + { + return global::System.Text.Json.JsonSerializer.Deserialize( + json, + typeof(global::Speechify.StoreAggregateGroupValues), + jsonSerializerContext) as global::Speechify.StoreAggregateGroupValues; + } + + /// + /// Deserializes a JSON string using the generated default JsonSerializerContext. + /// + public static global::Speechify.StoreAggregateGroupValues? FromJson( + string json) + { + return FromJson( + json, + global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Deserializes a JSON string using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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::Speechify.StoreAggregateGroupValues? FromJson( + string json, + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return FromJson( + json, + global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.Deserialize( + json, + jsonSerializerOptions); + } + + /// + /// Deserializes a JSON stream using the provided JsonSerializerContext. + /// + 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::Speechify.StoreAggregateGroupValues), + jsonSerializerContext).ConfigureAwait(false)) as global::Speechify.StoreAggregateGroupValues; + } + + /// + /// Deserializes a JSON stream using the generated default JsonSerializerContext. + /// + public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( + global::System.IO.Stream jsonStream) + { + return FromJsonStreamAsync( + jsonStream, + global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Deserializes a JSON stream using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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( + global::System.IO.Stream jsonStream, + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return FromJsonStreamAsync( + jsonStream, + global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.DeserializeAsync( + jsonStream, + jsonSerializerOptions); + } + } +} diff --git a/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateGroupValues.g.cs b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateGroupValues.g.cs new file mode 100644 index 00000000..b534a00e --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateGroupValues.g.cs @@ -0,0 +1,19 @@ + +#nullable enable + +namespace Speechify +{ + /// + /// The metrics by their keys; null where no document contributed. + /// + public sealed partial class StoreAggregateGroupValues + { + + /// + /// Additional properties that are not explicitly defined in the schema + /// + [global::System.Text.Json.Serialization.JsonExtensionData] + public global::System.Collections.Generic.IDictionary AdditionalProperties { get; set; } = new global::System.Collections.Generic.Dictionary(); + + } +} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateMetric.Json.g.cs b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateMetric.Json.g.cs new file mode 100644 index 00000000..84c817da --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateMetric.Json.g.cs @@ -0,0 +1,141 @@ +#nullable enable + +namespace Speechify +{ + public sealed partial class StoreAggregateMetric + { + /// + /// Serializes the current instance to a JSON string using the provided JsonSerializerContext. + /// + public string ToJson( + global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) + { + return global::System.Text.Json.JsonSerializer.Serialize( + this, + this.GetType(), + jsonSerializerContext); + } + + /// + /// Serializes the current instance to a JSON string using the generated default JsonSerializerContext. + /// + public string ToJson() + { + return ToJson(global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Serializes the current instance to a JSON string using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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 string ToJson( + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return ToJson(global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.Serialize( + this, + jsonSerializerOptions); + } + + /// + /// Deserializes a JSON string using the provided JsonSerializerContext. + /// + public static global::Speechify.StoreAggregateMetric? FromJson( + string json, + global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) + { + return global::System.Text.Json.JsonSerializer.Deserialize( + json, + typeof(global::Speechify.StoreAggregateMetric), + jsonSerializerContext) as global::Speechify.StoreAggregateMetric; + } + + /// + /// Deserializes a JSON string using the generated default JsonSerializerContext. + /// + public static global::Speechify.StoreAggregateMetric? FromJson( + string json) + { + return FromJson( + json, + global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Deserializes a JSON string using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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::Speechify.StoreAggregateMetric? FromJson( + string json, + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return FromJson( + json, + global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.Deserialize( + json, + jsonSerializerOptions); + } + + /// + /// Deserializes a JSON stream using the provided JsonSerializerContext. + /// + 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::Speechify.StoreAggregateMetric), + jsonSerializerContext).ConfigureAwait(false)) as global::Speechify.StoreAggregateMetric; + } + + /// + /// Deserializes a JSON stream using the generated default JsonSerializerContext. + /// + public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( + global::System.IO.Stream jsonStream) + { + return FromJsonStreamAsync( + jsonStream, + global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Deserializes a JSON stream using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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( + global::System.IO.Stream jsonStream, + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return FromJsonStreamAsync( + jsonStream, + global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.DeserializeAsync( + jsonStream, + jsonSerializerOptions); + } + } +} diff --git a/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateMetric.g.cs b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateMetric.g.cs new file mode 100644 index 00000000..9be27e2f --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateMetric.g.cs @@ -0,0 +1,68 @@ + +#nullable enable + +namespace Speechify +{ + /// + /// + /// + public sealed partial class StoreAggregateMetric + { + /// + /// + /// + [global::System.Text.Json.Serialization.JsonPropertyName("op")] + [global::System.Text.Json.Serialization.JsonConverter(typeof(global::Speechify.JsonConverters.StoreAggregateMetricOpJsonConverter))] + [global::System.Text.Json.Serialization.JsonRequired] + public required global::Speechify.StoreAggregateMetricOp Op { get; set; } + + /// + /// The projected numeric field to reduce; `count` takes none. A document whose field is absent or not a number is left out of that metric. + /// + [global::System.Text.Json.Serialization.JsonPropertyName("field")] + public string? Field { get; set; } + + /// + /// The key the metric answers under; `op` or `op_field` when omitted. + /// + [global::System.Text.Json.Serialization.JsonPropertyName("as")] + public string? As { get; set; } + + /// + /// Additional properties that are not explicitly defined in the schema + /// + [global::System.Text.Json.Serialization.JsonExtensionData] + public global::System.Collections.Generic.IDictionary AdditionalProperties { get; set; } = new global::System.Collections.Generic.Dictionary(); + + /// + /// Initializes a new instance of the class. + /// + /// + /// + /// The projected numeric field to reduce; `count` takes none. A document whose field is absent or not a number is left out of that metric. + /// + /// + /// The key the metric answers under; `op` or `op_field` when omitted. + /// +#if NET7_0_OR_GREATER + [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] +#endif + public StoreAggregateMetric( + global::Speechify.StoreAggregateMetricOp op, + string? field, + string? @as) + { + this.Op = op; + this.Field = field; + this.As = @as; + } + + /// + /// Initializes a new instance of the class. + /// + public StoreAggregateMetric() + { + } + + } +} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateMetricOp.g.cs b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateMetricOp.g.cs new file mode 100644 index 00000000..7178252e --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateMetricOp.g.cs @@ -0,0 +1,69 @@ + +#nullable enable + +namespace Speechify +{ + /// + /// + /// + public enum StoreAggregateMetricOp + { + /// + /// + /// + Avg, + /// + /// + /// + Count, + /// + /// + /// + Max, + /// + /// + /// + Min, + /// + /// + /// + Sum, + } + + /// + /// Enum extensions to do fast conversions without the reflection. + /// + public static class StoreAggregateMetricOpExtensions + { + /// + /// Converts an enum to a string. + /// + public static string ToValueString(this StoreAggregateMetricOp value) + { + return value switch + { + StoreAggregateMetricOp.Avg => "avg", + StoreAggregateMetricOp.Count => "count", + StoreAggregateMetricOp.Max => "max", + StoreAggregateMetricOp.Min => "min", + StoreAggregateMetricOp.Sum => "sum", + _ => throw new global::System.ArgumentOutOfRangeException(nameof(value), value, null), + }; + } + /// + /// Converts an string to a enum. + /// + public static StoreAggregateMetricOp? ToEnum(string value) + { + return value switch + { + "avg" => StoreAggregateMetricOp.Avg, + "count" => StoreAggregateMetricOp.Count, + "max" => StoreAggregateMetricOp.Max, + "min" => StoreAggregateMetricOp.Min, + "sum" => StoreAggregateMetricOp.Sum, + _ => null, + }; + } + } +} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateQuery.Json.g.cs b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateQuery.Json.g.cs new file mode 100644 index 00000000..6d6073a9 --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateQuery.Json.g.cs @@ -0,0 +1,141 @@ +#nullable enable + +namespace Speechify +{ + public sealed partial class StoreAggregateQuery + { + /// + /// Serializes the current instance to a JSON string using the provided JsonSerializerContext. + /// + public string ToJson( + global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) + { + return global::System.Text.Json.JsonSerializer.Serialize( + this, + this.GetType(), + jsonSerializerContext); + } + + /// + /// Serializes the current instance to a JSON string using the generated default JsonSerializerContext. + /// + public string ToJson() + { + return ToJson(global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Serializes the current instance to a JSON string using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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 string ToJson( + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return ToJson(global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.Serialize( + this, + jsonSerializerOptions); + } + + /// + /// Deserializes a JSON string using the provided JsonSerializerContext. + /// + public static global::Speechify.StoreAggregateQuery? FromJson( + string json, + global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) + { + return global::System.Text.Json.JsonSerializer.Deserialize( + json, + typeof(global::Speechify.StoreAggregateQuery), + jsonSerializerContext) as global::Speechify.StoreAggregateQuery; + } + + /// + /// Deserializes a JSON string using the generated default JsonSerializerContext. + /// + public static global::Speechify.StoreAggregateQuery? FromJson( + string json) + { + return FromJson( + json, + global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Deserializes a JSON string using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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::Speechify.StoreAggregateQuery? FromJson( + string json, + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return FromJson( + json, + global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.Deserialize( + json, + jsonSerializerOptions); + } + + /// + /// Deserializes a JSON stream using the provided JsonSerializerContext. + /// + 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::Speechify.StoreAggregateQuery), + jsonSerializerContext).ConfigureAwait(false)) as global::Speechify.StoreAggregateQuery; + } + + /// + /// Deserializes a JSON stream using the generated default JsonSerializerContext. + /// + public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( + global::System.IO.Stream jsonStream) + { + return FromJsonStreamAsync( + jsonStream, + global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Deserializes a JSON stream using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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( + global::System.IO.Stream jsonStream, + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return FromJsonStreamAsync( + jsonStream, + global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.DeserializeAsync( + jsonStream, + jsonSerializerOptions); + } + } +} diff --git a/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateQuery.g.cs b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateQuery.g.cs new file mode 100644 index 00000000..5703bd8e --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateQuery.g.cs @@ -0,0 +1,67 @@ + +#nullable enable + +namespace Speechify +{ + /// + /// + /// + public sealed partial class StoreAggregateQuery + { + /// + /// Filters, ANDed, the same ones a query takes. + /// + [global::System.Text.Json.Serialization.JsonPropertyName("where")] + public global::System.Collections.Generic.IList? Where { get; set; } + + /// + /// One projected field to group by. A string that reaches the index's 256-byte limit may have been cut there, and the answer says so. + /// + [global::System.Text.Json.Serialization.JsonPropertyName("group_by")] + public string? GroupBy { get; set; } + + /// + /// + /// + [global::System.Text.Json.Serialization.JsonPropertyName("metrics")] + [global::System.Text.Json.Serialization.JsonRequired] + public required global::System.Collections.Generic.IList Metrics { get; set; } + + /// + /// Additional properties that are not explicitly defined in the schema + /// + [global::System.Text.Json.Serialization.JsonExtensionData] + public global::System.Collections.Generic.IDictionary AdditionalProperties { get; set; } = new global::System.Collections.Generic.Dictionary(); + + /// + /// Initializes a new instance of the class. + /// + /// + /// + /// Filters, ANDed, the same ones a query takes. + /// + /// + /// One projected field to group by. A string that reaches the index's 256-byte limit may have been cut there, and the answer says so. + /// +#if NET7_0_OR_GREATER + [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] +#endif + public StoreAggregateQuery( + global::System.Collections.Generic.IList metrics, + global::System.Collections.Generic.IList? where, + string? groupBy) + { + this.Where = where; + this.GroupBy = groupBy; + this.Metrics = metrics ?? throw new global::System.ArgumentNullException(nameof(metrics)); + } + + /// + /// Initializes a new instance of the class. + /// + public StoreAggregateQuery() + { + } + + } +} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateResponse.Json.g.cs b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateResponse.Json.g.cs new file mode 100644 index 00000000..734a9273 --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateResponse.Json.g.cs @@ -0,0 +1,141 @@ +#nullable enable + +namespace Speechify +{ + public sealed partial class StoreAggregateResponse + { + /// + /// Serializes the current instance to a JSON string using the provided JsonSerializerContext. + /// + public string ToJson( + global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) + { + return global::System.Text.Json.JsonSerializer.Serialize( + this, + this.GetType(), + jsonSerializerContext); + } + + /// + /// Serializes the current instance to a JSON string using the generated default JsonSerializerContext. + /// + public string ToJson() + { + return ToJson(global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Serializes the current instance to a JSON string using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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 string ToJson( + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return ToJson(global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.Serialize( + this, + jsonSerializerOptions); + } + + /// + /// Deserializes a JSON string using the provided JsonSerializerContext. + /// + public static global::Speechify.StoreAggregateResponse? FromJson( + string json, + global::System.Text.Json.Serialization.JsonSerializerContext jsonSerializerContext) + { + return global::System.Text.Json.JsonSerializer.Deserialize( + json, + typeof(global::Speechify.StoreAggregateResponse), + jsonSerializerContext) as global::Speechify.StoreAggregateResponse; + } + + /// + /// Deserializes a JSON string using the generated default JsonSerializerContext. + /// + public static global::Speechify.StoreAggregateResponse? FromJson( + string json) + { + return FromJson( + json, + global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Deserializes a JSON string using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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::Speechify.StoreAggregateResponse? FromJson( + string json, + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return FromJson( + json, + global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.Deserialize( + json, + jsonSerializerOptions); + } + + /// + /// Deserializes a JSON stream using the provided JsonSerializerContext. + /// + 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::Speechify.StoreAggregateResponse), + jsonSerializerContext).ConfigureAwait(false)) as global::Speechify.StoreAggregateResponse; + } + + /// + /// Deserializes a JSON stream using the generated default JsonSerializerContext. + /// + public static global::System.Threading.Tasks.ValueTask FromJsonStreamAsync( + global::System.IO.Stream jsonStream) + { + return FromJsonStreamAsync( + jsonStream, + global::Speechify.SourceGenerationContext.Default); + } + + /// + /// Deserializes a JSON stream using the provided JsonSerializerOptions. + /// +#if NET8_0_OR_GREATER + [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( + global::System.IO.Stream jsonStream, + global::System.Text.Json.JsonSerializerOptions? jsonSerializerOptions = null) + { + if (jsonSerializerOptions is null) + { + return FromJsonStreamAsync( + jsonStream, + global::Speechify.SourceGenerationContext.Default); + } + + return global::System.Text.Json.JsonSerializer.DeserializeAsync( + jsonStream, + jsonSerializerOptions); + } + } +} diff --git a/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateResponse.g.cs b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateResponse.g.cs new file mode 100644 index 00000000..fffaa392 --- /dev/null +++ b/src/libs/Speechify/Generated/Speechify.Models.StoreAggregateResponse.g.cs @@ -0,0 +1,71 @@ + +#nullable enable + +namespace Speechify +{ + /// + /// + /// + public sealed partial class StoreAggregateResponse + { + /// + /// One entry per group, largest count first; exactly one without `group_by`. + /// + [global::System.Text.Json.Serialization.JsonPropertyName("groups")] + [global::System.Text.Json.Serialization.JsonRequired] + public required global::System.Collections.Generic.IList Groups { get; set; } + + /// + /// More than 100 groups existed; the largest are here. + /// + [global::System.Text.Json.Serialization.JsonPropertyName("groups_truncated")] + [global::System.Text.Json.Serialization.JsonRequired] + public required bool GroupsTruncated { get; set; } + + /// + /// At least one group key is a string that reached the index's 256-byte limit and may have been cut there, so groups may have merged on a prefix. + /// + [global::System.Text.Json.Serialization.JsonPropertyName("key_truncated")] + [global::System.Text.Json.Serialization.JsonRequired] + public required bool KeyTruncated { get; set; } + + /// + /// Additional properties that are not explicitly defined in the schema + /// + [global::System.Text.Json.Serialization.JsonExtensionData] + public global::System.Collections.Generic.IDictionary AdditionalProperties { get; set; } = new global::System.Collections.Generic.Dictionary(); + + /// + /// Initializes a new instance of the class. + /// + /// + /// One entry per group, largest count first; exactly one without `group_by`. + /// + /// + /// More than 100 groups existed; the largest are here. + /// + /// + /// At least one group key is a string that reached the index's 256-byte limit and may have been cut there, so groups may have merged on a prefix. + /// +#if NET7_0_OR_GREATER + [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] +#endif + public StoreAggregateResponse( + global::System.Collections.Generic.IList groups, + bool groupsTruncated, + bool keyTruncated) + { + this.Groups = groups ?? throw new global::System.ArgumentNullException(nameof(groups)); + this.GroupsTruncated = groupsTruncated; + this.KeyTruncated = keyTruncated; + } + + /// + /// Initializes a new instance of the class. + /// + public StoreAggregateResponse() + { + } + + } +} \ No newline at end of file diff --git a/src/libs/Speechify/Generated/Speechify.Models.StoreBatchWrite.g.cs b/src/libs/Speechify/Generated/Speechify.Models.StoreBatchWrite.g.cs index 04ee0a20..0c3b2214 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.StoreBatchWrite.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.StoreBatchWrite.g.cs @@ -17,7 +17,7 @@ public sealed partial class StoreBatchWrite public required global::Speechify.StoreBatchWriteOp Op { get; set; } /// - /// The document id; minted for a `set` without one. `query` and `batch` are reserved. + /// The document id; minted for a `set` without one. `query`, `aggregate` and `batch` are reserved. /// [global::System.Text.Json.Serialization.JsonPropertyName("id")] public string? Id { get; set; } @@ -39,7 +39,7 @@ public sealed partial class StoreBatchWrite ///
/// /// - /// The document id; minted for a `set` without one. `query` and `batch` are reserved. + /// The document id; minted for a `set` without one. `query`, `aggregate` and `batch` are reserved. /// /// #if NET7_0_OR_GREATER diff --git a/src/libs/Speechify/Generated/Speechify.Models.StoreDocument.g.cs b/src/libs/Speechify/Generated/Speechify.Models.StoreDocument.g.cs index de1729cb..81cf9405 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.StoreDocument.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.StoreDocument.g.cs @@ -23,12 +23,24 @@ public sealed partial class StoreDocument public required string Collection { get; set; } /// - /// Incremented on every write to this id. + /// Incremented on every write to this id. It counts writes to a live
+ /// document and starts again at 1 if the id is deleted and written
+ /// again, so use `revision`, not this, to write conditionally. ///
[global::System.Text.Json.Serialization.JsonPropertyName("version")] [global::System.Text.Json.Serialization.JsonRequired] public required int Version { get; set; } + /// + /// Names this exact version of the document and never repeats - not
+ /// for a later write, and not for a document deleted and written again
+ /// at the same id. Send it in `If-Match` (quoted, as the `ETag` of a
+ /// read returns it) to write only if nothing has changed since. + ///
+ [global::System.Text.Json.Serialization.JsonPropertyName("revision")] + [global::System.Text.Json.Serialization.JsonRequired] + public required string Revision { get; set; } + /// /// /// @@ -74,7 +86,15 @@ public sealed partial class StoreDocument /// /// /// - /// Incremented on every write to this id. + /// Incremented on every write to this id. It counts writes to a live
+ /// document and starts again at 1 if the id is deleted and written
+ /// again, so use `revision`, not this, to write conditionally. + /// + /// + /// Names this exact version of the document and never repeats - not
+ /// for a later write, and not for a document deleted and written again
+ /// at the same id. Send it in `If-Match` (quoted, as the `ETag` of a
+ /// read returns it) to write only if nothing has changed since. /// /// /// @@ -92,6 +112,7 @@ public StoreDocument( string id, string collection, int version, + string revision, long sizeBytes, global::System.DateTime createdAt, global::System.DateTime updatedAt, @@ -101,6 +122,7 @@ public StoreDocument( this.Id = id ?? throw new global::System.ArgumentNullException(nameof(id)); this.Collection = collection ?? throw new global::System.ArgumentNullException(nameof(collection)); this.Version = version; + this.Revision = revision ?? throw new global::System.ArgumentNullException(nameof(revision)); this.SizeBytes = sizeBytes; this.Source = source; this.CreatedAt = createdAt; diff --git a/src/libs/Speechify/Generated/Speechify.Models.UpdateHostedAPIRequest.g.cs b/src/libs/Speechify/Generated/Speechify.Models.UpdateHostedAPIRequest.g.cs index 00fb3579..255ade33 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.UpdateHostedAPIRequest.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.UpdateHostedAPIRequest.g.cs @@ -45,6 +45,18 @@ public sealed partial class UpdateHostedAPIRequest [global::System.Text.Json.Serialization.JsonPropertyName("daily_run_cap")] public int? DailyRunCap { get; set; } + /// + /// + /// + [global::System.Text.Json.Serialization.JsonPropertyName("daily_read_cap")] + public int? DailyReadCap { get; set; } + + /// + /// Replace the registered key set; an empty string removes it, after which the signing secret verifies tokens again. + /// + [global::System.Text.Json.Serialization.JsonPropertyName("user_token_jwks_url")] + public string? UserTokenJwksUrl { get; set; } + /// /// Additional properties that are not explicitly defined in the schema /// @@ -62,6 +74,10 @@ public sealed partial class UpdateHostedAPIRequest /// A paused API answers 503 to every consumer request. /// /// + /// + /// + /// Replace the registered key set; an empty string removes it, after which the signing secret verifies tokens again. + /// #if NET7_0_OR_GREATER [global::System.Diagnostics.CodeAnalysis.SetsRequiredMembers] #endif @@ -71,7 +87,9 @@ public UpdateHostedAPIRequest( global::Speechify.UpdateHostedApiRequestAuthMode? authMode, global::System.Collections.Generic.IList? corsOrigins, bool? enabled, - int? dailyRunCap) + int? dailyRunCap, + int? dailyReadCap, + string? userTokenJwksUrl) { this.Name = name; this.Description = description; @@ -79,6 +97,8 @@ public UpdateHostedAPIRequest( this.CorsOrigins = corsOrigins; this.Enabled = enabled; this.DailyRunCap = dailyRunCap; + this.DailyReadCap = dailyReadCap; + this.UserTokenJwksUrl = userTokenJwksUrl; } /// diff --git a/src/libs/Speechify/Generated/Speechify.Models.UpdateHostedAPIRouteRequest.g.cs b/src/libs/Speechify/Generated/Speechify.Models.UpdateHostedAPIRouteRequest.g.cs index e7b89b6f..90f7dadc 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.UpdateHostedAPIRouteRequest.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.UpdateHostedAPIRouteRequest.g.cs @@ -37,9 +37,13 @@ public sealed partial class UpdateHostedAPIRouteRequest /// What answers a route. `type` selects the fields that apply:
/// `store_query` (store_id, collection, where, order_by, limit),
/// `store_document` (store_id, collection, document_id),
+ /// `store_aggregate` (store_id, collection, where, group_by, metrics:
+ /// a summary in one request, from the same implementation as the
+ /// collection's `aggregate` operation),
/// `run_latest` (trigger_id of a schedule trigger),
/// `run` (trigger_id of a webhook trigger, wait_seconds),
- /// `file` (file_path of a published file). + /// `file` (file_path of one published file; or, on a route whose path
+ /// ends in `*`, file_root and file_index for a whole published tree). ///
[global::System.Text.Json.Serialization.JsonPropertyName("resolver")] public global::Speechify.HostedAPIResolver? Resolver { get; set; } @@ -79,9 +83,13 @@ public sealed partial class UpdateHostedAPIRouteRequest /// What answers a route. `type` selects the fields that apply:
/// `store_query` (store_id, collection, where, order_by, limit),
/// `store_document` (store_id, collection, document_id),
+ /// `store_aggregate` (store_id, collection, where, group_by, metrics:
+ /// a summary in one request, from the same implementation as the
+ /// collection's `aggregate` operation),
/// `run_latest` (trigger_id of a schedule trigger),
/// `run` (trigger_id of a webhook trigger, wait_seconds),
- /// `file` (file_path of a published file). + /// `file` (file_path of one published file; or, on a route whose path
+ /// ends in `*`, file_root and file_index for a whole published tree). /// /// /// diff --git a/src/libs/Speechify/Generated/Speechify.Models.UpdateHostedApiRequestAuthMode.g.cs b/src/libs/Speechify/Generated/Speechify.Models.UpdateHostedApiRequestAuthMode.g.cs index 08235ac5..5972ea62 100644 --- a/src/libs/Speechify/Generated/Speechify.Models.UpdateHostedApiRequestAuthMode.g.cs +++ b/src/libs/Speechify/Generated/Speechify.Models.UpdateHostedApiRequestAuthMode.g.cs @@ -16,6 +16,10 @@ public enum UpdateHostedApiRequestAuthMode /// ///
Public, + /// + /// + /// + UserToken, } /// @@ -32,6 +36,7 @@ public static string ToValueString(this UpdateHostedApiRequestAuthMode value) { UpdateHostedApiRequestAuthMode.ConsumerKey => "consumer_key", UpdateHostedApiRequestAuthMode.Public => "public", + UpdateHostedApiRequestAuthMode.UserToken => "user_token", _ => throw new global::System.ArgumentOutOfRangeException(nameof(value), value, null), }; } @@ -44,6 +49,7 @@ public static string ToValueString(this UpdateHostedApiRequestAuthMode value) { "consumer_key" => UpdateHostedApiRequestAuthMode.ConsumerKey, "public" => UpdateHostedApiRequestAuthMode.Public, + "user_token" => UpdateHostedApiRequestAuthMode.UserToken, _ => null, }; } diff --git a/src/libs/Speechify/Generated/Speechify.RoutesClient.CreateRoute.g.cs b/src/libs/Speechify/Generated/Speechify.RoutesClient.CreateRoute.g.cs index 629a1e5d..927d25fa 100644 --- a/src/libs/Speechify/Generated/Speechify.RoutesClient.CreateRoute.g.cs +++ b/src/libs/Speechify/Generated/Speechify.RoutesClient.CreateRoute.g.cs @@ -54,10 +54,16 @@ partial void ProcessCreateRouteResponseContent( /// structured output of a schedule trigger's runs; `run` starts a run
/// through a webhook trigger per request (POST only, never on a public
/// API) and waits up to `wait_seconds` before answering 202 with a
- /// handle to poll at `/_runs/{run_id}`. Where-clause values and the
+ /// handle to poll at `/_runs/{run_id}`; `file` serves one published file,
+ /// or a whole published tree when the path ends in `*` (`/app/*` with
+ /// `file_root` and `file_index`). Where-clause values and the
/// document id may be `{{query.x}}`, `{{path.x}}` or `{{body.x}}`
- /// templates bound from the consumer's request; a clause whose template
- /// is absent is skipped.
+ /// templates bound from the consumer's request, or `{{user.x}}` claims
+ /// of the verified end-user token on a `user_token` API; a clause whose
+ /// template is absent is skipped. Two bindings are refused at write
+ /// time: `{{user.*}}` on an API that does not verify end-user tokens,
+ /// and a clause on `user_identity` bound from a request template, which
+ /// would let any caller read any user's rows.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). ///
/// @@ -97,10 +103,16 @@ partial void ProcessCreateRouteResponseContent( /// structured output of a schedule trigger's runs; `run` starts a run
/// through a webhook trigger per request (POST only, never on a public
/// API) and waits up to `wait_seconds` before answering 202 with a
- /// handle to poll at `/_runs/{run_id}`. Where-clause values and the
+ /// handle to poll at `/_runs/{run_id}`; `file` serves one published file,
+ /// or a whole published tree when the path ends in `*` (`/app/*` with
+ /// `file_root` and `file_index`). Where-clause values and the
/// document id may be `{{query.x}}`, `{{path.x}}` or `{{body.x}}`
- /// templates bound from the consumer's request; a clause whose template
- /// is absent is skipped.
+ /// templates bound from the consumer's request, or `{{user.x}}` claims
+ /// of the verified end-user token on a `user_token` API; a clause whose
+ /// template is absent is skipped. Two bindings are refused at write
+ /// time: `{{user.*}}` on an API that does not verify end-user tokens,
+ /// and a clause on `user_identity` bound from a request template, which
+ /// would let any caller read any user's rows.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). ///
/// @@ -684,10 +696,16 @@ partial void ProcessCreateRouteResponseContent( /// structured output of a schedule trigger's runs; `run` starts a run
/// through a webhook trigger per request (POST only, never on a public
/// API) and waits up to `wait_seconds` before answering 202 with a
- /// handle to poll at `/_runs/{run_id}`. Where-clause values and the
+ /// handle to poll at `/_runs/{run_id}`; `file` serves one published file,
+ /// or a whole published tree when the path ends in `*` (`/app/*` with
+ /// `file_root` and `file_index`). Where-clause values and the
/// document id may be `{{query.x}}`, `{{path.x}}` or `{{body.x}}`
- /// templates bound from the consumer's request; a clause whose template
- /// is absent is skipped.
+ /// templates bound from the consumer's request, or `{{user.x}}` claims
+ /// of the verified end-user token on a `user_token` API; a clause whose
+ /// template is absent is skipped. Two bindings are refused at write
+ /// time: `{{user.*}}` on an API that does not verify end-user tokens,
+ /// and a clause on `user_identity` bound from a request template, which
+ /// would let any caller read any user's rows.
/// Dark launch: requires the `hosted_apis_access` entitlement (402 `hosted_apis_not_in_plan` otherwise). ///
/// @@ -705,9 +723,13 @@ partial void ProcessCreateRouteResponseContent( /// What answers a route. `type` selects the fields that apply:
/// `store_query` (store_id, collection, where, order_by, limit),
/// `store_document` (store_id, collection, document_id),
+ /// `store_aggregate` (store_id, collection, where, group_by, metrics:
+ /// a summary in one request, from the same implementation as the
+ /// collection's `aggregate` operation),
/// `run_latest` (trigger_id of a schedule trigger),
/// `run` (trigger_id of a webhook trigger, wait_seconds),
- /// `file` (file_path of a published file). + /// `file` (file_path of one published file; or, on a route whose path
+ /// ends in `*`, file_root and file_index for a whole published tree). /// /// /// diff --git a/src/libs/Speechify/Generated/Speechify.RoutesClient.UpdateRoute.g.cs b/src/libs/Speechify/Generated/Speechify.RoutesClient.UpdateRoute.g.cs index 7d49d54a..52b78a94 100644 --- a/src/libs/Speechify/Generated/Speechify.RoutesClient.UpdateRoute.g.cs +++ b/src/libs/Speechify/Generated/Speechify.RoutesClient.UpdateRoute.g.cs @@ -669,9 +669,13 @@ partial void ProcessUpdateRouteResponseContent( /// What answers a route. `type` selects the fields that apply:
/// `store_query` (store_id, collection, where, order_by, limit),
/// `store_document` (store_id, collection, document_id),
+ /// `store_aggregate` (store_id, collection, where, group_by, metrics:
+ /// a summary in one request, from the same implementation as the
+ /// collection's `aggregate` operation),
/// `run_latest` (trigger_id of a schedule trigger),
/// `run` (trigger_id of a webhook trigger, wait_seconds),
- /// `file` (file_path of a published file). + /// `file` (file_path of one published file; or, on a route whose path
+ /// ends in `*`, file_root and file_index for a whole published tree). /// /// /// diff --git a/src/libs/Speechify/openapi.yaml b/src/libs/Speechify/openapi.yaml index 96d00e35..5234ec04 100644 --- a/src/libs/Speechify/openapi.yaml +++ b/src/libs/Speechify/openapi.yaml @@ -1 +1 @@ -{"openapi":"3.1.0","info":{"title":"API Reference","version":"1.0.0"},"paths":{"/v1/audio/speech":{"post":{"operationId":"speech","summary":"Create Speech","description":"Synthesize speech audio from text or SSML. Returns the complete audio\nfile plus billing and speech-mark metadata in a single JSON response.\nFor low-latency playback or long-form text, use POST /v1/audio/stream.\nSet `output_format` for explicit sample-rate/bitrate control (e.g.\n`pcm_16000` or `ulaw_8000` for telephony).","tags":["audio"],"parameters":[{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Synthesized speech audio for the requested input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetSpeechResponse"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"The workspace has insufficient credits, or the request needs a\nplan tier the workspace is not on (e.g. voice cloning). Distinct\nfrom `Forbidden` so SDK consumers can drive upgrade UX.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The credential authenticated, but is not authorised for this\nresource - typically a workspace-role gate (owner / admin\nrequired) or a cross-tenant access attempt.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The request conflicts with the current resource state - e.g.\nduplicate, optimistic-concurrency mismatch, or last-owner\nguard.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit or concurrency limit exceeded. `error.code` says which\nceiling, and they need different responses: `rate_limited` is the\nrequest-rate budget (slow down), `concurrency_limit_reached` is a\nworkspace-wide concurrency ceiling (fewer at once, or raise it), and\n`conversation_turn_in_progress` is contention over one named\nconversation (keep one message in flight on it). Every 429 carries\n`Retry-After` and the request-rate budget headers; the active-call cap\nalso carries `RateLimit-Remaining-Calls: 0`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"An upstream dependency (the TTS composer or voice-metadata\nservice) returned a 5xx. The raw upstream detail is not\nforwarded - the cause is in the server log; the response is a\nfixed `upstream_failure` envelope. Safe to retry.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A downstream dependency is degraded or the endpoint is\nintentionally disabled (e.g. phone-number purchase before\nops setup).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetSpeechRequest"}}}}}},"/v1/audio/stream":{"post":{"operationId":"stream","summary":"Stream Speech","description":"Synthesize speech and stream the audio back as it is generated, for\nlow-latency playback. Set `output_format` in the body for explicit\ncodec/sample-rate/bitrate control (e.g. `pcm_16000` or `ulaw_8000` for\ntelephony), or fall back to the Accept header for the container; the\nresponse is raw audio bytes (HTTP chunked). For Base64-encoded audio\nwith speech-mark metadata in a single JSON response, use\nPOST /v1/audio/speech.","tags":["audio"],"parameters":[{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}},{"name":"Accept","in":"header","description":"Selects the audio container/codec for the streamed response when\n`output_format` is not set in the request body. The response\nContent-Type echoes this value, except `audio/pcm` returns\n`audio/L16` with rate and channels parameters (raw 16-bit linear\nPCM, 24 kHz mono, little-endian). For explicit sample-rate/bitrate\ncontrol (e.g. `pcm_16000`, `ulaw_8000`), set `output_format` in the\nbody instead; it takes precedence over this header.","required":false,"schema":{"$ref":"#/components/schemas/V1AudioStreamPostParametersAccept"}}],"responses":{"200":{"description":"Streamed audio. When `output_format` is set it selects the\ncodec/sample rate; otherwise the Accept header does. The\nContent-Type reflects the selected format: it matches the Accept\nheader, except raw PCM returns `audio/L16` (with rate and channels\nparameters) and u-law returns `audio/basic`.","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"The workspace has insufficient credits, or the request needs a\nplan tier the workspace is not on (e.g. voice cloning). Distinct\nfrom `Forbidden` so SDK consumers can drive upgrade UX.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The credential authenticated, but is not authorised for this\nresource - typically a workspace-role gate (owner / admin\nrequired) or a cross-tenant access attempt.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The request conflicts with the current resource state - e.g.\nduplicate, optimistic-concurrency mismatch, or last-owner\nguard.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit or concurrency limit exceeded. `error.code` says which\nceiling, and they need different responses: `rate_limited` is the\nrequest-rate budget (slow down), `concurrency_limit_reached` is a\nworkspace-wide concurrency ceiling (fewer at once, or raise it), and\n`conversation_turn_in_progress` is contention over one named\nconversation (keep one message in flight on it). Every 429 carries\n`Retry-After` and the request-rate budget headers; the active-call cap\nalso carries `RateLimit-Remaining-Calls: 0`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"An upstream dependency (the TTS composer or voice-metadata\nservice) returned a 5xx. The raw upstream detail is not\nforwarded - the cause is in the server log; the response is a\nfixed `upstream_failure` envelope. Safe to retry.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A downstream dependency is degraded or the endpoint is\nintentionally disabled (e.g. phone-number purchase before\nops setup).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStreamRequest"}}}}}},"/v1/audio/stream/with-timestamps":{"post":{"operationId":"streamWithTimestamps","summary":"Stream Speech With Timestamps","description":"Synthesize speech and stream it back together with word-level speech\nmarks, for text highlighting, captions and audio-text synchronization\nwhile the audio is still arriving.\n\nThe response is a Server-Sent Events stream. Each `speech.chunk` event\ncarries a Base64-encoded run of audio, the speech marks that became\nfinal with it, or both - a chunk may carry only one of the two, and the\nlast chunk of a stream is often marks-only. A terminal `speech.done`\nevent ends the stream; there is no `[DONE]` sentinel. Ignore any event\ntype you do not recognize, so that new event types do not break your\nintegration.\n\nSpeech-mark times are absolute milliseconds from the start of the\nsynthesis, so concatenate the audio chunks into one stream and apply the\nmarks against that single timeline. Which chunk a mark arrives on is a\ndelivery detail and carries no meaning. Times stay correct for every\n`output_format`: changing the codec or sample rate does not change the\nduration.\n\nSpeech marks are produced by the streaming-native models. The default\n`simba-3.0` and `simba-3.2` both serve this route. The legacy\n`simba-english` and `simba-multilingual` models never could: on a\nworkspace pinned before API version `2026-09-21` they return 400\n`speech_marks_unsupported` here, and from that version on they return\n400 `model_retired` on every synthesis route. Both are switched off\nentirely on 2026-11-21.\nFor Base64-encoded audio and speech marks in one non-streamed JSON\nresponse, on any model, use POST /v1/audio/speech.","tags":["audio"],"parameters":[{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}},{"name":"Accept","in":"header","description":"Selects the audio container/codec carried inside the events when\n`output_format` is not set in the request body. The selected media\ntype is echoed on the `Speechify-Audio-Content-Type` response\nheader, since the response's own Content-Type is `text/event-stream`.","required":false,"schema":{"$ref":"#/components/schemas/V1AudioStreamWithTimestampsPostParametersAccept"}}],"responses":{"200":{"description":"A Server-Sent Events stream of `speech.chunk` events followed by one\nterminal `speech.done` event. A failure after the stream has started\nis delivered as a `speech.error` event carrying the standard error\nenvelope, because the status code is already committed.\n\nThe transport is `text/event-stream`: each event is an\n`event:`/`data:` pair whose `data` is one JSON payload matching the\nschema below. The payload's `type` field mirrors the `event:` name,\nso the stream is also parseable from `data:` lines alone. Ignore\nevent types you do not recognize.","content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/SpeechStreamEvent"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"The workspace has insufficient credits, or the request needs a\nplan tier the workspace is not on (e.g. voice cloning). Distinct\nfrom `Forbidden` so SDK consumers can drive upgrade UX.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The credential authenticated, but is not authorised for this\nresource - typically a workspace-role gate (owner / admin\nrequired) or a cross-tenant access attempt.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The request conflicts with the current resource state - e.g.\nduplicate, optimistic-concurrency mismatch, or last-owner\nguard.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit or concurrency limit exceeded. `error.code` says which\nceiling, and they need different responses: `rate_limited` is the\nrequest-rate budget (slow down), `concurrency_limit_reached` is a\nworkspace-wide concurrency ceiling (fewer at once, or raise it), and\n`conversation_turn_in_progress` is contention over one named\nconversation (keep one message in flight on it). Every 429 carries\n`Retry-After` and the request-rate budget headers; the active-call cap\nalso carries `RateLimit-Remaining-Calls: 0`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"An upstream dependency (the TTS composer or voice-metadata\nservice) returned a 5xx. The raw upstream detail is not\nforwarded - the cause is in the server log; the response is a\nfixed `upstream_failure` envelope. Safe to retry.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A downstream dependency is degraded or the endpoint is\nintentionally disabled (e.g. phone-number purchase before\nops setup).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStreamRequest"}}}}}},"/v1/voices":{"get":{"operationId":"list","summary":"List Voices","description":"Lists the voices available to the caller - the shared voice\ncatalog plus the cloned voices they can reach, whichever member or\nservice-account key created them. A clone filed under a project is\nlisted only for a caller who can reach that project; a clone no\nproject filed is shared with the whole workspace and is listed for\neveryone in it. By default\nthe full catalogue is returned in one response. Pagination is\nopt-in: pass `limit` (and then `cursor` from the previous\nresponse) to page through the list while `has_more` is true. Max\npage size is 200. Narrow the list with the `type` and `locale`\nfilters.\n\nA page can come back with fewer than `limit` voices, and a short\npage - an empty one included - is not the end of the list. Keep\nfollowing `next_cursor` while `has_more` is true.","tags":["voices"],"parameters":[{"name":"cursor","in":"query","description":"Opaque pagination cursor from a previous response.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Max items per page (default 50, max 200).","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"type","in":"query","description":"Filter by voice type: `personal` (the workspace's cloned voices)\nor `shared` (the public catalogue). Omit to return both.","required":false,"schema":{"$ref":"#/components/schemas/V1VoicesGetParametersType"}},{"name":"locale","in":"query","description":"Filter to voices whose locale matches this BCP-47 language range,\nprefix-matched: `en` matches `en-US` and `en-GB`; `en-US` matches\nonly `en-US`. Case-insensitive. Omit to return all locales.","required":false,"schema":{"type":"string"}},{"name":"gender","in":"query","description":"Filter by voice gender. Omit to return all genders.","required":false,"schema":{"$ref":"#/components/schemas/V1VoicesGetParametersGender"}},{"name":"model","in":"query","description":"Filter to voices that support this model (as listed in each voice's\n`models[]`), e.g. `simba-3.2`. Omit to return voices for all models.","required":false,"schema":{"type":"string"}},{"name":"project_id","in":"query","description":"Filter cloned voices by workspace project: omit for every voice you\ncan reach, pass the literal `shared` for the clones no project\nfiled, or a `proj_...` id for the clones filed under that project.\nThe shared catalog carries no project and is returned either way.\n\nA clone is filed under a project when a project-pinned key created\nit. A clone with no project is shared with the whole workspace\nrather than sitting in a Default project, so the literal here is\n`shared`, never `default` - passing `default` is a 400. Returns 404\nproject_not_found for a malformed id and for any project outside\nyour reach: a project-pinned key reaches only its pinned project,\nand a member holding project grants reaches only the granted ones.\nThat 404 is the same in every case and does not reveal whether such\na project exists. `shared` is always inside your reach.\n","required":false,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The voice catalogue (or a page of it when `limit` is set).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListVoicesResponse"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The credential authenticated, but is not authorised for this\nresource - typically a workspace-role gate (owner / admin\nrequired) or a cross-tenant access attempt.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit or concurrency limit exceeded. `error.code` says which\nceiling, and they need different responses: `rate_limited` is the\nrequest-rate budget (slow down), `concurrency_limit_reached` is a\nworkspace-wide concurrency ceiling (fewer at once, or raise it), and\n`conversation_turn_in_progress` is contention over one named\nconversation (keep one message in flight on it). Every 429 carries\n`Retry-After` and the request-rate budget headers; the active-call cap\nalso carries `RateLimit-Remaining-Calls: 0`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create","summary":"Create Voice","description":"Create a cloned voice for the workspace from a 10-30 second audio sample, with verified consent from the speaker.\n\nCloning requires proof that the speaker agreed to it. Create a consent challenge with `POST /v1/voices/consent-challenges`, show the returned `phrase` to the speaker, record them reading it aloud, and send that recording here as `consent_recording` together with the challenge's `consent_challenge_id`. Speechify transcribes the recording, checks it against the phrase it issued, checks that its speaker is the speaker in your `sample`, and keeps it as the consent record for the voice. The person consenting therefore has to be the person being cloned. A challenge is single use and short-lived, so record and submit in one sitting.\n\nThe clone belongs to the workspace rather than the member who created it, and access follows the caller's workspace role and API-key scopes exactly as for any other voice: voices scopes to list it, audio scopes to synthesize with it, and the content-management permission plus a write scope on the key to delete it. Cloned voices are usable self-serve on `simba-3.0` (and, on a workspace pinned before API version `2026-09-21`, on the retired `simba-english` and `simba-multilingual` until they are switched off on 2026-11-21). `simba-3.2` also serves cloned voices.\n\nCallers pinned before `Speechify-Version: 2026-09-13` use the previous flow instead: no challenge, and a `consent` form field carrying the speaker's name and email as a JSON string. That flow is deprecated and will be removed after a sunset window announced in the changelog.","tags":["voices"],"parameters":[{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","description":"A client-generated key (an opaque string, max 255 chars) that makes a\nside-effect POST safe to retry: the server runs the operation exactly\nonce and replays the first response (its status and body) for 24 hours.\nReusing a key with a different request body, or while the first request\nis still in flight, returns `409 idempotency_conflict`. A replayed\nresponse carries the `Idempotent-Replayed: true` header.\n","required":false,"schema":{"type":"string","maxLength":255}}],"responses":{"201":{"description":"A created voice","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetVoice"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"The workspace has insufficient credits, or the request needs a\nplan tier the workspace is not on (e.g. voice cloning). Distinct\nfrom `Forbidden` so SDK consumers can drive upgrade UX.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The credential authenticated, but is not authorised for this\nresource - typically a workspace-role gate (owner / admin\nrequired) or a cross-tenant access attempt.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The request conflicts with the current resource state - e.g.\nduplicate, optimistic-concurrency mismatch, or last-owner\nguard.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request body exceeded a per-endpoint size limit (e.g. the file\nupload cap, KB document upload cap, batch-call CSV cap).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The request was well-formed but semantically rejected -\ntypically a referential integrity violation (e.g. flow node\nreferences an audio asset in another workspace) or a state\nmachine refusal.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit or concurrency limit exceeded. `error.code` says which\nceiling, and they need different responses: `rate_limited` is the\nrequest-rate budget (slow down), `concurrency_limit_reached` is a\nworkspace-wide concurrency ceiling (fewer at once, or raise it), and\n`conversation_turn_in_progress` is contention over one named\nconversation (keep one message in flight on it). Every 429 carries\n`Retry-After` and the request-rate budget headers; the active-call cap\nalso carries `RateLimit-Remaining-Calls: 0`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"An upstream dependency (the TTS composer or voice-metadata\nservice) returned a 5xx. The raw upstream detail is not\nforwarded - the cause is in the server log; the response is a\nfixed `upstream_failure` envelope. Safe to retry.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A downstream dependency is degraded or the endpoint is\nintentionally disabled (e.g. phone-number purchase before\nops setup).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Name of the personal voice"},"locale":{"type":"string","default":"en-US","description":"Native language (locale) of the personal voice (e.g. en-US, es-ES, etc.)"},"gender":{"$ref":"#/components/schemas/V1VoicesPostRequestBodyContentMultipartFormDataSchemaGender","description":"Gender marker for the personal voice\nmale GenderMale\nfemale GenderFemale\nnot_specified GenderNotSpecified"},"sample":{"type":"string","format":"binary","description":"Audio sample of the voice to clone, 10-30 seconds of clean speech."},"avatar":{"type":"string","format":"binary","description":"Avatar image file"},"consent_challenge_id":{"type":"string","description":"The `id` of the consent challenge this create consumes, from\n`POST /v1/voices/consent-challenges`. Single use: once a\ncreate has consumed it, whether or not that create\nsucceeded, it cannot be used again."},"consent_recording":{"type":"string","format":"binary","description":"Recording of the speaker reading the challenge's `phrase`\naloud. This is the consent record for the voice, not a\nsecond voice sample: it must be the same person as in\n`sample`, and it is retained as evidence. 5-30 seconds, at\nmost 25 MB, in any common audio container."}},"required":["name","gender","sample","consent_challenge_id","consent_recording"]}}}}}},"/v1/voices/consent-challenges":{"post":{"operationId":"create","summary":"Create Consent Challenge","description":"Start the consent check for a voice clone.\n\nReturns a `phrase` for the speaker to read aloud and an `id` that identifies this challenge. Show the phrase to the speaker exactly as returned, record them reading it, then send the recording and the `id` to `POST /v1/voices`, which verifies the recording against the phrase and against the voice sample being cloned, then keeps it as the consent record.\n\nA challenge is single use, is bound to the workspace that created it, and expires at `expires_at` - it is proof that a speaker was in front of a microphone just now, so create it when you are ready to record, not at the start of your flow. If it expires, create another one and record again.\n\nChallenge creation is rate limited per workspace at a few dozen per hour, far more tightly than the rest of the voice surface, because each one precedes a person recording themselves - mint it when your speaker is ready, not speculatively. Read the live ceiling off `RateLimit-*` rather than hard-coding it. **On a `429`, always honour `Retry-After` rather than a fixed backoff of your own**: the wait is measured in minutes and can run to most of an hour. `RateLimit-*` are omitted rather than reporting a bucket that is not the one refusing.","tags":["consentChallenges"],"parameters":[{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","description":"A client-generated key (an opaque string, max 255 chars) that makes a\nside-effect POST safe to retry: the server runs the operation exactly\nonce and replays the first response (its status and body) for 24 hours.\nReusing a key with a different request body, or while the first request\nis still in flight, returns `409 idempotency_conflict`. A replayed\nresponse carries the `Idempotent-Replayed: true` header.\n","required":false,"schema":{"type":"string","maxLength":255}}],"responses":{"201":{"description":"The created consent challenge.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentChallenge"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"The workspace has insufficient credits, or the request needs a\nplan tier the workspace is not on (e.g. voice cloning). Distinct\nfrom `Forbidden` so SDK consumers can drive upgrade UX.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The credential authenticated, but is not authorised for this\nresource - typically a workspace-role gate (owner / admin\nrequired) or a cross-tenant access attempt.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The request conflicts with the current resource state - e.g.\nduplicate, optimistic-concurrency mismatch, or last-owner\nguard.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit or concurrency limit exceeded. `error.code` says which\nceiling, and they need different responses: `rate_limited` is the\nrequest-rate budget (slow down), `concurrency_limit_reached` is a\nworkspace-wide concurrency ceiling (fewer at once, or raise it), and\n`conversation_turn_in_progress` is contention over one named\nconversation (keep one message in flight on it). Every 429 carries\n`Retry-After` and the request-rate budget headers; the active-call cap\nalso carries `RateLimit-Remaining-Calls: 0`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"An upstream dependency (the TTS composer or voice-metadata\nservice) returned a 5xx. The raw upstream detail is not\nforwarded - the cause is in the server log; the response is a\nfixed `upstream_failure` envelope. Safe to retry.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A downstream dependency is degraded or the endpoint is\nintentionally disabled (e.g. phone-number purchase before\nops setup).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConsentChallengeRequest"}}}}}},"/v1/voices/{voice_id}":{"get":{"operationId":"get","summary":"Get Voice","description":"Fetch a single voice by id - a shared catalogue voice or one of\nthe workspace's cloned voices. A cloned voice that belongs to\nanother workspace returns 404, identical to an unknown id, so\nvoice inventory is never enumerable across tenants.","tags":["voices"],"parameters":[{"name":"voice_id","in":"path","description":"The ID of the voice to fetch","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The voice.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetVoice"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit or concurrency limit exceeded. `error.code` says which\nceiling, and they need different responses: `rate_limited` is the\nrequest-rate budget (slow down), `concurrency_limit_reached` is a\nworkspace-wide concurrency ceiling (fewer at once, or raise it), and\n`conversation_turn_in_progress` is contention over one named\nconversation (keep one message in flight on it). Every 429 carries\n`Retry-After` and the request-rate budget headers; the active-call cap\nalso carries `RateLimit-Remaining-Calls: 0`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"An upstream dependency (the TTS composer or voice-metadata\nservice) returned a 5xx. The raw upstream detail is not\nforwarded - the cause is in the server log; the response is a\nfixed `upstream_failure` envelope. Safe to retry.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A downstream dependency is degraded or the endpoint is\nintentionally disabled (e.g. phone-number purchase before\nops setup).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"delete","summary":"Delete Voice","description":"Delete one of the workspace's cloned voices. Requires the\n`content.manage` permission (owner, admin, or member); a\nservice-account key is authorized by its scopes instead.","tags":["voices"],"parameters":[{"name":"voice_id","in":"path","description":"The ID of the voice to delete","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"204":{"description":"Voice deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The credential authenticated, but is not authorised for this\nresource - typically a workspace-role gate (owner / admin\nrequired) or a cross-tenant access attempt.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit or concurrency limit exceeded. `error.code` says which\nceiling, and they need different responses: `rate_limited` is the\nrequest-rate budget (slow down), `concurrency_limit_reached` is a\nworkspace-wide concurrency ceiling (fewer at once, or raise it), and\n`conversation_turn_in_progress` is contention over one named\nconversation (keep one message in flight on it). Every 429 carries\n`Retry-After` and the request-rate budget headers; the active-call cap\nalso carries `RateLimit-Remaining-Calls: 0`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"An upstream dependency (the TTS composer or voice-metadata\nservice) returned a 5xx. The raw upstream detail is not\nforwarded - the cause is in the server log; the response is a\nfixed `upstream_failure` envelope. Safe to retry.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A downstream dependency is degraded or the endpoint is\nintentionally disabled (e.g. phone-number purchase before\nops setup).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/voices/{voice_id}/sample":{"get":{"operationId":"downloadSample","summary":"Download Voice Sample","description":"Download a personal (cloned) voice sample","tags":["voices"],"parameters":[{"name":"voice_id","in":"path","description":"The ID of the voice to download sample for","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Voice sample audio file","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The credential authenticated, but is not authorised for this\nresource - typically a workspace-role gate (owner / admin\nrequired) or a cross-tenant access attempt.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit or concurrency limit exceeded. `error.code` says which\nceiling, and they need different responses: `rate_limited` is the\nrequest-rate budget (slow down), `concurrency_limit_reached` is a\nworkspace-wide concurrency ceiling (fewer at once, or raise it), and\n`conversation_turn_in_progress` is contention over one named\nconversation (keep one message in flight on it). Every 429 carries\n`Retry-After` and the request-rate budget headers; the active-call cap\nalso carries `RateLimit-Remaining-Calls: 0`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"An upstream dependency (the TTS composer or voice-metadata\nservice) returned a 5xx. The raw upstream detail is not\nforwarded - the cause is in the server log; the response is a\nfixed `upstream_failure` envelope. Safe to retry.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"A downstream dependency is degraded or the endpoint is\nintentionally disabled (e.g. phone-number purchase before\nops setup).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/audio/models":{"get":{"operationId":"list","summary":"List Models","description":"List the text-to-speech models available for synthesis. Drive a model\npicker from this response, then pass a model `id` as the `model`\nparameter to POST /v1/audio/speech or /v1/audio/stream. The response\nmarks the default model (used when a request omits `model`), the\nroutes each model may be passed to, and which voices it accepts.\nMulti-speaker models arrive in a separate `dialogue_models` array\nbecause they are valid only on POST /v1/audio/dialogue. Returns\nthe full set in a single response: the model catalog is static\nplatform reference data, so it is intentionally not paginated.","tags":["models"],"parameters":[{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The available text-to-speech models.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelsResponse"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The credential authenticated, but is not authorised for this\nresource - typically a workspace-role gate (owner / admin\nrequired) or a cross-tenant access attempt.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit or concurrency limit exceeded. `error.code` says which\nceiling, and they need different responses: `rate_limited` is the\nrequest-rate budget (slow down), `concurrency_limit_reached` is a\nworkspace-wide concurrency ceiling (fewer at once, or raise it), and\n`conversation_turn_in_progress` is contention over one named\nconversation (keep one message in flight on it). Every 429 carries\n`Retry-After` and the request-rate budget headers; the active-call cap\nalso carries `RateLimit-Remaining-Calls: 0`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/audio/watermark/detect":{"post":{"operationId":"detect","summary":"Detect Watermark","description":"Check whether a clip carries the watermark Speechify seals into audio it\ngenerates. Upload the audio as `audio`; nothing about it is stored, and\nno voice is read or written.\n\nRead the answer carefully in one direction. A `watermarked: true` is\npositive evidence that the audio came from Speechify synthesis. A\n`watermarked: false` is NOT proof that it did not: only models\nredeployed since the watermark shipped mark their output, the detector\nneeds at least three seconds of clear speech to judge, and re-encoding\nor changing the speed of a clip degrades the mark. Treat a negative as\nthe absence of evidence rather than as evidence of absence.\n\nChecks are rate-limited well below the synthesis budget: this is a\nforensic question, not a data-plane call.","tags":["watermark"],"parameters":[{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The clip was checked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatermarkDetectionResponse"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The credential authenticated, but is not authorised for this\nresource - typically a workspace-role gate (owner / admin\nrequired) or a cross-tenant access attempt.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request body exceeded a per-endpoint size limit (e.g. the file\nupload cap, KB document upload cap, batch-call CSV cap).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The request was well-formed but semantically rejected -\ntypically a referential integrity violation (e.g. flow node\nreferences an audio asset in another workspace) or a state\nmachine refusal.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit or concurrency limit exceeded. `error.code` says which\nceiling, and they need different responses: `rate_limited` is the\nrequest-rate budget (slow down), `concurrency_limit_reached` is a\nworkspace-wide concurrency ceiling (fewer at once, or raise it), and\n`conversation_turn_in_progress` is contention over one named\nconversation (keep one message in flight on it). Every 429 carries\n`Retry-After` and the request-rate budget headers; the active-call cap\nalso carries `RateLimit-Remaining-Calls: 0`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"An upstream dependency (the TTS composer or voice-metadata\nservice) returned a 5xx. The raw upstream detail is not\nforwarded - the cause is in the server log; the response is a\nfixed `upstream_failure` envelope. Safe to retry.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"audio":{"type":"string","format":"binary","description":"The clip to check, at most 25MB. Give the detector at least\nthree seconds of clear speech; below that its confidence is\nnot worth acting on, and below half a second it always\nreports zero."}},"required":["audio"]}}}}}},"/v1/audio/watermark/verify":{"post":{"operationId":"verify","summary":"Verify Watermark","description":"The public AI detection tool. Ask whether a clip carries the watermark\nSpeechify seals into audio it generates, with no account, no API key and\nno credential of any kind.\n\n`verify` answers; `detect` measures. This route returns a bare yes or no,\nthe way verifying a signature does. Its sibling\n`POST /v1/audio/watermark/detect` takes an API key and returns the\ndetector's confidence alongside the verdict.\n\nThis is the programmatic half of the tool published at\n, and it exists so the tool can be invoked\nwithout visiting our website, as California's AI Transparency Act\n(BPC 22757.2) requires. Nothing about the clip is stored, and nothing\nidentifying about you is collected or retained.\n\nThe answer is a bare verdict. `watermarked: true` is positive evidence\nthat the audio came from Speechify synthesis. `watermarked: false` is\nNOT proof that it did not: only models redeployed since the watermark\nshipped mark their output, the detector needs at least three seconds of\nclear speech to judge, and re-encoding or changing the speed of a clip\ndegrades the mark. Treat a negative as the absence of evidence rather\nthan as evidence of absence.\n\nBecause the tool takes no credential, it is rate-limited per client\naddress and shares a platform-wide budget: expect a 429 under sustained\nautomated use, and retry after the interval the response advertises.\nUse `POST /v1/audio/watermark/detect` with an API key for the detector's\nconfidence score and a per-workspace allowance of its own.","tags":["watermark"],"parameters":[{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The clip was checked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatermarkVerificationResponse"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request body exceeded a per-endpoint size limit (e.g. the file\nupload cap, KB document upload cap, batch-call CSV cap).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The request was well-formed but semantically rejected -\ntypically a referential integrity violation (e.g. flow node\nreferences an audio asset in another workspace) or a state\nmachine refusal.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit or concurrency limit exceeded. `error.code` says which\nceiling, and they need different responses: `rate_limited` is the\nrequest-rate budget (slow down), `concurrency_limit_reached` is a\nworkspace-wide concurrency ceiling (fewer at once, or raise it), and\n`conversation_turn_in_progress` is contention over one named\nconversation (keep one message in flight on it). Every 429 carries\n`Retry-After` and the request-rate budget headers; the active-call cap\nalso carries `RateLimit-Remaining-Calls: 0`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"An upstream dependency (the TTS composer or voice-metadata\nservice) returned a 5xx. The raw upstream detail is not\nforwarded - the cause is in the server log; the response is a\nfixed `upstream_failure` envelope. Safe to retry.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"audio":{"type":"string","format":"binary","description":"The clip to check, at most 25MB. Give the detector at least\nthree seconds of clear speech; below that its answer is not\nworth acting on."}},"required":["audio"]}}}}}},"/v1/agents":{"get":{"operationId":"list","summary":"List Agents","description":"List voice agents owned by the caller. Cursor-paginated: omit\n`cursor` for the first page; walk pages while `has_more` is true\n(default page size 50, max 200).","tags":["agent"],"parameters":[{"name":"cursor","in":"query","description":"Opaque pagination cursor from a previous response.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Max items per page (default 50, max 200).","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"project_id","in":"query","description":"Filter by workspace project: omit for every project you can reach,\npass the literal `default` for resources in the implicit Default\nproject only, or a `proj_...` id for that project's resources.\nReturns 404 project_not_found for a malformed id and for any filter\noutside your reach: a project-pinned API key or service-account key\nreaches only its pinned project, and a member holding project grants\nreaches only the granted projects, so neither can name `default`.\nThat 404 is the same in every case and does not reveal whether such\na project exists - outside your reach a project is answered as\nnonexistent, never as forbidden. Inside it, a well-formed id that\nmatches no project yields an empty page.\n","required":false,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"A list of voice agents.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListAgentsResponse"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"create","summary":"Create Agent","description":"Create a voice agent.\n\nThe agent lands in the project named by `project_id`, or in the\nimplicit Default project when none is given. Each project holds at\nmost a fixed number of live agents; a create past that answers\n`409 agent_limit_reached` naming the ceiling, and deleting an agent\nin that project - or creating this one in another - frees a slot.\n","tags":["agent"],"parameters":[{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"201":{"description":"The created agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Agent"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The request conflicts with the current resource state - e.g.\nduplicate, optimistic-concurrency mismatch, or last-owner\nguard.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAgentRequest"}}}}}},"/v1/agents/voices":{"get":{"operationId":"listAgentVoices","summary":"List Agent Voices","description":"List the voice catalogue available for voice agents: the curated\nshared catalogue plus your workspace's own cloned voices, each\nmarked by `type` (`shared` or `personal`). The same slug set is\naccepted by POST/PATCH /v1/agents, so any voice listed here can be\nassigned to an agent. Cloned voices are workspace-owned only - a\npersonal voice scoped to an individual is not selectable on an\nagent, which is a workspace-shared resource. The JSON layout\nintentionally mirrors the TTS `/v1/voices` shape so a single voice\npicker can consume both endpoints.\n\nCursor-paginated: pass `cursor` + `limit` and walk pages while\n`has_more` is true. From API version `2026-08-07` an omitted `limit`\nreturns the first page (default 50, max 200); a caller pinned before\nthat date keeps the historical whole-catalogue response until it opts\nin. The shared catalogue is served first, then your cloned voices.\n","tags":["agent"],"parameters":[{"name":"cursor","in":"query","description":"Opaque pagination cursor from a previous response.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Max items per page (default 50, max 200).","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The curated agent voice catalogue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListAgentVoicesResponse"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/agents/tts-models":{"get":{"operationId":"listTTSModels","summary":"List Agent TTS Models","description":"List the Simba text-to-speech models a voice agent can be pinned to\nwith `tts.model`.\n\nThe response is the whole catalog and is the same for every\nworkspace - which model serves an agent is a routing decision, not\nan entitlement, so nothing here is plan-gated. Whether a *particular*\nagent may select an entry depends on two facts this response\npublishes rather than resolving for you, because both change without\nthis list changing:\n\n- `english_only` - the model has no multilingual deployment, so an\n agent that declares `additional_languages` (or whose `language` is\n not English) cannot select it.\n- `requires_voice_curation` - deprecated and always false. No model\n asks a voice for a registration: every training conditions on the\n voice's own prompt audio, so every model is selectable on every\n voice we speak ourselves, cloned voices included.\n\nDrive a model picker from this and the agent's languages and it can\nonly offer combinations POST/PATCH /v1/agents will accept.\nReturns the full set in one response: bounded by the platform's\ncurated model catalog, so it is intentionally not paginated.\n","tags":["agent"],"parameters":[{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The TTS models selectable for voice agents.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentTTSModelsResponse"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/agents/{agent_id}":{"delete":{"operationId":"delete","summary":"Delete Agent","description":"Delete an agent, and with it everything that belonged only to that\nagent.\n\n**Goes with the agent**, immediately unreadable through every\nendpoint: its runs and their step journals and approvals, its\nconversations and the transcripts, messages and recordings inside\nthem, what it learned about the people it spoke to, its triggers,\nshare links, channel bindings, team memberships and the batch\ncampaigns it dialled. A run that has not settled is asked to stop,\nincluding one parked waiting on a person or on a delegated child. These are removed for good 30 days\nlater; until then the delete can still be walked back by support.\n\n**Survives the agent**, because it belongs to the workspace rather\nthan to this agent: attached tools, knowledge bases, stores and\nskills (only the attachment is dropped), the agent's tests, phone\nnumbers, and the teams it belonged to.\n\n**Kept regardless**, because it is accounting rather than content:\nthe usage the workspace was billed for.\n\nRefused with `409 agent_in_use` while a live phone number still\nroutes to the agent, including the agent a webhook binding\nprovisioned for its number; `used_by` names the numbers. Unbind them\n(`DELETE /v1/agents/{agent_id}/phone-numbers/{phone_number_id}`,\nwhich also clears a webhook binding) and the delete proceeds.\n","tags":["agent"],"parameters":[{"name":"agent_id","in":"path","description":"Agent id (prefixed external id, `agent_...`).","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"204":{"description":"Agent deleted.","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"A live phone number still routes to the agent. `used_by` names\nthem so the caller can unbind first.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentInUseError"}}}}}},"get":{"operationId":"get","summary":"Get Agent","description":"Retrieve a voice agent by ID.","tags":["agent"],"parameters":[{"name":"agent_id","in":"path","description":"Agent id (prefixed external id, `agent_...`).","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Agent"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"update","summary":"Update Agent","description":"Update a voice agent. Only fields present on the request body are changed.","tags":["agent"],"parameters":[{"name":"agent_id","in":"path","description":"Agent id (prefixed external id, `agent_...`).","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Agent"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The request conflicts with the current resource state - e.g.\nduplicate, optimistic-concurrency mismatch, or last-owner\nguard.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAgentRequest"}}}}}},"/v1/agents/{agent_id}/widget-config":{"get":{"operationId":"getWidgetConfig","summary":"Get Agent Widget Config","description":"Return the embed-widget appearance config for an agent. Works\nunauthenticated for public agents; the body is cosmetic only.\n","tags":["agent"],"parameters":[{"name":"agent_id","in":"path","description":"Prefixed agent id.","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The agent's widget configuration.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetConfig"}}}},"403":{"description":"The credential authenticated, but is not authorised for this\nresource - typically a workspace-role gate (owner / admin\nrequired) or a cross-tenant access attempt.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/agents/flow/schema":{"get":{"operationId":"getSchema","summary":"Get Flow Graph Schema","description":"Return the JSON Schema describing the flow graph node taxonomy.\nUnauthenticated; flow editors fetch it to validate graphs client-side.\n","tags":["flow"],"parameters":[{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"A JSON Schema document for the flow graph.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/agent_flow_getSchema_Response_200"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/agents/{agent_id}/flow":{"get":{"operationId":"getFlow","summary":"Get Agent Flow","description":"Return the agent's flow graph: the current draft (if any), the\nactive published graph (if any), and the version history.\n","tags":["flow"],"parameters":[{"name":"agent_id","in":"path","description":"Prefixed agent id.","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The draft graph, active graph, and version history.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFlowResponse"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"updateFlow","summary":"Update Agent Flow Draft","description":"Replace the agent's draft flow graph. The graph is validated\nbefore it is stored; publish it separately to make it active.\n","tags":["flow"],"parameters":[{"name":"agent_id","in":"path","description":"Prefixed agent id.","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The stored draft graph.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowGraph"}}}},"400":{"description":"Flow validation failed (or the request body was undecodable). The\nstandard `Error` envelope plus an `issues` array locating each problem\nfor the editor. See the `FlowValidationError` schema.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowValidationError"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The request conflicts with the current resource state - e.g.\nduplicate, optimistic-concurrency mismatch, or last-owner\nguard.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutFlowRequest"}}}}}},"/v1/agents/{agent_id}/flow/publish":{"post":{"operationId":"publish","summary":"Publish Agent Flow","description":"Publish the agent's draft graph as a new active flow version.","tags":["flow"],"parameters":[{"name":"agent_id","in":"path","description":"Prefixed agent id.","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The newly published flow version.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowVersion"}}}},"400":{"description":"Flow validation failed (or the request body was undecodable). The\nstandard `Error` envelope plus an `issues` array locating each problem\nfor the editor. See the `FlowValidationError` schema.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowValidationError"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The request conflicts with the current resource state - e.g.\nduplicate, optimistic-concurrency mismatch, or last-owner\nguard.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The behavioral-eval publish gate refused the publish, on one of two\ncodes the caller can FIX (neither is waited out):\n\n- `agent_publish_gate_failed`: the agent's configured suite did not\n pass. `error.details` carries the verdict (per-case, per-criterion).\n- `agent_publish_gate_tool_unreachable`: the checks never ran because\n a tool the agent is attached to could not be reached. Nothing was\n judged, and no retry helps while the endpoint is down;\n `error.message` names the tool, the endpoint and the reason.\n\nThe one publish failure that IS waited out is the `503`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The publish checks could not run (`agent_publish_gate_unavailable`):\nthe eval worker, the judge or the probe corpus errored, so nothing\nabout the agent was judged. This is OURS, and the only publish failure\na caller waits out: not a verdict on the configuration, retry after\n`Retry-After`. `error.details` lists the cases that could not run. A\ncheck that could not run because of the agent's own configuration is\nthe `422 agent_publish_gate_tool_unreachable` instead.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishFlowRequest"}}}}}},"/v1/agents/{agent_id}/flow/rollback":{"post":{"operationId":"rollback","summary":"Roll Back Agent Flow","description":"Publish a prior flow version as the active graph.","tags":["flow"],"parameters":[{"name":"agent_id","in":"path","description":"Prefixed agent id.","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The flow version that is now active.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowVersion"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The behavioral-eval publish gate refused the rollback, on one of two\ncodes the caller can FIX (neither is waited out):\n\n- `agent_publish_gate_failed`: the target version did not pass the\n agent's configured suite. `error.details` carries the verdict.\n- `agent_publish_gate_tool_unreachable`: the checks never ran because\n a tool the agent is attached to could not be reached;\n `error.message` names the tool, the endpoint and the reason.\n\nThe one rollback failure that IS waited out is the `503`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The gate's checks could not run on the rollback target\n(`agent_publish_gate_unavailable`): the eval worker, the judge or\nthe probe corpus errored, so nothing about the version was judged.\nThis is OURS, and the only rollback failure a caller waits out: not a\nverdict on it, retry after `Retry-After`. `error.details` lists the\ncases that could not run. A check that could not run because of the\nagent's own configuration is the `422\nagent_publish_gate_tool_unreachable` instead.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RollbackFlowRequest"}}}}}},"/v1/agents/{agent_id}/flow/deactivate":{"post":{"operationId":"deactivate","summary":"Deactivate Agent Flow","description":"Deactivate the agent's published flow so the agent runs the synthesized default flow.","tags":["flow"],"parameters":[{"name":"agent_id","in":"path","description":"Prefixed agent id.","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"204":{"description":"Flow deactivated.","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/agents/{agent_id}/flow/draft":{"delete":{"operationId":"discardDraft","summary":"Discard Agent Flow Draft","description":"Discard the agent's unpublished draft flow graph.","tags":["flow"],"parameters":[{"name":"agent_id","in":"path","description":"Prefixed agent id.","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"204":{"description":"Draft discarded.","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/agents/{agent_id}/flow/versions":{"get":{"operationId":"listVersions","summary":"List Agent Flow Versions","description":"List every published flow version for the agent, newest first.\nCursor-paginated: omit `cursor` for the first page; walk pages\nwhile `has_more` is true (default page size 50, max 200).","tags":["flow"],"parameters":[{"name":"agent_id","in":"path","description":"Prefixed agent id.","required":true,"schema":{"type":"string"}},{"name":"cursor","in":"query","description":"Opaque pagination cursor from a previous response.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Max items per page (default 50, max 200).","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The agent's flow version history.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListFlowVersionsResponse"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/agents/{agent_id}/flow/versions/{version_id}":{"get":{"operationId":"getVersion","summary":"Get Agent Flow Version","description":"Return the full flow graph for a specific published version.","tags":["flow"],"parameters":[{"name":"agent_id","in":"path","description":"Prefixed agent id.","required":true,"schema":{"type":"string"}},{"name":"version_id","in":"path","description":"Prefixed flow version id (`fver_...`).","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested flow version's graph.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowGraph"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/agents/flow/templates":{"get":{"operationId":"listTemplates","summary":"List Flow Templates","description":"List the reusable flow templates available to the workspace.\nCursor-paginated: omit `cursor` for the first page; walk pages\nwhile `has_more` is true (default page size 50, max 200).","tags":["flow"],"parameters":[{"name":"cursor","in":"query","description":"Opaque pagination cursor from a previous response.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Max items per page (default 50, max 200).","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The available flow templates.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListFlowTemplatesResponse"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createTemplate","summary":"Create Flow Template","description":"Create a reusable flow template from a graph.","tags":["flow"],"parameters":[{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"201":{"description":"The created flow template.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowTemplate"}}}},"400":{"description":"Flow validation failed (or the request body was undecodable). The\nstandard `Error` envelope plus an `issues` array locating each problem\nfor the editor. See the `FlowValidationError` schema.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowValidationError"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The request conflicts with the current resource state - e.g.\nduplicate, optimistic-concurrency mismatch, or last-owner\nguard.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFlowTemplateRequest"}}}}}},"/v1/agents/flow/templates/{flow_template_id}":{"get":{"operationId":"getTemplate","summary":"Get Flow Template","description":"Retrieve a flow template by id.","tags":["flow"],"parameters":[{"name":"flow_template_id","in":"path","description":"Flow template id (prefixed external id, `tmpl_...`).","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested flow template.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowTemplate"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"updateTemplate","summary":"Update Flow Template","description":"Replace a flow template. The whole template is replaced, not patched field-by-field.","tags":["flow"],"parameters":[{"name":"flow_template_id","in":"path","description":"Flow template id (prefixed external id, `tmpl_...`).","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated flow template.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowTemplate"}}}},"400":{"description":"Flow validation failed (or the request body was undecodable). The\nstandard `Error` envelope plus an `issues` array locating each problem\nfor the editor. See the `FlowValidationError` schema.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowValidationError"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The request conflicts with the current resource state - e.g.\nduplicate, optimistic-concurrency mismatch, or last-owner\nguard.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFlowTemplateRequest"}}}}},"delete":{"operationId":"deleteTemplate","summary":"Delete Flow Template","description":"Delete a flow template.","tags":["flow"],"parameters":[{"name":"flow_template_id","in":"path","description":"Flow template id (prefixed external id, `tmpl_...`).","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"204":{"description":"Template deleted.","content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/agents/flow/templates/{flow_template_id}/clone":{"post":{"operationId":"cloneTemplate","summary":"Clone Flow Template","description":"Clone a flow template onto an agent as a new draft graph.","tags":["flow"],"parameters":[{"name":"flow_template_id","in":"path","description":"Flow template id (prefixed external id, `tmpl_...`).","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The agent's new draft graph.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowGraph"}}}},"400":{"description":"Flow validation failed (or the request body was undecodable). The\nstandard `Error` envelope plus an `issues` array locating each problem\nfor the editor. See the `FlowValidationError` schema.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowValidationError"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The request conflicts with the current resource state - e.g.\nduplicate, optimistic-concurrency mismatch, or last-owner\nguard.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"An unexpected server-side error occurred. Safe to retry with\nexponential backoff for idempotent requests.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloneFlowTemplateRequest"}}}}}},"/v1/agents/{agent_id}/evaluation-config":{"get":{"operationId":"getEvaluationConfig","summary":"Get Evaluation Config","description":"Retrieve the agent's post-call evaluation criteria + data-collection config.","tags":["agent"],"parameters":[{"name":"agent_id","in":"path","description":"Agent id (prefixed external id, `agent_...`).","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The evaluation config for the agent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationConfig"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"updateEvaluationConfig","summary":"Update Evaluation Config","description":"Replace the agent's evaluation criteria + data-collection fields.","tags":["agent"],"parameters":[{"name":"agent_id","in":"path","description":"Agent id (prefixed external id, `agent_...`).","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated evaluation config.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationConfig"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEvaluationConfigRequest"}}}}}},"/v1/agents/{agent_id}/variables":{"get":{"operationId":"getDynamicVariables","summary":"Get Dynamic Variables","description":"Retrieve the agent's customer-scope dynamic variables and the read-only\ncatalogue of reserved `system__*` keys. The system variables list is\nprovided so editor UIs can render the reference list without maintaining\na client-side copy of the catalogue.\n","tags":["agent"],"parameters":[{"name":"agent_id","in":"path","description":"Agent id (prefixed external id, `agent_...`).","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The agent's variable catalogue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListDynamicVariablesResponse"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"updateDynamicVariables","summary":"Update Dynamic Variables","description":"Replace the agent's customer-scope dynamic variable definitions.\nThe supplied list overwrites the stored list wholesale (same\nsemantics as `updateEvaluationConfig`). Pass an empty array to\nclear all variables. Up to 20 variables per agent. Keys must\nmatch `[a-zA-Z0-9_]+` and must not start with the reserved\n`system__` prefix.\n","tags":["agent"],"parameters":[{"name":"agent_id","in":"path","description":"Agent id (prefixed external id, `agent_...`).","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The updated variable catalogue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListDynamicVariablesResponse"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDynamicVariablesRequest"}}}}}},"/v1/agents/{agent_id}/conversations":{"post":{"operationId":"createConversation","summary":"Create Conversation","description":"Start a new voice conversation with the agent. Returns a realtime\nvoice session + short-lived client token so the caller can\nconnect the audio pipeline directly. The agent is dispatched\nserver-side; no additional client action required.\n\nPass `dynamic_variables` to supply per-session values that override\nthe agent's stored variable defaults for this one conversation.\nKeys in the `system__` namespace are rejected at this boundary.\n\nPass `user_identity` as the stable caller key your application uses\nfor memory and caller correlation. It is kept separate from the\nopaque, per-session realtime participant identity.\n\n`overrides.voice_id` replaces the configured voice for the entire\nconversation, including every configured language the voice can\nserve. The request is rejected when the voice is unavailable or\ncannot cover the agent's configured language set; the rejection\nnames `overrides.voice_id` in the error envelope's `fields` map.\nThe override belongs to this conversation only: if the call is\ntransferred to another agent mid-conversation, that agent speaks\nwith its own configured voice.\n","tags":["agent"],"parameters":[{"name":"agent_id","in":"path","description":"Agent id (prefixed external id, `agent_...`).","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","description":"A client-generated key (an opaque string, max 255 chars) that makes a\nside-effect POST safe to retry: the server runs the operation exactly\nonce and replays the first response (its status and body) for 24 hours.\nReusing a key with a different request body, or while the first request\nis still in flight, returns `409 idempotency_conflict`. A replayed\nresponse carries the `Idempotent-Replayed: true` header.\n","required":false,"schema":{"type":"string","maxLength":255}}],"responses":{"201":{"description":"The created conversation with its realtime session token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConversationResponse"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The request conflicts with the current resource state - e.g.\nduplicate, optimistic-concurrency mismatch, or last-owner\nguard.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConversationRequest"}}}}}},"/v1/agents/{agent_id}/sessions":{"post":{"operationId":"createSession","summary":"Create Session","description":"Mint a realtime voice session for the given agent. Widget-friendly\ncounterpart to `createConversation` \u2014 same response shape, dual\nauthentication:\n\n* **Authenticated (Bearer)**: works for any agent the caller\n owns. Typical server-to-server flow where the embedding\n site's backend mints a token and hands it to the browser so\n the API key never reaches the client.\n* **Unauthenticated**: works only when `agent.is_public = true`\n AND the request's `Origin` header matches `agent.allowed_origins`\n (or that list is empty). When `agent.hostname_allowlist` is\n non-empty, the `Origin` hostname must additionally be a\n member of that list. Used directly by the\n `` web component.\n\nResponds with the same `CreateConversationResponse` as\n`createConversation`.\n\n`Idempotency-Key` replay is scoped to the authenticated caller, so it\napplies to Bearer requests only: an unauthenticated mint has no scope\nto replay under, and retrying one mints a fresh session.\n","tags":["agent"],"parameters":[{"name":"agent_id","in":"path","description":"Agent id (prefixed external id, `agent_...`).","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","description":"A client-generated key (an opaque string, max 255 chars) that makes a\nside-effect POST safe to retry: the server runs the operation exactly\nonce and replays the first response (its status and body) for 24 hours.\nReusing a key with a different request body, or while the first request\nis still in flight, returns `409 idempotency_conflict`. A replayed\nresponse carries the `Idempotent-Replayed: true` header.\n","required":false,"schema":{"type":"string","maxLength":255}}],"responses":{"201":{"description":"The created session with its realtime token + URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConversationResponse"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"The workspace has insufficient credits, or the request needs a\nplan tier the workspace is not on (e.g. voice cloning). Distinct\nfrom `Forbidden` so SDK consumers can drive upgrade UX.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The credential authenticated, but is not authorised for this\nresource - typically a workspace-role gate (owner / admin\nrequired) or a cross-tenant access attempt.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The request conflicts with the current resource state - e.g.\nduplicate, optimistic-concurrency mismatch, or last-owner\nguard.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit or concurrency limit exceeded. `error.code` says which\nceiling, and they need different responses: `rate_limited` is the\nrequest-rate budget (slow down), `concurrency_limit_reached` is a\nworkspace-wide concurrency ceiling (fewer at once, or raise it), and\n`conversation_turn_in_progress` is contention over one named\nconversation (keep one message in flight on it). Every 429 carries\n`Retry-After` and the request-rate budget headers; the active-call cap\nalso carries `RateLimit-Remaining-Calls: 0`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSessionRequest"}}}}}},"/v1/agents/conversations":{"get":{"operationId":"list","summary":"List Conversations","description":"List conversations owned by the caller, ordered by most recent.\nCursor-paginated: omit `cursor` to fetch the first page; pass the\nprevious response's `next_cursor` back to fetch the next page.\nWalk pages while `has_more` is true.\n\n`project_id` matches the project the call was DISPATCHED under, which\nis frozen when the conversation starts. Moving an agent to another\nproject therefore leaves its past calls attributed where they ran, the\nsame way per-project usage reports them.","tags":["conversations"],"parameters":[{"name":"cursor","in":"query","description":"Opaque pagination cursor from a previous response.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Max items per page (default 50, max 200).","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"agent_id","in":"query","description":"Filter to conversations for this agent.","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","description":"Filter by conversation status.","required":false,"schema":{"$ref":"#/components/schemas/ConversationStatus"}},{"name":"transport","in":"query","description":"Filter by transport.","required":false,"schema":{"$ref":"#/components/schemas/ConversationTransport"}},{"name":"caller_identity","in":"query","description":"Filter by caller identity.","required":false,"schema":{"type":"string"}},{"name":"contact_id","in":"query","description":"Narrow to one person's conversations, whichever agent or channel\nreached them. Prefixed `contact_...` id.\n","required":false,"schema":{"type":"string"}},{"name":"q","in":"query","description":"Free-text search across conversation content.","required":false,"schema":{"type":"string"}},{"name":"started_after","in":"query","description":"Only conversations started at or after this RFC 3339 timestamp.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"started_before","in":"query","description":"Only conversations started at or before this RFC 3339 timestamp.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"duration_min_ms","in":"query","description":"Minimum conversation duration in milliseconds.","required":false,"schema":{"type":"integer"}},{"name":"duration_max_ms","in":"query","description":"Maximum conversation duration in milliseconds.","required":false,"schema":{"type":"integer"}},{"name":"project_id","in":"query","description":"Filter by workspace project: omit for every project you can reach,\npass the literal `default` for resources in the implicit Default\nproject only, or a `proj_...` id for that project's resources.\nReturns 404 project_not_found for a malformed id and for any filter\noutside your reach: a project-pinned API key or service-account key\nreaches only its pinned project, and a member holding project grants\nreaches only the granted projects, so neither can name `default`.\nThat 404 is the same in every case and does not reveal whether such\na project exists - outside your reach a project is answered as\nnonexistent, never as forbidden. Inside it, a well-formed id that\nmatches no project yields an empty page.\n","required":false,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"A list of conversations.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListConversationsResponse"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/agents/conversations/{conversation_id}":{"get":{"operationId":"get","summary":"Get Conversation","description":"Retrieve a conversation by ID.","tags":["conversations"],"parameters":[{"name":"conversation_id","in":"path","description":"Conversation id (prefixed external id, `conv_...`).","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested conversation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Conversation"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/agents/conversations/recent-callees":{"get":{"operationId":"recent_callees","summary":"List recent callees","description":"Distinct phone numbers the caller's workspace has dialled on\noutbound calls, ordered by most recent. Feeds the batch-calls\ncomposer's \"Suggested from history\" surface. Cursor-paginated:\nomit `cursor` to fetch the first page. Default page size is 50\nand max is 200. Walk pages while `has_more` is true.\n","tags":["conversations"],"parameters":[{"name":"cursor","in":"query","description":"Opaque pagination cursor from a previous response.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Max items per page (default 50, max 200).","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Recent callees for the caller's workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListRecentCalleesResponse"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/agents/conversations/stats":{"get":{"operationId":"stats","summary":"Conversation stats","description":"Aggregated counts and averages over the caller's conversations, scoped\nby the same filters as the list endpoint, `project_id` included.","tags":["conversations"],"parameters":[{"name":"agent_id","in":"query","description":"Filter to conversations for this agent.","required":false,"schema":{"type":"string"}},{"name":"status","in":"query","description":"Filter by conversation status.","required":false,"schema":{"$ref":"#/components/schemas/ConversationStatus"}},{"name":"transport","in":"query","description":"Filter by transport.","required":false,"schema":{"$ref":"#/components/schemas/ConversationTransport"}},{"name":"caller_identity","in":"query","description":"Filter by caller identity.","required":false,"schema":{"type":"string"}},{"name":"contact_id","in":"query","description":"Narrow to one person's conversations, whichever agent or channel\nreached them. Prefixed `contact_...` id.\n","required":false,"schema":{"type":"string"}},{"name":"q","in":"query","description":"Free-text search across conversation content.","required":false,"schema":{"type":"string"}},{"name":"started_after","in":"query","description":"Only conversations started at or after this RFC 3339 timestamp.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"started_before","in":"query","description":"Only conversations started at or before this RFC 3339 timestamp.","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"duration_min_ms","in":"query","description":"Minimum conversation duration in milliseconds.","required":false,"schema":{"type":"integer"}},{"name":"duration_max_ms","in":"query","description":"Maximum conversation duration in milliseconds.","required":false,"schema":{"type":"integer"}},{"name":"project_id","in":"query","description":"Filter by workspace project: omit for every project you can reach,\npass the literal `default` for resources in the implicit Default\nproject only, or a `proj_...` id for that project's resources.\nReturns 404 project_not_found for a malformed id and for any filter\noutside your reach: a project-pinned API key or service-account key\nreaches only its pinned project, and a member holding project grants\nreaches only the granted projects, so neither can name `default`.\nThat 404 is the same in every case and does not reveal whether such\na project exists - outside your reach a project is answered as\nnonexistent, never as forbidden. Inside it, a well-formed id that\nmatches no project yields an empty page.\n","required":false,"schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Stats for the matched conversations.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationStats"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/agents/conversations/{conversation_id}/messages":{"get":{"operationId":"listMessages","summary":"List Messages","description":"Retrieve the transcript for a conversation in started_at order\n(oldest first). Cursor-paginated: omit `cursor` to fetch the\nfirst page. Default page size is 50 and max is 200. Walk pages\nwhile `has_more` is true.","tags":["conversations"],"parameters":[{"name":"conversation_id","in":"path","description":"Conversation id (prefixed external id, `conv_...`).","required":true,"schema":{"type":"string"}},{"name":"cursor","in":"query","description":"Opaque pagination cursor from a previous response.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Max items per page (default 50, max 200).","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"Authorization","in":"header","description":"Enter your API key with the `Bearer` prefix, e.g. 'Bearer sk_...'.","required":true,"schema":{"type":"string"}},{"name":"Speechify-Version","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The messages for the conversation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListMessagesResponse"}}}},"400":{"description":"The request was malformed or failed validation. The response\nbody is the standard `Error` envelope; for validation\nfailures `error.fields` enumerates the offending fields as\na `path -> message` map (code = `validation_failed`).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Authentication is missing or invalid. The request did not\ncarry a recognised credential (console session token, API key,\nor worker JWT).\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The referenced resource does not exist or is not visible to\nthe caller's workspace.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/agents/conversations/{conversation_id}/recording":{"get":{"operationId":"streamRecording","summary":"Stream Recording","description":"Proxy the GCS-stored audio recording for a conversation through\nthe Cloud Run service identity. Returns OGG/Opus bytes (LiveKit\nroom-composite egress default). The response is streamed so a\nlong recording does not buffer in memory; `