From 53959b6fd14b3ca58c92f4d8fb9506f3afb43991 Mon Sep 17 00:00:00 2001 From: fern-api <115122769+fern-api[bot]@users.noreply.github.com> Date: Fri, 4 Apr 2025 20:07:40 +0000 Subject: [PATCH] SDK regeneration --- .mock/definition/empathic-voice/chat.yml | 32 +- .mock/definition/empathic-voice/configs.yml | 7 + .../empathic-voice/customVoices.yml | 3 + .mock/definition/empathic-voice/prompts.yml | 1 + .mock/definition/empathic-voice/tools.yml | 2 + .../batch/__package__.yml | 137 +++--- .../expression-measurement/stream/stream.yml | 412 ++++++++-------- .mock/definition/tts/__package__.yml | 90 ++-- .mock/definition/tts/voices.yml | 12 +- .mock/fern.config.json | 2 +- poetry.lock | 438 +++++++++--------- pyproject.toml | 2 +- reference.md | 52 ++- src/hume/empathic_voice/configs/client.py | 100 +++- .../empathic_voice/custom_voices/client.py | 50 +- src/hume/tts/client.py | 32 +- src/hume/tts/types/audio_encoding.py | 6 +- src/hume/tts/types/posted_tts.py | 4 +- src/hume/tts/types/posted_utterance.py | 6 +- src/hume/tts/types/return_generation.py | 2 +- src/hume/tts/types/return_paged_voices.py | 29 +- src/hume/tts/voices/client.py | 52 ++- tests/empathic_voice/test_configs.py | 290 +----------- tests/empathic_voice/test_custom_voices.py | 45 -- tests/tts/test_root.py | 20 +- tests/tts/test_voices.py | 23 +- 26 files changed, 883 insertions(+), 966 deletions(-) diff --git a/.mock/definition/empathic-voice/chat.yml b/.mock/definition/empathic-voice/chat.yml index 6d9d6ac5..ee5e412a 100644 --- a/.mock/definition/empathic-voice/chat.yml +++ b/.mock/definition/empathic-voice/chat.yml @@ -113,12 +113,12 @@ channel: For more details, refer to the [Authentication Strategies Guide](/docs/introduction/api-key#authentication-strategies). messages: - publish: - origin: client - body: PublishEvent subscribe: origin: server body: SubscribeEvent + publish: + origin: client + body: PublishEvent examples: - messages: - type: publish @@ -131,19 +131,6 @@ channel: imports: root: __package__.yml types: - PublishEvent: - discriminated: false - union: - - type: root.AudioInput - - type: root.SessionSettings - - type: root.UserInput - - type: root.AssistantInput - - type: root.ToolResponseMessage - - type: root.ToolErrorMessage - - type: root.PauseAssistantMessage - - type: root.ResumeAssistantMessage - source: - openapi: evi-asyncapi.json SubscribeEvent: discriminated: false union: @@ -159,3 +146,16 @@ types: - type: root.ToolErrorMessage source: openapi: evi-asyncapi.json + PublishEvent: + discriminated: false + union: + - type: root.AudioInput + - type: root.SessionSettings + - type: root.UserInput + - type: root.AssistantInput + - type: root.ToolResponseMessage + - type: root.ToolErrorMessage + - type: root.PauseAssistantMessage + - type: root.ResumeAssistantMessage + source: + openapi: evi-asyncapi.json diff --git a/.mock/definition/empathic-voice/configs.yml b/.mock/definition/empathic-voice/configs.yml index 04623260..b898f400 100644 --- a/.mock/definition/empathic-voice/configs.yml +++ b/.mock/definition/empathic-voice/configs.yml @@ -15,6 +15,9 @@ service: For more details on configuration options and how to configure EVI, see our [configuration guide](/docs/empathic-voice-interface-evi/configuration). + pagination: + offset: $request.page_number + results: $response.configs_page source: openapi: evi-openapi.json display-name: List configs @@ -315,6 +318,9 @@ service: For more details on configuration options and how to configure EVI, see our [configuration guide](/docs/empathic-voice-interface-evi/configuration). + pagination: + offset: $request.page_number + results: $response.configs_page source: openapi: evi-openapi.json path-parameters: @@ -658,6 +664,7 @@ service: response: docs: Success type: text + status-code: 200 errors: - root.BadRequestError examples: diff --git a/.mock/definition/empathic-voice/customVoices.yml b/.mock/definition/empathic-voice/customVoices.yml index 69bda935..95993761 100644 --- a/.mock/definition/empathic-voice/customVoices.yml +++ b/.mock/definition/empathic-voice/customVoices.yml @@ -15,6 +15,9 @@ service: Refer to our [voices guide](/docs/empathic-voice-interface-evi/configuration/voices) for details on creating a custom voice. + pagination: + offset: $request.page_number + results: $response.custom_voices_page source: openapi: evi-openapi.json display-name: List custom voices diff --git a/.mock/definition/empathic-voice/prompts.yml b/.mock/definition/empathic-voice/prompts.yml index ad364ad5..9b00c47d 100644 --- a/.mock/definition/empathic-voice/prompts.yml +++ b/.mock/definition/empathic-voice/prompts.yml @@ -377,6 +377,7 @@ service: response: docs: Success type: text + status-code: 200 errors: - root.BadRequestError examples: diff --git a/.mock/definition/empathic-voice/tools.yml b/.mock/definition/empathic-voice/tools.yml index 1a0964bf..c926e230 100644 --- a/.mock/definition/empathic-voice/tools.yml +++ b/.mock/definition/empathic-voice/tools.yml @@ -427,6 +427,8 @@ service: content-type: application/json response: docs: Success + type: text + status-code: 200 errors: - root.BadRequestError examples: diff --git a/.mock/definition/expression-measurement/batch/__package__.yml b/.mock/definition/expression-measurement/batch/__package__.yml index f30d724e..ba54b175 100644 --- a/.mock/definition/expression-measurement/batch/__package__.yml +++ b/.mock/definition/expression-measurement/batch/__package__.yml @@ -1295,176 +1295,169 @@ types: source: openapi: batch-openapi.json Source: - discriminated: false + discriminant: type + base-properties: {} union: - - SourceUrl - - SourceFile - - SourceTextSource + url: SourceUrl + file: SourceFile + text: SourceTextSource source: openapi: batch-openapi.json SourceFile: - properties: - type: literal<"file"> + properties: {} extends: - File source: openapi: batch-openapi.json SourceTextSource: - properties: - type: literal<"text"> + properties: {} source: openapi: batch-openapi.json SourceUrl: - properties: - type: literal<"url"> + properties: {} extends: - Url source: openapi: batch-openapi.json + Url: + properties: + url: + type: string + docs: The URL of the source media file. + source: + openapi: batch-openapi.json StateEmbeddingGeneration: - discriminated: false + discriminant: status + base-properties: {} union: - - StateEmbeddingGenerationQueued - - StateEmbeddingGenerationInProgress - - StateEmbeddingGenerationCompletedEmbeddingGeneration - - StateEmbeddingGenerationFailed + QUEUED: StateEmbeddingGenerationQueued + IN_PROGRESS: StateEmbeddingGenerationInProgress + COMPLETED: StateEmbeddingGenerationCompletedEmbeddingGeneration + FAILED: StateEmbeddingGenerationFailed source: openapi: batch-openapi.json StateEmbeddingGenerationCompletedEmbeddingGeneration: - properties: - status: literal<"COMPLETED"> + properties: {} extends: - CompletedEmbeddingGeneration source: openapi: batch-openapi.json StateEmbeddingGenerationFailed: - properties: - status: literal<"FAILED"> + properties: {} extends: - Failed source: openapi: batch-openapi.json StateEmbeddingGenerationInProgress: - properties: - status: literal<"IN_PROGRESS"> + properties: {} extends: - InProgress source: openapi: batch-openapi.json StateEmbeddingGenerationQueued: - properties: - status: literal<"QUEUED"> + properties: {} extends: - Queued source: openapi: batch-openapi.json StateInference: - discriminated: false + discriminant: status + base-properties: {} union: - - QueuedState - - InProgressState - - CompletedState - - FailedState + QUEUED: QueuedState + IN_PROGRESS: InProgressState + COMPLETED: CompletedState + FAILED: FailedState source: openapi: batch-openapi.json CompletedState: - properties: - status: literal<"COMPLETED"> + properties: {} extends: - CompletedInference source: openapi: batch-openapi.json FailedState: - properties: - status: literal<"FAILED"> + properties: {} extends: - Failed source: openapi: batch-openapi.json InProgressState: - properties: - status: literal<"IN_PROGRESS"> + properties: {} extends: - InProgress source: openapi: batch-openapi.json QueuedState: - properties: - status: literal<"QUEUED"> + properties: {} extends: - Queued source: openapi: batch-openapi.json StateTlInference: - discriminated: false + discriminant: status + base-properties: {} union: - - StateTlInferenceQueued - - StateTlInferenceInProgress - - StateTlInferenceCompletedTlInference - - StateTlInferenceFailed + QUEUED: StateTlInferenceQueued + IN_PROGRESS: StateTlInferenceInProgress + COMPLETED: StateTlInferenceCompletedTlInference + FAILED: StateTlInferenceFailed source: openapi: batch-openapi.json StateTlInferenceCompletedTlInference: - properties: - status: literal<"COMPLETED"> + properties: {} extends: - CompletedTlInference source: openapi: batch-openapi.json StateTlInferenceFailed: - properties: - status: literal<"FAILED"> + properties: {} extends: - Failed source: openapi: batch-openapi.json StateTlInferenceInProgress: - properties: - status: literal<"IN_PROGRESS"> + properties: {} extends: - InProgress source: openapi: batch-openapi.json StateTlInferenceQueued: - properties: - status: literal<"QUEUED"> + properties: {} extends: - Queued source: openapi: batch-openapi.json StateTraining: - discriminated: false + discriminant: status + base-properties: {} union: - - StateTrainingQueued - - StateTrainingInProgress - - StateTrainingCompletedTraining - - StateTrainingFailed + QUEUED: StateTrainingQueued + IN_PROGRESS: StateTrainingInProgress + COMPLETED: StateTrainingCompletedTraining + FAILED: StateTrainingFailed source: openapi: batch-openapi.json StateTrainingCompletedTraining: - properties: - status: literal<"COMPLETED"> + properties: {} extends: - CompletedTraining source: openapi: batch-openapi.json StateTrainingFailed: - properties: - status: literal<"FAILED"> + properties: {} extends: - Failed source: openapi: batch-openapi.json StateTrainingInProgress: - properties: - status: literal<"IN_PROGRESS"> + properties: {} extends: - InProgress source: openapi: batch-openapi.json StateTrainingQueued: - properties: - status: literal<"QUEUED"> + properties: {} extends: - Queued source: @@ -1516,20 +1509,19 @@ types: source: openapi: batch-openapi.json Task: - discriminated: false + discriminant: type + base-properties: {} union: - - TaskClassification - - TaskRegression + classification: TaskClassification + regression: TaskRegression source: openapi: batch-openapi.json TaskClassification: - properties: - type: literal<"classification"> + properties: {} source: openapi: batch-openapi.json TaskRegression: - properties: - type: literal<"regression"> + properties: {} source: openapi: batch-openapi.json TextSource: map @@ -1774,13 +1766,6 @@ types: source: openapi: batch-openapi.json UnionPredictResult: InferenceSourcePredictResult - Url: - properties: - url: - type: string - docs: The URL of the source media file. - source: - openapi: batch-openapi.json ValidationArgs: properties: positive_label: optional diff --git a/.mock/definition/expression-measurement/stream/stream.yml b/.mock/definition/expression-measurement/stream/stream.yml index bdb6f041..1ed74b71 100644 --- a/.mock/definition/expression-measurement/stream/stream.yml +++ b/.mock/definition/expression-measurement/stream/stream.yml @@ -7,14 +7,14 @@ channel: type: string name: humeApiKey messages: + subscribe: + origin: server + body: SubscribeEvent publish: origin: client body: type: StreamModelsEndpointPayload docs: Models endpoint payload - subscribe: - origin: server - body: SubscribeEvent examples: - messages: - type: publish @@ -22,209 +22,6 @@ channel: - type: subscribe body: {} types: - StreamFace: - docs: > - Configuration for the facial expression emotion model. - - - Note: Using the `reset_stream` parameter does not have any effect on face - identification. A single face identifier cache is maintained over a full - session whether `reset_stream` is used or not. - properties: - facs: - type: optional> - docs: >- - Configuration for FACS predictions. If missing or null, no FACS - predictions will be generated. - descriptions: - type: optional> - docs: >- - Configuration for Descriptions predictions. If missing or null, no - Descriptions predictions will be generated. - identify_faces: - type: optional - docs: > - Whether to return identifiers for faces across frames. If true, unique - identifiers will be assigned to face bounding boxes to differentiate - different faces. If false, all faces will be tagged with an "unknown" - ID. - default: false - fps_pred: - type: optional - docs: > - Number of frames per second to process. Other frames will be omitted - from the response. - default: 3 - prob_threshold: - type: optional - docs: > - Face detection probability threshold. Faces detected with a - probability less than this threshold will be omitted from the - response. - default: 3 - min_face_size: - type: optional - docs: > - Minimum bounding box side length in pixels to treat as a face. Faces - detected with a bounding box side length in pixels less than this - threshold will be omitted from the response. - default: 3 - source: - openapi: streaming-asyncapi.yml - inline: true - StreamLanguage: - docs: Configuration for the language emotion model. - properties: - sentiment: - type: optional> - docs: >- - Configuration for sentiment predictions. If missing or null, no - sentiment predictions will be generated. - toxicity: - type: optional> - docs: >- - Configuration for toxicity predictions. If missing or null, no - toxicity predictions will be generated. - granularity: - type: optional - docs: >- - The granularity at which to generate predictions. Values are `word`, - `sentence`, `utterance`, or `passage`. To get a single prediction for - the entire text of your streaming payload use `passage`. Default value - is `word`. - source: - openapi: streaming-asyncapi.yml - inline: true - Config: - docs: > - Configuration used to specify which models should be used and with what - settings. - properties: - burst: - type: optional> - docs: | - Configuration for the vocal burst emotion model. - - Note: Model configuration is not currently available in streaming. - - Please use the default configuration by passing an empty object `{}`. - face: - type: optional - docs: > - Configuration for the facial expression emotion model. - - - Note: Using the `reset_stream` parameter does not have any effect on - face identification. A single face identifier cache is maintained over - a full session whether `reset_stream` is used or not. - facemesh: - type: optional> - docs: | - Configuration for the facemesh emotion model. - - Note: Model configuration is not currently available in streaming. - - Please use the default configuration by passing an empty object `{}`. - language: - type: optional - docs: Configuration for the language emotion model. - prosody: - type: optional> - docs: | - Configuration for the speech prosody emotion model. - - Note: Model configuration is not currently available in streaming. - - Please use the default configuration by passing an empty object `{}`. - source: - openapi: streaming-asyncapi.yml - inline: true - StreamModelsEndpointPayload: - docs: Models endpoint payload - properties: - data: - type: optional - models: - type: optional - docs: > - Configuration used to specify which models should be used and with - what settings. - stream_window_ms: - type: optional - docs: > - Length in milliseconds of streaming sliding window. - - - Extending the length of this window will prepend media context from - past payloads into the current payload. - - - For example, if on the first payload you send 500ms of data and on the - second payload you send an additional 500ms of data, a window of at - least 1000ms will allow the model to process all 1000ms of stream - data. - - - A window of 600ms would append the full 500ms of the second payload to - the last 100ms of the first payload. - - - Note: This feature is currently only supported for audio data and - audio models. For other file types and models this parameter will be - ignored. - default: 5000 - validation: - min: 500 - max: 10000 - reset_stream: - type: optional - docs: > - Whether to reset the streaming sliding window before processing the - current payload. - - - If this parameter is set to `true` then past context will be deleted - before processing the current payload. - - - Use reset_stream when one audio file is done being processed and you - do not want context to leak across files. - default: false - raw_text: - type: optional - docs: > - Set to `true` to enable the data parameter to be parsed as raw text - rather than base64 encoded bytes. - - This parameter is useful if you want to send text to be processed by - the language model, but it cannot be used with other file types like - audio, image, or video. - default: false - job_details: - type: optional - docs: > - Set to `true` to get details about the job. - - - This parameter can be set in the same payload as data or it can be set - without data and models configuration to get the job details between - payloads. - - - This parameter is useful to get the unique job ID. - default: false - payload_id: - type: optional - docs: > - Pass an arbitrary string as the payload ID and get it back at the top - level of the socket response. - - - This can be useful if you have multiple requests running - asynchronously and want to disambiguate responses as they are - received. - source: - openapi: streaming-asyncapi.yml StreamModelPredictionsJobDetails: docs: > If the job_details flag was set in the request, details about the current @@ -434,5 +231,208 @@ types: docs: Warning message source: openapi: streaming-asyncapi.yml + StreamFace: + docs: > + Configuration for the facial expression emotion model. + + + Note: Using the `reset_stream` parameter does not have any effect on face + identification. A single face identifier cache is maintained over a full + session whether `reset_stream` is used or not. + properties: + facs: + type: optional> + docs: >- + Configuration for FACS predictions. If missing or null, no FACS + predictions will be generated. + descriptions: + type: optional> + docs: >- + Configuration for Descriptions predictions. If missing or null, no + Descriptions predictions will be generated. + identify_faces: + type: optional + docs: > + Whether to return identifiers for faces across frames. If true, unique + identifiers will be assigned to face bounding boxes to differentiate + different faces. If false, all faces will be tagged with an "unknown" + ID. + default: false + fps_pred: + type: optional + docs: > + Number of frames per second to process. Other frames will be omitted + from the response. + default: 3 + prob_threshold: + type: optional + docs: > + Face detection probability threshold. Faces detected with a + probability less than this threshold will be omitted from the + response. + default: 3 + min_face_size: + type: optional + docs: > + Minimum bounding box side length in pixels to treat as a face. Faces + detected with a bounding box side length in pixels less than this + threshold will be omitted from the response. + default: 3 + source: + openapi: streaming-asyncapi.yml + inline: true + StreamLanguage: + docs: Configuration for the language emotion model. + properties: + sentiment: + type: optional> + docs: >- + Configuration for sentiment predictions. If missing or null, no + sentiment predictions will be generated. + toxicity: + type: optional> + docs: >- + Configuration for toxicity predictions. If missing or null, no + toxicity predictions will be generated. + granularity: + type: optional + docs: >- + The granularity at which to generate predictions. Values are `word`, + `sentence`, `utterance`, or `passage`. To get a single prediction for + the entire text of your streaming payload use `passage`. Default value + is `word`. + source: + openapi: streaming-asyncapi.yml + inline: true + Config: + docs: > + Configuration used to specify which models should be used and with what + settings. + properties: + burst: + type: optional> + docs: | + Configuration for the vocal burst emotion model. + + Note: Model configuration is not currently available in streaming. + + Please use the default configuration by passing an empty object `{}`. + face: + type: optional + docs: > + Configuration for the facial expression emotion model. + + + Note: Using the `reset_stream` parameter does not have any effect on + face identification. A single face identifier cache is maintained over + a full session whether `reset_stream` is used or not. + facemesh: + type: optional> + docs: | + Configuration for the facemesh emotion model. + + Note: Model configuration is not currently available in streaming. + + Please use the default configuration by passing an empty object `{}`. + language: + type: optional + docs: Configuration for the language emotion model. + prosody: + type: optional> + docs: | + Configuration for the speech prosody emotion model. + + Note: Model configuration is not currently available in streaming. + + Please use the default configuration by passing an empty object `{}`. + source: + openapi: streaming-asyncapi.yml + inline: true + StreamModelsEndpointPayload: + docs: Models endpoint payload + properties: + data: + type: optional + models: + type: optional + docs: > + Configuration used to specify which models should be used and with + what settings. + stream_window_ms: + type: optional + docs: > + Length in milliseconds of streaming sliding window. + + + Extending the length of this window will prepend media context from + past payloads into the current payload. + + + For example, if on the first payload you send 500ms of data and on the + second payload you send an additional 500ms of data, a window of at + least 1000ms will allow the model to process all 1000ms of stream + data. + + + A window of 600ms would append the full 500ms of the second payload to + the last 100ms of the first payload. + + + Note: This feature is currently only supported for audio data and + audio models. For other file types and models this parameter will be + ignored. + default: 5000 + validation: + min: 500 + max: 10000 + reset_stream: + type: optional + docs: > + Whether to reset the streaming sliding window before processing the + current payload. + + + If this parameter is set to `true` then past context will be deleted + before processing the current payload. + + + Use reset_stream when one audio file is done being processed and you + do not want context to leak across files. + default: false + raw_text: + type: optional + docs: > + Set to `true` to enable the data parameter to be parsed as raw text + rather than base64 encoded bytes. + + This parameter is useful if you want to send text to be processed by + the language model, but it cannot be used with other file types like + audio, image, or video. + default: false + job_details: + type: optional + docs: > + Set to `true` to get details about the job. + + + This parameter can be set in the same payload as data or it can be set + without data and models configuration to get the job details between + payloads. + + + This parameter is useful to get the unique job ID. + default: false + payload_id: + type: optional + docs: > + Pass an arbitrary string as the payload ID and get it back at the top + level of the socket response. + + + This can be useful if you have multiple requests running + asynchronously and want to disambiguate responses as they are + received. + source: + openapi: streaming-asyncapi.yml imports: streamRoot: __package__.yml diff --git a/.mock/definition/tts/__package__.yml b/.mock/definition/tts/__package__.yml index 5c7af469..12dfbf7b 100644 --- a/.mock/definition/tts/__package__.yml +++ b/.mock/definition/tts/__package__.yml @@ -69,15 +69,16 @@ service: file_size: 120192 encoding: format: mp3 - sample_rate: 24000 + sample_rate: 48000 audio: //PExAA0DDYRvkpNfhv3JI5JZ...etc. snippets: - - audio: //PExAA0DDYRvkpNfhv3JI5JZ...etc. + generation_id: 795c949a-1510-4a80-9646-7d0863b023ab id: 37b1b1b1-1b1b-1b1b-1b1b-1b1b1b1b1b1b text: >- Beauty is no quality in things themselves: It exists merely in the mind which contemplates them. - generation_id: 795c949a-1510-4a80-9646-7d0863b023ab + utterance_index: 0 request_id: 66e01f90-4501-4aa0-bbaf-74f45dc15aa725906 synthesize-file: path: /v0/tts/file @@ -221,13 +222,18 @@ types: source: openapi: tts-openapi.yml AudioEncoding: + docs: >- + Encoding information about the generated audio, including the `format` and + `sample_rate`. properties: format: type: AudioFormatType docs: Format for the output audio. sample_rate: type: integer - docs: Sample rate of the generated audio. + docs: >- + The sample rate (`Hz`) of the generated audio. The default sample rate + is `48000 Hz`. source: openapi: tts-openapi.yml AudioFormatType: @@ -260,9 +266,10 @@ types: multiple requests. snippets: docs: >- - A list of speech segments, each containing a portion of the original - text optimized for natural speech delivery. These segments represent - the input text divided into more natural-sounding units. + A list of snippet groups where each group corresponds to an utterance + in the request. Each group contains segmented snippets that represent + the original utterance divided into more natural-sounding units + optimized for speech delivery. type: list> source: openapi: tts-openapi.yml @@ -273,8 +280,7 @@ types: source: openapi: tts-openapi.yml FormatMp3: - properties: - type: literal<"mp3"> + properties: {} source: openapi: tts-openapi.yml PostedContext: @@ -290,15 +296,18 @@ types: openapi: tts-openapi.yml inline: true Format: - discriminated: false + discriminant: type + base-properties: {} docs: Specifies the output audio file format. union: - - type: FormatMp3 - - type: FormatPcm - - type: FormatWav + mp3: + type: FormatMp3 + pcm: + type: FormatPcm + wav: + type: FormatWav source: openapi: tts-openapi.yml - inline: true PostedTts: properties: context: @@ -338,7 +347,16 @@ types: as this can result in distorted output. default: true utterances: - docs: Utterances to be converted to speech output. + docs: >- + A list of **Utterances** to be converted to speech output. + + + An **Utterance** is a unit of input for + [Octave](/docs/text-to-speech-tts/overview), and includes input + `text`, an optional `description` to serve as the prompt for how the + speech should be delivered, an optional `voice` specification, and + additional controls to guide delivery for `speed` and + `trailing_silence`. type: list source: openapi: tts-openapi.yml @@ -378,8 +396,7 @@ types: source: openapi: tts-openapi.yml FormatPcm: - properties: - type: literal<"pcm"> + properties: {} source: openapi: tts-openapi.yml Snippet: @@ -438,12 +455,10 @@ types: accent'). - If a Voice is specified in the request, this description serves as - acting instructions. - - - If no Voice is specified, a new voice is generated based on this - description. - - See our [prompting guide](/docs/text-to-speech-tts/prompting) for tips on crafting your descriptions. + acting instructions. For tips on how to effectively guide speech + delivery, see our guide on [Acting + instructions](/docs/text-to-speech-tts/acting-instructions). + - If no Voice is specified, a new voice is generated based on this description. See our [prompting guide](/docs/text-to-speech-tts/prompting) for tips on designing a voice. validation: maxLength: 1000 speed: @@ -543,8 +558,7 @@ types: source: openapi: tts-openapi.yml FormatWav: - properties: - type: literal<"wav"> + properties: {} source: openapi: tts-openapi.yml ErrorResponse: @@ -557,9 +571,29 @@ types: ReturnPagedVoices: docs: A paginated list Octave voices available for text-to-speech properties: - page_number: optional - page_size: optional - total_pages: optional - voices_page: optional> + page_number: + type: optional + docs: >- + The page number of the returned list. + + + This value corresponds to the `page_number` parameter specified in the + request. Pagination uses zero-based indexing. + page_size: + type: optional + docs: >- + The maximum number of items returned per page. + + + This value corresponds to the `page_size` parameter specified in the + request. + total_pages: + type: optional + docs: The total number of pages in the collection. + voices_page: + type: optional> + docs: >- + List of voices returned for the specified `page_number` and + `page_size`. source: openapi: tts-openapi.yml diff --git a/.mock/definition/tts/voices.yml b/.mock/definition/tts/voices.yml index 8718b05c..7c4ee978 100644 --- a/.mock/definition/tts/voices.yml +++ b/.mock/definition/tts/voices.yml @@ -12,6 +12,9 @@ service: Lists voices in your **Voice Library**. Set provider to `HUME_AI` to list Hume's preset voices, or to `CUSTOM_VOICE` to a custom voice created in your account. + pagination: + offset: $request.page_number + results: $response.voices_page source: openapi: tts-openapi.yml display-name: List voices @@ -44,7 +47,8 @@ service: For example, if `page_size` is set to 10, each page will include up to 10 items. Defaults to 10. - ascending_order: optional + ascending_order: + type: optional response: docs: Success type: root.ReturnPagedVoices @@ -56,11 +60,16 @@ service: provider: CUSTOM_VOICE response: body: + page_number: 0 + page_size: 10 + total_pages: 1 voices_page: - name: David Hume id: c42352c0-4566-455d-b180-0f654b65b525 + provider: CUSTOM_VOICE - name: Goliath Hume id: d87352b0-26a3-4b11-081b-d157a5674d19 + provider: CUSTOM_VOICE create: path: /v0/tts/voices method: POST @@ -100,6 +109,7 @@ service: body: name: David Hume id: c42352c0-4566-455d-b180-0f654b65b525 + provider: CUSTOM_VOICE delete: path: /v0/tts/voices method: DELETE diff --git a/.mock/fern.config.json b/.mock/fern.config.json index 9d619049..a8152b41 100644 --- a/.mock/fern.config.json +++ b/.mock/fern.config.json @@ -1,4 +1,4 @@ { "organization" : "hume", - "version" : "0.57.14" + "version" : "0.56.23" } \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index e3c00e94..52ca0697 100644 --- a/poetry.lock +++ b/poetry.lock @@ -966,17 +966,17 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "json5" -version = "0.11.0" +version = "0.12.0" description = "A Python implementation of the JSON5 data format." optional = true python-versions = ">=3.8.0" files = [ - {file = "json5-0.11.0-py3-none-any.whl", hash = "sha256:19b10a65c82d1aefd389f92c13aeeb3c611c79e8d4f28442dfc153dd24f6f0ff"}, - {file = "json5-0.11.0.tar.gz", hash = "sha256:dab115459d9372760f2b568d949e069edd991f8e75458cff67328b9125750f12"}, + {file = "json5-0.12.0-py3-none-any.whl", hash = "sha256:6d37aa6c08b0609f16e1ec5ff94697e2cbbfbad5ac112afa05794da9ab7810db"}, + {file = "json5-0.12.0.tar.gz", hash = "sha256:0b4b6ff56801a1c7dc817b0241bca4ce474a0e6a163bfef3fc594d3fd263ff3a"}, ] [package.extras] -dev = ["build (==1.2.2.post1)", "coverage (==7.5.4)", "mypy (==1.14.1)", "pip (==25.0.1)", "pylint (==3.2.7)", "ruff (==0.11.2)", "twine (==6.1.0)", "uv (==0.6.11)"] +dev = ["build (==1.2.2.post1)", "coverage (==7.5.4)", "coverage (==7.8.0)", "mypy (==1.14.1)", "mypy (==1.15.0)", "pip (==25.0.1)", "pylint (==3.2.7)", "pylint (==3.3.6)", "ruff (==0.11.2)", "twine (==6.1.0)", "uv (==0.6.11)"] [[package]] name = "jsonpointer" @@ -1216,13 +1216,13 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.3.6" +version = "4.4.0" description = "JupyterLab computational environment" optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "jupyterlab-4.3.6-py3-none-any.whl", hash = "sha256:fc9eb0455562a56a9bd6d2977cf090842f321fa1a298fcee9bf8c19de353d5fd"}, - {file = "jupyterlab-4.3.6.tar.gz", hash = "sha256:2900ffdbfca9ed37c4ad7fdda3eb76582fd945d46962af3ac64741ae2d6b2ff4"}, + {file = "jupyterlab-4.4.0-py3-none-any.whl", hash = "sha256:61d33991fbb352cc7caac08bd0c34577fea86d8d5d9772600d9d5a6bcbc882c0"}, + {file = "jupyterlab-4.4.0.tar.gz", hash = "sha256:f1767d5f0104e40f3b4a63bf6892bbef8e4704dcabf0c78408a3bdc411792f04"}, ] [package.dependencies] @@ -1237,15 +1237,15 @@ jupyter-server = ">=2.4.0,<3" jupyterlab-server = ">=2.27.1,<3" notebook-shim = ">=0.2" packaging = "*" -setuptools = ">=40.8.0" +setuptools = ">=41.1.0" tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} tornado = ">=6.2.0" traitlets = "*" [package.extras] -dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.6.9)"] -docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<8.1.0)", "sphinx-copybutton"] -docs-screenshots = ["altair (==5.4.1)", "ipython (==8.16.1)", "ipywidgets (==8.1.5)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.2.post3)", "matplotlib (==3.9.2)", "nbconvert (>=7.0.0)", "pandas (==2.2.3)", "scipy (==1.14.1)", "vega-datasets (==0.9.0)"] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.9.9)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<8.2.0)", "sphinx-copybutton"] +docs-screenshots = ["altair (==5.5.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.5)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.3.post1)", "matplotlib (==3.10.0)", "nbconvert (>=7.0.0)", "pandas (==2.2.3)", "scipy (==1.15.1)", "vega-datasets (==0.9.0)"] test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] upgrade-extension = ["copier (>=9,<10)", "jinja2-time (<0.3)", "pydantic (<3.0)", "pyyaml-include (<3.0)", "tomli-w (<2.0)"] @@ -1602,26 +1602,26 @@ files = [ [[package]] name = "notebook" -version = "7.3.3" +version = "7.0.7" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = true python-versions = ">=3.8" files = [ - {file = "notebook-7.3.3-py3-none-any.whl", hash = "sha256:b193df0878956562d5171c8e25c9252b8e86c9fcc16163b8ee3fe6c5e3f422f7"}, - {file = "notebook-7.3.3.tar.gz", hash = "sha256:707a313fb882d35f921989eb3d204de942ed5132a44e4aa1fe0e8f24bb9dc25d"}, + {file = "notebook-7.0.7-py3-none-any.whl", hash = "sha256:289b606d7e173f75a18beb1406ef411b43f97f7a9c55ba03efa3622905a62346"}, + {file = "notebook-7.0.7.tar.gz", hash = "sha256:3bcff00c17b3ac142ef5f436d50637d936b274cfa0b41f6ac0175363de9b4e09"}, ] [package.dependencies] jupyter-server = ">=2.4.0,<3" -jupyterlab = ">=4.3.6,<4.4" -jupyterlab-server = ">=2.27.1,<3" +jupyterlab = ">=4.0.2,<5" +jupyterlab-server = ">=2.22.1,<3" notebook-shim = ">=0.2,<0.3" tornado = ">=6.2.0" [package.extras] dev = ["hatch", "pre-commit"] docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] +test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.22.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] [[package]] name = "notebook-shim" @@ -1822,18 +1822,18 @@ files = [ [[package]] name = "pydantic" -version = "2.11.1" +version = "2.11.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.9" files = [ - {file = "pydantic-2.11.1-py3-none-any.whl", hash = "sha256:5b6c415eee9f8123a14d859be0c84363fec6b1feb6b688d6435801230b56e0b8"}, - {file = "pydantic-2.11.1.tar.gz", hash = "sha256:442557d2910e75c991c39f4b4ab18963d57b9b55122c8b2a9cd176d8c29ce968"}, + {file = "pydantic-2.11.2-py3-none-any.whl", hash = "sha256:7f17d25846bcdf89b670a86cdfe7b29a9f1c9ca23dee154221c9aa81845cfca7"}, + {file = "pydantic-2.11.2.tar.gz", hash = "sha256:2138628e050bd7a1e70b91d4bf4a91167f4ad76fdb83209b107c8d84b854917e"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.33.0" +pydantic-core = "2.33.1" typing-extensions = ">=4.12.2" typing-inspection = ">=0.4.0" @@ -1843,110 +1843,110 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.33.0" +version = "2.33.1" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.9" files = [ - {file = "pydantic_core-2.33.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71dffba8fe9ddff628c68f3abd845e91b028361d43c5f8e7b3f8b91d7d85413e"}, - {file = "pydantic_core-2.33.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:abaeec1be6ed535a5d7ffc2e6c390083c425832b20efd621562fbb5bff6dc518"}, - {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759871f00e26ad3709efc773ac37b4d571de065f9dfb1778012908bcc36b3a73"}, - {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dcfebee69cd5e1c0b76a17e17e347c84b00acebb8dd8edb22d4a03e88e82a207"}, - {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b1262b912435a501fa04cd213720609e2cefa723a07c92017d18693e69bf00b"}, - {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4726f1f3f42d6a25678c67da3f0b10f148f5655813c5aca54b0d1742ba821b8f"}, - {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e790954b5093dff1e3a9a2523fddc4e79722d6f07993b4cd5547825c3cbf97b5"}, - {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:34e7fb3abe375b5c4e64fab75733d605dda0f59827752debc99c17cb2d5f3276"}, - {file = "pydantic_core-2.33.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ecb158fb9b9091b515213bed3061eb7deb1d3b4e02327c27a0ea714ff46b0760"}, - {file = "pydantic_core-2.33.0-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:4d9149e7528af8bbd76cc055967e6e04617dcb2a2afdaa3dea899406c5521faa"}, - {file = "pydantic_core-2.33.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e81a295adccf73477220e15ff79235ca9dcbcee4be459eb9d4ce9a2763b8386c"}, - {file = "pydantic_core-2.33.0-cp310-cp310-win32.whl", hash = "sha256:f22dab23cdbce2005f26a8f0c71698457861f97fc6318c75814a50c75e87d025"}, - {file = "pydantic_core-2.33.0-cp310-cp310-win_amd64.whl", hash = "sha256:9cb2390355ba084c1ad49485d18449b4242da344dea3e0fe10babd1f0db7dcfc"}, - {file = "pydantic_core-2.33.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a608a75846804271cf9c83e40bbb4dab2ac614d33c6fd5b0c6187f53f5c593ef"}, - {file = "pydantic_core-2.33.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e1c69aa459f5609dec2fa0652d495353accf3eda5bdb18782bc5a2ae45c9273a"}, - {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9ec80eb5a5f45a2211793f1c4aeddff0c3761d1c70d684965c1807e923a588b"}, - {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e925819a98318d17251776bd3d6aa9f3ff77b965762155bdad15d1a9265c4cfd"}, - {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bf68bb859799e9cec3d9dd8323c40c00a254aabb56fe08f907e437005932f2b"}, - {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b2ea72dea0825949a045fa4071f6d5b3d7620d2a208335207793cf29c5a182d"}, - {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1583539533160186ac546b49f5cde9ffc928062c96920f58bd95de32ffd7bffd"}, - {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:23c3e77bf8a7317612e5c26a3b084c7edeb9552d645742a54a5867635b4f2453"}, - {file = "pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7a7f2a3f628d2f7ef11cb6188bcf0b9e1558151d511b974dfea10a49afe192b"}, - {file = "pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:f1fb026c575e16f673c61c7b86144517705865173f3d0907040ac30c4f9f5915"}, - {file = "pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:635702b2fed997e0ac256b2cfbdb4dd0bf7c56b5d8fba8ef03489c03b3eb40e2"}, - {file = "pydantic_core-2.33.0-cp311-cp311-win32.whl", hash = "sha256:07b4ced28fccae3f00626eaa0c4001aa9ec140a29501770a88dbbb0966019a86"}, - {file = "pydantic_core-2.33.0-cp311-cp311-win_amd64.whl", hash = "sha256:4927564be53239a87770a5f86bdc272b8d1fbb87ab7783ad70255b4ab01aa25b"}, - {file = "pydantic_core-2.33.0-cp311-cp311-win_arm64.whl", hash = "sha256:69297418ad644d521ea3e1aa2e14a2a422726167e9ad22b89e8f1130d68e1e9a"}, - {file = "pydantic_core-2.33.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6c32a40712e3662bebe524abe8abb757f2fa2000028d64cc5a1006016c06af43"}, - {file = "pydantic_core-2.33.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ec86b5baa36f0a0bfb37db86c7d52652f8e8aa076ab745ef7725784183c3fdd"}, - {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4deac83a8cc1d09e40683be0bc6d1fa4cde8df0a9bf0cda5693f9b0569ac01b6"}, - {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:175ab598fb457a9aee63206a1993874badf3ed9a456e0654273e56f00747bbd6"}, - {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f36afd0d56a6c42cf4e8465b6441cf546ed69d3a4ec92724cc9c8c61bd6ecf4"}, - {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a98257451164666afafc7cbf5fb00d613e33f7e7ebb322fbcd99345695a9a61"}, - {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecc6d02d69b54a2eb83ebcc6f29df04957f734bcf309d346b4f83354d8376862"}, - {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a69b7596c6603afd049ce7f3835bcf57dd3892fc7279f0ddf987bebed8caa5a"}, - {file = "pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ea30239c148b6ef41364c6f51d103c2988965b643d62e10b233b5efdca8c0099"}, - {file = "pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:abfa44cf2f7f7d7a199be6c6ec141c9024063205545aa09304349781b9a125e6"}, - {file = "pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20d4275f3c4659d92048c70797e5fdc396c6e4446caf517ba5cad2db60cd39d3"}, - {file = "pydantic_core-2.33.0-cp312-cp312-win32.whl", hash = "sha256:918f2013d7eadea1d88d1a35fd4a1e16aaf90343eb446f91cb091ce7f9b431a2"}, - {file = "pydantic_core-2.33.0-cp312-cp312-win_amd64.whl", hash = "sha256:aec79acc183865bad120b0190afac467c20b15289050648b876b07777e67ea48"}, - {file = "pydantic_core-2.33.0-cp312-cp312-win_arm64.whl", hash = "sha256:5461934e895968655225dfa8b3be79e7e927e95d4bd6c2d40edd2fa7052e71b6"}, - {file = "pydantic_core-2.33.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f00e8b59e1fc8f09d05594aa7d2b726f1b277ca6155fc84c0396db1b373c4555"}, - {file = "pydantic_core-2.33.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a73be93ecef45786d7d95b0c5e9b294faf35629d03d5b145b09b81258c7cd6d"}, - {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff48a55be9da6930254565ff5238d71d5e9cd8c5487a191cb85df3bdb8c77365"}, - {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26a4ea04195638dcd8c53dadb545d70badba51735b1594810e9768c2c0b4a5da"}, - {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41d698dcbe12b60661f0632b543dbb119e6ba088103b364ff65e951610cb7ce0"}, - {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae62032ef513fe6281ef0009e30838a01057b832dc265da32c10469622613885"}, - {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f225f3a3995dbbc26affc191d0443c6c4aa71b83358fd4c2b7d63e2f6f0336f9"}, - {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5bdd36b362f419c78d09630cbaebc64913f66f62bda6d42d5fbb08da8cc4f181"}, - {file = "pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2a0147c0bef783fd9abc9f016d66edb6cac466dc54a17ec5f5ada08ff65caf5d"}, - {file = "pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:c860773a0f205926172c6644c394e02c25421dc9a456deff16f64c0e299487d3"}, - {file = "pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:138d31e3f90087f42aa6286fb640f3c7a8eb7bdae829418265e7e7474bd2574b"}, - {file = "pydantic_core-2.33.0-cp313-cp313-win32.whl", hash = "sha256:d20cbb9d3e95114325780f3cfe990f3ecae24de7a2d75f978783878cce2ad585"}, - {file = "pydantic_core-2.33.0-cp313-cp313-win_amd64.whl", hash = "sha256:ca1103d70306489e3d006b0f79db8ca5dd3c977f6f13b2c59ff745249431a606"}, - {file = "pydantic_core-2.33.0-cp313-cp313-win_arm64.whl", hash = "sha256:6291797cad239285275558e0a27872da735b05c75d5237bbade8736f80e4c225"}, - {file = "pydantic_core-2.33.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7b79af799630af263eca9ec87db519426d8c9b3be35016eddad1832bac812d87"}, - {file = "pydantic_core-2.33.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eabf946a4739b5237f4f56d77fa6668263bc466d06a8036c055587c130a46f7b"}, - {file = "pydantic_core-2.33.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8a1d581e8cdbb857b0e0e81df98603376c1a5c34dc5e54039dcc00f043df81e7"}, - {file = "pydantic_core-2.33.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:7c9c84749f5787781c1c45bb99f433402e484e515b40675a5d121ea14711cf61"}, - {file = "pydantic_core-2.33.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:64672fa888595a959cfeff957a654e947e65bbe1d7d82f550417cbd6898a1d6b"}, - {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bc7367c0961dec292244ef2549afa396e72e28cc24706210bd44d947582c59"}, - {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ce72d46eb201ca43994303025bd54d8a35a3fc2a3495fac653d6eb7205ce04f4"}, - {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14229c1504287533dbf6b1fc56f752ce2b4e9694022ae7509631ce346158de11"}, - {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:085d8985b1c1e48ef271e98a658f562f29d89bda98bf120502283efbc87313eb"}, - {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31860fbda80d8f6828e84b4a4d129fd9c4535996b8249cfb8c720dc2a1a00bb8"}, - {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f200b2f20856b5a6c3a35f0d4e344019f805e363416e609e9b47c552d35fd5ea"}, - {file = "pydantic_core-2.33.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f72914cfd1d0176e58ddc05c7a47674ef4222c8253bf70322923e73e14a4ac3"}, - {file = "pydantic_core-2.33.0-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:91301a0980a1d4530d4ba7e6a739ca1a6b31341252cb709948e0aca0860ce0ae"}, - {file = "pydantic_core-2.33.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7419241e17c7fbe5074ba79143d5523270e04f86f1b3a0dff8df490f84c8273a"}, - {file = "pydantic_core-2.33.0-cp39-cp39-win32.whl", hash = "sha256:7a25493320203005d2a4dac76d1b7d953cb49bce6d459d9ae38e30dd9f29bc9c"}, - {file = "pydantic_core-2.33.0-cp39-cp39-win_amd64.whl", hash = "sha256:82a4eba92b7ca8af1b7d5ef5f3d9647eee94d1f74d21ca7c21e3a2b92e008358"}, - {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e2762c568596332fdab56b07060c8ab8362c56cf2a339ee54e491cd503612c50"}, - {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bf637300ff35d4f59c006fff201c510b2b5e745b07125458a5389af3c0dff8c"}, - {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c151ce3d59ed56ebd7ce9ce5986a409a85db697d25fc232f8e81f195aa39a1"}, - {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee65f0cc652261744fd07f2c6e6901c914aa6c5ff4dcfaf1136bc394d0dd26b"}, - {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:024d136ae44d233e6322027bbf356712b3940bee816e6c948ce4b90f18471b3d"}, - {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e37f10f6d4bc67c58fbd727108ae1d8b92b397355e68519f1e4a7babb1473442"}, - {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:502ed542e0d958bd12e7c3e9a015bce57deaf50eaa8c2e1c439b512cb9db1e3a"}, - {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:715c62af74c236bf386825c0fdfa08d092ab0f191eb5b4580d11c3189af9d330"}, - {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bccc06fa0372151f37f6b69834181aa9eb57cf8665ed36405fb45fbf6cac3bae"}, - {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d8dc9f63a26f7259b57f46a7aab5af86b2ad6fbe48487500bb1f4b27e051e4c"}, - {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:30369e54d6d0113d2aa5aee7a90d17f225c13d87902ace8fcd7bbf99b19124db"}, - {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3eb479354c62067afa62f53bb387827bee2f75c9c79ef25eef6ab84d4b1ae3b"}, - {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0310524c833d91403c960b8a3cf9f46c282eadd6afd276c8c5edc617bd705dc9"}, - {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eddb18a00bbb855325db27b4c2a89a4ba491cd6a0bd6d852b225172a1f54b36c"}, - {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ade5dbcf8d9ef8f4b28e682d0b29f3008df9842bb5ac48ac2c17bc55771cc976"}, - {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:2c0afd34f928383e3fd25740f2050dbac9d077e7ba5adbaa2227f4d4f3c8da5c"}, - {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7da333f21cd9df51d5731513a6d39319892947604924ddf2e24a4612975fb936"}, - {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4b6d77c75a57f041c5ee915ff0b0bb58eabb78728b69ed967bc5b780e8f701b8"}, - {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba95691cf25f63df53c1d342413b41bd7762d9acb425df8858d7efa616c0870e"}, - {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f1ab031feb8676f6bd7c85abec86e2935850bf19b84432c64e3e239bffeb1ec"}, - {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58c1151827eef98b83d49b6ca6065575876a02d2211f259fb1a6b7757bd24dd8"}, - {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a66d931ea2c1464b738ace44b7334ab32a2fd50be023d863935eb00f42be1778"}, - {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0bcf0bab28995d483f6c8d7db25e0d05c3efa5cebfd7f56474359e7137f39856"}, - {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:89670d7a0045acb52be0566df5bc8b114ac967c662c06cf5e0c606e4aadc964b"}, - {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:b716294e721d8060908dbebe32639b01bfe61b15f9f57bcc18ca9a0e00d9520b"}, - {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fc53e05c16697ff0c1c7c2b98e45e131d4bfb78068fffff92a82d169cbb4c7b7"}, - {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:68504959253303d3ae9406b634997a2123a0b0c1da86459abbd0ffc921695eac"}, - {file = "pydantic_core-2.33.0.tar.gz", hash = "sha256:40eb8af662ba409c3cbf4a8150ad32ae73514cd7cb1f1a2113af39763dd616b3"}, + {file = "pydantic_core-2.33.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3077cfdb6125cc8dab61b155fdd714663e401f0e6883f9632118ec12cf42df26"}, + {file = "pydantic_core-2.33.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ffab8b2908d152e74862d276cf5017c81a2f3719f14e8e3e8d6b83fda863927"}, + {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5183e4f6a2d468787243ebcd70cf4098c247e60d73fb7d68d5bc1e1beaa0c4db"}, + {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:398a38d323f37714023be1e0285765f0a27243a8b1506b7b7de87b647b517e48"}, + {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d3776f0001b43acebfa86f8c64019c043b55cc5a6a2e313d728b5c95b46969"}, + {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c566dd9c5f63d22226409553531f89de0cac55397f2ab8d97d6f06cfce6d947e"}, + {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d5f3acc81452c56895e90643a625302bd6be351e7010664151cc55b7b97f89"}, + {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d3a07fadec2a13274a8d861d3d37c61e97a816beae717efccaa4b36dfcaadcde"}, + {file = "pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f99aeda58dce827f76963ee87a0ebe75e648c72ff9ba1174a253f6744f518f65"}, + {file = "pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:902dbc832141aa0ec374f4310f1e4e7febeebc3256f00dc359a9ac3f264a45dc"}, + {file = "pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fe44d56aa0b00d66640aa84a3cbe80b7a3ccdc6f0b1ca71090696a6d4777c091"}, + {file = "pydantic_core-2.33.1-cp310-cp310-win32.whl", hash = "sha256:ed3eb16d51257c763539bde21e011092f127a2202692afaeaccb50db55a31383"}, + {file = "pydantic_core-2.33.1-cp310-cp310-win_amd64.whl", hash = "sha256:694ad99a7f6718c1a498dc170ca430687a39894a60327f548e02a9c7ee4b6504"}, + {file = "pydantic_core-2.33.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24"}, + {file = "pydantic_core-2.33.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30"}, + {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595"}, + {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e"}, + {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a"}, + {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505"}, + {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f"}, + {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77"}, + {file = "pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961"}, + {file = "pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1"}, + {file = "pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c"}, + {file = "pydantic_core-2.33.1-cp311-cp311-win32.whl", hash = "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896"}, + {file = "pydantic_core-2.33.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83"}, + {file = "pydantic_core-2.33.1-cp311-cp311-win_arm64.whl", hash = "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89"}, + {file = "pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8"}, + {file = "pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498"}, + {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939"}, + {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d"}, + {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e"}, + {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3"}, + {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d"}, + {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b"}, + {file = "pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39"}, + {file = "pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a"}, + {file = "pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db"}, + {file = "pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda"}, + {file = "pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4"}, + {file = "pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea"}, + {file = "pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a"}, + {file = "pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266"}, + {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3"}, + {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a"}, + {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516"}, + {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764"}, + {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d"}, + {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4"}, + {file = "pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde"}, + {file = "pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e"}, + {file = "pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd"}, + {file = "pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f"}, + {file = "pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40"}, + {file = "pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523"}, + {file = "pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d"}, + {file = "pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c"}, + {file = "pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18"}, + {file = "pydantic_core-2.33.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5ab77f45d33d264de66e1884fca158bc920cb5e27fd0764a72f72f5756ae8bdb"}, + {file = "pydantic_core-2.33.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7aaba1b4b03aaea7bb59e1b5856d734be011d3e6d98f5bcaa98cb30f375f2ad"}, + {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fb66263e9ba8fea2aa85e1e5578980d127fb37d7f2e292773e7bc3a38fb0c7b"}, + {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3f2648b9262607a7fb41d782cc263b48032ff7a03a835581abbf7a3bec62bcf5"}, + {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:723c5630c4259400818b4ad096735a829074601805d07f8cafc366d95786d331"}, + {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d100e3ae783d2167782391e0c1c7a20a31f55f8015f3293647544df3f9c67824"}, + {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177d50460bc976a0369920b6c744d927b0ecb8606fb56858ff542560251b19e5"}, + {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a3edde68d1a1f9af1273b2fe798997b33f90308fb6d44d8550c89fc6a3647cf6"}, + {file = "pydantic_core-2.33.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a62c3c3ef6a7e2c45f7853b10b5bc4ddefd6ee3cd31024754a1a5842da7d598d"}, + {file = "pydantic_core-2.33.1-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:c91dbb0ab683fa0cd64a6e81907c8ff41d6497c346890e26b23de7ee55353f96"}, + {file = "pydantic_core-2.33.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f466e8bf0a62dc43e068c12166281c2eca72121dd2adc1040f3aa1e21ef8599"}, + {file = "pydantic_core-2.33.1-cp39-cp39-win32.whl", hash = "sha256:ab0277cedb698749caada82e5d099dc9fed3f906a30d4c382d1a21725777a1e5"}, + {file = "pydantic_core-2.33.1-cp39-cp39-win_amd64.whl", hash = "sha256:5773da0ee2d17136b1f1c6fbde543398d452a6ad2a7b54ea1033e2daa739b8d2"}, + {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c834f54f8f4640fd7e4b193f80eb25a0602bba9e19b3cd2fc7ffe8199f5ae02"}, + {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:049e0de24cf23766f12cc5cc71d8abc07d4a9deb9061b334b62093dedc7cb068"}, + {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a28239037b3d6f16916a4c831a5a0eadf856bdd6d2e92c10a0da3a59eadcf3e"}, + {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d3da303ab5f378a268fa7d45f37d7d85c3ec19769f28d2cc0c61826a8de21fe"}, + {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:25626fb37b3c543818c14821afe0fd3830bc327a43953bc88db924b68c5723f1"}, + {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3ab2d36e20fbfcce8f02d73c33a8a7362980cff717926bbae030b93ae46b56c7"}, + {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:2f9284e11c751b003fd4215ad92d325d92c9cb19ee6729ebd87e3250072cdcde"}, + {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:048c01eee07d37cbd066fc512b9d8b5ea88ceeb4e629ab94b3e56965ad655add"}, + {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5ccd429694cf26af7997595d627dd2637e7932214486f55b8a357edaac9dae8c"}, + {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a"}, + {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc"}, + {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b"}, + {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe"}, + {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5"}, + {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761"}, + {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850"}, + {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544"}, + {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5"}, + {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7edbc454a29fc6aeae1e1eecba4f07b63b8d76e76a748532233c4c167b4cb9ea"}, + {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ad05b683963f69a1d5d2c2bdab1274a31221ca737dbbceaa32bcb67359453cdd"}, + {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df6a94bf9452c6da9b5d76ed229a5683d0306ccb91cca8e1eea883189780d568"}, + {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7965c13b3967909a09ecc91f21d09cfc4576bf78140b988904e94f130f188396"}, + {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3f1fdb790440a34f6ecf7679e1863b825cb5ffde858a9197f851168ed08371e5"}, + {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:5277aec8d879f8d05168fdd17ae811dd313b8ff894aeeaf7cd34ad28b4d77e33"}, + {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8ab581d3530611897d863d1a649fb0644b860286b4718db919bfd51ece41f10b"}, + {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0483847fa9ad5e3412265c1bd72aad35235512d9ce9d27d81a56d935ef489672"}, + {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:de9e06abe3cc5ec6a2d5f75bc99b0bdca4f5c719a5b34026f8c57efbdecd2ee3"}, + {file = "pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df"}, ] [package.dependencies] @@ -2231,104 +2231,104 @@ files = [ [[package]] name = "pyzmq" -version = "26.3.0" +version = "26.4.0" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.8" files = [ - {file = "pyzmq-26.3.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1586944f4736515af5c6d3a5b150c7e8ca2a2d6e46b23057320584d6f2438f4a"}, - {file = "pyzmq-26.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa7efc695d1fc9f72d91bf9b6c6fe2d7e1b4193836ec530a98faf7d7a7577a58"}, - {file = "pyzmq-26.3.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd84441e4021cec6e4dd040550386cd9c9ea1d9418ea1a8002dbb7b576026b2b"}, - {file = "pyzmq-26.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9176856f36c34a8aa5c0b35ddf52a5d5cd8abeece57c2cd904cfddae3fd9acd3"}, - {file = "pyzmq-26.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:49334faa749d55b77f084389a80654bf2e68ab5191c0235066f0140c1b670d64"}, - {file = "pyzmq-26.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fd30fc80fe96efb06bea21667c5793bbd65c0dc793187feb39b8f96990680b00"}, - {file = "pyzmq-26.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b2eddfbbfb473a62c3a251bb737a6d58d91907f6e1d95791431ebe556f47d916"}, - {file = "pyzmq-26.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:70b3acb9ad729a53d4e751dace35404a024f188aad406013454216aba5485b4e"}, - {file = "pyzmq-26.3.0-cp310-cp310-win32.whl", hash = "sha256:c1bd75d692cd7c6d862a98013bfdf06702783b75cffbf5dae06d718fecefe8f2"}, - {file = "pyzmq-26.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:d7165bcda0dbf203e5ad04d79955d223d84b2263df4db92f525ba370b03a12ab"}, - {file = "pyzmq-26.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:e34a63f71d2ecffb3c643909ad2d488251afeb5ef3635602b3448e609611a7ed"}, - {file = "pyzmq-26.3.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:2833602d9d42c94b9d0d2a44d2b382d3d3a4485be018ba19dddc401a464c617a"}, - {file = "pyzmq-26.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8270d104ec7caa0bdac246d31d48d94472033ceab5ba142881704350b28159c"}, - {file = "pyzmq-26.3.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c208a977843d18d3bd185f323e4eaa912eb4869cb230947dc6edd8a27a4e558a"}, - {file = "pyzmq-26.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eddc2be28a379c218e0d92e4a432805dcb0ca5870156a90b54c03cd9799f9f8a"}, - {file = "pyzmq-26.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:c0b519fa2159c42272f8a244354a0e110d65175647e5185b04008ec00df9f079"}, - {file = "pyzmq-26.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1595533de3a80bf8363372c20bafa963ec4bf9f2b8f539b1d9a5017f430b84c9"}, - {file = "pyzmq-26.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bbef99eb8d18ba9a40f00e8836b8040cdcf0f2fa649684cf7a66339599919d21"}, - {file = "pyzmq-26.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:979486d444ca3c469cd1c7f6a619ce48ff08b3b595d451937db543754bfacb65"}, - {file = "pyzmq-26.3.0-cp311-cp311-win32.whl", hash = "sha256:4b127cfe10b4c56e4285b69fd4b38ea1d368099ea4273d8fb349163fce3cd598"}, - {file = "pyzmq-26.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:cf736cc1298ef15280d9fcf7a25c09b05af016656856dc6fe5626fd8912658dd"}, - {file = "pyzmq-26.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:2dc46ec09f5d36f606ac8393303149e69d17121beee13c8dac25e2a2078e31c4"}, - {file = "pyzmq-26.3.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:c80653332c6136da7f4d4e143975e74ac0fa14f851f716d90583bc19e8945cea"}, - {file = "pyzmq-26.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e317ee1d4528a03506cb1c282cd9db73660a35b3564096de37de7350e7d87a7"}, - {file = "pyzmq-26.3.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:943a22ebb3daacb45f76a9bcca9a7b74e7d94608c0c0505da30af900b998ca8d"}, - {file = "pyzmq-26.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fc9e71490d989144981ea21ef4fdfaa7b6aa84aff9632d91c736441ce2f6b00"}, - {file = "pyzmq-26.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:e281a8071a06888575a4eb523c4deeefdcd2f5fe4a2d47e02ac8bf3a5b49f695"}, - {file = "pyzmq-26.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:be77efd735bb1064605be8dec6e721141c1421ef0b115ef54e493a64e50e9a52"}, - {file = "pyzmq-26.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7a4ac2ffa34f1212dd586af90f4ba894e424f0cabb3a49cdcff944925640f6ac"}, - {file = "pyzmq-26.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ba698c7c252af83b6bba9775035263f0df5f807f0404019916d4b71af8161f66"}, - {file = "pyzmq-26.3.0-cp312-cp312-win32.whl", hash = "sha256:214038aaa88e801e54c2ef0cfdb2e6df27eb05f67b477380a452b595c5ecfa37"}, - {file = "pyzmq-26.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:bad7fe0372e505442482ca3ccbc0d6f38dae81b1650f57a0aa6bbee18e7df495"}, - {file = "pyzmq-26.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:b7b578d604e79e99aa39495becea013fd043fa9f36e4b490efa951f3d847a24d"}, - {file = "pyzmq-26.3.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:fa85953df84beb7b8b73cb3ec3f5d92b62687a09a8e71525c6734e020edf56fd"}, - {file = "pyzmq-26.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:209d09f0ab6ddbcebe64630d1e6ca940687e736f443c265ae15bc4bfad833597"}, - {file = "pyzmq-26.3.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d35cc1086f1d4f907df85c6cceb2245cb39a04f69c3f375993363216134d76d4"}, - {file = "pyzmq-26.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b380e9087078ba91e45fb18cdd0c25275ffaa045cf63c947be0ddae6186bc9d9"}, - {file = "pyzmq-26.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6d64e74143587efe7c9522bb74d1448128fdf9897cc9b6d8b9927490922fd558"}, - {file = "pyzmq-26.3.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:efba4f53ac7752eea6d8ca38a4ddac579e6e742fba78d1e99c12c95cd2acfc64"}, - {file = "pyzmq-26.3.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:9b0137a1c40da3b7989839f9b78a44de642cdd1ce20dcef341de174c8d04aa53"}, - {file = "pyzmq-26.3.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:a995404bd3982c089e57b428c74edd5bfc3b0616b3dbcd6a8e270f1ee2110f36"}, - {file = "pyzmq-26.3.0-cp313-cp313-win32.whl", hash = "sha256:240b1634b9e530ef6a277d95cbca1a6922f44dfddc5f0a3cd6c722a8de867f14"}, - {file = "pyzmq-26.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:fe67291775ea4c2883764ba467eb389c29c308c56b86c1e19e49c9e1ed0cbeca"}, - {file = "pyzmq-26.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:73ca9ae9a9011b714cf7650450cd9c8b61a135180b708904f1f0a05004543dce"}, - {file = "pyzmq-26.3.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:fea7efbd7e49af9d7e5ed6c506dfc7de3d1a628790bd3a35fd0e3c904dc7d464"}, - {file = "pyzmq-26.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4430c7cba23bb0e2ee203eee7851c1654167d956fc6d4b3a87909ccaf3c5825"}, - {file = "pyzmq-26.3.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:016d89bee8c7d566fad75516b4e53ec7c81018c062d4c51cd061badf9539be52"}, - {file = "pyzmq-26.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04bfe59852d76d56736bfd10ac1d49d421ab8ed11030b4a0332900691507f557"}, - {file = "pyzmq-26.3.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:1fe05bd0d633a0f672bb28cb8b4743358d196792e1caf04973b7898a0d70b046"}, - {file = "pyzmq-26.3.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:2aa1a9f236d5b835fb8642f27de95f9edcfd276c4bc1b6ffc84f27c6fb2e2981"}, - {file = "pyzmq-26.3.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:21399b31753bf321043ea60c360ed5052cc7be20739785b1dff1820f819e35b3"}, - {file = "pyzmq-26.3.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:d015efcd96aca8882057e7e6f06224f79eecd22cad193d3e6a0a91ec67590d1f"}, - {file = "pyzmq-26.3.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:18183cc3851b995fdc7e5f03d03b8a4e1b12b0f79dff1ec1da75069af6357a05"}, - {file = "pyzmq-26.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:da87e977f92d930a3683e10ba2b38bcc59adfc25896827e0b9d78b208b7757a6"}, - {file = "pyzmq-26.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cf6db401f4957afbf372a4730c6d5b2a234393af723983cbf4bcd13d54c71e1a"}, - {file = "pyzmq-26.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03caa2ffd64252122139d50ec92987f89616b9b92c9ba72920b40e92709d5e26"}, - {file = "pyzmq-26.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:fbf206e5329e20937fa19bd41cf3af06d5967f8f7e86b59d783b26b40ced755c"}, - {file = "pyzmq-26.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6fb539a6382a048308b409d8c66d79bf636eda1b24f70c78f2a1fd16e92b037b"}, - {file = "pyzmq-26.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7897b8c8bbbb2bd8cad887bffcb07aede71ef1e45383bd4d6ac049bf0af312a4"}, - {file = "pyzmq-26.3.0-cp38-cp38-win32.whl", hash = "sha256:91dead2daca698ae52ce70ee2adbb94ddd9b5f96877565fd40aa4efd18ecc6a3"}, - {file = "pyzmq-26.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:8c088e009a6d6b9f563336adb906e3a8d3fd64db129acc8d8fd0e9fe22b2dac8"}, - {file = "pyzmq-26.3.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:2eaed0d911fb3280981d5495978152fab6afd9fe217fd16f411523665089cef1"}, - {file = "pyzmq-26.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7998b60ef1c105846fb3bfca494769fde3bba6160902e7cd27a8df8257890ee9"}, - {file = "pyzmq-26.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:96c0006a8d1d00e46cb44c8e8d7316d4a232f3d8f2ed43179d4578dbcb0829b6"}, - {file = "pyzmq-26.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e17cc198dc50a25a0f245e6b1e56f692df2acec3ccae82d1f60c34bfb72bbec"}, - {file = "pyzmq-26.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:92a30840f4f2a31f7049d0a7de5fc69dd03b19bd5d8e7fed8d0bde49ce49b589"}, - {file = "pyzmq-26.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f52eba83272a26b444f4b8fc79f2e2c83f91d706d693836c9f7ccb16e6713c31"}, - {file = "pyzmq-26.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:952085a09ff32115794629ba47f8940896d7842afdef1283332109d38222479d"}, - {file = "pyzmq-26.3.0-cp39-cp39-win32.whl", hash = "sha256:0240289e33e3fbae44a5db73e54e955399179332a6b1d47c764a4983ec1524c3"}, - {file = "pyzmq-26.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:b2db7c82f08b8ce44c0b9d1153ce63907491972a7581e8b6adea71817f119df8"}, - {file = "pyzmq-26.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:2d3459b6311463c96abcb97808ee0a1abb0d932833edb6aa81c30d622fd4a12d"}, - {file = "pyzmq-26.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ad03f4252d9041b0635c37528dfa3f44b39f46024ae28c8567f7423676ee409b"}, - {file = "pyzmq-26.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f3dfb68cf7bf4cfdf34283a75848e077c5defa4907506327282afe92780084d"}, - {file = "pyzmq-26.3.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:356ec0e39c5a9cda872b65aca1fd8a5d296ffdadf8e2442b70ff32e73ef597b1"}, - {file = "pyzmq-26.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:749d671b0eec8e738bbf0b361168369d8c682b94fcd458c20741dc4d69ef5278"}, - {file = "pyzmq-26.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f950f17ae608e0786298340163cac25a4c5543ef25362dd5ddb6dcb10b547be9"}, - {file = "pyzmq-26.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b4fc9903a73c25be9d5fe45c87faababcf3879445efa16140146b08fccfac017"}, - {file = "pyzmq-26.3.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c15b69af22030960ac63567e98ad8221cddf5d720d9cf03d85021dfd452324ef"}, - {file = "pyzmq-26.3.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2cf9ab0dff4dbaa2e893eb608373c97eb908e53b7d9793ad00ccbd082c0ee12f"}, - {file = "pyzmq-26.3.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ec332675f6a138db57aad93ae6387953763f85419bdbd18e914cb279ee1c451"}, - {file = "pyzmq-26.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:eb96568a22fe070590942cd4780950e2172e00fb033a8b76e47692583b1bd97c"}, - {file = "pyzmq-26.3.0-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:009a38241c76184cb004c869e82a99f0aee32eda412c1eb44df5820324a01d25"}, - {file = "pyzmq-26.3.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4c22a12713707467abedc6d75529dd365180c4c2a1511268972c6e1d472bd63e"}, - {file = "pyzmq-26.3.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1614fcd116275d24f2346ffca4047a741c546ad9d561cbf7813f11226ca4ed2c"}, - {file = "pyzmq-26.3.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e2cafe7e9c7fed690e8ecf65af119f9c482923b5075a78f6f7629c63e1b4b1d"}, - {file = "pyzmq-26.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:14e0b81753424bd374075df6cc30b87f2c99e5f022501d97eff66544ca578941"}, - {file = "pyzmq-26.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:21c6ddb98557a77cfe3366af0c5600fb222a1b2de5f90d9cd052b324e0c295e8"}, - {file = "pyzmq-26.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fc81d5d60c9d40e692de14b8d884d43cf67562402b931681f0ccb3ce6b19875"}, - {file = "pyzmq-26.3.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52b064fafef772d0f5dbf52d4c39f092be7bc62d9a602fe6e82082e001326de3"}, - {file = "pyzmq-26.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b72206eb041f780451c61e1e89dbc3705f3d66aaaa14ee320d4f55864b13358a"}, - {file = "pyzmq-26.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ab78dc21c7b1e13053086bcf0b4246440b43b5409904b73bfd1156654ece8a1"}, - {file = "pyzmq-26.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0b42403ad7d1194dca9574cd3c56691c345f4601fa2d0a33434f35142baec7ac"}, - {file = "pyzmq-26.3.0.tar.gz", hash = "sha256:f1cd68b8236faab78138a8fc703f7ca0ad431b17a3fcac696358600d4e6243b3"}, + {file = "pyzmq-26.4.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:0329bdf83e170ac133f44a233fc651f6ed66ef8e66693b5af7d54f45d1ef5918"}, + {file = "pyzmq-26.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:398a825d2dea96227cf6460ce0a174cf7657d6f6827807d4d1ae9d0f9ae64315"}, + {file = "pyzmq-26.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d52d62edc96787f5c1dfa6c6ccff9b581cfae5a70d94ec4c8da157656c73b5b"}, + {file = "pyzmq-26.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1410c3a3705db68d11eb2424d75894d41cff2f64d948ffe245dd97a9debfebf4"}, + {file = "pyzmq-26.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:7dacb06a9c83b007cc01e8e5277f94c95c453c5851aac5e83efe93e72226353f"}, + {file = "pyzmq-26.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6bab961c8c9b3a4dc94d26e9b2cdf84de9918931d01d6ff38c721a83ab3c0ef5"}, + {file = "pyzmq-26.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7a5c09413b924d96af2aa8b57e76b9b0058284d60e2fc3730ce0f979031d162a"}, + {file = "pyzmq-26.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7d489ac234d38e57f458fdbd12a996bfe990ac028feaf6f3c1e81ff766513d3b"}, + {file = "pyzmq-26.4.0-cp310-cp310-win32.whl", hash = "sha256:dea1c8db78fb1b4b7dc9f8e213d0af3fc8ecd2c51a1d5a3ca1cde1bda034a980"}, + {file = "pyzmq-26.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:fa59e1f5a224b5e04dc6c101d7186058efa68288c2d714aa12d27603ae93318b"}, + {file = "pyzmq-26.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:a651fe2f447672f4a815e22e74630b6b1ec3a1ab670c95e5e5e28dcd4e69bbb5"}, + {file = "pyzmq-26.4.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:bfcf82644c9b45ddd7cd2a041f3ff8dce4a0904429b74d73a439e8cab1bd9e54"}, + {file = "pyzmq-26.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9bcae3979b2654d5289d3490742378b2f3ce804b0b5fd42036074e2bf35b030"}, + {file = "pyzmq-26.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccdff8ac4246b6fb60dcf3982dfaeeff5dd04f36051fe0632748fc0aa0679c01"}, + {file = "pyzmq-26.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4550af385b442dc2d55ab7717837812799d3674cb12f9a3aa897611839c18e9e"}, + {file = "pyzmq-26.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f9f7ffe9db1187a253fca95191854b3fda24696f086e8789d1d449308a34b88"}, + {file = "pyzmq-26.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3709c9ff7ba61589b7372923fd82b99a81932b592a5c7f1a24147c91da9a68d6"}, + {file = "pyzmq-26.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f8f3c30fb2d26ae5ce36b59768ba60fb72507ea9efc72f8f69fa088450cff1df"}, + {file = "pyzmq-26.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:382a4a48c8080e273427fc692037e3f7d2851959ffe40864f2db32646eeb3cef"}, + {file = "pyzmq-26.4.0-cp311-cp311-win32.whl", hash = "sha256:d56aad0517d4c09e3b4f15adebba8f6372c5102c27742a5bdbfc74a7dceb8fca"}, + {file = "pyzmq-26.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:963977ac8baed7058c1e126014f3fe58b3773f45c78cce7af5c26c09b6823896"}, + {file = "pyzmq-26.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0c8e8cadc81e44cc5088fcd53b9b3b4ce9344815f6c4a03aec653509296fae3"}, + {file = "pyzmq-26.4.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:5227cb8da4b6f68acfd48d20c588197fd67745c278827d5238c707daf579227b"}, + {file = "pyzmq-26.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1c07a7fa7f7ba86554a2b1bef198c9fed570c08ee062fd2fd6a4dcacd45f905"}, + {file = "pyzmq-26.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae775fa83f52f52de73183f7ef5395186f7105d5ed65b1ae65ba27cb1260de2b"}, + {file = "pyzmq-26.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66c760d0226ebd52f1e6b644a9e839b5db1e107a23f2fcd46ec0569a4fdd4e63"}, + {file = "pyzmq-26.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ef8c6ecc1d520debc147173eaa3765d53f06cd8dbe7bd377064cdbc53ab456f5"}, + {file = "pyzmq-26.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3150ef4084e163dec29ae667b10d96aad309b668fac6810c9e8c27cf543d6e0b"}, + {file = "pyzmq-26.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4448c9e55bf8329fa1dcedd32f661bf611214fa70c8e02fee4347bc589d39a84"}, + {file = "pyzmq-26.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e07dde3647afb084d985310d067a3efa6efad0621ee10826f2cb2f9a31b89d2f"}, + {file = "pyzmq-26.4.0-cp312-cp312-win32.whl", hash = "sha256:ba034a32ecf9af72adfa5ee383ad0fd4f4e38cdb62b13624278ef768fe5b5b44"}, + {file = "pyzmq-26.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:056a97aab4064f526ecb32f4343917a4022a5d9efb6b9df990ff72e1879e40be"}, + {file = "pyzmq-26.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:2f23c750e485ce1eb639dbd576d27d168595908aa2d60b149e2d9e34c9df40e0"}, + {file = "pyzmq-26.4.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:c43fac689880f5174d6fc864857d1247fe5cfa22b09ed058a344ca92bf5301e3"}, + {file = "pyzmq-26.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:902aca7eba477657c5fb81c808318460328758e8367ecdd1964b6330c73cae43"}, + {file = "pyzmq-26.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e48a830bfd152fe17fbdeaf99ac5271aa4122521bf0d275b6b24e52ef35eb6"}, + {file = "pyzmq-26.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31be2b6de98c824c06f5574331f805707c667dc8f60cb18580b7de078479891e"}, + {file = "pyzmq-26.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6332452034be001bbf3206ac59c0d2a7713de5f25bb38b06519fc6967b7cf771"}, + {file = "pyzmq-26.4.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:da8c0f5dd352136853e6a09b1b986ee5278dfddfebd30515e16eae425c872b30"}, + {file = "pyzmq-26.4.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f4ccc1a0a2c9806dda2a2dd118a3b7b681e448f3bb354056cad44a65169f6d86"}, + {file = "pyzmq-26.4.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1c0b5fceadbab461578daf8d1dcc918ebe7ddd2952f748cf30c7cf2de5d51101"}, + {file = "pyzmq-26.4.0-cp313-cp313-win32.whl", hash = "sha256:28e2b0ff5ba4b3dd11062d905682bad33385cfa3cc03e81abd7f0822263e6637"}, + {file = "pyzmq-26.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:23ecc9d241004c10e8b4f49d12ac064cd7000e1643343944a10df98e57bc544b"}, + {file = "pyzmq-26.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:1edb0385c7f025045d6e0f759d4d3afe43c17a3d898914ec6582e6f464203c08"}, + {file = "pyzmq-26.4.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:93a29e882b2ba1db86ba5dd5e88e18e0ac6b627026c5cfbec9983422011b82d4"}, + {file = "pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb45684f276f57110bb89e4300c00f1233ca631f08f5f42528a5c408a79efc4a"}, + {file = "pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72073e75260cb301aad4258ad6150fa7f57c719b3f498cb91e31df16784d89b"}, + {file = "pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be37e24b13026cfedd233bcbbccd8c0bcd2fdd186216094d095f60076201538d"}, + {file = "pyzmq-26.4.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:237b283044934d26f1eeff4075f751b05d2f3ed42a257fc44386d00df6a270cf"}, + {file = "pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b30f862f6768b17040929a68432c8a8be77780317f45a353cb17e423127d250c"}, + {file = "pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:c80fcd3504232f13617c6ab501124d373e4895424e65de8b72042333316f64a8"}, + {file = "pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:26a2a7451606b87f67cdeca2c2789d86f605da08b4bd616b1a9981605ca3a364"}, + {file = "pyzmq-26.4.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:831cc53bf6068d46d942af52fa8b0b9d128fb39bcf1f80d468dc9a3ae1da5bfb"}, + {file = "pyzmq-26.4.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:51d18be6193c25bd229524cfac21e39887c8d5e0217b1857998dfbef57c070a4"}, + {file = "pyzmq-26.4.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:445c97854204119ae2232503585ebb4fa7517142f71092cb129e5ee547957a1f"}, + {file = "pyzmq-26.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:807b8f4ad3e6084412c0f3df0613269f552110fa6fb91743e3e306223dbf11a6"}, + {file = "pyzmq-26.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c01d109dd675ac47fa15c0a79d256878d898f90bc10589f808b62d021d2e653c"}, + {file = "pyzmq-26.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0a294026e28679a8dd64c922e59411cb586dad307661b4d8a5c49e7bbca37621"}, + {file = "pyzmq-26.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:22c8dd677274af8dfb1efd05006d6f68fb2f054b17066e308ae20cb3f61028cf"}, + {file = "pyzmq-26.4.0-cp38-cp38-win32.whl", hash = "sha256:14fc678b696bc42c14e2d7f86ac4e97889d5e6b94d366ebcb637a768d2ad01af"}, + {file = "pyzmq-26.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:d1ef0a536662bbbdc8525f7e2ef19e74123ec9c4578e0582ecd41aedc414a169"}, + {file = "pyzmq-26.4.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:a88643de8abd000ce99ca72056a1a2ae15881ee365ecb24dd1d9111e43d57842"}, + {file = "pyzmq-26.4.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0a744ce209ecb557406fb928f3c8c55ce79b16c3eeb682da38ef5059a9af0848"}, + {file = "pyzmq-26.4.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9434540f333332224ecb02ee6278b6c6f11ea1266b48526e73c903119b2f420f"}, + {file = "pyzmq-26.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6c6f0a23e55cd38d27d4c89add963294ea091ebcb104d7fdab0f093bc5abb1c"}, + {file = "pyzmq-26.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6145df55dc2309f6ef72d70576dcd5aabb0fd373311613fe85a5e547c722b780"}, + {file = "pyzmq-26.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2ea81823840ef8c56e5d2f9918e4d571236294fea4d1842b302aebffb9e40997"}, + {file = "pyzmq-26.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc2abc385dc37835445abe206524fbc0c9e3fce87631dfaa90918a1ba8f425eb"}, + {file = "pyzmq-26.4.0-cp39-cp39-win32.whl", hash = "sha256:41a2508fe7bed4c76b4cf55aacfb8733926f59d440d9ae2b81ee8220633b4d12"}, + {file = "pyzmq-26.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:d4000e8255d6cbce38982e5622ebb90823f3409b7ffe8aeae4337ef7d6d2612a"}, + {file = "pyzmq-26.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:b4f6919d9c120488246bdc2a2f96662fa80d67b35bd6d66218f457e722b3ff64"}, + {file = "pyzmq-26.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:98d948288ce893a2edc5ec3c438fe8de2daa5bbbd6e2e865ec5f966e237084ba"}, + {file = "pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9f34f5c9e0203ece706a1003f1492a56c06c0632d86cb77bcfe77b56aacf27b"}, + {file = "pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80c9b48aef586ff8b698359ce22f9508937c799cc1d2c9c2f7c95996f2300c94"}, + {file = "pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3f2a5b74009fd50b53b26f65daff23e9853e79aa86e0aa08a53a7628d92d44a"}, + {file = "pyzmq-26.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:61c5f93d7622d84cb3092d7f6398ffc77654c346545313a3737e266fc11a3beb"}, + {file = "pyzmq-26.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4478b14cb54a805088299c25a79f27eaf530564a7a4f72bf432a040042b554eb"}, + {file = "pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a28ac29c60e4ba84b5f58605ace8ad495414a724fe7aceb7cf06cd0598d04e1"}, + {file = "pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43b03c1ceea27c6520124f4fb2ba9c647409b9abdf9a62388117148a90419494"}, + {file = "pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7731abd23a782851426d4e37deb2057bf9410848a4459b5ede4fe89342e687a9"}, + {file = "pyzmq-26.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a222ad02fbe80166b0526c038776e8042cd4e5f0dec1489a006a1df47e9040e0"}, + {file = "pyzmq-26.4.0-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:91c3ffaea475ec8bb1a32d77ebc441dcdd13cd3c4c284a6672b92a0f5ade1917"}, + {file = "pyzmq-26.4.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d9a78a52668bf5c9e7b0da36aa5760a9fc3680144e1445d68e98df78a25082ed"}, + {file = "pyzmq-26.4.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b70cab356ff8c860118b89dc86cd910c73ce2127eb986dada4fbac399ef644cf"}, + {file = "pyzmq-26.4.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acae207d4387780838192326b32d373bb286da0b299e733860e96f80728eb0af"}, + {file = "pyzmq-26.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f928eafd15794aa4be75463d537348b35503c1e014c5b663f206504ec1a90fe4"}, + {file = "pyzmq-26.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:552b0d2e39987733e1e9e948a0ced6ff75e0ea39ab1a1db2fc36eb60fd8760db"}, + {file = "pyzmq-26.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd670a8aa843f2ee637039bbd412e0d7294a5e588e1ecc9ad98b0cdc050259a4"}, + {file = "pyzmq-26.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d367b7b775a0e1e54a59a2ba3ed4d5e0a31566af97cc9154e34262777dab95ed"}, + {file = "pyzmq-26.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112af16c406e4a93df2caef49f884f4c2bb2b558b0b5577ef0b2465d15c1abc"}, + {file = "pyzmq-26.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c76c298683f82669cab0b6da59071f55238c039738297c69f187a542c6d40099"}, + {file = "pyzmq-26.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:49b6ca2e625b46f499fb081aaf7819a177f41eeb555acb05758aa97f4f95d147"}, + {file = "pyzmq-26.4.0.tar.gz", hash = "sha256:4bd13f85f80962f91a651a7356fe0472791a5f7a92f227822b5acf44795c626d"}, ] [package.dependencies] @@ -2872,13 +2872,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.13.0" +version = "4.13.1" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.13.0-py3-none-any.whl", hash = "sha256:c8dd92cc0d6425a97c18fbb9d1954e5ff92c1ca881a309c45f06ebc0b79058e5"}, - {file = "typing_extensions-4.13.0.tar.gz", hash = "sha256:0a4ac55a5820789d87e297727d229866c9650f6521b64206413c4fbada24d95b"}, + {file = "typing_extensions-4.13.1-py3-none-any.whl", hash = "sha256:4b6cf02909eb5495cfbc3f6e8fd49217e6cc7944e145cdda8caa3734777f9e69"}, + {file = "typing_extensions-4.13.1.tar.gz", hash = "sha256:98795af00fb9640edec5b8e31fc647597b4691f099ad75f469a2616be1a76dff"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index 36ae50e1..1e56dcda 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "hume" -version = "0.7.13" +version = "0.7.14" description = "A Python SDK for Hume AI" readme = "README.md" authors = [] diff --git a/reference.md b/reference.md index cac14749..696484d6 100644 --- a/reference.md +++ b/reference.md @@ -68,7 +68,11 @@ client.tts.synthesize_json(
-**utterances:** `typing.Sequence[PostedUtterance]` — Utterances to be converted to speech output. +**utterances:** `typing.Sequence[PostedUtterance]` + +A list of **Utterances** to be converted to speech output. + +An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`.
@@ -191,7 +195,11 @@ client.tts.synthesize_file(
-**utterances:** `typing.Sequence[PostedUtterance]` — Utterances to be converted to speech output. +**utterances:** `typing.Sequence[PostedUtterance]` + +A list of **Utterances** to be converted to speech output. + +An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`.
@@ -312,7 +320,11 @@ client.tts.synthesize_file_streaming(
-**utterances:** `typing.Sequence[PostedUtterance]` — Utterances to be converted to speech output. +**utterances:** `typing.Sequence[PostedUtterance]` + +A list of **Utterances** to be converted to speech output. + +An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`.
@@ -441,7 +453,11 @@ for chunk in response:
-**utterances:** `typing.Sequence[PostedUtterance]` — Utterances to be converted to speech output. +**utterances:** `typing.Sequence[PostedUtterance]` + +A list of **Utterances** to be converted to speech output. + +An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`.
@@ -534,9 +550,14 @@ from hume import HumeClient client = HumeClient( api_key="YOUR_API_KEY", ) -client.tts.voices.list( +response = client.tts.voices.list( provider="CUSTOM_VOICE", ) +for item in response: + yield item +# alternatively, you can paginate page-by-page +for page in response.iter_pages(): + yield page ``` @@ -2479,7 +2500,12 @@ from hume import HumeClient client = HumeClient( api_key="YOUR_API_KEY", ) -client.empathic_voice.custom_voices.list_custom_voices() +response = client.empathic_voice.custom_voices.list_custom_voices() +for item in response: + yield item +# alternatively, you can paginate page-by-page +for page in response.iter_pages(): + yield page ``` @@ -2994,10 +3020,15 @@ from hume import HumeClient client = HumeClient( api_key="YOUR_API_KEY", ) -client.empathic_voice.configs.list_configs( +response = client.empathic_voice.configs.list_configs( page_number=0, page_size=1, ) +for item in response: + yield item +# alternatively, you can paginate page-by-page +for page in response.iter_pages(): + yield page ``` @@ -3302,9 +3333,14 @@ from hume import HumeClient client = HumeClient( api_key="YOUR_API_KEY", ) -client.empathic_voice.configs.list_config_versions( +response = client.empathic_voice.configs.list_config_versions( id="1b60e1a0-cc59-424a-8d2c-189d354db3f3", ) +for item in response: + yield item +# alternatively, you can paginate page-by-page +for page in response.iter_pages(): + yield page ``` diff --git a/src/hume/empathic_voice/configs/client.py b/src/hume/empathic_voice/configs/client.py index 81113116..2a77bdfc 100644 --- a/src/hume/empathic_voice/configs/client.py +++ b/src/hume/empathic_voice/configs/client.py @@ -3,6 +3,8 @@ import typing from ...core.client_wrapper import SyncClientWrapper from ...core.request_options import RequestOptions +from ...core.pagination import SyncPager +from ..types.return_config import ReturnConfig from ..types.return_paged_configs import ReturnPagedConfigs from ...core.pydantic_utilities import parse_obj_as from ..errors.bad_request_error import BadRequestError @@ -18,10 +20,10 @@ from ..types.posted_event_message_specs import PostedEventMessageSpecs from ..types.posted_timeout_specs import PostedTimeoutSpecs from ..types.posted_webhook_spec import PostedWebhookSpec -from ..types.return_config import ReturnConfig from ...core.serialization import convert_and_respect_annotation_metadata from ...core.jsonable_encoder import jsonable_encoder from ...core.client_wrapper import AsyncClientWrapper +from ...core.pagination import AsyncPager # this is used as the default value for optional parameters OMIT = typing.cast(typing.Any, ...) @@ -39,7 +41,7 @@ def list_configs( restrict_to_most_recent: typing.Optional[bool] = None, name: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> ReturnPagedConfigs: + ) -> SyncPager[ReturnConfig]: """ Fetches a paginated list of **Configs**. @@ -68,7 +70,7 @@ def list_configs( Returns ------- - ReturnPagedConfigs + SyncPager[ReturnConfig] Success Examples @@ -78,11 +80,17 @@ def list_configs( client = HumeClient( api_key="YOUR_API_KEY", ) - client.empathic_voice.configs.list_configs( + response = client.empathic_voice.configs.list_configs( page_number=0, page_size=1, ) + for item in response: + yield item + # alternatively, you can paginate page-by-page + for page in response.iter_pages(): + yield page """ + page_number = page_number if page_number is not None else 1 _response = self._client_wrapper.httpx_client.request( "v0/evi/configs", method="GET", @@ -96,13 +104,23 @@ def list_configs( ) try: if 200 <= _response.status_code < 300: - return typing.cast( + _parsed_response = typing.cast( ReturnPagedConfigs, parse_obj_as( type_=ReturnPagedConfigs, # type: ignore object_=_response.json(), ), ) + _has_next = True + _get_next = lambda: self.list_configs( + page_number=page_number + 1, + page_size=page_size, + restrict_to_most_recent=restrict_to_most_recent, + name=name, + request_options=request_options, + ) + _items = _parsed_response.configs_page + return SyncPager(has_next=_has_next, items=_items, get_next=_get_next) if _response.status_code == 400: raise BadRequestError( typing.cast( @@ -307,7 +325,7 @@ def list_config_versions( page_size: typing.Optional[int] = None, restrict_to_most_recent: typing.Optional[bool] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> ReturnPagedConfigs: + ) -> SyncPager[ReturnConfig]: """ Fetches a list of a **Config's** versions. @@ -336,7 +354,7 @@ def list_config_versions( Returns ------- - ReturnPagedConfigs + SyncPager[ReturnConfig] Success Examples @@ -346,10 +364,16 @@ def list_config_versions( client = HumeClient( api_key="YOUR_API_KEY", ) - client.empathic_voice.configs.list_config_versions( + response = client.empathic_voice.configs.list_config_versions( id="1b60e1a0-cc59-424a-8d2c-189d354db3f3", ) + for item in response: + yield item + # alternatively, you can paginate page-by-page + for page in response.iter_pages(): + yield page """ + page_number = page_number if page_number is not None else 1 _response = self._client_wrapper.httpx_client.request( f"v0/evi/configs/{jsonable_encoder(id)}", method="GET", @@ -362,13 +386,23 @@ def list_config_versions( ) try: if 200 <= _response.status_code < 300: - return typing.cast( + _parsed_response = typing.cast( ReturnPagedConfigs, parse_obj_as( type_=ReturnPagedConfigs, # type: ignore object_=_response.json(), ), ) + _has_next = True + _get_next = lambda: self.list_config_versions( + id, + page_number=page_number + 1, + page_size=page_size, + restrict_to_most_recent=restrict_to_most_recent, + request_options=request_options, + ) + _items = _parsed_response.configs_page + return SyncPager(has_next=_has_next, items=_items, get_next=_get_next) if _response.status_code == 400: raise BadRequestError( typing.cast( @@ -908,7 +942,7 @@ async def list_configs( restrict_to_most_recent: typing.Optional[bool] = None, name: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> ReturnPagedConfigs: + ) -> AsyncPager[ReturnConfig]: """ Fetches a paginated list of **Configs**. @@ -937,7 +971,7 @@ async def list_configs( Returns ------- - ReturnPagedConfigs + AsyncPager[ReturnConfig] Success Examples @@ -952,14 +986,20 @@ async def list_configs( async def main() -> None: - await client.empathic_voice.configs.list_configs( + response = await client.empathic_voice.configs.list_configs( page_number=0, page_size=1, ) + async for item in response: + yield item + # alternatively, you can paginate page-by-page + async for page in response.iter_pages(): + yield page asyncio.run(main()) """ + page_number = page_number if page_number is not None else 1 _response = await self._client_wrapper.httpx_client.request( "v0/evi/configs", method="GET", @@ -973,13 +1013,23 @@ async def main() -> None: ) try: if 200 <= _response.status_code < 300: - return typing.cast( + _parsed_response = typing.cast( ReturnPagedConfigs, parse_obj_as( type_=ReturnPagedConfigs, # type: ignore object_=_response.json(), ), ) + _has_next = True + _get_next = lambda: self.list_configs( + page_number=page_number + 1, + page_size=page_size, + restrict_to_most_recent=restrict_to_most_recent, + name=name, + request_options=request_options, + ) + _items = _parsed_response.configs_page + return AsyncPager(has_next=_has_next, items=_items, get_next=_get_next) if _response.status_code == 400: raise BadRequestError( typing.cast( @@ -1192,7 +1242,7 @@ async def list_config_versions( page_size: typing.Optional[int] = None, restrict_to_most_recent: typing.Optional[bool] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> ReturnPagedConfigs: + ) -> AsyncPager[ReturnConfig]: """ Fetches a list of a **Config's** versions. @@ -1221,7 +1271,7 @@ async def list_config_versions( Returns ------- - ReturnPagedConfigs + AsyncPager[ReturnConfig] Success Examples @@ -1236,13 +1286,19 @@ async def list_config_versions( async def main() -> None: - await client.empathic_voice.configs.list_config_versions( + response = await client.empathic_voice.configs.list_config_versions( id="1b60e1a0-cc59-424a-8d2c-189d354db3f3", ) + async for item in response: + yield item + # alternatively, you can paginate page-by-page + async for page in response.iter_pages(): + yield page asyncio.run(main()) """ + page_number = page_number if page_number is not None else 1 _response = await self._client_wrapper.httpx_client.request( f"v0/evi/configs/{jsonable_encoder(id)}", method="GET", @@ -1255,13 +1311,23 @@ async def main() -> None: ) try: if 200 <= _response.status_code < 300: - return typing.cast( + _parsed_response = typing.cast( ReturnPagedConfigs, parse_obj_as( type_=ReturnPagedConfigs, # type: ignore object_=_response.json(), ), ) + _has_next = True + _get_next = lambda: self.list_config_versions( + id, + page_number=page_number + 1, + page_size=page_size, + restrict_to_most_recent=restrict_to_most_recent, + request_options=request_options, + ) + _items = _parsed_response.configs_page + return AsyncPager(has_next=_has_next, items=_items, get_next=_get_next) if _response.status_code == 400: raise BadRequestError( typing.cast( diff --git a/src/hume/empathic_voice/custom_voices/client.py b/src/hume/empathic_voice/custom_voices/client.py index 9f3e0333..f3926ae4 100644 --- a/src/hume/empathic_voice/custom_voices/client.py +++ b/src/hume/empathic_voice/custom_voices/client.py @@ -3,6 +3,8 @@ import typing from ...core.client_wrapper import SyncClientWrapper from ...core.request_options import RequestOptions +from ...core.pagination import SyncPager +from ..types.return_custom_voice import ReturnCustomVoice from ..types.return_paged_custom_voices import ReturnPagedCustomVoices from ...core.pydantic_utilities import parse_obj_as from ..errors.bad_request_error import BadRequestError @@ -11,10 +13,10 @@ from ...core.api_error import ApiError from ..types.posted_custom_voice_base_voice import PostedCustomVoiceBaseVoice from ..types.posted_custom_voice_parameters import PostedCustomVoiceParameters -from ..types.return_custom_voice import ReturnCustomVoice from ...core.serialization import convert_and_respect_annotation_metadata from ...core.jsonable_encoder import jsonable_encoder from ...core.client_wrapper import AsyncClientWrapper +from ...core.pagination import AsyncPager # this is used as the default value for optional parameters OMIT = typing.cast(typing.Any, ...) @@ -31,7 +33,7 @@ def list_custom_voices( page_size: typing.Optional[int] = None, name: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> ReturnPagedCustomVoices: + ) -> SyncPager[ReturnCustomVoice]: """ Fetches a paginated list of **Custom Voices**. @@ -57,7 +59,7 @@ def list_custom_voices( Returns ------- - ReturnPagedCustomVoices + SyncPager[ReturnCustomVoice] Success Examples @@ -67,8 +69,14 @@ def list_custom_voices( client = HumeClient( api_key="YOUR_API_KEY", ) - client.empathic_voice.custom_voices.list_custom_voices() + response = client.empathic_voice.custom_voices.list_custom_voices() + for item in response: + yield item + # alternatively, you can paginate page-by-page + for page in response.iter_pages(): + yield page """ + page_number = page_number if page_number is not None else 1 _response = self._client_wrapper.httpx_client.request( "v0/evi/custom_voices", method="GET", @@ -81,13 +89,22 @@ def list_custom_voices( ) try: if 200 <= _response.status_code < 300: - return typing.cast( + _parsed_response = typing.cast( ReturnPagedCustomVoices, parse_obj_as( type_=ReturnPagedCustomVoices, # type: ignore object_=_response.json(), ), ) + _has_next = True + _get_next = lambda: self.list_custom_voices( + page_number=page_number + 1, + page_size=page_size, + name=name, + request_options=request_options, + ) + _items = _parsed_response.custom_voices_page + return SyncPager(has_next=_has_next, items=_items, get_next=_get_next) if _response.status_code == 400: raise BadRequestError( typing.cast( @@ -464,7 +481,7 @@ async def list_custom_voices( page_size: typing.Optional[int] = None, name: typing.Optional[str] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> ReturnPagedCustomVoices: + ) -> AsyncPager[ReturnCustomVoice]: """ Fetches a paginated list of **Custom Voices**. @@ -490,7 +507,7 @@ async def list_custom_voices( Returns ------- - ReturnPagedCustomVoices + AsyncPager[ReturnCustomVoice] Success Examples @@ -505,11 +522,17 @@ async def list_custom_voices( async def main() -> None: - await client.empathic_voice.custom_voices.list_custom_voices() + response = await client.empathic_voice.custom_voices.list_custom_voices() + async for item in response: + yield item + # alternatively, you can paginate page-by-page + async for page in response.iter_pages(): + yield page asyncio.run(main()) """ + page_number = page_number if page_number is not None else 1 _response = await self._client_wrapper.httpx_client.request( "v0/evi/custom_voices", method="GET", @@ -522,13 +545,22 @@ async def main() -> None: ) try: if 200 <= _response.status_code < 300: - return typing.cast( + _parsed_response = typing.cast( ReturnPagedCustomVoices, parse_obj_as( type_=ReturnPagedCustomVoices, # type: ignore object_=_response.json(), ), ) + _has_next = True + _get_next = lambda: self.list_custom_voices( + page_number=page_number + 1, + page_size=page_size, + name=name, + request_options=request_options, + ) + _items = _parsed_response.custom_voices_page + return AsyncPager(has_next=_has_next, items=_items, get_next=_get_next) if _response.status_code == 400: raise BadRequestError( typing.cast( diff --git a/src/hume/tts/client.py b/src/hume/tts/client.py index 9461d19e..f0e21646 100644 --- a/src/hume/tts/client.py +++ b/src/hume/tts/client.py @@ -46,7 +46,9 @@ def synthesize_json( Parameters ---------- utterances : typing.Sequence[PostedUtterance] - Utterances to be converted to speech output. + A list of **Utterances** to be converted to speech output. + + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. context : typing.Optional[PostedContext] Utterances to use as context for generating consistent speech style and prosody across multiple requests. These will not be converted to speech output. @@ -160,7 +162,9 @@ def synthesize_file( Parameters ---------- utterances : typing.Sequence[PostedUtterance] - Utterances to be converted to speech output. + A list of **Utterances** to be converted to speech output. + + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. context : typing.Optional[PostedContext] Utterances to use as context for generating consistent speech style and prosody across multiple requests. These will not be converted to speech output. @@ -264,7 +268,9 @@ def synthesize_file_streaming( Parameters ---------- utterances : typing.Sequence[PostedUtterance] - Utterances to be converted to speech output. + A list of **Utterances** to be converted to speech output. + + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. context : typing.Optional[PostedContext] Utterances to use as context for generating consistent speech style and prosody across multiple requests. These will not be converted to speech output. @@ -370,7 +376,9 @@ def synthesize_json_streaming( Parameters ---------- utterances : typing.Sequence[PostedUtterance] - Utterances to be converted to speech output. + A list of **Utterances** to be converted to speech output. + + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. context : typing.Optional[PostedContext] Utterances to use as context for generating consistent speech style and prosody across multiple requests. These will not be converted to speech output. @@ -499,7 +507,9 @@ async def synthesize_json( Parameters ---------- utterances : typing.Sequence[PostedUtterance] - Utterances to be converted to speech output. + A list of **Utterances** to be converted to speech output. + + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. context : typing.Optional[PostedContext] Utterances to use as context for generating consistent speech style and prosody across multiple requests. These will not be converted to speech output. @@ -621,7 +631,9 @@ async def synthesize_file( Parameters ---------- utterances : typing.Sequence[PostedUtterance] - Utterances to be converted to speech output. + A list of **Utterances** to be converted to speech output. + + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. context : typing.Optional[PostedContext] Utterances to use as context for generating consistent speech style and prosody across multiple requests. These will not be converted to speech output. @@ -733,7 +745,9 @@ async def synthesize_file_streaming( Parameters ---------- utterances : typing.Sequence[PostedUtterance] - Utterances to be converted to speech output. + A list of **Utterances** to be converted to speech output. + + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. context : typing.Optional[PostedContext] Utterances to use as context for generating consistent speech style and prosody across multiple requests. These will not be converted to speech output. @@ -847,7 +861,9 @@ async def synthesize_json_streaming( Parameters ---------- utterances : typing.Sequence[PostedUtterance] - Utterances to be converted to speech output. + A list of **Utterances** to be converted to speech output. + + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. context : typing.Optional[PostedContext] Utterances to use as context for generating consistent speech style and prosody across multiple requests. These will not be converted to speech output. diff --git a/src/hume/tts/types/audio_encoding.py b/src/hume/tts/types/audio_encoding.py index 1851a9d7..b76e3215 100644 --- a/src/hume/tts/types/audio_encoding.py +++ b/src/hume/tts/types/audio_encoding.py @@ -8,6 +8,10 @@ class AudioEncoding(UniversalBaseModel): + """ + Encoding information about the generated audio, including the `format` and `sample_rate`. + """ + format: AudioFormatType = pydantic.Field() """ Format for the output audio. @@ -15,7 +19,7 @@ class AudioEncoding(UniversalBaseModel): sample_rate: int = pydantic.Field() """ - Sample rate of the generated audio. + The sample rate (`Hz`) of the generated audio. The default sample rate is `48000 Hz`. """ if IS_PYDANTIC_V2: diff --git a/src/hume/tts/types/posted_tts.py b/src/hume/tts/types/posted_tts.py index ac398d44..3c2a3a9b 100644 --- a/src/hume/tts/types/posted_tts.py +++ b/src/hume/tts/types/posted_tts.py @@ -38,7 +38,9 @@ class PostedTts(UniversalBaseModel): utterances: typing.List[PostedUtterance] = pydantic.Field() """ - Utterances to be converted to speech output. + A list of **Utterances** to be converted to speech output. + + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. """ if IS_PYDANTIC_V2: diff --git a/src/hume/tts/types/posted_utterance.py b/src/hume/tts/types/posted_utterance.py index c3ec6cc5..7f5289b8 100644 --- a/src/hume/tts/types/posted_utterance.py +++ b/src/hume/tts/types/posted_utterance.py @@ -11,10 +11,8 @@ class PostedUtterance(UniversalBaseModel): description: typing.Optional[str] = pydantic.Field(default=None) """ Natural language instructions describing how the synthesized speech should sound, including but not limited to tone, intonation, pacing, and accent (e.g., 'a soft, gentle voice with a strong British accent'). - - If a Voice is specified in the request, this description serves as acting instructions. - - If no Voice is specified, a new voice is generated based on this description. - - See our [prompting guide](/docs/text-to-speech-tts/prompting) for tips on crafting your descriptions. + - If a Voice is specified in the request, this description serves as acting instructions. For tips on how to effectively guide speech delivery, see our guide on [Acting instructions](/docs/text-to-speech-tts/acting-instructions). + - If no Voice is specified, a new voice is generated based on this description. See our [prompting guide](/docs/text-to-speech-tts/prompting) for tips on designing a voice. """ speed: typing.Optional[float] = pydantic.Field(default=None) diff --git a/src/hume/tts/types/return_generation.py b/src/hume/tts/types/return_generation.py index 27672325..13af43e1 100644 --- a/src/hume/tts/types/return_generation.py +++ b/src/hume/tts/types/return_generation.py @@ -32,7 +32,7 @@ class ReturnGeneration(UniversalBaseModel): snippets: typing.List[typing.List[Snippet]] = pydantic.Field() """ - A list of speech segments, each containing a portion of the original text optimized for natural speech delivery. These segments represent the input text divided into more natural-sounding units. + A list of snippet groups where each group corresponds to an utterance in the request. Each group contains segmented snippets that represent the original utterance divided into more natural-sounding units optimized for speech delivery. """ if IS_PYDANTIC_V2: diff --git a/src/hume/tts/types/return_paged_voices.py b/src/hume/tts/types/return_paged_voices.py index 33bbea55..ccc8ad26 100644 --- a/src/hume/tts/types/return_paged_voices.py +++ b/src/hume/tts/types/return_paged_voices.py @@ -2,9 +2,9 @@ from ...core.pydantic_utilities import UniversalBaseModel import typing +import pydantic from .return_voice import ReturnVoice from ...core.pydantic_utilities import IS_PYDANTIC_V2 -import pydantic class ReturnPagedVoices(UniversalBaseModel): @@ -12,10 +12,29 @@ class ReturnPagedVoices(UniversalBaseModel): A paginated list Octave voices available for text-to-speech """ - page_number: typing.Optional[int] = None - page_size: typing.Optional[int] = None - total_pages: typing.Optional[int] = None - voices_page: typing.Optional[typing.List[ReturnVoice]] = None + page_number: typing.Optional[int] = pydantic.Field(default=None) + """ + The page number of the returned list. + + This value corresponds to the `page_number` parameter specified in the request. Pagination uses zero-based indexing. + """ + + page_size: typing.Optional[int] = pydantic.Field(default=None) + """ + The maximum number of items returned per page. + + This value corresponds to the `page_size` parameter specified in the request. + """ + + total_pages: typing.Optional[int] = pydantic.Field(default=None) + """ + The total number of pages in the collection. + """ + + voices_page: typing.Optional[typing.List[ReturnVoice]] = pydantic.Field(default=None) + """ + List of voices returned for the specified `page_number` and `page_size`. + """ if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 diff --git a/src/hume/tts/voices/client.py b/src/hume/tts/voices/client.py index 64c444ac..313096f0 100644 --- a/src/hume/tts/voices/client.py +++ b/src/hume/tts/voices/client.py @@ -4,16 +4,18 @@ from ...core.client_wrapper import SyncClientWrapper from ..types.voice_provider import VoiceProvider from ...core.request_options import RequestOptions +from ...core.pagination import SyncPager +from ..types.return_voice import ReturnVoice from ..types.return_paged_voices import ReturnPagedVoices from ...core.pydantic_utilities import parse_obj_as from ..errors.bad_request_error import BadRequestError from ..types.error_response import ErrorResponse from json.decoder import JSONDecodeError from ...core.api_error import ApiError -from ..types.return_voice import ReturnVoice from ..errors.unprocessable_entity_error import UnprocessableEntityError from ..types.http_validation_error import HttpValidationError from ...core.client_wrapper import AsyncClientWrapper +from ...core.pagination import AsyncPager # this is used as the default value for optional parameters OMIT = typing.cast(typing.Any, ...) @@ -31,7 +33,7 @@ def list( page_size: typing.Optional[int] = None, ascending_order: typing.Optional[bool] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> ReturnPagedVoices: + ) -> SyncPager[ReturnVoice]: """ Lists voices in your **Voice Library**. Set provider to `HUME_AI` to list Hume's preset voices, or to `CUSTOM_VOICE` to a custom voice created in your account. @@ -57,7 +59,7 @@ def list( Returns ------- - ReturnPagedVoices + SyncPager[ReturnVoice] Success Examples @@ -67,10 +69,16 @@ def list( client = HumeClient( api_key="YOUR_API_KEY", ) - client.tts.voices.list( + response = client.tts.voices.list( provider="CUSTOM_VOICE", ) + for item in response: + yield item + # alternatively, you can paginate page-by-page + for page in response.iter_pages(): + yield page """ + page_number = page_number if page_number is not None else 1 _response = self._client_wrapper.httpx_client.request( "v0/tts/voices", method="GET", @@ -84,13 +92,23 @@ def list( ) try: if 200 <= _response.status_code < 300: - return typing.cast( + _parsed_response = typing.cast( ReturnPagedVoices, parse_obj_as( type_=ReturnPagedVoices, # type: ignore object_=_response.json(), ), ) + _has_next = True + _get_next = lambda: self.list( + provider=provider, + page_number=page_number + 1, + page_size=page_size, + ascending_order=ascending_order, + request_options=request_options, + ) + _items = _parsed_response.voices_page + return SyncPager(has_next=_has_next, items=_items, get_next=_get_next) if _response.status_code == 400: raise BadRequestError( typing.cast( @@ -240,7 +258,7 @@ async def list( page_size: typing.Optional[int] = None, ascending_order: typing.Optional[bool] = None, request_options: typing.Optional[RequestOptions] = None, - ) -> ReturnPagedVoices: + ) -> AsyncPager[ReturnVoice]: """ Lists voices in your **Voice Library**. Set provider to `HUME_AI` to list Hume's preset voices, or to `CUSTOM_VOICE` to a custom voice created in your account. @@ -266,7 +284,7 @@ async def list( Returns ------- - ReturnPagedVoices + AsyncPager[ReturnVoice] Success Examples @@ -281,13 +299,19 @@ async def list( async def main() -> None: - await client.tts.voices.list( + response = await client.tts.voices.list( provider="CUSTOM_VOICE", ) + async for item in response: + yield item + # alternatively, you can paginate page-by-page + async for page in response.iter_pages(): + yield page asyncio.run(main()) """ + page_number = page_number if page_number is not None else 1 _response = await self._client_wrapper.httpx_client.request( "v0/tts/voices", method="GET", @@ -301,13 +325,23 @@ async def main() -> None: ) try: if 200 <= _response.status_code < 300: - return typing.cast( + _parsed_response = typing.cast( ReturnPagedVoices, parse_obj_as( type_=ReturnPagedVoices, # type: ignore object_=_response.json(), ), ) + _has_next = True + _get_next = lambda: self.list( + provider=provider, + page_number=page_number + 1, + page_size=page_size, + ascending_order=ascending_order, + request_options=request_options, + ) + _items = _parsed_response.voices_page + return AsyncPager(has_next=_has_next, items=_items, get_next=_get_next) if _response.status_code == 400: raise BadRequestError( typing.cast( diff --git a/tests/empathic_voice/test_configs.py b/tests/empathic_voice/test_configs.py index 9ed22dd2..67fb0e5a 100644 --- a/tests/empathic_voice/test_configs.py +++ b/tests/empathic_voice/test_configs.py @@ -3,158 +3,15 @@ from hume import HumeClient from hume import AsyncHumeClient import typing -from ..utilities import validate_response from hume.empathic_voice import PostedConfigPromptSpec from hume.empathic_voice import PostedVoice from hume.empathic_voice import PostedLanguageModel from hume.empathic_voice import PostedEventMessageSpecs from hume.empathic_voice import PostedEventMessageSpec +from ..utilities import validate_response from hume.empathic_voice import PostedEllmModel -async def test_list_configs(client: HumeClient, async_client: AsyncHumeClient) -> None: - expected_response: typing.Any = { - "page_number": 0, - "page_size": 1, - "total_pages": 1, - "configs_page": [ - { - "id": "1b60e1a0-cc59-424a-8d2c-189d354db3f3", - "version": 0, - "version_description": "", - "name": "Weather Assistant Config", - "created_on": 1715267200693, - "modified_on": 1715267200693, - "evi_version": "2", - "prompt": { - "id": "af699d45-2985-42cc-91b9-af9e5da3bac5", - "version": 0, - "version_type": "FIXED", - "version_description": "", - "name": "Weather Assistant Prompt", - "created_on": 1715267200693, - "modified_on": 1715267200693, - "text": "You are an AI weather assistant providing users with accurate and up-to-date weather information. Respond to user queries concisely and clearly. Use simple language and avoid technical jargon. Provide temperature, precipitation, wind conditions, and any weather alerts. Include helpful tips if severe weather is expected.", - }, - "voice": { - "provider": "HUME_AI", - "name": "SAMPLE VOICE", - "custom_voice": { - "id": "00aa8ee9-c50e-4ea1-9af0-7b08ad451704", - "version": 1, - "name": "SAMPLE VOICE", - "created_on": 1724704587367, - "modified_on": 1725489961583, - "base_voice": "KORA", - "parameter_model": "20241004-11parameter", - "parameters": { - "gender": 0, - "assertiveness": 20, - "buoyancy": -30, - "confidence": -40, - "enthusiasm": 50, - "nasality": 45, - "relaxedness": -35, - "smoothness": 25, - "tepidity": 15, - "tightness": 5, - }, - }, - }, - "language_model": { - "model_provider": "ANTHROPIC", - "model_resource": "claude-3-5-sonnet-20240620", - "temperature": 1, - }, - "ellm_model": {"allow_short_responses": False}, - "tools": [], - "builtin_tools": [], - "event_messages": { - "on_new_chat": {"enabled": False, "text": ""}, - "on_inactivity_timeout": {"enabled": False, "text": ""}, - "on_max_duration_timeout": {"enabled": False, "text": ""}, - }, - "timeouts": { - "inactivity": {"enabled": True, "duration_secs": 600}, - "max_duration": {"enabled": True, "duration_secs": 1800}, - }, - } - ], - } - expected_types: typing.Any = { - "page_number": "integer", - "page_size": "integer", - "total_pages": "integer", - "configs_page": ( - "list", - { - 0: { - "id": None, - "version": "integer", - "version_description": None, - "name": None, - "created_on": None, - "modified_on": None, - "evi_version": None, - "prompt": { - "id": None, - "version": "integer", - "version_type": None, - "version_description": None, - "name": None, - "created_on": None, - "modified_on": None, - "text": None, - }, - "voice": { - "provider": None, - "name": None, - "custom_voice": { - "id": None, - "version": "integer", - "name": None, - "created_on": None, - "modified_on": None, - "base_voice": None, - "parameter_model": None, - "parameters": { - "gender": "integer", - "assertiveness": "integer", - "buoyancy": "integer", - "confidence": "integer", - "enthusiasm": "integer", - "nasality": "integer", - "relaxedness": "integer", - "smoothness": "integer", - "tepidity": "integer", - "tightness": "integer", - }, - }, - }, - "language_model": {"model_provider": None, "model_resource": None, "temperature": None}, - "ellm_model": {"allow_short_responses": None}, - "tools": ("list", {}), - "builtin_tools": ("list", {}), - "event_messages": { - "on_new_chat": {"enabled": None, "text": None}, - "on_inactivity_timeout": {"enabled": None, "text": None}, - "on_max_duration_timeout": {"enabled": None, "text": None}, - }, - "timeouts": { - "inactivity": {"enabled": None, "duration_secs": "integer"}, - "max_duration": {"enabled": None, "duration_secs": "integer"}, - }, - } - }, - ), - } - response = client.empathic_voice.configs.list_configs(page_number=0, page_size=1) - validate_response(response, expected_response, expected_types) - - async_response = await async_client.empathic_voice.configs.list_configs(page_number=0, page_size=1) - validate_response(async_response, expected_response, expected_types) - - async def test_create_config(client: HumeClient, async_client: AsyncHumeClient) -> None: expected_response: typing.Any = { "id": "1b60e1a0-cc59-424a-8d2c-189d354db3f3", @@ -307,151 +164,6 @@ async def test_create_config(client: HumeClient, async_client: AsyncHumeClient) validate_response(async_response, expected_response, expected_types) -async def test_list_config_versions(client: HumeClient, async_client: AsyncHumeClient) -> None: - expected_response: typing.Any = { - "page_number": 0, - "page_size": 10, - "total_pages": 1, - "configs_page": [ - { - "id": "1b60e1a0-cc59-424a-8d2c-189d354db3f3", - "version": 0, - "version_description": "", - "name": "Weather Assistant Config", - "created_on": 1715275452390, - "modified_on": 1715275452390, - "evi_version": "2", - "prompt": { - "id": "af699d45-2985-42cc-91b9-af9e5da3bac5", - "version": 0, - "version_type": "FIXED", - "version_description": "", - "name": "Weather Assistant Prompt", - "created_on": 1715267200693, - "modified_on": 1715267200693, - "text": "You are an AI weather assistant providing users with accurate and up-to-date weather information. Respond to user queries concisely and clearly. Use simple language and avoid technical jargon. Provide temperature, precipitation, wind conditions, and any weather alerts. Include helpful tips if severe weather is expected.", - }, - "voice": { - "provider": "HUME_AI", - "name": "SAMPLE VOICE", - "custom_voice": { - "id": "00aa8ee9-c50e-4ea1-9af0-7b08ad451704", - "version": 1, - "name": "SAMPLE VOICE", - "created_on": 1724704587367, - "modified_on": 1725489961583, - "base_voice": "KORA", - "parameter_model": "20241004-11parameter", - "parameters": { - "gender": 0, - "assertiveness": 20, - "buoyancy": -30, - "confidence": -40, - "enthusiasm": 50, - "nasality": 45, - "relaxedness": -35, - "smoothness": 25, - "tepidity": 15, - "tightness": 5, - }, - }, - }, - "language_model": { - "model_provider": "ANTHROPIC", - "model_resource": "claude-3-5-sonnet-20240620", - "temperature": 1, - }, - "ellm_model": {"allow_short_responses": False}, - "tools": [], - "builtin_tools": [], - "event_messages": { - "on_new_chat": {"enabled": False, "text": ""}, - "on_inactivity_timeout": {"enabled": False, "text": ""}, - "on_max_duration_timeout": {"enabled": False, "text": ""}, - }, - "timeouts": { - "inactivity": {"enabled": True, "duration_secs": 600}, - "max_duration": {"enabled": True, "duration_secs": 1800}, - }, - } - ], - } - expected_types: typing.Any = { - "page_number": "integer", - "page_size": "integer", - "total_pages": "integer", - "configs_page": ( - "list", - { - 0: { - "id": None, - "version": "integer", - "version_description": None, - "name": None, - "created_on": None, - "modified_on": None, - "evi_version": None, - "prompt": { - "id": None, - "version": "integer", - "version_type": None, - "version_description": None, - "name": None, - "created_on": None, - "modified_on": None, - "text": None, - }, - "voice": { - "provider": None, - "name": None, - "custom_voice": { - "id": None, - "version": "integer", - "name": None, - "created_on": None, - "modified_on": None, - "base_voice": None, - "parameter_model": None, - "parameters": { - "gender": "integer", - "assertiveness": "integer", - "buoyancy": "integer", - "confidence": "integer", - "enthusiasm": "integer", - "nasality": "integer", - "relaxedness": "integer", - "smoothness": "integer", - "tepidity": "integer", - "tightness": "integer", - }, - }, - }, - "language_model": {"model_provider": None, "model_resource": None, "temperature": None}, - "ellm_model": {"allow_short_responses": None}, - "tools": ("list", {}), - "builtin_tools": ("list", {}), - "event_messages": { - "on_new_chat": {"enabled": None, "text": None}, - "on_inactivity_timeout": {"enabled": None, "text": None}, - "on_max_duration_timeout": {"enabled": None, "text": None}, - }, - "timeouts": { - "inactivity": {"enabled": None, "duration_secs": "integer"}, - "max_duration": {"enabled": None, "duration_secs": "integer"}, - }, - } - }, - ), - } - response = client.empathic_voice.configs.list_config_versions(id="1b60e1a0-cc59-424a-8d2c-189d354db3f3") - validate_response(response, expected_response, expected_types) - - async_response = await async_client.empathic_voice.configs.list_config_versions( - id="1b60e1a0-cc59-424a-8d2c-189d354db3f3" - ) - validate_response(async_response, expected_response, expected_types) - - async def test_create_config_version(client: HumeClient, async_client: AsyncHumeClient) -> None: expected_response: typing.Any = { "id": "1b60e1a0-cc59-424a-8d2c-189d354db3f3", diff --git a/tests/empathic_voice/test_custom_voices.py b/tests/empathic_voice/test_custom_voices.py index dfd5d91e..f30479d1 100644 --- a/tests/empathic_voice/test_custom_voices.py +++ b/tests/empathic_voice/test_custom_voices.py @@ -6,51 +6,6 @@ from ..utilities import validate_response -async def test_list_custom_voices(client: HumeClient, async_client: AsyncHumeClient) -> None: - expected_response: typing.Any = { - "page_number": 1, - "page_size": 1, - "total_pages": 1, - "custom_voices_page": [ - { - "id": "id", - "version": 1, - "name": "name", - "created_on": 1000000, - "modified_on": 1000000, - "base_voice": "ITO", - "parameter_model": "20241004-11parameter", - "parameters": {}, - } - ], - } - expected_types: typing.Any = { - "page_number": "integer", - "page_size": "integer", - "total_pages": "integer", - "custom_voices_page": ( - "list", - { - 0: { - "id": None, - "version": "integer", - "name": None, - "created_on": None, - "modified_on": None, - "base_voice": None, - "parameter_model": None, - "parameters": {}, - } - }, - ), - } - response = client.empathic_voice.custom_voices.list_custom_voices() - validate_response(response, expected_response, expected_types) - - async_response = await async_client.empathic_voice.custom_voices.list_custom_voices() - validate_response(async_response, expected_response, expected_types) - - async def test_create_custom_voice(client: HumeClient, async_client: AsyncHumeClient) -> None: expected_response: typing.Any = { "id": "id", diff --git a/tests/tts/test_root.py b/tests/tts/test_root.py index c95a8215..009eaf9a 100644 --- a/tests/tts/test_root.py +++ b/tests/tts/test_root.py @@ -16,15 +16,16 @@ async def test_synthesize_json(client: HumeClient, async_client: AsyncHumeClient "generation_id": "795c949a-1510-4a80-9646-7d0863b023ab", "duration": 7.44225, "file_size": 120192, - "encoding": {"format": "mp3", "sample_rate": 24000}, + "encoding": {"format": "mp3", "sample_rate": 48000}, "audio": "//PExAA0DDYRvkpNfhv3JI5JZ...etc.", "snippets": [ [ { "audio": "//PExAA0DDYRvkpNfhv3JI5JZ...etc.", + "generation_id": "795c949a-1510-4a80-9646-7d0863b023ab", "id": "37b1b1b1-1b1b-1b1b-1b1b-1b1b1b1b1b1b", "text": "Beauty is no quality in things themselves: It exists merely in the mind which contemplates them.", - "generation_id": "795c949a-1510-4a80-9646-7d0863b023ab", + "utterance_index": 0, } ] ], @@ -44,7 +45,20 @@ async def test_synthesize_json(client: HumeClient, async_client: AsyncHumeClient "audio": None, "snippets": ( "list", - {0: ("list", {0: {"audio": None, "id": None, "text": None, "generation_id": None}})}, + { + 0: ( + "list", + { + 0: { + "audio": None, + "generation_id": None, + "id": None, + "text": None, + "utterance_index": "integer", + } + }, + ) + }, ), } }, diff --git a/tests/tts/test_voices.py b/tests/tts/test_voices.py index bdb8f88c..a8d2affe 100644 --- a/tests/tts/test_voices.py +++ b/tests/tts/test_voices.py @@ -6,26 +6,13 @@ from ..utilities import validate_response -async def test_list_(client: HumeClient, async_client: AsyncHumeClient) -> None: +async def test_create(client: HumeClient, async_client: AsyncHumeClient) -> None: expected_response: typing.Any = { - "voices_page": [ - {"name": "David Hume", "id": "c42352c0-4566-455d-b180-0f654b65b525"}, - {"name": "Goliath Hume", "id": "d87352b0-26a3-4b11-081b-d157a5674d19"}, - ] - } - expected_types: typing.Any = { - "voices_page": ("list", {0: {"name": None, "id": None}, 1: {"name": None, "id": None}}) + "name": "David Hume", + "id": "c42352c0-4566-455d-b180-0f654b65b525", + "provider": "CUSTOM_VOICE", } - response = client.tts.voices.list(provider="CUSTOM_VOICE") - validate_response(response, expected_response, expected_types) - - async_response = await async_client.tts.voices.list(provider="CUSTOM_VOICE") - validate_response(async_response, expected_response, expected_types) - - -async def test_create(client: HumeClient, async_client: AsyncHumeClient) -> None: - expected_response: typing.Any = {"name": "David Hume", "id": "c42352c0-4566-455d-b180-0f654b65b525"} - expected_types: typing.Any = {"name": None, "id": None} + expected_types: typing.Any = {"name": None, "id": None, "provider": None} response = client.tts.voices.create(generation_id="795c949a-1510-4a80-9646-7d0863b023ab", name="David Hume") validate_response(response, expected_response, expected_types)