diff --git a/.fern/metadata.json b/.fern/metadata.json index 17981925..78962908 100644 --- a/.fern/metadata.json +++ b/.fern/metadata.json @@ -21,7 +21,7 @@ "skip_validation": true } }, - "originGitCommit": "330b1dab41a5004329de2c1ea6396dc4b1ea930c", + "originGitCommit": "229defd4c32f220af07902c24efca5e94b4c47a4", "originGitCommitIsDirty": true, "invokedBy": "manual", "sdkVersion": "7.18.0" diff --git a/poetry.lock b/poetry.lock index 5578b5d7..bbc6a71f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1335,19 +1335,19 @@ files = [ [[package]] name = "pydantic" -version = "2.14.2" +version = "2.14.3" description = "Data validation using Python type hints" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "pydantic-2.14.2-py3-none-any.whl", hash = "sha256:7efbf7507b937931cd32a5755acb00ea1cf5ccb1d4e8067a5850d5069e382118"}, - {file = "pydantic-2.14.2.tar.gz", hash = "sha256:fb7b2db6cefe8414dd612edeede49c4c433acb0432b0f92b95024e45f66c505d"}, + {file = "pydantic-2.14.3-py3-none-any.whl", hash = "sha256:3f7b347782ab7e4cf4c798496ae3a82787d9f21ec12676a9c564355eeef8daa8"}, + {file = "pydantic-2.14.3.tar.gz", hash = "sha256:1054f237f4d4733e5a30e1e2333bd33a2004ab9ab1510bd053a9a31bb48e232d"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.50.2" +pydantic-core = "2.50.4" typing-extensions = ">=4.16.0" typing-inspection = ">=0.4.4" @@ -1357,153 +1357,152 @@ timezone = ["tzdata ; platform_system == \"Windows\""] [[package]] name = "pydantic-core" -version = "2.50.2" +version = "2.50.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "pydantic_core-2.50.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6258754c473b3045a7aa30b833a8a331a1ab36c6147cb230789861d80bb26f83"}, - {file = "pydantic_core-2.50.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a786cf782ebb2e45a43c7118d75d452aac982b79577dfe804d8dbf2878f0b589"}, - {file = "pydantic_core-2.50.2-cp310-cp310-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:ea71b94a2eb5d2fc102926321f56d2ee8eddfad2673eadb1d23e9f287a492715"}, - {file = "pydantic_core-2.50.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:71615edeaf1ae70f5f3f558426072eede0168b7e5190fd9633878e29a0b85732"}, - {file = "pydantic_core-2.50.2-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:1a5e859f5a8a6d834b0a13acaa0eaddf1a9b4b015fcda13bab7b471e18299d32"}, - {file = "pydantic_core-2.50.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d71a9a9352acbcb5c73d39dd003383599428067b6eda5cf7c5d335a7a0da37e1"}, - {file = "pydantic_core-2.50.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:bf7f99a0e6616cea754e2334d129091f3260d011369d9b8c658522bfb2427619"}, - {file = "pydantic_core-2.50.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5c12a5a080570a91bbcbf6d10db008b80e3f5dea015ef2f0137bbec70f24f3f3"}, - {file = "pydantic_core-2.50.2-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:89213368eef163350af37127939ace099010e8102757905c3e329f1175950ed8"}, - {file = "pydantic_core-2.50.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d93c066a38f83376b5bc020e563666784d1b680a70d6ceb625fdb541af7a312e"}, - {file = "pydantic_core-2.50.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:eec187d2876abb6a74203efbe2aa796455c1809334acf4e739dde35da8cfb69f"}, - {file = "pydantic_core-2.50.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:701bc55d08c22f981973ca4f6fdf4ea102ee1ee3a21b818b66fdb161ea711a4a"}, - {file = "pydantic_core-2.50.2-cp310-cp310-win32.whl", hash = "sha256:7f9821dfc0c473c96ad55ce4189c7cb4f9c94e7d4f563afb874173243dec1162"}, - {file = "pydantic_core-2.50.2-cp310-cp310-win_amd64.whl", hash = "sha256:3939538e640c94ab779a05f2d45dafedd01d65d93e1290797f3ac5b59fcb6455"}, - {file = "pydantic_core-2.50.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2115d7ca6d58554af8a14da3dd32d361a4fe999fae52f115a6155679b5b00e72"}, - {file = "pydantic_core-2.50.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b2dd65864aad38dbcc57c3d0e2c978d4286e063378137d8fc0c9fcd558943285"}, - {file = "pydantic_core-2.50.2-cp311-cp311-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:26b778d4ebb75f181d36220ff0f54a513fc46f053d9b09ce79993c2f00bc45cc"}, - {file = "pydantic_core-2.50.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e80c47314c7233e7105a7efcfffd89d56e479e558189d1959eeeaf2639a27680"}, - {file = "pydantic_core-2.50.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:3bfe12243b3ded517c6734d91f127489e2f51bf95cb533b53130fe360333db80"}, - {file = "pydantic_core-2.50.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:01eb0282d0b3a065d55956d1be9ce398c46db3dd6d277a6cb2358c8aa8c53179"}, - {file = "pydantic_core-2.50.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:196b87b48b2695426920e8470d20f9e99f019ebd86f15808aa018b68086840cd"}, - {file = "pydantic_core-2.50.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:86e7abd24a67f61a4bfe8df059b67a2bdd8bf33705178e98463195d140bd3780"}, - {file = "pydantic_core-2.50.2-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:aff31602e8518594e6f6bc670cdb27e37cb7dbeb2d5d0b76a7707b70fe951ddf"}, - {file = "pydantic_core-2.50.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a88851e8e332588cb8cced8b5318d1163c7d0bb87830aa8dcafbc4ae9602b73c"}, - {file = "pydantic_core-2.50.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3b1bb3950e0794a795c9344d818d5b476189b0c9c9755e8eb8fde87c3acee17a"}, - {file = "pydantic_core-2.50.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:928a44ad1e21a7e923eb924d601605f0694cd187d2ce5d40bf7ad76650f4627d"}, - {file = "pydantic_core-2.50.2-cp311-cp311-win32.whl", hash = "sha256:9a87744e683d9a13f60b7fa5242c17f8d283ffa94ad727cb19063b48c3d34960"}, - {file = "pydantic_core-2.50.2-cp311-cp311-win_amd64.whl", hash = "sha256:b958c217c6e56bef261f516e4caf5d490b079ad6a428752afada5a764cca6c71"}, - {file = "pydantic_core-2.50.2-cp311-cp311-win_arm64.whl", hash = "sha256:b0e6a2152706d84f7da8b9d34dcecc7e9bde678af32c40bd5b405f427ae0fbdb"}, - {file = "pydantic_core-2.50.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e3d824b6152e1c0fd58dc6266f2de470eb7b2286135294f5f7cd26a0f0693738"}, - {file = "pydantic_core-2.50.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:596921489390a002d6a5e303384a0f1f98384f8bb550fbf38a1aafa6093da0f9"}, - {file = "pydantic_core-2.50.2-cp312-cp312-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:36d8b9725684ca3bf658b90a101d335fc8cae405bb22196b7b5ef41344913756"}, - {file = "pydantic_core-2.50.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:43a8fd56f3c681f3cda2d5c842ad28e88241df742dfcbe8fd1dd437a3056e1f6"}, - {file = "pydantic_core-2.50.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:6f5a432c6c1ef18a1a02a04b3616b8d3f2f88b13faa46caae1ac6559ab202234"}, - {file = "pydantic_core-2.50.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5d3cd8be71c4da3c9b42cc92f17e5e3036bdca98bf18555a0e072c3fe87abbb4"}, - {file = "pydantic_core-2.50.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6a438cb8a3f87f2c49e82e43fb19511d4d5043f53e0787dc4df937ccb904373a"}, - {file = "pydantic_core-2.50.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9667637665acba166a7dbbc786f14c50512d3a01f7199e0e1a13b929e92d7c7a"}, - {file = "pydantic_core-2.50.2-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:b3e681208e2d39fde13fbea449ef2736a85ec1ea2afa41e9193a8c536e71dafe"}, - {file = "pydantic_core-2.50.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6eb6ff07964f39e33c6f57fefe939514e76b8c0d4a694e5663e2e04e80cc1798"}, - {file = "pydantic_core-2.50.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:4eb54c25e3463d73e1e4ed439ffc45d1d7e590df40bc7bb06f11a906afd996c3"}, - {file = "pydantic_core-2.50.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:91238117cd296352f54f24117ff5a227bdea428865dba1244aa0cdd1424c0bc2"}, - {file = "pydantic_core-2.50.2-cp312-cp312-win32.whl", hash = "sha256:98722314e12a8e4fa346e0afd3fff2098b5732875ff45592b450a7b589b43c4f"}, - {file = "pydantic_core-2.50.2-cp312-cp312-win_amd64.whl", hash = "sha256:b381574614245f18fdb2d6d1aa8f149e225869c47b5ee7f81812de8977817314"}, - {file = "pydantic_core-2.50.2-cp312-cp312-win_arm64.whl", hash = "sha256:f07c965a8aa6d62145f122641f292129984f39a3e3697585b19298a1488287db"}, - {file = "pydantic_core-2.50.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:93eb41d626d9a2749a678823c70bba8c25033cef474ae8001fd7621adbbd8437"}, - {file = "pydantic_core-2.50.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c539d452cba22f250103c7d1c00cbe9038eb705e657476e701c43374efd9f2e"}, - {file = "pydantic_core-2.50.2-cp313-cp313-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:53bd25e8ab54c02bb4c55d4848c1d36f75f3b9a7356e83179fe27794d9e9e6c4"}, - {file = "pydantic_core-2.50.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f142cd663d1148ed32993ed9a58e5c67ea312f446a01a6c13a956945aafc9f23"}, - {file = "pydantic_core-2.50.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:126f158474346f457c0759c29c1a6334acd5f7f99dd272bb27d19314f3d81b4d"}, - {file = "pydantic_core-2.50.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:0b94a515f44f1ebcb25395bcdba506c4cdaf6d3fcb0466b9658521b41e5ff057"}, - {file = "pydantic_core-2.50.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a55c1163e829a08707b4a92c8ee02a5a3a3847ced74aa4da94e3e975ffe1ec63"}, - {file = "pydantic_core-2.50.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:31a1fb3ffbd1195b24490f671d12623dd4c9bfa56d6af0a299fa43b516134f5b"}, - {file = "pydantic_core-2.50.2-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:83d6f42ae6eba44548a1a3d4f900a5b1500fdd14f09f04754a8800ab0d544432"}, - {file = "pydantic_core-2.50.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:9fcde11462e0faab4c2a2ae8cd4516f7dd8239eec583bd88c5524d8064ad2d0c"}, - {file = "pydantic_core-2.50.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:848984e231190ae49bc8b5229e64d2a6fba4231dc6046e1b6b28ddc060bc7601"}, - {file = "pydantic_core-2.50.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:8772c2c0091e6fc2d0499151793d31bf811826986b0727052935a95104845544"}, - {file = "pydantic_core-2.50.2-cp313-cp313-win32.whl", hash = "sha256:bd6ecae08c0d871cf93b6f0d4ee76b06c65be44ea22311981a022b2f1948cf9d"}, - {file = "pydantic_core-2.50.2-cp313-cp313-win_amd64.whl", hash = "sha256:e5c801bdf3cc92274b8fc2c7023c8751e5ae81260c009ac558ff55ce712a2d45"}, - {file = "pydantic_core-2.50.2-cp313-cp313-win_arm64.whl", hash = "sha256:fd9aa71a800c87c0f7ab53fa38009169a23a82c685989626ca74a4bd483e1b67"}, - {file = "pydantic_core-2.50.2-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:efad0bdc67d3b119c3bab6b94d341a27333c2bb89ed75dfa182a4a06cd0ea329"}, - {file = "pydantic_core-2.50.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6ffb4dce3ecb2cd563aa30f9eb5088a1cf1f4f688b90cbb374fa96e49fc50b02"}, - {file = "pydantic_core-2.50.2-cp314-cp314-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:150f6e101f575c21a4ecfed1be1c05bb89a0ad49cb9c846ed377583bd71b32c2"}, - {file = "pydantic_core-2.50.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1db9cab6197e797824f0479dd2ae5fd2e272aa61c61b7faa5a6e450ca7a0d3b7"}, - {file = "pydantic_core-2.50.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:1b9f652e17a13bbc09b45f74c3c326cca72059ce4dcdef687fcb04389db413a9"}, - {file = "pydantic_core-2.50.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:823b222c4fc861a82c650998a6117ecbd150cc71bf8b78f9a31bf3f48c456108"}, - {file = "pydantic_core-2.50.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:783abdfac21247d33bec40aa683d26bba30d61655c40de38b2decc4797aabf92"}, - {file = "pydantic_core-2.50.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b29b7c5adf4b2be7c941f7f76432aa3269cd5052ff8610376b8ece24d7b02c51"}, - {file = "pydantic_core-2.50.2-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:4ac996e42a93d80122a23edce44e02c6b9c4913f5c6198a077da31475341a39a"}, - {file = "pydantic_core-2.50.2-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:99e1d482138a71902415ba375bb4627679a5fefd3bd07803c3a8f37632f4981d"}, - {file = "pydantic_core-2.50.2-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:a53d5f11cd6d15569ba3e53f3498077f0d5e633f6ec604d2ea613e895017ebee"}, - {file = "pydantic_core-2.50.2-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:23385c4626f8b5a7792aa381ea573d9432cfbf4c21375a0a5eed2a4fb64e0e58"}, - {file = "pydantic_core-2.50.2-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:9a8a62281fd9c6a373b3fd3d473685e6838d43341eecde5f47729748e2c11ee3"}, - {file = "pydantic_core-2.50.2-cp314-cp314-win32.whl", hash = "sha256:18f008ef58cd30782f81b6e0119e20b7e884edcefbc2d370162ebe033f6e5c99"}, - {file = "pydantic_core-2.50.2-cp314-cp314-win_amd64.whl", hash = "sha256:b62c89545d21d930c333208fd548e7b4f262228ba3a322fd75c987a75ab11f31"}, - {file = "pydantic_core-2.50.2-cp314-cp314-win_arm64.whl", hash = "sha256:6e731bf5a5e8e25398544d7709e39068ec4230b0177e4db7fa955692fd415ba3"}, - {file = "pydantic_core-2.50.2-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:33c6800ab9563adaa0d7893e9cd8f5b972ef1e6a23df70498e05c24f3fcec5e1"}, - {file = "pydantic_core-2.50.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f81df206b937d0dca5efb38c25fc99037d82dbcd3740e34c3f81997d2322ac1c"}, - {file = "pydantic_core-2.50.2-cp314-cp314t-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:21ea3b00f1e87c66f3f9e92f9f6fec20495ac0e60d7d2e68ba1fc49739d7cf40"}, - {file = "pydantic_core-2.50.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9eff570402175c7d5fff8497d5a9c05580664a79bb66c07b8f205d17f69e580b"}, - {file = "pydantic_core-2.50.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:240fec32a74af0979f7253532859b3fd209ad5eea822416bb010929dba445c3d"}, - {file = "pydantic_core-2.50.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92acf02c770b9d5c4e9a3e8d64e9d95ae26456a86ebb7b7cf64a97f899e5871b"}, - {file = "pydantic_core-2.50.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:1ac5b99bc7b0a68ec64f5f75a6828a7bab5535c8df0cdc07901deb50e0815910"}, - {file = "pydantic_core-2.50.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:713d7c33c0e231e3786eb0ec95885814dd65d5f3a09754399b6acbf5e9365f11"}, - {file = "pydantic_core-2.50.2-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:61e13100b30d8d25fc0d1f0297014b32941bf0975a3584bd08f3adebb68d1ead"}, - {file = "pydantic_core-2.50.2-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:523fe6574aea50f456cbc301c1cdddcbf237939f7657f9af99b4f0f71942b59c"}, - {file = "pydantic_core-2.50.2-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:6c25b8826be85714b27dafe908d3461e1b09e3e31c0279a7029040c832c781ef"}, - {file = "pydantic_core-2.50.2-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a59db03b80a156a6fbeae41096866d1cb89cdf31031ba44c768a804538880636"}, - {file = "pydantic_core-2.50.2-cp314-cp314t-win32.whl", hash = "sha256:0d090ae76d5b09c003600c7779b3adcf3d1b49268f616c5c51d844e54c8e318d"}, - {file = "pydantic_core-2.50.2-cp314-cp314t-win_amd64.whl", hash = "sha256:9b01a092955c1c7530196ad526755cff4f2d11f37ca9a6fc9ebe37ca49a48977"}, - {file = "pydantic_core-2.50.2-cp314-cp314t-win_arm64.whl", hash = "sha256:4ea01f30e119f1ec7a2034e85c40f491d469896aef02cd6436fd9292fe1be3fb"}, - {file = "pydantic_core-2.50.2-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:a3317630e2791f56071b82f89bb71624146125e4311e6643f708c6ba744b5ac5"}, - {file = "pydantic_core-2.50.2-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:f73930dacad5e611fe019e18df6f53c30629b1843d038d303b8dec86a32493bd"}, - {file = "pydantic_core-2.50.2-cp315-cp315-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:e2e6240a0a5ad847017b3d65187877fdb7a11d5a58d43c30736f9f523478913b"}, - {file = "pydantic_core-2.50.2-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1fdf5b52ed22f1404c2433d0b46df2d86d9befb742d0b9b4042a2325c43cdb97"}, - {file = "pydantic_core-2.50.2-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:4e9392ddf67fe97ab9889f796d468c9908a8754b8b6c7520eb03a65012b9a1e7"}, - {file = "pydantic_core-2.50.2-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:48e944091b7bff233920bed8a60b0ed6c96c73d3c5836bf51c4b9a4bfb58e4ca"}, - {file = "pydantic_core-2.50.2-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:91c92856b846aa690ea6239ffd6c5003c5e3e296a69095570bf4efee5bfa0bdc"}, - {file = "pydantic_core-2.50.2-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5299296ff5cafcb69851fd652de8f9268a0bb036bcbedbfcaa94cf743baf3986"}, - {file = "pydantic_core-2.50.2-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:d3d049b557875f9d15230eec8a731749a7a873d8ed6a051903b05bdf46e0e65f"}, - {file = "pydantic_core-2.50.2-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:b0b25d647036972c2951059046cb498f72b7af5a2def27bf8e5f44c3067ab7dd"}, - {file = "pydantic_core-2.50.2-cp315-cp315-musllinux_1_1_armv7l.whl", hash = "sha256:8835566b3e94026da3ce2249f9ee35c9d2ebe4cd131f6a39bfc82708d3010a46"}, - {file = "pydantic_core-2.50.2-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:3fbcd402e4b607d4b8de5d4591215f31f042af03f9d09e58f693a6221e32833f"}, - {file = "pydantic_core-2.50.2-cp315-cp315-win32.whl", hash = "sha256:8431ecb131489cbdaf6f51f7ade47475f73aff4f1912552f75ba19a6cfe233a8"}, - {file = "pydantic_core-2.50.2-cp315-cp315-win_amd64.whl", hash = "sha256:04cf672960b8c4fc28bb159c8cdd101fbd311c520237a5c0360448b851adfb41"}, - {file = "pydantic_core-2.50.2-cp315-cp315-win_arm64.whl", hash = "sha256:36917e29c0b815d6b940bc91560fcf453b5b85d55c579796373f0ea11d1c111a"}, - {file = "pydantic_core-2.50.2-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:bd1fe69056a19c377a6c6de2c1240fb8676ba0512a969965efb486510c5e0f1f"}, - {file = "pydantic_core-2.50.2-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:9b2383933b1dd7a8c93e02f99ebfd305f1286057172483b8e6898bed3fef69d3"}, - {file = "pydantic_core-2.50.2-cp315-cp315t-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:a1b4d60bad57d6e0e7cd30cc4d1dc646d258dd6dfb7935ce76c7dd72dd1e98b0"}, - {file = "pydantic_core-2.50.2-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:93bedc68c4138088ea3c042189c01d2945f530f0dcc36e1ea02df8418bd4f1cd"}, - {file = "pydantic_core-2.50.2-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:d684ff87d00de2f6abcbbfa9b0fdce8b513dd799a900809dcfa7eb62ad69832a"}, - {file = "pydantic_core-2.50.2-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bb6d49f00e2babd40af4889d6b9f4bf50879f522dd4e2e22cb705cac5e0c5e8e"}, - {file = "pydantic_core-2.50.2-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6d47b2d0e00e030e0ebdb08115a37da7294e7a6d196d134a77ed7ee6c142284b"}, - {file = "pydantic_core-2.50.2-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:95838be125133fa314753f8cc5168f7c41e3a9dd5eef5383dbbbeed511bd4853"}, - {file = "pydantic_core-2.50.2-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:2d4a043c820363359e40ac96270e1915e5376e116be1f59cee0701775de3e376"}, - {file = "pydantic_core-2.50.2-cp315-cp315t-musllinux_1_1_aarch64.whl", hash = "sha256:57bccd3e1128736c792094da1feac6da46ec3feb1957ef649a9b3e4f8de6fa04"}, - {file = "pydantic_core-2.50.2-cp315-cp315t-musllinux_1_1_armv7l.whl", hash = "sha256:24120c644322a35b5eb765416ac8442214c45689e255f5fc6e761e7e7c743c8b"}, - {file = "pydantic_core-2.50.2-cp315-cp315t-musllinux_1_1_x86_64.whl", hash = "sha256:b1adf2f37521b578c438f6ec61d1c1d0c20b076863ddd5d8b6f3ab658857db3f"}, - {file = "pydantic_core-2.50.2-cp315-cp315t-win32.whl", hash = "sha256:d79aaa468193c1bed6b0560d3c5c9f9e369e3efb0b128b38a2537e2d51d42773"}, - {file = "pydantic_core-2.50.2-cp315-cp315t-win_amd64.whl", hash = "sha256:cc488daac19e6f5292180fac5e0ef7efffabeef4e096af9a17a75a7d3d6781f6"}, - {file = "pydantic_core-2.50.2-cp315-cp315t-win_arm64.whl", hash = "sha256:91315aea7adb51821d4a3378ede953bfdd76e3bf71551de4a82d7638cef7dc02"}, - {file = "pydantic_core-2.50.2-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:adec010c824290d4ca87047e8d8bfa4f85ac29f545f326cd5321696805d311ed"}, - {file = "pydantic_core-2.50.2-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:f47c1349c3b4274aeb18459d54244881a5c0dee0fdccedffca45704ba5c9e0a0"}, - {file = "pydantic_core-2.50.2-graalpy311-graalpy242_311_native-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4ee64baeab403b9de9c92846c5c1abec28ffb046cbc023bfae059897841f88af"}, - {file = "pydantic_core-2.50.2-graalpy311-graalpy242_311_native-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:16ec8e07c37f02dcf68939cc7f202ba9a148cc155ee2acf22d337e10b24c2cb7"}, - {file = "pydantic_core-2.50.2-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:d18d56c1ec63b304f4bb3c7db7e0d311e61cca1b1c944590a4b13ac39b2ca92b"}, - {file = "pydantic_core-2.50.2-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:41ed8abeffda6a880207fdc0cd1343a448cec3cc6b38b53f730c0745f745292d"}, - {file = "pydantic_core-2.50.2-graalpy312-graalpy250_312_native-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b7abcfaf66c1dc14c5ed928c349614f223c972a8b021b4be9548dbea6c817371"}, - {file = "pydantic_core-2.50.2-graalpy312-graalpy250_312_native-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9e7460abce637f90e37f8c443559fbd687c38884d05cb69ef265e634945f4324"}, - {file = "pydantic_core-2.50.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b583ddeee6a6bb5bbc04462167c68034913221139d52d9f155ca6d1637a2fdcf"}, - {file = "pydantic_core-2.50.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:5ab5738c39b25b5dc5a721270e2269a2f5e86e614375e6c07ee6caab8cbc0f2f"}, - {file = "pydantic_core-2.50.2-pp311-pypy311_pp73-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:21a902e546032c82b7275552345a2342d862e0541aea7226c91067c396e68b3f"}, - {file = "pydantic_core-2.50.2-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:92ada606285dab054e40848a951f583c537cde1e54701ea1305ec0096877012d"}, - {file = "pydantic_core-2.50.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c1b65a42afc73b39e6ae908ec7b9c3b9898676a7b15ce4c66d4965f7071007c8"}, - {file = "pydantic_core-2.50.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c324a7e0c0012e3974053f81a270d8f1aa23227571f4ddd3254c911bb356459b"}, - {file = "pydantic_core-2.50.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:cb8d2d7b07cbe2d7488de7e53671f836c4f4a8032dcda079df33dc1b7e2397c0"}, - {file = "pydantic_core-2.50.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:7c6e1bd6cadae13958e52897ef020e85c9916a95917149fca463bb0c0421a7c6"}, - {file = "pydantic_core-2.50.2-pp311-pypy311_pp80-macosx_10_12_x86_64.whl", hash = "sha256:f078e276848bc23d1f92f46fc88d5b9cbb824b9acc60d9e07116620e502e16a9"}, - {file = "pydantic_core-2.50.2-pp311-pypy311_pp80-macosx_11_0_arm64.whl", hash = "sha256:3435c443da7510a6de1a30c68beae338852a11f0440cc8320ea756a162f38dbe"}, - {file = "pydantic_core-2.50.2-pp311-pypy311_pp80-manylinux_2_28_x86_64.whl", hash = "sha256:b5675a12a7b67063fe3ca187e735b0463cf13fabc10166ae4d4b2f775fd0632d"}, - {file = "pydantic_core-2.50.2-pp311-pypy311_pp80-win_amd64.whl", hash = "sha256:f5ba7ef10ce82737e173fa95cafa1c8210918f7e653715b2c7a7a31877a74848"}, - {file = "pydantic_core-2.50.2.tar.gz", hash = "sha256:1b0e8dc3932cf4e9ed5727570325cacc716b9409ffc794a221c0ccc72e8eb775"}, + {file = "pydantic_core-2.50.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:83d2beac85b757bfc404c5c0612df51c4ef33bbb7be65cf4a96b4da7cbc4ff4f"}, + {file = "pydantic_core-2.50.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76e0065998159244ff4c097a6c05ff08019c6fbb6e597a85846e73044f0215b3"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:25e7e1080f9f7ce7cd9d114b31470ce912771bd02f38c824721d3c35d312abff"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c4c5a1770ecfe8bdb6c6f09f8d81ea4de04f7efb012fac1efa4ad315dccc1fd1"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:2f6767122b37c780bb756a720a4eef2bc6a050a0a1143428834b3cbc89448bd2"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:86c7c4615634b5c57a79770f5b738354e45ae219a89949aeae84f19169a05283"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6c7d7b0b596319e9ce79ef96ce57a14054a2eac629c0588a0539187a218be799"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ed9c0b6f236648dbf30d57e9f57e1f74878caafa04833a19f529b5ba5164b7a8"}, + {file = "pydantic_core-2.50.4-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:dfcf6e51000b34f7026322cd9ea9bc340d745637e27e0bbc22f504b4f6b967ee"}, + {file = "pydantic_core-2.50.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bd46bcc28ed85d3cf71581b42d90b4ebd1f2062f81879519fed209f8a4d1cfc6"}, + {file = "pydantic_core-2.50.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:696613a0c0e7b2b35356e389ba4195ce20cfe7a2fc2e992c87d974d973eabec7"}, + {file = "pydantic_core-2.50.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2980a701be88f9128a7470189fa3bcda5387f76c298a6f8e000fc29eb2a6f4e7"}, + {file = "pydantic_core-2.50.4-cp310-cp310-win32.whl", hash = "sha256:dd8bed00731a21e3106e5dd6bbffb6c775a2c0bbc7c0c9face534d830057bdc9"}, + {file = "pydantic_core-2.50.4-cp310-cp310-win_amd64.whl", hash = "sha256:e512c75ec5cf4475c1aa50ad975ecdf253f4963b06e152e1a11edd6de4010753"}, + {file = "pydantic_core-2.50.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3e547ceec1da7382f01f9e13963023e53367a71802c88778b21b9645a077cbdf"}, + {file = "pydantic_core-2.50.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c813ada7a651193acda85b6bc1cf12abd4b37cd25c7c6a75d7183512cc374969"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:57fa0a9490785139f1a4e4f43891830d55dfe4408845c0c9cb5eff4aeaf75f69"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:30d4dc35bc0eea52202a90b3820445ee0072c820241bfa710a623a078c9b267b"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:789f88dea57841cdebef392b5d6e90444d767117e9ff2e0d9172df5c9de6690c"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d690121e80ab16e623415351ab24713534d4e500b3cadff216409cb6826063d4"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b42f64825f5d750228f08318a9bf4d723b7ecb4c472aedcb3013c3ec2dc1f949"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0574866e05f6adeecc520d87e87dd06210c0a51706341f6ef8421572f5a64444"}, + {file = "pydantic_core-2.50.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:dcf2c7eaaa4cafe8e49b017e5bb49e76e084ab6f0cd712ee4019c812b5cf68b8"}, + {file = "pydantic_core-2.50.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3b8ee2589a082739c522c1fe4be227412fcf108b903abb6672ae2f5570558882"}, + {file = "pydantic_core-2.50.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:aec3c2d741a8e3ee993de7f95f37afb51e31b169c95dbd29da4cf6688f340914"}, + {file = "pydantic_core-2.50.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8923fcd49f875e8a0448d7223d1fdf1a9973ae2d1f20d4158753ceb8909facd2"}, + {file = "pydantic_core-2.50.4-cp311-cp311-win32.whl", hash = "sha256:fc04affef30be98c1f36f0c422a4061ef618fdc1dde79f5ad5458dd496fecffa"}, + {file = "pydantic_core-2.50.4-cp311-cp311-win_amd64.whl", hash = "sha256:15bece43a02ad543c621c8305e67dedb5f27d378c5ba741e5a2c36523f8ef37f"}, + {file = "pydantic_core-2.50.4-cp311-cp311-win_arm64.whl", hash = "sha256:e498900bfbf7ddddd862f810440c09e9b81674739e8a11d619b40906dccd4a9a"}, + {file = "pydantic_core-2.50.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:32a991aebd165f227b7c7c60bb9d66c2c7de9c24308552da264c9938fde0f8d6"}, + {file = "pydantic_core-2.50.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e20cbde2b6deb33a51d08cd168454dd9044ec7d4474056f4d98d63f51578783"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:8cceae48ae7f94990c2f4e36291e9ec9868735e8b0f19e4489a17b0422338466"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:16902a147b3da4840612164a5e67947104d63e978f7a57c395877a5e26690b9c"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:d6e3485a5e5c01fb5339c1ee3d4b9e21e2135a2a9d44caafb71acd994487ee7c"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:629eae995185540406e3635df5d5cf1d44f19ea240840b835d3f44541ff694d8"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:41b2cd8b29dbb5a4c9828a70f50d1abfc92011115c813213d3a91205c6f731b3"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c81d98e27d9d9261909dcccab1ba5d6ea1c98b0bb9470e368604614fd1d36ddd"}, + {file = "pydantic_core-2.50.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:ca83a32b2b41653d89f09a3d22b770bca96da72273bef8f7a68136bdd1e8b823"}, + {file = "pydantic_core-2.50.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:817953730e4a73a09008b010c4a42396cefe799616a22df2ac21d3927b3080cf"}, + {file = "pydantic_core-2.50.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:664e74848c2f5fc27db8505fe24e1ecd3ac669412913bf73d176916f86cc08e2"}, + {file = "pydantic_core-2.50.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:219114f8dcdcbe4720d82ef016b1287ce5a0a67d7c69ca61524eb72e82aac344"}, + {file = "pydantic_core-2.50.4-cp312-cp312-win32.whl", hash = "sha256:67f7cc397e1d5556a801d1cba74de0d27d827eb242e6c036c0ca273c745414f1"}, + {file = "pydantic_core-2.50.4-cp312-cp312-win_amd64.whl", hash = "sha256:ea2f61b0bc12f3592288503961b764579dea0658852d96a0b3d823614d808821"}, + {file = "pydantic_core-2.50.4-cp312-cp312-win_arm64.whl", hash = "sha256:32d6dda86383645ec428ea64dfc277036f5cbc60a72238eab28b91a3fdb9a113"}, + {file = "pydantic_core-2.50.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0f87ae9db5ba8d8de40dcb93982cf8dd544e6552a80d3345af51941cc2146b80"}, + {file = "pydantic_core-2.50.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1239daaf063e62213ca1f34d96663900bd7510c42a786e843fd328af70e46445"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:1afefe44ec042fbabfb4483ea258c04cf75ff4ff328d754f09b321fdaa232aca"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a9ee990bf2cfbd81574c5d4f9f6c9d480a14b5b43d2c4f2ca13f4c6f48089394"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:ab2822bcdcefb54d1e8ca29f5e3ec3afe160fb794bb3a3a73b09d11ed2671104"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:0001d6920e3a5d92758cda460d6dc9f918a78ad6d5d092f1c8b5395e6b775356"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:ad92d255a165cde5f9882ff69699eaf5495e0a1f32e97566bbbb80f11e46781f"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fb2bb5b557080da398b866408117d98fe9731a12334afd0cdff221b458cdc5dc"}, + {file = "pydantic_core-2.50.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:92f8f63df729061bb14558ed740e7a222f6e2aa6c2e6a5bcfb4e706676562049"}, + {file = "pydantic_core-2.50.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2a60ec2a57ac3ef3767e526e9bf706ec75aa3d79c4ea134d9d4fcf7c62a297a7"}, + {file = "pydantic_core-2.50.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a2f8716344bbbd10443391be0b1f2003b34949e3c4e6883005c2bc498ab6b64b"}, + {file = "pydantic_core-2.50.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:b300a30304c4c6aeab03ed06809819d9eceacdd58441d3c7dffe41edfd006091"}, + {file = "pydantic_core-2.50.4-cp313-cp313-win32.whl", hash = "sha256:ef8a9ddb2e2a4eae4abb72dc0710eca6c2726779b0664bd10c3ce9fcfaed8c4e"}, + {file = "pydantic_core-2.50.4-cp313-cp313-win_amd64.whl", hash = "sha256:4c29b8f2d6417069bb1f257e6b9113f5d64dc2f554cc200ea90b4fe2c5cdb733"}, + {file = "pydantic_core-2.50.4-cp313-cp313-win_arm64.whl", hash = "sha256:a0c5210d038418a115e7cf8706bfa611bd14add2f5787274dba45aadca3155e0"}, + {file = "pydantic_core-2.50.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:5c074454dc6d4f6f4ba6561a56bf33a14db7651d882a5a5321ba3ae8868e082d"}, + {file = "pydantic_core-2.50.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a4bb174bd65f795c39ad6642d9d5bdc43351b306b7d0a654ab0d0abb38be245f"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:0ec20aca2b067369913716847f7dfe5f4dddf16a46965b7a70bbad5defaaba86"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:70dbc9f83c41f37a4faa62dae5203853847223a891da446f48ef2efcfd5df806"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:3de6c2a4df2af0ac9ab4dc1488746fe8b1a90e27955d870d9edda3187d20092b"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3a48a5254d15a0ad050318bfc7a9566d4ec740118187e8f303e47a6840287eb7"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:0af56dbf8822ba9f4efcbbfdc15478f8b6fb08f1609860cb50aa2cc8476b3c34"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f1d62fb172db35c6478c9323da34ff37d1f3d37d7d44337a9d94ba8c583e5730"}, + {file = "pydantic_core-2.50.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:5c1013647be741647895c102831dcf79c34209662dbb683df9efb864417ed7d5"}, + {file = "pydantic_core-2.50.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:aeb2e123cbf978a905e9f55155c1b8316fbbfa7cf64d04521fe174bab302d100"}, + {file = "pydantic_core-2.50.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:523466eba8ee10f7480f3c2057563145978011c583130d2cc01fb1e7af808e25"}, + {file = "pydantic_core-2.50.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:c9e70012926e97069cdd09221861aff412aa94e4cac2e019055cdb79485b150c"}, + {file = "pydantic_core-2.50.4-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:e6da138a1ecc1341c8b788a5ee822670b03788e1f5decf7af9d461de6e508b8e"}, + {file = "pydantic_core-2.50.4-cp314-cp314-win32.whl", hash = "sha256:13b6dd62b5279f5b9d72f3bf918a35443ee8bd549241d9dc52d79a2c3b6d7016"}, + {file = "pydantic_core-2.50.4-cp314-cp314-win_amd64.whl", hash = "sha256:b0cdb655fbd1562c2dfc9986f9103a106f7058cd0915afc6e656d4b1d73f3387"}, + {file = "pydantic_core-2.50.4-cp314-cp314-win_arm64.whl", hash = "sha256:df1c174796cd63eb6b139f7daf783affe1f3ed659605850e843b24764c21bfc5"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:edbca8789fd10f0de534b660a6b4c71f1fd18039679c918dad392ab044bb37e4"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:33b21f69540a12c2053cd1d95766d8bd9667a3897f7c712a642de8aa37eb0865"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:ffb616d8d55965839670301dc3bae3abacff560a7e137a89056058a8a9da4d96"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6c5687b59b6ba0f663c4f2f15470f68507d6b45ccd3a19ee6d224f95cbee70d8"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:c733087ecf7dde06b1d071679bfd5f3ba03266ba77814c1c7253bc48c9adedd9"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94733cb447c37b0ce6f71b39ca1288d5f966a084023a5617b4cc35a852586859"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b26f39a5be3cd91a2035818be3d0ffdf5282c3e1f5f53d3b80b7024021acee52"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c856e439a9d54d514e81a7131229ba151cdf81df7c408e0f6c89340e5003dfe2"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:cbf0777d54672990b10cb8ca9b0523499e182d7e2ea39f86b138519a902aa601"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:edc17549ab592e33cfcaf285f047bb75fcd98f608aa9309af1187fd736ce9641"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:23a9ba564b2db709ff16eca990992ba95a19069972b34bff87c81d4b473cd755"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:41f4f8ae714e4fea1d635880f8a1af715ecf080eed4d13c5b04a0f3210f9c61a"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-win32.whl", hash = "sha256:601fce6cea9ddeaa85329e12e7f351def38d233075f42a3012b9c48071b02941"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-win_amd64.whl", hash = "sha256:22e874666bdbd96d6bf629d32cd8ab376fedf1fd62585b52a42b9fa9fa6c20b6"}, + {file = "pydantic_core-2.50.4-cp314-cp314t-win_arm64.whl", hash = "sha256:71395a43da5584bb70556f380387e15f845c0dcf76373c1afbfa0025737576ac"}, + {file = "pydantic_core-2.50.4-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:7ac2769a7ddd661e07e26c12220adc31b17014c48234b2a5a88993b8d4109e09"}, + {file = "pydantic_core-2.50.4-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:930ad463d3fb7a340d323bcc496ec32dae469ec9974c29ff569f19806b6b03b4"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:b867f9fd183d76977f810c626d539265183c25b2284762893a31e8d6cacc81c0"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49eb1241a969a5994db6880c18c012b6cbe2340343d8f529721571806583e500"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:477af785d1846e4e96bf56983b92ea7553aaeccdeb8acdaa55c7cee9eda0ae32"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:29358a8ca74e7d81158d14e2b10c904bd18773293ae3788716c0626fe0342347"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:300753f71c73302e218124baf995f00058e085cd01869bd9610bcbd0bd4500c1"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:26cb012c4b8ca9f847bd0ac15978bd3d0f55b050bfbe6c47355edfc7e945029b"}, + {file = "pydantic_core-2.50.4-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:9be1cfe715ecaa060ffd5d599ef410b94ef2697a0eed4cee562f788a2aa2175b"}, + {file = "pydantic_core-2.50.4-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:c81e35862aced259177a537ce1a6264c3a97bae1ced184ca9dc10ea754563688"}, + {file = "pydantic_core-2.50.4-cp315-cp315-musllinux_1_1_armv7l.whl", hash = "sha256:b2f2d13239487cecaae98c9f4d5904ad0737643cdf8873c88ec6a78b12214f20"}, + {file = "pydantic_core-2.50.4-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:e6b4b08d09054310a4dc389fa61ee22a7a5a292cb23ab8a985136ca8828bf924"}, + {file = "pydantic_core-2.50.4-cp315-cp315-win32.whl", hash = "sha256:6619d49a89a15cd04334f76fec530c155923bfc60da74ff5d815a52629e1aa6c"}, + {file = "pydantic_core-2.50.4-cp315-cp315-win_amd64.whl", hash = "sha256:e5bd109d095aaae989a0463d5ef0fcc43e9ddd5de125e656d3c119a79e466380"}, + {file = "pydantic_core-2.50.4-cp315-cp315-win_arm64.whl", hash = "sha256:6118e5a5550e36582e19bac1a403711a748f9f18251b054c326d3db02aaa7a18"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:d8201c9f9035520cdcc7dcad383b039ec8123969b87e01cf27c3dd883c02313b"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:1de7be9a66fc8536770481ab64a05aae5067c725f2b29a09543af00e6a417b97"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:789a6453e5ffd18a7ab6b8c3a0dd8403053829197ec258ecb90c604c21ffcc99"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6348ad12fa741bcc9c2f173e99fbf27cbc038826d8c31a4a7d836eca27878ba2"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:d49127f137f871cde3c5650af33bbbdcee02679dae76e020902fa106f522b8ae"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:2f5cc5bcb94063fbbdfd285a2b302da34af07491337c10bb35de1d5220fa1583"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b99bed995ed7c41515c11fe2beb86f8a6cc298e5537cae2f736de2f982f74ef0"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:faa4e96385c820ce9d7f7a623486e23d4134ae3c9ba2071e44e0ab5a5a5002c4"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:d6a166978f22f10cb91413f70519861605219346decf65bc79008f9257c94afe"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-musllinux_1_1_aarch64.whl", hash = "sha256:a70d5effebd81ebd8e15a8aabdc7980832367b2b00c36543bac378977004cc80"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-musllinux_1_1_armv7l.whl", hash = "sha256:f8fd23653a252cefabea11cd041efd7b80bdf403e43a36dea53f9cb0aaa21f0f"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-musllinux_1_1_x86_64.whl", hash = "sha256:7646353a5a7c553c04167aca628e2550b538f492765b03ccf34321a560acc43c"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-win32.whl", hash = "sha256:65376dbe1ab4dbc768ca2b72b7c13993562c035f5925fd3bc7ff9c8c585c515d"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-win_amd64.whl", hash = "sha256:f08ee8248aad2d054e5bc4c73554d4505464698f6d754f16198dbc5764e9821d"}, + {file = "pydantic_core-2.50.4-cp315-cp315t-win_arm64.whl", hash = "sha256:da779ae50b46f3f7d1e1b5f362fdc0ad376a49fd55f6f3122dc2b6149936cdf7"}, + {file = "pydantic_core-2.50.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:c04e9d920e2674f54651fd260a15c5d2843526c73d5242ee4311325ddc9573b3"}, + {file = "pydantic_core-2.50.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:5bc1811ef2b4d4ba63e8e452f6e332b6374bd1d2cbbfdf66826c8cb1f71dd10d"}, + {file = "pydantic_core-2.50.4-graalpy312-graalpy250_312_native-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b059a7968b1911be5a2d9a8234827ab0bef9d1e465d4b42da525894143550e8"}, + {file = "pydantic_core-2.50.4-graalpy312-graalpy250_312_native-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bee28aab5a580eec673f7b68dfa8dece3dd37bd207ef8d22fafe23a8e9837296"}, + {file = "pydantic_core-2.50.4-graalpy313-graalpy253_313_native-macosx_11_0_arm64.whl", hash = "sha256:71e03d2ea1a221d020cfc5b6cc8bbbedef23a06704c70fcf4d0afb42965b22d1"}, + {file = "pydantic_core-2.50.4-graalpy313-graalpy253_313_native-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09450778e3ab58d3f565899fcfbf6c82926e31af29e28e799d1d50941316e0cb"}, + {file = "pydantic_core-2.50.4-graalpy313-graalpy253_313_native-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4eb15be588407148ef5937dc8d9256a71f6b115e6cddadb7aa20b6ee384680dc"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:39f489ce31272073e6e146f6781690f9c1ee8c126836e6403361ef91154d89fe"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b26e5f1793b96cdc60242bf38da86ff24a27a708aa396214cac9b534bf571c7"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:7210398a1607ad607dc73196e575b3148b00a333cbb602ddbe1b60ba54554f43"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2f42584e5785385f681163a42506cab0d51295e17599a648396c52a7046c1372"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2039e323acee9abfec1fb5f661776e8965fe5928f3b7f8431900a774cba5c317"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:71ade6d2e445839350d589ff99bbddfde16f3f32db28da5c894a09f99c8b2a03"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d7d406709ae924cf0b08b8282ca2f0e1c90526911d93bc040557cbc83b74c55f"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:7472c39480ccc11dda69a196d1b7c7a6b48eb6594b77f05d945599d3e47f731c"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp80-macosx_10_12_x86_64.whl", hash = "sha256:b67d38e8bb0ade7e6e84575e4bb153fab35b122458077273aeb08fdf12be9d2c"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp80-macosx_11_0_arm64.whl", hash = "sha256:4eda7e3fdef382b7d4492745988a5baaf6953923a337f8b9dde5f76fa8afde20"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp80-manylinux_2_28_x86_64.whl", hash = "sha256:474f7e598c7902165662a5d5160d3fce31037890a2975a9871ebf7c05862300b"}, + {file = "pydantic_core-2.50.4-pp311-pypy311_pp80-win_amd64.whl", hash = "sha256:3e0b395648c6cb871bceb2906907f255dc876ec425f2d5b024e129985cea8519"}, + {file = "pydantic_core-2.50.4.tar.gz", hash = "sha256:aead3b74b68396bf0feab5d57e050b730ded7df55853c1e048a87e00aaf033c6"}, ] [package.dependencies] @@ -1819,14 +1818,14 @@ files = [ [[package]] name = "typing-inspection" -version = "0.4.4" +version = "0.4.5" description = "Runtime typing introspection tools" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "typing_inspection-0.4.4-py3-none-any.whl", hash = "sha256:65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147"}, - {file = "typing_inspection-0.4.4.tar.gz", hash = "sha256:547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47"}, + {file = "typing_inspection-0.4.5-py3-none-any.whl", hash = "sha256:bc210535442b39e1bf2805e0c7a17dfd6a4ace760c84c7f7d16245d23a6b1c39"}, + {file = "typing_inspection-0.4.5.tar.gz", hash = "sha256:7f16c411e7930dc79596d42ab44672a3fe5f60eb34b781a1647e7872363120c7"}, ] [package.dependencies] diff --git a/src/deepgram/__init__.py b/src/deepgram/__init__.py index 86e0445a..9fade4cd 100644 --- a/src/deepgram/__init__.py +++ b/src/deepgram/__init__.py @@ -135,6 +135,7 @@ ListenV1ProfanityFilter, ListenV1Punctuate, ListenV1Redact, + ListenV1RedactUsage, ListenV1Replace, ListenV1RequestFile, ListenV1Response, @@ -169,6 +170,7 @@ ListenV1VadEvents, ListenV1Version, ListenV2ConfigureNumerals, + ListenV2ConfigureRedactUsage, ListenV2EagerEotThreshold, ListenV2Encoding, ListenV2EotThreshold, @@ -180,6 +182,7 @@ ListenV2Numerals, ListenV2ProfanityFilter, ListenV2Redact, + ListenV2RedactUsage, ListenV2SampleRate, ListenV2Tag, OpenAiSpeakProvider, @@ -231,6 +234,7 @@ SpeakV2Expressivity, SpeakV2MipOptOut, SpeakV2Model, + SpeakV2NormalizeVolume, SpeakV2Response, SpeakV2SampleRate, SpeakV2Speed, @@ -661,6 +665,7 @@ "ListenV1ProfanityFilter": ".types", "ListenV1Punctuate": ".types", "ListenV1Redact": ".types", + "ListenV1RedactUsage": ".types", "ListenV1Replace": ".types", "ListenV1RequestFile": ".types", "ListenV1Response": ".types", @@ -719,6 +724,7 @@ "ListenV1VadEvents": ".types", "ListenV1Version": ".types", "ListenV2ConfigureNumerals": ".types", + "ListenV2ConfigureRedactUsage": ".types", "ListenV2EagerEotThreshold": ".types", "ListenV2Encoding": ".types", "ListenV2EotThreshold": ".types", @@ -732,6 +738,7 @@ "ListenV2Numerals": ".types", "ListenV2ProfanityFilter": ".types", "ListenV2Redact": ".types", + "ListenV2RedactUsage": ".types", "ListenV2SampleRate": ".types", "ListenV2Tag": ".types", "OpenAiSpeakProvider": ".types", @@ -818,6 +825,7 @@ "SpeakV2Expressivity": ".types", "SpeakV2MipOptOut": ".types", "SpeakV2Model": ".types", + "SpeakV2NormalizeVolume": ".types", "SpeakV2Response": ".types", "SpeakV2SampleRate": ".types", "SpeakV2Speed": ".types", @@ -1156,6 +1164,7 @@ def __dir__(): "ListenV1ProfanityFilter", "ListenV1Punctuate", "ListenV1Redact", + "ListenV1RedactUsage", "ListenV1Replace", "ListenV1RequestFile", "ListenV1Response", @@ -1214,6 +1223,7 @@ def __dir__(): "ListenV1VadEvents", "ListenV1Version", "ListenV2ConfigureNumerals", + "ListenV2ConfigureRedactUsage", "ListenV2EagerEotThreshold", "ListenV2Encoding", "ListenV2EotThreshold", @@ -1227,6 +1237,7 @@ def __dir__(): "ListenV2Numerals", "ListenV2ProfanityFilter", "ListenV2Redact", + "ListenV2RedactUsage", "ListenV2SampleRate", "ListenV2Tag", "OpenAiSpeakProvider", @@ -1313,6 +1324,7 @@ def __dir__(): "SpeakV2Expressivity", "SpeakV2MipOptOut", "SpeakV2Model", + "SpeakV2NormalizeVolume", "SpeakV2Response", "SpeakV2SampleRate", "SpeakV2Speed", diff --git a/src/deepgram/agent/v1/socket_client.py b/src/deepgram/agent/v1/socket_client.py index ef56cc79..44ffcaed 100644 --- a/src/deepgram/agent/v1/socket_client.py +++ b/src/deepgram/agent/v1/socket_client.py @@ -48,6 +48,7 @@ except ImportError: from websockets import WebSocketClientProtocol # type: ignore + def _sanitize_numeric_types(obj: typing.Any) -> typing.Any: """Convert whole-number floats to integers for wire-compatible JSON.""" if isinstance(obj, dict): diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent.py b/src/deepgram/agent/v1/types/agent_v1settings_agent.py index b55a8345..1a4d67fd 100644 --- a/src/deepgram/agent/v1/types/agent_v1settings_agent.py +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent.py @@ -10,6 +10,7 @@ class AgentV1SettingsAgent(AgentV1SettingsAgentContext): if IS_PYDANTIC_V2: + @pydantic.model_validator(mode="before") @classmethod def _migrate_legacy_nested_context(cls, values: typing.Any) -> typing.Any: @@ -33,6 +34,7 @@ def _migrate_legacy_nested_context(cls, values: typing.Any) -> typing.Any: values["listen"] = listen.dict() return values else: + @pydantic.root_validator(pre=True) # type: ignore[deprecated] def _migrate_legacy_nested_context(cls, values: typing.Any) -> typing.Any: # type: ignore[no-redef] if not isinstance(values, dict): diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_context.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_context.py index 6b74f1ee..181472b4 100644 --- a/src/deepgram/agent/v1/types/agent_v1settings_agent_context.py +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_context.py @@ -38,6 +38,7 @@ class AgentV1SettingsAgentContext(UncheckedBaseModel): """ if IS_PYDANTIC_V2: + @pydantic.model_validator(mode="before") @classmethod def _migrate_legacy_messages_to_context(cls, values: typing.Any) -> typing.Any: diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_context_listen_provider.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_context_listen_provider.py index d7f6670b..222c18a3 100644 --- a/src/deepgram/agent/v1/types/agent_v1settings_agent_context_listen_provider.py +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_context_listen_provider.py @@ -40,6 +40,7 @@ class AgentV1SettingsAgentContextListenProvider_V2(UncheckedBaseModel): keyterms: typing.Optional[typing.List[str]] = None if IS_PYDANTIC_V2: + @pydantic.model_validator(mode="before") @classmethod def _migrate_language_hint(cls, values: typing.Any) -> typing.Any: diff --git a/src/deepgram/agent/v1/types/agent_v1settings_agent_listen_provider.py b/src/deepgram/agent/v1/types/agent_v1settings_agent_listen_provider.py index 1e7f78e5..d225e261 100644 --- a/src/deepgram/agent/v1/types/agent_v1settings_agent_listen_provider.py +++ b/src/deepgram/agent/v1/types/agent_v1settings_agent_listen_provider.py @@ -40,6 +40,7 @@ class AgentV1SettingsAgentListenProvider_V2(UncheckedBaseModel): keyterms: typing.Optional[typing.List[str]] = None if IS_PYDANTIC_V2: + @pydantic.model_validator(mode="before") @classmethod def _migrate_language_hint(cls, values: typing.Any) -> typing.Any: diff --git a/src/deepgram/agent/v1/types/agent_v1update_listen_listen.py b/src/deepgram/agent/v1/types/agent_v1update_listen_listen.py index c60cb378..d7ed4fab 100644 --- a/src/deepgram/agent/v1/types/agent_v1update_listen_listen.py +++ b/src/deepgram/agent/v1/types/agent_v1update_listen_listen.py @@ -42,6 +42,7 @@ class AgentV1UpdateListenListen(UncheckedBaseModel): provider: AgentV1UpdateListenListenProvider if IS_PYDANTIC_V2: + @pydantic.model_validator(mode="before") @classmethod def _migrate_legacy_provider(cls, values: typing.Any) -> typing.Any: diff --git a/src/deepgram/listen/v1/client.py b/src/deepgram/listen/v1/client.py index e44a0f87..21b1c0df 100644 --- a/src/deepgram/listen/v1/client.py +++ b/src/deepgram/listen/v1/client.py @@ -36,6 +36,7 @@ from ...types.listen_v1profanity_filter import ListenV1ProfanityFilter from ...types.listen_v1punctuate import ListenV1Punctuate from ...types.listen_v1redact import ListenV1Redact +from ...types.listen_v1redact_usage import ListenV1RedactUsage from ...types.listen_v1replace import ListenV1Replace from ...types.listen_v1sample_rate import ListenV1SampleRate from ...types.listen_v1search import ListenV1Search @@ -100,6 +101,7 @@ def connect( profanity_filter: typing.Optional[ListenV1ProfanityFilter] = None, punctuate: typing.Optional[ListenV1Punctuate] = None, redact: typing.Optional[ListenV1Redact] = None, + redact_usage: typing.Optional[ListenV1RedactUsage] = None, replace: typing.Optional[ListenV1Replace] = None, sample_rate: typing.Optional[ListenV1SampleRate] = None, search: typing.Optional[ListenV1Search] = None, @@ -163,6 +165,8 @@ def connect( redact : typing.Optional[ListenV1Redact] + redact_usage : typing.Optional[ListenV1RedactUsage] + replace : typing.Optional[ListenV1Replace] sample_rate : typing.Optional[ListenV1SampleRate] @@ -224,6 +228,7 @@ def connect( "profanity_filter": profanity_filter, "punctuate": punctuate, "redact": redact, + "redact_usage": redact_usage, "replace": replace, "sample_rate": sample_rate, "search": search, @@ -317,6 +322,7 @@ async def connect( profanity_filter: typing.Optional[ListenV1ProfanityFilter] = None, punctuate: typing.Optional[ListenV1Punctuate] = None, redact: typing.Optional[ListenV1Redact] = None, + redact_usage: typing.Optional[ListenV1RedactUsage] = None, replace: typing.Optional[ListenV1Replace] = None, sample_rate: typing.Optional[ListenV1SampleRate] = None, search: typing.Optional[ListenV1Search] = None, @@ -380,6 +386,8 @@ async def connect( redact : typing.Optional[ListenV1Redact] + redact_usage : typing.Optional[ListenV1RedactUsage] + replace : typing.Optional[ListenV1Replace] sample_rate : typing.Optional[ListenV1SampleRate] @@ -441,6 +449,7 @@ async def connect( "profanity_filter": profanity_filter, "punctuate": punctuate, "redact": redact, + "redact_usage": redact_usage, "replace": replace, "sample_rate": sample_rate, "search": search, diff --git a/src/deepgram/listen/v1/media/client.py b/src/deepgram/listen/v1/media/client.py index 54a142d0..4c792d50 100644 --- a/src/deepgram/listen/v1/media/client.py +++ b/src/deepgram/listen/v1/media/client.py @@ -69,6 +69,7 @@ def transcribe_url( profanity_filter: typing.Optional[bool] = None, punctuate: typing.Optional[bool] = None, redact: typing.Optional[str] = None, + redact_usage: typing.Optional[bool] = None, replace: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, search: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, smart_format: typing.Optional[bool] = None, @@ -182,6 +183,9 @@ def transcribe_url( redact : typing.Optional[str] Redaction removes sensitive information from your transcripts + redact_usage : typing.Optional[bool] + Replaces the values of user-supplied text parameters (`keyterm`, `keywords`, `replace`, `search`, `extra`, `custom_topic`, and `custom_intent`) with `[REDACTED]` in this request's usage records. Does not affect transcription, the response, `tag`, or `callback`. Independent of `mip_opt_out`. https://developers.deepgram.com/docs/redact-usage + replace : typing.Optional[typing.Union[str, typing.Sequence[str]]] Search for terms or phrases in submitted audio and replaces them @@ -255,6 +259,7 @@ def transcribe_url( profanity_filter=profanity_filter, punctuate=punctuate, redact=redact, + redact_usage=redact_usage, replace=replace, search=search, smart_format=smart_format, @@ -301,6 +306,7 @@ def transcribe_file( profanity_filter: typing.Optional[bool] = None, punctuate: typing.Optional[bool] = None, redact: typing.Optional[str] = None, + redact_usage: typing.Optional[bool] = None, replace: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, search: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, smart_format: typing.Optional[bool] = None, @@ -414,6 +420,9 @@ def transcribe_file( redact : typing.Optional[str] Redaction removes sensitive information from your transcripts + redact_usage : typing.Optional[bool] + Replaces the values of user-supplied text parameters (`keyterm`, `keywords`, `replace`, `search`, `extra`, `custom_topic`, and `custom_intent`) with `[REDACTED]` in this request's usage records. Does not affect transcription, the response, `tag`, or `callback`. Independent of `mip_opt_out`. https://developers.deepgram.com/docs/redact-usage + replace : typing.Optional[typing.Union[str, typing.Sequence[str]]] Search for terms or phrases in submitted audio and replaces them @@ -485,6 +494,7 @@ def transcribe_file( profanity_filter=profanity_filter, punctuate=punctuate, redact=redact, + redact_usage=redact_usage, replace=replace, search=search, smart_format=smart_format, @@ -547,6 +557,7 @@ async def transcribe_url( profanity_filter: typing.Optional[bool] = None, punctuate: typing.Optional[bool] = None, redact: typing.Optional[str] = None, + redact_usage: typing.Optional[bool] = None, replace: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, search: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, smart_format: typing.Optional[bool] = None, @@ -660,6 +671,9 @@ async def transcribe_url( redact : typing.Optional[str] Redaction removes sensitive information from your transcripts + redact_usage : typing.Optional[bool] + Replaces the values of user-supplied text parameters (`keyterm`, `keywords`, `replace`, `search`, `extra`, `custom_topic`, and `custom_intent`) with `[REDACTED]` in this request's usage records. Does not affect transcription, the response, `tag`, or `callback`. Independent of `mip_opt_out`. https://developers.deepgram.com/docs/redact-usage + replace : typing.Optional[typing.Union[str, typing.Sequence[str]]] Search for terms or phrases in submitted audio and replaces them @@ -741,6 +755,7 @@ async def main() -> None: profanity_filter=profanity_filter, punctuate=punctuate, redact=redact, + redact_usage=redact_usage, replace=replace, search=search, smart_format=smart_format, @@ -787,6 +802,7 @@ async def transcribe_file( profanity_filter: typing.Optional[bool] = None, punctuate: typing.Optional[bool] = None, redact: typing.Optional[str] = None, + redact_usage: typing.Optional[bool] = None, replace: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, search: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, smart_format: typing.Optional[bool] = None, @@ -900,6 +916,9 @@ async def transcribe_file( redact : typing.Optional[str] Redaction removes sensitive information from your transcripts + redact_usage : typing.Optional[bool] + Replaces the values of user-supplied text parameters (`keyterm`, `keywords`, `replace`, `search`, `extra`, `custom_topic`, and `custom_intent`) with `[REDACTED]` in this request's usage records. Does not affect transcription, the response, `tag`, or `callback`. Independent of `mip_opt_out`. https://developers.deepgram.com/docs/redact-usage + replace : typing.Optional[typing.Union[str, typing.Sequence[str]]] Search for terms or phrases in submitted audio and replaces them @@ -979,6 +998,7 @@ async def main() -> None: profanity_filter=profanity_filter, punctuate=punctuate, redact=redact, + redact_usage=redact_usage, replace=replace, search=search, smart_format=smart_format, diff --git a/src/deepgram/listen/v1/media/raw_client.py b/src/deepgram/listen/v1/media/raw_client.py index d351299f..063d3ab1 100644 --- a/src/deepgram/listen/v1/media/raw_client.py +++ b/src/deepgram/listen/v1/media/raw_client.py @@ -64,6 +64,7 @@ def transcribe_url( profanity_filter: typing.Optional[bool] = None, punctuate: typing.Optional[bool] = None, redact: typing.Optional[str] = None, + redact_usage: typing.Optional[bool] = None, replace: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, search: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, smart_format: typing.Optional[bool] = None, @@ -177,6 +178,9 @@ def transcribe_url( redact : typing.Optional[str] Redaction removes sensitive information from your transcripts + redact_usage : typing.Optional[bool] + Replaces the values of user-supplied text parameters (`keyterm`, `keywords`, `replace`, `search`, `extra`, `custom_topic`, and `custom_intent`) with `[REDACTED]` in this request's usage records. Does not affect transcription, the response, `tag`, or `callback`. Independent of `mip_opt_out`. https://developers.deepgram.com/docs/redact-usage + replace : typing.Optional[typing.Union[str, typing.Sequence[str]]] Search for terms or phrases in submitted audio and replaces them @@ -242,6 +246,7 @@ def transcribe_url( "profanity_filter": profanity_filter, "punctuate": punctuate, "redact": redact, + "redact_usage": redact_usage, "replace": replace, "search": search, "smart_format": smart_format, @@ -324,6 +329,7 @@ def transcribe_file( profanity_filter: typing.Optional[bool] = None, punctuate: typing.Optional[bool] = None, redact: typing.Optional[str] = None, + redact_usage: typing.Optional[bool] = None, replace: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, search: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, smart_format: typing.Optional[bool] = None, @@ -437,6 +443,9 @@ def transcribe_file( redact : typing.Optional[str] Redaction removes sensitive information from your transcripts + redact_usage : typing.Optional[bool] + Replaces the values of user-supplied text parameters (`keyterm`, `keywords`, `replace`, `search`, `extra`, `custom_topic`, and `custom_intent`) with `[REDACTED]` in this request's usage records. Does not affect transcription, the response, `tag`, or `callback`. Independent of `mip_opt_out`. https://developers.deepgram.com/docs/redact-usage + replace : typing.Optional[typing.Union[str, typing.Sequence[str]]] Search for terms or phrases in submitted audio and replaces them @@ -502,6 +511,7 @@ def transcribe_file( "profanity_filter": profanity_filter, "punctuate": punctuate, "redact": redact, + "redact_usage": redact_usage, "replace": replace, "search": search, "smart_format": smart_format, @@ -587,6 +597,7 @@ async def transcribe_url( profanity_filter: typing.Optional[bool] = None, punctuate: typing.Optional[bool] = None, redact: typing.Optional[str] = None, + redact_usage: typing.Optional[bool] = None, replace: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, search: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, smart_format: typing.Optional[bool] = None, @@ -700,6 +711,9 @@ async def transcribe_url( redact : typing.Optional[str] Redaction removes sensitive information from your transcripts + redact_usage : typing.Optional[bool] + Replaces the values of user-supplied text parameters (`keyterm`, `keywords`, `replace`, `search`, `extra`, `custom_topic`, and `custom_intent`) with `[REDACTED]` in this request's usage records. Does not affect transcription, the response, `tag`, or `callback`. Independent of `mip_opt_out`. https://developers.deepgram.com/docs/redact-usage + replace : typing.Optional[typing.Union[str, typing.Sequence[str]]] Search for terms or phrases in submitted audio and replaces them @@ -765,6 +779,7 @@ async def transcribe_url( "profanity_filter": profanity_filter, "punctuate": punctuate, "redact": redact, + "redact_usage": redact_usage, "replace": replace, "search": search, "smart_format": smart_format, @@ -847,6 +862,7 @@ async def transcribe_file( profanity_filter: typing.Optional[bool] = None, punctuate: typing.Optional[bool] = None, redact: typing.Optional[str] = None, + redact_usage: typing.Optional[bool] = None, replace: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, search: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None, smart_format: typing.Optional[bool] = None, @@ -960,6 +976,9 @@ async def transcribe_file( redact : typing.Optional[str] Redaction removes sensitive information from your transcripts + redact_usage : typing.Optional[bool] + Replaces the values of user-supplied text parameters (`keyterm`, `keywords`, `replace`, `search`, `extra`, `custom_topic`, and `custom_intent`) with `[REDACTED]` in this request's usage records. Does not affect transcription, the response, `tag`, or `callback`. Independent of `mip_opt_out`. https://developers.deepgram.com/docs/redact-usage + replace : typing.Optional[typing.Union[str, typing.Sequence[str]]] Search for terms or phrases in submitted audio and replaces them @@ -1025,6 +1044,7 @@ async def transcribe_file( "profanity_filter": profanity_filter, "punctuate": punctuate, "redact": redact, + "redact_usage": redact_usage, "replace": replace, "search": search, "smart_format": smart_format, diff --git a/src/deepgram/listen/v1/raw_client.py b/src/deepgram/listen/v1/raw_client.py index 0a149858..3084228e 100644 --- a/src/deepgram/listen/v1/raw_client.py +++ b/src/deepgram/listen/v1/raw_client.py @@ -34,6 +34,7 @@ from ...types.listen_v1profanity_filter import ListenV1ProfanityFilter from ...types.listen_v1punctuate import ListenV1Punctuate from ...types.listen_v1redact import ListenV1Redact +from ...types.listen_v1redact_usage import ListenV1RedactUsage from ...types.listen_v1replace import ListenV1Replace from ...types.listen_v1sample_rate import ListenV1SampleRate from ...types.listen_v1search import ListenV1Search @@ -81,6 +82,7 @@ def connect( profanity_filter: typing.Optional[ListenV1ProfanityFilter] = None, punctuate: typing.Optional[ListenV1Punctuate] = None, redact: typing.Optional[ListenV1Redact] = None, + redact_usage: typing.Optional[ListenV1RedactUsage] = None, replace: typing.Optional[ListenV1Replace] = None, sample_rate: typing.Optional[ListenV1SampleRate] = None, search: typing.Optional[ListenV1Search] = None, @@ -144,6 +146,8 @@ def connect( redact : typing.Optional[ListenV1Redact] + redact_usage : typing.Optional[ListenV1RedactUsage] + replace : typing.Optional[ListenV1Replace] sample_rate : typing.Optional[ListenV1SampleRate] @@ -205,6 +209,7 @@ def connect( "profanity_filter": profanity_filter, "punctuate": punctuate, "redact": redact, + "redact_usage": redact_usage, "replace": replace, "sample_rate": sample_rate, "search": search, @@ -277,6 +282,7 @@ async def connect( profanity_filter: typing.Optional[ListenV1ProfanityFilter] = None, punctuate: typing.Optional[ListenV1Punctuate] = None, redact: typing.Optional[ListenV1Redact] = None, + redact_usage: typing.Optional[ListenV1RedactUsage] = None, replace: typing.Optional[ListenV1Replace] = None, sample_rate: typing.Optional[ListenV1SampleRate] = None, search: typing.Optional[ListenV1Search] = None, @@ -340,6 +346,8 @@ async def connect( redact : typing.Optional[ListenV1Redact] + redact_usage : typing.Optional[ListenV1RedactUsage] + replace : typing.Optional[ListenV1Replace] sample_rate : typing.Optional[ListenV1SampleRate] @@ -401,6 +409,7 @@ async def connect( "profanity_filter": profanity_filter, "punctuate": punctuate, "redact": redact, + "redact_usage": redact_usage, "replace": replace, "sample_rate": sample_rate, "search": search, diff --git a/src/deepgram/listen/v1/socket_client.py b/src/deepgram/listen/v1/socket_client.py index e9f508ba..20d466f4 100644 --- a/src/deepgram/listen/v1/socket_client.py +++ b/src/deepgram/listen/v1/socket_client.py @@ -46,7 +46,7 @@ def __init__(self, *, websocket: WebSocketClientProtocol): async def __aiter__(self) -> typing.AsyncIterator[V1SocketClientResponse]: async for message in self._websocket: if isinstance(message, bytes): - yield message + yield message # type: ignore else: try: yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore @@ -127,7 +127,7 @@ async def recv(self) -> V1SocketClientResponse: """ data = await self._websocket.recv() if isinstance(data, bytes): - return data + return data # type: ignore json_data = json.loads(data) try: return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore @@ -158,7 +158,7 @@ def __init__(self, *, websocket: websockets_sync_connection.Connection): def __iter__(self) -> typing.Iterator[V1SocketClientResponse]: for message in self._websocket: if isinstance(message, bytes): - yield message + yield message # type: ignore else: try: yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore @@ -239,7 +239,7 @@ def recv(self) -> V1SocketClientResponse: """ data = self._websocket.recv() if isinstance(data, bytes): - return data + return data # type: ignore json_data = json.loads(data) try: return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore diff --git a/src/deepgram/listen/v2/client.py b/src/deepgram/listen/v2/client.py index b76e41be..28e0736f 100644 --- a/src/deepgram/listen/v2/client.py +++ b/src/deepgram/listen/v2/client.py @@ -24,6 +24,7 @@ from ...types.listen_v2numerals import ListenV2Numerals from ...types.listen_v2profanity_filter import ListenV2ProfanityFilter from ...types.listen_v2redact import ListenV2Redact +from ...types.listen_v2redact_usage import ListenV2RedactUsage from ...types.listen_v2sample_rate import ListenV2SampleRate from ...types.listen_v2tag import ListenV2Tag from .raw_client import AsyncRawV2Client, RawV2Client @@ -65,6 +66,7 @@ def connect( profanity_filter: typing.Optional[ListenV2ProfanityFilter] = None, numerals: typing.Optional[ListenV2Numerals] = None, redact: typing.Optional[ListenV2Redact] = None, + redact_usage: typing.Optional[ListenV2RedactUsage] = None, mip_opt_out: typing.Optional[ListenV2MipOptOut] = None, tag: typing.Optional[ListenV2Tag] = None, authorization: typing.Optional[str] = None, @@ -98,6 +100,8 @@ def connect( redact : typing.Optional[ListenV2Redact] + redact_usage : typing.Optional[ListenV2RedactUsage] + mip_opt_out : typing.Optional[ListenV2MipOptOut] tag : typing.Optional[ListenV2Tag] @@ -142,6 +146,7 @@ def connect( "profanity_filter": profanity_filter, "numerals": numerals, "redact": redact, + "redact_usage": redact_usage, "mip_opt_out": mip_opt_out, "tag": tag, **( @@ -208,6 +213,7 @@ async def connect( profanity_filter: typing.Optional[ListenV2ProfanityFilter] = None, numerals: typing.Optional[ListenV2Numerals] = None, redact: typing.Optional[ListenV2Redact] = None, + redact_usage: typing.Optional[ListenV2RedactUsage] = None, mip_opt_out: typing.Optional[ListenV2MipOptOut] = None, tag: typing.Optional[ListenV2Tag] = None, authorization: typing.Optional[str] = None, @@ -241,6 +247,8 @@ async def connect( redact : typing.Optional[ListenV2Redact] + redact_usage : typing.Optional[ListenV2RedactUsage] + mip_opt_out : typing.Optional[ListenV2MipOptOut] tag : typing.Optional[ListenV2Tag] @@ -285,6 +293,7 @@ async def connect( "profanity_filter": profanity_filter, "numerals": numerals, "redact": redact, + "redact_usage": redact_usage, "mip_opt_out": mip_opt_out, "tag": tag, **( diff --git a/src/deepgram/listen/v2/raw_client.py b/src/deepgram/listen/v2/raw_client.py index f5160709..12a659f8 100644 --- a/src/deepgram/listen/v2/raw_client.py +++ b/src/deepgram/listen/v2/raw_client.py @@ -24,6 +24,7 @@ from ...types.listen_v2numerals import ListenV2Numerals from ...types.listen_v2profanity_filter import ListenV2ProfanityFilter from ...types.listen_v2redact import ListenV2Redact +from ...types.listen_v2redact_usage import ListenV2RedactUsage from ...types.listen_v2sample_rate import ListenV2SampleRate from ...types.listen_v2tag import ListenV2Tag from .socket_client import AsyncV2SocketClient, V2SocketClient @@ -53,6 +54,7 @@ def connect( profanity_filter: typing.Optional[ListenV2ProfanityFilter] = None, numerals: typing.Optional[ListenV2Numerals] = None, redact: typing.Optional[ListenV2Redact] = None, + redact_usage: typing.Optional[ListenV2RedactUsage] = None, mip_opt_out: typing.Optional[ListenV2MipOptOut] = None, tag: typing.Optional[ListenV2Tag] = None, authorization: typing.Optional[str] = None, @@ -86,6 +88,8 @@ def connect( redact : typing.Optional[ListenV2Redact] + redact_usage : typing.Optional[ListenV2RedactUsage] + mip_opt_out : typing.Optional[ListenV2MipOptOut] tag : typing.Optional[ListenV2Tag] @@ -130,6 +134,7 @@ def connect( "profanity_filter": profanity_filter, "numerals": numerals, "redact": redact, + "redact_usage": redact_usage, "mip_opt_out": mip_opt_out, "tag": tag, **( @@ -185,6 +190,7 @@ async def connect( profanity_filter: typing.Optional[ListenV2ProfanityFilter] = None, numerals: typing.Optional[ListenV2Numerals] = None, redact: typing.Optional[ListenV2Redact] = None, + redact_usage: typing.Optional[ListenV2RedactUsage] = None, mip_opt_out: typing.Optional[ListenV2MipOptOut] = None, tag: typing.Optional[ListenV2Tag] = None, authorization: typing.Optional[str] = None, @@ -218,6 +224,8 @@ async def connect( redact : typing.Optional[ListenV2Redact] + redact_usage : typing.Optional[ListenV2RedactUsage] + mip_opt_out : typing.Optional[ListenV2MipOptOut] tag : typing.Optional[ListenV2Tag] @@ -262,6 +270,7 @@ async def connect( "profanity_filter": profanity_filter, "numerals": numerals, "redact": redact, + "redact_usage": redact_usage, "mip_opt_out": mip_opt_out, "tag": tag, **( diff --git a/src/deepgram/listen/v2/requests/listen_v2configure.py b/src/deepgram/listen/v2/requests/listen_v2configure.py index d169e307..579d7ecf 100644 --- a/src/deepgram/listen/v2/requests/listen_v2configure.py +++ b/src/deepgram/listen/v2/requests/listen_v2configure.py @@ -5,6 +5,7 @@ import typing_extensions from ....requests.listen_v2keyterm import ListenV2KeytermParams from ....types.listen_v2configure_numerals import ListenV2ConfigureNumerals +from ....types.listen_v2configure_redact_usage import ListenV2ConfigureRedactUsage from .listen_v2configure_thresholds import ListenV2ConfigureThresholdsParams @@ -29,3 +30,4 @@ class ListenV2ConfigureParams(typing_extensions.TypedDict): """ numerals: typing_extensions.NotRequired[ListenV2ConfigureNumerals] + redact_usage: typing_extensions.NotRequired[ListenV2ConfigureRedactUsage] diff --git a/src/deepgram/listen/v2/requests/listen_v2configure_success.py b/src/deepgram/listen/v2/requests/listen_v2configure_success.py index b875582c..fbb0e0fd 100644 --- a/src/deepgram/listen/v2/requests/listen_v2configure_success.py +++ b/src/deepgram/listen/v2/requests/listen_v2configure_success.py @@ -36,6 +36,11 @@ class ListenV2ConfigureSuccessParams(typing_extensions.TypedDict): Whether numeral formatting is enabled for transcripts Flux STT sends after it processes the update. """ + redact_usage: typing_extensions.NotRequired[bool] + """ + Whether usage redaction is on for this connection. + """ + sequence_id: int """ Starts at `0` and increments for each message the server sends diff --git a/src/deepgram/listen/v2/socket_client.py b/src/deepgram/listen/v2/socket_client.py index 6b15d6fd..4295e44c 100644 --- a/src/deepgram/listen/v2/socket_client.py +++ b/src/deepgram/listen/v2/socket_client.py @@ -43,7 +43,7 @@ def __init__(self, *, websocket: WebSocketClientProtocol): async def __aiter__(self) -> typing.AsyncIterator[V2SocketClientResponse]: async for message in self._websocket: if isinstance(message, bytes): - yield message + yield message # type: ignore else: try: yield construct_type(type_=V2SocketClientResponse, object_=json.loads(message)) # type: ignore @@ -120,7 +120,7 @@ async def recv(self) -> V2SocketClientResponse: """ data = await self._websocket.recv() if isinstance(data, bytes): - return data + return data # type: ignore json_data = json.loads(data) try: return construct_type(type_=V2SocketClientResponse, object_=json_data) # type: ignore @@ -151,7 +151,7 @@ def __init__(self, *, websocket: websockets_sync_connection.Connection): def __iter__(self) -> typing.Iterator[V2SocketClientResponse]: for message in self._websocket: if isinstance(message, bytes): - yield message + yield message # type: ignore else: try: yield construct_type(type_=V2SocketClientResponse, object_=json.loads(message)) # type: ignore @@ -228,7 +228,7 @@ def recv(self) -> V2SocketClientResponse: """ data = self._websocket.recv() if isinstance(data, bytes): - return data + return data # type: ignore json_data = json.loads(data) try: return construct_type(type_=V2SocketClientResponse, object_=json_data) # type: ignore diff --git a/src/deepgram/listen/v2/types/listen_v2configure.py b/src/deepgram/listen/v2/types/listen_v2configure.py index 487ed99c..7e3dfd96 100644 --- a/src/deepgram/listen/v2/types/listen_v2configure.py +++ b/src/deepgram/listen/v2/types/listen_v2configure.py @@ -6,6 +6,7 @@ from ....core.pydantic_utilities import IS_PYDANTIC_V2 from ....core.unchecked_base_model import UncheckedBaseModel from ....types.listen_v2configure_numerals import ListenV2ConfigureNumerals +from ....types.listen_v2configure_redact_usage import ListenV2ConfigureRedactUsage from ....types.listen_v2keyterm import ListenV2Keyterm from .listen_v2configure_thresholds import ListenV2ConfigureThresholds @@ -31,6 +32,7 @@ class ListenV2Configure(UncheckedBaseModel): """ numerals: typing.Optional[ListenV2ConfigureNumerals] = None + redact_usage: typing.Optional[ListenV2ConfigureRedactUsage] = None if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 diff --git a/src/deepgram/listen/v2/types/listen_v2configure_success.py b/src/deepgram/listen/v2/types/listen_v2configure_success.py index cf7c1c80..0faaec9d 100644 --- a/src/deepgram/listen/v2/types/listen_v2configure_success.py +++ b/src/deepgram/listen/v2/types/listen_v2configure_success.py @@ -38,6 +38,11 @@ class ListenV2ConfigureSuccess(ListenV2ResponseDictCompatModel): Whether numeral formatting is enabled for transcripts Flux STT sends after it processes the update. """ + redact_usage: typing.Optional[bool] = pydantic.Field(default=None) + """ + Whether usage redaction is on for this connection. + """ + sequence_id: int = pydantic.Field() """ Starts at `0` and increments for each message the server sends diff --git a/src/deepgram/speak/v2/audio/client.py b/src/deepgram/speak/v2/audio/client.py index f1c4abb7..ee5dabc3 100644 --- a/src/deepgram/speak/v2/audio/client.py +++ b/src/deepgram/speak/v2/audio/client.py @@ -41,6 +41,7 @@ def generate( container: typing.Optional[AudioGenerateRequestContainer] = None, encoding: typing.Optional[AudioGenerateRequestEncoding] = None, expressivity: typing.Optional[int] = None, + normalize_volume: typing.Optional[bool] = None, sample_rate: typing.Optional[int] = None, speed: typing.Optional[float] = None, priority: typing.Optional[typing.Literal["low"]] = None, @@ -81,6 +82,9 @@ def generate( expressivity : typing.Optional[int] Expressive range of the generated speech, on a calm-to-animated axis. Accepted values: `-2`, `-1`, `0`, `1`, `2`. `0` (the default) is the voice's tuned delivery and the production-validated setting, with `-2` the calm end of the range and `2` the animated end. Supported on all Flux voices; applies to the whole request. Beta: behavior may change in future model versions, and non-default values increase the risk of hallucinations and pronunciation errors; audition before shipping. An invalid value is rejected with a `400` — `EXPRESSIVITY_OUT_OF_RANGE` for a value outside the range, `EXPRESSIVITY_INCREMENT_INVALID` for a fractional value. See [Expressivity](/docs/tts-expressivity). + normalize_volume : typing.Optional[bool] + Normalizes the loudness of the generated speech to a consistent level across voices and requests. On by default; set to `false` to opt out. Peak limiting is applied either way. + sample_rate : typing.Optional[int] Sample Rate specifies the sample rate for the output audio. Based on the encoding, different sample rates are supported. For some encodings, the sample rate is not configurable @@ -121,6 +125,7 @@ def generate( container=container, encoding=encoding, expressivity=expressivity, + normalize_volume=normalize_volume, sample_rate=sample_rate, speed=speed, priority=priority, @@ -157,6 +162,7 @@ async def generate( container: typing.Optional[AudioGenerateRequestContainer] = None, encoding: typing.Optional[AudioGenerateRequestEncoding] = None, expressivity: typing.Optional[int] = None, + normalize_volume: typing.Optional[bool] = None, sample_rate: typing.Optional[int] = None, speed: typing.Optional[float] = None, priority: typing.Optional[typing.Literal["low"]] = None, @@ -197,6 +203,9 @@ async def generate( expressivity : typing.Optional[int] Expressive range of the generated speech, on a calm-to-animated axis. Accepted values: `-2`, `-1`, `0`, `1`, `2`. `0` (the default) is the voice's tuned delivery and the production-validated setting, with `-2` the calm end of the range and `2` the animated end. Supported on all Flux voices; applies to the whole request. Beta: behavior may change in future model versions, and non-default values increase the risk of hallucinations and pronunciation errors; audition before shipping. An invalid value is rejected with a `400` — `EXPRESSIVITY_OUT_OF_RANGE` for a value outside the range, `EXPRESSIVITY_INCREMENT_INVALID` for a fractional value. See [Expressivity](/docs/tts-expressivity). + normalize_volume : typing.Optional[bool] + Normalizes the loudness of the generated speech to a consistent level across voices and requests. On by default; set to `false` to opt out. Peak limiting is applied either way. + sample_rate : typing.Optional[int] Sample Rate specifies the sample rate for the output audio. Based on the encoding, different sample rates are supported. For some encodings, the sample rate is not configurable @@ -245,6 +254,7 @@ async def main() -> None: container=container, encoding=encoding, expressivity=expressivity, + normalize_volume=normalize_volume, sample_rate=sample_rate, speed=speed, priority=priority, diff --git a/src/deepgram/speak/v2/audio/raw_client.py b/src/deepgram/speak/v2/audio/raw_client.py index a297f814..95ca5fcc 100644 --- a/src/deepgram/speak/v2/audio/raw_client.py +++ b/src/deepgram/speak/v2/audio/raw_client.py @@ -38,6 +38,7 @@ def generate( container: typing.Optional[AudioGenerateRequestContainer] = None, encoding: typing.Optional[AudioGenerateRequestEncoding] = None, expressivity: typing.Optional[int] = None, + normalize_volume: typing.Optional[bool] = None, sample_rate: typing.Optional[int] = None, speed: typing.Optional[float] = None, priority: typing.Optional[typing.Literal["low"]] = None, @@ -78,6 +79,9 @@ def generate( expressivity : typing.Optional[int] Expressive range of the generated speech, on a calm-to-animated axis. Accepted values: `-2`, `-1`, `0`, `1`, `2`. `0` (the default) is the voice's tuned delivery and the production-validated setting, with `-2` the calm end of the range and `2` the animated end. Supported on all Flux voices; applies to the whole request. Beta: behavior may change in future model versions, and non-default values increase the risk of hallucinations and pronunciation errors; audition before shipping. An invalid value is rejected with a `400` — `EXPRESSIVITY_OUT_OF_RANGE` for a value outside the range, `EXPRESSIVITY_INCREMENT_INVALID` for a fractional value. See [Expressivity](/docs/tts-expressivity). + normalize_volume : typing.Optional[bool] + Normalizes the loudness of the generated speech to a consistent level across voices and requests. On by default; set to `false` to opt out. Peak limiting is applied either way. + sample_rate : typing.Optional[int] Sample Rate specifies the sample rate for the output audio. Based on the encoding, different sample rates are supported. For some encodings, the sample rate is not configurable @@ -109,6 +113,7 @@ def generate( "encoding": encoding, "expressivity": expressivity, "model": model, + "normalize_volume": normalize_volume, "sample_rate": sample_rate, "speed": speed, "priority": priority, @@ -177,6 +182,7 @@ async def generate( container: typing.Optional[AudioGenerateRequestContainer] = None, encoding: typing.Optional[AudioGenerateRequestEncoding] = None, expressivity: typing.Optional[int] = None, + normalize_volume: typing.Optional[bool] = None, sample_rate: typing.Optional[int] = None, speed: typing.Optional[float] = None, priority: typing.Optional[typing.Literal["low"]] = None, @@ -217,6 +223,9 @@ async def generate( expressivity : typing.Optional[int] Expressive range of the generated speech, on a calm-to-animated axis. Accepted values: `-2`, `-1`, `0`, `1`, `2`. `0` (the default) is the voice's tuned delivery and the production-validated setting, with `-2` the calm end of the range and `2` the animated end. Supported on all Flux voices; applies to the whole request. Beta: behavior may change in future model versions, and non-default values increase the risk of hallucinations and pronunciation errors; audition before shipping. An invalid value is rejected with a `400` — `EXPRESSIVITY_OUT_OF_RANGE` for a value outside the range, `EXPRESSIVITY_INCREMENT_INVALID` for a fractional value. See [Expressivity](/docs/tts-expressivity). + normalize_volume : typing.Optional[bool] + Normalizes the loudness of the generated speech to a consistent level across voices and requests. On by default; set to `false` to opt out. Peak limiting is applied either way. + sample_rate : typing.Optional[int] Sample Rate specifies the sample rate for the output audio. Based on the encoding, different sample rates are supported. For some encodings, the sample rate is not configurable @@ -248,6 +257,7 @@ async def generate( "encoding": encoding, "expressivity": expressivity, "model": model, + "normalize_volume": normalize_volume, "sample_rate": sample_rate, "speed": speed, "priority": priority, diff --git a/src/deepgram/speak/v2/client.py b/src/deepgram/speak/v2/client.py index 904a5b18..4045503c 100644 --- a/src/deepgram/speak/v2/client.py +++ b/src/deepgram/speak/v2/client.py @@ -18,6 +18,7 @@ from ...types.speak_v2expressivity import SpeakV2Expressivity from ...types.speak_v2mip_opt_out import SpeakV2MipOptOut from ...types.speak_v2model import SpeakV2Model +from ...types.speak_v2normalize_volume import SpeakV2NormalizeVolume from ...types.speak_v2sample_rate import SpeakV2SampleRate from ...types.speak_v2speed import SpeakV2Speed from ...types.speak_v2tag import SpeakV2Tag @@ -59,6 +60,7 @@ def connect( sample_rate: typing.Optional[SpeakV2SampleRate] = None, speed: typing.Optional[SpeakV2Speed] = None, expressivity: typing.Optional[SpeakV2Expressivity] = None, + normalize_volume: typing.Optional[SpeakV2NormalizeVolume] = None, mip_opt_out: typing.Optional[SpeakV2MipOptOut] = None, tag: typing.Optional[SpeakV2Tag] = None, authorization: typing.Optional[str] = None, @@ -81,6 +83,8 @@ def connect( expressivity : typing.Optional[SpeakV2Expressivity] + normalize_volume : typing.Optional[SpeakV2NormalizeVolume] + mip_opt_out : typing.Optional[SpeakV2MipOptOut] tag : typing.Optional[SpeakV2Tag] @@ -107,6 +111,7 @@ def connect( "sample_rate": sample_rate, "speed": speed, "expressivity": expressivity, + "normalize_volume": normalize_volume, "mip_opt_out": mip_opt_out, "tag": tag, **( @@ -177,6 +182,7 @@ async def connect( sample_rate: typing.Optional[SpeakV2SampleRate] = None, speed: typing.Optional[SpeakV2Speed] = None, expressivity: typing.Optional[SpeakV2Expressivity] = None, + normalize_volume: typing.Optional[SpeakV2NormalizeVolume] = None, mip_opt_out: typing.Optional[SpeakV2MipOptOut] = None, tag: typing.Optional[SpeakV2Tag] = None, authorization: typing.Optional[str] = None, @@ -199,6 +205,8 @@ async def connect( expressivity : typing.Optional[SpeakV2Expressivity] + normalize_volume : typing.Optional[SpeakV2NormalizeVolume] + mip_opt_out : typing.Optional[SpeakV2MipOptOut] tag : typing.Optional[SpeakV2Tag] @@ -225,6 +233,7 @@ async def connect( "sample_rate": sample_rate, "speed": speed, "expressivity": expressivity, + "normalize_volume": normalize_volume, "mip_opt_out": mip_opt_out, "tag": tag, **( diff --git a/src/deepgram/speak/v2/raw_client.py b/src/deepgram/speak/v2/raw_client.py index 7aa71788..150858a2 100644 --- a/src/deepgram/speak/v2/raw_client.py +++ b/src/deepgram/speak/v2/raw_client.py @@ -16,6 +16,7 @@ from ...types.speak_v2expressivity import SpeakV2Expressivity from ...types.speak_v2mip_opt_out import SpeakV2MipOptOut from ...types.speak_v2model import SpeakV2Model +from ...types.speak_v2normalize_volume import SpeakV2NormalizeVolume from ...types.speak_v2sample_rate import SpeakV2SampleRate from ...types.speak_v2speed import SpeakV2Speed from ...types.speak_v2tag import SpeakV2Tag @@ -40,6 +41,7 @@ def connect( sample_rate: typing.Optional[SpeakV2SampleRate] = None, speed: typing.Optional[SpeakV2Speed] = None, expressivity: typing.Optional[SpeakV2Expressivity] = None, + normalize_volume: typing.Optional[SpeakV2NormalizeVolume] = None, mip_opt_out: typing.Optional[SpeakV2MipOptOut] = None, tag: typing.Optional[SpeakV2Tag] = None, authorization: typing.Optional[str] = None, @@ -62,6 +64,8 @@ def connect( expressivity : typing.Optional[SpeakV2Expressivity] + normalize_volume : typing.Optional[SpeakV2NormalizeVolume] + mip_opt_out : typing.Optional[SpeakV2MipOptOut] tag : typing.Optional[SpeakV2Tag] @@ -88,6 +92,7 @@ def connect( "sample_rate": sample_rate, "speed": speed, "expressivity": expressivity, + "normalize_volume": normalize_volume, "mip_opt_out": mip_opt_out, "tag": tag, **( @@ -137,6 +142,7 @@ async def connect( sample_rate: typing.Optional[SpeakV2SampleRate] = None, speed: typing.Optional[SpeakV2Speed] = None, expressivity: typing.Optional[SpeakV2Expressivity] = None, + normalize_volume: typing.Optional[SpeakV2NormalizeVolume] = None, mip_opt_out: typing.Optional[SpeakV2MipOptOut] = None, tag: typing.Optional[SpeakV2Tag] = None, authorization: typing.Optional[str] = None, @@ -159,6 +165,8 @@ async def connect( expressivity : typing.Optional[SpeakV2Expressivity] + normalize_volume : typing.Optional[SpeakV2NormalizeVolume] + mip_opt_out : typing.Optional[SpeakV2MipOptOut] tag : typing.Optional[SpeakV2Tag] @@ -185,6 +193,7 @@ async def connect( "sample_rate": sample_rate, "speed": speed, "expressivity": expressivity, + "normalize_volume": normalize_volume, "mip_opt_out": mip_opt_out, "tag": tag, **( diff --git a/src/deepgram/types/__init__.py b/src/deepgram/types/__init__.py index d3c52c67..3c76081d 100644 --- a/src/deepgram/types/__init__.py +++ b/src/deepgram/types/__init__.py @@ -148,6 +148,7 @@ from .listen_v1profanity_filter import ListenV1ProfanityFilter from .listen_v1punctuate import ListenV1Punctuate from .listen_v1redact import ListenV1Redact + from .listen_v1redact_usage import ListenV1RedactUsage from .listen_v1replace import ListenV1Replace from .listen_v1request_file import ListenV1RequestFile from .listen_v1response import ListenV1Response @@ -200,6 +201,7 @@ from .listen_v1vad_events import ListenV1VadEvents from .listen_v1version import ListenV1Version from .listen_v2configure_numerals import ListenV2ConfigureNumerals + from .listen_v2configure_redact_usage import ListenV2ConfigureRedactUsage from .listen_v2eager_eot_threshold import ListenV2EagerEotThreshold from .listen_v2encoding import ListenV2Encoding from .listen_v2eot_threshold import ListenV2EotThreshold @@ -211,6 +213,7 @@ from .listen_v2numerals import ListenV2Numerals from .listen_v2profanity_filter import ListenV2ProfanityFilter from .listen_v2redact import ListenV2Redact + from .listen_v2redact_usage import ListenV2RedactUsage from .listen_v2sample_rate import ListenV2SampleRate from .listen_v2tag import ListenV2Tag from .open_ai_speak_provider import OpenAiSpeakProvider @@ -264,6 +267,7 @@ from .speak_v2expressivity import SpeakV2Expressivity from .speak_v2mip_opt_out import SpeakV2MipOptOut from .speak_v2model import SpeakV2Model + from .speak_v2normalize_volume import SpeakV2NormalizeVolume from .speak_v2response import SpeakV2Response from .speak_v2sample_rate import SpeakV2SampleRate from .speak_v2speed import SpeakV2Speed @@ -423,6 +427,7 @@ "ListenV1ProfanityFilter": ".listen_v1profanity_filter", "ListenV1Punctuate": ".listen_v1punctuate", "ListenV1Redact": ".listen_v1redact", + "ListenV1RedactUsage": ".listen_v1redact_usage", "ListenV1Replace": ".listen_v1replace", "ListenV1RequestFile": ".listen_v1request_file", "ListenV1Response": ".listen_v1response", @@ -457,6 +462,7 @@ "ListenV1VadEvents": ".listen_v1vad_events", "ListenV1Version": ".listen_v1version", "ListenV2ConfigureNumerals": ".listen_v2configure_numerals", + "ListenV2ConfigureRedactUsage": ".listen_v2configure_redact_usage", "ListenV2EagerEotThreshold": ".listen_v2eager_eot_threshold", "ListenV2Encoding": ".listen_v2encoding", "ListenV2EotThreshold": ".listen_v2eot_threshold", @@ -468,6 +474,7 @@ "ListenV2Numerals": ".listen_v2numerals", "ListenV2ProfanityFilter": ".listen_v2profanity_filter", "ListenV2Redact": ".listen_v2redact", + "ListenV2RedactUsage": ".listen_v2redact_usage", "ListenV2SampleRate": ".listen_v2sample_rate", "ListenV2Tag": ".listen_v2tag", "OpenAiSpeakProvider": ".open_ai_speak_provider", @@ -519,6 +526,7 @@ "SpeakV2Expressivity": ".speak_v2expressivity", "SpeakV2MipOptOut": ".speak_v2mip_opt_out", "SpeakV2Model": ".speak_v2model", + "SpeakV2NormalizeVolume": ".speak_v2normalize_volume", "SpeakV2Response": ".speak_v2response", "SpeakV2SampleRate": ".speak_v2sample_rate", "SpeakV2Speed": ".speak_v2speed", @@ -722,6 +730,7 @@ def __dir__(): "ListenV1ProfanityFilter", "ListenV1Punctuate", "ListenV1Redact", + "ListenV1RedactUsage", "ListenV1Replace", "ListenV1RequestFile", "ListenV1Response", @@ -756,6 +765,7 @@ def __dir__(): "ListenV1VadEvents", "ListenV1Version", "ListenV2ConfigureNumerals", + "ListenV2ConfigureRedactUsage", "ListenV2EagerEotThreshold", "ListenV2Encoding", "ListenV2EotThreshold", @@ -767,6 +777,7 @@ def __dir__(): "ListenV2Numerals", "ListenV2ProfanityFilter", "ListenV2Redact", + "ListenV2RedactUsage", "ListenV2SampleRate", "ListenV2Tag", "OpenAiSpeakProvider", @@ -818,6 +829,7 @@ def __dir__(): "SpeakV2Expressivity", "SpeakV2MipOptOut", "SpeakV2Model", + "SpeakV2NormalizeVolume", "SpeakV2Response", "SpeakV2SampleRate", "SpeakV2Speed", diff --git a/src/deepgram/types/deepgram_listen_provider_v2.py b/src/deepgram/types/deepgram_listen_provider_v2.py index c974e7fa..d24729a0 100644 --- a/src/deepgram/types/deepgram_listen_provider_v2.py +++ b/src/deepgram/types/deepgram_listen_provider_v2.py @@ -55,6 +55,7 @@ class DeepgramListenProviderV2(UncheckedBaseModel): """ if IS_PYDANTIC_V2: + @pydantic.model_validator(mode="before") @classmethod def _migrate_language_hint(cls, values: typing.Any) -> typing.Any: diff --git a/src/deepgram/types/deepgram_model.py b/src/deepgram/types/deepgram_model.py index 71402f99..b7e21f85 100644 --- a/src/deepgram/types/deepgram_model.py +++ b/src/deepgram/types/deepgram_model.py @@ -103,6 +103,236 @@ "flux-tanner-en", "flux-wade-en", "flux-wes-en", + "flux-anouk-nl", + "flux-bram-nl", + "flux-fleur-nl", + "flux-irene-nl", + "flux-luuk-nl", + "flux-monique-nl", + "flux-ruben-nl", + "flux-sanne-nl", + "flux-yvonne-nl", + "flux-dirk-nl", + "flux-lotte-nl", + "flux-niels-nl", + "flux-veerle-nl", + "flux-arnaud-fr", + "flux-benoit-fr", + "flux-brigitte-fr", + "flux-camille-fr", + "flux-chloe-fr", + "flux-florian-fr", + "flux-julien-fr", + "flux-mathieu-fr", + "flux-pierre-fr", + "flux-thierry-fr", + "flux-veronique-fr", + "flux-yasmine-fr", + "flux-benjamin-de", + "flux-christian-de", + "flux-janine-de", + "flux-magdalena-de", + "flux-moritz-de", + "flux-nadine-de", + "flux-rolf-de", + "flux-sonja-de", + "flux-sven-de", + "flux-tobias-de", + "flux-verena-de", + "flux-leonie-de", + "flux-yannick-de", + "flux-ajay-hi", + "flux-anjali-hi", + "flux-arjun-hi", + "flux-divya-hi", + "flux-jyoti-hi", + "flux-nikhil-hi", + "flux-pallavi-hi", + "flux-prachi-hi", + "flux-rahul-hi", + "flux-rajesh-hi", + "flux-ritu-hi", + "flux-shreya-hi", + "flux-sunita-hi", + "flux-vikram-hi", + "flux-angela-it", + "flux-chiara-it", + "flux-federico-it", + "flux-giorgio-it", + "flux-matteo-it", + "flux-paola-it", + "flux-rocco-it", + "flux-sofia-it", + "flux-stefano-it", + "flux-vincenzo-it", + "flux-vito-it", + "flux-ayumi-ja", + "flux-hayato-ja", + "flux-nozomi-ja", + "flux-sayaka-ja", + "flux-bianca-pt", + "flux-bruno-pt", + "flux-claudia-pt", + "flux-leandro-pt", + "flux-marcia-pt", + "flux-mariana-pt", + "flux-marta-pt", + "flux-mateus-pt", + "flux-miguel-pt", + "flux-renato-pt", + "flux-roberto-pt", + "flux-rodrigo-pt", + "flux-artur-pt", + "flux-benedita-pt", + "flux-catarina-pt", + "flux-hugo-pt", + "flux-pedro-pt", + "flux-ricardo-pt", + "flux-andrei-ru", + "flux-kirill-ru", + "flux-maxim-ru", + "flux-mikhail-ru", + "flux-natalia-ru", + "flux-nikolai-ru", + "flux-olga-ru", + "flux-polina-ru", + "flux-vladimir-ru", + "flux-aina-es", + "flux-alfredo-es", + "flux-carmen-es", + "flux-cecilia-es", + "flux-duvan-es", + "flux-eduardo-es", + "flux-ernesto-es", + "flux-fernanda-es", + "flux-fiorella-es", + "flux-gustavo-es", + "flux-jaime-es", + "flux-martin-es", + "flux-mauricio-es", + "flux-patricia-es", + "flux-pilar-es", + "flux-rafael-es", + "flux-tomas-es", + "flux-valentina-es", + "flux-ysabel-es", + "flux-afsana-bn", + "flux-ishrat-bn", + "flux-mamun-bn", + "flux-sabbir-bn", + "flux-shuvo-bn", + "flux-sumaiya-bn", + "flux-desislava-bg", + "flux-gergana-bg", + "flux-jordi-ca", + "flux-judit-ca", + "flux-bo-zh", + "flux-haoran-zh", + "flux-jian-zh", + "flux-jie-zh", + "flux-lijuan-zh", + "flux-shufen-zh", + "flux-wenbo-zh", + "flux-wenjing-zh", + "flux-zhen-zh", + "flux-chiaying-zh", + "flux-kuanyu-zh", + "flux-yawen-zh", + "flux-yuting-zh", + "flux-manlok-zh", + "flux-dalibor-hr", + "flux-danijela-hr", + "flux-domagoj-hr", + "flux-jasna-hr", + "flux-josipa-hr", + "flux-mihaela-hr", + "flux-vedran-hr", + "flux-jakub-cs", + "flux-pernille-da", + "flux-rasmus-da", + "flux-rikke-da", + "flux-triin-et", + "flux-kirsi-fi", + "flux-teemu-fi", + "flux-kostas-el", + "flux-bhavna-gu", + "flux-hetal-gu", + "flux-jignesh-gu", + "flux-bence-hu", + "flux-eszter-hu", + "flux-kinga-hu", + "flux-tibor-hu", + "flux-dewi-id", + "flux-fajar-id", + "flux-fitri-id", + "flux-rizky-id", + "flux-teguh-id", + "flux-manjunath-kn", + "flux-eunji-ko", + "flux-hyunwoo-ko", + "flux-mikyung-ko", + "flux-minjun-ko", + "flux-soojin-ko", + "flux-sungmin-ko", + "flux-agnese-lv", + "flux-edgars-lv", + "flux-goda-lt", + "flux-neringa-lt", + "flux-haziq-ms", + "flux-izzah-ms", + "flux-pooja-mr", + "flux-pratik-mr", + "flux-sneha-mr", + "flux-erlend-no", + "flux-espen-no", + "flux-ida-no", + "flux-signe-no", + "flux-silje-no", + "flux-vegard-no", + "flux-bartosz-pl", + "flux-ewa-pl", + "flux-justyna-pl", + "flux-kacper-pl", + "flux-konrad-pl", + "flux-zuzanna-pl", + "flux-cosmin-ro", + "flux-ioana-ro", + "flux-dominika-sk", + "flux-juraj-sk", + "flux-gregor-sl", + "flux-katja-sl", + "flux-axel-sv", + "flux-charlotta-sv", + "flux-frida-sv", + "flux-ludvig-sv", + "flux-oskar-sv", + "flux-pontus-sv", + "flux-wilma-sv", + "flux-jerome-tl", + "flux-jomar-tl", + "flux-liezel-tl", + "flux-noel-tl", + "flux-trisha-tl", + "flux-gokul-ta", + "flux-kavya-ta", + "flux-sowmya-ta", + "flux-vinoth-ta", + "flux-pavan-te", + "flux-ravi-te", + "flux-sravani-te", + "flux-dilek-tr", + "flux-ecem-tr", + "flux-emre-tr", + "flux-gizem-tr", + "flux-mehmet-tr", + "flux-serkan-tr", + "flux-zeynep-tr", + "flux-denys-uk", + "flux-solomiya-uk", + "flux-ambreen-ur", + "flux-usman-ur", + "flux-hoa-vi", + "flux-minh-vi", ], typing.Any, ] diff --git a/src/deepgram/types/listen_v1redact_usage.py b/src/deepgram/types/listen_v1redact_usage.py new file mode 100644 index 00000000..eeb62265 --- /dev/null +++ b/src/deepgram/types/listen_v1redact_usage.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +ListenV1RedactUsage = typing.Union[typing.Literal["true", "false"], typing.Any] diff --git a/src/deepgram/types/listen_v2configure_redact_usage.py b/src/deepgram/types/listen_v2configure_redact_usage.py new file mode 100644 index 00000000..e54d8bcc --- /dev/null +++ b/src/deepgram/types/listen_v2configure_redact_usage.py @@ -0,0 +1,6 @@ +# This file was auto-generated by Fern from our API Definition. + +ListenV2ConfigureRedactUsage = bool +""" +Set to `true` to redact keyterms sent in this and later Configure messages from this connection's usage records. Does not redact keyterms in the connection URL; set the `redact_usage` query parameter for that. Once on, it stays on for the rest of the connection; `false` has no effect. +""" diff --git a/src/deepgram/types/listen_v2redact_usage.py b/src/deepgram/types/listen_v2redact_usage.py new file mode 100644 index 00000000..001eee4d --- /dev/null +++ b/src/deepgram/types/listen_v2redact_usage.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +ListenV2RedactUsage = typing.Union[typing.Literal["true", "false"], typing.Any] diff --git a/src/deepgram/types/shared_intents.py b/src/deepgram/types/shared_intents.py index 619a4eba..ad991bcf 100644 --- a/src/deepgram/types/shared_intents.py +++ b/src/deepgram/types/shared_intents.py @@ -25,6 +25,7 @@ def results(self) -> typing.Optional[SharedIntentsResults]: return SharedIntentsResults(intents=SharedIntentsResultsIntents(segments=self.segments)) if IS_PYDANTIC_V2: + @pydantic.model_validator(mode="before") @classmethod def _migrate_legacy_results(cls, values: typing.Any) -> typing.Any: diff --git a/src/deepgram/types/shared_topics.py b/src/deepgram/types/shared_topics.py index b2b00fa4..4f26c3b7 100644 --- a/src/deepgram/types/shared_topics.py +++ b/src/deepgram/types/shared_topics.py @@ -25,6 +25,7 @@ def results(self) -> typing.Optional[SharedTopicsResults]: return SharedTopicsResults(topics=SharedTopicsResultsTopics(segments=self.segments)) if IS_PYDANTIC_V2: + @pydantic.model_validator(mode="before") @classmethod def _migrate_legacy_results(cls, values: typing.Any) -> typing.Any: diff --git a/src/deepgram/types/speak_v2normalize_volume.py b/src/deepgram/types/speak_v2normalize_volume.py new file mode 100644 index 00000000..e24085b0 --- /dev/null +++ b/src/deepgram/types/speak_v2normalize_volume.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +SpeakV2NormalizeVolume = typing.Union[typing.Literal["true", "false"], typing.Any] diff --git a/tests/custom/test_http_endpoints_coverage.py b/tests/custom/test_http_endpoints_coverage.py index 388af553..d67e024a 100644 --- a/tests/custom/test_http_endpoints_coverage.py +++ b/tests/custom/test_http_endpoints_coverage.py @@ -241,6 +241,44 @@ async def test_listen_v1_media_serializes_language_hints_async( assert query["language_hint"] == expected_hints +@pytest.mark.parametrize("method", ["transcribe_url", "transcribe_file"]) +@pytest.mark.parametrize("raw", [False, True], ids=["public", "raw"]) +def test_listen_v1_media_serializes_redact_usage_sync(method: str, raw: bool) -> None: + with respx.mock: + route = respx.post(f"{BASE}/v1/listen").mock(return_value=httpx.Response(200, json={})) + media = _sync_client().listen.v1.media.with_raw_response if raw else _sync_client().listen.v1.media + kwargs: typing.Dict[str, typing.Any] = {"redact_usage": True} + kwargs["url" if method == "transcribe_url" else "request"] = ( + "https://example.com/a.wav" if method == "transcribe_url" else b"audio-bytes" + ) + + getattr(media, method)(**kwargs) + + assert route.called + assert route.calls.last.request.method == "POST" + assert route.calls.last.request.url.path == "/v1/listen" + assert route.calls.last.request.url.params["redact_usage"] == "true" + + +@pytest.mark.parametrize("method", ["transcribe_url", "transcribe_file"]) +@pytest.mark.parametrize("raw", [False, True], ids=["public", "raw"]) +async def test_listen_v1_media_serializes_redact_usage_async(method: str, raw: bool) -> None: + with respx.mock: + route = respx.post(f"{BASE}/v1/listen").mock(return_value=httpx.Response(200, json={})) + media = _async_client().listen.v1.media.with_raw_response if raw else _async_client().listen.v1.media + kwargs: typing.Dict[str, typing.Any] = {"redact_usage": True} + kwargs["url" if method == "transcribe_url" else "request"] = ( + "https://example.com/a.wav" if method == "transcribe_url" else b"audio-bytes" + ) + + await getattr(media, method)(**kwargs) + + assert route.called + assert route.calls.last.request.method == "POST" + assert route.calls.last.request.url.path == "/v1/listen" + assert route.calls.last.request.url.params["redact_usage"] == "true" + + def _walk_subclients(obj: typing.Any, depth: int = 0, seen: typing.Optional[set] = None) -> int: """Touch every nested sub-client property to cover their lazy-init accessors.""" seen = seen if seen is not None else set() diff --git a/tests/custom/test_listen_v2_connect_wire.py b/tests/custom/test_listen_v2_connect_wire.py index c08e30f9..e71e8c4b 100644 --- a/tests/custom/test_listen_v2_connect_wire.py +++ b/tests/custom/test_listen_v2_connect_wire.py @@ -23,6 +23,7 @@ from unittest.mock import patch import deepgram.listen.v2.client as listen_v2_client +import deepgram.listen.v2.raw_client as listen_v2_raw_client from deepgram import AsyncDeepgramClient, DeepgramClient @@ -82,11 +83,13 @@ def test_sync_connect_serializes_redact(): with DeepgramClient(api_key="test_api_key").listen.v2.connect( model="flux-general-en", redact="aggressive_numbers", + redact_usage="true", ): pass _, query = _path_and_query(capture.url) assert query["redact"] == ["aggressive_numbers"] + assert query["redact_usage"] == ["true"] async def test_async_connect_serializes_redact(): @@ -95,11 +98,41 @@ async def test_async_connect_serializes_redact(): async with AsyncDeepgramClient(api_key="test_api_key").listen.v2.connect( model="flux-general-en", redact="numbers", + redact_usage="false", ): pass _, query = _path_and_query(capture.url) assert query["redact"] == ["numbers"] + assert query["redact_usage"] == ["false"] + + +def test_sync_raw_connect_serializes_redact_usage(): + capture = _CaptureConnect() + with patch.object(listen_v2_raw_client.websockets_sync_client, "connect", capture): + with DeepgramClient(api_key="test_api_key").listen.v2.with_raw_response.connect( + model="flux-general-en", + redact_usage="true", + ): + pass + + path, query = _path_and_query(capture.url) + assert path == "/v2/listen" + assert query["redact_usage"] == ["true"] + + +async def test_async_raw_connect_serializes_redact_usage(): + capture = _CaptureConnect() + with patch.object(listen_v2_raw_client, "websockets_client_connect", capture): + async with AsyncDeepgramClient(api_key="test_api_key").listen.v2.with_raw_response.connect( + model="flux-general-en", + redact_usage="false", + ): + pass + + path, query = _path_and_query(capture.url) + assert path == "/v2/listen" + assert query["redact_usage"] == ["false"] def test_sync_connect_omits_numerals_when_absent(): diff --git a/tests/custom/test_model_dict_compat.py b/tests/custom/test_model_dict_compat.py index 770c0947..57d2a8de 100644 --- a/tests/custom/test_model_dict_compat.py +++ b/tests/custom/test_model_dict_compat.py @@ -47,6 +47,26 @@ async def recv(self) -> str: return json.dumps(TURN_INFO) +CONFIGURE_SUCCESS = { + "type": "ConfigureSuccess", + "request_id": "request-id", + "thresholds": {}, + "keyterms": [], + "redact_usage": True, + "sequence_id": 5, +} + + +class _ConfigureSuccessWebSocket: + def recv(self) -> str: + return json.dumps(CONFIGURE_SUCCESS) + + +class _AsyncConfigureSuccessWebSocket: + async def recv(self) -> str: + return json.dumps(CONFIGURE_SUCCESS) + + def _assert_attribute_and_subscript_access(message: object) -> None: assert isinstance(message, ListenV2TurnInfo) @@ -71,6 +91,20 @@ async def test_async_listen_v2_response_supports_both_access_styles() -> None: _assert_attribute_and_subscript_access(message) +def test_sync_configure_success_parses_redact_usage() -> None: + message = V2SocketClient(websocket=typing.cast(typing.Any, _ConfigureSuccessWebSocket())).recv() + assert isinstance(message, ListenV2ConfigureSuccess) + assert message.redact_usage is True + assert message["redact_usage"] is True + + +async def test_async_configure_success_parses_redact_usage() -> None: + message = await AsyncV2SocketClient(websocket=typing.cast(typing.Any, _AsyncConfigureSuccessWebSocket())).recv() + assert isinstance(message, ListenV2ConfigureSuccess) + assert message.redact_usage is True + assert message["redact_usage"] is True + + def test_all_listen_v2_response_models_support_subscript_access() -> None: configure_success = ListenV2ConfigureSuccess( type="ConfigureSuccess", @@ -107,12 +141,14 @@ def test_listen_v2_generated_warning_and_configure_fields_remain_typed_and_subsc thresholds=ListenV2ConfigureSuccessThresholds(eot_threshold=0.7), keyterms=[], numerals=True, + redact_usage=True, sequence_id=5, ) assert warning["code"] == "NOTICE" assert failure["description"] == "invalid setting" assert success["numerals"] is True + assert success["redact_usage"] is True def test_unrelated_models_do_not_gain_subscript_access() -> None: diff --git a/tests/custom/test_socket_client_shims.py b/tests/custom/test_socket_client_shims.py index 7cdd1299..9cee319f 100644 --- a/tests/custom/test_socket_client_shims.py +++ b/tests/custom/test_socket_client_shims.py @@ -298,6 +298,11 @@ def test_typed_numerals_model_is_serialized_and_sent(self): V2SocketClient(websocket=ws).send_configure(ListenV2Configure(numerals=True)) assert _sent_json(ws) == {"type": "Configure", "numerals": True} + def test_typed_redact_usage_model_is_serialized_and_sent(self): + ws = _FakeWebSocket() + V2SocketClient(websocket=ws).send_configure(ListenV2Configure(redact_usage="true")) + assert _sent_json(ws) == {"type": "Configure", "redact_usage": True} + async def test_typed_model_is_serialized_and_sent_async(self): ws = _FakeAsyncWebSocket() await AsyncV2SocketClient(websocket=ws).send_configure(ListenV2Configure(language_hints=["en"])) @@ -305,6 +310,11 @@ async def test_typed_model_is_serialized_and_sent_async(self): assert sent["type"] == "Configure" assert sent["language_hints"] == ["en"] + async def test_typed_redact_usage_model_is_serialized_and_sent_async(self): + ws = _FakeAsyncWebSocket() + await AsyncV2SocketClient(websocket=ws).send_configure(ListenV2Configure(redact_usage="false")) + assert _sent_json(ws) == {"type": "Configure", "redact_usage": False} + async def test_passthrough_dict_is_sent_verbatim_async(self): ws = _FakeAsyncWebSocket() body = {"type": "Configure", "language_hints": ["en", "es"]} diff --git a/tests/custom/test_speak_v2_connect_wire.py b/tests/custom/test_speak_v2_connect_wire.py index 2cdddb84..590bdee0 100644 --- a/tests/custom/test_speak_v2_connect_wire.py +++ b/tests/custom/test_speak_v2_connect_wire.py @@ -23,6 +23,7 @@ from unittest.mock import patch import deepgram.speak.v2.client as speak_v2_client +import deepgram.speak.v2.raw_client as speak_v2_raw_client from deepgram import AsyncDeepgramClient, DeepgramClient @@ -65,6 +66,7 @@ def test_sync_connect_targets_v2_speak_and_serializes_query(): model="flux-alexis-en", encoding="linear16", sample_rate="24000", + normalize_volume="true", mip_opt_out=True, ): pass @@ -74,6 +76,7 @@ def test_sync_connect_targets_v2_speak_and_serializes_query(): assert query["model"] == ["flux-alexis-en"] assert query["encoding"] == ["linear16"] assert query["sample_rate"] == ["24000"] + assert query["normalize_volume"] == ["true"] # The load-bearing assertion: Python True must serialize as "true", not "True". assert query["mip_opt_out"] == ["true"] @@ -83,6 +86,7 @@ async def test_async_connect_targets_v2_speak_and_serializes_query(): with patch.object(speak_v2_client, "websockets_client_connect", capture): async with AsyncDeepgramClient(api_key="test_api_key").speak.v2.connect( model="flux-alexis-en", + normalize_volume="false", mip_opt_out=True, ): pass @@ -90,4 +94,33 @@ async def test_async_connect_targets_v2_speak_and_serializes_query(): path, query = _path_and_query(capture.url) assert path == "/v2/speak" assert query["model"] == ["flux-alexis-en"] + assert query["normalize_volume"] == ["false"] assert query["mip_opt_out"] == ["true"] + + +def test_sync_raw_connect_serializes_normalize_volume(): + capture = _CaptureConnect() + with patch.object(speak_v2_raw_client.websockets_sync_client, "connect", capture): + with DeepgramClient(api_key="test_api_key").speak.v2.with_raw_response.connect( + model="flux-alexis-en", + normalize_volume="true", + ): + pass + + path, query = _path_and_query(capture.url) + assert path == "/v2/speak" + assert query["normalize_volume"] == ["true"] + + +async def test_async_raw_connect_serializes_normalize_volume(): + capture = _CaptureConnect() + with patch.object(speak_v2_raw_client, "websockets_client_connect", capture): + async with AsyncDeepgramClient(api_key="test_api_key").speak.v2.with_raw_response.connect( + model="flux-alexis-en", + normalize_volume="false", + ): + pass + + path, query = _path_and_query(capture.url) + assert path == "/v2/speak" + assert query["normalize_volume"] == ["false"] diff --git a/tests/custom/test_speak_v2_coverage.py b/tests/custom/test_speak_v2_coverage.py index a711fef4..4dfb11fa 100644 --- a/tests/custom/test_speak_v2_coverage.py +++ b/tests/custom/test_speak_v2_coverage.py @@ -101,24 +101,52 @@ async def test_async_streams_audio_bytes(self) -> None: def test_sync_serializes_speed_and_expressivity(self) -> None: with respx.mock: - route = respx.route(host=HOST).mock(return_value=httpx.Response(200, content=b"audio-bytes")) + route = respx.post(f"{BASE}/v2/speak").mock(return_value=httpx.Response(200, content=b"audio-bytes")) list( - _sync_client().speak.v2.audio.generate(model="flux-alexis-en", text="hello", speed=1.05, expressivity=2) + _sync_client().speak.v2.audio.generate( + model="flux-alexis-en", text="hello", speed=1.05, expressivity=2, normalize_volume=True + ) ) assert route.called + assert route.calls.last.request.method == "POST" + assert route.calls.last.request.url.path == "/v2/speak" assert route.calls.last.request.url.params["speed"] == "1.05" assert route.calls.last.request.url.params["expressivity"] == "2" + assert route.calls.last.request.url.params["normalize_volume"] == "true" async def test_async_serializes_speed_and_expressivity(self) -> None: with respx.mock: - route = respx.route(host=HOST).mock(return_value=httpx.Response(200, content=b"audio-bytes")) + route = respx.post(f"{BASE}/v2/speak").mock(return_value=httpx.Response(200, content=b"audio-bytes")) async for _ in _async_client().speak.v2.audio.generate( - model="flux-alexis-en", text="hello", speed=1.05, expressivity=2 + model="flux-alexis-en", text="hello", speed=1.05, expressivity=2, normalize_volume=False ): pass assert route.called + assert route.calls.last.request.method == "POST" + assert route.calls.last.request.url.path == "/v2/speak" assert route.calls.last.request.url.params["speed"] == "1.05" assert route.calls.last.request.url.params["expressivity"] == "2" + assert route.calls.last.request.url.params["normalize_volume"] == "false" + + def test_raw_sync_serializes_normalize_volume(self) -> None: + with respx.mock: + route = respx.post(f"{BASE}/v2/speak").mock(return_value=httpx.Response(200, content=b"audio-bytes")) + with _sync_client().speak.v2.audio.with_raw_response.generate( + model="flux-alexis-en", text="hello", normalize_volume=True + ) as response: + assert b"".join(response.data) == b"audio-bytes" + + assert route.calls.last.request.url.params["normalize_volume"] == "true" + + async def test_raw_async_serializes_normalize_volume(self) -> None: + with respx.mock: + route = respx.post(f"{BASE}/v2/speak").mock(return_value=httpx.Response(200, content=b"audio-bytes")) + async with _async_client().speak.v2.audio.with_raw_response.generate( + model="flux-alexis-en", text="hello", normalize_volume=False + ) as response: + assert b"".join([chunk async for chunk in response.data]) == b"audio-bytes" + + assert route.calls.last.request.url.params["normalize_volume"] == "false" def test_with_raw_response_accessor(self) -> None: assert isinstance( diff --git a/tests/custom/test_websocket_streaming_coverage.py b/tests/custom/test_websocket_streaming_coverage.py index 132df1d5..4d440888 100644 --- a/tests/custom/test_websocket_streaming_coverage.py +++ b/tests/custom/test_websocket_streaming_coverage.py @@ -24,6 +24,8 @@ import respx import websockets.sync.client as websockets_sync_client +import deepgram.listen.v1.client as listen_v1_client +import deepgram.listen.v1.raw_client as listen_v1_raw_client from deepgram import AsyncDeepgramClient, DeepgramClient from deepgram.core.api_error import ApiError from deepgram.core.events import EventType @@ -144,6 +146,47 @@ def _make_invalid_status(code: int) -> InvalidWebSocketStatus: _WS_IDS = [e[0] for e in WS_ENDPOINTS] +def test_listen_v1_connect_serializes_redact_usage(monkeypatch: pytest.MonkeyPatch) -> None: + captured_urls: typing.List[str] = [] + + def _connect(url: str, **_kwargs: typing.Any) -> _FakeSyncConnectCM: + captured_urls.append(url) + return _FakeSyncConnectCM(_FakeSyncWS()) + + monkeypatch.setattr(websockets_sync_client, "connect", _connect) + with _sync_client().listen.v1.connect(model="nova-3", redact_usage="true"): + pass + with _sync_client().listen.v1.with_raw_response.connect(model="nova-3", redact_usage="true"): + pass + + assert len(captured_urls) == 2 + for url in captured_urls: + assert urllib.parse.urlsplit(url).path == "/v1/listen" + query = urllib.parse.parse_qs(urllib.parse.urlsplit(url).query) + assert query["redact_usage"] == ["true"] + + +async def test_async_listen_v1_connect_serializes_redact_usage(monkeypatch: pytest.MonkeyPatch) -> None: + captured_urls: typing.List[str] = [] + + def _connect(url: str, **_kwargs: typing.Any) -> _FakeAsyncConnectCM: + captured_urls.append(url) + return _FakeAsyncConnectCM(_FakeAsyncWS()) + + monkeypatch.setattr(listen_v1_client, "websockets_client_connect", _connect) + monkeypatch.setattr(listen_v1_raw_client, "websockets_client_connect", _connect) + async with _async_client().listen.v1.connect(model="nova-3", redact_usage="false"): + pass + async with _async_client().listen.v1.with_raw_response.connect(model="nova-3", redact_usage="false"): + pass + + assert len(captured_urls) == 2 + for url in captured_urls: + assert urllib.parse.urlsplit(url).path == "/v1/listen" + query = urllib.parse.parse_qs(urllib.parse.urlsplit(url).query) + assert query["redact_usage"] == ["false"] + + def _async_connect_modules(leaf: str) -> typing.List[str]: """The two modules that import ``websockets_client_connect`` for an endpoint.""" return [f"deepgram.{leaf}.client", f"deepgram.{leaf}.raw_client"] diff --git a/tests/wire/test_listen_v1_media.py b/tests/wire/test_listen_v1_media.py index 44dd3752..9998a387 100644 --- a/tests/wire/test_listen_v1_media.py +++ b/tests/wire/test_listen_v1_media.py @@ -46,6 +46,7 @@ def test_listen_v1_media_transcribe_url_serializes_all_query_params() -> None: profanity_filter=True, punctuate=True, redact="redact", + redact_usage=True, replace=["replace"], search=["search"], smart_format=True, @@ -91,6 +92,7 @@ def test_listen_v1_media_transcribe_url_serializes_all_query_params() -> None: "profanity_filter": "true", "punctuate": "true", "redact": "redact", + "redact_usage": "true", "replace": "replace", "search": "search", "smart_format": "true",