From 4eee7ee08248476ae9dedd533acca1e7dee1a0a6 Mon Sep 17 00:00:00 2001 From: Pine Date: Wed, 27 May 2026 11:38:04 +0800 Subject: [PATCH] =?UTF-8?q?feat(middleware)=EF=BC=9Aopenai=E6=9C=80?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E8=AF=B7=E6=B1=82=E4=B8=AD=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E4=BA=86zstd=E5=8E=8B=E7=BC=A9=E6=95=B0=E6=8D=AE=EF=BC=8C?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E4=B8=AD=E9=97=B4=E4=BB=B6=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E8=A7=A3=E5=8E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 1 + request_body.json | Bin 0 -> 49237 bytes routers/middleware.py | 51 +++++++++++++++++++++++++++++++++++- uv.lock | 59 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 request_body.json diff --git a/pyproject.toml b/pyproject.toml index c0ae40f..f031cdf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,4 +9,5 @@ dependencies = [ "uvicorn>=0.44.0", "requests>=2.28", "rtoml>=0.13.0", + "zstandard>=0.25.0", ] diff --git a/request_body.json b/request_body.json new file mode 100644 index 0000000000000000000000000000000000000000..cff56f2218860311f70969fc0b7f622ec95de670 GIT binary patch literal 49237 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 N5ofFyFN~rK5ER_|>xBRS literal 0 HcmV?d00001 diff --git a/routers/middleware.py b/routers/middleware.py index 8fd3893..bf6b9e9 100644 --- a/routers/middleware.py +++ b/routers/middleware.py @@ -11,6 +11,13 @@ from fastapi.middleware.cors import CORSMiddleware from app.config import MODEL_MAP, DEFAULT_MODEL, MY_API_KEY +try: + import zstandard as zstd + HAS_ZSTD = True +except ImportError: + zstd = None + HAS_ZSTD = False + def setup_middleware(app): """配置所有中间件 @@ -52,10 +59,52 @@ def setup_middleware(app): @app.middleware("http") async def resolve_model(request, call_next): - """拦截请求中的模型名称,按 MODEL_MAP 进行替换""" + """拦截请求中的模型名称,按 MODEL_MAP 进行替换 + + 同时处理 Content-Encoding: zstd 的请求体解压。 + """ if request.method == "POST": body = await request.body() if body: + # zstd 解压支持 + content_encoding = request.headers.get("content-encoding", "") + if content_encoding == "zstd": + if not HAS_ZSTD: + return Response( + content=json.dumps({ + "error": { + "message": "zstd decompression not available; install zstandard package", + "type": "server_error", + }, + }), + status_code=500, + media_type="application/json", + ) + try: + import io + dctx = zstd.ZstdDecompressor() + buffer = io.BytesIO() + with dctx.stream_reader(io.BytesIO(body)) as reader: + while True: + chunk = reader.read(65536) + if not chunk: + break + buffer.write(chunk) + body = buffer.getvalue() + # 覆盖缓存的 request body,让下游 handler 读到解压后的数据 + request._body = body + except zstd.ZstdError as e: + return Response( + content=json.dumps({ + "error": { + "message": f"zstd decompression failed: {e}", + "type": "invalid_request_error", + }, + }), + status_code=400, + media_type="application/json", + ) + # 解析 model 字段 try: data = json.loads(body) original = data.get("model") diff --git a/uv.lock b/uv.lock index 647d328..702c23f 100644 --- a/uv.lock +++ b/uv.lock @@ -136,6 +136,7 @@ dependencies = [ { name = "requests" }, { name = "rtoml" }, { name = "uvicorn" }, + { name = "zstandard" }, ] [package.metadata] @@ -144,6 +145,7 @@ requires-dist = [ { name = "requests", specifier = ">=2.28" }, { name = "rtoml", specifier = ">=0.13.0" }, { name = "uvicorn", specifier = ">=0.44.0" }, + { name = "zstandard", specifier = ">=0.25.0" }, ] [[package]] @@ -396,3 +398,60 @@ sdist = { url = "https://files.pythonhosted.org/packages/e6/bf/f6544ba992ddb9a60 wheels = [ { url = "https://files.pythonhosted.org/packages/01/be/72532be3da7acc5fdfbccdb95215cd04f995a0886532a5b423f929cda4cc/uvicorn-0.48.0-py3-none-any.whl", hash = "sha256:48097851328b87ec36117d3d575234519eb58c2b22d79666e9bbc6c49a761dad", size = 71410, upload-time = "2026-05-24T12:08:40.258Z" }, ] + +[[package]] +name = "zstandard" +version = "0.25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/aa/3e0508d5a5dd96529cdc5a97011299056e14c6505b678fd58938792794b1/zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b", size = 711513, upload-time = "2025-09-14T22:15:54.002Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/fc/f26eb6ef91ae723a03e16eddb198abcfce2bc5a42e224d44cc8b6765e57e/zstandard-0.25.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7b3c3a3ab9daa3eed242d6ecceead93aebbb8f5f84318d82cee643e019c4b73b", size = 795738, upload-time = "2025-09-14T22:16:56.237Z" }, + { url = "https://files.pythonhosted.org/packages/aa/1c/d920d64b22f8dd028a8b90e2d756e431a5d86194caa78e3819c7bf53b4b3/zstandard-0.25.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:913cbd31a400febff93b564a23e17c3ed2d56c064006f54efec210d586171c00", size = 640436, upload-time = "2025-09-14T22:16:57.774Z" }, + { url = "https://files.pythonhosted.org/packages/53/6c/288c3f0bd9fcfe9ca41e2c2fbfd17b2097f6af57b62a81161941f09afa76/zstandard-0.25.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:011d388c76b11a0c165374ce660ce2c8efa8e5d87f34996aa80f9c0816698b64", size = 5343019, upload-time = "2025-09-14T22:16:59.302Z" }, + { url = "https://files.pythonhosted.org/packages/1e/15/efef5a2f204a64bdb5571e6161d49f7ef0fffdbca953a615efbec045f60f/zstandard-0.25.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dffecc361d079bb48d7caef5d673c88c8988d3d33fb74ab95b7ee6da42652ea", size = 5063012, upload-time = "2025-09-14T22:17:01.156Z" }, + { url = "https://files.pythonhosted.org/packages/b7/37/a6ce629ffdb43959e92e87ebdaeebb5ac81c944b6a75c9c47e300f85abdf/zstandard-0.25.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7149623bba7fdf7e7f24312953bcf73cae103db8cae49f8154dd1eadc8a29ecb", size = 5394148, upload-time = "2025-09-14T22:17:03.091Z" }, + { url = "https://files.pythonhosted.org/packages/e3/79/2bf870b3abeb5c070fe2d670a5a8d1057a8270f125ef7676d29ea900f496/zstandard-0.25.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6a573a35693e03cf1d67799fd01b50ff578515a8aeadd4595d2a7fa9f3ec002a", size = 5451652, upload-time = "2025-09-14T22:17:04.979Z" }, + { url = "https://files.pythonhosted.org/packages/53/60/7be26e610767316c028a2cbedb9a3beabdbe33e2182c373f71a1c0b88f36/zstandard-0.25.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5a56ba0db2d244117ed744dfa8f6f5b366e14148e00de44723413b2f3938a902", size = 5546993, upload-time = "2025-09-14T22:17:06.781Z" }, + { url = "https://files.pythonhosted.org/packages/85/c7/3483ad9ff0662623f3648479b0380d2de5510abf00990468c286c6b04017/zstandard-0.25.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:10ef2a79ab8e2974e2075fb984e5b9806c64134810fac21576f0668e7ea19f8f", size = 5046806, upload-time = "2025-09-14T22:17:08.415Z" }, + { url = "https://files.pythonhosted.org/packages/08/b3/206883dd25b8d1591a1caa44b54c2aad84badccf2f1de9e2d60a446f9a25/zstandard-0.25.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aaf21ba8fb76d102b696781bddaa0954b782536446083ae3fdaa6f16b25a1c4b", size = 5576659, upload-time = "2025-09-14T22:17:10.164Z" }, + { url = "https://files.pythonhosted.org/packages/9d/31/76c0779101453e6c117b0ff22565865c54f48f8bd807df2b00c2c404b8e0/zstandard-0.25.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1869da9571d5e94a85a5e8d57e4e8807b175c9e4a6294e3b66fa4efb074d90f6", size = 4953933, upload-time = "2025-09-14T22:17:11.857Z" }, + { url = "https://files.pythonhosted.org/packages/18/e1/97680c664a1bf9a247a280a053d98e251424af51f1b196c6d52f117c9720/zstandard-0.25.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:809c5bcb2c67cd0ed81e9229d227d4ca28f82d0f778fc5fea624a9def3963f91", size = 5268008, upload-time = "2025-09-14T22:17:13.627Z" }, + { url = "https://files.pythonhosted.org/packages/1e/73/316e4010de585ac798e154e88fd81bb16afc5c5cb1a72eeb16dd37e8024a/zstandard-0.25.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f27662e4f7dbf9f9c12391cb37b4c4c3cb90ffbd3b1fb9284dadbbb8935fa708", size = 5433517, upload-time = "2025-09-14T22:17:16.103Z" }, + { url = "https://files.pythonhosted.org/packages/5b/60/dd0f8cfa8129c5a0ce3ea6b7f70be5b33d2618013a161e1ff26c2b39787c/zstandard-0.25.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99c0c846e6e61718715a3c9437ccc625de26593fea60189567f0118dc9db7512", size = 5814292, upload-time = "2025-09-14T22:17:17.827Z" }, + { url = "https://files.pythonhosted.org/packages/fc/5f/75aafd4b9d11b5407b641b8e41a57864097663699f23e9ad4dbb91dc6bfe/zstandard-0.25.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:474d2596a2dbc241a556e965fb76002c1ce655445e4e3bf38e5477d413165ffa", size = 5360237, upload-time = "2025-09-14T22:17:19.954Z" }, + { url = "https://files.pythonhosted.org/packages/ff/8d/0309daffea4fcac7981021dbf21cdb2e3427a9e76bafbcdbdf5392ff99a4/zstandard-0.25.0-cp312-cp312-win32.whl", hash = "sha256:23ebc8f17a03133b4426bcc04aabd68f8236eb78c3760f12783385171b0fd8bd", size = 436922, upload-time = "2025-09-14T22:17:24.398Z" }, + { url = "https://files.pythonhosted.org/packages/79/3b/fa54d9015f945330510cb5d0b0501e8253c127cca7ebe8ba46a965df18c5/zstandard-0.25.0-cp312-cp312-win_amd64.whl", hash = "sha256:ffef5a74088f1e09947aecf91011136665152e0b4b359c42be3373897fb39b01", size = 506276, upload-time = "2025-09-14T22:17:21.429Z" }, + { url = "https://files.pythonhosted.org/packages/ea/6b/8b51697e5319b1f9ac71087b0af9a40d8a6288ff8025c36486e0c12abcc4/zstandard-0.25.0-cp312-cp312-win_arm64.whl", hash = "sha256:181eb40e0b6a29b3cd2849f825e0fa34397f649170673d385f3598ae17cca2e9", size = 462679, upload-time = "2025-09-14T22:17:23.147Z" }, + { url = "https://files.pythonhosted.org/packages/35/0b/8df9c4ad06af91d39e94fa96cc010a24ac4ef1378d3efab9223cc8593d40/zstandard-0.25.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec996f12524f88e151c339688c3897194821d7f03081ab35d31d1e12ec975e94", size = 795735, upload-time = "2025-09-14T22:17:26.042Z" }, + { url = "https://files.pythonhosted.org/packages/3f/06/9ae96a3e5dcfd119377ba33d4c42a7d89da1efabd5cb3e366b156c45ff4d/zstandard-0.25.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1", size = 640440, upload-time = "2025-09-14T22:17:27.366Z" }, + { url = "https://files.pythonhosted.org/packages/d9/14/933d27204c2bd404229c69f445862454dcc101cd69ef8c6068f15aaec12c/zstandard-0.25.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:e96594a5537722fdfb79951672a2a63aec5ebfb823e7560586f7484819f2a08f", size = 5343070, upload-time = "2025-09-14T22:17:28.896Z" }, + { url = "https://files.pythonhosted.org/packages/6d/db/ddb11011826ed7db9d0e485d13df79b58586bfdec56e5c84a928a9a78c1c/zstandard-0.25.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea", size = 5063001, upload-time = "2025-09-14T22:17:31.044Z" }, + { url = "https://files.pythonhosted.org/packages/db/00/87466ea3f99599d02a5238498b87bf84a6348290c19571051839ca943777/zstandard-0.25.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e", size = 5394120, upload-time = "2025-09-14T22:17:32.711Z" }, + { url = "https://files.pythonhosted.org/packages/2b/95/fc5531d9c618a679a20ff6c29e2b3ef1d1f4ad66c5e161ae6ff847d102a9/zstandard-0.25.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551", size = 5451230, upload-time = "2025-09-14T22:17:34.41Z" }, + { url = "https://files.pythonhosted.org/packages/63/4b/e3678b4e776db00f9f7b2fe58e547e8928ef32727d7a1ff01dea010f3f13/zstandard-0.25.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a", size = 5547173, upload-time = "2025-09-14T22:17:36.084Z" }, + { url = "https://files.pythonhosted.org/packages/4e/d5/ba05ed95c6b8ec30bd468dfeab20589f2cf709b5c940483e31d991f2ca58/zstandard-0.25.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611", size = 5046736, upload-time = "2025-09-14T22:17:37.891Z" }, + { url = "https://files.pythonhosted.org/packages/50/d5/870aa06b3a76c73eced65c044b92286a3c4e00554005ff51962deef28e28/zstandard-0.25.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3", size = 5576368, upload-time = "2025-09-14T22:17:40.206Z" }, + { url = "https://files.pythonhosted.org/packages/5d/35/398dc2ffc89d304d59bc12f0fdd931b4ce455bddf7038a0a67733a25f550/zstandard-0.25.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b", size = 4954022, upload-time = "2025-09-14T22:17:41.879Z" }, + { url = "https://files.pythonhosted.org/packages/9a/5c/36ba1e5507d56d2213202ec2b05e8541734af5f2ce378c5d1ceaf4d88dc4/zstandard-0.25.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1673b7199bbe763365b81a4f3252b8e80f44c9e323fc42940dc8843bfeaf9851", size = 5267889, upload-time = "2025-09-14T22:17:43.577Z" }, + { url = "https://files.pythonhosted.org/packages/70/e8/2ec6b6fb7358b2ec0113ae202647ca7c0e9d15b61c005ae5225ad0995df5/zstandard-0.25.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250", size = 5433952, upload-time = "2025-09-14T22:17:45.271Z" }, + { url = "https://files.pythonhosted.org/packages/7b/01/b5f4d4dbc59ef193e870495c6f1275f5b2928e01ff5a81fecb22a06e22fb/zstandard-0.25.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98", size = 5814054, upload-time = "2025-09-14T22:17:47.08Z" }, + { url = "https://files.pythonhosted.org/packages/b2/e5/fbd822d5c6f427cf158316d012c5a12f233473c2f9c5fe5ab1ae5d21f3d8/zstandard-0.25.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf", size = 5360113, upload-time = "2025-09-14T22:17:48.893Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e0/69a553d2047f9a2c7347caa225bb3a63b6d7704ad74610cb7823baa08ed7/zstandard-0.25.0-cp313-cp313-win32.whl", hash = "sha256:7030defa83eef3e51ff26f0b7bfb229f0204b66fe18e04359ce3474ac33cbc09", size = 436936, upload-time = "2025-09-14T22:17:52.658Z" }, + { url = "https://files.pythonhosted.org/packages/d9/82/b9c06c870f3bd8767c201f1edbdf9e8dc34be5b0fbc5682c4f80fe948475/zstandard-0.25.0-cp313-cp313-win_amd64.whl", hash = "sha256:1f830a0dac88719af0ae43b8b2d6aef487d437036468ef3c2ea59c51f9d55fd5", size = 506232, upload-time = "2025-09-14T22:17:50.402Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/60c3c01243bb81d381c9916e2a6d9e149ab8627c0c7d7abb2d73384b3c0c/zstandard-0.25.0-cp313-cp313-win_arm64.whl", hash = "sha256:85304a43f4d513f5464ceb938aa02c1e78c2943b29f44a750b48b25ac999a049", size = 462671, upload-time = "2025-09-14T22:17:51.533Z" }, + { url = "https://files.pythonhosted.org/packages/3d/5c/f8923b595b55fe49e30612987ad8bf053aef555c14f05bb659dd5dbe3e8a/zstandard-0.25.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e29f0cf06974c899b2c188ef7f783607dbef36da4c242eb6c82dcd8b512855e3", size = 795887, upload-time = "2025-09-14T22:17:54.198Z" }, + { url = "https://files.pythonhosted.org/packages/8d/09/d0a2a14fc3439c5f874042dca72a79c70a532090b7ba0003be73fee37ae2/zstandard-0.25.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:05df5136bc5a011f33cd25bc9f506e7426c0c9b3f9954f056831ce68f3b6689f", size = 640658, upload-time = "2025-09-14T22:17:55.423Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7c/8b6b71b1ddd517f68ffb55e10834388d4f793c49c6b83effaaa05785b0b4/zstandard-0.25.0-cp314-cp314-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:f604efd28f239cc21b3adb53eb061e2a205dc164be408e553b41ba2ffe0ca15c", size = 5379849, upload-time = "2025-09-14T22:17:57.372Z" }, + { url = "https://files.pythonhosted.org/packages/a4/86/a48e56320d0a17189ab7a42645387334fba2200e904ee47fc5a26c1fd8ca/zstandard-0.25.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223415140608d0f0da010499eaa8ccdb9af210a543fac54bce15babbcfc78439", size = 5058095, upload-time = "2025-09-14T22:17:59.498Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ad/eb659984ee2c0a779f9d06dbfe45e2dc39d99ff40a319895df2d3d9a48e5/zstandard-0.25.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e54296a283f3ab5a26fc9b8b5d4978ea0532f37b231644f367aa588930aa043", size = 5551751, upload-time = "2025-09-14T22:18:01.618Z" }, + { url = "https://files.pythonhosted.org/packages/61/b3/b637faea43677eb7bd42ab204dfb7053bd5c4582bfe6b1baefa80ac0c47b/zstandard-0.25.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca54090275939dc8ec5dea2d2afb400e0f83444b2fc24e07df7fdef677110859", size = 6364818, upload-time = "2025-09-14T22:18:03.769Z" }, + { url = "https://files.pythonhosted.org/packages/31/dc/cc50210e11e465c975462439a492516a73300ab8caa8f5e0902544fd748b/zstandard-0.25.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e09bb6252b6476d8d56100e8147b803befa9a12cea144bbe629dd508800d1ad0", size = 5560402, upload-time = "2025-09-14T22:18:05.954Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ae/56523ae9c142f0c08efd5e868a6da613ae76614eca1305259c3bf6a0ed43/zstandard-0.25.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a9ec8c642d1ec73287ae3e726792dd86c96f5681eb8df274a757bf62b750eae7", size = 4955108, upload-time = "2025-09-14T22:18:07.68Z" }, + { url = "https://files.pythonhosted.org/packages/98/cf/c899f2d6df0840d5e384cf4c4121458c72802e8bda19691f3b16619f51e9/zstandard-0.25.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a4089a10e598eae6393756b036e0f419e8c1d60f44a831520f9af41c14216cf2", size = 5269248, upload-time = "2025-09-14T22:18:09.753Z" }, + { url = "https://files.pythonhosted.org/packages/1b/c0/59e912a531d91e1c192d3085fc0f6fb2852753c301a812d856d857ea03c6/zstandard-0.25.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f67e8f1a324a900e75b5e28ffb152bcac9fbed1cc7b43f99cd90f395c4375344", size = 5430330, upload-time = "2025-09-14T22:18:11.966Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/7e31db1240de2df22a58e2ea9a93fc6e38cc29353e660c0272b6735d6669/zstandard-0.25.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:9654dbc012d8b06fc3d19cc825af3f7bf8ae242226df5f83936cb39f5fdc846c", size = 5811123, upload-time = "2025-09-14T22:18:13.907Z" }, + { url = "https://files.pythonhosted.org/packages/f6/49/fac46df5ad353d50535e118d6983069df68ca5908d4d65b8c466150a4ff1/zstandard-0.25.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4203ce3b31aec23012d3a4cf4a2ed64d12fea5269c49aed5e4c3611b938e4088", size = 5359591, upload-time = "2025-09-14T22:18:16.465Z" }, + { url = "https://files.pythonhosted.org/packages/c2/38/f249a2050ad1eea0bb364046153942e34abba95dd5520af199aed86fbb49/zstandard-0.25.0-cp314-cp314-win32.whl", hash = "sha256:da469dc041701583e34de852d8634703550348d5822e66a0c827d39b05365b12", size = 444513, upload-time = "2025-09-14T22:18:20.61Z" }, + { url = "https://files.pythonhosted.org/packages/3a/43/241f9615bcf8ba8903b3f0432da069e857fc4fd1783bd26183db53c4804b/zstandard-0.25.0-cp314-cp314-win_amd64.whl", hash = "sha256:c19bcdd826e95671065f8692b5a4aa95c52dc7a02a4c5a0cac46deb879a017a2", size = 516118, upload-time = "2025-09-14T22:18:17.849Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ef/da163ce2450ed4febf6467d77ccb4cd52c4c30ab45624bad26ca0a27260c/zstandard-0.25.0-cp314-cp314-win_arm64.whl", hash = "sha256:d7541afd73985c630bafcd6338d2518ae96060075f9463d7dc14cfb33514383d", size = 476940, upload-time = "2025-09-14T22:18:19.088Z" }, +]